From The Mana World
(Broken Link)
(Should we use |page=Monsters or not?)
(25 intermediate revisions by 11 users not shown)
Line 1: Line 1:
=== Strength of Red Scorpion ===
Since this is an redirect page now, we could use <nowiki>{{I18n|page=Monsters}}</nowiki> to link directly to the correct English page. By doing it that way would reduce a useless click. However this would break the link to the Italian language version. Any thoughts about this? [[User:EJlol|EJ]] ([[User talk:EJlol|talk]]) 07:17, 20 June 2020 (UTC)
 
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)
 
=== 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>
#!/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()
</pre>
 
== Agressive/nonagressive monsters? ==
 
Is there an easy way to list this attribute? [[User:Hoogli|Hoogli]] 21:02, 18 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
 
== 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:
 
"
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.

Revision as of 07:17, 20 June 2020

Since this is an redirect page now, we could use {{I18n|page=Monsters}} to link directly to the correct English page. By doing it that way would reduce a useless click. However this would break the link to the Italian language version. Any thoughts about this? EJ (talk) 07:17, 20 June 2020 (UTC)