From The Mana World
(Broken Link)
(Update of python script to completely write the wiki page)
Line 1: Line 1:
=== Strength of Red Scorpion ===
==Autogenerating page==
The main article is generated by a python script that creates the monster page in wikicode from the eAthena configuration files.


Wasnt the RED scorpion supposed to be a miniboss? that HP seems kinda low for one :o
The program will write the complete Monster reference page to stdout (standard output). It is just to copy and paste that text. If you want to edit the introductory text or add images, please do so in the script below.
--[[User:Bear|Bear]]


Cool, I was thinking about bosses too.
If you run <code>dbtowiki</code> without any arguments, the program will try to find the files <code>item_db.txt</code> and <code>mob_db.txt</code> in the current directory. To specify custom files, call <code>dbtowiki <mob_db> <item_db></code>.
I believe that Red Guy is like a boss. There are too many snakes and spiders, a DRAGON should be a good idea for a boss. But ONLY ONE DRAGON, please.
--[[User:BrightCiro|BrightCiro]] (Ciro Leonardo, the char)


=== Python program dbtowiki ===
=== Python program dbtowiki ===
This is a program to autogenerate a monster page in wikicode from eAthena configuration files.
dbtowiki without any arguments will use item_db.txt and mob_db.txt in the current directory to write a monster list in wikicode to stdout. To specify custom files, call: ''dbtowiki <mob_db> <item_db>''
<span style="color:red">Note: When changing all images to internal wiki images, I did so by hand and then modified the imageurls by hand, I just hope that I didn't manage to make an error there. Please remove this note when you re-generate the page (and/or fix the imageurls) and all imageurls are correct. Thanks. [[User:Thefox|Thefox]] 23:52, 22 January 2006 (CET)</span>
<pre>
<pre>
#!/usr/bin/python
#!/usr/bin/python
#Licensed under GNU General Public License
#Licensed under GNU General Public License
import sys, os;
import sys, os, datetime;


debug=0
debug=0


imageurls = {
imageurls = {
'Maggot': "[[Image:Maggot.png]]",
'AlizarinPlant': "[[Image:Plant-Alizarin.png]]",
'Scorpion': "[[Image:Scorpion.png]]",
'MauvePlant':   "[[Image:Plant-Mauve.png]]",
'RedScorpion': "[[Image:RedScorpion.png]]",
'Bat':           "[[Image:Bat.png]]",
'GreenSlime': "[[Image:GreenSlime.png]]",
'GiantMaggot': "[[Image:GiantMaggot.png]]",
'YellowSlime': "[[Image:YellowSlime.png]]",
'RedSlime': "[[Image:RedSlime.png]]",
'BlackScorpion': "[[Image:BlackScorpion.png]]",
'BlackScorpion': "[[Image:BlackScorpion.png]]",
'Snake' : "[[Image:Snake.png]]",
'CaveSnake':     "[[Image:LampSnake.png]]",
'FireGoblin': "[[Image:FireGoblin.png]]",
'CobaltPlant':   "[[Image:Plant-Cobalt.png]]",
'Spider': "[[Image:Spider.png]]",
'EasterFluffy': "[[Image:Fluffy.png]]",
'EvilMushroom': "[[Image:Evilmushroom.png]]",
'EvilMushroom': "[[Image:Evilmushroom.png]]",
'SleepFlower': "[[Image:Sleepflower.png]]",
'FireGoblin':   "[[Image:FireGoblin.png]]",
'SantaSlime': "[[Image:Santaslime.png]]",
'FireSkull':    "[[Image:FireSkull.png]]",
'RudolphSlime': "[[Image:Rudolphslime.png]]",
'Flower':        "[[Image:Sleepflower.png]]",
'Bat': "[[Image:Bat.png]]",
'Fluffy':        "[[Image:Fluffy.png]]",
'Violet': "[[Image:Violet.png]]",
'GambogePlant':  "[[Image:Plant-Gamboge.png]]",
'Shroom': "[[Image:Shroom.png]]",
'GiantMaggot':   "[[Image:GiantMaggot.png]]",
'Fluffy': "[[Image:Fluffy.png]]",
'GrassSnake':    "",
'LampSnake': "[[Image:LampSnake.png]]",
'GreenSlime':   "[[Image:GreenSlime.png]]",
'FireSkull': "[[Image:FireSkull.png]]",
'JackO':         "[[Image:JackO.png]]",
'PoisonSkull': "[[Image:PoisonSkull.png]]",
'LogHead':       "[[Image:Stumpy.png]]",
#'Stumpy': ""
'Maggot':       "[[Image:Maggot.png]]",
'Mouboo':       "[[Image:Mouboo.png]]",
'MountainSnake': "[[Image:MountainSnake.png]]",
'Pinkie':       "[[Image:Violet.png]]",
'PoisonSkull':   "[[Image:PoisonSkull.png]]",
'RedScorpion':  "[[Image:RedScorpion.png]]",
'RedSlime':      "[[Image:RedSlime.png]]",
'RudolphSlime':  "[[Image:Rudolphslime.png]]",
'SantaSlime':    "[[Image:Santaslime.png]]",
'Scorpion':      "[[Image:Scorpion.png]]",
'SeaSlime':      "[[Image:Sea-slime.png]]",
'Silkworm':      "",
'Snake' :        "[[Image:Snake.png]]",
'Spider':        "[[Image:Spider.png]]",
'SpikyMushroom': "[[Image:Shroom.png]]",
'YellowSlime':   "[[Image:YellowSlime.png]]"
}
}


