''' hm_gameserver - hearthmod gameserver Copyright (C) 2016 Filip Pancik This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ''' import os import sys import shlex allflags = [] index = 0 def parse(src): global allflags global index entities = [] f = open(src, "r") ri = 0 lines = f.readlines(); for l in lines: ri = ri + 1 if(len(l) < 10): # new lines continue if(l[0] == "#"): # comment continue arr = shlex.split(l) f = '' att = '' custom = '' c = '' t = '' level2 = '' level3 = '' for a in arr: sub = a.split("=") if(len(sub) != 2): continue if(sub[0] == "name"): n = sub[1] elif(sub[0] == "card"): c = sub[1] elif(sub[0] == "tags"): t = sub[1] elif(sub[0] == "flags"): f = sub[1] elif(sub[0] == "attachment"): att = sub[1] elif(sub[0] == "custom"): custom = sub[1] elif(sub[0] == "level2"): level2 = sub[1] elif(sub[0] == "level3"): level3 = sub[1] else: print 'parsing %s failed' % sub[0] exit(1) if(len(c) == 0 or len(t) == 0): continue d = {} if(len(level2) > 0): d['level2'] = level2 if(len(level3) > 0): d['level3'] = level3 d['desc'] = n d['name'] = c if(len(f) > 0): flags = f.replace("\n", "") allflags.append([index, flags, d['name']]) d['rawflags'] = flags d['flags'] = '{{0, 0, 0, 0, 0, 0, 0, 0}}' if(len(att) > 0): d['attachment'] = att d['tags'] = {} if(len(t) > 0): properties = t.replace(",}", "}").split(",") for p in properties: a = p.split(":") idx = a[0].replace("{", "") tz = a[1].replace("\n", "").replace("}", "") d['tags'][idx] = tz if(len(custom) > 0): d['custom'] = custom print 'Active card: ' + d['desc'] + ' [' + d['name'] + ']' entities.append(d) index = index + 1 return entities def gen_js_cards(e): out = 'var cards = [\n' for d in e : for key in d: if(key == 'rawflags'): if((d[key].find("CARD_MINION") > -1 or d[key].find("CARD_SPELL") > -1) and\ d[key].find("CARD_UNCOLLECTIBLE") == -1 and d[key].find("CARD_HERO") == -1 and\ d[key].find("CARD_HEROPOWER") == -1 ): out += '["%s", "%s"], \n' % (d['name'], d['desc']) out += '];' f = open("cards.js", "w") f.write(out) f.close() def gen_js_hp(e): out = 'var cards_hp = [\n' for d in e : for key in d: if(key == 'rawflags'): if(d[key].find("CARD_HEROPOWER") > -1): out += '["%s", "%s"], \n' % (d['name'], d['desc']) out += '];' f = open("cards_hp.js", "w") f.write(out) f.close() def gen_js_hero(e): out = 'var cards_hero = [\n' for d in e : for key in d: if(key == 'rawflags'): if(d[key] == "(CARD_HERO)"): out += '["%s", "%s"], \n' % (d['name'], d['desc']) out += '];' f = open("cards_hero.js", "w") f.write(out) f.close() def gen(e): out = '#include \n' out += '#include \n' header = '#ifndef ENTGEN_H_\n#define ENTGEN_H_\n\n#define MAX_ENTITIES %d\n' % len(e) out += 'struct ent_s entities[MAX_ENTITIES] = {' index = 0 beasts = [] totems = [] totemic_call = [] hp = [] for d in e: flags = '' attch = '(void *)0, ' val = '{' level2 = "(void *)0, " level3 = "(void *)0, " for key in d: if(key == 'name'): start = '{ "%s", %d, %d, ' % (d[key], len(d[key]), len(d['tags'])) elif(key == 'desc'): desc = '"%s", ' % d[key] elif(key == 'level2'): level2 = '"%s", ' % d[key] elif(key == 'level3'): level3 = '"%s", ' % d[key] elif(key == 'flags'): flags = '%s, ' % d[key] elif(key == 'attachment'): attch = "\"%s\", " % d[key] elif(key == 'rawflags'): tt = 1 elif(key == 'custom'): tt = 1 elif(key == 'tags'): for k, v in d[key].items(): val += '{ %s, %s }, ' % (k, v) val += ' }} // %d \n, ' % index out += start + level2 + level3 + desc + flags + attch + val index = index + 1 out += '};' out += '\n\nvoid entities_init() {\n' for i in allflags: arr = i[1].split("|") for a in arr: cm = a.replace("(", "").replace(")", "") if(cm == "CARD_RACE_BEAST"): beasts.append(i[2]) if(cm == "CARD_RACE_TOTEM"): totems.append(i[2]) if(cm == "CARD_TOTEMIC_CALL_CHILD"): totemic_call.append(i[2]) if(cm == "CARD_HEROPOWER"): hp.append(i[2]) out += '\tflag(&entities[%s].flags, %s, FLAG_SET);\n' % (i[0], cm) out += '}\n' header += "#define MAX_BEASTS %d\n" % len(beasts) header += "#define MAX_TOTEMS %d\n" % len(totems) header += "#define MAX_TOTEMIC_CALL %d\n" % len(totemic_call) header += "#define MAX_HEROPOWER %d\n" % len(hp) out += "const char *race_beast[MAX_BEASTS] = {\n" for b in beasts: out += "\t\"%s\",\n" % b out += "};\n" out += "const char *race_totems[MAX_TOTEMS] = {\n" for b in totems: out += "\t\"%s\",\n" % b out += "};\n" out += "const char *totemic_call[MAX_TOTEMIC_CALL] = {\n" for b in totemic_call: out += "\t\"%s\",\n" % b out += "};\n" out += "const char *hp_list[MAX_HEROPOWER] = {\n" for b in hp: out += "\t\"%s\",\n" % b out += "};\n" f = open("../src/proto/ent.c", "w") f.write(out) f.close() header += "const char *totemic_call[MAX_TOTEMIC_CALL];\n" header += "const char *race_beast[MAX_BEASTS];\n" header += "const char *race_totems[MAX_TOTEMS];\n" header += "\n#endif" f = open("../src/include/proto/ent_gen.h", "w") f.write(header) f.close() if __name__ == '__main__': basic = parse("custom_mod") #classic = parse("cards/classic") #e = basic + classic e = basic gen(e) #gen_js_cards(e) #gen_js_hp(e) #gen_js_hero(e) print 'total entities: %d' % len(e)