User talk:Kess/Sandbox
From The Mana World
#!/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<br />BUY/sell",
"Weight",
"Description",
"Other"]
status_titles = ["Image",
"Name",
"ID",
"Spell name",
"Parameter 1",
"Parameter 2",
"Price<br />BUY/sell",
"Weight",
"Description",
"Other"]
weapon_titles = ["Image",
"Name",
"ID",
"Damage<br />(range)",
"Price<br />BUY/sell",
"Weight",
"Description",
"Other"]
armor_titles = ["Image",
"Name",
"ID",
"Defense",
"Price<br />BUY/sell",
"Weight",
"Description",
"Other"]
other_titles = ["Image",
"Name",
"ID",
"Price<br />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 x in script.values():
for j in range(len(x)):
try:
x[j] = int(x[j])
except:
#print x[j]
pass
return script
def parseitems(file):
objects = []
for line in file:
s = line[: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 pre in s[index:]:
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 a in curitem: 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 499 < 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 i.id in citems:
if i.label in imageurls:
url = imageurls[i.label]
else:
i.imagename=citems[i.id]["image"]
url=i.imagename[0].upper() + i.imagename[1:]
i.imgurl = "[[Image:"+ 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(key=lambda x: x.price+x.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)
elif 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 "itemheal" in item.usescript:
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 "sc_start" in item.usescript: typedir.status.append(item)
else: typedir.other.append(item)
typedir.onehandedweapons.sort(key=lambda x: x.attack)
typedir.twohandedweapons.sort(key=lambda x: x.attack)
typedir.ammo.sort(key=lambda x: x.attack)
typedir.legarmor.sort(key=lambda x: x.defense)
typedir.handarmor.sort(key=lambda x: x.defense)
typedir.shields.sort(key=lambda x: x.defense)
typedir.footarmor.sort(key=lambda x: x.defense)
typedir.rings.sort(key=lambda x: x.defense)
typedir.headarmor.sort(key=lambda x: x.defense)
typedir.chestarmor.sort(key=lambda x: x.defense)
typedir.healthy.sort(key=lambda x: int(x.usescript["itemheal"][0])+int(x.usescript["itemheal"][1]))
typedir.inspiring.sort(key=lambda x: int(x.usescript["itemheal"][1]))
typedir.status.sort(key=lambda x: x.price+x.sell)
typedir.other.sort(key=lambda x: x.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<br>%d gp\n' % (buy,sell)
def getidstring(id):
return '| style="text-align:center;" | [%d]\n' % id
def getextrainfostring(i):
global extrainfo
returnstring = ''
if i.label in extrainfo:
# Availability/rarity
if extrainfo[i.label] >> 0 & 1 == 1: returnstring += '<br />Buyable'
if extrainfo[i.label] >> 1 & 1 == 1: returnstring += '<br />Quest reward'
if extrainfo[i.label] >> 2 & 1 == 1: returnstring += '<br />Common drop'
if extrainfo[i.label] >> 3 & 1 == 1: returnstring += '<br />Rare drop'
if extrainfo[i.label] >> 4 & 1 == 1: returnstring += '<br />Previously available'
if extrainfo[i.label] >> 5 & 1 == 1: returnstring += '<br />Unobtainable'
if extrainfo[i.label] >> 6 & 1 == 1: returnstring += '<br />GM only'
if extrainfo[i.label] >> 7 & 1 == 1: returnstring += '<br />Dev only'
if extrainfo[i.label] >> 8 & 1 == 1: returnstring += '<br />Special'
# Other
if extrainfo[i.label] >> 9 & 1 == 1: returnstring += '<br />Dyeable\n'
# Spell
if "sc_start" in i.usescript:
returnstring += '<br />Spell: %s (%d, %d)' % (i.usescript["sc_start"][0],
i.usescript["sc_start"][1],
i.usescript["sc_start"][2])
# Bonus
if "bonus" in i.equipscript:
returnstring += '<br />Bonus: %s %d' % (i.equipscript["bonus"][0],
i.equipscript["bonus"][1])
# Do not return the first instance of the <br /> 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()