Line 70: Line 73:
                 if debug:
                 if debug:
                     log.append("FOUND COMMENT LINE: %s" % str(values))
                     log.append("FOUND COMMENT LINE: %s" % str(values))
                    continue
                continue
             if (len(values) != 55):
             if (len(values) != 55):
                 log.append("mob_db: Warning, monster-line with ID %s has %d values instead of 55" % (values[0], len(values)))
                 log.append("mob_db: Warning, monster-line with ID %s has %d values instead of 55" % (values[0], len(values)))
Line 81: Line 84:
             o = whatever()
             o = whatever()
             o.id = saveint(values[0])
             o.id = saveint(values[0])
             o.name = values[1]
             o.label = values[1]
             o.jname = values[2]
             o.name = values[2]
             o.lvl = saveint(values[3])
             o.lvl = saveint(values[3])
             o.hp = saveint(values[4])
             o.hp = saveint(values[4])
             o.sp = saveint(values[5])
             o.sp = saveint(values[5])
             o.exp = saveint(values[6])
             o.experience = saveint(values[6])
             o.expj = saveint(values[7])
             o.monsterpoints = saveint(values[7])
             o.range1 = saveint(values[8])
             o.range1 = saveint(values[8])
             o.atk1 = saveint(values[9])
             o.attackmin = saveint(values[9])
             o.atk2 = saveint(values[10])
             o.attackmax = saveint(values[10])
             o.defense = saveint(values[11])
             o.defense = saveint(values[11])
             o.mdefense = saveint(values[12])
             o.magicaldefense = saveint(values[12])
             o.strength = saveint(values[13])
             o.strength = saveint(values[13])
             o.agility = saveint(values[14])
             o.agility = saveint(values[14])
Line 106: Line 109:
             o.mode = saveint(values[24])
             o.mode = saveint(values[24])
             o.speed = saveint(values[25])
             o.speed = saveint(values[25])
             o.adelay = saveint(values[26])
             o.attackdelay = saveint(values[26])
             o.amotion = saveint(values[27])
             o.attackmotion = saveint(values[27])
             o.dmotion = saveint(values[28])
             o.defencemotion = saveint(values[28])
             o.drop = []
             o.drop = []
             for i in range(8):
             for i in range(8):
Line 149: Line 152:
     global imageurls
     global imageurls
     for m in monsters:
     for m in monsters:
         if imageurls.has_key(m.name):
         if imageurls.has_key(m.label):
             m.imgurl = imageurls[m.name]
             m.imgurl = imageurls[m.label]
         else:
         else:
             m.imgurl = ''
             m.imgurl = ''
             if debug:
             if debug:
                 log.append('Warning: Could not find imageurl for %s' % m.name)
                 log.append('Warning: Could not find imageurl for %s' % m.label)


def adddropnames(monsters,dropnames):
def adddropnames(monsters,dropnames):
Line 212: Line 215:
                 else:
                 else:
                     s = "%.1f" % (d.per/100.0)
                     s = "%.1f" % (d.per/100.0)
             output += ("%s %s%%" % (d.name.replace('_',' '), s))
             output += ("%s (%s%%)" % (d.name.replace('\t',''), s))
             i = i + 1
             i = i + 1
     return output
     return output


