summaryrefslogtreecommitdiff
path: root/tools/mobdbconverter.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mobdbconverter.py')
-rwxr-xr-xtools/mobdbconverter.py282
1 files changed, 282 insertions, 0 deletions
diff --git a/tools/mobdbconverter.py b/tools/mobdbconverter.py
new file mode 100755
index 000000000..e1c642981
--- /dev/null
+++ b/tools/mobdbconverter.py
@@ -0,0 +1,282 @@
+#! /usr/bin/env python
+# -*- coding: utf8 -*-
+#
+# Copyright (C) 2015 Andrei Karas (4144)
+
+# This Script converts mob_db.txt to mob_db.conf format
+
+import os
+import re
+import sys
+
+comaSplit = re.compile(",")
+
+def printHeader():
+ print("""mob_db: (
+// Mobs Database
+//
+/******************************************************************************
+ ************* Entry structure ************************************************
+ ******************************************************************************
+{
+ // =================== Mandatory fields ===============================
+ Id: ID (int)
+ SpriteName: "SPRITE_NAME" (string)
+ Name: "Mob name" (string)
+ // =================== Optional fields ================================
+ Lv: level (int, defaults to 1)
+ Hp: health (int, defaults to 1)
+ Sp: mana (int, defaults to 0)
+ Exp: basic experience (int, defaults to 0)
+ JExp: job experience (int, defaults to 0)
+ AttackRange: attack range (int, defaults to 1)
+ Attack: [attack1, attack2] (int, defaults to 0)
+ Def: defence (int, defaults to 0)
+ Mdef: magic defence (int, defaults to 0)
+ Stats: {
+ Str: strength (int, defaults to 0)
+ Agi: agility (int, defaults to 0)
+ Vit: vitality (int, defaults to 0)
+ Int: intelligence (int, defaults to 0)
+ Dex: dexterity (int, defaults to 0)
+ Luk: luck (int, defaults to 0)
+ }
+ ViewRange: view range (int, defaults to 1)
+ ChaseRange: chase range (int, defaults to 1)
+ Size: size (int, defaults to 1)
+ Race: race (int, defaults to 0)
+ Element: (type, level)
+ Mode: {
+ CanMove: true/false (bool)
+ Looter: true/false (bool)
+ Aggressive: true/false (bool)
+ Assist: true/false (bool)
+ CastSensorIdle:true/false (bool)
+ Boss: true/false (bool)
+ Plant: true/false (bool)
+ CanAttack: true/false (bool)
+ Detector: true/false (bool)
+ CastSensorChase: true/false (bool)
+ ChangeChase: true/false (bool)
+ Angry: true/false (bool)
+ ChangeTargetMelee: true/false (bool)
+ ChangeTargetChase: true/false (bool)
+ TargetWeak: true/false (bool)
+ }
+ MoveSpeed: move speed (int, defaults to 0)
+ AttackDelay: attack delay (int, defaults to 4000)
+ AttackMotion: attack motion (int, defaults to 2000)
+ DamageMotion: damage motion (int, defaults to 0)
+ MvpExp: mvp experience (int, defaults to 0)
+ MvpDrops: {
+ AegisName: chance (string: int)
+ ...
+ }
+ Drops: {
+ AegisName: chance (string: int)
+ ...
+ }
+
+},
+******************************************************************************/
+
+""")
+
+def printFooter():
+ print(")")
+
+def printField(name, value):
+ print("\t{0}: {1}".format(name, value))
+
+def printField2(name, value):
+ print("\t\t{0}: {1}".format(name, value))
+
+def printFieldCond2(cond, name):
+ if cond != 0:
+ print("\t\t{0}: true".format(name))
+
+def printFieldArr(name, value, value2):
+ print("\t{0}: [{1}, {2}]".format(name, value, value2))
+
+def printFieldStr(name, value):
+ print("\t{0}: \"{1}\"".format(name, value))
+
+def startGroup(name):
+ print("\t{0}: {{".format(name))
+
+def endGroup():
+ print("\t}")
+
+def printHelp():
+ print("MobDB converter from txt to conf format")
+ print("Usage:")
+ print(" mobdbconverter.py re serverpath dbfilepath")
+ print(" mobdbconverter.py pre-re serverpath dbfilepath")
+ print("Usage for read from stdin:")
+ print(" mobdbconverter.py re dbfilepath")
+
+def isHaveData(fields, start, cnt):
+ for f in range(0, cnt):
+ value = fields[start + f * 2]
+ chance = fields[start + f * 2]
+ if value == "" or value == "0" or chance == "" or chance == "0":
+ continue
+ return True
+ return False
+
+def convertFile(inFile, itemDb):
+ if inFile != "" and not os.path.exists(inFile):
+ return
+
+ if inFile == "":
+ r = sys.stdin
+ else:
+ r = open(inFile, "r")
+
+ printHeader()
+ for line in r:
+ if line.strip() == "":
+ continue
+ if len(line) < 5 or line[:2] == "//":
+ print(line)
+ continue
+ fields = comaSplit.split(line)
+ if len(fields) != 57:
+ print(line)
+ continue
+ for f in range(0, len(fields)):
+ fields[f] = fields[f].strip()
+ print("{")
+ printField("Id", fields[0])
+ printFieldStr("SpriteName", fields[1])
+ printFieldStr("Name", fields[2])
+ printField("Lv", fields[4])
+ printField("Hp", fields[5])
+ printField("Sp", fields[6])
+ printField("Exp", fields[7])
+ printField("JExp", fields[8])
+ printField("AttackRange", fields[9])
+ printFieldArr("Attack", fields[10], fields[11])
+ printField("Def", fields[12])
+ printField("Mdef", fields[13])
+ startGroup("Stats")
+ printField2("Str", fields[14])
+ printField2("Agi", fields[15])
+ printField2("Vit", fields[16])
+ printField2("Int", fields[17])
+ printField2("Dex", fields[18])
+ printField2("Luk", fields[19])
+ endGroup()
+ printField("ViewRange", fields[20])
+ printField("ChaseRange", fields[21])
+ printField("Size", fields[22])
+ printField("Race", fields[23])
+ print("\tElement: ({0}, {1})".format(int(fields[24]) % 10, int(fields[24]) / 20));
+ mode = int(fields[25], 0)
+ if mode != 0:
+ startGroup("Mode")
+ printFieldCond2(mode & 0x0001, "CanMove")
+ printFieldCond2(mode & 0x0002, "Looter")
+ printFieldCond2(mode & 0x0004, "Aggressive")
+ printFieldCond2(mode & 0x0008, "Assist")
+ printFieldCond2(mode & 0x0010, "CastSensorIdle")
+ printFieldCond2(mode & 0x0020, "Boss")
+ printFieldCond2(mode & 0x0040, "Plant")
+ printFieldCond2(mode & 0x0080, "CanAttack")
+ printFieldCond2(mode & 0x0100, "Detector")
+ printFieldCond2(mode & 0x0200, "CastSensorChase")
+ printFieldCond2(mode & 0x0400, "ChangeChase")
+ printFieldCond2(mode & 0x0800, "Angry")
+ printFieldCond2(mode & 0x1000, "ChangeTargetMelee")
+ printFieldCond2(mode & 0x2000, "ChangeTargetChase")
+ printFieldCond2(mode & 0x4000, "TargetWeak")
+ printFieldCond2(mode & 0x8000, "LiveWithoutMaster")
+ endGroup()
+ printField("MoveSpeed", fields[26])
+ printField("AttackDelay", fields[27])
+ printField("AttackMotion", fields[28])
+ printField("DamageMotion", fields[29])
+ printField("MvpExp", fields[30])
+ if isHaveData(fields, 31, 3):
+ startGroup("MvpDrops")
+ for f in range(0, 3):
+ value = fields[31 + f * 2]
+ chance = fields[32 + f * 2]
+ if value == "" or value == "0" or chance == "" or chance == "0":
+ continue
+ value = int(value)
+ if value not in itemDb:
+ print("// Error: mvp drop with id {0} not found in item_db.conf".format(value))
+ else:
+ printField2(itemDb[value], chance)
+ endGroup()
+ if isHaveData(fields, 37, 10):
+ startGroup("Drops")
+ for f in range(0, 10):
+ value = fields[37 + f * 2]
+ chance = fields[38 + f * 2]
+ if value == "" or value == "0" or chance == "" or chance == "0":
+ continue
+ value = int(value)
+ if value not in itemDb:
+ print("// Error: drop with id {0} not found in item_db.conf".format(value))
+ else:
+ printField2(itemDb[value], chance)
+ endGroup()
+ print("},")
+ printFooter()
+ if inFile != "":
+ r.close()
+
+def readItemDB(inFile, itemDb):
+ itemId = 0
+ itemName = ""
+ started = False
+ with open(inFile, "r") as r:
+ for line in r:
+ line = line.strip()
+ if started == True:
+ if line == "},":
+ started = False
+ elif line[:10] == "AegisName:":
+ itemName = line[12:-1]
+ elif line[:3] == "Id:":
+ try:
+ itemId = int(line[4:])
+ except:
+ started = False
+ if itemId != 0 and itemName != "":
+# was need for remove wrong characters
+# itemName = itemName.replace(".", "")
+# if itemName[0] >= "0" and itemName[0] <= "9":
+# itemName = "Num" + itemName
+ itemDb[itemId] = itemName
+ started = False
+ else:
+ if line == "{":
+ started = True
+ itemId = 0
+ itemName = ""
+ return itemDb
+
+if len(sys.argv) != 4 and len(sys.argv) != 3:
+ printHelp();
+ exit(1)
+startPath = sys.argv[2]
+if len(sys.argv) == 4:
+ sourceFile = sys.argv[3]
+else:
+ sourceFile = "";
+
+itemDb = dict()
+if sys.argv[1] == "re":
+ itemDb = readItemDB(startPath + "/db/re/item_db.conf", itemDb)
+ itemDb = readItemDB(startPath + "/db/item_db2.conf", itemDb)
+elif sys.argv[1] == "pre-re":
+ itemDb = readItemDB(startPath + "/db/pre-re/item_db.conf", itemDb)
+ itemDb = readItemDB(startPath + "/db/item_db2.conf", itemDb)
+else:
+ printHelp();
+ exit(1)
+
+convertFile(sourceFile, itemDb)