import sys, glob, collections S="/tmp/claude-1000/-home-fabi-RE-Project-Sylpheed/b113cc12-4769-4ed8-ad66-c2b48f800773/scratchpad" sys.path.insert(0,S+"/wt-root/Syplheed-Reborn/tools/re-capture") exec(open(S+"/regn_decode.py").read().split("# ── the object")[0]) import unitgroup as U print("# `Generic` is the per-FILE header record, not a table") print("#") print("# One `Generic` per IDXD pak entry; its schema is set by the file's TYPE.") print("# Regenerate: see docs/re/structures/unit-datasheet-static.md") for pk in sorted(glob.glob("/work/sylph_extract/**/GP_MAIN_GAME_*.pak",recursive=True)): E=pak_entries(pk); items=E.items() if isinstance(E,dict) else E kinds=collections.Counter(); ids=set(); types=collections.Counter() nidxd=0; man=eff=0; ctl_ok=ctl_bad=0; one_per=True for h,b in items: if bytes(b[:4])!=b'IDXD': continue try: recs=U.parse(bytes(b)) except Exception: continue nidxd+=1 names=[r['squadron'] for r in recs] if names.count('Generic')>1: one_per=False man+= 'Maneuver' in names; eff+= 'Effect' in names for r in recs: if r['squadron']!='Generic': continue n=U.named(r) if 'HP' in n: kinds['unit datasheet']+=1; types[n.get('Type','')]+=1 elif set(n)=={'Count'}: kinds['message-file header']+=1 nmsg=sum(1 for x in names if x.startswith('Message_')) ctl_ok+= str(nmsg)==n['Count'].strip(); ctl_bad+= str(nmsg)!=n['Count'].strip() elif 'SideID' in n: kinds['character']+=1 elif 'EnumAsteroidGroup' in n: kinds['asteroid group']+=1 else: kinds['other (%d fields)'%len(n)]+=1 if 'ID' in n: ids.add(n['ID']) print() print("== %s (%d IDXD entries)" % (pk.split('/')[-1], nidxd)) for k,v in kinds.most_common(): print(" %-22s %4d" % (k,v)) print(" %-22s %4d" % ("TOTAL Generic", sum(kinds.values()))) print(" distinct Generic.ID %4d (= unit %d + character %d)" % (len(ids), kinds['unit datasheet'], kinds['character'])) print(" unit Generic.Type %s" % dict(types)) print(" entries w/ Maneuver %d w/ Effect %d" % (man,eff)) print(" CONTROL message-header Count == #Message_NNN siblings: %d ok / %d bad" % (ctl_ok,ctl_bad))