def printmonsters(monsters):
def printintroduction():
     sys.stdout.write('{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n')
     sys.stdout.write('{{Category_playerinfo}}\n{{Status_green}}\n')
    sys.stdout.write('\'\'\'Page last generated on %s.\'\'\'\n' % datetime.date.today())
    sys.stdout.write('\n')
    sys.stdout.write('\'\'\'Warning:\'\'\' this reference might be out of date. The python program to autogenerate this page can be found on the discussion page. Also, this reference might not reflect whats currently in the game. [http://themanaworld.svn.sourceforge.net/viewvc/themanaworld/server-data/trunk/db/mob_db.txt?revision=HEAD&view=markup You can view the most up-to-date version here.]\n')
    sys.stdout.write('\n')
    sys.stdout.write('The monsters are sorted roughly by their fighting strength, calculated as: <code>health_points * (attack_min + attack_max)</code>.\n')
    sys.stdout.write('\n')
 
def printtableheader():
     sys.stdout.write('! style="background:#efdead;" | Image\n')
     sys.stdout.write('! style="background:#efdead;" | Image\n')
     sys.stdout.write('! style="background:#efdead;" | Name\n')
     sys.stdout.write('! style="background:#efdead;" | Name\n')
     sys.stdout.write('! style="background:#efdead;" | ID\n')
     sys.stdout.write('! style="background:#efdead;" | ID\n')
     sys.stdout.write('! style="background:#efdead;" | HP\n')
     sys.stdout.write('! style="background:#efdead;" | HP\n')
    sys.stdout.write('! style="background:#efdead;" | Def.\n')
     sys.stdout.write('! style="background:#efdead;" | Attack\n')
     sys.stdout.write('! style="background:#efdead;" | Attack\n')
     sys.stdout.write('! style="background:#efdead;" | Exp.\n')
     sys.stdout.write('! style="background:#efdead;" | Exp.\n')
     sys.stdout.write('! style="background:#efdead;" | Job Exp.\n')
     sys.stdout.write('! style="background:#efdead;" | Mobp.\n')
     sys.stdout.write('! style="background:#efdead;" | Dropped Items\n')
     sys.stdout.write('! style="background:#efdead;" | Dropped items\n')
    sys.stdout.write('|-\n')
 
def printmonsters(monsters):
    printintroduction()
    sys.stdout.write('{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n')
 
    i = 0
     for m in monsters:
     for m in monsters:
         sys.stdout.write('|-\n')
         if (i == 10):
            i = 0
        if (i == 0):
            printtableheader()
 
         sys.stdout.write('| align="center" | %s\n' % m.imgurl)
         sys.stdout.write('| align="center" | %s\n' % m.imgurl)
         sys.stdout.write('| %s\n' % m.jname.replace('_',' ') )
         sys.stdout.write('| %s\n' % m.name)
         sys.stdout.write('| align="center" | %d\n' % m.id)
         sys.stdout.write('| align="center" | %d\n' % m.id)
         sys.stdout.write('| align="center" | %d\n' % m.hp)
         sys.stdout.write('| align="center" | %d\n' % m.hp)
         if m.atk1 < m.atk2:
         sys.stdout.write('| align="center" | %d%%\n' % m.defense)
            sys.stdout.write('| align="center" | %d-%d\n' % (m.atk1, m.atk2))
 
         elif m.atk1 > m.atk2:
         if m.attackmin < m.attackmax:
             sys.stdout.write('| align="center" | %d-%d\n' % (m.atk2, m.atk1))
             sys.stdout.write('| align="center" | %d-%d\n' % (m.attackmin, m.attackmax))
         else:
         else:
             sys.stdout.write('| align="center" | %d\n' % m.atk1)
             sys.stdout.write('| align="center" | %d\n' % m.attackmin)
           
        sys.stdout.write('| align="center" | %d\n' % m.exp)
        sys.stdout.write('| align="center" | %d\n' % m.expj)
        sys.stdout.write('| %s' % getdropstring(m))


         sys.stdout.write('\n')
         sys.stdout.write('| align="center" | %d\n' % m.experience)
     sys.stdout.write('|}')
        sys.stdout.write('| align="center" | %d\n' % m.monsterpoints)
           
        sys.stdout.write('| %s\n' % getdropstring(m))
        sys.stdout.write('|-\n')
 
        i = i + 1
 
     sys.stdout.write('|}\n')


   


