From 38fcd221d8fe03208abdafe0f01a6e54a601b71a Mon Sep 17 00:00:00 2001 From: jak1 Date: Sun, 19 Jun 2022 09:34:16 +0200 Subject: updated all leftover scripts to py3 --- CI/licensecheck/serverdata.py | 2 +- CI/testxml/testxml.py | 12 ++++----- client/minimap-dyecmd.py | 2 +- client/weapons.py | 14 +++++++--- hercules/code/clienttoserver/maps.py | 24 +++++++++--------- hercules/code/server/account.py | 2 +- hercules/code/server/accreg.py | 2 +- hercules/code/server/evol/athena.py | 8 +++--- hercules/code/server/evol/consts.py | 4 +-- hercules/code/server/evol/itemdb.py | 2 +- hercules/code/server/evol/main.py | 2 +- hercules/code/server/evol/npcs.py | 24 +++++++++--------- hercules/code/server/maps.py | 6 ++--- hercules/code/server/party.py | 2 +- hercules/code/server/storage.py | 2 +- hercules/code/server/tmw/athena.py | 8 +++--- hercules/code/server/tmw/consts.py | 10 ++++---- hercules/code/server/tmw/itemdb.py | 6 ++--- hercules/code/server/tmw/main.py | 4 +-- hercules/code/server/tmw/mobdb.py | 4 +-- hercules/code/server/tmw/npcs.py | 38 ++++++++++++++-------------- hercules/code/servertoclient/groups.py | 14 +++++----- hercules/code/servertoclient/homunculuses.py | 2 +- hercules/code/servertoclient/items.py | 22 ++++++++-------- hercules/code/servertoclient/maps.py | 6 ++--- hercules/code/servertoclient/mercenaries.py | 2 +- hercules/code/servertoclient/monsters.py | 2 +- hercules/code/servertoclient/pets.py | 2 +- hercules/code/servertoclient/quests.py | 2 +- hercules/code/servertoclient/sprites.py | 18 ++++++------- hercules/code/stringutils.py | 16 ++++++------ hercules/convert_db.py | 6 ++--- hercules/convert_groups.py | 2 +- hercules/convert_mapcache_to_tmx.py | 6 ++--- hercules/convert_server.py | 16 ++++++------ hercules/convert_server_to_client.py | 2 +- hercules/convert_tmx_to_mapcache.py | 4 +-- hercules/extract_mapcache.py | 6 ++--- hercules/list_mapcache.py | 6 ++--- hercules/tmx_converter.py | 8 +++--- lang/fetch.py | 2 +- lang/updatelang.py | 37 +++++++++++++-------------- lang_client/fetch.py | 2 +- wiki/redesign.py | 6 ++--- wiki/wikigen.py | 4 +-- 45 files changed, 189 insertions(+), 182 deletions(-) diff --git a/CI/licensecheck/serverdata.py b/CI/licensecheck/serverdata.py index f7c3eb6..acdb42f 100755 --- a/CI/licensecheck/serverdata.py +++ b/CI/licensecheck/serverdata.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python3 +#!/usr/bin/env python3 # -*- coding: utf8 -*- # # Copyright (C) 2018 TMW-2 diff --git a/CI/testxml/testxml.py b/CI/testxml/testxml.py index 4eb97b1..5d28c84 100755 --- a/CI/testxml/testxml.py +++ b/CI/testxml/testxml.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python3 +#!/usr/bin/env python3 # -*- coding: utf8 -*- # # Copyright (C) 2010-2011 Evol Online @@ -260,7 +260,7 @@ def testDye(id, color, text, src, iserr): showMsg(id, "dye to small size: " + text, src, iserr) continue - c = col[0]; + c = col[0] if col[1] != ":": showMsg(id, "incorrect dye string: " + text, src, iserr) continue @@ -449,7 +449,7 @@ def testSpriteFile(id, fullPath, file, fileLoc, dnum, variant, checkAction, iser # except: # variant_offset = 0 -# root = dom.childNodes[0]; +# root = dom.childNodes[0] imagesets = dom.getElementsByTagName("imageset") if imagesets is None or len(imagesets) < 1: showMsgSprite(fileLoc, "incorrect number of imageset tags", iserr) @@ -892,7 +892,7 @@ def testSpriteAction(file, name, action, numframes, iserr): try: cont = int(lastNode.attributes["continue"].value) except: - cont = 0; + cont = 0 if cont == 0: try: delay = int(lastNode.attributes["delay"].value) @@ -1143,7 +1143,7 @@ def testItems(fileName, imgDir): if colors is None: testDye(id, floorcolor, "floor=" + floor0, fileName, True) else: - testDyeChannel(id, imagecolor, "floor=" + floor0, True); + testDyeChannel(id, imagecolor, "floor=" + floor0, True) if colors not in colorsList: print("error: " + fileName + ": colors value " + colors + " not found in itemcolors.xml") errors = errors + 1 @@ -1709,7 +1709,7 @@ def testMap(mapName, file, path): id1=readAttr(objx, "id", "?", "invalid object ID", False) name1=readAttr(objx, "name", "?", "invalid object name", False) type1=readAttr(objx, "type", "?", "invalid object type", False) - showMsgFile(file, "Broken object: id %s name %s (%s,%s,%s,%s) type %s" % (id1, name1, x, y, w, h, type1), True); + showMsgFile(file, "Broken object: id %s name %s (%s,%s,%s,%s) type %s" % (id1, name1, x, y, w, h, type1), True) except: id1=readAttr(objx, "id", "?", "invalid object ID", False) showMsgFile(file, "Broken object ID %s - x/y/h/w corrupted data detected" % id1, True) diff --git a/client/minimap-dyecmd.py b/client/minimap-dyecmd.py index 28c35ee..8594dbd 100755 --- a/client/minimap-dyecmd.py +++ b/client/minimap-dyecmd.py @@ -2,7 +2,7 @@ #-*- coding:utf-8 -*- import os -f=open("minimap-dyecmd.sh", "w"); +f=open("minimap-dyecmd.sh", "w") CLIENT_DATA_ROOT="../../client-data" map_names = sorted([os.path.splitext(p)[0] for p in os.listdir(os.path.join(CLIENT_DATA_ROOT, u'graphics', u'minimaps'))]) diff --git a/client/weapons.py b/client/weapons.py index 2f689a6..65d6c2d 100755 --- a/client/weapons.py +++ b/client/weapons.py @@ -64,9 +64,17 @@ shields=[] mem=[] -f1=open("../../client-data/items/equip-1hand.xml", "r"); main(f1); f1.close() -f2=open("../../client-data/items/equip-2hand.xml", "r"); main(f2); f2.close() -f3=open("../../client-data/items/equip-shield.xml", "r"); main(f3, TYPE_SHD); f3.close() +f1=open("../../client-data/items/equip-1hand.xml", "r") +main(f1) +f1.close() + +f2=open("../../client-data/items/equip-2hand.xml", "r") +main(f2) +f2.close() + +f3=open("../../client-data/items/equip-shield.xml", "r") +main(f3, TYPE_SHD) +f3.close() mem=sorted(mem, key=lambda xcv: xcv.lvl, reverse=True) diff --git a/hercules/code/clienttoserver/maps.py b/hercules/code/clienttoserver/maps.py index b9a1626..745bebe 100644 --- a/hercules/code/clienttoserver/maps.py +++ b/hercules/code/clienttoserver/maps.py @@ -54,21 +54,21 @@ def findFirstGid(tilesets, tile): # 6 - monster walk not allowed def convertTileType(tile, idx, width, height): if tile == 5: - tile = 0; + tile = 0 if tile > 6 or tile < 0: y = int(idx / width) x = idx - y * width - print "Error: wrong tile: ({0}, {1}) = {2}".format(x, y, tile) + print("Error: wrong tile: ({0}, {1}) = {2}".format(x, y, tile)) tile = 1 return tile # map file format # -# int16 version; -# uint8 md5_checksum[16]; -# int16 xs; -# int16 ys; -# int32 len; +# int16 version +# uint8 md5_checksum[16] +# int16 xs +# int16 ys +# int32 len # ...data... def recreateMap(names): @@ -77,7 +77,7 @@ def recreateMap(names): tmxName = names[0] mCaheName = destDir + names[1][:-3] + "mcache" with open(mCaheName, "wb") as w: - print tmxName + print(tmxName) dom = minidom.parse(tmxName) root = dom.documentElement tilesets = [] @@ -116,7 +116,7 @@ def recreateMap(names): tileType = 0 else: firstgid = findFirstGid(tilesets, tile) - tileType = convertTileType(tile - firstgid, idx, width, height); + tileType = convertTileType(tile - firstgid, idx, width, height) tiles.append(tileType) idx = idx + 1 elif encoding == "csv": @@ -132,7 +132,7 @@ def recreateMap(names): tileType = 0 else: firstgid = findFirstGid(tilesets, tile) - tileType = convertTileType(tile - firstgid, idx, width, height); + tileType = convertTileType(tile - firstgid, idx, width, height) # tmx collision format # 0 - walkable ground # 1 - non walkable wall @@ -156,7 +156,7 @@ def recreateMap(names): idx = idx + 1 f.close() else: - print "map format not supported: " + tmxName + print("map format not supported: " + tmxName) continue #comp = zlib.compressobj() @@ -172,7 +172,7 @@ def recreateMap(names): found = True break if found == False: - print "Error: missing collision layer in file: {0}".format(tmxName) + print("Error: missing collision layer in file: {0}".format(tmxName)) return return with open(mCaheName + ".debug", "wb") as w: diff --git a/hercules/code/server/account.py b/hercules/code/server/account.py index 7763766..ef83bc2 100644 --- a/hercules/code/server/account.py +++ b/hercules/code/server/account.py @@ -30,7 +30,7 @@ def convertAccount(): if len(rows) == 2: continue if len(rows) != 14: - print "wrong account.txt line: " + stripNewLine(line) + print("wrong account.txt line: " + stripNewLine(line)) continue if firstLine == False: diff --git a/hercules/code/server/accreg.py b/hercules/code/server/accreg.py index b69910f..2319780 100644 --- a/hercules/code/server/accreg.py +++ b/hercules/code/server/accreg.py @@ -26,7 +26,7 @@ def convertAccReg(): line = stripNewLine(line) rows = fieldsSplit.split(line) if len(rows) != 2: - print "wrong accreg.txt line: " + line + print("wrong accreg.txt line: " + line) continue accountId = rows[0] diff --git a/hercules/code/server/evol/athena.py b/hercules/code/server/evol/athena.py index bad35da..9f403da 100644 --- a/hercules/code/server/evol/athena.py +++ b/hercules/code/server/evol/athena.py @@ -30,7 +30,7 @@ def parseInventory(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 12: - print "wrong inventory in account.txt line: " + stripNewLine(line) + print("wrong inventory in account.txt line: " + stripNewLine(line)) continue item = Item() @@ -69,7 +69,7 @@ def parseSkills(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 2: - print "wrong skills in account.txt line: " + stripNewLine(line) + print("wrong skills in account.txt line: " + stripNewLine(line)) continue skill = Skill() @@ -98,7 +98,7 @@ def parseVars(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 2: - print "wrong variables in account.txt line: " + stripNewLine(line) + print("wrong variables in account.txt line: " + stripNewLine(line)) continue variables[rows2[0]] = rows2[1] @@ -118,7 +118,7 @@ def readAthena(): if len(rows) == 2: continue if len(rows) != 20: - print "wrong account.txt line: " + stripNewLine(line) + print("wrong account.txt line: " + stripNewLine(line)) continue user = User() diff --git a/hercules/code/server/evol/consts.py b/hercules/code/server/evol/consts.py index c63f559..a1cdf18 100644 --- a/hercules/code/server/evol/consts.py +++ b/hercules/code/server/evol/consts.py @@ -27,7 +27,7 @@ def convertConsts(quests): else: w.write("{0}\t{1}\t{2}".format(rows[0], rows[1], rows[2])) # build in parameters - w.write("ClientVersion\t10000\t1\n"); + w.write("ClientVersion\t10000\t1\n") srcFile = "oldserverdata/db/const.txt" w.write("// evol constants\n") @@ -44,6 +44,6 @@ def convertConsts(quests): rows[1] = str(quests[rows[0]]) + "\n" if rows[0] in fields: if fields[rows[0]] != rows[1][:-1]: - print "warning: different const values for {0} ({1}, {2})".format(rows[0], rows[1][:-1], fields[rows[0]]) + print("warning: different const values for {0} ({1}, {2})".format(rows[0], rows[1][:-1], fields[rows[0]])) else: w.write("{0}\t{1}".format(rows[0], rows[1])) diff --git a/hercules/code/server/evol/itemdb.py b/hercules/code/server/evol/itemdb.py index a60e57d..a7a54b0 100644 --- a/hercules/code/server/evol/itemdb.py +++ b/hercules/code/server/evol/itemdb.py @@ -18,7 +18,7 @@ def convertItemDb(): with open(srcFile, "r") as r: with open(dstFile, "w") as w: with open(constsFile, "a") as c: - c.write("// items\n"); + c.write("// items\n") tpl = readFile("templates/item_db.tpl") w.write(tpl) for line in r: diff --git a/hercules/code/server/evol/main.py b/hercules/code/server/evol/main.py index be9f0ab..6072a80 100644 --- a/hercules/code/server/evol/main.py +++ b/hercules/code/server/evol/main.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf8 -*- # # Copyright (C) 2014 Evol Online diff --git a/hercules/code/server/evol/npcs.py b/hercules/code/server/evol/npcs.py index 6efe811..dd2c7be 100644 --- a/hercules/code/server/evol/npcs.py +++ b/hercules/code/server/evol/npcs.py @@ -31,7 +31,7 @@ monsterRe = re.compile("^(?P[^/](.+))[.]gat,([ ]*)(?P[\d]+),([ ]*)(?P "(?Pmonster)[\t](?P[\w#' ]+)[\t]" "(?P[\d]+),(?P[\d]+),(?P[\d-]+),(?P[\d]+),(?P[\d]+)$") -setRe = re.compile("^(?P[ ]+)set[ ](?P[^,]+),([ ]*)(?P[^;]+);$"); +setRe = re.compile("^(?P[ ]+)set[ ](?P[^,]+),([ ]*)(?P[^;]+);$") class ScriptTracker: pass @@ -115,7 +115,7 @@ def processScriptMapLine(line): def writeScript(w, m): if m.group("gender") != None: - w.write("// Gender = {0}\n".format(m.group("gender"))); + w.write("// Gender = {0}\n".format(m.group("gender"))) if m.group("x") == 0 and m.group("y") == 0: # float npc w.write("-") @@ -128,7 +128,7 @@ def writeScript(w, m): class_ = int(class_) if class_ > 125 and class_ <= 400: class_ = class_ + 100 - w.write("\t{0}\t{1}\t{2}".format(m.group("tag"), m.group("name"), class_)); + w.write("\t{0}\t{1}\t{2}".format(m.group("tag"), m.group("name"), class_)) def processScript(tracker): line = tracker.line @@ -139,7 +139,7 @@ def processScript(tracker): m = scriptRe.search(line) if m == None: - print "error in parsing: " + line + print("error in parsing: " + line) w.write("!!!error parsing line") w.write(line) return @@ -149,11 +149,11 @@ def processScript(tracker): # m.group("tag"), m.group("name"), m.group("class"), m.group("xs"), m.group("ys"), m.group("size")) if m.group("size") != None: - w.write("// Size = {0}\n".format(m.group("size"))); + w.write("// Size = {0}\n".format(m.group("size"))) writeScript(w, m) if m.group("xs") != None: - w.write(",{0},{1}".format(m.group("xs"), m.group("ys"))); - w.write(",{\n"); + w.write(",{0},{1}".format(m.group("xs"), m.group("ys"))) + w.write(",{\n") def itemsToShop(tracker, itemsStr): @@ -175,7 +175,7 @@ def processShop(tracker): m = shopRe.search(line) if m == None: - print "error in parsing: " + line + print("error in parsing: " + line) w.write("!!!error parsing line") w.write(line) return @@ -193,7 +193,7 @@ def processMapFlag(tracker): m = mapFlagRe.search(line) if m == None: - print "error in parsing: " + line + print("error in parsing: " + line) w.write("!!!error parsing line") w.write(line) return @@ -212,7 +212,7 @@ def processWarp(tracker): w = tracker.w m = warpRe.search(line) if m == None: - print "error in parsing: " + line + print("error in parsing: " + line) w.write("!!!error parsing line") w.write(line) return @@ -237,7 +237,7 @@ def processMonster(tracker): w = tracker.w m = monsterRe.search(line) if m == None: - print "error in parsing: " + line + print("error in parsing: " + line) w.write("!!!error parsing line") w.write(line) return @@ -273,7 +273,7 @@ def processStrReplace(tracker): line = line.replace("getmapmobs(", "mobcount(") - m = setRe.search(line); + m = setRe.search(line) if m != None: line = "{0}{1} = {2};\n".format(m.group("space"), m.group("var"), m.group("val")) diff --git a/hercules/code/server/maps.py b/hercules/code/server/maps.py index 2ef0173..5e65feb 100644 --- a/hercules/code/server/maps.py +++ b/hercules/code/server/maps.py @@ -10,14 +10,14 @@ import zlib from code.fileutils import readMapName, readInt16, readInt32, readData, makeDir def listMapCache(f, mapsCount): - print "Known maps:" - print "{0:12} {1:<4}x {2:<4} {3:<10}".format("Map name", "sx", "sy", "compressed size") + print("Known maps:") + print("{0:12} {1:<4}x {2:<4} {3:<10}".format("Map name", "sx", "sy", "compressed size")) for i in xrange(0, mapsCount): name = readMapName(f) sx = readInt16(f) sy = readInt16(f) sz = readInt32(f) - print "{0:12} {1:<4}x {2:<4} {3:<10}".format(name, sx, sy, sz) + print("{0:12} {1:<4}x {2:<4} {3:<10}".format(name, sx, sy, sz)) f.seek(sz, 1) def extractMaps(f, mapsCount): diff --git a/hercules/code/server/party.py b/hercules/code/server/party.py index c75a541..bcd7fc5 100644 --- a/hercules/code/server/party.py +++ b/hercules/code/server/party.py @@ -34,7 +34,7 @@ def convertParty(users): if len(rows) == 2: continue if len(rows) < 3: - print "wrong party.txt line: " + line + print("wrong party.txt line: " + line) continue partyId = rows[0] diff --git a/hercules/code/server/storage.py b/hercules/code/server/storage.py index 6bddb52..6c1d2e7 100644 --- a/hercules/code/server/storage.py +++ b/hercules/code/server/storage.py @@ -28,7 +28,7 @@ def convertStorage(): if len(rows) == 2: continue if len(rows) != 3: - print "wrong storage.txt line: " + stripNewLine(line) + print("wrong storage.txt line: " + stripNewLine(line)) continue tmp = comaSplit.split(rows[0]) diff --git a/hercules/code/server/tmw/athena.py b/hercules/code/server/tmw/athena.py index 6548b2e..f2e4dd9 100644 --- a/hercules/code/server/tmw/athena.py +++ b/hercules/code/server/tmw/athena.py @@ -30,7 +30,7 @@ def parseInventory(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 12: - print "wrong inventory in account.txt line: " + stripNewLine(line) + print("wrong inventory in account.txt line: " + stripNewLine(line)) continue item = Item() @@ -69,7 +69,7 @@ def parseSkills(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 2: - print "wrong skills in account.txt line: " + stripNewLine(line) + print("wrong skills in account.txt line: " + stripNewLine(line)) continue skill = Skill() @@ -98,7 +98,7 @@ def parseVars(line, data): rows2 = comaSplit.split(data2) if len(rows2) != 2: - print "wrong variables in account.txt line: " + stripNewLine(line) + print("wrong variables in account.txt line: " + stripNewLine(line)) continue variables[rows2[0]] = rows2[1] @@ -118,7 +118,7 @@ def readAthena(): if len(rows) == 2: continue if len(rows) != 20: - print "wrong account.txt line: " + stripNewLine(line) + print("wrong account.txt line: " + stripNewLine(line)) continue user = User() diff --git a/hercules/code/server/tmw/consts.py b/hercules/code/server/tmw/consts.py index 5b8403e..971b23f 100644 --- a/hercules/code/server/tmw/consts.py +++ b/hercules/code/server/tmw/consts.py @@ -27,14 +27,14 @@ def readOneConst(r, line): line = r.next().strip() rows = fieldsSplit.split(line) if len(rows) != 2: - print "error" + print("error") return ("", "", 0) if rows[0] == "Value": val = rows[1] line = r.next().strip() rows = fieldsSplit.split(line) if len(rows) != 2: - print "error" + print("error") return ("", "", 0) rows[1] = rows[1].strip() if rows[0] == "Deprecated" and rows[1].find("true") == 0: @@ -43,7 +43,7 @@ def readOneConst(r, line): rows = fieldsSplit.split(line) if len(rows) != 2: return ("", "", 0) - key = rows[0]; + key = rows[0] val = rows[1] return (key, val, depr) @@ -77,7 +77,7 @@ def convertConsts(quests, npcIds): ] with open(dstFile, "w") as w: tpl = readFile("templates/constants.tpl") - w.write(tpl); + w.write(tpl) srcFile = "serverdata/db/constants.conf" with open(srcFile, "r") as r: for line in r: @@ -116,7 +116,7 @@ def convertConsts(quests, npcIds): rows[1] = str(quests[rows[0]]) + "\n" if rows[0] in fields: if fields[rows[0]] != rows[1][:-1]: - print "warning: different const values for {0} ({1}, {2})".format(rows[0], rows[1][:-1], fields[rows[0]]) + print("warning: different const values for {0} ({1}, {2})".format(rows[0], rows[1][:-1], fields[rows[0]])) else: writeConst(w, (rows[0], stripNewLine(rows[1]), 0)) w.write("// tmw npcs\n") diff --git a/hercules/code/server/tmw/itemdb.py b/hercules/code/server/tmw/itemdb.py index dde9aaa..43c8342 100644 --- a/hercules/code/server/tmw/itemdb.py +++ b/hercules/code/server/tmw/itemdb.py @@ -132,10 +132,10 @@ def replaceStr(line): # fix at same time usage with same name function and variable ("\"DailyQuestPoints\"", "\"DailyQuestPointsFunc\""), ("sc_adrenaline", "SC_ADRENALINE"), - ]; + ] for val in vals: - line = line.replace(val[0], val[1]); + line = line.replace(val[0], val[1]) return line def getItType(it): @@ -186,7 +186,7 @@ def convertItemDb(isNew): with open(dstFile, "w") as w: w.write(tpl) with open(constsFile, "a") as c: - c.write("// items\n"); + c.write("// items\n") for srcFile in getItemDbFile(srcDir): with open(srcDir + srcFile, "r") as r: for line in r: diff --git a/hercules/code/server/tmw/main.py b/hercules/code/server/tmw/main.py index bfbf5ef..0364975 100644 --- a/hercules/code/server/tmw/main.py +++ b/hercules/code/server/tmw/main.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf8 -*- # # Copyright (C) 2014 Evol Online @@ -26,7 +26,7 @@ def serverTmwMain(isNew): try: cleanServerData() except: - print "Updating server" + print("Updating server") createMainScript() items = convertItemDb(isNew) npcIds = Set() diff --git a/hercules/code/server/tmw/mobdb.py b/hercules/code/server/tmw/mobdb.py index 10edfd1..acecd70 100644 --- a/hercules/code/server/tmw/mobdb.py +++ b/hercules/code/server/tmw/mobdb.py @@ -26,10 +26,10 @@ def replaceStr(line): ("Scorpion", "ScorpionMob"), ("Tritan", "TritanMob"), ("Ukar", "UkarMob"), - ]; + ] for val in vals: - line = line.replace(val[0], val[1]); + line = line.replace(val[0], val[1]) return line def convertMobDb(items): diff --git a/hercules/code/server/tmw/npcs.py b/hercules/code/server/tmw/npcs.py index c51da78..c7fa0f5 100644 --- a/hercules/code/server/tmw/npcs.py +++ b/hercules/code/server/tmw/npcs.py @@ -54,7 +54,7 @@ monsterRe2 = re.compile("^(?P[^/](.+))[.]gat,([ ]*)(?P[\d]+),([ ]*)(?Pmonster)[\t](?P[\w#' ]+)([\t]+)" "(?P[\d]+),(?P[\d]+),(?P[\d]+),(?P[\d]+)(|,(?P