from pathlib import Path import ast, csv, io, hashlib, json, re ROOT=Path(__file__).resolve().parents[3] OUT=ROOT/'HEROLL_OUTGAME_DEV_v1.0' OLD=ROOT/'HEROLL_OUTGAME_2.0.1' CORE=ROOT/'HEROLL_APK_REVERSE_ONLY/01_core_reverse_archive' SOURCE=CORE/'resource-tables/extracted/csv' LOC=CORE/'unity/assets/bin/Data/65724e71f83a175409c383f97a5a8ed9' def sha(p): return hashlib.sha256(p.read_bytes()).hexdigest() def snapshot(): return {p.relative_to(OLD).as_posix():dict(size=p.stat().st_size,mtime_ns=p.stat().st_mtime_ns,sha256=sha(p)) for p in OLD.rglob('*') if p.is_file()} def constants(path): result={} for node in ast.parse(path.read_text(encoding='utf-8')).body: if isinstance(node,ast.Assign) and len(node.targets)==1 and isinstance(node.targets[0],ast.Name): try: result[node.targets[0].id]=ast.literal_eval(node.value) except (ValueError,TypeError): pass return result def write(p,s): assert p.resolve().is_relative_to(OUT.resolve()),p p.parent.mkdir(parents=True,exist_ok=True); p.write_text(s,encoding='utf-8') def savecsv(p,rows,fields=None): assert p.resolve().is_relative_to(OUT.resolve()),p p.parent.mkdir(parents=True,exist_ok=True) if fields is None: fields=list(rows[0]) if rows else ['说明'] with p.open('w',encoding='utf-8-sig',newline='') as f: w=csv.DictWriter(f,fieldnames=fields);w.writeheader();w.writerows(rows) def md(headers,rows): def esc(x): return str(x).replace('|','\\|').replace('\r','').replace('\n','
').replace('