#MAIN
#MAIN
Line 276: Line 299:
         exit(-1);
         exit(-1);
     else:
     else:
         log.append("Monster-list [mob_db] = %s" % mob_db)
         if debug:
        log.append("Item-list [item_db] = %s" % item_db)
            log.append("Monster-list [mob_db] = %s" % mob_db)
            log.append("Item-list [item_db] = %s" % item_db)
         f = open(mob_db)
         f = open(mob_db)
         monsters = parsemonsters(f);
         monsters = parsemonsters(f);
Line 285: Line 309:
         addimageurls(monsters)
         addimageurls(monsters)
         adddropnames(monsters,itemnames)
         adddropnames(monsters,itemnames)
         monsters.sort(lambda x, y: x.hp*(x.atk1+x.atk2) - y.hp*(y.atk1+y.atk2) )
         monsters.sort(lambda x, y: x.hp*(x.attackmin+x.attackmax) - y.hp*(y.attackmin+y.attackmax))


         printmonsters(monsters)
         printmonsters(monsters)
        sys.stdout.write("\n\n")


finally:
finally:
Line 294: Line 317:
</pre>
</pre>


== Agressive/nonagressive monsters? ==
==Discussion==


=== Strength of Red Scorpion ===
Wasnt the RED scorpion supposed to be a miniboss? that HP seems kinda low for one :o
--[[User:Bear|Bear]]
Cool, I was thinking about bosses too.
I believe that Red Guy is like a boss. There are too many snakes and spiders, a DRAGON should be a good idea for a boss. But ONLY ONE DRAGON, please.
--[[User:BrightCiro|BrightCiro]] (Ciro Leonardo, the char)
=== Agressive/nonagressive monsters? ===
Is there an easy way to list this attribute? [[User:Hoogli|Hoogli]] 21:02, 18 April 2008 (CEST)
Is there an easy way to list this attribute? [[User:Hoogli|Hoogli]] 21:02, 18 April 2008 (CEST)


Line 301: Line 333:


== Accuracy/Evade ==
== Accuracy/Evade ==
Wouldn't it effective to put down the accuracy and evade rates of enemies as well? It would help take the guessing game out and prevent further deaths of players via play-testing. (Esp. mountain snakes)
Wouldn't it effective to put down the accuracy and evade rates of enemies as well? It would help take the guessing game out and prevent further deaths of players via play-testing. (Esp. mountain snakes)
Since I am making an evade character, it would be nice to know the % to hit so I can adjust my evade accordingly so I dont go overboard and be weaker than I could be.
Since I am making an evade character, it would be nice to know the % to hit so I can adjust my evade accordingly so I dont go overboard and be weaker than I could be.
Line 307: Line 338:
Scan9
Scan9


== Broken Link ==
=== [SOLVED] Broken Link ===
 
