From The Mana World
(Accuracy/Evade)
Line 299: Line 299:


:Another column for attributes (aggressive, cowardly, etc.) or name highlighting. &mdash; [[User:Jaxad0127|<span style="color: #160196">Jaxad</span>]][[User Talk:Jaxad0127|<span style="color: #5B038F">0127</span>]] 01:48, 19 April 2008 (CEST)
:Another column for attributes (aggressive, cowardly, etc.) or name highlighting. &mdash; [[User:Jaxad0127|<span style="color: #160196">Jaxad</span>]][[User Talk:Jaxad0127|<span style="color: #5B038F">0127</span>]] 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

Revision as of 16:03, 18 August 2008

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)

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>

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. Thefox 23:52, 22 January 2006 (CET)

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

debug=0

imageurls = {
'Maggot': "[[Image:Maggot.png]]",
'Scorpion': "[[Image:Scorpion.png]]",
'RedScorpion': "[[Image:RedScorpion.png]]",
'GreenSlime': "[[Image:GreenSlime.png]]",
'GiantMaggot': "[[Image:GiantMaggot.png]]",
'YellowSlime': "[[Image:YellowSlime.png]]",
'RedSlime': "[[Image:RedSlime.png]]",
'BlackScorpion': "[[Image:BlackScorpion.png]]",
'Snake' : "[[Image:Snake.png]]",
'FireGoblin': "[[Image:FireGoblin.png]]",
'Spider': "[[Image:Spider.png]]",
'EvilMushroom': "[[Image:Evilmushroom.png]]",
'SleepFlower': "[[Image:Sleepflower.png]]",
'SantaSlime': "[[Image:Santaslime.png]]",
'RudolphSlime': "[[Image:Rudolphslime.png]]",
'Bat': "[[Image:Bat.png]]",
'Violet': "[[Image:Violet.png]]",
'Shroom': "[[Image:Shroom.png]]",
'Fluffy': "[[Image:Fluffy.png]]",
'LampSnake': "[[Image:LampSnake.png]]",
'FireSkull': "[[Image:FireSkull.png]]",
'PoisonSkull': "[[Image:PoisonSkull.png]]",
#'Stumpy': ""
}

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.name = values[1]
            o.jname = values[2]
            o.lvl = saveint(values[3])
            o.hp = saveint(values[4])
            o.sp = saveint(values[5])
            o.exp = saveint(values[6])
            o.expj = saveint(values[7])
            o.range1 = saveint(values[8])
            o.atk1 = saveint(values[9])
            o.atk2 = saveint(values[10])
            o.defense = saveint(values[11])
            o.mdefense = 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.adelay = saveint(values[26])
            o.amotion = saveint(values[27])
            o.dmotion = 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.name):
            m.imgurl = imageurls[m.name]
        else:
            m.imgurl = ''
            if debug:
                log.append('Warning: Could not find imageurl for %s' % m.name)

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('_',' '), s))
            i = i + 1
    return output

def printmonsters(monsters):
    sys.stdout.write('{| border="1" cellspacing="0" cellpadding="5" width="100%" align="center"\n')
    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;" | Attack\n')
    sys.stdout.write('! style="background:#efdead;" | Exp.\n')
    sys.stdout.write('! style="background:#efdead;" | Job Exp.\n')
    sys.stdout.write('! style="background:#efdead;" | Dropped Items\n')
    for m in monsters:
        sys.stdout.write('|-\n')
        sys.stdout.write('| align="center" | %s\n' % m.imgurl)
        sys.stdout.write('| %s\n' % m.jname.replace('_',' ') )
        sys.stdout.write('| align="center" | %d\n' % m.id)
        sys.stdout.write('| align="center" | %d\n' % m.hp)
        if m.atk1 < m.atk2:
            sys.stdout.write('| align="center" | %d-%d\n' % (m.atk1, m.atk2))
        elif m.atk1 > m.atk2:
            sys.stdout.write('| align="center" | %d-%d\n' % (m.atk2, m.atk1))
        else:
            sys.stdout.write('| align="center" | %d\n' % m.atk1)
            
        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('|}')
            

    

#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:
        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.atk1+x.atk2) - y.hp*(y.atk1+y.atk2) )

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

finally:
    printlog()

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