- !/usr/bin/python
- Licensed under GNU General Public License
import sys, os, popen2; import xml.parsers.expat
debug=0
- ##
- ADD WIKILINKS TO IMAGES OF ITEMS THAT ARE DYED ##
- OR DO NOT HAVE THE SAME NAME IN WIKI AND SVN ##
- ##
imageurls = { 'AlizarinHerb': "Alizarin-herb.png",
'BlackDye': "Use-potion-blackdye.png", 'BlackRose': "Generic-blackrose.png", 'BlackScorpionStinger': "Generic-blackscorpionstinger.png", 'BlueRose': "Generic-bluerose.png",
'CactusDrink': "Use-potion-cactusdrink.png", 'CactusPotion': "Use-potion-cactuspotion.png", 'Cap': "Armor-head-cap.png", 'CaveSnakeEgg': "Use-food-cavesnakeegg.png", 'CaveSnakeTongue': "Generic-cavesnaketongue.png", 'CobaltHerb': "Cobalt-herb.png", 'ConcentrationPotion': "Use-potion-concentrationpotion.png", 'CottonCloth': "Generic-fabric.png", 'CottonHeadband': "Armor-legs-cottonheadband.png", 'CottonShorts': "Armor-legs-cottonshorts.png", 'CottonSkirt': "Armor-legs-skirt.png",
'DarkBlueDye': "Use-potion-darkbluedye.png", 'DarkGreenDye': "Use-potion-darkgreendye.png", 'DarkRedRose': "Generic-darkredrose.png", 'DevelopersCap': "Armor-head-devcap.png",
'GambogeHerb': "Gamboge-herb.png", 'GMRobe': "Armor-chest-gmrobe.png", 'GoldenPlatemail': "Armor-chest-lightplatemailgold.png", 'GoldenScorpionStinger': "Generic-goldenscorpionstinger.png", 'GoldenWarlordPlate': "Armor-chest-warlordplategold.png", 'GrassSnakeEgg': "Use-food-grasssnakeegg.png", 'GrassSnakeTongue': "Generic-grasssnaketongue.png", 'GreenDye': "Use-potion-greendye.png",
'IronPotion': "Use-potion-ironpotion.png", 'IronPowder': "Generic-ironpowder.png", 'Iten': "Generic-iten.png",
'JeansShorts': "Armor-legs-jeanshorts.png",
'LargeHealingPotion': "Use-potion-largehealingpotion.png", 'LightBlueDye': "Use-potion-lightbluedye.png", 'LightPlatemail': "Armor-chest-lightplatemail.png",
'MagicPotion': "Use-potion-magicpotion.png", 'MauveHerb': "Mauve-herb.png", 'MediumHealingPotion': "Use-potion-mediumhealingpotion.png", 'MonsterOilPotion': "Use-potion-monsteroilpotion.png", 'MountainSnakeEgg': "Use-food-mountainsnakeegg.png", 'MountainSnakeTongue': "Generic-mountainsnaketongue.png",
'OrangeDye': "Use-potion-orangedye.png", 'OrangeRose': "Generic-orangerose.png", 'OrangeTulip': "Generic-orangetulip.png",
'PileOfAsh': "Generic-ashpowder.png", 'PinkDye': "Use-potion-pinkdye.png", 'PinkRose': "Generic-pinkrose.png", 'PinkTulip': "Generic-pinktulip.png", 'PurpleDye': "Use-potion-purpledye.png", 'PurpleTulip': "Generic-purpletulip.png",
'RedDye': "Use-potion-reddye.png", 'RedRose': "Generic-redrose.png", 'RedScorpionStinger': "Generic-redscorpionstinger.png", 'RedTulip': "Generic-redtulip.png",
'ScorpionStinger': "Generic-scorpionstinger.png", 'SilkRobe': "Armor-chest-robe.png", 'SmallHealingPotion': "Use-potion-smallhealingpotion.png", 'SnakeEgg': "Use-food-snakeegg.png", 'SnakeTongue': "Generic-snaketongue.png", 'Steak': "Use-food-steak.png", 'SulphurPowder': "Generic-sulphurpowder.png",
'TinyHealingPotion': "Use-potion-tinyhealingpotion.png", 'TurtleneckSweater': "Armor-chest-tnecksweater.png",
'VNeckSweater': "Armor-chest-vnecksweater.png",
'WarlordPlate': "Armor-chest-warlordplate.png", 'WhiteRose': "Generic-whiterose.png", 'WhiteShortTankTop': "Armor-chest-whiteshorttanktop.png", 'WhiteTankTop': "Armor-chest-whitetanktop.png", 'WhiteTulip': "Generic-whitetulip.png",
'YellowDye': "Use-potion-yellowdye.png", 'YellowRose': "Generic-yellowrose.png", 'YellowTulip': "Generic-yellowtulip.png"
- Note that the last line above should not be ended by a comma!
}
- ##
- OTHER ITEM INFORMATION ##
- ##
- Availability
B = 1 # (0) Buyable: can be bought from shops Q = 2 # (1) Quest reward: available from quests C = 4 # (2) Common drop: commonly dropped by monsters (> 1% chance) R = 8 # (3) Rare drop: rarely dropped by monsters (<= 1% chance) O = 16 # (4) Old: was previously available in the game U = 32 # (5) Unreleased: unreleased or otherwise unobtainable G = 64 # (6) GM only: only for game masters D = 128 # (7) Dev only: only for developers S = 256 # (8) Special: special purpose (e.g. Wedding Ring)
- Other
Y = 512 # (9) Dyeable: can be dyed
extrainfo = { 'AlizarinHerb': C, 'AntlerHat': O, 'Apple': B + C, 'Arrow': B + C, 'Axe': U, 'AxeHat': O,
'Bandana': O, 'Bardiche': U, 'Beer': B, 'Beheader': U, 'BlackCowboyHat': Q, 'BlackDye': Q, 'BlackRose': B, 'BlackScorpionStinger': C, 'BlacksmithsAxe': U, 'BlueEasterEgg': O, 'BluePresentBox': Q + C, 'BlueRose': B, 'BoneDarts': U, 'BoneKnife': Q, 'Boots': B + C, 'BottleOfSand': U, 'BottleOfWater': C, 'Bow': B + Q, 'BugLeg': Q + C, 'BunnyEars': O,
'CactusDrink': B + C, 'CactusPotion': B + Q + C, 'Cake': B + Q + C, 'Candy': Q + C, 'CandyCane': Q + C, 'Cap': U, 'CasinoCoins': B + Q + C, 'CatEars': U, 'CaveSnakeEgg': C, 'CaveSnakeLamp': C, 'CaveSnakeTongue': C, 'ChainmailShirt': B, 'CherryCake': B + Q + C, 'ChickenLeg': B, 'ChocolateBar': Q + C, 'ChristmasElfHat': O, 'ChristmasTreeHat': O, 'Circlet': O, 'CobaltHerb': C, 'CoinBag': C, 'ConcentrationPotion': B + Q + R, 'CottonCloth': C, 'CottonHeadband': U, 'CottonShirt': B + Q, 'CottonShorts': B + Q, 'CottonSkirt': B, 'CrescentRod': U, 'Crown': U, 'CrusadeHelmet': Q,
'Dagger': B + C, 'DarkBlueDye': Q, 'DarkCrystal': O, 'DarkGreenDye': Q, 'DarkRedRose': B, 'DecorCandy': Q + C, 'DemonMask': U, 'DesertBow': U, 'DesertHat': U, 'DesertShirt': B, 'DevelopersCap': D,
'EasterEgg': Q, 'EmptyBottle': C, 'Eyepatch': O,
'FaceMask': O, 'Falcion': U, 'FancyHat': B + C, 'ForestBow': B + Q, 'FunkyHat': O, 'FurBoots': Q,
'GambogeHerb': C, 'GingerBreadMan': Q + C, 'GMsCap': G, 'GMRobe': G, 'Goggles': O, 'GoldenPlatemail': U, 'GoldenScorpionStinger': Q, 'GoldenWarlordPlate': U, 'GraduationCap': Q, 'GrassSnakeEgg': C, 'GrassSnakeTongue': C, 'GreenDye': Q, 'GreenEasterEgg': O, 'GreenPresentBox': C,
'Halberd': U, 'HardSpike': C, 'HeartNecklace': U, 'HighPriestCrown': U, 'Hint1': O, 'Hint2': O, 'Hint3': O, 'Hint4': O, 'Hint5': O, 'Hint6': O, 'Hint7': O, 'Hint8': O, 'Hint9': O, 'Hint10': O,
'InfantryHelmet': R, 'IronArrow': B, 'IronOre': C, 'IronPotion': B + Q + C, 'IronPowder': U, 'Iten': U,
'Jackal': U, 'JeansChaps': Q, 'JeansShorts': R,
'Knife': B + C, 'KnightsHelmet': Q,
'LargeHealingPotion': Q, 'LeatherGloves': R, 'LeatherGoggles': O, 'LeatherPatch': Q, 'LeatherShield': B, 'LeatherShirt': B + C, 'LightBlueDye': Q, 'LightPlatemail': B,
'MaggotSlime': Q + C, 'MauveHerb': C, 'MediumHealingPotion': Q, 'Milk': B + C, 'MinerGloves': B + C, 'MinersHat': B + C, 'MonsterOilPotion': Q, 'MonsterSkullHelmet': U, 'MoubooHead': U, 'MountainSnakeEgg': C, 'MountainSnakeTongue': C, 'MushHat': O,
'NohMask': Q,
'Orange': B + C, 'OrangeCupcake': B + C, 'OrangeDye': Q, 'OrangeRose': B, 'OrangeTulip': B,
'Pearl': R, 'Petal': C, 'PileOfAsh': C, 'PinkAntenna': C, 'PinkDye': Q, 'PinkEasterEgg': O, 'PinkRose': B, 'PinkTulip': B, 'PirateHat': O, 'PumpkinHelmet': O, 'PurpleDye': Q, 'PurplePresentBox': Q + C, 'PurpleTulip': B,
'RangerHat': O, 'RawLog': C, 'RedChristmasStocking': O, 'RedDye': Q, 'RedEasterEgg': O, 'RedRose': B, 'RedScorpionStinger': Q + C, 'RedTulip': B, 'RoastedMaggot': B + C, 'RockKnife': U,
'Sabre': U, 'SandCutter': U, 'SantaBeardHat': O, 'SantaCookie': O, 'SantaHat': Q, 'ScarabArmlet': O, 'Scimitar': U, 'Scorpion': U, 'ScorpionStinger': Q + C, 'Scythe': Q, 'SerfHat': B, 'Setzer': Q, 'SharpKnife': B + C, 'ShortBow': B, 'ShortSword': Q, 'ShroomHat': O, 'SilkCocoon': C, 'SilkHeadband': B, 'SilkRobe': Q, 'SmallHealingPotion': Q, 'SmallMushroom': C, 'SnakeSkin': C, 'SnakeEgg': C, 'SnakeTongue': C, 'StaffOfFire': U, 'StaffOfIce': U, 'StaffOfLife': U, 'StandardHeadband': B, 'Steak': B, 'SteelShield': Q, 'SulphurPowder': U,
'TealEasterEgg': O, 'TinyHealingPotion': Q, 'TopHat': O, 'ToySabre': O, 'TreasureKey': C, 'TurtleneckSweater': O,
'VNeckSweater': O,
'WarlordHelmet': Q, 'WarlordPlate': B, 'WeddingRing': S, 'WhiteCowboyHat': Q, 'WhiteFur': C, 'WhiteRose': B, 'WhiteShortTankTop': Q, 'WhiteTankTop': Q, 'WhiteTulip': B, 'WinterGloves': Q, 'WoodenShield': Q,
'XmasCake': Q + C, 'XmasCandyCane': Q + C,
'YellowDye': Q, 'YellowEasterEgg': O, 'YellowRose': B, 'YellowTulip': B
- Note that the last line above should not be ended by a comma!
}
- ##
- INTRO TEXT ##
- ##
def printwarningcomments():
def printintrotext():
- ##
- TABLE HEADERS ##
- ##
health_titles = ["Image",
"Name", "ID", "HP", "SP", "Price
BUY/sell", "Weight", "Description", "Other"]
status_titles = ["Image",
"Name", "ID", "Spell name", "Parameter 1", "Parameter 2", "Price
BUY/sell", "Weight", "Description", "Other"]
weapon_titles = ["Image",
"Name", "ID", "Damage
(range)", "Price
BUY/sell", "Weight", "Description", "Other"]
armor_titles = ["Image",
"Name", "ID", "Defense", "Price
BUY/sell", "Weight", "Description", "Other"]
other_titles = ["Image",
"Name", "ID", "Price
BUY/sell", "Weight", "Description", "Other"]
class whatever: pass
log = []
- parseitems(file)
- Returns list with items from eathena item_db file.
def saveint(string, altval = 0):
a = 0 try: a = int(string) except: a = altval return a
def parsescript(s):
# Assumes that there's only one call of each method, otherwise it would need to know # how to combine those function calls. In practice, the latter call would prevail. script = {} scriptentry = "" parentry = "" mode = 0 for a in s: if mode == 0: # looking for method if a.isalpha(): mode = 1 scriptentry += a elif a == '}': mode = 9 elif mode == 1: # reading method name if a in " ;}": if a == " ": mode = 2 elif a == ";": mode = 1 elif a == "}": mode = 9 parentry = "" script[scriptentry] = [] else: scriptentry += a elif mode == 2: #looking for param if a == " ": pass elif a == ";": mode = 0 scriptentry = "" else: mode = 3 parentry = a elif mode == 3: #reading param if (a == " ") or (a == ",") or (a == ";"): script[scriptentry].append(parentry) parentry = "" if (a == ';'): mode = 0 scriptentry = "" else: mode = 2 else: parentry += a elif mode == 9: #finished pass
# Convert all possible parameters to integers for i in script.keys(): for j in range(len(script[i])): try: script[i][j] = int(script[i][j]) except: #print script[i][j] pass return script
def parseitems(file):
objects = [] for line in file: s = line[0:line.find('//')].strip().replace('\t',) if s: #Replace commas inbetween {} with |, so we can use split mode = 0 sout = "" for a in s: if mode == 0: #Out of {} if a == '{': mode = 1 sout += a elif mode == 1: #Inside {} if a == ',': sout += '|' else: sout += a if a == '}': mode = 0
values_norm = 20 values = sout.split(',') if line[0] == '#': if debug: log.append("FOUND COMMENT LINE: %s" % str(values)) continue if (len(values) != values_norm): log.append("item_db: Warning, item-line with ID %s has %d values instead of %d" % (values[0], len(values), values_norm)) if debug: log.append(" line was %s" % str(values)) while (len(values) < values_norm): values.append() while (len(values) > values_norm): values.pop()
o = whatever() o.id = int(values[0]) o.label = values[1] o.name = values[2] o.type = saveint(values[3]) o.price = saveint(values[4]) o.sell = saveint(values[5]) o.weight = saveint(values[6]) o.attack = saveint(values[7]) o.defense = saveint(values[8]) o.range = saveint(values[9]) o.magicbonus = saveint(values[10]) o.slot = saveint(values[11],-1) o.job = saveint(values[12],-1) o.gender = saveint(values[13],-1) o.loc = saveint(values[14]) o.wlv = saveint(values[15]) o.elv = saveint(values[16]) o.view = saveint(values[17],-1) o.usescript = parsescript(values[18].replace('|',',')) o.equipscript = parsescript(values[19].replace('|',','))
objects.append(o)
return objects
- parsexmlitems(file)
- Creates a dictionary containing the values of a client items.xml
- Yeah, there are XML parsers in the standard python libraries, but they're too object
- oriented and thus don't fit the style of this program.
def parsexmlitems(file):
items = {} pre = "<item " term = ">" attrs = ["id", "image", "name", "description", "type", "weight"] intattrs = ["id", "weight"] s = file.read() index = 0 debug = 0 while s[index:].find(pre) >= 0: index += s[index:].find(pre) + len(pre) curitem = {} termstart = index + s[index:].find(term) + len(term)
for attr in attrs: found = s[index:].find(attr+'="') if found >= 0: start = index + found + len(attr+'="') end = start + s[start:].find('"') else: start = termstart
if (start < termstart): curitem[attr] = s[start:end]
for a in intattrs: try: if curitem.has_key(a): curitem[a] = int(curitem[a]) except: log.append("Item-ID %s: Cannot convert integer attribute %s to an integer. Value: '%s'" % (curitem["id"], a, curitem[a]))
# For now, IDs below 500 are no real items and IDs 2xxx are dyed variants if ((curitem.get('id') > 499) and (curitem.get('id') < 2000)): items[curitem.get('id')] = curitem
return items
- addclientinformation(items, citems)
- Extends the item data with the data collected from the client items.xml. Adding imageurls,
- client name, description and effect
def addclientinformation(items, citems):
global imageurls for i in items: if citems.has_key(i.id): if imageurls.has_key(i.label): url = imageurls[i.label] else: i.imagename=citems[i.id]["image"] url=i.imagename[0].upper() + i.imagename[1:] i.imgurl = "File:"+ url + "" i.description = citems[i.id]["description"] i.clientname = citems[i.id]["name"] else: i.imgurl = i.description = i.clientname =
- gettypedir (items)
- Returns sorted lists of items by itemtype
def gettypedir(items):
items.sort(lambda x,y: (x.price+x.sell) - (y.price+y.sell))
typedir = whatever() typedir.legarmor = [] typedir.onehandedweapons = [] typedir.handarmor = [] typedir.shields = [] typedir.twohandedweapons = [] typedir.footarmor = [] typedir.rings = [] typedir.headarmor = [] typedir.chestarmor = [] typedir.ammo = [] typedir.healthy = [] typedir.status = [] typedir.inspiring = [] typedir.other = []
for item in items: if (item.imgurl.strip() or item.clientname.strip()): # -1- Check the equipable items if (item.loc == 1): typedir.legarmor.append(item) elif (item.loc == 2): typedir.onehandedweapons.append(item) elif (item.loc == 4): typedir.handarmor.append(item) elif (item.loc == 32): typedir.shields.append(item) elif (item.loc == 34): typedir.twohandedweapons.append(item) elif (item.loc == 64): typedir.footarmor.append(item) elif (item.loc == 128): typedir.rings.append(item) elif (item.loc == 256): typedir.headarmor.append(item) elif (item.loc == 512): typedir.chestarmor.append(item) elif (item.loc == 32768): typedir.ammo.append(item) else: if (item.loc < 0): log.append("Warning: Script needs to be updated with new armor type for item %d." % item.id)
# -2- Check other items elif item.usescript.has_key("itemheal"): if item.usescript["itemheal"][0] >= item.usescript["itemheal"][1]: typedir.healthy.append(item) if item.usescript["itemheal"][1] >= item.usescript["itemheal"][0]: typedir.inspiring.append(item) #elif item.usescript.has_key("sc_start"): typedir.status.append(item) else: typedir.other.append(item)
typedir.onehandedweapons.sort(lambda x,y: x.attack - y.attack) typedir.twohandedweapons.sort(lambda x,y: x.attack - y.attack) typedir.ammo.sort(lambda x,y: x.attack - y.attack)
typedir.legarmor.sort(lambda x,y: x.defense - y.defense) typedir.handarmor.sort(lambda x,y: x.defense - y.defense) typedir.shields.sort(lambda x,y: x.defense - y.defense) typedir.footarmor.sort(lambda x,y: x.defense - y.defense) typedir.rings.sort(lambda x,y: x.defense - y.defense) typedir.headarmor.sort(lambda x,y: x.defense - y.defense) typedir.chestarmor.sort(lambda x,y: x.defense - y.defense)
typedir.healthy.sort(lambda x,y: (int(x.usescript["itemheal"][0])+int(x.usescript["itemheal"][1])) - (int(y.usescript["itemheal"][0])+int(y.usescript["itemheal"][1]))) typedir.inspiring.sort(lambda x,y: int(x.usescript["itemheal"][1]) - int(y.usescript["itemheal"][1])) typedir.status.sort(lambda x,y: (x.price+x.sell) - (y.price+y.sell)) typedir.other.sort(lambda x,y: x.id - y.id)
return typedir
- printlog()
- Prints the global variable log to stdout
def printlog():
global log if len(log) > 0: sys.stdout.write('\n---------------------------------------\n') for line in log: sys.stdout.write(line+'\n')
- ##
- CREATE THE WIKI TABLES ##
- ##
def getmoneystring(buy, sell):
return '| align="right" | %d GP
%d gp\n' % (buy,sell)
def getidstring(id):
return '| style="text-align:center;" | [%d]\n' % id
def getextrainfostring(i):
global extrainfo returnstring = if extrainfo.has_key(i.label): # Availability/rarity if (extrainfo[i.label] >> 0 & 1 == 1): returnstring += '
Buyable' if (extrainfo[i.label] >> 1 & 1 == 1): returnstring += '
Quest reward' if (extrainfo[i.label] >> 2 & 1 == 1): returnstring += '
Common drop' if (extrainfo[i.label] >> 3 & 1 == 1): returnstring += '
Rare drop' if (extrainfo[i.label] >> 4 & 1 == 1): returnstring += '
Previously available' if (extrainfo[i.label] >> 5 & 1 == 1): returnstring += '
Unobtainable' if (extrainfo[i.label] >> 6 & 1 == 1): returnstring += '
GM only' if (extrainfo[i.label] >> 7 & 1 == 1): returnstring += '
Dev only' if (extrainfo[i.label] >> 8 & 1 == 1): returnstring += '
Special'
# Other if (extrainfo[i.label] >> 9 & 1 == 1): returnstring += '
Dyeable\n'
# Spell if i.usescript.has_key("sc_start"): returnstring += '
Spell: %s (%d, %d)' % (i.usescript["sc_start"][0], i.usescript["sc_start"][1], i.usescript["sc_start"][2])
# Bonus if i.equipscript.has_key("bonus"): returnstring += '
Bonus: %s %d' % (i.equipscript["bonus"][0], i.equipscript["bonus"][1])
# Do not return the first instance of the
tag return returnstring[6:] + '\n'
def tablestart(title, text):
sys.stdout.write('== %s ==\n' % title) sys.stdout.write('%s\n' % text) sys.stdout.write('{| border="1" cellspacing="0" cellpadding="5" width="100%"\n')
def tableend():
sys.stdout.write('|}\n\n')
def printhealitems(items, title):
tablestart(title, 'Sorted by combined HP and SP effect.') for title in health_titles: sys.stdout.write('! style="background:#efdead;" | %s\n' % title) for i in items: sys.stdout.write('|-\n') sys.stdout.write('| style="text-align:center;" | %s\n' % i.imgurl) sys.stdout.write('| %s\n' % i.clientname) sys.stdout.write( getidstring(i.id) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.usescript["itemheal"][0]) sys.stdout.write('| style="text-align:center;" | %d\n' % i.usescript["itemheal"][1]) sys.stdout.write( getmoneystring(i.price,i.sell) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.weight) sys.stdout.write('| %s\n' % i.description) sys.stdout.write('| ' + getextrainfostring(i)) tableend()
def printstatusitems(items, title):
tablestart(title, 'Sorted by price.') for title in status_titles: sys.stdout.write('! style="background:#efdead;" | %s\n' % title) for i in items: sys.stdout.write('|-\n') sys.stdout.write('| style="text-align:center;" | %s\n' % i.imgurl) sys.stdout.write('| %s\n' % i.clientname) sys.stdout.write( getidstring(i.id) ) sys.stdout.write('| style="text-align:center;" | %s\n' % i.usescript["sc_start"][0]) sys.stdout.write('| style="text-align:center;" | %s\n' % i.usescript["sc_start"][1]) sys.stdout.write('| style="text-align:center;" | %s\n' % i.usescript["sc_start"][2]) sys.stdout.write( getmoneystring(i.price,i.sell) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.weight) sys.stdout.write('| %s\n' % i.description) sys.stdout.write('| ' + getextrainfostring(i)) tableend()
def printweaponitems(items, title):
tablestart(title, 'Sorted by attack.') for title in weapon_titles: sys.stdout.write('! style="background:#efdead;" | %s\n' % title)
for i in items: sys.stdout.write('|-\n') sys.stdout.write('| style="text-align:center;" | %s\n' % i.imgurl) sys.stdout.write('| %s\n' % i.clientname) sys.stdout.write( getidstring(i.id) ) sys.stdout.write('| style="text-align:center;" | %d (%d)\n' % (i.attack,i.range)) sys.stdout.write( getmoneystring(i.price,i.sell) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.weight) sys.stdout.write('| %s\n' % i.description) sys.stdout.write('| ' + getextrainfostring(i)) tableend()
def printarmoritems(items, title):
tablestart(title, 'Sorted by defence.') for title in armor_titles: sys.stdout.write('! style="background:#efdead;" | %s\n' % title)
for i in items: sys.stdout.write('|-\n') sys.stdout.write('| style="text-align:center;" | %s\n' % i.imgurl) sys.stdout.write('| %s\n' % i.clientname) sys.stdout.write( getidstring(i.id) ) sys.stdout.write('| style="text-align:center;" | %d%%\n' % i.defense) sys.stdout.write( getmoneystring(i.price,i.sell) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.weight) sys.stdout.write('| %s\n' % i.description) sys.stdout.write('| ' + getextrainfostring(i)) tableend()
def printotheritems(items, title):
tablestart(title, 'Sorted by ID.') for title in other_titles: sys.stdout.write('! style="background:#efdead;" | %s\n' % title)
for i in items: sys.stdout.write('|-\n') sys.stdout.write('| style="text-align:center;" | %s\n' % i.imgurl) sys.stdout.write('| %s\n' % i.clientname) sys.stdout.write( getidstring(i.id) ) sys.stdout.write( getmoneystring(i.price,i.sell) ) sys.stdout.write('| style="text-align:center;" | %d\n' % i.weight) sys.stdout.write('| %s\n' % i.description) sys.stdout.write('| ' + getextrainfostring(i)) tableend()
- ##
- MAIN ##
- ##
try:
if (len(sys.argv) == 1): item_db = "item_db.txt" item_xml = "items.xml" elif (len(sys.argv) == 3): item_db = sys.argv[1] item_xml = sys.argv[2] else: item_db = item_xml = sys.stdout.write("Wrong number of arguments\n")
if item_db and (not os.path.isfile(item_db)): sys.stdout.write("File does not exist: %s\n" % item_db) item_db = if item_xml and (not os.path.isfile(item_xml)): sys.stdout.write("File does not exist: %s\n" % item_xml) item_db = if not (item_db and item_xml): sys.stdout.write("\nUSAGE:\n") sys.stdout.write("dbtowiki without any arguments will use item_db.txt and items.xml in the current directory.\n") sys.stdout.write("to specify custom files, call: dbtowiki <item_db> <item_xml>\n") exit(-1); else: if debug: log.append("Item-list [item_db] = %s" % item_db) log.append("Item-list [item_xml] = %s" % item_xml) f = open(item_db) items = parseitems(f); f = open(item_xml) citems = parsexmlitems(f);
addclientinformation(items, citems)
printwarningcomments() printintrotext()
typedir = gettypedir(items) if len(typedir.healthy) > 0: printhealitems(typedir.healthy, "Health items") if len(typedir.status) > 0: printstatusitems(typedir.status, "Status items") if len(typedir.inspiring) > 0: printhealitems(typedir.inspiring, "Mana items") if len(typedir.other) > 0: printotheritems(typedir.other, "Other items")
if len(typedir.onehandedweapons) > 0: printweaponitems(typedir.onehandedweapons, "One-handed weapons") if len(typedir.twohandedweapons) > 0: printweaponitems(typedir.twohandedweapons, "Two-handed weapons") if len(typedir.ammo) > 0: printweaponitems(typedir.ammo, "Ammo")
if len(typedir.headarmor) > 0: printarmoritems(typedir.headarmor, "Head armor") if len(typedir.legarmor) > 0: printarmoritems(typedir.legarmor, "Leg armor") if len(typedir.chestarmor) > 0: printarmoritems(typedir.chestarmor, "Chest armor") if len(typedir.footarmor) > 0: printarmoritems(typedir.footarmor, "Foot armor") if len(typedir.handarmor) > 0: printarmoritems(typedir.handarmor, "Gloves") if len(typedir.shields) > 0: printarmoritems(typedir.shields, "Shields") if len(typedir.rings) > 0: printarmoritems(typedir.rings, "Rings")
finally:
printlog()