Commit Graph

32 Commits

Author SHA1 Message Date
gamer147
b7f67c8715 Fix MPEG movie startup cadence 2026-07-28 12:16:16 -04:00
gamer147
4b5b451df0 Add synchronized MPEG movie audio 2026-07-25 11:49:50 -04:00
gamer147
7bac5a9108 Implement mounted append AUTORUN boot 2026-07-24 13:03:43 -04:00
gamer147
bf9639cafc Add semantic append INIT inspection 2026-07-24 09:45:40 -04:00
gamer147
d449a2fe1e Document append bootstrap sequence 2026-07-24 09:33:55 -04:00
gamer147
3bcb028e76 Sanitize CP932 WAV metadata for Godot 2026-07-22 10:00:13 -04:00
gamer147
740e10c550 Harden movie playback lifecycle and diagnostics 2026-07-22 09:44:57 -04:00
gamer147
633e3b3085 Prevent failed combat movies from blocking 2026-07-21 20:46:10 -04:00
gamer147
80b5105032 Record live combat movie backend validation 2026-07-21 20:37:42 -04:00
gamer147
88f2f65bda Use universal packed resource resolution 2026-07-21 20:23:32 -04:00
gamer147
983c7d0bb0 Correct native packed resource addressing docs 2026-07-21 20:14:07 -04:00
gamer147
503cba5b4b Document BTL movie playback blockers 2026-07-21 19:44:53 -04:00
gamer147
44776a3c43 Decode color drag-pan cursor 2026-07-21 13:14:02 -04:00
gamer147
ff39c7f3f9 Render DEBUGMAP tiled field surfaces 2026-07-21 13:02:02 -04:00
gamer147
cffc75c64d Implement ROOM fades and character voices 2026-07-21 00:47:29 -04:00
gamer147
a82f25230c Implement modal startup movies 2026-07-20 20:23:15 -04:00
gamer147
e472c0c371 Fix packed raw menu sound effects 2026-07-20 18:39:38 -04:00
gamer147
7a9fe52a9d Document packed raw SFX addressing 2026-07-20 18:32:56 -04:00
gamer147
d4510242d6 Land SYSTEM4-rooted Godot boot 2026-07-20 18:13:32 -04:00
gamer147
e8c9e1c6a7 Fix movie compositor publication 2026-07-11 12:41:37 -04:00
gamer147
36960d4118 Implement SC0000 movie playback lifecycle 2026-07-11 12:27:51 -04:00
gamer147
0d3078de03 Migrate audio payloads onto asset VFS 2026-07-11 11:01:11 -04:00
gamer147
d6da43c818 Mount SYS4 append asset catalogs 2026-07-11 10:42:33 -04:00
gamer147
ec07c76721 Decode AGF textures through the asset store 2026-07-11 09:55:58 -04:00
gamer147
8e0f769a6e Implement base SYS4 asset store 2026-07-11 09:14:14 -04:00
gamer147
2232216832 Implement native-backed SC0000 SFX lifecycle 2026-07-11 02:15:17 -04:00
gamer147
0f39a55071 Document native asset VFS roadmap 2026-07-10 23:25:31 -04:00
gamer147
f94bca4ba5 Refresh retained presentation references 2026-07-10 21:56:57 -04:00
gamer147
f18f3a20e9 feat(a2b): audio — wire play-bgm/play-voice, fix BGM addressing
Wire audio end-to-end (OGG plays natively in Godot; no Frida, no decode):
- IHost.PlayBgm/PlayVoice + VM dispatch for play-bgm(0xbf)/play-voice(0xc4).
  Non-Godot hosts no-op them so --selftest + engine 8/8 stay byte-identical.
- GodotAdvHost resolves id->OGG; Main plays via two AudioStreamPlayer nodes
  (BGM looping; voice interrupt-on-new).

Key finding (by-ear, systematic-debugging): the two audio ops use DIFFERENT
addressing — the earlier "unified manifest" assumption was wrong for BGM.
- play-voice -> per-scene manifest files[base+id] (offset 0, same as textures).
  Confirmed by ear; upgraded med->HIGH.
- play-bgm  -> DIRECT LITERAL NAME BGM{id:03d}.OGG, NOT the manifest.
  Real game: play-bgm 5->BGM005, 8->BGM008 (manifest gave +1). Proven by
  play-bgm 0x23->BGM035 (real standalone track; BGM set skips 030-034) that the
  manifest mis-resolved to a graphics entry. Fix is BGM-only:
  ResourceMap.BgmPathById; voices/textures unchanged.

Also: Lily's silence root-caused as correct form-gating (G[0xa57/0xa58/0xa59]),
left unseeded by choice (no dummy state). Added diagnostic
`Age.Cli audio <SCENE.BIN> [0xADDR=VAL ...]`. Corrected opcodes.toml (play-bgm
direct-name, play-voice HIGH) + docs/memory (dropped the bogus unified-manifest
/ Frida-BGM006 claims).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 22:26:54 -04:00
gamer147
f0d75fa0dc feat(a2b): first-pass texture render — full-screen event-CG layer
Wire asset resolution into a live Godot render. VM executes set-texture ->
ResourceMap resolves (scene,resId) -> files[section_base+resId] across all
archives -> pre-converted BMP -> composite behind the dialogue. The full-screen
event-CG layer (EV052*) renders end-to-end from the executed bytecode.

- Age.Engine/Sys4/ResourceMap.cs: Resolve + BMP TexturePath; Paths: asset JSONs
- GodotAdvHost: create/set/draw-texture -> TextureRect in a _stage layer
- IHost.DrawTexture + VM dispatch extended with dst x/y (draw-texture args 7/8)
- project.godot 800x600; convert_agf.py all-archive + --scene batch
- engine 8/8, C# --selftest still byte-matches vm0 trace (VM behaviour unchanged)

Known limitations (next chunk = graphics geometry/blend subsystem):
- sprites + BG* via the CG-load subroutine get garbage dst/size — native ops
  stubbed (0x208 get-texture-size + sprite position/anim chain)
- AE* fades draw opaque/instant (no alpha); no chromakey
- slot model approximates the game's immediate-mode blit-onto-slot-0 canvas
- AGF pre-converted to BMP offline (runtime decoder deferred)
See docs/phase-a-slice-plan.md (A2b section).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 21:22:42 -04:00
gamer147
102fe1d021 feat(assets): solve asset resolution (SYS4INI per-scene section manifest)
resId -> files[section_base(scene) + resId]. SYS4INI's file list is
sectioned, one per scene (SCxxxx.BIN + its cross-archive asset manifest);
file_number is the index within the section. Unified for set-texture,
play-bgm, play-voice. Fully static/general -> no per-scene capture.

- tools/parse_sys4ini.py: SYS4INI (S4IC422, LZSS) -> build/asset-index.json
- tools/resolve_asset.py: sections + (scene,resId) resolver -> build/asset-sections.json
- validated: 97% structural, SC0000 17/17 vs Frida, 586/595 captured loads
- opcodes.toml: set-texture/create/draw-texture, play-bgm/voice enriched (frida-grounded)
- Frida tooling (capture_load_order all-archive, correlate_scope, ...) + vm0 --settex
- docs: asset-resolution-re (step2 SOLVED), global-memory-re (shelved), tools-reference

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 20:48:22 -04:00
gamer147
30d2734df4 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>
2026-07-06 16:36:17 -04:00