summaryrefslogtreecommitdiff
path: root/wiki/elegen.py
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/elegen.py')
-rwxr-xr-xwiki/elegen.py360
1 files changed, 360 insertions, 0 deletions
diff --git a/wiki/elegen.py b/wiki/elegen.py
new file mode 100755
index 0000000..cb81edb
--- /dev/null
+++ b/wiki/elegen.py
@@ -0,0 +1,360 @@
+#! /usr/bin/env python3
+# -*- coding: utf8 -*-
+#
+# Copyright (C) 2010-2011 Evol Online
+# Copyright (C) 2018 TMW-2
+# Author: Andrei Karas (4144)
+# Author: Jesusalva
+
+import datetime
+
+wikib=open("EleMonsters.html", "w")
+wikib.write('<html><head><meta charset=utf8 /><title>EleGen File</title></head><body>')
+
+def printSeparator():
+ print("--------------------------------------------------------------------------------")
+
+def showHeader():
+ print("TMW2 Ele Generator")
+ print("This stuff analyzes and sorts mobs elementals, races and walkmasks.")
+ ##print "Evol client data validator."
+ print("Run at: " + datetime.datetime.now().isoformat())
+ ##print "https://gitlab.com/evol/evol-tools/blob/master/testxml/testxml.py"
+ printSeparator()
+
+def showFooter():
+ #pass
+ #printSeparator()
+ print("Done.")
+
+
+
+Mobs0=[]
+Mobs1=[]
+Mobs2=[]
+Mobs3=[]
+Mobs4=[]
+Mobs5=[]
+Mobs6=[]
+Mobs7=[]
+Mobs8=[]
+Mobs9=[]
+MobsA=[]
+
+SysDrops=[]
+
+def fwalk(wmask):
+ if wmask == 'WATER':
+ return '<font color=#00f>%s</font>' % (wmask)
+ elif wmask == 'AIR':
+ return '<font color=#090>%s</font>' % (wmask)
+ elif wmask == 'WALL':
+ return '<font color=#f00>%s</font>' % (wmask)
+ elif wmask == 'NORMAL' or wmask == 'DEFAULT':
+ return wmask
+ else:
+ print("Invalid walk mask: "+wmask)
+ exit(1)
+
+def WhatRace(rac):
+ rc=rac.race
+ if rc == 0:
+ return "Formless"
+ elif rc == 1:
+ return "Undead"
+ elif rc == 2:
+ return "Brute"
+ elif rc == 3:
+ return "Plant"
+ elif rc == 4:
+ return "Insect"
+ elif rc == 5:
+ return "Fish"
+ elif rc == 6:
+ return "-"
+ elif rc == 7:
+ return "SemiHuman"
+ elif rc == 8:
+ return "Angel"
+ elif rc == 9:
+ return "Dragon"
+ elif rc == 10:
+ return "Player"
+ elif rc == 11:
+ return "Boss"
+ elif rc == 12:
+ return "NonBoss"
+ elif rc == 14:
+ return "NonSemiHuman"
+ elif rc == 15:
+ return "NonPlayer"
+ elif rc == 16:
+ return "SemiPlayer"
+ elif rc == 17:
+ return "NonSemiPlayer"
+ else:
+ print("ERROR, INVALID RACE ID: %d (ID: %s)" % (rc, rac.id))
+ exit(1)
+
+class Mob:
+ def __init__(self):
+ # Basic
+ self.id="0"
+ #self.aegis="UnknownMonster" # SpriteName is not used anywhere, we are using its ID
+ self.name="Unknown Monster Name"
+ self.view="1"
+
+ # Defensive
+ self.mobpt="0" # Mob Points “Level”
+ self.hp="0"
+ self.xp="0"
+ self.jp="0"
+ self.st=""
+
+ # Offensive
+ self.atk="[0, 0]"
+ self.range="0"
+ self.move="0"
+ self.delay="0"
+ self.drops=[]
+
+ # New
+ self.race=-1
+ self.elem=-1
+ self.elel=-1
+ self.walk="NORMAL"
+
+def MobAlloc(ab):
+ try:
+ maab=int(ab.elem)
+ except:
+ maab=9901
+
+ if maab == 0:
+ Mobs0.append(ab)
+ elif maab == 1:
+ Mobs1.append(ab)
+ elif maab == 2:
+ Mobs2.append(ab)
+ elif maab == 3:
+ Mobs3.append(ab)
+ elif maab == 4:
+ Mobs4.append(ab)
+ elif maab == 5:
+ Mobs5.append(ab)
+ elif maab == 6:
+ Mobs6.append(ab)
+ elif maab == 7:
+ Mobs7.append(ab)
+ elif maab == 8:
+ Mobs8.append(ab)
+ elif maab == 9:
+ Mobs9.append(ab)
+ else:
+ MobsA.append(ab)
+
+def testMobs():
+ print("Generating Elem-Mob Wiki...")
+ src=open("../../server-data/db/re/mob_db.conf", "r")
+ wikib.write("<h1 id=#x>EleGen Monster Database</h1>\n")
+ start=False
+ dropper=False
+ x=Mob() # Only for pyflakes2
+
+ for a in src:
+ if a == "{\n":
+ if start:
+ MobAlloc(x)
+ else:
+ start=True
+ x=Mob()
+
+ if " Id:" in a:
+ x.id=stp(a)
+ if x.id == "ID":
+ continue
+
+ if " Name:" in a:
+ x.name=stp(a)
+ elif " Hp:" in a:
+ x.hp=stp(a)
+ elif " Lv:" in a:
+ x.mobpt=stp(a)
+ elif " Exp:" in a:
+ x.xp=stp(a)
+ elif " JExp:" in a:
+ x.jp=stp(a)
+ elif " Attack:" in a:
+ x.atk=stp(a)
+ elif " AttackRange:" in a:
+ x.range=stp(a)
+ elif " MoveSpeed:" in a:
+ x.move=stp(a)
+ elif " ViewRange:" in a:
+ x.view=stp(a)
+ elif " AttackDelay:" in a:
+ x.delay=stp(a)
+ elif " Looter: true" in a:
+ x.st+="Lot,"
+ elif " Assist: true" in a:
+ x.st+="Ass,"
+ elif " Aggressive: true" in a:
+ x.st+="Agr,"
+ elif " WalkMask:" in a:
+ x.walk=stp(a)
+ elif " Element:" in a:
+ tmp=stp(a)
+ tmp2=tmp.split(',')
+ try:
+ x.elem=int(tmp2[0])
+ x.elei=(tmp2[1])
+ except:
+ print("Invalid Element for mob %s: %s" % (x.id, tmp))
+ exit(1)
+ elif " Race:" in a:
+ try:
+ x.race=int(stp(a))
+ except:
+ print("Invalid Race for mob %s: %s" % (x.id, a))
+ exit(1)
+ elif 'Drops: ' in a:
+ dropper=True
+ elif dropper and '}' in a:
+ dropper=False
+ elif dropper:
+ x.drops.append(stp(a).split(": "))
+ # Write last entry
+ MobAlloc(x)
+
+ writeMob()
+
+ wikib.write('\n\n|Mode|Desc|\n|----|----|\n')
+ wikib.write('|Lot|Looter|\n')
+ wikib.write('|Ass|Assist|\n')
+ wikib.write('|Agr|Aggressive|\n')
+
+ src.close()
+
+def stp(x):
+ return x.replace('\n', '').replace('|', '').replace('(int, defaults to ', '').replace(')', '').replace('basic experience', '').replace('"','').replace(" ","").replace("\t","").replace('(string', '').replace('Name: ','').replace('Element: ','').replace('Race: ','').replace('AttackDelay: ', '').replace('WalkMask: ','').replace('MoveSpeed: ', '').replace('AttackRange: ', '').replace('ViewRange: ','').replace('Attack: ','').replace('ViewRange: ','').replace('Hp: ','').replace('Id: ','').replace('Lv: ','').replace('view range','').replace('attack range','').replace('move speed','').replace('health','').replace('(int','').replace('attack delay','atk.').replace('(','').replace(')','').replace('WALK_','')
+
+
+def MonsterWrite(tbl):
+ # TODO: Check _mobs files to determine the usual monster density (a misc info to aid adding proper drop specs)
+ wikib.write("<table border=1>\n")
+ wikib.write("<tr><th>ID</th><th>Name</th><th>HP</th><th>Atk</th><th>Race</th><th>Walk Type</th><th>Misc Info</th><th>Rewards</th><th>Drops</th></tr>\n")
+ #buff+="WalkType: %s\n" % ('error')
+ for i in tbl:
+ if i.id == 'ID':
+ continue
+ wikib.write('<tr><td><a name="' + i.id + '"></a>' +
+ i.id +"</td><td>"+
+ i.name +"</td><td>HP: "+
+ i.hp +"</td><td>Atk: "+
+ i.atk +"</td><td>"+
+ WhatRace(i) +"</td><td>"+
+ fwalk(i.walk) +"</td><td>"+
+ mbdt('misc', mb_rdmisc(i)) +"</td><td>"+
+ mbdt('Exp\'s', mb_rdrw(i)) +"</td><td>"+
+ mbdt('drops', mb_rddrop(i)) +"</td></tr>\n"
+ )
+ wikib.write("</table>\n")
+ wikib.write("\n<a href=#x>(↑) Return to top</a><br/><br/>\n\n")
+
+def writeMob():
+ wikib.write("<ul>\
+<li><a href=#0>N</a></li>\n\
+<li><a href=#1>Wt</a></li>\n\
+<li><a href=#2>E</a></li>\n\
+<li><a href=#3>F</a></li>\n\
+<li><a href=#4>Wd</a></li>\n\
+<li><a href=#5>P</a></li>\n\
+<li><a href=#6>H</a></li>\n\
+<li><a href=#7>D</a></li>\n\
+<li><a href=#8>G</a></li>\n\
+<li><a href=#9>U</a></li>\n\
+<li><a href=#Nan>-</a></li>\n\
+</ul> ")
+
+ wikib.write("<h1 id=0>Neutral</h1>\n\n")
+ MonsterWrite(Mobs0)
+ wikib.write("<h1 id=1>Water</h1>\n\n")
+ MonsterWrite(Mobs1)
+ wikib.write("<h1 id=2>Earth</h1>\n\n")
+ MonsterWrite(Mobs2)
+ wikib.write("<h1 id=3>Fire</h1>\n\n")
+ MonsterWrite(Mobs3)
+ wikib.write("<h1 id=4>Wind</h1>\n\n")
+ MonsterWrite(Mobs4)
+ wikib.write("<h1 id=5>Poison</h1>\n\n")
+ MonsterWrite(Mobs5)
+ wikib.write("<h1 id=6>Holy</h1>\n\n")
+ MonsterWrite(Mobs6)
+ wikib.write("<h1 id=7>Dark</h1>\n\n")
+ MonsterWrite(Mobs7)
+ wikib.write("<h1 id=8>Ghost</h1>\n\n")
+ MonsterWrite(Mobs8)
+ wikib.write("<h1 id=9>Undead</h1>\n\n")
+ MonsterWrite(Mobs8)
+
+ wikib.write("<h1 id=NaN>Error</h1>\n\n")
+ MonsterWrite(MobsA)
+
+
+def mbdt(summary, content):
+ return "<details>\
+<summary>"+summary+"</summary>\
+<pre>"+content+"</pre></details>"
+
+def mb_rdmisc(mb):
+ buff=""
+ buff+="Modes: %s\n" % (mb.st)
+ if "agr" in mb.st.lower():
+ buff+="View Range: %s\n" % (mb.view)
+ buff+="Attack Range: %s\n" % (mb.range)
+ buff+="AtkDelay: %s ms\n" % (mb.delay)
+ buff+="Move speed: %s ms\n" % (mb.move)
+ buff+="Element Level: %d\n" % (mb.elel)
+ return buff
+
+def mb_rdrw(mb):
+ buff=""
+ buff+="MobPoints: %s\n" % (mb.mobpt)
+ buff+="%s\n" % (mb.xp)
+ buff+="%s\n" % (mb.jp)
+ return buff
+
+def mb_rddrop(mb):
+ buff=""
+ for ax in mb.drops:
+ # Ignore disabled drops
+ if ax[0].startswith("//"):
+ continue
+
+ # Write drop
+ try:
+ buff+=ax[0]+': ' + str(int(ax[1])/100.0) + ' %\n'
+ except IndexError:
+ print("Fatal: invalid %s mob with %s drops" % (mb.name, str(ax)))
+ exit(1)
+ except:
+ print("[Warning] %s incorrect drop: %s" % (mb.name, str(ax)))
+ buff+=ax[0]+': ' + ax[1] + ' ppm\n'
+
+ # Save to SysDrops
+ SysDrops.append([ax[0], ax[1], mb.name])
+
+ return buff
+
+
+
+showHeader()
+
+testMobs()
+
+wikib.write('</body></html>')
+wikib.close()
+#print(str(SysDrops))
+
+showFooter()
+exit(0)