gamer147
d38511665a
Match native asset fallback behavior
2026-08-15 09:49:04 -04:00
gamer147
9afdb84765
Remove unverified binary tools from tracking
2026-08-03 13:06:45 -04:00
gamer147
32c5d1e901
Match AGE RIFF decode boundaries
2026-07-29 18:35:21 -04:00
gamer147
fdc7bb2bbc
Fix MPEG movie startup cadence
2026-07-28 12:16:16 -04:00
gamer147
843b282cc4
Add synchronized MPEG movie audio
2026-07-25 11:49:50 -04:00
gamer147
8f0c40f43f
Implement mounted append AUTORUN boot
2026-07-24 13:03:43 -04:00
gamer147
801a4fbfe0
Add semantic append INIT inspection
2026-07-24 09:45:40 -04:00
gamer147
e23825a18b
Document append bootstrap sequence
2026-07-24 09:33:55 -04:00
gamer147
fb84bc3fa9
Sanitize CP932 WAV metadata for Godot
2026-07-22 10:00:13 -04:00
gamer147
4f5137a98f
Harden movie playback lifecycle and diagnostics
2026-07-22 09:44:57 -04:00
gamer147
f53056818d
Prevent failed combat movies from blocking
2026-07-21 20:46:10 -04:00
gamer147
6b58dd156e
Record live combat movie backend validation
2026-07-21 20:37:42 -04:00
gamer147
1a2ea008c6
Use universal packed resource resolution
2026-07-21 20:23:32 -04:00
gamer147
cca7d3d82e
Correct native packed resource addressing docs
2026-07-21 20:14:07 -04:00
gamer147
e1294307cd
Document BTL movie playback blockers
2026-07-21 19:44:53 -04:00
gamer147
b0971f2047
Decode color drag-pan cursor
2026-07-21 13:14:02 -04:00
gamer147
44bbf5b6b4
Render DEBUGMAP tiled field surfaces
2026-07-21 13:02:02 -04:00
gamer147
f6479209ea
Implement ROOM fades and character voices
2026-07-21 00:47:29 -04:00
gamer147
df17747f63
Implement modal startup movies
2026-07-20 20:23:15 -04:00
gamer147
ec185c9561
Fix packed raw menu sound effects
2026-07-20 18:39:38 -04:00
gamer147
9582731f6f
Document packed raw SFX addressing
2026-07-20 18:32:56 -04:00
gamer147
097473fe16
Land SYSTEM4-rooted Godot boot
2026-07-20 18:13:32 -04:00
gamer147
78174df03a
Fix movie compositor publication
2026-07-11 12:41:37 -04:00
gamer147
024accd8d1
Implement SC0000 movie playback lifecycle
2026-07-11 12:27:51 -04:00
gamer147
233f791c10
Migrate audio payloads onto asset VFS
2026-07-11 11:01:11 -04:00
gamer147
e0ca7936e2
Mount SYS4 append asset catalogs
2026-07-11 10:42:33 -04:00
gamer147
a1f6d0ab51
Decode AGF textures through the asset store
2026-07-11 09:55:58 -04:00
gamer147
b6c3b1660d
Implement base SYS4 asset store
2026-07-11 09:14:14 -04:00
gamer147
99ce351041
Implement native-backed SC0000 SFX lifecycle
2026-07-11 02:15:17 -04:00
gamer147
9d5a1c2b09
Document native asset VFS roadmap
2026-07-10 23:25:31 -04:00
gamer147
8bee45f483
Refresh retained presentation references
2026-07-10 21:56:57 -04:00
gamer147
ee70beb93d
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
10f6656c2d
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
a61c0c9abd
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
b92e815850
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