# -*- coding: utf8 -*-
#
# Copyright (C) 2014 Evol Online
# Author: Andrei Karas (4144)
import os
import re
from code.configutils import writeStartScript, writeEndScript, writeIntField, writeStrField
from code.fileutils import readFile
def getItemDbFile(srcDir):
files = os.listdir(srcDir)
for srcFile in files:
if srcFile.find("item_db") >= 0:
yield srcFile
def replaceStr(line):
vals = [
("setskill ", "addtoskill "),
("zeny", "Zeny"),
("sc_poison", "SC_POISON"),
("sc_slowpoison", "SC_SLOWPOISON"),
("sex", "Sex"),
("SEX", "Sex"),
(".gat", ""),
("Bugleg", "BugLeg"),
("set BugLeg, 0;", "//set BugLeg, 0;"),
("set CaveSnakeLamp, 0;", "//set CaveSnakeLamp, 0;"),
("set Class, @BaseClass;", "//set Class, @BaseClass;"),
("goto_Exit;", "goto L_Exit;"),
("if @spants_state < 7 goto", "if(@spants_state < 7) goto"),
("isdead()", "ispcdead()"),
("changeSex", "changecharsex()"),
("getpartnerid2()", "getpartnerid()"),
("getmap()", "getmapname()"),
("L_end", "L_End"),
("gmcommand", "atcommand"),
("MF_NOSAVE", "mf_nosave"),
("S_update_var", "S_Update_Var"),
("L_teach", "L_Teach"),
("L_focus", "L_Focus"),
("L_unfocus", "L_Unfocus"),
("L_main", "L_Main"),
("L_next", "L_Next"),
("L_close", "L_Close"),
("@NpcName$", "@npcname$"),
("@cost", "@Cost"),
("@TEMP", "@temp"),
("L_Menuitems", "L_MenuItems"),
("L_no_item", "L_No_Item"),
("L_no_water", "L_No_Water"),
("L_NOT_ENOUGH", "L_No_Water"),
("L_bye", "L_Bye"),
("L_NOHELP", "L_NoHelp"),
("L_Eyepatch", "L_EyePatch"),
("@PC_STAMINA", "@pc_stamina"),
("L_magic", "L_Magic"),
("L_cont", "L_Cont"),
("L_accept", "L_Accept"),
("L_no_event", "L_No_Event"),
("L_event_done", "L_Event_Done"),
("L_nobeer", "L_NoBeer"),
("L_iron", "L_Iron"),
("L_sulphur", "L_Sulphur"),
("L_red", "L_Red"),
("L_yellow", "L_Yellow"),
("L_green", "L_Green"),
("L_orange", "L_Orange"),
("L_pink", "L_Pink"),
("L_purple", "L_Purple"),
("L_question", "L_Question"),
("L_quest", "L_Quest"),
("L_dead", "L_Dead"),
("L_menu", "L_Menu"),
("L_give", "L_Give"),
("@Items$", "@items$"),
("@menuItems$", "@menuitems$"),
("L_Teach_initial", "L_Teach_Initial"),
("L_finish", "L_Finish"),
("L_No_ash", "L_No_Ash"),
("L_No_water", "L_No_Water"),
("L_cave", "L_Cave"),
("L_farewell", "L_Farewell"),
("@Q_forestbow_", "@Q_Forestbow_"),
("L_game", "L_Game"),
("L_good", "L_Good"),
("L_abort", "L_Abort"),
("@menuID", "@menuid"),
("L_NO_ITEM", "L_No_Item"),
("L_HELP", "L_Help"),
("L_Noitem", "L_NoItem"),
("L_No_fur", "L_No_Fur"),
("@EXP", "@Exp"),
("L_water", "L_Water"),
("L_get", "L_Get"),
("L_happy", "L_Happy"),
("L_cheat", "L_Cheat"),
("@Reward_EXP", "@Reward_Exp"),
("@REWARD_EXP", "@Reward_Exp"),
("L_no_money", "L_No_Money"),
("@MinLevel", "@minLevel"),
("L_return", "L_Return"),
("L_intro", "L_Intro"),
("L_full", "L_Full"),
("@minlevel", "@minLevel"),
("@MinLevel", "@minLevel"),
("L_Cleanup", "L_CleanUp"),
("L_Alreadystarted", "L_AlreadyStarted"),
("@amount", "@Amount"),
("L_again", "L_Again"),
("L_no_potion", "L_No_Potion"),
("L_wizard_hat", "L_Wizard_Hat"),
("L_notenough", "L_NotEnough"),
("L_offer", "L_Offer"),
("L_giveup", "L_GiveUp"),
("L_not_ready", "L_Not_Ready"),
("@MobID", "@mobId"),
("@mobID", "@mobId"),
("L_naked", "L_Naked"),
("L_shortcut", "L_Shortcut"),
("L_shirt", "L_Shirt"),
("L_goodjob", "L_GoodJob"),
("L_kill", "L_Kill"),
("L_nothing", "L_Nothing"),
("L_lowlevel", "L_LowLevel"),
("@mask", "@Mask"),
("Foice", "FoiceItem"),
("LanternaJack", "LanternaJackItem"),
# 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])
return line
def getItType(it):
try:
i=int(it)
except:
i=None
if i == 0:
return '"IT_HEALING"'
elif i == 2:
return '"IT_USABLE"'
elif i == 3:
return '"IT_ETC"'
elif i == 4:
return '"IT_WEAPON"'
elif i == 5:
return '"IT_ARMOR"'
elif i == 6:
return '"IT_CARD"'
elif i == 7:
return '"IT_HEALING"'
elif i == 2:
return '"IT_HEALING"'
elif i == 2:
return '"IT_HEALING"'
elif i == 2:
return '"IT_HEALING"'
else:
print("Unrecognized item type: %s" % it)
return '"IT_ETC"'
def convertItemDb(isNew):
srcDir = "oldserverdata/world/map/db/"
dstFile = "newserverdata/db/re/item_db.conf"
if os.path.isfile(dstFile):
os.remove(dstFile)
constsFile = "newserverdata/db/const.txt"
if os.path.isfile(constsFile):
os.remove(constsFile)
fieldsSplit = re.compile(",")
scriptsSplit = re.compile("},")
scriptsTextClean = re.compile('([{}])')
scriptsTextComma = re.compile('^,')
scriptsTextColon = re.compile('; ')
items = dict()
tpl = readFile("templates/item_db.tpl")
with open(dstFile, "w") as w:
w.write(tpl)
with open(constsFile, "a") as c:
c.write("// items\n")
for srcFile in getItemDbFile(srcDir):
with open(srcDir + srcFile, "r") as r:
for line in r:
if len(line) < 2 or line[0] == "#" or line[0:2] == "//":
continue
line = replaceStr(line)
rows = fieldsSplit.split(line)
if len(rows) < 5 or rows[0] == "0":
continue
sz = len(rows)
if sz > 19:
sz = 19
for f in xrange(0, sz):
rows[f] = rows[f].strip()
items[rows[1]] = {'id':rows[0],'buy':rows[4],'name':rows[1]}
items[rows[0]] = {'id':rows[0],'buy':rows[4],'name':rows[1]}
items[int(rows[0])] = {'id':rows[0],'buy':rows[4],'name':rows[1]}
# set all values then write
w.write("{\n")
c.write("{0}\t{1}\n".format(rows[1], rows[0]))
writeIntField(w, "Id", rows[0])
writeStrField(w, "AegisName", rows[1])
if isNew == True:
offset = -1
else:
offset = 0
writeStrField(w, "Name", rows[offset + 2])
if rows[offset + 3] == "0":
itemType = "2"
else:
itemType = rows[offset + 3]
writeIntField(w, "Type", itemType)
writeIntField(w, "Buy", rows[offset + 4])
if int(rows[offset + 4])*.75 <= int(rows[offset + 5])*1.24:
writeIntField(w, "Sell", str(int(int(rows[offset + 4])*.50)))
else:
writeIntField(w, "Sell", rows[offset + 5])
writeIntField(w, "Weight", rows[offset + 6])
writeIntField(w, "Atk", rows[offset + 7])
writeIntField(w, "Matk", "0")
writeIntField(w, "Def", rows[offset + 8])
writeIntField(w, "Range", rows[offset + 9])
writeIntField(w, "Slots", "0")
writeIntField(w, "Gender", rows[offset + 12])
writeIntField(w, "Loc", rows[offset + 13])
writeIntField(w, "WeaponLv", rows[offset + 14])
writeIntField(w, "EquipLv", rows[offset + 15])
writeIntField(w, "Refine", "false")
if isNew == True:
offset = 2
else:
offset = 0
if rows[offset + 13] == "2":
writeIntField(w, "ViewSprite", "1")
elif rows[offset + 13] == "34":
writeIntField(w, "ViewSprite", "11")
elif rows[offset + 13] == "32768":
writeIntField(w, "ViewSprite", "1")
elif itemType == "4": # weapon
writeIntField(w, "ViewSprite", "1")
else:
writeIntField(w, "View", rows[0])
writeIntField(w, "BindOnEquip", "false")
writeIntField(w, "BuyingStore", "false")
writeIntField(w, "Delay", "0")
writeIntField(w, "Sprite", "0")
scripts = ""
if isNew == True:
offset = -1
else:
offset = 0
for f in xrange(offset + 17, len(rows)):
scripts = scripts + ", " + rows[f]
rows = scriptsSplit.split(scripts)
# Needs .split(';') and \n each
if len(rows) > 1:
UseScript = scriptsTextColon.sub(';',scriptsTextComma.sub('', scriptsTextClean.sub('', rows[0]))).strip().split(';')
EquipScript = scriptsTextColon.sub(';',scriptsTextComma.sub('', scriptsTextClean.sub('', rows[1]))).strip().split(';')
else:
UseScript = ""
EquipScript = ""
# move to for stmt
if len(UseScript) > 1:
writeStartScript(w, "Script")
for uline in UseScript:
if len(uline) > 0:
w.write(" {0};\n".format(uline))
writeEndScript(w)
if len(EquipScript) > 1:
writeStartScript(w, "OnEquipScript")
for eline in EquipScript:
if len(eline) > 0:
w.write(" {0};\n".format(eline))
writeEndScript(w)
w.write("},\n")
w.write(")\n")
return items