This link at the top of the monster list ( [http://themanaworld.svn.sourceforge.net/viewcvs.cgi/themanaworld/server-data/trunk/db/mob_db.txt?view=markup]) returns:
This link at the top of the monster list ( [http://themanaworld.svn.sourceforge.net/viewcvs.cgi/themanaworld/server-data/trunk/db/mob_db.txt?view=markup]) returns:


Line 321: Line 351:


This needs to be fixed.
This needs to be fixed.
: Fixed in an earlier revision. ✎ [[User:Kess|Kess]]<sup>[[User talk:Kess|☽]]</sup> 10:32, 28 October 2008 (CET)

Revision as of 09:32, 28 October 2008

Autogenerating page

The main article is generated by a python script that creates the monster page in wikicode from the eAthena configuration files.

The program will write the complete Monster reference page to stdout (standard output). It is just to copy and paste that text. If you want to edit the introductory text or add images, please do so in the script below.

If you run dbtowiki without any arguments, the program will try to find the files item_db.txt and mob_db.txt in the current directory. To specify custom files, call dbtowiki <mob_db> <item_db>.

Python program dbtowiki

#!/usr/bin/python
#Licensed under GNU General Public License
import sys, os, datetime;

debug=0

imageurls = {
'AlizarinPlant': "[[Image:Plant-Alizarin.png]]",
'MauvePlant':    "[[Image:Plant-Mauve.png]]",
'Bat':           "[[Image:Bat.png]]",
'BlackScorpion': "[[Image:BlackScorpion.png]]",
'CaveSnake':     "[[Image:LampSnake.png]]",
'CobaltPlant':   "[[Image:Plant-Cobalt.png]]",
'EasterFluffy':  "[[Image:Fluffy.png]]",
'EvilMushroom':  "[[Image:Evilmushroom.png]]",
'FireGoblin':    "[[Image:FireGoblin.png]]",
'FireSkull':     "[[Image:FireSkull.png]]",
'Flower':        "[[Image:Sleepflower.png]]",
'Fluffy':        "[[Image:Fluffy.png]]",
'GambogePlant':  "[[Image:Plant-Gamboge.png]]",
'GiantMaggot':   "[[Image:GiantMaggot.png]]",
'GrassSnake':    "",
'GreenSlime':    "[[Image:GreenSlime.png]]",
'JackO':         "[[Image:JackO.png]]",
'LogHead':       "[[Image:Stumpy.png]]",
'Maggot':        "[[Image:Maggot.png]]",
'Mouboo':        "[[Image:Mouboo.png]]",
'MountainSnake': "[[Image:MountainSnake.png]]",
'Pinkie':        "[[Image:Violet.png]]",
'PoisonSkull':   "[[Image:PoisonSkull.png]]",
'RedScorpion':   "[[Image:RedScorpion.png]]",
'RedSlime':      "[[Image:RedSlime.png]]",
'RudolphSlime':  "[[Image:Rudolphslime.png]]",
'SantaSlime':    "[[Image:Santaslime.png]]",
'Scorpion':      "[[Image:Scorpion.png]]",
'SeaSlime':      "[[Image:Sea-slime.png]]",
'Silkworm':      "",
'Snake' :        "[[Image:Snake.png]]",
'Spider':        "[[Image:Spider.png]]",
'SpikyMushroom': "[[Image:Shroom.png]]",
'YellowSlime':   "[[Image:YellowSlime.png]]"
}

class whatever: pass

log = []

def saveint(string):
    a = 0
    try:
        a = int(string)
    except:
        a = 0
    return a
        

def parsemonsters(file):
    objects = []
    for line in file:
        s = line[0:line.find('//')].strip().replace('\t','')
        if s:
            values = s.split(',')
            if line[0] == '#':
                if debug:
                    log.append("FOUND COMMENT LINE: %s" % str(values))
                continue
            if (len(values) != 55):
                log.append("mob_db: Warning, monster-line with ID %s has %d values instead of 55" % (values[0], len(values)))
                if debug:
                    log.append("  line was %s" % str(values))
                while (len(values) < 54):
                    values.append('')
                while (len(values) > 54):
                    values.pop()
            o = whatever()
            o.id = saveint(values[0])
            o.label = values[1]
            o.name = values[2]
            o.lvl = saveint(values[3])
            o.hp = saveint(values[4])
            o.sp = saveint(values[5])
            o.experience = saveint(values[6])
            o.monsterpoints = saveint(values[7])
            o.range1 = saveint(values[8])
            o.attackmin = saveint(values[9])
            o.attackmax = saveint(values[10])
            o.defense = saveint(values[11])
            o.magicaldefense = saveint(values[12])
            o.strength = saveint(values[13])
            o.agility = saveint(values[14])
            o.vitality = saveint(values[15])
            o.intelligence = saveint(values[16])
            o.dexterity = saveint(values[17])
            o.luck = saveint(values[18])
            o.range2 = saveint(values[19])
            o.range3 = saveint(values[20])
            o.scale = saveint(values[21])
            o.race = saveint(values[22])
            o.element = saveint(values[23])
            o.mode = saveint(values[24])
            o.speed = saveint(values[25])
            o.attackdelay = saveint(values[26])
            o.attackmotion = saveint(values[27])
            o.defencemotion = saveint(values[28])
            o.drop = []
            for i in range(8):
                o.drop.append(whatever())
            o.drop[0].id = saveint(values[29])
            o.drop[0].per = saveint(values[30])
            o.drop[1].id = saveint(values[31])
            o.drop[1].per = saveint(values[32])
            o.drop[2].id = saveint(values[33])
            o.drop[2].per = saveint(values[34])
            o.drop[3].id = saveint(values[35])
            o.drop[3].per = saveint(values[36])
            o.drop[4].id = saveint(values[37])
            o.drop[4].per = saveint(values[38])
            o.drop[5].id = saveint(values[39])
            o.drop[5].per = saveint(values[40])
            o.drop[6].id = saveint(values[41])
            o.drop[6].per = saveint(values[42])
            o.drop[7].id = saveint(values[43])
            o.drop[7].per = saveint(values[44])
            o.item1 = saveint(values[45])
            o.item2 = saveint(values[46])
            o.mexp = saveint(values[47])
            o.expper = saveint(values[48])
            o.mvp = []
            for i in range(3):
                o.mvp.append(whatever())
            o.mvp[0].id = saveint(values[49])
            o.mvp[0].per = saveint(values[50])
            o.mvp[1].id = saveint(values[51])
            o.mvp[1].per = saveint(values[52])
            o.mvp[2].id = saveint(values[53])
            o.mvp[2].per = saveint(values[54])

            objects.append(o)

    return objects

def addimageurls(monsters):
    global imageurls
    for m in monsters:
        if imageurls.has_key(m.label):
            m.imgurl = imageurls[m.label]
        else:
            m.imgurl = ''
            if debug:
                log.append('Warning: Could not find imageurl for %s' % m.label)

def adddropnames(monsters,dropnames):
    for m in monsters:
        for d in m.drop:
            # Only add a dropname if it isn't "default" (id=0)
            if dropnames.has_key(d.id) and int(d.id):
                d.name = dropnames[d.id]
            else:
                d.name = ''
    


def parseitemnames(file):
    global log
    dic = {}
    for line in file:
        if line[0] == '#':
            continue
        s = line[0:line.find('//')].strip()
        if s:
            values = s.split(',')
            if (len(values) < 3):
                if len(values) > 0: log.append("mob_db: Warning, item-line with ID %s doesnt even have 3 values. Skipped." % (values[0], len(values)))
            else:
                id = int(values[0])
                dic[id] = values[2];
    return dic


def printlog():
    global log
    if len(log) > 0:
        sys.stdout.write('\n---------------------------------------\n')
    for line in log:
        sys.stdout.write(line+'\n')

def getdropstring(monster):
    i = 0
    output = ""
    monster.drop.sort(lambda x,y: y.per-x.per)
    for d in monster.drop:
        if d.name: 
            if (i != 0):
                output += '<br>'
            s = ""
            if d.per >= 1000:
                s = "%d" % (d.per/100)
            elif d.per >= 100:
                if (d.per % 100) != 0:
                    s = "%1.1f" % (d.per/100.0)
                else:
                    s = "%d" % (d.per/100)
            else:
                if (d.per % 1000) != 0:
                    s = "%.2f" % (d.per/100.0)
                else:
                    s = "%.1f" % (d.per/100.0)
            output += ("%s (%s%%)" % (d.name.replace('\t',''), s))
            i = i + 1
    return output

def printintroduction():
    sys.stdout.write('{{Category_playerinfo}}\n{{Status_green}}\n')
    sys.stdout.write('\'\'\'Page last generated on %s.\'\'\'\n' % datetime.date.today())
    sys.stdout.write('\n')
    sys.stdout.write('\'\'\'Warning:\'\'\' this reference might be out of date. The python program to autogenerate this page can be found on the discussion page. Also, this reference might not reflect whats currently in the game. [http://themanaworld.svn.sourceforge.net/viewvc/themanaworld/server-data/trunk/db/mob_db.txt?revision=HEAD&view=markup You can view the most up-to-date version here.]\n')
    sys.stdout.write('\n')
    sys.stdout.write('The monsters are sorted roughly by their fighting strength, calculated as: <code>health_points * (attack_min + attack_max)</code>.\n')
    sys.stdout.write('\n')

def printtableheader():
    sys.stdout.write('! style="background:#efdead;" | Image\n')
    sys.stdout.write('! style="background:#efdead;" | Name\n')
    sys.stdout.write('! style="background:#efdead;" | ID\n')
    sys.stdout.write('! style="background:#efdead;" | HP\n')
    sys.stdout.write('! style="background:#efdead;" | Def.\n')
    sys.stdout.write('! style="background:#efdead;" | Attack\n')
    sys.stdout.write('! style="background:#efdead;" | Exp.\n')
    sys.stdout.write('! style="background:#efdead;" | Mobp.\n')
    sys.stdout.write('! style="background:#efdead;" | Dropped items\n')
    sys.stdout.write('|-\n')

def printmonsters(monsters):
    printintroduction()
    sys.stdout.write('{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n')

    i = 0
    for m in monsters:
        if (i == 10):
            i = 0
        if (i == 0):
            printtableheader()

        sys.stdout.write('| align="center" | %s\n' % m.imgurl)
        sys.stdout.write('| %s\n' % m.name)
        sys.stdout.write('| align="center" | %d\n' % m.id)
        sys.stdout.write('| align="center" | %d\n' % m.hp)
        sys.stdout.write('| align="center" | %d%%\n' % m.defense)

        if m.attackmin < m.attackmax:
            sys.stdout.write('| align="center" | %d-%d\n' % (m.attackmin, m.attackmax))
        else:
            sys.stdout.write('| align="center" | %d\n' % m.attackmin)

        sys.stdout.write('| align="center" | %d\n' % m.experience)
        sys.stdout.write('| align="center" | %d\n' % m.monsterpoints)
        sys.stdout.write('| %s\n' % getdropstring(m))
        sys.stdout.write('|-\n')

        i = i + 1

    sys.stdout.write('|}\n')


#MAIN
try:
    if (len(sys.argv) == 1):
        mob_db = "mob_db.txt"
        item_db = "item_db.txt"
    elif (len(sys.argv) == 3):
        mob_db = sys.argv[1]
        item_db = sys.argv[2]
    else: 
        mob_db = ''
        item_db = ''
        sys.stdout.write("Wrong number of arguments\n")

    if (mob_db and item_db) :
        if (not os.path.isfile(mob_db)):
            sys.stdout.write("File does not exist: %s\n" % mob_db)
            mob_db = ''
        if (not os.path.isfile(item_db)):
            sys.stdout.write("File does not exist: %s\n" % item_db)
            item_db = ''
    
    if not (mob_db and item_db):
        sys.stdout.write("\nUSAGE:\n")
        sys.stdout.write("dbtowiki without any arguments will use item_db.txt and mob_db.txt in the current directory.\n")
        sys.stdout.write("to specify custom files, call: dbtowiki <mob_db> <item_db>\n")
        exit(-1);
    else:
        if debug:
            log.append("Monster-list [mob_db] = %s" % mob_db)
            log.append("Item-list [item_db] = %s" % item_db)
        f = open(mob_db)
        monsters = parsemonsters(f);
        f = open(item_db)
        itemnames = parseitemnames(f);

        addimageurls(monsters)
        adddropnames(monsters,itemnames)
        monsters.sort(lambda x, y: x.hp*(x.attackmin+x.attackmax) - y.hp*(y.attackmin+y.attackmax))

        printmonsters(monsters)

finally:
    printlog()

Discussion

Strength of Red Scorpion

Wasnt the RED scorpion supposed to be a miniboss? that HP seems kinda low for one :o --Bear

Cool, I was thinking about bosses too. I believe that Red Guy is like a boss. There are too many snakes and spiders, a DRAGON should be a good idea for a boss. But ONLY ONE DRAGON, please. --BrightCiro (Ciro Leonardo, the char)

Agressive/nonagressive monsters?

Is there an easy way to list this attribute? Hoogli 21:02, 18 April 2008 (CEST)

Another column for attributes (aggressive, cowardly, etc.) or name highlighting. — Jaxad0127 01:48, 19 April 2008 (CEST)

Accuracy/Evade

Wouldn't it effective to put down the accuracy and evade rates of enemies as well? It would help take the guessing game out and prevent further deaths of players via play-testing. (Esp. mountain snakes) Since I am making an evade character, it would be nice to know the % to hit so I can adjust my evade accordingly so I dont go overboard and be weaker than I could be.

Scan9

[SOLVED] Broken Link

This link at the top of the monster list ( [1]) returns:

" An Exception Has Occurred

The root "viewcvs.cgi" is unknown. If you believe the value is correct, then please double-check your configuration. HTTP Response Status

404 Repository not found "

This needs to be fixed.

Fixed in an earlier revision. ✎ Kess☽ 10:32, 28 October 2008 (CET)