#!/usr/bin/python3 # This consolidates client XMLs import os, shutil, traceback, subprocess, time MYSELF="clientdata/" EVOLVED="../pre-renewal/client-data/" MOUBOO="../client-data/" REVOLT="../evol/client-data/" # items.xml and their sprites in graphics/ # Remember to regenerate weapons.xml after merging os.chdir("..") item_db=[] paths=[] def fix_id(l, offset): if "id=" in l or " from=" in l or " to=" in l: tmp=l.split("\"") try: if (int(tmp[1]) > 0): tmp[1]=str(int(tmp[1]) + offset) else: # Negative IDs are special (10,000 => 200 per game) tmp[1]=str(int(tmp[1]) - int(offset//50)) except: traceback.print_exc() l="\"".join(tmp) return l ## This was foked from transverse() def subxml(WHERE, e, sub): global MYSELF, paths pt="NO PATH FOUND" if os.path.exists("%s/%s" % (WHERE, e)): pt = "%s/%s" % (WHERE, e) TARG = "%s/%s/%s" % (MYSELF, sub, e) elif os.path.exists("%s/graphics/sprites/%s" % (WHERE, e)): pt = "%s/graphics/sprites/%s" % (WHERE, e) TARG = "%s/graphics/sprites/%s/%s" % (MYSELF, sub, e) elif os.path.exists("%s/graphics/%s" % (WHERE, e)): pt = "%s/graphics/%s" % (WHERE, e) TARG = "%s/graphics/%s/%s" % (MYSELF, sub, e) else: print("\033[1mNO path: %s\033[0m" % e) if pt != "NO PATH FOUND": bf=[] with open(pt, 'r') as j: for k in j: h=k.split("\"") for g, n in enumerate(h): if n.split("|")[0].endswith(".png"): paths.append(n.split("|")[0]) h[g]="%s/%s" % (sub, n) ## XML might need to fall in a loop elif n.split("|")[0].endswith(".xml"): h[g]="%s/%s" % (sub, n) subxml(WHERE, n.split("|")[0], sub) bf.append("\"".join(h)) ## Unfortunately, we must save 'bf' here so it is safely done os.makedirs(os.path.abspath("/".join(TARG.split("/")[:-1])), exist_ok=True) with open("%s" % (TARG), "w") as j: for k in bf: j.write(k) return ## This is to find misc files and copy them over with new path ## TODO: sfx makes it confuse (has "quotes" but is enclosed in >arrows<) ## ALSO: Dyed items e.g. "equipment/chest/cottonshirt.png|W" ## ALSO: Sprites may have "quotes" but be enclosed in >arrows< def transverse(l, WHERE, sub): global paths if "" in l: tmpi=l.split("sprite") ori=0 #elif "sound" in l: else: tmpi=l.split("\"") ori=1 ## Process it for i, e in enumerate(tmpi): raw=str(e) if ">" in e: e=raw[raw.index('>')+1:] e=e.replace(">", "").replace("<", "") e=e.split("|")[0] # Remove dye if e.endswith("/"): e=e[:-1] if e.endswith(".png") or e.endswith(".ogg"): paths.append(e) if ">" in raw: tmpi[i]="%s>%s/%s" % (raw[:raw.index('>')], sub, raw[raw.index('>')+1:]) else: tmpi[i]="%s/%s" % (sub, raw) elif e.endswith(".xml"): #paths.append(e) if ">" in raw: tmpi[i]="%s>%s/%s" % (raw[:raw.index('>')], sub, raw[raw.index('>')+1:]) else: tmpi[i]="%s/%s" % (sub, raw) ## We must also open the XML and extract paths from it subxml(WHERE, e, sub) ## Update the line if ori == 0: l="sprite".join(tmpi) else: l="\"".join(tmpi) # Send the line with the prefix return l def unify(YESELF, sub): global paths for f in paths: i="/".join(f.split("/")[:-1]) ## Raw Copy try: os.makedirs(os.path.abspath("%s/%s/%s" % (MYSELF, sub, i)), exist_ok=True) shutil.copy2("%s/%s" % (YESELF, f), "%s/%s/%s" % (MYSELF, sub, f)) continue except FileNotFoundError: pass except: traceback.print_exc() ## Raw2 Copy try: os.makedirs(os.path.abspath("%s/graphics/%s/%s" % (MYSELF, sub, i)), exist_ok=True) shutil.copy2("%s/graphics/%s" % (YESELF, f), "%s/graphics/%s/%s" % (MYSELF, sub, f)) continue except FileNotFoundError: pass except: traceback.print_exc() ## Item Icon Copy try: os.makedirs(os.path.abspath("%s/graphics/items/%s/%s" % (MYSELF, sub, i)), exist_ok=True) shutil.copy2("%s/graphics/items/%s" % (YESELF, f), "%s/graphics/items/%s/%s" % (MYSELF, sub, f)) continue except FileNotFoundError: pass except: traceback.print_exc() ## Spritesheet Copy try: os.makedirs(os.path.abspath("%s/graphics/sprites/%s/%s" % (MYSELF, sub, i)), exist_ok=True) shutil.copy2("%s/graphics/sprites/%s" % (YESELF, f), "%s/graphics/sprites/%s/%s" % (MYSELF, sub, f)) continue except FileNotFoundError: print("\033[1mFailed to copy: %s\033[0m" % f) pass except: traceback.print_exc() paths=[] return ################################################################################# ## Moubootaur Legends is a raw copy with open("%s/items.xml" % MOUBOO, "r") as f: for l in f: ## FIXME: RACESPRITE #l=l.replace(" ", "\t") ## Add headers if "Authors:" in l: item_db.append("\n") item_db.append("\n") item_db.append("\n") ## Follow includes instead of saving them if "" in j: save=True continue if "" in j: break j=transverse(j, MOUBOO, 'ml') item_db.append(j) continue ## Save the line l=transverse(l, MOUBOO, 'ml') item_db.append(l) while not "" in item_db[-1]: item_db=item_db[:-1] item_db=item_db[:-1] print("\033[32;1mMoubootaur Legends OK\033[0m") ## Handle copy pastes unify(MOUBOO, 'ml') ################################################################################ ## Legacy/Evolved has an offset of 10k with open("%s/items.xml" % EVOLVED, "r") as f: saving=False for l in f: ## FIXME: RACESPRITE #l=l.replace(" ", "\t") ## Fix ID offset l=fix_id(l, 10000) ## Follow includes instead of saving them if "" in j: save=True continue if "" in j: break j=fix_id(j, 10000) j=transverse(j, EVOLVED, 'tmw') item_db.append(j) continue ## Save the line if not saving: if "" in l: saving=True continue l=transverse(l, EVOLVED, 'tmw') item_db.append(l) while not "" in item_db[-1]: item_db=item_db[:-1] item_db=item_db[:-1] print("\033[32;1mLegacy/Evolved OK\033[0m") ## Handle copy pastes unify(EVOLVED, 'tmw') ################################################################################ ## rEvolt has an offset of 20k with open("%s/items.xml" % REVOLT, "r") as f: saving=False for l in f: ## FIXME: RACESPRITE #l=l.replace(" ", "\t") ## Fix ID offset l=fix_id(l, 20000) ## Follow includes instead of saving them if "" in j: save=True continue if "" in j: break j=fix_id(j, 20000) j=transverse(j, REVOLT, 're') item_db.append(j) continue ## Save the line if not saving: if "" in l: saving=True continue l=transverse(l, REVOLT, 're') item_db.append(l) while not "" in item_db[-1]: item_db=item_db[:-1] #item_db=item_db[:-1] print("\033[32;1mrEvolt OK\033[0m") ## Handle copy pastes unify(REVOLT, 're') ################################################################################ ## Save the final item database with open(MYSELF+"items.xml", "w") as f: for l in item_db: f.write(l) print("\033[33;1mSaved! Databases merged!\033[0m") ## Clean empty dirs time.sleep(1) print("Now deleting empty folders:") time.sleep(4) os.chdir(MYSELF) subprocess.call("""find . -type d -empty -not -iwholename "./.*" -print -delete""", shell=True)