feat(a2b): asset-RE tooling + findings; render blocked on asset resolution
- tools/convert_agf.py (AGF->BMP stills), tools/frida/ (capture harness + README; Frida 17.15.3) - docs/asset-resolution-re.md: foundational RE steering doc (resId->file; graphics+audio; not machine-verifiable -> Frida ground truth + human oracle). RE plan: parse SYS4INI, crack resId->name, backend render (A2b plan Tasks 3-5), audio, movies. - Finding: SC0000 bg = slot-0 slideshow (res 0x23 first); resolution opaque (CGINIT not a name map, SYS4INI S4IC needs RE, Frida file-I/O noisy/memory-mapped, opening mixes MPEG movies). - slice plan updated; texture ops already engine-driven (Task 1, prior commit). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
33
tools/convert_agf.py
Normal file
33
tools/convert_agf.py
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Convert named AGF files (in extracted/DATA2 or DATA5) to BMP via AGF2BMP2AGF.exe,
|
||||
into build/textures/. Run: py -3.11 -X utf8 tools/convert_agf.py EV001AA.AGF ..."""
|
||||
import os, sys, shutil, subprocess
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import paths
|
||||
|
||||
EXE = paths.EXTRACTED / "DATA1" / "AGF2BMP2AGF.exe" # tool lives in extracted/DATA1
|
||||
SRC_DIRS = [paths.EXTRACTED / "DATA2", paths.EXTRACTED / "DATA5"]
|
||||
OUT = paths.BUILD / "textures"
|
||||
|
||||
def find(name):
|
||||
for d in SRC_DIRS:
|
||||
p = d / name
|
||||
if p.exists():
|
||||
return p
|
||||
return None
|
||||
|
||||
def main(argv):
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
for name in argv:
|
||||
src = find(name)
|
||||
if not src:
|
||||
print(f"NOT FOUND: {name}"); continue
|
||||
tmp = OUT / name
|
||||
shutil.copy(src, tmp)
|
||||
subprocess.run([str(EXE), name], cwd=str(OUT), check=True)
|
||||
tmp.unlink(missing_ok=True) # drop the copied .AGF, keep the .BMP
|
||||
print(f"converted {name} -> {OUT / (os.path.splitext(name)[0] + '.BMP')}")
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
Reference in New Issue
Block a user