From c354aebbfe71a3d16c180afd8d3d8a3de7b86172 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 11:44:59 -0700 Subject: [PATCH 01/40] Enable optional instruction-debug audit builds and record widescreen checks --- CMakeLists.txt | 4 ++- docs/widescreen-trigger-audit.json | 51 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/widescreen-trigger-audit.json diff --git a/CMakeLists.txt b/CMakeLists.txt index d3079f8..4b53eb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ endif() set(SNESRECOMP_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/snesrecomp" CACHE PATH "snesrecomp checkout") set(RECOMP_UI_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/recomp-ui" CACHE PATH "recomp-ui checkout") set(SNESRECOMP_ENABLE_MODS ON CACHE BOOL "Shared mod package runtime" FORCE) +option(SNESRECOMP_REVERSE_DEBUG "Instruction-level debugger instrumentation" OFF) include(${SNESRECOMP_ROOT}/runner/runner.cmake) add_executable(MegaManX3SNESRecomp @@ -22,7 +23,8 @@ target_include_directories(MegaManX3SNESRecomp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/recomp ${SNESRECOMP_RUNNER_INCLUDE_DIRS}) target_compile_definitions(MegaManX3SNESRecomp PRIVATE SMW_DISABLE_LM=1 SYSTEM_VOLUME_MIXER_AVAILABLE=0 - SNESRECOMP_TRACE=$ SNESRECOMP_REVERSE_DEBUG=0) + SNESRECOMP_TRACE=$ + SNESRECOMP_REVERSE_DEBUG=$) set_property(SOURCE src/main.c APPEND PROPERTY COMPILE_DEFINITIONS SNESRECOMP_BUILD_VERSION="${SNESRECOMP_BUILD_VERSION}") if(NOT MSVC) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json new file mode 100644 index 0000000..2371244 --- /dev/null +++ b/docs/widescreen-trigger-audit.json @@ -0,0 +1,51 @@ +{ + "date": "2026-10-26", + "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", + "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", + "release_framework_pin": "f68aa0fe8edae75cbc7d4b9473c71687b45ce702", + "framework_provenance": "Checkout tree identical to release pin", + "rom_sha256": "65b03268afac296330e8ff8d60dd0825879e13eded658b37713c034a3bd074f1d7", + "presentation": [ + 342, + 224 + ], + "diagnostic_change": "Expose the existing instruction debugger behind an explicit default-OFF CMake option, allowing the native original full-graphics checkpoint loader to run before breakpoint-qualified checkpoint selection. Normal builds remain uninstrumented.", + "qualified_checks": [ + { + "sequence": "All eight main Maverick boss rooms", + "result": "Original full room loader, live AI, real projectile damage after health reduction, native weapon progression and postfight states observed. Stages 1-2: x3-late/sequence-results.json; stages 3-8: x3-cleanse-rdb/sequence-results.json." + }, + { + "sequence": "Bit and Byte in Neon Tiger stage", + "result": "Prior weapon prerequisites supplied, encounter outcome bits untouched. Dialogue completed, AI/damage/departure observed, native 1FD8 bits 01 and 04 respectively set by the game, and the right exit opened/advanced the camera." + }, + { + "sequence": "Powered factory elevator", + "result": "Volt Catfish prerequisite supplied before native room setup. Riding/jumping on the elevator and native up input carried X from Y about 1696 to 887 without editing lift state." + } + ], + "partial_checks": [ + { + "sequence": "Lab 1 Godkarmachine branch", + "result": "Boss defeat and native fortress counter 1FAF increment observed; other branch/endings not qualified." + } + ], + "unverified": [ + "Bit ring capture and Byte magnet/grab recovery", + "Factory Vile fight and self-destruct escape", + "Lab 2/Mosquitus/Vile branches, Dr. Doppler and final Sigma/ending", + "Complete terrain, sublevel, checkpoint, death/retry and alternate-route coverage", + "Independent music/SFX qualification", + "Owner visual acceptance" + ], + "assists": [ + "Disposable profiles; dummy audio/video during unattended work", + "Stage/checkpoint teleport using original full graphics loader; intro and traversal prerequisites bypassed explicitly", + "Player health refill, position assists, reduced boss health followed by real projectile damage", + "Bit/Byte eligibility supplied by prior Maverick weapon flags; their own result flags never written" + ], + "findings": "No confirmed widescreen defect in the qualified routes. Failed or incomplete late-stage setups are not evidence of widescreen defects. Invalid final-Sigma/off-viewport and post-death preparations were excluded from owner review.", + "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", + "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", + "tracking": "beads-8wg.19.4" +} From f4a6f77a1fef37fe99058779c3a5784d497e07eb Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 11:45:45 -0700 Subject: [PATCH 02/40] Normalize audit record line endings --- docs/widescreen-trigger-audit.json | 102 ++++++++++++++--------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 2371244..5c29f49 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -1,51 +1,51 @@ -{ - "date": "2026-10-26", - "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", - "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", - "release_framework_pin": "f68aa0fe8edae75cbc7d4b9473c71687b45ce702", - "framework_provenance": "Checkout tree identical to release pin", - "rom_sha256": "65b03268afac296330e8ff8d60dd0825879e13eded658b37713c034a3bd074f1d7", - "presentation": [ - 342, - 224 - ], - "diagnostic_change": "Expose the existing instruction debugger behind an explicit default-OFF CMake option, allowing the native original full-graphics checkpoint loader to run before breakpoint-qualified checkpoint selection. Normal builds remain uninstrumented.", - "qualified_checks": [ - { - "sequence": "All eight main Maverick boss rooms", - "result": "Original full room loader, live AI, real projectile damage after health reduction, native weapon progression and postfight states observed. Stages 1-2: x3-late/sequence-results.json; stages 3-8: x3-cleanse-rdb/sequence-results.json." - }, - { - "sequence": "Bit and Byte in Neon Tiger stage", - "result": "Prior weapon prerequisites supplied, encounter outcome bits untouched. Dialogue completed, AI/damage/departure observed, native 1FD8 bits 01 and 04 respectively set by the game, and the right exit opened/advanced the camera." - }, - { - "sequence": "Powered factory elevator", - "result": "Volt Catfish prerequisite supplied before native room setup. Riding/jumping on the elevator and native up input carried X from Y about 1696 to 887 without editing lift state." - } - ], - "partial_checks": [ - { - "sequence": "Lab 1 Godkarmachine branch", - "result": "Boss defeat and native fortress counter 1FAF increment observed; other branch/endings not qualified." - } - ], - "unverified": [ - "Bit ring capture and Byte magnet/grab recovery", - "Factory Vile fight and self-destruct escape", - "Lab 2/Mosquitus/Vile branches, Dr. Doppler and final Sigma/ending", - "Complete terrain, sublevel, checkpoint, death/retry and alternate-route coverage", - "Independent music/SFX qualification", - "Owner visual acceptance" - ], - "assists": [ - "Disposable profiles; dummy audio/video during unattended work", - "Stage/checkpoint teleport using original full graphics loader; intro and traversal prerequisites bypassed explicitly", - "Player health refill, position assists, reduced boss health followed by real projectile damage", - "Bit/Byte eligibility supplied by prior Maverick weapon flags; their own result flags never written" - ], - "findings": "No confirmed widescreen defect in the qualified routes. Failed or incomplete late-stage setups are not evidence of widescreen defects. Invalid final-Sigma/off-viewport and post-death preparations were excluded from owner review.", - "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", - "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", - "tracking": "beads-8wg.19.4" -} +{ + "date": "2026-10-26", + "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", + "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", + "release_framework_pin": "f68aa0fe8edae75cbc7d4b9473c71687b45ce702", + "framework_provenance": "Checkout tree identical to release pin", + "rom_sha256": "65b03268afac296330e8ff8d60dd0825879e13eded658b37713c034a3bd074f1d7", + "presentation": [ + 342, + 224 + ], + "diagnostic_change": "Expose the existing instruction debugger behind an explicit default-OFF CMake option, allowing the native original full-graphics checkpoint loader to run before breakpoint-qualified checkpoint selection. Normal builds remain uninstrumented.", + "qualified_checks": [ + { + "sequence": "All eight main Maverick boss rooms", + "result": "Original full room loader, live AI, real projectile damage after health reduction, native weapon progression and postfight states observed. Stages 1-2: x3-late/sequence-results.json; stages 3-8: x3-cleanse-rdb/sequence-results.json." + }, + { + "sequence": "Bit and Byte in Neon Tiger stage", + "result": "Prior weapon prerequisites supplied, encounter outcome bits untouched. Dialogue completed, AI/damage/departure observed, native 1FD8 bits 01 and 04 respectively set by the game, and the right exit opened/advanced the camera." + }, + { + "sequence": "Powered factory elevator", + "result": "Volt Catfish prerequisite supplied before native room setup. Riding/jumping on the elevator and native up input carried X from Y about 1696 to 887 without editing lift state." + } + ], + "partial_checks": [ + { + "sequence": "Lab 1 Godkarmachine branch", + "result": "Boss defeat and native fortress counter 1FAF increment observed; other branch/endings not qualified." + } + ], + "unverified": [ + "Bit ring capture and Byte magnet/grab recovery", + "Factory Vile fight and self-destruct escape", + "Lab 2/Mosquitus/Vile branches, Dr. Doppler and final Sigma/ending", + "Complete terrain, sublevel, checkpoint, death/retry and alternate-route coverage", + "Independent music/SFX qualification", + "Owner visual acceptance" + ], + "assists": [ + "Disposable profiles; dummy audio/video during unattended work", + "Stage/checkpoint teleport using original full graphics loader; intro and traversal prerequisites bypassed explicitly", + "Player health refill, position assists, reduced boss health followed by real projectile damage", + "Bit/Byte eligibility supplied by prior Maverick weapon flags; their own result flags never written" + ], + "findings": "No confirmed widescreen defect in the qualified routes. Failed or incomplete late-stage setups are not evidence of widescreen defects. Invalid final-Sigma/off-viewport and post-death preparations were excluded from owner review.", + "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", + "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", + "tracking": "beads-8wg.19.4" +} From 5a44b5800d92d5a80caf3c475d66edaeb0742ede Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 14:00:07 -0700 Subject: [PATCH 03/40] Preserve native parallax controller lifetime and repair widescreen HUD --- docs/widescreen-trigger-audit.json | 57 +++++- snesrecomp | 2 +- src/x3_rtl.c | 294 ++++++----------------------- 3 files changed, 110 insertions(+), 243 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 5c29f49..824e300 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -47,5 +47,60 @@ "findings": "No confirmed widescreen defect in the qualified routes. Failed or incomplete late-stage setups are not evidence of widescreen defects. Invalid final-Sigma/off-viewport and post-death preparations were excluded from owner review.", "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", - "tracking": "beads-8wg.19.4" + "tracking": "beads-8wg.19.4", + "visual_followup": { + "framework_head": "0ecd2fe07a31119c00371bc1ddbdd0f12d0647af", + "capture_fix": "Forward-slash paths avoid invalid debug-response JSON; verified PNG plus OAM/VRAM/RAM/state diagnostics. UI now shows preview/errors and captures the loaded segment.", + "remaining": [ + "Serges double-door and complete spawn art need human confirmation.", + "Factory outside-left BG2 layout is empty; flat gutter remains unresolved.", + "Bit/Byte floor placement needs natural-approach comparison; old teleport states do not establish a widescreen defect.", + "Final Sigma/endings and independent music/SFX qualification remain unverified." + ], + "owner_notes_preserved": true, + "scope": "Previous passes accepted individually; this is not full campaign/ending certification.", + "owner_feedback": { + "x3-vile": { + "title": "3 \u00b7 X3 \u2014 powered factory lift \u2192 Vile / escape", + "checks": { + "lift": "Pass", + "forms": "Pass", + "escape": "Pass" + }, + "notes": "background does all sounds of weird things. wrong color, wrong movement. a mediu menergy flickersi n and out of place where it doesn't belong .", + "updated_utc": "2026-10-26T19:05:38.383085+00:00" + }, + "x3-bit": { + "title": "Optional \u00b7 X3 \u2014 Bit dialogue / ring / exit", + "checks": { + "dialogue": "Pass", + "capture": "Pass", + "exit": "Deferred" + }, + "notes": "bit shows up below the ground.", + "updated_utc": "2026-10-26T19:07:19.289269+00:00" + }, + "x3-byte": { + "title": "Optional \u00b7 X3 \u2014 Byte magnet / grab / exit", + "checks": { + "dialogue": "Unreviewed", + "grab": "Unreviewed", + "exit": "Unreviewed" + }, + "notes": "byte also clips through the ground.", + "updated_utc": "2026-10-26T19:07:57.618486+00:00" + } + }, + "changes": [ + "Resident type04 parallax controllers retain their native cull lifetime. Previous-room controller no longer switches factory BG2 mode10 to02.", + "Generated object-window helpers and interpreter entry hook apply the same class guard, including resumes inside the helper.", + "HUD signature and exact margin source repairs shared with X2." + ], + "validated": [ + "Factory: native342 and pure interpreter684 preserve BG2 mode10 after60 right+jump and600 up frames.", + "Fixed BG2 tilemap matches original-ROM Snes9x reference byte-for-byte; main view excluding relocated HUD matches native control.", + "Original-checkpoint Bit/Byte states replace suspect near-door teleports; no claimed floor fix.", + "Current-build save/load and repeat rendering/RAM checked in private evidence." + ] + } } diff --git a/snesrecomp b/snesrecomp index f68aa0f..0ecd2fe 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit f68aa0fe8edae75cbc7d4b9473c71687b45ce702 +Subproject commit 0ecd2fe07a31119c00371bc1ddbdd0f12d0647af diff --git a/src/x3_rtl.c b/src/x3_rtl.c index a90a964..4cf719f 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -29,6 +29,7 @@ #include "snes/ppu.h" #include "snes/saveload.h" #include "snes/ws_shadow.h" +#include "snes/mmx23_background.h" #include "types.h" #include "widescreen.h" @@ -210,8 +211,7 @@ void RunOneFrameOfGame(void) { * sides move by the same margin and stay symmetric at any width. */ enum { - kX3HudSlotFirst = 0, /* HP / weapon / boss all live in 0..23 */ - kX3HudSlotCount = 24, /* slot 24 onward is actors */ + kX3HudSlotFirst = 0, /* HP / weapon occupy 0..15 */ kX3HudBandHeight = 96, /* measured HUD Y extent is 0..80 */ kX3HudLeftEnd = 64, /* HP X=8 and weapon X=24 are below this */ kX3HudRightStart = 192, /* boss X=232 is at/above this */ @@ -256,6 +256,18 @@ static int x3_ws_hud_present(void) { return frame_slots >= 4u; } +static bool x3_ws_boss_hud_present(void) { + unsigned matches=0; + for (unsigned slot=16; slot<23; ++slot) { + unsigned w=slot*2; + unsigned x=g_ppu->oam[w]&255, y=g_ppu->oam[w]>>8; + unsigned attr=g_ppu->oam[w+1]>>8; + unsigned xhi=(g_ppu->highOam[slot>>2]>>((slot&3)*2))&1; + matches += x==232 && !xhi && attr==0x34 && y=4; +} + /* Call once per frame from the host's frame-prep, after g_ws_extra is known. */ void X3ConfigureWsHud(void) { extern bool g_ws_active; @@ -263,251 +275,19 @@ void X3ConfigureWsHud(void) { /* X3's HUD is OAM-only; BG3 is gameplay dialogue and must stay centered. */ PpuSetWidescreenHudSplit(g_ppu, 0, 0, 0); if (!g_ws_active || !x3_ws_hud_present()) { + PpuSetWsHudOamShiftRange2(g_ppu, 0, 0); PpuSetWsHudOamShiftRange(g_ppu, 0, 0); /* off = authentic placement */ return; } PpuSetWsHudOamBand(g_ppu, kX3HudBandHeight, kX3HudLeftEnd, kX3HudRightStart); - PpuSetWsHudOamShiftRange(g_ppu, kX3HudSlotFirst, - kX3HudSlotCount); -} - -/* ── 16:9 BG margins: exact fill from X3's level structures ────────────── - * - * X3 retained X2's two-layer column streamer. The corresponding X3 routines - * are $00:B91B (composer), $00:BC60 (address/layout derivation), and - * $00:BC9E/$00:BCD5 (BG1/BG2 source setup). Their external data layout is - * unchanged: - * - * layout screenDefs metatile ptr world anchor - * BG1 $7E:E800 $7E:2800 24-bit [$09C5] $1E5D / $1E60 - * BG2 $7E:EC00 $7E:A600 24-bit [$09C8] $1E9D / $1EA0 - * - * Live validation on save slot 0 reproduced all sampled native VRAM entries - * on both layers before this provider was enabled. As in X2, the native view - * is never modified; only gutter lookups are replaced, and only after a - * per-frame native-view self-check proves that the scene uses this layout. - */ -typedef struct X3BgStream { - uint16_t layoutBase; - uint16_t screenDefs; - uint16_t mtPtrAddr; - uint16_t worldXAddr; - uint16_t worldYAddr; - uint8_t bgsc; - uint16_t mapBaseWord; -} X3BgStream; - -static const X3BgStream kX3BgStreams[2] = { - {0xE800, 0x2800, 0x09C5, 0x1E5D, 0x1E60, 0x51, 0x5000}, - {0xEC00, 0xA600, 0x09C8, 0x1E9D, 0x1EA0, 0x59, 0x5800}, -}; - -static uint16_t x3_wram16(uint32_t addr) { - return (uint16_t)(g_ram[addr] | (g_ram[addr + 1] << 8)); -} - -static uint16_t x3_bg_world_tile(const X3BgStream *s, uint32_t px, - uint32_t py) { - uint32_t li = (((py >> 8) & 0x1F) << 5) | ((px >> 8) & 0x1F); - uint8_t sid = g_ram[s->layoutBase + li]; - uint16_t ba = (uint16_t)(s->screenDefs + sid * 512u + - ((py >> 4) & 0xF) * 0x20u + - ((px >> 4) & 0xF) * 2u); - uint16_t block = - (uint16_t)(g_ram[ba] | (g_ram[(uint16_t)(ba + 1)] << 8)); - uint16_t mt_addr = x3_wram16(s->mtPtrAddr); - uint8_t mt_bank = g_ram[s->mtPtrAddr + 2]; - /* Match the guest's fixed-bank, 16-bit pointer wrap at $00:B9C0. */ - uint16_t a = - (uint16_t)(mt_addr + block * 8u + (((py >> 3) & 1u) << 2) + - (((px >> 3) & 1u) << 1)); - return (uint16_t)(cart_read(g_snes->cart, mt_bank, a) | - (cart_read(g_snes->cart, mt_bank, - (uint16_t)(a + 1)) << 8)); -} - -static uint16_t x3_bg_vram_word(const X3BgStream *s, uint32_t px, - uint32_t py) { - uint32_t tx = px >> 3, ty = py >> 3; - return (uint16_t)(s->mapBaseWord + ((tx >> 5) & 1u) * 0x400u + - (ty & 0x1F) * 0x20u + (tx & 0x1F)); -} - -static bool x3_bg_stream_valid(const X3BgStream *s, int32_t wx, int32_t wy) { - if (wx < 0 || wy < 0) - return false; - /* Boot/menu frames can already have the gameplay BG mode/map bases while - * the stream-source cluster is still zero. Reject before cart_read so an - * uninitialized pointer cannot create a false off-rails diagnostic. */ - if (x3_wram16(s->mtPtrAddr) < 0x8000) - return false; - int miss = 0, modal = 0; - uint16_t modal_tile = 0; - uint16_t got_v[12]; - for (int i = 0; i < 12; i++) { - uint32_t px = (uint32_t)wx + 10u + (uint32_t)i * 20u; - uint32_t py = (uint32_t)wy + 12u + (uint32_t)(i % 6) * 36u; - uint16_t want = x3_bg_world_tile(s, px, py); - uint16_t got = g_ppu->vram[x3_bg_vram_word(s, px, py) & 0x7FFF]; - got_v[i] = got; - if (want != got) - miss++; - } - if (miss > 1) - return false; - /* A near-uniform sample cannot prove that a layer is level data. It may - * instead be a dynamic object layer, which authentic map wrap preserves. */ - for (int i = 0; i < 12; i++) { - int same = 0; - for (int j = 0; j < 12; j++) - same += (got_v[j] == got_v[i]); - if (same > modal) { - modal = same; - modal_tile = got_v[i]; - } - } - if (modal <= 9) - return true; - - /* - * A sparse level screen can legitimately make the quick sample almost - * uniform. This happens throughout the slot-8 vertical fall: BG1 is - * mostly transparent until the terrain scrolls up, so the old diversity - * gate disabled exact gutters for roughly 35 frames and exposed wrapped - * stale rows at the right edge. - * - * Preserve the object-layer safeguard by looking for positive evidence, - * rather than merely accepting a uniform match. Scan the native view for - * six source tiles that differ from the modal native entry and require - * each one to reproduce VRAM. A repurposed object layer whose level - * source is blank finds no proof; one whose live objects disagree with - * that source fails the comparisons. A genuine sparse level map proves - * itself as soon as its off-air terrain entries agree. - */ - int proof = 0, proof_miss = 0; - for (uint32_t y = 4; y < 224; y += 8) { - for (uint32_t x = 4; x < 256; x += 8) { - uint32_t px = (uint32_t)wx + x; - uint32_t py = (uint32_t)wy + y; - uint16_t want = x3_bg_world_tile(s, px, py); - if (want == modal_tile) - continue; - uint16_t got = - g_ppu->vram[x3_bg_vram_word(s, px, py) & 0x7FFF]; - if (want == got) { - if (++proof >= 6) - return true; - } else if (++proof_miss > 1) { - return false; - } - } - } - return false; + PpuSetWsHudOamShiftRange(g_ppu, kX3HudSlotFirst, 16); + PpuSetWsHudOamShiftRange2(g_ppu, 16, x3_ws_boss_hud_present() ? 7 : 0); } +/* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { - static int s_enabled = -1, s_debug = -1; - static bool s_was_active; - if (s_enabled < 0) { - const char *e = getenv("SNESRECOMP_WS_BG_MARGINS"); - s_enabled = (e && e[0] == '0') ? 0 : 1; - e = getenv("SNESRECOMP_WS_BG_MARGINS_DEBUG"); - s_debug = (e && e[0] && e[0] != '0') ? 1 : 0; - } - - bool scene_ok = s_enabled && g_ws_active && g_ppu && - (g_ppu->bgmode & 0x37) == 1 && - g_ppu->bgXsc[0] == kX3BgStreams[0].bgsc && - g_ppu->bgXsc[1] == kX3BgStreams[1].bgsc; - if (s_debug) { - static unsigned s_calls; - if ((s_calls++ % 120) == 0) { - fprintf(stderr, - "[x3_ws_bg] call=%u en=%d ws=%d bgmode=%u bgXsc=%02X/%02X " - "scene_ok=%d extra=%d\n", - s_calls, s_enabled, (int)g_ws_active, - g_ppu ? g_ppu->bgmode : 0xFF, - g_ppu ? g_ppu->bgXsc[0] : 0xFF, - g_ppu ? g_ppu->bgXsc[1] : 0xFF, - (int)scene_ok, g_ws_extra); - } - } - - bool ok[2] = {false, false}; - int32_t wxp[2] = {0, 0}, wyp[2] = {0, 0}; - bool any = false; - if (scene_ok) { - for (int l = 0; l < 2; l++) { - const X3BgStream *s = &kX3BgStreams[l]; - uint16_t h = (uint16_t)(g_ppu->hScroll[l] & 0x3FF); - uint16_t v = (uint16_t)(g_ppu->vScroll[l] & 0x3FF); - int32_t wx = (int32_t)x3_wram16(s->worldXAddr); - int32_t wy = (int32_t)x3_wram16(s->worldYAddr); - int32_t dh = (int32_t)((uint16_t)(h - wx) & 0x3FF); - int32_t dv = (int32_t)((uint16_t)(v - wy) & 0x3FF); - if (dh >= 512) dh -= 1024; - if (dv >= 512) dv -= 1024; - wx += dh; - wy += dv; - if (!x3_bg_stream_valid(s, wx, wy)) { - if (s_debug) { - static unsigned s_fail[2]; - if ((s_fail[l]++ % 120) == 0) - fprintf(stderr, - "[x3_ws_bg] L%d validation fail #%u wx=%d wy=%d " - "h=%u v=%u anchor=(%u,%u)\n", - l, s_fail[l], wx, wy, h, v, - x3_wram16(s->worldXAddr), - x3_wram16(s->worldYAddr)); - } - continue; - } - ok[l] = true; - any = true; - wxp[l] = wx; - wyp[l] = wy; - WsShadowSetWorld(l, (uint32_t)wx, (uint32_t)wy); - WsShadowSetBlankTile(l, -1); - WsShadowSetRespectGameWrites(l, 60); - } - } - - if (!any) { - if (s_was_active) - WsShadowReset(); - s_was_active = false; - WsShadowFrame(g_ppu); - return; - } - s_was_active = true; - WsShadowFrame(g_ppu); - - int margin = (g_ws_extra + 7) & ~7; - for (int l = 0; l < 2; l++) { - if (!ok[l]) - continue; - const X3BgStream *s = &kX3BgStreams[l]; - const int32_t tx_rng[2][2] = { - {(wxp[l] - margin) >> 3, (wxp[l] - 1) >> 3}, - {(wxp[l] + 256) >> 3, (wxp[l] + 255 + margin) >> 3}, - }; - int32_t ty0 = (wyp[l] - 256) >> 3; - int32_t ty1 = (wyp[l] + 491) >> 3; - if (ty0 < 0) - ty0 = 0; - for (int r = 0; r < 2; r++) { - for (int32_t tx = tx_rng[r][0]; tx <= tx_rng[r][1]; tx++) { - if (tx < 0) - continue; - for (int32_t ty = ty0; ty <= ty1; ty++) { - WsShadowForceTile(l, (uint32_t)tx, (uint32_t)ty, - x3_bg_world_tile(s, (uint32_t)tx << 3, - (uint32_t)ty << 3)); - } - } - } - } + Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); } /* X3's shared object-window family is the X2 implementation moved to bank @@ -525,12 +305,21 @@ static int x3_ws_spawn_margin(void) { return g_ws_extra + 32; } +/* Resident type $04 owns parallax/scroll configuration, not enemy AI. + * Its native cull window also owns its lifetime: keeping a previous room's + * controller alive lets its Y-only crossing overwrite the current room. + * In the factory lift this changes BG2 mode $10 to $02 at $03:F854. */ +static bool x3_ws_native_controller(uint16_t dp) { + return dp >= 0x1818 && dp < 0x1e18 && + ((dp - 0x1818) & 0x1f) == 0 && g_ram[dp + 0x0a] == 0x04; +} + uint16 X3WsObjWinAdd(uint16 base) { - return (uint16)(base + x3_ws_spawn_margin()); + return (uint16)(base + (x3_ws_native_controller(g_cpu.D) ? 0 : x3_ws_spawn_margin())); } uint16 X3WsObjWinLimit(uint16 base) { - return (uint16)(base + 2 * x3_ws_spawn_margin()); + return (uint16)(base + 2 * (x3_ws_native_controller(g_cpu.D) ? 0 : x3_ws_spawn_margin())); } /* $00:DE3A streams scripted level records, not just ordinary actors. Widening @@ -848,6 +637,23 @@ static void x3_scan_ws_rom_imms(void) { } } +/* Match the generated helpers when the shared activation/cull routine is + * interpreted. Only its two X immediates change; the original guest body, + * stack, flags, Y checks and record deletion still execute normally. */ +static void x3_ws_activation_hook(CpuState *cpu, uint32_t pc24) { + (void)pc24; + if (!s_x3_ws_rom_valid) return; + unsigned margin = x3_ws_native_controller(cpu->D) ? 0 : x3_ws_spawn_margin(); + for (int i = 0; i < s_x3_ws_rom_imm_count; ++i) { + X3WsRomImm *site = &s_x3_ws_rom_imms[i]; + size_t offset = (size_t)(site->operand - g_snes->cart->rom); + if (offset < 0x1558a || offset >= 0x15611) continue; + uint16_t value = (uint16_t)(site->base + site->margin_scale * margin); + site->operand[0] = (uint8_t)value; + site->operand[1] = (uint8_t)(value >> 8); + } +} + static void x3_patch_ws_interp_obj_windows(void) { if (!s_x3_ws_rom_scanned) x3_scan_ws_rom_imms(); @@ -861,6 +667,12 @@ static void x3_patch_ws_interp_obj_windows(void) { site->operand[1] = (uint8_t)(value >> 8); } } + if (s_x3_ws_rom_valid) { + interp_bridge_add_pre_opcode_hook(0x02d58a, x3_ws_activation_hook); + /* Also restore the correct operand context for a snapshot resumed inside + * the helper; such a resume need not cross its entry hook again. */ + x3_ws_activation_hook(&g_cpu, 0x02d58a); + } x3_patch_ws_interp_spawn_stream(); } From cd8ae92991fee24d6fab4c303203dc35cbc058da Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 14:40:53 -0700 Subject: [PATCH 04/40] Correct before-room QA handoff and preserve second-round feedback --- docs/widescreen-trigger-audit.json | 61 +++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 824e300..dad3443 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -31,12 +31,9 @@ } ], "unverified": [ - "Bit ring capture and Byte magnet/grab recovery", - "Factory Vile fight and self-destruct escape", - "Lab 2/Mosquitus/Vile branches, Dr. Doppler and final Sigma/ending", - "Complete terrain, sublevel, checkpoint, death/retry and alternate-route coverage", - "Independent music/SFX qualification", - "Owner visual acceptance" + "Byte magnet/grab recovery and Bit/Byte floor correctness", + "Serges belongs to the X2 audit; X3 final Sigma/endings and remaining branches", + "Complete stage/sublevel/exit and independent music/SFX qualification" ], "assists": [ "Disposable profiles; dummy audio/video during unattended work", @@ -44,7 +41,7 @@ "Player health refill, position assists, reduced boss health followed by real projectile damage", "Bit/Byte eligibility supplied by prior Maverick weapon flags; their own result flags never written" ], - "findings": "No confirmed widescreen defect in the qualified routes. Failed or incomplete late-stage setups are not evidence of widescreen defects. Invalid final-Sigma/off-viewport and post-death preparations were excluded from owner review.", + "findings": "Factory parallax lifetime and actor HUD classification defects repaired; owner background and pickup checks now Pass. Bit/Byte floor clipping remains unresolved. Their rejected checkpoint handoff was replaced by actual near-door saved files with native room entry proved after reload.", "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", "tracking": "beads-8wg.19.4", @@ -52,10 +49,10 @@ "framework_head": "0ecd2fe07a31119c00371bc1ddbdd0f12d0647af", "capture_fix": "Forward-slash paths avoid invalid debug-response JSON; verified PNG plus OAM/VRAM/RAM/state diagnostics. UI now shows preview/errors and captures the loaded segment.", "remaining": [ - "Serges double-door and complete spawn art need human confirmation.", - "Factory outside-left BG2 layout is empty; flat gutter remains unresolved.", - "Bit/Byte floor placement needs natural-approach comparison; old teleport states do not establish a widescreen defect.", - "Final Sigma/endings and independent music/SFX qualification remain unverified." + "Bit/Byte floor clipping remains unresolved; before-door entry is verified, not floor correctness.", + "X2 Serges duplicate doors, incomplete machine art/void, and rocket ascent/boss margins remain open.", + "Factory outer-left empty-source strip remains a known caveat; owner background/pickup passes are accepted.", + "Serges full exit, final Sigma/endings and independent audio qualification remain unverified." ], "owner_notes_preserved": true, "scope": "Previous passes accepted individually; this is not full campaign/ending certification.", @@ -99,8 +96,44 @@ "validated": [ "Factory: native342 and pure interpreter684 preserve BG2 mode10 after60 right+jump and600 up frames.", "Fixed BG2 tilemap matches original-ROM Snes9x reference byte-for-byte; main view excluding relocated HUD matches native control.", - "Original-checkpoint Bit/Byte states replace suspect near-door teleports; no claimed floor fix.", - "Current-build save/load and repeat rendering/RAM checked in private evidence." - ] + "Current-build save/load and repeat rendering/RAM checked in private evidence.", + "Corrected near-door files: no hunter at load, clear outcome flags, walking right reaches the intended Bit/Byte dialogue. Private feedback2/before-room-verification.json records both reloads. Floor correctness is not claimed." + ], + "owner_feedback_round2": { + "x3-vile": { + "title": "3 \u00b7 X3 \u2014 factory background and pickup", + "checks": { + "lift": "Pass", + "forms": "Pass", + "escape": "Pass", + "background": "Pass", + "pickup": "Pass" + }, + "notes": "background does all sounds of weird things. wrong color, wrong movement. a mediu menergy flickersi n and out of place where it doesn't belong .\n\nas a conenience, adding a damage modifier to this testing harness would help accelerate things a lot.", + "updated_utc": "2026-10-26T21:11:46.455479+00:00" + }, + "x3-bit": { + "title": "4 \u00b7 X3 \u2014 Bit floor: natural approach", + "checks": { + "dialogue": "Pass", + "capture": "Pass", + "exit": "Deferred", + "floor": "Unreviewed" + }, + "notes": "bit shows up below the ground.", + "updated_utc": "2026-10-26T21:12:32.770677+00:00" + }, + "x3-byte": { + "title": "5 \u00b7 X3 \u2014 Byte floor: natural approach", + "checks": { + "dialogue": "Unreviewed", + "grab": "Deferred", + "exit": "Deferred", + "floor": "Deferred" + }, + "notes": "byte also clips through the ground. i can't test. the save is after the fight. same for bit.", + "updated_utc": "2026-10-26T21:13:12.849701+00:00" + } + } } } From 3e5cdfbb14ae4f4a49e94bdb000653f3b1002c69 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 15:30:46 -0700 Subject: [PATCH 05/40] Anchor hunter landing collision to room records and hide duplicate doors --- docs/WIDESCREEN.md | 29 ++++++++++++ docs/widescreen-trigger-audit.json | 47 +++++++++++++++++++ snesrecomp | 2 +- src/x3_rtl.c | 71 ++++++++++++++++++++++++++++ tools/apply_overrides.py | 12 ++++- tools/test_hunter_landings.py | 75 ++++++++++++++++++++++++++++++ 6 files changed, 233 insertions(+), 3 deletions(-) create mode 100644 tools/test_hunter_landings.py diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index bf22bf6..ff402bc 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -162,3 +162,32 @@ on the intended interior route while widescreen object windows remain active. Generated sources are intentionally untracked. Always run `tools/regen.sh`; it applies the widescreen overrides and checks idempotency. + +## Owner feedback: doors and hunter landings (2026-10-26) + +The shared engine now applies X1's strict mirrored door-body rule to X2/X3: +only the face looking into the current room is drawn. A presentation override +also suppresses recent uploads of the hidden face during opening/closing. +State loading resets unsaved renderer history. A 400-frame X3 crossing, +sampled every four frames against native width, has zero unexplained pixel +differences after excluding relocated HUD pixels and the hidden 16-pixel face. + +The original Bit/Byte fall routines defer terrain collision until +`cameraY+$98/$78`. A vertical approach can put that plane below the floor; +the initial bad landing was also reproduced with the original ROM in Snes9x. +Use the original stage record to begin collision by `recordY-8`. Collision +chooses the actual landing; camera, actor coordinates, velocity and result +flags are not forced. Bit needs its later `$98` operand compensated as well. +Only `$07:907D` and `$3C:C588` receive this policy. Their interpreter hooks +validate the original bytes and complete the 16-bit LDA with its original +five slow-bus cycles and flags. No mutable ROM operands or extra serialized +state are required. + +Generated reinjection now has 32 marked sites: the existing 30 horizontal +sites/12 pairs, plus these two landing reads, and four separate streamer +sites. `tools/test_hunter_landings.py` replays the before-door snapshots, +observes both initial landings and active combat, and refuses already-started +or completed setups. Byte lands at world Y663 and Bit at679, with visible feet +at703 against floor704 (the normal collision inset), instead of695/727. +Hybrid342, pure-interpreter684 and native256 checks pass. Owner floor/door +acceptance is still pending; prior failed notes are retained individually. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index dad3443..e5a798f 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -135,5 +135,52 @@ "updated_utc": "2026-10-26T21:13:12.849701+00:00" } } + }, + "owner_feedback_round3": { + "notes": { + "x3-vile": { + "title": "3 \u00b7 X3 \u2014 factory background and pickup", + "checks": { + "lift": "Pass", + "forms": "Pass", + "escape": "Pass", + "background": "Pass", + "pickup": "Pass" + }, + "notes": "background does all sounds of weird things. wrong color, wrong movement. a mediu menergy flickersi n and out of place where it doesn't belong .\n\nas a conenience, adding a damage modifier to this testing harness would help accelerate things a lot.", + "updated_utc": "2026-10-26T21:11:46.455479+00:00" + }, + "x3-bit": { + "title": "4 \u00b7 X3 \u2014 Bit floor: natural approach", + "checks": { + "dialogue": "Pass", + "capture": "Pass", + "exit": "Deferred", + "floor": "Unreviewed" + }, + "notes": "bit shows up below the ground.", + "updated_utc": "2026-10-26T21:12:32.770677+00:00" + }, + "x3-byte": { + "title": "Before room \u00b7 X3 \u2014 Byte", + "checks": { + "dialogue": "Unreviewed", + "grab": "Unreviewed", + "exit": "Deferred", + "floor": "Fail" + }, + "notes": "byte still clips through the ground. the double doors are still there and now they garble when you us them. they're fine at rest though.", + "updated_utc": "2026-10-26T21:47:04.929653+00:00" + } + }, + "engine_pin": "e862e62", + "changes": [ + "X1 room-facing door policy; hidden face overrides dynamic uploads", + "reset unsaved renderer history on state loads" + ], + "validation": "X2 door crossing continuous/load: zero WRAM/pixel differences. X3 opening/crossing/closing: 100 matched native comparison frames, zero unexplained pixel differences.", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\feedback3", + "owner_acceptance": "Pending; existing failures and caveats remain intact.", + "hunter_fix": "Begin native terrain collision from authored recordY-8; Byte695->663, Bit727->679, feet703/floor704. Hybrid342/pure684/native256 initial drop and active combat pass. No actor coordinate, camera or result writes." } } diff --git a/snesrecomp b/snesrecomp index 0ecd2fe..e862e62 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 0ecd2fe07a31119c00371bc1ddbdd0f12d0647af +Subproject commit e862e6273aab94d2e97a5320af039aa6c348a4e4 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 4cf719f..732902f 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -47,6 +47,7 @@ static unsigned s_lle_host_frames = 0; static bool s_lle_extra_loaded = false; static bool s_execution_loaded; static void x3_patch_ws_interp_obj_windows(void); +static void x3_patch_hunter_landing(void); /* Read a 16-bit CPU vector out of bank $00's vector table. */ static uint32_t x3_read_vector_pc24(uint16_t vec_addr) { @@ -97,6 +98,7 @@ void RunOneFrameOfGame(void) { * Interpreter fallbacks fetch the original ROM bytes, so mirror those * dynamic constants into the private runtime ROM copy each frame. */ x3_patch_ws_interp_obj_windows(); + x3_patch_hunter_landing(); if (!s_lle_did_reset) { cpu_state_init(&g_cpu, g_ram); @@ -322,6 +324,73 @@ uint16 X3WsObjWinLimit(uint16 base) { return (uint16)(base + 2 * (x3_ws_native_controller(g_cpu.D) ? 0 : x3_ws_spawn_margin())); } +/* Bit/Byte delay terrain collision until cameraY+$98/$78. A vertical + * approach can leave the camera below the authored room origin, so that + * first collision check happens after their feet have passed through the + * floor. Use the original spawn record's world Y for that threshold. Keep + * the original falling physics, terrain collision and encounter flags. */ +uint16 X3HunterLandingCameraY(uint16 camera) { + uint16_t dp = g_cpu.D; + if (dp < 0xd18 || dp >= 0x1518 || ((dp - 0xd18) & 63)) return camera; + uint8_t id = g_ram[dp + 10]; + if (id != 0x46 && id != 0x47) return camera; + uint32_t first = g_ram[0xf800] | (g_ram[0xf801] << 8); + uint32_t end = g_ram[0xfa00] | (g_ram[0xfa01] << 8); + if (first != 0xfa02 || end < first || (end-first)%5) return camera; + for (uint32_t p = first; p + 4 < end; p += 5) { + uint16_t addr = g_ram[p+3] | (g_ram[p+4] << 8); + if (addr < 0x8000 || addr > 0xfff9) continue; + if ((cart_read(g_snes->cart,0x3c,addr) & 15) != 3 || + cart_read(g_snes->cart,0x3c,addr+3) != id) continue; + uint16_t y = g_ram[p+1] | (g_ram[p+2] << 8); + uint16_t x = cart_read(g_snes->cart,0x3c,addr+5) | + ((cart_read(g_snes->cart,0x3c,addr+6) & 31) << 8); + uint16_t object_x = g_ram[dp+5] | (g_ram[dp+6] << 8); + /* Both hunters must begin checking by recordY-8 (40px above the + * authored floor). Bit's stock $98 gate is 32px later than Byte's $78 + * gate, so compensate that operand too; collision chooses the landing. */ + unsigned bias = id == 0x46 ? 160 : 128; + if (abs((int)x-(int)object_x) <= 512 && y >= bias) return y - bias; + } + return camera; +} + +static uint8_t *s_hunter_landing[2]; +static bool s_hunter_landing_scanned; +static void x3_hunter_landing_hook(CpuState *cpu, uint32_t pc24) { + unsigned index = pc24 == 0x07907d ? 0 : 1; + if (!s_hunter_landing[index] || cpu->m_flag) return; + uint16_t camera = cpu_read16(cpu,cpu->DB,0x1e60); + uint16_t origin = X3HunterLandingCameraY(camera); + /* Complete the proven 16-bit LDA absolute with the substituted operand. + * Preserve its five slow-bus cycles, flags and original WRAM read. Keeping + * ROM unchanged also avoids mutable instruction operands across state loads. */ + cpu_write_a_m(cpu,origin); + cpu->_flag_Z = origin == 0; + cpu->_flag_N = (origin & 0x8000) != 0; + cpu_mirrors_to_p(cpu); + cpu->cycles += 5; + cpu->master_cycles += 5 * 8; /* Both signature sites are slow LoROM banks. */ + interp_bridge_pre_opcode_redirect(pc24 + 3); +} +static void x3_patch_hunter_landing(void) { + static const uint32_t pcs[2] = {0x07907d,0x3cc588}; + if (!s_hunter_landing_scanned && g_snes && g_snes->cart && g_snes->cart->rom) { + s_hunter_landing_scanned = true; + for (unsigned i=0;i<2;i++) { + uint32_t offset = ((pcs[i] >> 16) * 0x8000) + (pcs[i] & 0x7fff); + if (offset < 2 || offset + 6 > g_snes->cart->romSize) continue; + uint8_t *p = g_snes->cart->rom + offset; + uint16_t add = i ? 0x78 : 0x98; + if (p[-2]==0xc2 && p[-1]==0x21 && p[0]==0xad && p[1]==0x60 && + p[2]==0x1e && p[3]==0x69 && p[4]==add && p[5]==0) { + s_hunter_landing[i] = p; + interp_bridge_add_pre_opcode_hook(pcs[i],x3_hunter_landing_hook); + } else fprintf(stderr,"[x3] hunter landing signature mismatch at $%06X\n",pcs[i]); + } + } +} + /* $00:DE3A streams scripted level records, not just ordinary actors. Widening * it can allocate progression records before X crosses the authentic playfield * boundary (the intro-stage ladder is one fatal example). Keep the vanilla @@ -760,6 +829,8 @@ void X3StateLoadExtra(SaveLoadInfo *sli, uint32_t version) { void X3OnStateLoaded(uint32_t version) { (void)version; + /* Renderer history belongs to the abandoned timeline, not this snapshot. */ + WsShadowReset(); if (s_execution_loaded) RtlApplyExecutionState(); s_execution_loaded = false; if (s_lle_extra_loaded) { diff --git a/tools/apply_overrides.py b/tools/apply_overrides.py index de79031..b2e1ab0 100644 --- a/tools/apply_overrides.py +++ b/tools/apply_overrides.py @@ -6,6 +6,8 @@ * pair-confirmed X windows: camera-X read -> add constant -> limit constant; * camera triggers: camera-X read -> add constant -> compare with dp$05. +* Bit/Byte's landing thresholds, anchored to their original world records + so a vertical approach cannot delay collision until below the floor. * $00:DE3A's four dynamic record-stream frontiers, routed through guarded helpers that retain the authentic bounds by default. @@ -57,14 +59,15 @@ ADD_BUDGET = 60 LIMIT_BUDGET = 40 CENTERED_LIMIT_BUDGET = 180 -EXPECTED_SITES = 30 +EXPECTED_SITES = 32 # 30 horizontal windows + two world-anchored hunter landings EXPECTED_PAIRS = 12 EXPECTED_STREAM_SITES = 4 EXPECTED_DISPATCH_SITES = 0 def win_snippet(indent, var, kind, const): - fn = "X3WsObjWinAdd" if kind == "add" else "X3WsObjWinLimit" + fn = ("X3HunterLandingCameraY" if kind == "landing" else + "X3WsObjWinAdd" if kind == "add" else "X3WsObjWinLimit") return ( f"{indent}{OBJ_MARKER} {{ extern uint16 {fn}(uint16); " f"{var} = {fn}({const}); }}\n" @@ -106,6 +109,11 @@ def apply_obj_windows(lines, verbose, fname): state = ("add", ADD_BUDGET) continue if RE_ANCHOR_Y.search(line): + if cur_fn in {"bank_07_9077", "bank_3C_C582"}: + match = re.match(r"^(\s*)uint16 (_v\d+) =", line) + if match: + indent, var = match.groups() + inject[idx] = (indent,var,"landing",var,cur_fn) state = None continue if state is None: diff --git a/tools/test_hunter_landings.py b/tools/test_hunter_landings.py new file mode 100644 index 0000000..1aafbb2 --- /dev/null +++ b/tools/test_hunter_landings.py @@ -0,0 +1,75 @@ +"""Replay Bit/Byte from prepared approaches in a disposable debug profile. + +The caller starts a muted test host. No enemy coordinates, collision state, +camera limits, spawn flags or encounter results are written by this check. +Prerequisite assists are recorded in the supplied approach snapshots. +""" +import argparse +import json +from pathlib import Path +import shutil +import sys + + +def run_case(driver, profile, state, name, actor_id): + profile, state = Path(profile), Path(state) + (profile/'saves').mkdir(exist_ok=True) + shutil.copy2(state, profile/'saves/save0.sav') + driver.command('clear_controller') + driver.command('loadstate 0') + for _ in range(3): driver.command('step 1') + def hunters(): + r=driver.read(0xd18,0x800) + return [dict(dp=0xd18+i, state=r[i:i+4].hex(), id=r[i+10], + y=int.from_bytes(r[i+8:i+10],'little'), hp=r[i+0x27]) + for i in range(0,0x800,64) if r[i] and r[i+10] in (0x46,0x47)] + assert not hunters(), 'Approach already contains a hunter' + assert driver.byte(0x1fd8)&15 == 0, 'Approach has completed encounter flags' + start=dict(x=driver.word(0x9dd),y=driver.word(0x9e0), + camera=[driver.word(0x1e5d),driver.word(0x1e60)]) + assert 0x1400 <= start['x'] < 0x1500, start + samples=[] + for n in range(0,660,10): + driver.byte(0x9ff,32) + driver.step(10,'right') + samples.append(dict(frames=n+10,hunters=hunters())) + live=hunters() + assert len(live)==1 and live[0]['id']==actor_id, live + actor=live[0] + # Measured retail sprite feet relative to each object's world origin. + foot_offset=24 if actor_id==0x46 else 40 + floor=driver.word(0x9e0)+17 + foot=actor['y']+foot_offset + assert abs(foot-floor)<=1, (name,actor,foot,floor) + assert driver.byte(0x1fd8)&15 == 0 + driver.snapshot(name+'-landing') + for _ in range(50): driver.step(1,'b'); driver.step(10) + live=hunters() + assert len(live)==1 and live[0]['state'][2:4]=='02' and live[0]['hp']>0, live + driver.snapshot(name+'-active') + result=dict(name=name, start=start, landing=actor, feet=foot, floor=floor, + active=live, outcome_flags=driver.byte(0x1fd8),samples=samples, + passed=True) + (profile/(name+'-landing-result.json')).write_text(json.dumps(result,indent=2)) + return result + + +def main(): + ap=argparse.ArgumentParser(description=__doc__) + ap.add_argument('--port',required=True,type=int) + ap.add_argument('--profile',required=True,type=Path) + ap.add_argument('--states',required=True,type=Path) + ap.add_argument('--framework',type=Path,default=Path(__file__).resolve().parents[1]/'snesrecomp') + args=ap.parse_args() + sys.path.insert(0,str(args.framework/'tools')) + from sneslib.client import DebugClient + from sneslib.route import FrameDriver + client=DebugClient(args.port,timeout=20) + driver=FrameDriver(client,args.profile) + try: + result=[run_case(driver,args.profile,args.states/(name+'.sav'),name,actor) + for name,actor in [('x3-byte',0x47),('x3-bit',0x46)]] + print(json.dumps(result,indent=2)) + finally: driver.close() + +if __name__=='__main__': main() From f697107f6e785114920677217d4fb10bbf2324a1 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 16:12:14 -0700 Subject: [PATCH 06/40] qa: restore resident door graphics before hunter approaches --- docs/WIDESCREEN.md | 24 ++++++++++++-- docs/widescreen-trigger-audit.json | 18 ++++++++++- tools/hunter_approach.py | 52 ++++++++++++++++++++++++++++++ tools/test_hunter_landings.py | 4 ++- 4 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 tools/hunter_approach.py diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index ff402bc..dd620d9 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -189,5 +189,25 @@ sites. `tools/test_hunter_landings.py` replays the before-door snapshots, observes both initial landings and active combat, and refuses already-started or completed setups. Byte lands at world Y663 and Bit at679, with visible feet at703 against floor704 (the normal collision inset), instead of695/727. -Hybrid342, pure-interpreter684 and native256 checks pass. Owner floor/door -acceptance is still pending; prior failed notes are retained individually. +Hybrid342, pure-interpreter684 and native256 checks pass. The owner accepts +Byte's floor, grab/recovery and exit, and confirms a single door face. The +remaining moving-door garble was traced separately to checkpoint preparation. + +### Checkpoint graphics prerequisites + +A direct stage-8 checkpoint-1 load selects graphics group4, which assumes +resident door asset `$56` from earlier group1. The prepared approach omitted +that prerequisite: `$7F:8256/$7F:8356` remained zero. The original `$01:E065` +door initializer cached those zeros and its animation referenced X's tiles. +Unmodified Snes9x reproduces the same garble with this incomplete setup. The +earlier native-width comparison only demonstrated renderer agreement; both +widths shared the missing graphics, so it did not establish authentic art. + +`tools/hunter_approach.py` prepares the prerequisite through the original +`$00:B1FC` cooperative graphics job, loading group1 then restoring group4 +before the room door initializes. It leaves actor/camera/collision/result +state to the original game. This explicit assist bypasses earlier traversal; +it does not validate the skipped graphics-group transition. The loaded base +is `$F0`, attributes `$2F`, and the door CHR is identical to the independent +original-ROM reference. Both the replay and owner-selector guards reject a +missing asset or an existing room door with stale cached graphics fields. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index e5a798f..1de4adb 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -178,9 +178,25 @@ "X1 room-facing door policy; hidden face overrides dynamic uploads", "reset unsaved renderer history on state loads" ], - "validation": "X2 door crossing continuous/load: zero WRAM/pixel differences. X3 opening/crossing/closing: 100 matched native comparison frames, zero unexplained pixel differences.", + "validation": "X2 door crossing continuous/load: zero WRAM/pixel differences. X3 opening/crossing/closing: 100 matched native comparison frames, zero unexplained pixel differences. This compared two modes of the same renderer with a shared invalid graphics setup; it does not establish original animation correctness.", "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\feedback3", "owner_acceptance": "Pending; existing failures and caveats remain intact.", "hunter_fix": "Begin native terrain collision from authored recordY-8; Byte695->663, Bit727->679, feet703/floor704. Hybrid342/pure684/native256 initial drop and active combat pass. No actor coordinate, camera or result writes." + }, + "owner_feedback_round4": { + "owner_message": "byte now stands on the floor. there is now single doors. the doors themseelves still garble when opening/closing, but are fine at rest.", + "accepted": [ + "Byte floor", + "Byte grab/recovery and exit from saved notes", + "single door face" + ], + "animation_root_cause": "Prepared stage-8 checkpoint omitted resident door graphics asset56. Original initializer cached tilebase0/attrs20 and used X CHR. Unmodified original ROM reproduces this with the same incomplete setup.", + "preparation_fix": "Original cooperative graphics job 00:B1FC: group1 then group4 before room-door initialization; no result flags set.", + "guards": "Verify fixed asset baseF0/attrs2F AND every resident room door cached baseF0/attrs2F. Old missing-asset and stale-cache snapshots both rejected.", + "reference": "Original-ROM Snes9x1.63: door CHR FE00:10000 agrees in all512 bytes, correct mechanical door opening/closing observed.", + "qualification": "Prior native-width pixel comparison only proves agreement between widths, not original art correctness.", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\feedback4", + "owner_animation_acceptance": "pending", + "validation": "Both exact prepared approach files replayed for 440 consecutive frames each at native256, hybrid342 and pure-interpreter684 (2640 frames). Correct cached asset fields and original-reference door CHR verified every frame; distinct moving-door poses retained. Fresh hybrid342 hunter landing/active-combat checks pass for both." } } diff --git a/tools/hunter_approach.py b/tools/hunter_approach.py new file mode 100644 index 0000000..924946e --- /dev/null +++ b/tools/hunter_approach.py @@ -0,0 +1,52 @@ +"""Graphics prerequisites for disposable stage-8 Bit/Byte approach snapshots. + +Checkpoint 1 loads graphics group 4, but retail progression retains door asset +$56 from group 1. A direct checkpoint warp omits it. Let the original guest +graphics job load both groups before the door actor caches its tile/attributes. +This is a preparation assist, not validation of the skipped stage progression. +""" + + +def _room_doors(driver): + pool = driver.read(0x1518, 0x300) + return [(0x1518 + i, pool[i:i + 0x60]) + for i in range(0, len(pool), 0x60) + if pool[i] and pool[i + 10] == 0x11 + and 0x1400 <= int.from_bytes(pool[i + 5:i + 7], 'little') < 0x1700] + + +def validate_door_graphics(driver): + """Reject a missing asset or an actor that cached the old missing asset.""" + base = driver.byte(0x18256) + attributes = driver.byte(0x18356) + assert (base, attributes) == (0xf0, 0x2f), ( + 'Door asset $56 was not loaded', base, attributes) + doors = _room_doors(driver) + for address, actor in doors: + assert (actor[0x18], actor[0x11]) == (base, attributes), ( + 'Door cached an invalid graphics asset', hex(address), + actor[0x18], actor[0x11]) + return dict(asset=0x56, tile_base=base, attributes=attributes, + doors=[hex(address) for address, _ in doors]) + + +def prepare_door_graphics(driver): + """Run original $00:B1FC via its idle cooperative scheduler slot $10. + + Call after checkpoint 1 loads and before moving toward the room. The writes + to $40/$42 reproduce $00:81A3's registration of this graphics-only job. + No actors, camera state, collision state or encounter results are written. + """ + assert driver.byte(0x1fae) == 8 and driver.byte(0x1fb5) == 1 + assert driver.byte(0x1f18) == 4 + assert not _room_doors(driver), 'Warm graphics before the room door initializes' + before = driver.byte(0x1fd8) + for group in (1, 4): + assert driver.byte(0x40) == 0, 'Native graphics job slot is busy' + driver.byte(0x1f18, group) + driver.word(0x42, 0xb1fc) + driver.word(0x40, 0x0101) + driver.until(0x40, b'\0', 1800, 1) + driver.step(3) + assert driver.byte(0x1fd8) == before, 'Encounter results changed during preparation' + return validate_door_graphics(driver) diff --git a/tools/test_hunter_landings.py b/tools/test_hunter_landings.py index 1aafbb2..5f3c778 100644 --- a/tools/test_hunter_landings.py +++ b/tools/test_hunter_landings.py @@ -9,6 +9,7 @@ from pathlib import Path import shutil import sys +from hunter_approach import validate_door_graphics def run_case(driver, profile, state, name, actor_id): @@ -28,6 +29,7 @@ def hunters(): start=dict(x=driver.word(0x9dd),y=driver.word(0x9e0), camera=[driver.word(0x1e5d),driver.word(0x1e60)]) assert 0x1400 <= start['x'] < 0x1500, start + graphics = validate_door_graphics(driver) samples=[] for n in range(0,660,10): driver.byte(0x9ff,32) @@ -47,7 +49,7 @@ def hunters(): live=hunters() assert len(live)==1 and live[0]['state'][2:4]=='02' and live[0]['hp']>0, live driver.snapshot(name+'-active') - result=dict(name=name, start=start, landing=actor, feet=foot, floor=floor, + result=dict(name=name, start=start, graphics=graphics, landing=actor, feet=foot, floor=floor, active=live, outcome_flags=driver.byte(0x1fd8),samples=samples, passed=True) (profile/(name+'-landing-result.json')).write_text(json.dumps(result,indent=2)) From a8ae50676cbf51a1cb71260164e89cfcd0378985 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 16:36:20 -0700 Subject: [PATCH 07/40] docs: record owner acceptance of Byte and door animation --- docs/WIDESCREEN.md | 4 ++++ docs/widescreen-trigger-audit.json | 26 ++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index dd620d9..ae20a28 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -211,3 +211,7 @@ it does not validate the skipped graphics-group transition. The loaded base is `$F0`, attributes `$2F`, and the door CHR is identical to the independent original-ROM reference. Both the replay and owner-selector guards reject a missing asset or an existing room door with stale cached graphics fields. + +The owner subsequently accepted Byte and moving-door animation. That focused +handoff is complete; do not request it again. This does not qualify the remaining +fortress branches, final Sigma/endings, or other individual deferred checks. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 1de4adb..63b73e7 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -31,9 +31,9 @@ } ], "unverified": [ - "Byte magnet/grab recovery and Bit/Byte floor correctness", - "Serges belongs to the X2 audit; X3 final Sigma/endings and remaining branches", - "Complete stage/sublevel/exit and independent music/SFX qualification" + "Bit corrected floor human confirmation and exit (automated landing/combat/exit checks pass; human exit deferred)", + "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", + "Independent music/SFX qualification" ], "assists": [ "Disposable profiles; dummy audio/video during unattended work", @@ -41,7 +41,7 @@ "Player health refill, position assists, reduced boss health followed by real projectile damage", "Bit/Byte eligibility supplied by prior Maverick weapon flags; their own result flags never written" ], - "findings": "Factory parallax lifetime and actor HUD classification defects repaired; owner background and pickup checks now Pass. Bit/Byte floor clipping remains unresolved. Their rejected checkpoint handoff was replaced by actual near-door saved files with native room entry proved after reload.", + "findings": "Factory parallax, HUD classification, single-face doors and hunter landings repaired. Corrected checkpoint graphics prerequisites restore moving-door art. Owner accepts factory checks, Byte floor/grab/recovery/exit and door animation. Bit automated landing/combat passes; individual human gaps remain separate.", "prepared_review": "Six-segment local review selector with current-build full states, normal window/audio, pause/restart, health assist and individually persisted Pass/Fail/Deferred notes; factory lift, Bit and Byte segments cover X3.", "private_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026", "tracking": "beads-8wg.19.4", @@ -196,7 +196,21 @@ "reference": "Original-ROM Snes9x1.63: door CHR FE00:10000 agrees in all512 bytes, correct mechanical door opening/closing observed.", "qualification": "Prior native-width pixel comparison only proves agreement between widths, not original art correctness.", "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\feedback4", - "owner_animation_acceptance": "pending", - "validation": "Both exact prepared approach files replayed for 440 consecutive frames each at native256, hybrid342 and pure-interpreter684 (2640 frames). Correct cached asset fields and original-reference door CHR verified every frame; distinct moving-door poses retained. Fresh hybrid342 hunter landing/active-combat checks pass for both." + "owner_animation_acceptance": "Pass: owner explicitly accepted Byte and doors; no repeat handoff.", + "validation": "Both exact prepared approach files replayed for 440 consecutive frames each at native256, hybrid342 and pure-interpreter684 (2640 frames). Correct cached asset fields and original-reference door CHR verified every frame; distinct moving-door poses retained. Fresh hybrid342 hunter landing/active-combat checks pass for both.", + "owner_acceptance_message": "ok we're good. byte passes. doors pass. we're good on this front. what's left/next?" + }, + "current_status": { + "accepted": [ + "Byte floor/grab/recovery/exit", + "door face and opening/closing animation", + "factory background/pickup/lift/forms/escape" + ], + "unverified": [ + "Bit corrected floor human confirmation and exit (automated landing/combat/exit checks pass; human exit deferred)", + "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", + "Independent music/SFX qualification" + ], + "next_cross_title_priority": "X2 actual rocket ascent and boss-arena margins" } } From 5ed96c1528158d4dae369af558a5e788010b03a9 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 20:05:01 -0700 Subject: [PATCH 08/40] Pin shared rocket margin fix and record unchanged X3 regression --- docs/widescreen-trigger-audit.json | 10 +++++++++- framework_pins.txt | 2 +- snesrecomp | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 63b73e7..a5bb8a8 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -211,6 +211,14 @@ "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", "Independent music/SFX qualification" ], - "next_cross_title_priority": "X2 actual rocket ascent and boss-arena margins" + "next_cross_title_priority": "X2 actual rocket ascent and boss-arena margins", + "shared_engine_regression": { + "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", + "cases": [ + "factory right+jump60 then up300", + "Byte entry right420" + ], + "result": "Full342px presented images and128KiB WRAM identical to prior accepted candidate throughout sampled replays. No owner repeat handoff." + } } } diff --git a/framework_pins.txt b/framework_pins.txt index c985339..ef3d012 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=f68aa0fe8edae75cbc7d4b9473c71687b45ce702 +snesrecomp=5e88adcb8eae370254c2ed0f6daad82763e02711 recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index e862e62..5e88adc 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit e862e6273aab94d2e97a5320af039aa6c348a4e4 +Subproject commit 5e88adcb8eae370254c2ed0f6daad82763e02711 From bcce3e12ef5eebf5f6e9a86b351008867e9866bf Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 20:55:31 -0700 Subject: [PATCH 09/40] Pin validated shared room margin update --- docs/widescreen-trigger-audit.json | 6 +++++- framework_pins.txt | 2 +- snesrecomp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index a5bb8a8..9cf2b65 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -218,7 +218,11 @@ "factory right+jump60 then up300", "Byte entry right420" ], - "result": "Full342px presented images and128KiB WRAM identical to prior accepted candidate throughout sampled replays. No owner repeat handoff." + "result": "Full342px presented images and128KiB WRAM identical to prior accepted candidate throughout sampled replays. No owner repeat handoff.", + "right_boundary_update": { + "engine": "7106efd183f9781000a4e3c2b2ab7b42f55a921e", + "result": "X3 retains the default-zero room option. Byte right420 replay has identical complete presented pixels and128KiB WRAM versus the accepted owner build. Owner acceptance remains valid." + } } } } diff --git a/framework_pins.txt b/framework_pins.txt index ef3d012..c1cb18b 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=5e88adcb8eae370254c2ed0f6daad82763e02711 +snesrecomp=7106efd183f9781000a4e3c2b2ab7b42f55a921e recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index 5e88adc..7106efd 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 5e88adcb8eae370254c2ed0f6daad82763e02711 +Subproject commit 7106efd183f9781000a4e3c2b2ab7b42f55a921e From 6947965955b3e4770c8c2e91b9f0c36bfc00b662 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 26 Oct 2026 22:11:38 -0700 Subject: [PATCH 10/40] Pin validated sparse canvas margin fixes --- docs/widescreen-trigger-audit.json | 6 +++++- framework_pins.txt | 2 +- snesrecomp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 9cf2b65..33710d0 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -211,7 +211,7 @@ "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", "Independent music/SFX qualification" ], - "next_cross_title_priority": "X2 actual rocket ascent and boss-arena margins", + "next_cross_title_priority": "Focused X2 front/entrance follow-up, then remaining fortress/final routes and integration.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -222,6 +222,10 @@ "right_boundary_update": { "engine": "7106efd183f9781000a4e3c2b2ab7b42f55a921e", "result": "X3 retains the default-zero room option. Byte right420 replay has identical complete presented pixels and128KiB WRAM versus the accepted owner build. Owner acceptance remains valid." + }, + "canvas_policy_update": { + "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "result": "X3 retains default-off source-canvas and VRAM selection options. All sampled342px presented pixels and128KiB WRAM match the accepted owner build in Byte right420 and factory right+jump60/up300. Accepted owner checks remain complete." } } } diff --git a/framework_pins.txt b/framework_pins.txt index c1cb18b..e519f18 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=7106efd183f9781000a4e3c2b2ab7b42f55a921e +snesrecomp=a4e30664c078a2ee33ef61625cc73f5f1d546841 recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index 7106efd..a4e3066 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 7106efd183f9781000a4e3c2b2ab7b42f55a921e +Subproject commit a4e30664c078a2ee33ef61625cc73f5f1d546841 From ac75e8f7d849be37c622f64a094a1a8cf8a1ba58 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 00:06:00 -0700 Subject: [PATCH 11/40] Contain Kaiser canvas and extend fixed arena walls --- docs/widescreen-trigger-audit.json | 109 ++++++++++++++++++++++------- src/x3_rtl.c | 14 ++++ 2 files changed, 98 insertions(+), 25 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 33710d0..9504e0b 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -1,5 +1,38 @@ { "date": "2026-10-26", + "current_status": { + "accepted": [ + "Byte floor/grab/recovery/exit", + "door face and opening/closing animation", + "factory background/pickup/lift/forms/escape" + ], + "unverified": [ + "Bit human floor/exit follow-up (automatic checks pass)", + "Kaiser final hit, lava escape and endings", + "Remaining fortress branches/full content inventory/independent audio", + "Current-main integration and performance gate" + ], + "next_cross_title_priority": "Focused new visuals/optional Kaiser hit, remaining fortress branches and integration.", + "shared_engine_regression": { + "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", + "cases": [ + "factory right+jump60 then up300", + "Byte entry right420" + ], + "result": "Full342px presented images and128KiB WRAM identical to prior accepted candidate throughout sampled replays. No owner repeat handoff.", + "right_boundary_update": { + "engine": "7106efd183f9781000a4e3c2b2ab7b42f55a921e", + "result": "X3 retains the default-zero room option. Byte right420 replay has identical complete presented pixels and128KiB WRAM versus the accepted owner build. Owner acceptance remains valid." + }, + "canvas_policy_update": { + "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "result": "X3 retains default-off source-canvas and VRAM selection options. All sampled342px presented pixels and128KiB WRAM match the accepted owner build in Byte right420 and factory right+jump60/up300. Accepted owner checks remain complete." + } + }, + "pending_visual": [ + "New final Sigma arena wall extension/head-wrap correction" + ] + }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", "release_framework_pin": "f68aa0fe8edae75cbc7d4b9473c71687b45ce702", @@ -200,33 +233,59 @@ "validation": "Both exact prepared approach files replayed for 440 consecutive frames each at native256, hybrid342 and pure-interpreter684 (2640 frames). Correct cached asset fields and original-reference door CHR verified every frame; distinct moving-door poses retained. Fresh hybrid342 hunter landing/active-combat checks pass for both.", "owner_acceptance_message": "ok we're good. byte passes. doors pass. we're good on this front. what's left/next?" }, - "current_status": { - "accepted": [ - "Byte floor/grab/recovery/exit", - "door face and opening/closing animation", - "factory background/pickup/lift/forms/escape" + "fixed_arena_followup": { + "date": "2026-10-27", + "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "source_content_sha256": "39e9d34f8339e62b3cf4eb46e4977e621a57116195174c2b3ad356bd8c395aa7", + "binary_sha256": "8ad4bc2b43b29065124e39c0c6d007cf2832ffcf2e343b19a941fe1a9ea233d1", + "change": "Reuse the existing elastic compositor to continue only the outer BG1 wall-edge pixels; preserve the native room1:1 and contain BG2 object canvases within it. No actor, camera, physics, timing or outcome writes.", + "selection": "Only the authored fixed Sigma arena bounds, in its normal mode1 background maps. Bounds rather than live scroll retain the policy through camera shake; X2 retains it through final-clear fade. Ordinary scenes reset the frame-local policy.", + "validation": { + "cases": [ + "x3-first-arena-342", + "x3-first-arena-684", + "x3-kaiser-arena-342", + "x3-kaiser-arena-684" + ], + "samples": "30 samples over360 frames per form/width at342 and interpreter684; all native pixels,128KiB WRAM and64KiB VRAM match the prior owner runtime", + "save_load": "All4 form/width cases: zero pixel and WRAM differences", + "lifecycle": "X2 original final clear and ending handoff: native pixels/WRAM match; ending full output matches. X3 accepted factory scene after arena: full output and WRAM match at684.", + "shake": "X2 genuine cameraX3587 while locked bounds remain3584 was rendered and inspected; no camera values injected." + }, + "runtime": { + "status": "neutral/inconclusive", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-arena-runtime.json", + "limit": "Short matched serial diagnostic headroom samples are mixed under host/disk load. They establish neither an optimization win nor a reproducible regression; current-main built-runtime gate remains ahead." + }, + "owner_visual_acceptance": "Pending only these new final-arena visuals; prior accepted checks remain accepted.", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown" + }, + "final_route_followup": { + "date": "2026-10-27", + "route_presentation": "342px hybrid; the separate arena pixel/AI comparisons also cover684px pure interpreter", + "passed": [ + "Native dash/jump approach reaches original Zero dialogue;17 B press/release pulses complete it and restore control", + "Original ladder/camera transitions and position-assisted shaft reach Sigma through its room initialization", + "Sigma intro/AI and real projectile defeat after HP1 assist create Kaiser; its introduction and live AI/parts initialize correctly" ], "unverified": [ - "Bit corrected floor human confirmation and exit (automated landing/combat/exit checks pass; human exit deferred)", - "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", - "Independent music/SFX qualification" + "Kaiser finishing hit", + "Lava escape and both ending branches" ], - "next_cross_title_priority": "Focused X2 front/entrance follow-up, then remaining fortress/final routes and integration.", - "shared_engine_regression": { - "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", - "cases": [ - "factory right+jump60 then up300", - "Byte entry right420" - ], - "result": "Full342px presented images and128KiB WRAM identical to prior accepted candidate throughout sampled replays. No owner repeat handoff.", - "right_boundary_update": { - "engine": "7106efd183f9781000a4e3c2b2ab7b42f55a921e", - "result": "X3 retains the default-zero room option. Byte right420 replay has identical complete presented pixels and128KiB WRAM versus the accepted owner build. Owner acceptance remains valid." - }, - "canvas_policy_update": { - "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", - "result": "X3 retains default-off source-canvas and VRAM selection options. All sampled342px presented pixels and128KiB WRAM match the accepted owner build in Byte right420 and factory right+jump60/up300. Accepted owner checks remain complete." - } - } + "automation_limit": "Normal aiming, charged aiming and a loadout/forehead reassessment did not finish Kaiser. X.Buster selected in original menu; boss remains alive at1HP. This is not evidence of a game defect.", + "prepared": "x3-kaiser-hit.sav starts before the finishing hit with a live1HP original Kaiser, original result flags untouched. Pause/save progress plus Capture retain a full current-build restart snapshot.", + "checkpoint_inventory": { + "table": "06:a8e4", + "slots": 15, + "records": 53, + "scope": "Directory includes intro/ending entries; this is an inventory, not completed coverage." + }, + "assists": [ + "Earlier Maverick weapon eligibility", + "Original full stage/checkpoint loader", + "Player health/position for shaft", + "Boss HP reduction before real damage; no target success writes" + ], + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown" } } diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 732902f..e19b3b3 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -290,6 +290,20 @@ void X3ConfigureWsHud(void) { /* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); + /* Keep the fixed Sigma arena's native pixels intact and continue its wall + * edges into the gutters. The BG2 Kaiser head is a circular object canvas, + * so it must stay within the room rather than echo beyond the side walls. + * These presentation fields reset each frame; the escape shaft keeps its + * normal streaming policy as soon as the original bounds unlock. */ + static const uint8_t sigma_bounds[10] = { + 0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07}; + if (g_ws_active && g_ppu && g_ram[0x1fae] == 13 && + g_ram[0xd1] == 4 && (g_ppu->bgmode & 7) == 1 && + (g_ppu->bgXsc[0] & 0xfc) == 0x50 && (g_ppu->bgXsc[1] & 0xfc) == 0x58 && + !memcmp(g_ram+0x1e68,sigma_bounds,sizeof(sigma_bounds))) { + PpuSetWidescreenLayerElasticSplitBandSlot(g_ppu,0,0,0,224,0,1,255,256); + PpuSetWidescreenLayerClamp(g_ppu,2); + } } /* X3's shared object-window family is the X2 implementation moved to bank From 49744236771845450ee42d20ad14294d4682fad6 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 02:17:06 -0700 Subject: [PATCH 12/40] Frame isolated X3 rematches and qualify native Boss Rush --- docs/widescreen-trigger-audit.json | 112 ++++++++++++++++++++++++++++- src/main.c | 3 +- src/x3_rtl.c | 9 +++ src/x3_rtl.h | 1 + tools/test_bossrush_framing.py | 54 ++++++++++++++ 5 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 tools/test_bossrush_framing.py diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 9504e0b..83ee383 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -8,11 +8,12 @@ ], "unverified": [ "Bit human floor/exit follow-up (automatic checks pass)", + "Boss Rush exit/next-stage handoff: automated approach is unresolved in matched native256 and wide684; not a confirmed widescreen defect", "Kaiser final hit, lava escape and endings", "Remaining fortress branches/full content inventory/independent audio", "Current-main integration and performance gate" ], - "next_cross_title_priority": "Focused new visuals/optional Kaiser hit, remaining fortress branches and integration.", + "next_cross_title_priority": "Pending focused visuals, optional Kaiser/actual all-clear hub exit assistance, remaining fortress branches and integration.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -31,7 +32,8 @@ }, "pending_visual": [ "New final Sigma arena wall extension/head-wrap correction" - ] + ], + "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify; exit/handoff remains separate and unverified." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -287,5 +289,111 @@ "Boss HP reduction before real damage; no target success writes" ], "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown" + }, + "native_bossrush_followup": { + "date": "2026-10-27", + "engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "native_mask": [ + 0, + 2, + 6, + 7, + 15, + 31, + 63, + 127, + 255 + ], + "cases": [ + { + "boss_id": 82, + "before": 0, + "after": 2, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rematch-gravity-real-defeat.json" + }, + { + "boss_id": 87, + "before": 2, + "after": 6, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-inner-right.json" + }, + { + "boss_id": 83, + "before": 6, + "after": 7, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-left-fixed-y.json" + }, + { + "boss_id": 86, + "before": 7, + "after": 15, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-right-fixed-y.json" + }, + { + "boss_id": 88, + "before": 15, + "after": 31, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-left.json" + }, + { + "boss_id": 89, + "before": 31, + "after": 63, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-left.json" + }, + { + "boss_id": 85, + "before": 63, + "after": 127, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-right.json" + }, + { + "boss_id": 84, + "before": 127, + "after": 255, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-right.json" + } + ], + "passed": [ + "All8 native hub-pad transfers initialize a live original32HP Maverick", + "Each accepts real projectile damage after explicitHP1 assist; native defeat/return adds exactly one1FDA bit", + "Actual cumulative1FDA reachesFF; no rematch result/control/camera writes", + "After framing fix, isolated rooms present256px and native returns restore684px hub" + ], + "setup_findings": [ + "Direct checkpoint8 is a Neon Tiger rematch, not Doppler; normal-loader warps omit native mode0E initialization and are excluded", + "Upper capsule caps are solid. Position assists target inside the cylinder rather than above its cap", + "Checkpoint2 is the scrolling corridor after the hub, not a packed rematch; native framing starts at3" + ], + "presentation_fix": "Reuse X2 native-frame policy only for stage12 isolated rematches3..8. Hub1, ordinary corridor2 and other stages keep adaptive width; eliminates unrelated adjacent arenas.", + "native_view": { + "non_hud_pixels": 0, + "player_camera_progression_differences": 0, + "maximum_full_wram_differences": 6, + "caveat": "Transient noncritical WRAM differences are retained; no full-WRAM equality claim for cross-width comparison", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-framing-native-view.json" + }, + "exact_default_resets": { + "x3-framing-hub-reset": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-framing-hub-reset.json", + "x3-framing-kaiser-reset": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-framing-kaiser-reset.json", + "x3-framing-corridor-reset": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-framing-corridor-reset.json" + }, + "assists": [ + "Initial original checkpoint1 hub setup with earlier weapon/progression eligibility supplied", + "Player position/HP, controller button edges and explicit bossHP1 before actual projectile hits", + "Width/build change after the first two rematches uses the retained native cumulative state; not an uninterrupted normal playthrough" + ], + "remaining": [ + "Boss Rush exit/next-stage handoff: automated approach is unresolved in matched native256 and wide684; not a confirmed widescreen defect", + "Kaiser final hit/lava escape/ending, remaining fortress branches/content/audio and final integration/runtime gate" + ] } } diff --git a/src/main.c b/src/main.c index b22ff78..32814d8 100644 --- a/src/main.c +++ b/src/main.c @@ -25,7 +25,8 @@ "# windows are adapted for 16:9. See docs/WIDESCREEN.md.\n" #define MmxDisplayViewport X3DisplayViewport -#define MmxDisplay_ComputeFrameWidth X3Display_ComputeFrameWidth +#define MmxDisplay_ComputeFrameWidth(dw, dh, wide) \ + X3Display_ComputeFrameWidth(dw, dh, (wide) && !X3UseNativeFrame()) #define MmxDisplay_ComputeViewport X3Display_ComputeViewport #define MmxDisplay_GetWindowBaseWidth X3Display_GetWindowBaseWidth #define MmxDisplay_GetWindowBaseHeight X3Display_GetWindowBaseHeight diff --git a/src/x3_rtl.c b/src/x3_rtl.c index e19b3b3..67b88a9 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -310,6 +310,15 @@ void X3ConfigureWsBgMargins(void) { * $02: $D58A activation, $D611 visibility, and $D636 draw. Generated-code * overrides route only structurally confirmed camera-X add/limit pairs (and * camera-X/dp$05 triggers) through these helpers. Y windows are untouched. */ +/* Boss Rush stores unrelated arenas beside each other. Match X2's native + * framing for isolated rematches; the hub retains its complete wide layout. + * Hub teleports select checkpoints 3..8. Checkpoint 2 is the ordinary + * corridor after the hub and keeps its scrolling widescreen presentation. */ +bool X3UseNativeFrame(void) { + return g_ram[0x1fae] == 12 && g_ram[0xd1] == 4 && + g_ram[0x1fb5] >= 3 && g_ram[0x1fb5] <= 8; +} + static int x3_ws_spawn_margin(void) { static int s_enabled = -1; if (s_enabled < 0) { diff --git a/src/x3_rtl.h b/src/x3_rtl.h index 0d93874..1ea9f29 100644 --- a/src/x3_rtl.h +++ b/src/x3_rtl.h @@ -17,6 +17,7 @@ void X3ConfigureWsHud(void); /* Per-frame exact BG1/BG2 gutter fill, self-gated by native VRAM parity. */ void X3ConfigureWsBgMargins(void); +bool X3UseNativeFrame(void); /* LLE host execution cursor (resume PC + CpuState) — not covered by * snes_saveload, which snapshots the unused snes->cpu. */ diff --git a/tools/test_bossrush_framing.py b/tools/test_bossrush_framing.py new file mode 100644 index 0000000..0df1a5f --- /dev/null +++ b/tools/test_bossrush_framing.py @@ -0,0 +1,54 @@ +"""Check isolated rematch framing and restored adaptive hub presentation. + +Supply current-build live-room and hub snapshots to an already running muted +debug host with widescreen enabled. No game RAM or encounter results are edited. +Native teleports, defeats and cumulative flags are separate gameplay checks. +""" +import argparse +import json +from pathlib import Path +import shutil +import struct +import sys + + +def run_case(driver, profile, state, expected_width, label): + profile=Path(profile) + (profile/'saves').mkdir(exist_ok=True) + shutil.copy2(state,profile/'saves/save0.sav') + driver.command('clear_controller');driver.command('loadstate 0') + for _ in range(3):driver.command('step 1') + driver.command('screenshot '+label+'.bmp') + width,height=struct.unpack_from(' Date: Tue, 27 Oct 2026 02:38:08 -0700 Subject: [PATCH 13/40] Record final-build native Boss Rush replay and focused handoff --- docs/widescreen-trigger-audit.json | 302 +++++++++++++++++++++++++++-- 1 file changed, 289 insertions(+), 13 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 83ee383..998f68b 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -33,7 +33,7 @@ "pending_visual": [ "New final Sigma arena wall extension/head-wrap correction" ], - "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify; exit/handoff remains separate and unverified." + "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify on the final owner build in pure684, including causalHP1 checks; exit/handoff remains separate." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -292,7 +292,7 @@ }, "native_bossrush_followup": { "date": "2026-10-27", - "engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", "native_mask": [ 0, 2, @@ -310,56 +310,64 @@ "before": 0, "after": 2, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rematch-gravity-real-defeat.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-1.json" }, { "boss_id": 87, "before": 2, "after": 6, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-inner-right.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-2.json" }, { "boss_id": 83, "before": 6, "after": 7, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-left-fixed-y.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-3.json" }, { "boss_id": 86, "before": 7, "after": 15, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-right-fixed-y.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-4.json" }, { "boss_id": 88, "before": 15, "after": 31, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-left.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-5.json" }, { "boss_id": 89, "before": 31, "after": 63, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-left.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-6.json" }, { "boss_id": 85, "before": 63, "after": 127, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-right.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-7.json" }, { "boss_id": 84, "before": 127, "after": 255, "passed": true, - "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-right.json" + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-8.json" } ], "passed": [ @@ -388,12 +396,280 @@ }, "assists": [ "Initial original checkpoint1 hub setup with earlier weapon/progression eligibility supplied", - "Player position/HP, controller button edges and explicit bossHP1 before actual projectile hits", - "Width/build change after the first two rematches uses the retained native cumulative state; not an uninterrupted normal playthrough" + "Player position/HP, controller button edges and explicit bossHP1 before actual projectile hits" ], "remaining": [ "Boss Rush exit/next-stage handoff: automated approach is unresolved in matched native256 and wide684; not a confirmed widescreen defect", "Kaiser final hit/lava escape/ending, remaining fortress branches/content/audio and final integration/runtime gate" - ] + ], + "initial_current_main_cases": [ + { + "boss_id": 82, + "before": 0, + "after": 2, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rematch-gravity-real-defeat.json" + }, + { + "boss_id": 87, + "before": 2, + "after": 6, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-inner-right.json" + }, + { + "boss_id": 83, + "before": 6, + "after": 7, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-left-fixed-y.json" + }, + { + "boss_id": 86, + "before": 7, + "after": 15, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-upper-outer-right-fixed-y.json" + }, + { + "boss_id": 88, + "before": 15, + "after": 31, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-left.json" + }, + { + "boss_id": 89, + "before": 31, + "after": 63, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-left.json" + }, + { + "boss_id": 85, + "before": 63, + "after": 127, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-inner-right.json" + }, + { + "boss_id": 84, + "before": 127, + "after": 255, + "passed": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-rush-lower-outer-right.json" + } + ], + "initial_current_main_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "final_owner_replay": { + "identity": { + "executable_sha256": "ca0c6437beb75ca29af8cd7d2c12450408c7a63e77cb1503030e594652b0c415", + "game_code": "49744236771845450ee42d20ad14294d4682fad6", + "runtime_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "generation_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "window": "2560x720", + "pure_interpreter": true + }, + "cases": [ + { + "boss_id": 82, + "before": 0, + "after": 2, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-1.json" + }, + { + "boss_id": 87, + "before": 2, + "after": 6, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-2.json" + }, + { + "boss_id": 83, + "before": 6, + "after": 7, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-3.json" + }, + { + "boss_id": 86, + "before": 7, + "after": 15, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-4.json" + }, + { + "boss_id": 88, + "before": 15, + "after": 31, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-5.json" + }, + { + "boss_id": 89, + "before": 31, + "after": 63, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-6.json" + }, + { + "boss_id": 85, + "before": 63, + "after": 127, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-7.json" + }, + { + "boss_id": 84, + "before": 127, + "after": 255, + "passed": true, + "hp_assist_idle_verified": true, + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-final-pure684-rematch-8.json" + } + ], + "native_mask": [ + 0, + 2, + 6, + 7, + 15, + 31, + 63, + 127, + 255 + ], + "interpretation": "One final owner executable in pure interpreter mode at2560x720 throughout all8 real hub transfers, live32HP encounters, reduced-HP actual projectile defeats and native returns. No result/control/camera writes.", + "causal_check": "Each assisted boss remains alive at1HP for3 no-shooting frames before actual controller fire." + }, + "historical_pilot": "Initial current-main pilot changed width/build after the first2 rematches; final owner replay above repeats all8 in one executable/configuration.", + "owner_pin_followup": { + "game_code": "49744236771845450ee42d20ad14294d4682fad6", + "runtime_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "generation_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "sha256": "ca0c6437beb75ca29af8cd7d2c12450408c7a63e77cb1503030e594652b0c415", + "previous_sha256": "8ad4bc2b43b29065124e39c0c6d007cf2832ffcf2e343b19a941fe1a9ea233d1", + "passed": [ + "Native256 rematches with adaptive342/684 hub and ordinary corridor", + "Accepted Byte420/factory360 and Kaiser120 whole images/all128KiB WRAM unchanged", + "Current-build hub/rematch save-load has0pixel/WRAM differences" + ], + "states": { + "x3-kaiser-hit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\rematch-owner-states\\x3-kaiser-hit.sav", + "sha256": "558e9ef6f64639cfd6d22438adad9b6a5ff9d7c5064c6c96d297818678bc9b93", + "info": { + "frame": 11489, + "mode": "020404000000000e", + "stage": "000d0300000000020001", + "player": "000200023e410780", + "x": 1857, + "y": 2735, + "hp": 16, + "camera": [ + 1792, + 2560 + ], + "bounds": "0007000a000a00070007f8ff00000000000a0007", + "event": "00000000000000000000000000000000000000000000000003000103000000580d0000040000000000000000000000001811000000000000000100000000000000000000480033010200010090000000" + }, + "actors": [ + { + "dp": 3352, + "state": "01020000", + "id": 2, + "sub": 5, + "x": 1920, + "y": 2624, + "hp": 0 + }, + { + "dp": 3416, + "state": "01020006", + "id": 95, + "sub": 8, + "x": 1970, + "y": 2623, + "hp": 1 + }, + { + "dp": 3480, + "state": "01020000", + "id": 68, + "sub": 4, + "x": 1970, + "y": 2623, + "hp": 127 + }, + { + "dp": 3544, + "state": "01020000", + "id": 68, + "sub": 0, + "x": 1970, + "y": 2623, + "hp": 127 + }, + { + "dp": 3608, + "state": "01020000", + "id": 68, + "sub": 2, + "x": 1970, + "y": 2623, + "hp": 127 + }, + { + "dp": 4888, + "state": "41020000", + "id": 45, + "sub": 0, + "x": 1996, + "y": 2716, + "hp": 8 + } + ] + }, + "x3-bossrush-exit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\rematch-owner-states\\x3-bossrush-exit.sav", + "sha256": "d5bdae1ae862836d266b0c363f462f3e2f732fe94e6cf25fc7413ec1132997e8", + "info": { + "frame": 18070, + "mode": "0204040000000004", + "stage": "000c0200000000020101", + "player": "0002000200700300", + "x": 880, + "y": 1103, + "hp": 16, + "camera": [ + 752, + 1024 + ], + "bounds": "00040004000500020004f8ff000000000004f002", + "event": "0000000000000000000000000000000000000000000000000100000300000000000000040000000000000000000000000000000000000000000100000000000000000000000000000000000000000000" + }, + "actors": [ + { + "dp": 3352, + "state": "01020000", + "id": 101, + "sub": 0, + "x": 880, + "y": 1151, + "hp": 64 + } + ] + } + }, + "launch": "Left closed; normal window/audio and existing controller settings, owner notes and native saves preserved" + } } } From fbff2b9ab7ee18c952683fb2968bf80c7b72a15d Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 03:28:47 -0700 Subject: [PATCH 14/40] Extend locked Lab 1 walls into widescreen margins --- src/x3_rtl.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 67b88a9..2dea939 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -290,17 +290,23 @@ void X3ConfigureWsHud(void) { /* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); - /* Keep the fixed Sigma arena's native pixels intact and continue its wall + /* Keep fixed fortress arenas' native pixels intact and continue their wall * edges into the gutters. The BG2 Kaiser head is a circular object canvas, * so it must stay within the room rather than echo beyond the side walls. * These presentation fields reset each frame; the escape shaft keeps its * normal streaming policy as soon as the original bounds unlock. */ static const uint8_t sigma_bounds[10] = { 0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07}; - if (g_ws_active && g_ppu && g_ram[0x1fae] == 13 && + static const uint8_t lab1_bounds[10] = { + 0x00,0x16,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x16}; + const bool fixed_arena = + (g_ram[0x1fae] == 13 && + !memcmp(g_ram+0x1e68,sigma_bounds,sizeof(sigma_bounds))) || + (g_ram[0x1fae] == 10 && + !memcmp(g_ram+0x1e68,lab1_bounds,sizeof(lab1_bounds))); + if (g_ws_active && g_ppu && fixed_arena && g_ram[0xd1] == 4 && (g_ppu->bgmode & 7) == 1 && - (g_ppu->bgXsc[0] & 0xfc) == 0x50 && (g_ppu->bgXsc[1] & 0xfc) == 0x58 && - !memcmp(g_ram+0x1e68,sigma_bounds,sizeof(sigma_bounds))) { + (g_ppu->bgXsc[0] & 0xfc) == 0x50 && (g_ppu->bgXsc[1] & 0xfc) == 0x58) { PpuSetWidescreenLayerElasticSplitBandSlot(g_ppu,0,0,0,224,0,1,255,256); PpuSetWidescreenLayerClamp(g_ppu,2); } From 2e3a37677b2a3610f69990e00551b510bd146c3c Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 03:33:40 -0700 Subject: [PATCH 15/40] Record Lab 1 margin replay and remaining audit gaps --- docs/WIDESCREEN.md | 16 +++++++ docs/widescreen-trigger-audit.json | 67 ++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index ae20a28..7dcb3fa 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -215,3 +215,19 @@ missing asset or an existing room door with stale cached graphics fields. The owner subsequently accepted Byte and moving-door animation. That focused handoff is complete; do not request it again. This does not qualify the remaining fortress branches, final Sigma/endings, or other individual deferred checks. + +### Locked Lab 1 arena margins (2026-10-27) + +The Lab 1 end room exposed its neighboring corridor on the left and unbacked +map space on the right at very wide aspects. Its original locked bounds +`1600/0600/0600/1600/1600`, mode 1 and maps `$50/$58` now reuse the existing +Sigma wall-edge compositor and BG2 containment. The approach keeps its normal +streaming until the original room lock completes. No guest state is changed. + +Paired native256, hybrid342 and interpreter684 runs plus the actual 360-frame +door approach preserve every native-view pixel, all 128 KiB WRAM and 64 KiB +VRAM in 48 samples. Byte420, factory360, Kaiser120, hub120 and native rematch +entry120 preserve complete output and WRAM against the preceding build. +Refreshed Kaiser and all-clear hub states each replay 120 frames identically +after current-build save/load. This qualifies presentation; alternate branch +selection, full Lab 1 combat and its following transition remain separate. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 998f68b..dd90c4b 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -671,5 +671,72 @@ }, "launch": "Left closed; normal window/audio and existing controller settings, owner notes and native saves preserved" } + }, + "lab1_margin_followup": { + "game_code": "fbff2b9ab7ee18c952683fb2968bf80c7b72a15d", + "runtime_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "generation_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "sha256": "28f17ee1382d3b70d3aa56e15fe694845309bdf836ca474c647d837a185ae5ef", + "policy": "Original locked stage10 bounds1600/0600/0600/1600/1600 and mode1 maps50/58 reuse fixed-Sigma BG1 wall edges/BG2 containment; approach/other stages retain existing policy.", + "matrix": [ + { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-margins-native256.json", + "width": 256, + "samples": 8 + }, + { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-margins-hybrid342.json", + "width": 342, + "samples": 8 + }, + { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-margins-pure684.json", + "width": 684, + "samples": 8 + } + ], + "entry": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-door-approach.json", + "frames": 360, + "samples": 24 + }, + "proved": "All48 Lab1 samples preserve every native-view pixel,128KiB WRAM and64KiB VRAM. Native256 complete output is identical. Native actual door approach/lock is retained.", + "regressions": [ + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-reset-byte.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-reset-factory.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-reset-kaiser.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-reset-hub.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-lab1-reset-rematch.json" + ], + "states": { + "x3-kaiser-hit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\lab1-owner-states\\x3-kaiser-hit.sav", + "sha256": "0757d3b6b86c74fb4d7dcbe38ea1e00efcc249ba5ef0c190d15721cb297ca5b1", + "current_build_replay": { + "frames": 120, + "pixel_differences": 0, + "ram_differences": 0 + } + }, + "x3-bossrush-exit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\lab1-owner-states\\x3-bossrush-exit.sav", + "sha256": "9eb453d1fa61919c2bfa78d71dc24cf74aac127a67156d69f28488437410364d", + "current_build_replay": { + "frames": 120, + "pixel_differences": 0, + "ram_differences": 0 + } + } + }, + "bossrush_provenance": "All8 actual fights/returns were qualified on the preceding ca0 executable. Its stage12 policy is unchanged; current executable replays actual native rematch entry, all-clear hub and Kaiser with exact whole output/WRAM. No new all8-binary claim.", + "remaining": [ + "Lab1 alternate branch selection/combat completion and subsequent stage transition remain unverified in this replay; earlier Godkarmachine-labelled result is historical evidence only.", + "Providing prior1FD8=0F did not establish a distinct encounter; it is not alternate-branch coverage.", + "Kaiser finishing hit/lava escape/ending, all-clear hub exit, other branches/content/audio and final integration/runtime gate remain open." + ], + "instrumentation": "128KiB TCP read occasionally returned short data; current paired Lab1 proof uses bounded32KiB reads with an unchanged-frame assertion. Failed attempts were not accepted.", + "remote_tracking": "Two normal central Beads pushes failed at their own remote-transfer deadlines. Local issue comments remain durable; no shared server interruption or timeout bypass.", + "owner_notes_preserved": true, + "previous_sha256": "ca0c6437beb75ca29af8cd7d2c12450408c7a63e77cb1503030e594652b0c415" } } From 8a71e90abc20da46cb71bc6c6512a4d3e9c1f4dc Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 04:24:53 -0700 Subject: [PATCH 16/40] Contain Godkarmachine and Doppler arena margins --- src/x3_rtl.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 2dea939..2c189ff 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -295,15 +295,23 @@ void X3ConfigureWsBgMargins(void) { * so it must stay within the room rather than echo beyond the side walls. * These presentation fields reset each frame; the escape shaft keeps its * normal streaming policy as soon as the original bounds unlock. */ - static const uint8_t sigma_bounds[10] = { - 0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07}; - static const uint8_t lab1_bounds[10] = { - 0x00,0x16,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x16}; - const bool fixed_arena = - (g_ram[0x1fae] == 13 && - !memcmp(g_ram+0x1e68,sigma_bounds,sizeof(sigma_bounds))) || - (g_ram[0x1fae] == 10 && - !memcmp(g_ram+0x1e68,lab1_bounds,sizeof(lab1_bounds))); + static const struct { + uint8_t stage; + uint8_t bounds[10]; + } fixed_arenas[] = { + {10, {0x00,0x16,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x16}}, /* Press */ + {10, {0x00,0x16,0x00,0x07,0x00,0x07,0x00,0x16,0x00,0x16}}, /* Godkarmachine */ + {12, {0x00,0x0a,0x00,0x04,0x00,0x04,0x00,0x0a,0x00,0x0a}}, /* Doppler */ + {13, {0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07}}, /* Sigma */ + }; + bool fixed_arena = false; + for (size_t i = 0; i < sizeof(fixed_arenas)/sizeof(fixed_arenas[0]); ++i) { + if (g_ram[0x1fae] == fixed_arenas[i].stage && + !memcmp(g_ram+0x1e68,fixed_arenas[i].bounds,sizeof(fixed_arenas[i].bounds))) { + fixed_arena = true; + break; + } + } if (g_ws_active && g_ppu && fixed_arena && g_ram[0xd1] == 4 && (g_ppu->bgmode & 7) == 1 && (g_ppu->bgXsc[0] & 0xfc) == 0x50 && (g_ppu->bgXsc[1] & 0xfc) == 0x58) { From f30b8a6414bd624e4e5d49e69344f8297d6ddc44 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 04:32:18 -0700 Subject: [PATCH 17/40] Record assisted fortress defeats and bounded margin checks --- docs/WIDESCREEN.md | 33 +++++++++++ docs/widescreen-trigger-audit.json | 89 ++++++++++++++++++++++++++++-- 2 files changed, 116 insertions(+), 6 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 7dcb3fa..b7effbd 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -231,3 +231,36 @@ entry120 preserve complete output and WRAM against the preceding build. Refreshed Kaiser and all-clear hub states each replay 120 frames identically after current-build save/load. This qualifies presentation; alternate branch selection, full Lab 1 combat and its following transition remain separate. + +### Godkarmachine and Doppler follow-up (2026-10-27) + +The lower Lab 1 checkpoint2 room and Doppler's real stage12 checkpoint2 end +room have the same boundary problem. Their original locked bounds +`1600/0700/0700/1600/1600` and `0a00/0400/0400/0a00/0a00` join Press and Sigma +in one explicit descriptor table. All four use the existing wall compositor; +ordinary corridors and native framing retain their previous policies. + +God/Doppler native256, hybrid342 and interpreter684 provide 48 paired samples +with identical native-view pixels, full WRAM and all 64 KiB VRAM. Native entire +output is identical. Byte420, factory360, Kaiser120, hub120, rematch entry120 +and Press120 preserve complete output/WRAM against the preceding build. +The actual post-Doppler clear also reaches its password screen after 900 +frames with identical complete output/WRAM. Both current handoff states replay +120 frames identically after save/load. + +Separate assisted combat runs now qualify live32HP Godkarmachine, Press +Disposer and Doppler, actual projectile defeats after HP assistance, and +native fortress counters `0->1` or `2->3`. God needs20 original dialogue +edges to transform; Doppler needs54 before combat and54 after. Press's +trunk and head are separate phases; aiming24 pixels above the parent origin +finishes the head. These mechanics runs retain the exact preceding28f17ee +binary identity; the new33949e75 executable adds only the presentation cases +and has the paired checks above. Private evidence lists all bypasses. + +Checkpoint2/3 selection bypasses Lab 1's original branch fork. Position +assists bypass ordinary corridor obstacles before Doppler's real door. +Normal fortress next-stage selection remains unverified: repeated Start +after the password loads stage0, and restoring the native fortress entry +marker alone did not resolve it. No game defect or speculative marker fix is +claimed. An authentically completed intro/normal-selection baseline is the +next setup investigation. Lab2 branches and Kaiser/escape/ending remain open. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index dd90c4b..8525c32 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -33,7 +33,8 @@ "pending_visual": [ "New final Sigma arena wall extension/head-wrap correction" ], - "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify on the final owner build in pure684, including causalHP1 checks; exit/handoff remains separate." + "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify on the final owner build in pure684, including causalHP1 checks; exit/handoff remains separate.", + "next_priority": "Authentic postintro/normal fortress selection context, Lab2 alternate encounters, Kaiser escape/ending, remaining content/audio and final integration/runtime checks." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -57,14 +58,13 @@ { "sequence": "Powered factory elevator", "result": "Volt Catfish prerequisite supplied before native room setup. Riding/jumping on the elevator and native up input carried X from Y about 1696 to 887 without editing lift state." - } - ], - "partial_checks": [ + }, { - "sequence": "Lab 1 Godkarmachine branch", - "result": "Boss defeat and native fortress counter 1FAF increment observed; other branch/endings not qualified." + "sequence": "Godkarmachine, Press Disposer and Doppler combat/aftermath", + "result": "Live32HP originals, real projectile defeats after HP assistance, native1FAF0->1 or2->3. Separate checkpoint/position/prerequisite bypasses and unresolved normal next-stage selection are recorded in fortress_branch_followup." } ], + "partial_checks": [], "unverified": [ "Bit corrected floor human confirmation and exit (automated landing/combat/exit checks pass; human exit deferred)", "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", @@ -738,5 +738,82 @@ "remote_tracking": "Two normal central Beads pushes failed at their own remote-transfer deadlines. Local issue comments remain durable; no shared server interruption or timeout bypass.", "owner_notes_preserved": true, "previous_sha256": "ca0c6437beb75ca29af8cd7d2c12450408c7a63e77cb1503030e594652b0c415" + }, + "fortress_branch_followup": { + "game_code": "8a71e90abc20da46cb71bc6c6512a4d3e9c1f4dc", + "runtime_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "generation_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "sha256": "33949e75f0a39e2fa058021cc7b63b3f9de32666410affd4d2f72240f77c2fc7", + "previous_sha256": "28f17ee1382d3b70d3aa56e15fe694845309bdf836ca474c647d837a185ae5ef", + "mechanics": [ + { + "case": "god", + "enemy": 93, + "executable_sha256": "28f17ee1382d3b70d3aa56e15fe694845309bdf836ca474c647d837a185ae5ef", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-god-current-clear.json", + "passed": true + }, + { + "case": "press", + "enemy": 90, + "executable_sha256": "28f17ee1382d3b70d3aa56e15fe694845309bdf836ca474c647d837a185ae5ef", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-press-current-clear.json", + "passed": true + }, + { + "case": "doppler", + "enemy": 72, + "executable_sha256": "28f17ee1382d3b70d3aa56e15fe694845309bdf836ca474c647d837a185ae5ef", + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-doppler-current-clear.json", + "passed": true + } + ], + "margin_matrix": [ + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-god-native256.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-god-hybrid342.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-god-pure684.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-doppler-native256.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-doppler-hybrid342.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-doppler-pure684.json" + ], + "presentation": "Four explicit original locked-room descriptors share the existing Sigma BG1 wall-edge/BG2 containment policy: Press, Godkarmachine, Doppler and Sigma. No guest simulation or result changes.", + "presentation_evidence": "God/Doppler native256, hybrid342 and pure684:48 samples, each with exact native-view pixels,128KiB WRAM and64KiB VRAM. Native entire output unchanged.", + "regressions": [ + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-byte.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-factory.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-kaiser.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-hub.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-rematch.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-reset-press.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-fortress-password-reset.json" + ], + "lifecycle": "Native post-Doppler clear reaches the password screen after900frames; complete output and WRAM match the preceding executable.", + "states": { + "x3-kaiser-hit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\fortress-owner-states\\x3-kaiser-hit.sav", + "sha256": "1b4289e6feea678379a165f3eafdb54ddf70c8b876fb8f5873e30d3ab37b89fc", + "current_build_replay": { + "frames": 120, + "pixel_differences": 0, + "ram_differences": 0 + } + }, + "x3-bossrush-exit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\fortress-owner-states\\x3-bossrush-exit.sav", + "sha256": "d1d8e51af2afe8fa3eb87ba5c117769b0b1455dfcf4b967e3e467ccbe4233939", + "current_build_replay": { + "frames": 120, + "pixel_differences": 0, + "ram_differences": 0 + } + } + }, + "scope": "Full real-hit boss mechanics were replayed on preceding28f17ee; new33949e75 changes only room presentation. Current package has the paired scene, default/reset and current-build save/load checks above, not a falsely relabelled full-combat run.", + "remaining": [ + "Original Lab1 branch selection is bypassed by separate checkpoint2/3 setups; complete combat/aftermath passes separately.", + "Natural hub door and normal fortress next-stage selection remain unverified. Repeated Start after the password loads stage0; restoring native1EBF=FF alone did not repair setup. No port defect asserted and no speculative marker repair adopted.", + "Use an authentically completed intro/normal selection baseline before further handoff claims; Lab2 alternate encounters, Kaiser hit/lava escape/ending, content/audio and final integration/runtime gate remain open." + ], + "owner_notes_preserved": true } } From 895c44db56d921dab4d6848e142eee7277325889 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 06:11:23 -0700 Subject: [PATCH 18/40] docs: qualify native fortress progression and combined replay --- docs/WIDESCREEN.md | 60 +++++++++++++++-- docs/widescreen-trigger-audit.json | 103 +++++++++++++++++++++++++++-- 2 files changed, 152 insertions(+), 11 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index b7effbd..323ee9e 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -259,8 +259,58 @@ and has the paired checks above. Private evidence lists all bypasses. Checkpoint2/3 selection bypasses Lab 1's original branch fork. Position assists bypass ordinary corridor obstacles before Doppler's real door. -Normal fortress next-stage selection remains unverified: repeated Start -after the password loads stage0, and restoring the native fortress entry -marker alone did not resolve it. No game defect or speculative marker fix is -claimed. An authentically completed intro/normal-selection baseline is the -next setup investigation. Lab2 branches and Kaiser/escape/ending remain open. +The earlier fixture did not qualify normal fortress next-stage selection. +The clean native-context follow-up below supersedes that setup limitation; +no speculative marker or progression fix was adopted. + +### Native fortress progression follow-up (2026-10-27) + +Controller-only password entry and original stage selection now provide a +clean baseline with earlier progress and equipment initialized by the guest. +The reference password reaches normal stage select in hybrid342 and pure +native256. An independent Snes9x replay reaches the same screen with identical +64 KiB VRAM; an unchanged menu mode is normal while awaiting input. + +On current33949e75, the original checkpoint3 loader preserves this native +context and bypasses only Lab1 traversal/branch selection. Press starts at +32 HP; the main/trunk survive idle at assisted1HP, then real shots destroy +both. Original stage-clear, counter0->1, password, stage select and next +laboratory selection pass without progression writes. + +The native selection chooses stage14's Vile branch. Checkpoint2 bypasses +earlier traversal; right input then exercises the first door, descent, second +door and armor introduction. Actor99's real defeat creates on-foot Vile +actor97/sub2 at32HP. Each survives an idle check at1HP before real shots +produce its native defeat. Twenty-three B edges finish the postfight script; +the native stage-clear reaches counter1->2 and its password screen. Early +private captures provisionally named this encounter Volt; the observed second +form and corrected aggregate identify the Vile branch. Those filenames are +historical evidence, not alternate boss coverage. + +The next native selection enters stage12/counter2. The all-clear hub fixture +also now opens its real right door into the corridor. Original39:A2D0 caches +`1FDA==FF` into door prerequisite `1F5F` bit0 at initialization: supplying FF +after initialization leaves the cached gate locked. Reinitializing with the +prerequisite already present naturally clears it. Player-only flight reaches +the upper platform and native gravity lands atY1119 before real right input +opens the door. The eight earlier rematch results are an explicit prerequisite +bypass here, separate from the retained ca0 actual-eight-rematch proof. +The optional human hub check is retired; owner notes remain unchanged. + +Position assists then bypass ordinary corridor obstacles before Doppler's +original door. Native32HP, causal1HP idle check, real defeat and54 postfight +B edges reach counter2->3. Password and normal stage selection now enter +final stage13 without additional stage/counter/main-weapon writes. Its original +Zero approach/dialogue also returns control after18 B edges. + +This adds current-build combat and normal progression evidence without +claiming the skipped approaches or the other Lab2 branch. Kaiser/escape/ending +and built-runtime/other-consumer qualification remain open. + +The final title code8a71 also passes paired checks on combined engine2cb versus +ownera4: Byte420, factory360, God/Doppler/Press/Kaiser120 each, and the corrected +hub exit300 at342, native256 and interpreter684. All144 samples preserve the +complete presented image and128KiB WRAM; all three hub cases cross the door. +Compiler definitions confirm both trace builds use FULL audio history despite +the earlier cache-based SMALL/FULL inference. Performance remains a separate +measurement gate; these functional comparisons establish no speed claim. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 8525c32..ffcc505 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -8,12 +8,11 @@ ], "unverified": [ "Bit human floor/exit follow-up (automatic checks pass)", - "Boss Rush exit/next-stage handoff: automated approach is unresolved in matched native256 and wide684; not a confirmed widescreen defect", "Kaiser final hit, lava escape and endings", "Remaining fortress branches/full content inventory/independent audio", - "Current-main integration and performance gate" + "Current-main built runtime/other-consumer gate; X3 final combined output/RAM checks passed" ], - "next_cross_title_priority": "Pending focused visuals, optional Kaiser/actual all-clear hub exit assistance, remaining fortress branches and integration.", + "next_cross_title_priority": "Four focused selector segments remain: pending Serges/Ostrich/final-arena visuals and optional Kaiser hit; no further hub assistance is needed. Other Lab2 branch and final integration/runtime remain.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -28,19 +27,68 @@ "canvas_policy_update": { "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", "result": "X3 retains default-off source-canvas and VRAM selection options. All sampled342px presented pixels and128KiB WRAM match the accepted owner build in Byte right420 and factory right+jump60/up300. Accepted owner checks remain complete." + }, + "final_combined_current_title": { + "passed": true, + "game": "x3", + "title_code": "8a71e90abc20da46cb71bc6c6512a4d3e9c1f4dc", + "baseline_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "candidate_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "baseline_sha256": "33949e75f0a39e2fa058021cc7b63b3f9de32666410affd4d2f72240f77c2fc7", + "candidate_sha256": "d0d3cd444e65038b3ccd8daa817dbe70aa402b9c5fca88439a6602c137504260", + "comparison": "Complete presented output and128KiB WRAM at15-frame samples; specified controller input and health only. Corrected hub exit actually crosses door at all three widths.", + "cases": { + "byte": { + "passed": true, + "samples": 28 + }, + "factory": { + "passed": true, + "samples": 24 + }, + "god": { + "passed": true, + "samples": 8 + }, + "doppler": { + "passed": true, + "samples": 8 + }, + "press": { + "passed": true, + "samples": 8 + }, + "kaiser": { + "passed": true, + "samples": 8 + }, + "hub-exit": { + "passed": true, + "samples": 20 + }, + "hub-exit-256": { + "passed": true, + "samples": 20 + }, + "hub-exit-684": { + "passed": true, + "samples": 20 + } + }, + "performance": "Separate gate; compiler definitions establish both trace builds use AUDIO_TRACE_HISTORY=2 (FULL), despite earlier cache-based mismatch inference." } }, "pending_visual": [ "New final Sigma arena wall extension/head-wrap correction" ], - "bossrush": "All8 native transfers/real defeats/returns and cumulativeFF qualify on the final owner build in pure684, including causalHP1 checks; exit/handoff remains separate.", - "next_priority": "Authentic postintro/normal fortress selection context, Lab2 alternate encounters, Kaiser escape/ending, remaining content/audio and final integration/runtime checks." + "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", + "next_priority": "Other Lab2 branch, Kaiser escape/ending, skipped traversal/full content/audio and final integration/runtime checks. Clean native fortress progression to stage13 and prerequisite-assisted hub exit are now qualified." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", "release_framework_pin": "f68aa0fe8edae75cbc7d4b9473c71687b45ce702", "framework_provenance": "Checkout tree identical to release pin", - "rom_sha256": "65b03268afac296330e8ff8d60dd0825879e13eded658b37713c034a3bd074f1d7", + "rom_sha256": "65b03268afac296330e8ff8d60dd0825879e13ed658b37713c034a3bd074f1d7", "presentation": [ 342, 224 @@ -815,5 +863,48 @@ "Use an authentically completed intro/normal selection baseline before further handoff claims; Lab2 alternate encounters, Kaiser hit/lava escape/ending, content/audio and final integration/runtime gate remain open." ], "owner_notes_preserved": true + }, + "native_context_fortress_progress": { + "date": "2026-10-27", + "game_code": "8a71e90abc20da46cb71bc6c6512a4d3e9c1f4dc", + "engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "executable_sha256": "33949e75f0a39e2fa058021cc7b63b3f9de32666410affd4d2f72240f77c2fc7", + "clean_context": "Native controller password and original stage select; no result/gear RAM writes", + "passed": [ + "Reference password stage-select at342 and interpreter256; independent Snes9x64KiB VRAM matches", + "Current339 Press native32HP, idle survival after main/trunkHP1, actual shot defeats, nativecounter0->1", + "Original password -> stage select -> Lab2 stage14/counter1 without progression writes", + "Lab2 checkpoint2 first door/descent/second door, armor99 and on-foot Vile97/sub2 intro/AI/real defeats", + "Both Lab2 main forms start32HP and surviveHP1 idle before real damage", + "23 postfight B edges; original stage-clear/counter1->2 and password", + "Native Lab2 password/stage select enters stage12/counter2", + "All-clear prerequisite before original hub initialization clears cached door gate; actual right door opens into corridor", + "Doppler original door/intro, native32HP, causalHP1 idle check, real defeat and54 postfight B edges", + "Nativecounter2->3/password/stage select enters final stage13 with no new stage/counter/main-weapon writes", + "Player-assisted final approach triggers original Zero dialogue;18 B edges restore control" + ], + "bypasses": [ + "Password supplies earlier progress/equipment", + "Original checkpoint3 for Press and checkpoint2 for Lab2 bypass preceding traversal/branch approach", + "Player immunity/health/aiming position and bossHP1; no result/control/camera writes", + "Earlier eight rematch results supplied before hub loader; earlier ca0 actual8-rematch proof remains separate", + "Player-only flight to upper hub door platform and through ordinary corridor obstacles" + ], + "limits": [ + "Lab2 other branch remains unverified", + "These new combat runs are hybrid342; no new native256/684 combat claim", + "Raw early filenames say Volt; final aggregate corrects the branch to Vile", + "Native menus retain mode020001 while awaiting input; provisional hang diagnosis was disproved" + ], + "evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown", + "files": [ + "x3-native-password-control-result.json", + "x3-native-context-press-clear.json", + "x3-native-context-lab2-clear.json", + "x3-native-context-hub-exit.json", + "x3-native-context-doppler-clear.json", + "x3-native-context-final-zero.json" + ], + "setup_correction": "39:A2D0 caches1FDA==FF into1F5F bit0 during hub init. LateFF leaves gate locked; correct prerequisite order naturally unlocks it. Door approach lands atY1119, not inside the platform. Optional human hub check retired; notes unchanged." } } From e7e6c6c09de6e6b986ac3780e2fb41ed4e47652a Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 06:33:23 -0700 Subject: [PATCH 19/40] docs: record matched final-title runtime and save checks --- docs/WIDESCREEN.md | 9 ++++ docs/widescreen-trigger-audit.json | 85 +++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 323ee9e..8478814 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -314,3 +314,12 @@ complete presented image and128KiB WRAM; all three hub cases cross the door. Compiler definitions confirm both trace builds use FULL audio history despite the earlier cache-based SMALL/FULL inference. Performance remains a separate measurement gate; these functional comparisons establish no speed claim. + +Current combined-build Press save/load reproduces complete output and WRAM. +Six alternating paired360-frame live-Press samples match interpreter342, +software/dummy output, FULL trace history and optional coverage recordingOFF. +Time changes range from10.3% lower to22.0% higher (median3.7% lower): mixed +results within host variation are neutral/inconclusive. Separate earlier +coverageON samples are retained and are not pooled. X2 has its own workload +and results. Representative other-consumer/startup/memory qualification is +still open; no aggregate optimization or release-speed claim is made. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index ffcc505..0436943 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -10,7 +10,7 @@ "Bit human floor/exit follow-up (automatic checks pass)", "Kaiser final hit, lava escape and endings", "Remaining fortress branches/full content inventory/independent audio", - "Current-main built runtime/other-consumer gate; X3 final combined output/RAM checks passed" + "Representative other-consumer/startup/memory gate; paired X2/X3 functional/current-save and short per-game runtime samples recorded" ], "next_cross_title_priority": "Four focused selector segments remain: pending Serges/Ostrich/final-arena visuals and optional Kaiser hit; no further hub assistance is needed. Other Lab2 branch and final integration/runtime remain.", "shared_engine_regression": { @@ -82,7 +82,7 @@ "New final Sigma arena wall extension/head-wrap correction" ], "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", - "next_priority": "Other Lab2 branch, Kaiser escape/ending, skipped traversal/full content/audio and final integration/runtime checks. Clean native fortress progression to stage13 and prerequisite-assisted hub exit are now qualified." + "next_priority": "Other Lab2 branch, Kaiser escape/ending, skipped traversal/content/audio and representative other-consumer/startup/memory qualification. Paired final-title X2/X3 functional/current-save and short per-game runtime evidence is recorded." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -906,5 +906,86 @@ "x3-native-context-final-zero.json" ], "setup_correction": "39:A2D0 caches1FDA==FF into1F5F bit0 during hub init. LateFF leaves gate locked; correct prerequisite order naturally unlocks it. Door approach lands atY1119, not inside the platform. Optional human hub check retired; notes unchanged." + }, + "final_combined_engine_followup": { + "functional": { + "passed": true, + "game": "x3", + "title_code": "8a71e90abc20da46cb71bc6c6512a4d3e9c1f4dc", + "baseline_engine": "a4e30664c078a2ee33ef61625cc73f5f1d546841", + "candidate_engine": "2cb5d796d11ff5273db89266af0d7734d36f8b18", + "baseline_sha256": "33949e75f0a39e2fa058021cc7b63b3f9de32666410affd4d2f72240f77c2fc7", + "candidate_sha256": "d0d3cd444e65038b3ccd8daa817dbe70aa402b9c5fca88439a6602c137504260", + "comparison": "Complete presented output and128KiB WRAM at15-frame samples; specified controller input and health only. Corrected hub exit actually crosses door at all three widths.", + "cases": { + "byte": { + "passed": true, + "samples": 28 + }, + "factory": { + "passed": true, + "samples": 24 + }, + "god": { + "passed": true, + "samples": 8 + }, + "doppler": { + "passed": true, + "samples": 8 + }, + "press": { + "passed": true, + "samples": 8 + }, + "kaiser": { + "passed": true, + "samples": 8 + }, + "hub-exit": { + "passed": true, + "samples": 20 + }, + "hub-exit-256": { + "passed": true, + "samples": 20 + }, + "hub-exit-684": { + "passed": true, + "samples": 20 + } + }, + "performance": "Separate gate; compiler definitions establish both trace builds use AUDIO_TRACE_HISTORY=2 (FULL), despite earlier cache-based mismatch inference." + }, + "current_build_save_load": { + "case": "integration-final-x3-current-save", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "runtime": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\integration-final-x3-runtime-coverage-off.json", + "workload": "Original live Press Disposer", + "samples": 6, + "timed_frames_per_sample": 360, + "median_time_change_percent": -3.704280523257192, + "paired_range_percent": [ + -10.308538282390245, + 21.9702987485229 + ], + "median_fps": { + "baseline": 190.02016941775696, + "candidate": 196.69173766437532 + }, + "assessment": "Neutral/inconclusive: mixed paired results within large host variation; no proven improvement or reproducible regression.", + "qualification": "Pure interpreter342/software/dummy output, audio emulation, traceFULL, optional coverage recordingOFF in both. One workload per game; separate earlier coverageON samples are not pooled." + }, + "host": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\integration-final-runtime-host.json", + "remaining": [ + "Pending individual owner visuals and optional Kaiser hit/escape/endings", + "Other Lab2 branch and skipped traversal/content/audio", + "Representative other-consumer/startup/memory gate" + ], + "promotion": "One current canonical owner binary per game remains unchanged on enginea4. No merge or release. Selector closed with four focused segments; optional hub assistance retired." } } From a0142c8e13f1f2e4c526784955654356faecbe92 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 08:12:55 -0700 Subject: [PATCH 20/40] fix(widescreen): contain Lab2 room and boss canvas --- docs/WIDESCREEN.md | 25 +++++++++++ docs/widescreen-trigger-audit.json | 68 +++++++++++++++++++++++++++++- snesrecomp | 2 +- src/x3_rtl.c | 55 +++++++++++++++++++----- 4 files changed, 136 insertions(+), 14 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 8478814..d08d527 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -323,3 +323,28 @@ results within host variation are neutral/inconclusive. Separate earlier coverageON samples are retained and are not pooled. X2 has its own workload and results. Representative other-consumer/startup/memory qualification is still open; no aggregate optimization or release-speed claim is made. + +### Other Lab2 route and room boundaries (2026-10-27) + +The other native Lab2 selection now has separate coverage. The earlier Vile +prerequisite is supplied before original stage selection; checkpoint2 bypasses +the approach. Native256 and interpreter684 follow the same780-frame original +door/descent/introduction timeline, create actor4A at32HP, and advance the native +fortress counter1->2 after an assisted1HP idle check and a real shot. No current +success, camera, control or other boss-part HP is written. + +This route revealed a512px room whose expanded margins exposed a neighboring +corridor, black void and a wrapped BG2 boss copy. BG1 now reflects only beyond +the authored room. A shared PPU clip band contains BG2 using BG1 actual scroll, +retaining the real body in genuine offscreen room columns. It preserves native +camera-shake pixels and clears with the normal frame-local presentation policy. + +Final758756b9 passes72 paired samples at256/342/684, centered and at both camera +edges: every native/authored-room pixel,128KiB WRAM and64KiB VRAM matches339. +The900-frame entrance probe compares rendered output and observes no correction +while the entrance door is visible. The full-health entrance, real-shot clear +and current-build save/load pass. Eight unrelated scenes preserve complete +output and WRAM over112 paired samples, including accepted Byte/factory, +God/Press/Doppler/Kaiser, the corrected hub exit and the other Vile route. +These checks do not qualify skipped traversal, the Kaiser finishing hit, +escape/ending, independent audio or the remaining human visuals. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 0436943..34283fb 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -12,7 +12,7 @@ "Remaining fortress branches/full content inventory/independent audio", "Representative other-consumer/startup/memory gate; paired X2/X3 functional/current-save and short per-game runtime samples recorded" ], - "next_cross_title_priority": "Four focused selector segments remain: pending Serges/Ostrich/final-arena visuals and optional Kaiser hit; no further hub assistance is needed. Other Lab2 branch and final integration/runtime remain.", + "next_cross_title_priority": "Four focused selector segments remain: Serges front, Ostrich entrance and X2/X3 final-arena visuals plus optional Kaiser hit. Accepted scenes are not repeated.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -82,7 +82,7 @@ "New final Sigma arena wall extension/head-wrap correction" ], "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", - "next_priority": "Other Lab2 branch, Kaiser escape/ending, skipped traversal/content/audio and representative other-consumer/startup/memory qualification. Paired final-title X2/X3 functional/current-save and short per-game runtime evidence is recorded." + "next_priority": "Kaiser finishing hit/escape/ending, skipped traversal/content/audio and broader consumer/startup/memory qualification. Both Lab2 branches now have actual entrance/death/native-counter evidence." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -987,5 +987,69 @@ "Representative other-consumer/startup/memory gate" ], "promotion": "One current canonical owner binary per game remains unchanged on enginea4. No merge or release. Selector closed with four focused segments; optional hub assistance retired." + }, + "lab2_alternate_world_clip_followup": { + "engine": "0e45123d068a082316b3db0d9007d30cb3015104", + "branch": "qa/widescreen-triggers-20261026", + "executable": "758756b94511a17ee55b825b39f150f2307a2fe137f6c332f431860e0c7ae5c4", + "baseline": "33949e75f0a39e2fa058021cc7b63b3f9de32666410affd4d2f72240f77c2fc7", + "stage": 11, + "checkpoint": 2, + "actor": 74, + "native_prerequisites": "Earlier Vile prerequisite supplied before original menu selection; native stage/counter are preserved. Original checkpoint2 skips prior traversal.", + "mechanics": { + "passed": true, + "original_intro_frames": 780, + "evidence": "x3-lab2-world-clip-final-mechanics-684.json", + "native_counter": "1->2 after main-only HP1 idle survival and a real shot; other part HP/results/camera/control untouched" + }, + "width_mechanics": { + "evidence": "x3-lab2-alternate-width-matrix.json", + "scope": "Previous339: native256 and interpreter684 have identical28-sample critical entrance timeline, actual shot and native counter transition. Final758 repeats the684 mechanics." + }, + "presentation": { + "passed": true, + "cases": 9, + "samples": 72, + "widths": [ + 256, + 342, + 684 + ], + "evidence": "x3-lab2-world-clip-final-matrix.json", + "preserved": "All native and authored512px room pixels,128KiB WRAM,64KiB VRAM; changes only beyond room walls" + }, + "door": { + "passed": true, + "frames": 900, + "samples": 150, + "last_door_visible_frame": 456, + "first_rendered_change_frame": 618, + "overlap_frames": [], + "evidence": "lab2-world-clip-door-overlap.json", + "method": "Actual presented output; ephemeral policy fields at frame boundary are not used as activation evidence" + }, + "regressions": { + "passed": true, + "cases": 8, + "samples": 112, + "evidence": "x3-world-clip-regressions.json", + "preserved": "Full presented output and128KiB WRAM" + }, + "current_build_save_load": { + "case": "x3-lab2-world-clip-final", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "engine_tests": "Five production PPU C fixtures and3 provider/extra-object Python tests pass. Rendered clip coverage includes4bpp/2bpp, large tiles, mosaic, changed reference phase, native camera shake, reset and invalid reference.", + "first_experiment": "BG1 reflection alone left a wrapped BG2 boss at edge pans; rejected. Source/status and raw plane diagnosis retained separately.", + "remaining": [ + "Kaiser finishing hit, escape and endings", + "Skipped traversal/content inventory and independent audio", + "Four focused human visual checks", + "Combined/other-consumer qualification" + ], + "promotion": "Owner binaries and notes unchanged while combined validation and current-state refresh are prepared; no merge/release." } } diff --git a/snesrecomp b/snesrecomp index a4e3066..0e45123 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit a4e30664c078a2ee33ef61625cc73f5f1d546841 +Subproject commit 0e45123d068a082316b3db0d9007d30cb3015104 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 2c189ff..1bf3ddc 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -290,33 +290,66 @@ void X3ConfigureWsHud(void) { /* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); - /* Keep fixed fortress arenas' native pixels intact and continue their wall + /* Keep authored fortress arenas' native pixels intact and continue their wall * edges into the gutters. The BG2 Kaiser head is a circular object canvas, * so it must stay within the room rather than echo beyond the side walls. * These presentation fields reset each frame; the escape shaft keeps its * normal streaming policy as soon as the original bounds unlock. */ static const struct { uint8_t stage; + uint8_t checkpoint; /* 255 = any */ uint8_t bounds[10]; + bool moving_top; + uint16_t world_left, world_right; /* BG1's unwrapped PPU map phase */ } fixed_arenas[] = { - {10, {0x00,0x16,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x16}}, /* Press */ - {10, {0x00,0x16,0x00,0x07,0x00,0x07,0x00,0x16,0x00,0x16}}, /* Godkarmachine */ - {12, {0x00,0x0a,0x00,0x04,0x00,0x04,0x00,0x0a,0x00,0x0a}}, /* Doppler */ - {13, {0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07}}, /* Sigma */ + {10,255,{0x00,0x16,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x16},false,0,0}, /* Press */ + {10,255,{0x00,0x16,0x00,0x07,0x00,0x07,0x00,0x16,0x00,0x16},false,0,0}, /* Godkarmachine */ + {12,255,{0x00,0x0a,0x00,0x04,0x00,0x04,0x00,0x0a,0x00,0x0a},false,0,0}, /* Doppler */ + {13,255,{0x00,0x07,0x00,0x0a,0x00,0x0a,0x00,0x07,0x00,0x07},false,0,0}, /* Sigma */ + /* Lab2's water room is512px wide and its ceiling scrolls during the + * introduction/fight. Preserve real room art in the gutters; reflect + * only beyond world4352..4864, whose PPU map phase is256..768. */ + {11,2,{0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12},true,256,768}, }; - bool fixed_arena = false; + int arena = -1; for (size_t i = 0; i < sizeof(fixed_arenas)/sizeof(fixed_arenas[0]); ++i) { if (g_ram[0x1fae] == fixed_arenas[i].stage && - !memcmp(g_ram+0x1e68,fixed_arenas[i].bounds,sizeof(fixed_arenas[i].bounds))) { - fixed_arena = true; + (fixed_arenas[i].checkpoint == 255 || + g_ram[0x1fb5] == fixed_arenas[i].checkpoint) && + !memcmp(g_ram+0x1e68,fixed_arenas[i].bounds,2) && + !memcmp(g_ram+0x1e6c,fixed_arenas[i].bounds+4,6) && + (fixed_arenas[i].moving_top || + !memcmp(g_ram+0x1e6a,fixed_arenas[i].bounds+2,2))) { + arena = (int)i; break; } } - if (g_ws_active && g_ppu && fixed_arena && + if (g_ws_active && g_ppu && arena >= 0 && g_ram[0xd1] == 4 && (g_ppu->bgmode & 7) == 1 && (g_ppu->bgXsc[0] & 0xfc) == 0x50 && (g_ppu->bgXsc[1] & 0xfc) == 0x58) { - PpuSetWidescreenLayerElasticSplitBandSlot(g_ppu,0,0,0,224,0,1,255,256); - PpuSetWidescreenLayerClamp(g_ppu,2); + if (fixed_arenas[arena].world_right > fixed_arenas[arena].world_left) { + int left = fixed_arenas[arena].world_left; + int right = fixed_arenas[arena].world_right; + const int scroll = g_ppu->hScroll[0]; + /* An entirely in-room viewport already has genuine art everywhere. */ + if (scroll-(int)g_ppu->extraLeftCur >= left && + scroll+256+(int)g_ppu->extraRightCur <= right) + return; + /* BG2 contains the boss on a circular canvas. Keep the legitimate body + * in the room's offscreen columns, but reject its wrapped copies. */ + PpuSetWidescreenLayerWorldClipBand(g_ppu,1,0,224,0, + (uint16_t)left,(uint16_t)right); + /* A native camera shake may briefly expose a few columns beyond the + * authored wall. Retain that authentic view; only synthesize overflow. + * Use the actual PPU scroll, including its raster/quake phase. */ + if (left > scroll) left = scroll; + if (right < scroll+256) right = scroll+256; + PpuSetWidescreenLayerWorldMirrorBand(g_ppu,0,0,224, + (uint16_t)left,(uint16_t)right); + } else { + PpuSetWidescreenLayerElasticSplitBandSlot(g_ppu,0,0,0,224,0,1,255,256); + PpuSetWidescreenLayerClamp(g_ppu,2); + } } } From 929a88dea72982636d5af5743fbca549c62f208e Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 08:41:55 -0700 Subject: [PATCH 21/40] build: pin direct bounded-canvas renderer --- docs/WIDESCREEN.md | 14 ++++++++++++++ snesrecomp | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index d08d527..b64302b 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -348,3 +348,17 @@ output and WRAM over112 paired samples, including accepted Byte/factory, God/Press/Doppler/Kaiser, the corrected hub exit and the other Vile route. These checks do not qualify skipped traversal, the Kaiser finishing hit, escape/ending, independent audio or the remaining human visuals. + +The first correct clip had a measurable compositing cost at the widest camera +edge, so it was held from the owner package. Engine d0968cc reuses existing +hardware-window spans to draw contiguous room clips directly; mosaic, disjoint +rooms and source anchors retain the original compositor. Final2833b6b5 preserves +the entire presented picture and WRAM through72 pan samples at256/342/684 and +repeats the original full-health entrance, real-shot clear and native counter +transition. Six matched684 edge pairs all take less time than first-correct758; +X2 default-path results are small and mixed within host variation, hence +neutral/inconclusive. These are separate per-game protocol measurements, +not release benchmarks. Capture/Pause and the current-build Kaiser restart +also pass. Raw samples and identities are tracked under optimization campaign +beads-2wy8.1 and owning engine issue beads-8wg.2.151; broader consumer/startup/ +memory qualification and the human final-room checks remain open. diff --git a/snesrecomp b/snesrecomp index 0e45123..d0968cc 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 0e45123d068a082316b3db0d9007d30cb3015104 +Subproject commit d0968ccfc328fd471a2bd851c35cab6fd8c41c8d From 49f2e6983f5cdab4225f6cb0ef888b0deebc0e89 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 08:44:19 -0700 Subject: [PATCH 22/40] docs: record final Lab2 renderer and runtime qualification --- docs/widescreen-trigger-audit.json | 95 +++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 34283fb..68c4896 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -82,7 +82,15 @@ "New final Sigma arena wall extension/head-wrap correction" ], "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", - "next_priority": "Kaiser finishing hit/escape/ending, skipped traversal/content/audio and broader consumer/startup/memory qualification. Both Lab2 branches now have actual entrance/death/native-counter evidence." + "next_priority": "Kaiser finishing hit/escape/ending, skipped traversal/content/audio and broader consumer/startup/memory qualification. Both Lab2 branches now have actual entrance/death/native-counter evidence.", + "current_owner_build": { + "sha256": "2833b6b55bca185cb5db6e553e06840a6249cabb5e6e27aa4f5532570fb01dd1", + "engine": "d0968ccfc328fd471a2bd851c35cab6fd8c41c8d", + "title_code": "a0142c8e13f1f2e4c526784955654356faecbe92", + "title_repository_head": "929a88dea72982636d5af5743fbca549c62f208e", + "qualification": "lab2_alternate_world_clip_followup.direct_renderer_followup", + "note": "Prior individual acceptance remains valid. Four focused human visuals remain; selector closed. No shared-engine merge/release." + } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -1050,6 +1058,89 @@ "Four focused human visual checks", "Combined/other-consumer qualification" ], - "promotion": "Owner binaries and notes unchanged while combined validation and current-state refresh are prepared; no merge/release." + "promotion": "First-correct758 was never promoted: its measured runtime cost led to the direct-renderer follow-up. Current owner2833 is the verified direct build; see direct_renderer_followup.", + "first_correct_build_promotion": "First-correct758 was held after a runtime cost was demonstrated. The direct renderer follow-up supersedes it for owner delivery.", + "direct_renderer_followup": { + "passed": true, + "executable": "2833b6b55bca185cb5db6e553e06840a6249cabb5e6e27aa4f5532570fb01dd1", + "engine": "d0968ccfc328fd471a2bd851c35cab6fd8c41c8d", + "title_repository_head": "929a88dea72982636d5af5743fbca549c62f208e", + "title_c_code": "a0142c8e13f1f2e4c526784955654356faecbe92", + "combined_engine": "95ad5c108b2c6ad806485b59321df433ad28c4de", + "campaign": "beads-2wy8.1", + "owning_engine_issue": "beads-8wg.2.151", + "scope": "Correctness feature plus direct draw for contiguous non-mosaic BG room clips. Disjoint rooms, mosaic and anchors retain the working isolated fallback. Portable C; no CPU/OS-specific dependency.", + "exact_output": { + "evidence": "world-clip-direct-final-matrix.json", + "widths": [ + 256, + 342, + 684 + ], + "samples": 72, + "result": "Full presented picture and128KiB WRAM identical to first-correct758 through camera pans. First-correct758 separately preserves all native/authored512px-room pixels and64KiB VRAM against339." + }, + "real_mechanics": { + "evidence": "x3-lab2-direct-final-mechanics-684.json", + "result": "Original780-frame full-health entrance, main-only1HP idle survival, actual shot and native counter1->2. Critical28-sample timeline matches first-correct758; no current success/camera/control writes." + }, + "combined": { + "x2": "fb2eb8f2e8600eab8ef195276c3412f9f28a7e9f6f64efa0cf1eeefed69a80ba", + "x3": "2bd74ffd01fa60b61d5dfdb5cd35bd7f585e4a9b890b2db9ee9d84c1e32ff4e3", + "result": "X2 rocket/Serges/Ostrich full output and WRAM match. X3 sequential24-sample684 pans match full output/128KiB WRAM/64KiB VRAM. Both current-save/load checks pass." + }, + "current_kaiser_and_capture": "New2833 state has exactly one active primary02 actor95 at1HP. Full current-build Save/Pause/Capture restart replays120frames with identical image/WRAM and error-free capture metadata.", + "runtime": { + "x2": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\world-clip-direct-x2-runtime.json", + "pairs": 6, + "package": "Engine direct clipd0968cc on combined95ad5c1 versus identical-correctness combined29500a1/0e45123; title739 unchanged, clip disabled. Optimization campaign2wy8.1, owner8wg.2.151.", + "configuration": "Matched240-frame original AI workloads, pure interpreter, software/dummy video/audio, unthrottled diagnostic builds; serial alternating order; no input/cheat writes during timed intervals", + "median_time_change_percent": 1.1398076654342004, + "paired_range_percent": [ + -1.5263196626484787, + 3.825718874880857 + ], + "candidate_minimum_fps": 132.04383723221306, + "assessment": "Neutral/inconclusive: small mixed changes within host variation; no proven win or reproducible regression" + }, + "x3": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\world-clip-direct-final-runtime-684.json", + "pairs": 6, + "package": "Direct window-span crop versus first-correct isolated clip0e45123; same titlea0142c8, preserved output and guest RAM. Engine optimization issue8wg.2.151, campaign2wy8.1.", + "configuration": "Matched240-frame live Lab2 boss AI at right camera stop; default hybrid684/software/dummy video/audio, coverageOFF, traceFULL; serial alternating order; same correctness and no input/cheat writes in timed interval.", + "median_time_change_percent": -12.349196992515687, + "paired_range_percent": [ + -23.7186808940441, + -5.983616998463526 + ], + "candidate_minimum_fps": 114.65903317413894, + "assessment": "Workload-local positive: all6 paired times lower; no broader/release claim" + } + }, + "host_caveat": "Other owner PSX compiler jobs were observed. Retain paired results/variation; do not claim isolated release throughput or pool games.", + "remaining": [ + "Four focused owner visuals, optional Kaiser finishing hit/escape/ending", + "Skipped traversal/content and independent audio", + "Representative other-consumer/startup/memory qualification" + ], + "promotion": "Qualified for the existing X3 owner QA replacement; no shared-engine merge, release or campaign completion.", + "publication": { + "owner_sha256": "2833b6b55bca185cb5db6e553e06840a6249cabb5e6e27aa4f5532570fb01dd1", + "engine": "d0968ccfc328fd471a2bd851c35cab6fd8c41c8d", + "title_code": "929a88dea72982636d5af5743fbca549c62f208e", + "current_state": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\handoff-states\\x3-kaiser-hit.sav", + "sha256": "9c7cd61cff1589160ed8736fb4071eb7120d623d018f6ee1b15032def4c5a58d", + "kaiser": "Exactly one active primary02 actor95 atHP1, alive before the optional real finishing hit" + }, + "capture": "Current-build Pause/Capture produced full restart state, PNG/RAM/VRAM/OAM/L3 and error-free metadata; full captured state replays120frames with identical output and WRAM.", + "owner_notes_settings_saves_preserved": true, + "selector": "Closed; four existing focused segments; accepted checks not repeated", + "runtime_assessment": "Direct-window optimization versus the identical-correctness isolated clip: workload-local X3 positive, X2 small mixed neutral/inconclusive. Per-game data is separate; protocol headroom is not a release benchmark. Broader consumer/startup/memory qualification stays open.", + "promotion": "Verified X3 direct-clip replacement and current-build Kaiser state published; X2 remains the exact634 accepted-scene build. Four selector segments, normal windows/audio/input settings and owner notes preserved. Selector remains closed.", + "raw_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\world-clip-publication.json" + } + } } } From e0fb303780fe8b0ec938d579409c3d7d521b7ac6 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 09:52:15 -0700 Subject: [PATCH 23/40] build: qualify current engine base for X3 widescreen audit --- docs/WIDESCREEN.md | 19 +++ docs/widescreen-trigger-audit.json | 192 ++++++++++++++++++++++++++++- snesrecomp | 2 +- 3 files changed, 210 insertions(+), 3 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index b64302b..34b0a43 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -362,3 +362,22 @@ not release benchmarks. Capture/Pause and the current-build Kaiser restart also pass. Raw samples and identities are tracked under optimization campaign beads-2wy8.1 and owning engine issue beads-8wg.2.151; broader consumer/startup/ memory qualification and the human final-room checks remain open. + +### Refreshed engine base (2026-10-27) + +Reviewed engine0095609 is rebased onto main5ac4b98 and has the same tracked +tree as compiled combinede772aca and integrationa99e2fc. The title now pins +this engine. New buildc3d20fc6 passes156 paired full-picture/WRAM samples +against preserved95ad, including Byte/factory, the fortress rooms, hub exits +and684px Lab2 pans. Its sampled Press PCM and full SPC state match byte for +byte in default and pure execution. Current save/load, Pause/Capture and the +refreshed live1HP Kaiser setup replay exactly. + +The package selects native APU time and SLICE8 CRC with the standard title +renderer. Six paired240-frame samples in each execution mode are small and +mixed within host variation: neutral/inconclusive, with no broader speed claim. +Warm startup and memory costs are effectively unchanged. Earlier combat and +renderer proofs keep their original binary identities. The four pending +human checks are unchanged; accepted Byte/doors/factory checks are preserved. +Kaiser finishing hit/escape/ending, skipped content/independent audio and +broader-consumer follow-up remain open. Exact data is in `new_main_qualification`. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 68c4896..1886337 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -10,7 +10,7 @@ "Bit human floor/exit follow-up (automatic checks pass)", "Kaiser final hit, lava escape and endings", "Remaining fortress branches/full content inventory/independent audio", - "Representative other-consumer/startup/memory gate; paired X2/X3 functional/current-save and short per-game runtime samples recorded" + "Broader other-consumer follow-up; current X2/X3 new-base output/state/audio/startup/memory/runtime gates passed without a speed claim" ], "next_cross_title_priority": "Four focused selector segments remain: Serges front, Ostrich entrance and X2/X3 final-arena visuals plus optional Kaiser hit. Accepted scenes are not repeated.", "shared_engine_regression": { @@ -90,7 +90,8 @@ "title_repository_head": "929a88dea72982636d5af5743fbca549c62f208e", "qualification": "lab2_alternate_world_clip_followup.direct_renderer_followup", "note": "Prior individual acceptance remains valid. Four focused human visuals remain; selector closed. No shared-engine merge/release." - } + }, + "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -1142,5 +1143,192 @@ "raw_evidence": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\world-clip-publication.json" } } + }, + "new_main_qualification": { + "status": "automated X2/X3 gate passed", + "compiled_engine": "e772aca74d06cef9435df2f34cda1689329b19c4", + "reviewed_engine": "0095609940bc3a304da8c70f2dcab79264bbb8ab", + "integration": "a99e2fc0b9ff192d3a7302d02409c64e32f7cf24", + "base": "5ac4b98e065b668ed77b65fa6342ec296b8b9e23", + "exact_source_tree": "396f26717c1bf151b0e110950c5fd5f179c1823a", + "source_equivalence": "Compilede772, rebased PR0095609 and integrationa99e2fc have identical complete tracked trees; git diff--exit-code and tree hashes verified. Rebased push guarded with the reviewed908346c remote head.", + "components": "Five production PPU fixtures plus native raster ownership/readback, APU scalar/native and CRC byte/slice contracts pass on the new combined source.", + "reuse": "Existing beads-8wg.2.154/current5ac qualification for MMX, SMW, Super Metroid and F-Zero is retained separately. No fresh combined all-consumer run is claimed.", + "limits": [ + "Single shared Windows x64 host; muted software/debug protocol costs, not isolated release frame-time benchmarks", + "Matched scalar game audio is not independent original-game soundtrack/SFX coverage", + "Earlier actual combat/fortress proofs retain their original binary identities; these comparisons do not relabel them" + ], + "remaining": [ + "Four focused human visuals and optional Kaiser finishing hit", + "Kaiser escape/ending, skipped traversal/content and independent audio", + "Broader consumer follow-up using existing campaign evidence" + ], + "promotion": "Fresh four current-build setups prepared; owner profiles not yet replaced by this record. No merge or release.", + "game": { + "executable": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\integration-build-x3\\MegaManX3SNESRecomp.exe", + "sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "title_code": "a0142c8e13f1f2e4c526784955654356faecbe92", + "compiled_title_repository_head": "49f2e6983f5cdab4225f6cb0ef888b0deebc0e89", + "package": "Standard title renderer with shared native APU time and SLICE8 CRC; HLE desktop frame staging. These games do not receive the MMX/SM custom native raster consumer package.", + "actual_defines": { + "APU_NATIVE": 1, + "CRC32_SLICES": 8, + "AUDIO_TRACE_HISTORY": 2 + }, + "functional": { + "passed": true, + "cases": { + "byte": 28, + "factory": 24, + "god": 8, + "press": 8, + "doppler": 8, + "kaiser": 8, + "hub": 20, + "vile": 8, + "lab2-684": 24, + "hub-256": 20 + }, + "samples": 156, + "preserved": "Complete presented image and128KiB WRAM at15-frame samples; original controlled input/health only." + }, + "default_functional": null, + "audio": { + "pure": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3-press-audio.json", + "sample_frames": 128161, + "rate": 32040, + "pcm_sha256": "48ba2e6267cbd2d55122a8175389c3ead4f763122664cf066b94ab7b27afb9b3", + "peak": 20079, + "spc_before_after_identical": true, + "apu_time_implementation": "NATIVE", + "actual_guest_sync_cycles": 0 + }, + "default": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3-default-audio.json", + "sample_frames": 128246, + "rate": 32040, + "pcm_sha256": "ff1666749dffbcffa8620a0887336941ea5f53e4b96205b77a63b63132670545", + "peak": 20152, + "spc_before_after_identical": true, + "apu_time_implementation": "NATIVE", + "actual_guest_sync_cycles": 64241 + } + }, + "current_build_save_load": { + "case": "incoming-main-x3-current", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "current_build_capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-capture-check\\review-captures\\incoming-main-x3-kaiser-20261027-091351-672441.png", + "metadata_errors": {}, + "replay": { + "case": "incoming-main-x3-kaiser-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3\\saves\\save1.sav", + "sha256": "b7d89b261a8c3de4635dfa0a9a43eb02d8eb223b7d5811122623ae30d051a1dc", + "frame": 11500, + "tag": { + "segment": "incoming-main-x3-kaiser", + "binary_sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "engine": "e772aca74d06cef9435df2f34cda1689329b19c4" + }, + "utc": "2026-10-27T16:13:51.672441+00:00" + } + }, + "runtime": { + "pure": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3-runtime.json", + "pairs": 6, + "package": "New main5ac/e772: native APU time +SLICE8 CRC, standard title renderer; previous95ad scalar APU +byte CRC. Both HLE desktop frame staging, FULL trace, coverageOFF, pure342 software/dummy video/audio with host volume0.", + "configuration": "Matched240-frame original AI workloads, pure interpreter, software/dummy video/audio, unthrottled diagnostic builds; serial alternating order; no input/cheat writes during timed intervals", + "median_time_change_percent": 1.261672882034004, + "range_percent": [ + -4.970448511301051, + 5.753582020656167 + ], + "minimum_candidate_fps": 164.7577988306318, + "assessment": "Neutral/inconclusive: mixed changes within shared-host variation; no proven win or reproducible regression. Profiles and games are not pooled." + }, + "default": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3-default-runtime.json", + "pairs": 6, + "package": "Candidate e772/main5ac native APU time +SLICE8 CRC with standard title renderer; baseline95ad scalar APU +byte CRC, same title and frame staging. Separate from pure-interpreter samples.", + "configuration": "Matched240-frame original AI, default hybrid execution, widescreen342, HLE frame staging, FULL trace, optional coverageOFF, software/dummy output with audio emulation and volume0; serial alternating order; no input/cheat writes in timed interval.", + "median_time_change_percent": -3.4252673903568285, + "range_percent": [ + -5.279625640247065, + 1.1514821542149445 + ], + "minimum_candidate_fps": 204.13771845626232, + "assessment": "Neutral/inconclusive: mixed changes within shared-host variation; no proven win or reproducible regression. Profiles and games are not pooled." + } + }, + "resource_costs": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3-launch-costs.json", + "identities": { + "candidate": { + "sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "executable_bytes": 140517235 + }, + "baseline": { + "sha256": "2bd74ffd01fa60b61d5dfdb5cd35bd7f585e4a9b890b2db9ee9d84c1e32ff4e3", + "executable_bytes": 140505366 + } + }, + "medians": { + "baseline": { + "startup_seconds": 0.6562637999886647, + "rss": 127254528, + "private": 3837022208 + }, + "candidate": { + "startup_seconds": 0.66311309998855, + "rss": 124940288, + "private": 3837026304 + } + }, + "assessment": "Warm debug startup/RSS/private costs effectively unchanged. Approximately3.57GiB private commitment is shared by both diagnostic builds; not a release footprint claim.", + "scope": "Startup until first debug-ready frame; protocol/polling overhead included. RSS/private are observed costs, not an isolated cold-start or release benchmark." + } + }, + "states": { + "x3-kaiser-hit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-owner-states\\x3-kaiser-hit.sav", + "sha256": "8af5876fcb9cb66b565a4d7f697e927a1d1cf54f8a3abb6b418fc0a9c96fc2fc", + "binary": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "info": { + "frame": 11502, + "mode": "020404000000000e", + "stage": "000d0300000000020001", + "player": "000200023e410780", + "x": 1857, + "y": 2735, + "hp": 16, + "camera": [ + 1792, + 2560 + ], + "bounds": "0007000a000a00070007f8ff00000000000a0007", + "event": "00000000000000000000000000000000000000000000000003000103000000580d0000040000000000000000000000001811000000000000000100000000000000000000480033010200010090000000" + }, + "current_build_replay": { + "case": "incoming-handoff-x3-kaiser-hit", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + } + } } } diff --git a/snesrecomp b/snesrecomp index d0968cc..0095609 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit d0968ccfc328fd471a2bd851c35cab6fd8c41c8d +Subproject commit 0095609940bc3a304da8c70f2dcab79264bbb8ab From ac916f323baf2b78751db9d1060b1d0de032e189 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 09:58:32 -0700 Subject: [PATCH 24/40] docs: record current X3 review build publication --- docs/widescreen-trigger-audit.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 1886337..76f9e0a 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -84,12 +84,14 @@ "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", "next_priority": "Kaiser finishing hit/escape/ending, skipped traversal/content/audio and broader consumer/startup/memory qualification. Both Lab2 branches now have actual entrance/death/native-counter evidence.", "current_owner_build": { - "sha256": "2833b6b55bca185cb5db6e553e06840a6249cabb5e6e27aa4f5532570fb01dd1", - "engine": "d0968ccfc328fd471a2bd851c35cab6fd8c41c8d", + "sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "engine": "0095609940bc3a304da8c70f2dcab79264bbb8ab", + "compiled_engine": "e772aca74d06cef9435df2f34cda1689329b19c4", + "source_tree": "396f26717c1bf151b0e110950c5fd5f179c1823a", + "title_pin": "e0fb303780fe8b0ec938d579409c3d7d521b7ac6", "title_code": "a0142c8e13f1f2e4c526784955654356faecbe92", - "title_repository_head": "929a88dea72982636d5af5743fbca549c62f208e", - "qualification": "lab2_alternate_world_clip_followup.direct_renderer_followup", - "note": "Prior individual acceptance remains valid. Four focused human visuals remain; selector closed. No shared-engine merge/release." + "source": "new_main_qualification", + "owner_data_unchanged": true }, "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain." }, @@ -1164,7 +1166,7 @@ "Kaiser escape/ending, skipped traversal/content and independent audio", "Broader consumer follow-up using existing campaign evidence" ], - "promotion": "Fresh four current-build setups prepared; owner profiles not yet replaced by this record. No merge or release.", + "promotion": "One verified current executable per owner title, normal untouched window/audio/input configuration. No merge/release or repeated accepted human handoff.", "game": { "executable": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\integration-build-x3\\MegaManX3SNESRecomp.exe", "sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", From 750e42929a7ffd6cd4dd6b81fd986ad205bc0a72 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 10:39:35 -0700 Subject: [PATCH 25/40] docs: qualify native final-room and Sigma transition --- docs/WIDESCREEN.md | 21 +++++ docs/widescreen-trigger-audit.json | 121 ++++++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 34b0a43..4805ac1 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -381,3 +381,24 @@ renderer proofs keep their original binary identities. The four pending human checks are unchanged; accepted Byte/doors/factory checks are preserved. Kaiser finishing hit/escape/ending, skipped content/independent audio and broader-consumer follow-up remain open. Exact data is in `new_main_qualification`. + +### Native final-room trigger qualification (2026-10-27) + +On current c3d20fc6, the clean native fortress route now reaches the +original upper-room cue, full32HP Sigma introduction, real projectile +defeat and full32HP Kaiser introduction/control return. Native256/default +and684/interpreter repeats pass the same cues; introductions take22 and36 +B pulses respectively. Combat hit timing is not asserted equal. + +Actual ladder grabs/climbs and connector traversal work. Position-only +alignment and flight bypass ordinary shaft/wall-jump traversal; main +Sigma HP1 survives idle before the real hit. No camera, AI, progression +or result flags are written. The hit changes a mutable parameter byte; +stable actor-slot/id proves HP0/primary04 and corrects a false helper +failure. Original raw output and excluded setup experiments are retained. + +Current Kaiser save/load and Pause/Capture/restart are exact in full +pixels and128KiB WRAM. Captures now include actual generated-CPU +registers. Kaiser finishing hit, escape and endings remain unverified; +the existing optional human segment remains available. See +`native_final_qualification` in the audit JSON for assists and evidence. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 76f9e0a..9a5e208 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -93,7 +93,8 @@ "source": "new_main_qualification", "owner_data_unchanged": true }, - "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain." + "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain.", + "latest_native_final": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-qualification.json" }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -1332,5 +1333,123 @@ } } } + }, + "native_final_qualification": { + "date": "2026-10-27T17:38:20.735565+00:00", + "binary": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "title_code": "a0142c8e13f1f2e4c526784955654356faecbe92", + "reviewed_engine": "0095609940bc3a304da8c70f2dcab79264bbb8ab", + "compiled_engine": "e772aca74d06cef9435df2f34cda1689329b19c4", + "prior_context": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-context-progress-summary.json", + "passed": [ + "First ladder catches with actual Up+B; original climb/camera transition works.", + "X-only alignment to the second ladder, long Up+B then Up reaches its top; actual right input traverses connector and opens native shaft camera bounds.", + "Player-only upper-shaft flight crosses the authored room cue, starts original actor02/sub5, camera lock and Sigma introduction.", + "Native32HP Sigma returns control, survives main-only HP1 idle assist, then a real shot gives same actor slot/id HP0/primary04.", + "Original post-Sigma script allocates32HP Kaiser and all parts, completes dialogue/introduction and returns control.", + "Native256/default and684/pure-interpreter repeats pass original entry,32HP Sigma, real defeat and32HP Kaiser/control return.", + "Current342 Kaiser full-state replay and Pause/Capture/restart have zero full-image/128KiB WRAM differences; capture includes actual get_v2_cpu registers.", + "Optional current342 Kaiser main-only HP1 survives idle and full-state120frame replay exactly." + ], + "bypasses": [ + "Earlier password/equipment and eight-rematch eligibility supplied before native initialization; prior actual eight-fight proof is separate.", + "Position-only alignment and flight bypass shaft wall-jump/ordinary traversal; physical upper-door traversal is not claimed.", + "Player health/immunity/aiming position and Sigma main HP1; no camera, AI, encounter-control, progression or result flags written." + ], + "widths": { + "256": { + "execution": "default hybrid", + "sigma_intro_pulses": 22, + "kaiser_intro_pulses": 36, + "real_sigma_defeat": true + }, + "684": { + "execution": "pure interpreter", + "sigma_intro_pulses": 22, + "kaiser_intro_pulses": 36, + "real_sigma_defeat": true + } + }, + "timing_scope": "Both width repeats need22 original-intro B pulses and36 post-defeat Kaiser pulses. Combat damage lands on different fire cycles; no exact combat timing, full cross-width RAM or image equality claim.", + "identity_correction": { + "original_reported_passed": false, + "reason": "Mutable parameter byte changed0->8 on real hit; same actor slot/id has HP0/nativeprimary04.", + "after": { + "dp": 3416, + "state": "01040000", + "id": 94, + "sub": 8, + "x": 2000, + "y": 2720, + "hp": 0 + }, + "original_record": "x3-native-final-sigma-real-hit-legacy-parameter-check.json" + }, + "current_states": { + "x3-native-final-before-upper-door.sav": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-before-upper-door.sav", + "sha256": "800d195488bb730f043d249703c1ec887ed37e405cbda2ceac3a70c88b28dcb7" + }, + "x3-native-final-sigma-live32.sav": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-sigma-live32.sav", + "sha256": "a568d13e4260663edf571877f7ceef37835c803d6313c813ffc806390bb3392e" + }, + "x3-native-final-sigma-actual-hit.sav": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-sigma-actual-hit.sav", + "sha256": "d52703dfad34052fa058c5cb6aa5a75e51f5b77159ec14c94240c900d79d9571" + }, + "x3-native-final-kaiser-live32.sav": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-kaiser-live32.sav", + "sha256": "2f73aaf8d160e71374afadf91ab281c060a319f2ef3a7dca3a819812fe4968f0" + }, + "x3-native-final-kaiser-live1.sav": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-kaiser-live1.sav", + "sha256": "ef429e4acc562a2491b43b2ef4e632d101e9052ec6add890185d1485af122e87" + } + }, + "current_build_capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-capture-check\\review-captures\\x3-native-final-kaiser-live32-20261027-103417-801277.png", + "metadata_errors": {}, + "replay": { + "case": "x3-native-final-kaiser-live32-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3\\saves\\save1.sav", + "sha256": "8f6b52331bb97ec312a7908560083e89b024b10e73409459a4297cf8cf0014ab", + "frame": 40583, + "tag": { + "segment": "x3-native-final-kaiser-live32", + "binary_sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "engine": "e772aca74d06cef9435df2f34cda1689329b19c4" + }, + "utc": "2026-10-27T17:34:17.799720+00:00" + } + }, + "current_build_live1_replay": { + "case": "x3-native-final-kaiser-live1", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "remaining": [ + "Kaiser finishing hit, lava escape and endings", + "Four individual pending human visuals; Bit human floor/exit is separately deferred", + "Skipped traversal/content inventory and independent original-game audio", + "Broader consumer follow-up; requested X2/X3 new-main qualification is passed" + ], + "raw": [ + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-sigma-intro.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-sigma-real-hit.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-kaiser-intro.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-width-matrix.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-experiment-label-corrections.json" + ], + "owner": "No owner games opened, accepted scenes repeated or new review segments added. Current four-segment handoff and owner settings/saves/notes are preserved." } } From 87f198ec0687af99b68a0cdf3ac867cf165c21c8 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 11:23:09 -0700 Subject: [PATCH 26/40] fix: preserve original X3 epilogue composition --- src/x3_rtl.c | 8 ++++-- tools/test_ending_framing.py | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tools/test_ending_framing.py diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 1bf3ddc..3ca1b45 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -362,8 +362,12 @@ void X3ConfigureWsBgMargins(void) { * Hub teleports select checkpoints 3..8. Checkpoint 2 is the ordinary * corridor after the hub and keeps its scrolling widescreen presentation. */ bool X3UseNativeFrame(void) { - return g_ram[0x1fae] == 12 && g_ram[0xd1] == 4 && - g_ram[0x1fb5] >= 3 && g_ram[0x1fb5] <= 8; + /* The opening epilogue is an authored256px composition. Its background + * canvases repeat the sun and factory when extended. The subsequent + * scrolling cast (ending phase2) keeps adaptive widescreen. */ + return (g_ram[0xd1] == 6 && g_ram[0xd2] == 0) || + (g_ram[0x1fae] == 12 && g_ram[0xd1] == 4 && + g_ram[0x1fb5] >= 3 && g_ram[0x1fb5] <= 8); } static int x3_ws_spawn_margin(void) { diff --git a/tools/test_ending_framing.py b/tools/test_ending_framing.py new file mode 100644 index 0000000..a1236bf --- /dev/null +++ b/tools/test_ending_framing.py @@ -0,0 +1,49 @@ +"""Verify fixed epilogue framing and restored widescreen cast on a debug host. + +Use disposable current-build snapshots and a muted private profile with the +widescreen feature enabled. This checks presented dimensions and current modes; +the real final clear and ending progression require separate gameplay evidence. +""" +import argparse +import json +from pathlib import Path +import shutil +import struct +import sys + + +def check(driver, profile, state, phase, width, label): + shutil.copy2(state, profile/'saves/save0.sav') + driver.command('clear_controller');driver.command('loadstate 0') + for _ in range(3):driver.command('step 1') + driver.command('screenshot '+label+'.bmp') + actual_width,height=struct.unpack_from(' Date: Tue, 27 Oct 2026 11:32:07 -0700 Subject: [PATCH 27/40] docs: record assisted X3 finale and epilogue validation --- docs/WIDESCREEN.md | 26 +++ docs/widescreen-trigger-audit.json | 294 ++++++++++++++++++++++++++++- 2 files changed, 317 insertions(+), 3 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 4805ac1..d98b740 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -402,3 +402,29 @@ pixels and128KiB WRAM. Captures now include actual generated-CPU registers. Kaiser finishing hit, escape and endings remain unverified; the existing optional human segment remains available. See `native_final_qualification` in the audit JSON for assists and evidence. + +### Fixed epilogue and assisted aftermath (2026-10-27) + +The opening ending scene repeats its sun and factory at wide widths. +Code87f198e retains the authored256px composition only for ending +mode6/phase0, reusing the existing frame-width hook. The scrolling +cast returns to adaptive widescreen in phase2. Gameplay is unchanged. + +New3435c017 at342/default and684/interpreter preserves every native +epilogue pixel and128KiB WRAM across20 samples/6000frames per mode. +The cast restores full width and identical whole output. Actual clear +entry, four current-state replays, the portable debug-host regression, +Byte/factory/Kaiser/hub samples and current Kaiser Save/Pause/Capture +also pass. Source generator/core/package settings are unchanged. + +The preceding c3d2 audit now exercises original virus creation, rising +lava/camera, contact/recovery, upper corridor, Zero rescue/dialogue and +counter3->5/ending mode6 at342 and684. A further24000 no-input/no-RAM +frames at342 reach Thanks for playing / Presented by CAPCOM. Kaiser +HP0 deliberately bypasses the unverified finishing hit. Position assists +bypass wall-jump traversal and correct an entry below a raised ledge; +no camera, AI, progression, escape or ending flags are written. The +same low prepared entry stalls natively too, so it is excluded as a +demonstrated widescreen defect. Real finishing hit, uninterrupted +physical escape and alternate rescue ending remain unverified. Exact +binary identities and caveats are in `epilogue_and_aftermath_followup`. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 9a5e208..75b6404 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -8,9 +8,9 @@ ], "unverified": [ "Bit human floor/exit follow-up (automatic checks pass)", - "Kaiser final hit, lava escape and endings", - "Remaining fortress branches/full content inventory/independent audio", - "Broader other-consumer follow-up; current X2/X3 new-base output/state/audio/startup/memory/runtime gates passed without a speed claim" + "Real Kaiser finishing hit; uninterrupted normal escape/ledge approach; alternate Doppler-rescue ending", + "Four individual pending owner visual checks; skipped traversal/content inventory and independent original-game audio", + "Broader other-consumer follow-up; current X2/X3 new-base qualification remains passed without a speed claim" ], "next_cross_title_priority": "Four focused selector segments remain: Serges front, Ostrich entrance and X2/X3 final-arena visuals plus optional Kaiser hit. Accepted scenes are not repeated.", "shared_engine_regression": { @@ -1451,5 +1451,293 @@ "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-experiment-label-corrections.json" ], "owner": "No owner games opened, accepted scenes repeated or new review segments added. Current four-segment handoff and owner settings/saves/notes are preserved." + }, + "epilogue_and_aftermath_followup": { + "date": "2026-10-27T18:26:16.152209+00:00", + "game_code": "87f198ec0687af99b68a0cdf3ac867cf165c21c8", + "engine": "0095609940bc3a304da8c70f2dcab79264bbb8ab", + "compiled_engine": "e772aca74d06cef9435df2f34cda1689329b19c4", + "engine_tree": "396f26717c1bf151b0e110950c5fd5f179c1823a", + "executable": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ending-framing-x3\\MegaManX3SNESRecomp.exe", + "sha256": "3435c01797d24e26591b6ee093b2b444f54cf5e59b12472bc63a8fe1fe6d6d4a", + "baseline_sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "compiled_title_base": "750e42929a7ffd6cd4dd6b81fd986ad205bc0a72", + "compiled_source": { + "path": "src/x3_rtl.c", + "sha256": "ed6d3bbaffc4763194506cad3e0a67c2111c7982d7b3af837436dfc7065616a6", + "equivalence": "The compiled working C source is unchanged at game code87f198e. Generator/emitted code, core engine, build definitions and mod logic are unchanged.", + "patch": "Tested working C source subsequently committed as87f198e" + }, + "defect": "The original fixed256px opening epilogue repeats its sun/factory outside the authored composition at wide widths.", + "change": "Use the existing native framing only in original ending mode6/phase0. Original scrolling cast phase2 and all gameplay remain adaptive.", + "ending_comparison": { + "342": { + "passed": true, + "samples": 20, + "execution": "default hybrid", + "current_build_save_load": [ + { + "case": "x3-ending-framing-342-epilogue", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + { + "case": "x3-ending-framing-342-cast", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + ], + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-342.json" + }, + "684": { + "passed": true, + "samples": 20, + "execution": "pure interpreter", + "current_build_save_load": [ + { + "case": "x3-ending-framing-684-epilogue", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + { + "case": "x3-ending-framing-684-cast", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + ], + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-684.json" + } + }, + "actual_entry_lifecycle": { + "passed": true, + "rows": [ + { + "elapsed": 0, + "mode": "02040a02", + "size": [ + 342, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 100, + "mode": "02040a04", + "size": [ + 342, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 200, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 300, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 400, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 500, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 600, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 700, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 800, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 900, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 1000, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 1100, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + }, + { + "elapsed": 1200, + "mode": "02060002", + "size": [ + 256, + 224 + ], + "pixels_equal": true, + "wram_equal": true + } + ], + "scope": "Actual original stage-clear to ending transition, with no input or RAM writes after loading the genuinely reached clear snapshot. Full output before the epilogue and native pixels within it agree; all128KiB WRAM agree." + }, + "gameplay": { + "byte": { + "passed": true, + "samples": 28, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-gameplay-byte.json" + }, + "factory": { + "passed": true, + "samples": 24, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-gameplay-factory.json" + }, + "kaiser": { + "passed": true, + "samples": 8, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-gameplay-kaiser.json" + }, + "hub": { + "passed": true, + "samples": 20, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-gameplay-hub.json" + } + }, + "portable_cli": { + "returncode": 0, + "stdout": "[{\"case\": \"epilogue-native-frame\", \"mode\": [6, 0], \"size\": [256, 224], \"expected_width\": 256, \"passed\": true}, {\"case\": \"cast-wide-frame\", \"mode\": [6, 2], \"size\": [684, 224], \"expected_width\": 684, \"passed\": true}]\n", + "stderr": "" + }, + "current_owner_save_load": { + "case": "x3-ending-framing-owner-kaiser", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "current_owner_capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-capture-check\\review-captures\\x3-ending-framing-owner-kaiser-20261027-112129-928216.png", + "metadata_errors": {}, + "replay": { + "case": "x3-ending-framing-owner-kaiser-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ending-framing-x3\\saves\\save1.sav", + "sha256": "e4894c08622ccf7a1aa7807566bbaecae5a09971d11f904eb08fa792d9ff8d52", + "frame": 11506, + "tag": { + "segment": "x3-ending-framing-owner-kaiser", + "binary_sha256": "3435c01797d24e26591b6ee093b2b444f54cf5e59b12472bc63a8fe1fe6d6d4a", + "engine": "e772aca74d06cef9435df2f34cda1689329b19c4" + }, + "utc": "2026-10-27T18:21:29.928216+00:00" + } + }, + "prepared_owner_state": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ending-framing-owner-states\\x3-kaiser-hit.sav", + "sha256": "d09f5c0f68f9ff6b9eeea0ebb614c83e5ecddea6627c3ad53eb96ff82eeb5653", + "note": "Exactly one live primary02 Kaiser at1HP. No result writes; current120frame save/load and Pause/Capture/restart exact." + }, + "aftermath": { + "binary": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", + "passed": [ + "Original virus creation, rising lava and upward camera movement after declared defeat bypass", + "Original virus contact takes control; two real B/release pulses restore control", + "Original upper corridor cue and Zero rescue/dialogue after declared ledge correction", + "Original fortresscounter3->5 and ending mode6 at342/default and684/interpreter; both ending states replay exactly", + "At342,24000 subsequent no-input/no-RAM frames reach Thanks for playing / Presented by CAPCOM" + ], + "bypasses": [ + "Kaiser main HP1->0 supplies the unverified final-hit prerequisite; this is not a real combat win", + "Player-only shaft positioning bypasses wall-jump traversal", + "The first upper entry was below a raised ledge. A one-time position(2080,1679) supplies the missing physical approach; original movement resumes without changing movement state" + ], + "setup_failure": "The same prepared low entry stalls at native256 and342, and raising X to the ledge lets the original walk continue. This is excluded as a demonstrated widescreen defect; it does not certify an uninterrupted normal escape route or prove a fresh native whole-stage control.", + "original_control": "The first broad positioning run continued after control takeover and is limited to camera/actor observations. The following run stops at original control takeover and lets real dialogue input restore control.", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-assisted-finale-width-matrix.json", + "ending_follow": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-assisted-ending-follow.json", + "terminal_picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\incoming-main-x3\\x3-assisted-ending-follow-24000.png", + "no_outcome_writes": "No camera, AI, progression/result, escape or ending flags written. The deliberate HP0 prerequisite and physical traversal assists remain explicit.", + "remaining": [ + "Real Kaiser weakpoint finishing hit", + "Uninterrupted physical escape/ledge approach", + "Alternate Doppler-rescue ending" + ] + }, + "provenance": "Aftermath/terminal traversal ran on preceding current engine-matched c3d2 binary. New3435 ending presentation is compared against it through actual clear entry,6000frames/mode and the cast transition; gameplay/currentsave/capture are separately exact. No new all-boss sweep or full terminal replay is claimed for3435.", + "promotion": "One current executable per owner title; only X3 epilogue presentation and its disposable current-build Kaiser snapshot replaced. No merge/release.", + "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-publication.json" } } From 935983c6dc901e428995b17e0b719f8048d50660 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 11:55:11 -0700 Subject: [PATCH 28/40] docs: qualify assisted alternate X3 rescue ending --- docs/WIDESCREEN.md | 12 ++++++++ docs/widescreen-trigger-audit.json | 45 +++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index d98b740..1f768a8 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -428,3 +428,15 @@ same low prepared entry stalls natively too, so it is excluded as a demonstrated widescreen defect. Real finishing hit, uninterrupted physical escape and alternate rescue ending remain unverified. Exact binary identities and caveats are in `epilogue_and_aftermath_followup`. + +The subsequent current3435 audit also qualifies the alternate Doppler rescue +at native256/default and684/interpreter. An earlier Zero-unavailable prerequisite +is supplied before rescue-script allocation; Kaiser defeat and ordinary escape +traversal remain bypassed. Moving above the ledge before the original upper cue +lets the native walk finish without a post-control position correction. Both +runs reach original counter3->5, stage clear and ending mode6, with exact +current-build ending save/load. No camera, AI, current result or ending flags +are written. This closes the assisted alternate-rescue check, while the real +Kaiser finishing hit, ordinary physical escape, earlier Zero-loss/fresh-stage +loading and remaining content/human checks retain their separate limits. +See `alternate_rescue_followup` for the exact prerequisite and raw evidence. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 75b6404..8ab25d9 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -8,7 +8,7 @@ ], "unverified": [ "Bit human floor/exit follow-up (automatic checks pass)", - "Real Kaiser finishing hit; uninterrupted normal escape/ledge approach; alternate Doppler-rescue ending", + "Real Kaiser finishing hit; uninterrupted normal escape/ledge approach", "Four individual pending owner visual checks; skipped traversal/content inventory and independent original-game audio", "Broader other-consumer follow-up; current X2/X3 new-base qualification remains passed without a speed claim" ], @@ -1739,5 +1739,48 @@ "provenance": "Aftermath/terminal traversal ran on preceding current engine-matched c3d2 binary. New3435 ending presentation is compared against it through actual clear entry,6000frames/mode and the cast transition; gameplay/currentsave/capture are separately exact. No new all-boss sweep or full terminal replay is claimed for3435.", "promotion": "One current executable per owner title; only X3 epilogue presentation and its disposable current-build Kaiser snapshot replaced. No merge/release.", "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-ending-framing-publication.json" + }, + "alternate_rescue_followup": { + "date": "2026-10-27T18:54:09.582010+00:00", + "passed": true, + "binary": "3435c01797d24e26591b6ee093b2b444f54cf5e59b12472bc63a8fe1fe6d6d4a", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-alternate-rescue-qualification.json", + "original_script": "03:A827+12 ->03:B53D;03:B5E3 tests earlier Zero-unavailable bit1FB2.40 and selects alternate appearance at03:B5F9. Native loss handler00:9D02..18 sets that bit.", + "variants": { + "256": { + "controller_pulses": 83, + "native_clear": "020408000000da01", + "native_counter": 5, + "ending": "020600020c000000", + "save_replay": { + "case": "x3-alternate-rescue-256-ending", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + }, + "684": { + "controller_pulses": 81, + "native_clear": "020408000000b601", + "native_counter": 5, + "ending": "020600020c000000", + "save_replay": { + "case": "x3-alternate-rescue-684-ending", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + } + }, + "observed": "Original walk target reached without a post-control position correction; alternate rescue dialogue and native counter3->5/stage-clear08/ending mode6. Current-build ending save/load replays match.", + "assists": "Upstream Kaiser HP1->0 bypasses the real finishing hit. Player position/health bypass escape traversal, with the player moved above the raised ledge before the native upper-corridor cue; no correction after original control takeover. The earlier Zero-unavailable bit is supplied before final-script allocation. Controller B edges/health during rescue only; no camera, AI, current result, progression, escape or ending writes. No input/RAM writes after native clear.", + "limitations": "Assisted script/trigger qualification, not a real Kaiser finishing hit, ordinary wall-jump escape, earlier Zero-loss validation, full fresh-stage loading validation or exhaustive visual certification. Cross-width exact RAM/image equality is not asserted.", + "prepared_fixture": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-zero-unavailable-before-final-script.sav", + "sha256": "0574cd02b2088f8e70fb1198f7d8a646968e6bcbdeb09c40331dd182f38e6a31" + }, + "owner_data_unchanged": true, + "owner_visual_review": "Same four segments pending; no new owner game launch or replay request", + "implementation": "No code, engine, generated files, binaries or prepared owner states changed" } } From e5e5f15abebdde2515159ed139bcdfe073fc6c9d Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 14:12:39 -0700 Subject: [PATCH 29/40] Preserve Maoh boss art and continue the authored roof in widescreen --- snesrecomp | 2 +- src/x3_rtl.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/snesrecomp b/snesrecomp index 0095609..05786e5 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 0095609940bc3a304da8c70f2dcab79264bbb8ab +Subproject commit 05786e50bca11dff1f09f76c0e7ac9d48072c440 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 3ca1b45..400d9c3 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -287,9 +287,44 @@ void X3ConfigureWsHud(void) { PpuSetWsHudOamShiftRange2(g_ppu, 16, x3_ws_boss_hud_present() ? 7 : 0); } +/* Maoh paints BG2 characters0x300..0x3ff over a reused circular map. Other + * characters outside the native view are stale level tiles, not boss art. + * Filter the renderer's live tile so moving/destructible body pieces retain + * their exact map attributes and never depend on cached terrain history. */ +static uint16_t x3_maoh_margin_tile(void *context, uint16_t address, + uint16_t tile) { + (void)context; + (void)address; + return (tile & 0x3ff) >= 0x300 ? tile : 0; +} + /* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); + /* Keep Maoh's genuine offscreen body inside its512px canvas while BG1 + * supplies the roof. Never reflect the boss or expose stale map + * cells beside it. Enter the policy when the original camera reaches the + * combat roof, including the introduction before the left bound locks. */ + static const uint8_t maoh_vertical_bounds[4] = {0x00,0x01,0x00,0x01}; + const unsigned camera_x = g_ram[0x1e5d] | g_ram[0x1e5e] << 8; + const unsigned min_x = g_ram[0x1e6e] | g_ram[0x1e6f] << 8; + if (g_ws_active && g_ppu && g_ram[0xd1] == 4 && g_ram[0x1fae] == 0 && + !memcmp(g_ram+0x1e6a,maoh_vertical_bounds,sizeof maoh_vertical_bounds) && + g_ram[0x1e70] == 0x00 && g_ram[0x1e71] == 0x1b && + min_x >= 6656 && min_x <= 6784 && camera_x >= 6784 && camera_x <= 6912 && + (g_ppu->bgmode & 7) == 1 && g_ppu->bgXsc[0] == 0x51 && + g_ppu->bgXsc[1] == 0x59) { + WsShadowUseFilteredVram(1,g_ppu,x3_maoh_margin_tile,NULL); + PpuSetWidescreenLayerWorldClipBand(g_ppu,1,0,224,1,512,1024); + /* This scene uses BG3 for its complete repeating skyline rather than + * the normal dialogue sheet. Its loaded map supplies the distant city. */ + PpuSetWidescreenBg3Widen(g_ppu,1); + /* The roof ends at world7168. Its combat section starts at6784; + * reflecting the preceding entrance would invent another boss door. + * Repeat the32px edge strips only outside the authored roof. Reflecting + * the whole combat area would copy Maoh's real floor damage as well. */ + PpuSetWidescreenLayerWorldRepeatBand(g_ppu,0,0,224,640,1024,32); + } /* Keep authored fortress arenas' native pixels intact and continue their wall * edges into the gutters. The BG2 Kaiser head is a circular object canvas, * so it must stay within the room rather than echo beyond the side walls. From a897c862b7c1ef53391629d0fa0d252229d09f9e Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 14:29:23 -0700 Subject: [PATCH 30/40] Record Maoh trigger and shared presentation qualification --- docs/WIDESCREEN.md | 23 ++ docs/widescreen-trigger-audit.json | 370 ++++++++++++++++++++++++++++- 2 files changed, 392 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 1f768a8..7d38c2b 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -440,3 +440,26 @@ are written. This closes the assisted alternate-rescue check, while the real Kaiser finishing hit, ordinary physical escape, earlier Zero-loss/fresh-stage loading and remaining content/human checks retain their separate limits. See `alternate_rescue_followup` for the exact prerequisite and raw evidence. + +### Maoh object canvas and shared presentation follow-up (2026-10-27) + +Maoh uses BG1 for its roof, BG2 for a moving boss canvas and BG3 for the city. +The scoped stage0 policy keeps live boss tiles, hides unrelated circular-map +cells, widens the genuine skyline and repeats only32px world-edge strips +beyond the combat roof. Real in-room damage remains; outer margins no longer +reflect another door, boss or destroyed floor. Codee5e5f15 pins engine05786e5. + +Build10994be1 passes fresh opening, original full32HP introduction, assisted +real projectile defeat, native clear/stage-select and controller next-stage +load at256/default,342/default and684/interpreter. All93 sampled native +pictures/WRAM/VRAM/OAM agree with3435; six current live/selection replays +match exactly. Connecting travel and HP1/aiming assists remain explicit. + +The shared X2/X3 package passes188 full-output/128KiB WRAM regression +samples, non-silent PCM/full SPC/APU comparisons, and all four prepared +states’ save/load and Pause/Capture/restart checks. Accepted Byte/doors/ +factory observations remain closed. Per-game timing samples are small +and mixed: neutral/inconclusive, without a speed claim. Actual trace is +FULL in these diagnostic builds despite the SMALL cache request. +Remaining human/content/branch/audio gaps are unchanged; see +`maoh_object_canvas_followup` for precise identities and bypasses. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 8ab25d9..0833575 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -94,7 +94,13 @@ "owner_data_unchanged": true }, "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain.", - "latest_native_final": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-qualification.json" + "latest_native_final": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-qualification.json", + "current_package": { + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-qualification.json", + "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-publication.json" + } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -1782,5 +1788,367 @@ "owner_data_unchanged": true, "owner_visual_review": "Same four segments pending; no new owner game launch or replay request", "implementation": "No code, engine, generated files, binaries or prepared owner states changed" + }, + "maoh_object_canvas_followup": { + "date": "2026-10-27T21:24:18.738050+00:00", + "passed": true, + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440", + "compiled_engine": "162783ecfbbb3db6e19e4ad240efe8b8a9e3deac", + "engine_tree": "a4cf0a18ebcf70a8f83299a06648f128db533519", + "game_code": "e5e5f15abebdde2515159ed139bcdfe073fc6c9d", + "x2_pin_commit": "83eee195ac258adf44a631265910de8d53a6145d", + "x2_title_code": "73936500f792d99cea5eeb1e27d2238797b1c00d", + "ui": "0546fbcb0126bb14bf88d2128b4fe8a4229570a3", + "compiled_source": { + "path": "src/x3_rtl.c", + "sha256": "101d0fd66208b721bbb53f0c05b865cbb8bdee5eb58a2ac6dd8fe02bf7b01be1", + "note": "Compiled working source is byte-identical to committed game codee5e5f15; later docs do not change it." + }, + "identities": { + "x2": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "x3": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1" + }, + "binaries": { + "x2": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-filter-x2\\MegaManX2SNESRecomp.exe", + "x3": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-clamp-x3\\MegaManX3SNESRecomp.exe" + }, + "baseline": { + "x3": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "old3": "3435c01797d24e26591b6ee093b2b444f54cf5e59b12472bc63a8fe1fe6d6d4a", + "x2": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "old2": "58982242f20e1a761fa78aae07eecc0937890788c9e727cfe9ebf147dbd82cb2" + }, + "defect": "Maoh exposes stale BG2 map cells and a truncated skyline/roof at very wide widths. Whole-roof reflection also copies live destroyed floor beyond the combat room.", + "change": "Scoped original stage0 introduction/fight: exact live BG2 boss-character filter plus existing world clip, genuine BG3 skyline, BG1 world-edge32px strip continuation. Native and authored room pixels/damage stay intact; no duplicate door/boss/pit outside the arena. No guest writes.", + "maoh": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-maoh-package-qualification.json", + "widths": { + "256": { + "passed": true, + "pure_interpreter": false, + "entry_samples": 15, + "fight_samples": 16, + "real_hit": true, + "clear_pulses": 40, + "next_stage": "00020000000000020001", + "live_save_replay": { + "case": "maoh-package-256-live", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "stage_select_save_replay": { + "case": "maoh-package-256-stage-select", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + }, + "342": { + "passed": true, + "pure_interpreter": false, + "entry_samples": 15, + "fight_samples": 16, + "real_hit": true, + "clear_pulses": 40, + "next_stage": "00020000000000020001", + "live_save_replay": { + "case": "maoh-package-342-live", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "stage_select_save_replay": { + "case": "maoh-package-342-stage-select", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + }, + "684": { + "passed": true, + "pure_interpreter": true, + "entry_samples": 15, + "fight_samples": 16, + "real_hit": true, + "clear_pulses": 40, + "next_stage": "00020000000000020001", + "live_save_replay": { + "case": "maoh-package-684-live", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "stage_select_save_replay": { + "case": "maoh-package-684-stage-select", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + } + }, + "scope": "Fresh opening, original Maoh introduction/full32HP, real assisted finishing hit, authentic clear/stage-select and controller next-Maverick loading at256/default,342/default,684/interpreter. Saved travel setup bypassed; not whole-stage natural traversal or a full-game audit.", + "assists": "Fresh controller-only opening. Original-route saved travel setup and one pre-door Y alignment bypass connecting traversal. MainHP1 before idle survival/real fire and player position/health while aiming only. No RAM writes after real hit through clear/selection/next stage; no camera/AI/control/current-result/progression writes." + }, + "regression": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-regressions.json", + "cases": { + "x3-byte": { + "passed": true, + "samples": 28 + }, + "x3-factory": { + "passed": true, + "samples": 24 + }, + "x3-press": { + "passed": true, + "samples": 8 + }, + "x3-kaiser": { + "passed": true, + "samples": 8 + }, + "x3-hub-exit": { + "passed": true, + "samples": 20 + }, + "x3-epilogue": { + "passed": true, + "samples": 20 + }, + "x2-serges": { + "passed": true, + "samples": 16 + }, + "x2-rocket": { + "passed": true, + "samples": 16 + }, + "x2-sigma": { + "passed": true, + "samples": 8 + }, + "x3-lab2": { + "passed": true, + "samples": 24 + }, + "x2-ostrich": { + "passed": true, + "samples": 16 + } + }, + "samples": 188, + "scope": "Whole output/128KiB WRAM match current frozen owner builds in representative accepted and pending scenes; declared health/control only. No new owner visual acceptance or full-stage traversal claim." + }, + "current_handoff": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-handoff-verification.json", + "states": { + "x2-serges": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-owner-states\\x2-serges.sav", + "sha256": "a55fbea975cfecdf623f37c090f68f37836d4b310e91a136bfe1b3ab10a5c8d0", + "binary": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "replay": { + "case": "maoh-package-owner-x2-serges", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-capture-check\\review-captures\\maoh-package-owner-x2-serges-20261027-141512-141881.png", + "metadata_errors": {}, + "replay": { + "case": "maoh-package-owner-x2-serges-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-filter-x2\\saves\\save1.sav", + "sha256": "0978fd6461b2c6dd7a0fb4eca59d3f3f5a0e85521981f697bd557e647c8ff0be", + "frame": 3097, + "tag": { + "segment": "maoh-package-owner-x2-serges", + "binary_sha256": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440" + }, + "utc": "2026-10-27T21:15:12.140326+00:00" + } + } + }, + "x2-ostrich-entry": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-owner-states\\x2-ostrich-entry.sav", + "sha256": "8d7fca6bca3eb6a4216a43b818ad56e44d0e6f304bbaaf205864aa3aa49fd13a", + "binary": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "replay": { + "case": "maoh-package-owner-x2-ostrich-entry", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-capture-check\\review-captures\\maoh-package-owner-x2-ostrich-entry-20261027-141516-229073.png", + "metadata_errors": {}, + "replay": { + "case": "maoh-package-owner-x2-ostrich-entry-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-filter-x2\\saves\\save1.sav", + "sha256": "db5198151aa02d447f80ec9ec6a3abba2cf0b4d35460cb046593d18b3768a98e", + "frame": 4917, + "tag": { + "segment": "maoh-package-owner-x2-ostrich-entry", + "binary_sha256": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440" + }, + "utc": "2026-10-27T21:15:16.228031+00:00" + } + } + }, + "x2-sigma-walls": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-owner-states\\x2-sigma-walls.sav", + "sha256": "997deda0df99ba0af2d6c8cc1dbead64446f7081999b6aea3d7c92c7d89be8aa", + "binary": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "replay": { + "case": "maoh-package-owner-x2-sigma-walls", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-capture-check\\review-captures\\maoh-package-owner-x2-sigma-walls-20261027-141520-284226.png", + "metadata_errors": {}, + "replay": { + "case": "maoh-package-owner-x2-sigma-walls-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-filter-x2\\saves\\save1.sav", + "sha256": "508aca6258ad656406271a1096540fd362e6ef3c076f2c8b7e8fd33367b7bebc", + "frame": 30235, + "tag": { + "segment": "maoh-package-owner-x2-sigma-walls", + "binary_sha256": "209813aa5459bf95355882f991b09bab1821e856c67a6619bc335cc0c4cd4169", + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440" + }, + "utc": "2026-10-27T21:15:20.283707+00:00" + } + } + }, + "x3-kaiser-hit": { + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-owner-states\\x3-kaiser-hit.sav", + "sha256": "2bdd00a5b92773114694df7bd4cf8a1f27b9502af33e53327a63d4aed248cea1", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "replay": { + "case": "maoh-package-owner-x3-kaiser-hit", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "capture": { + "passed": true, + "picture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-capture-check\\review-captures\\maoh-package-owner-x3-kaiser-hit-20261027-141524-305988.png", + "metadata_errors": {}, + "replay": { + "case": "maoh-package-owner-x3-kaiser-hit-capture", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "progress": { + "format": "codex-review-progress-v1", + "slot": 1, + "path": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-clamp-x3\\saves\\save1.sav", + "sha256": "ee60bc714330fe882cf705702da712cea16aa381cc1026b9359ab3185b00806a", + "frame": 11509, + "tag": { + "segment": "maoh-package-owner-x3-kaiser-hit", + "binary_sha256": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440" + }, + "utc": "2026-10-27T21:15:24.305468+00:00" + } + } + } + }, + "scope": "Same four existing segments; player health/current full snapshots only. Kaiser remains alive1HP. No outcome writes or owner launch." + }, + "audio": { + "x2": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-audio-x2.json", + "passed": true, + "scope": "Actual non-silent PCM, full SPC/ARAM/DSP/APU and WRAM match the current frozen owner engine009/NATIVE-APU package. New engine057 changes presentation only. Not independent original-game music/SFX correctness." + }, + "x3": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-audio-x3.json", + "passed": true, + "scope": "Actual non-silent PCM, full SPC/ARAM/DSP/APU and WRAM match the current frozen owner engine009/NATIVE-APU package. New engine057 changes presentation only. Not independent original-game music/SFX correctness." + } + }, + "runtime": { + "x2-default": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-cost-x2-default.json", + "median_time_change_percent": 1.5533253805994907, + "range_percent": [ + -2.323784461839007, + 4.358531713722669 + ], + "classification": "neutral/inconclusive: small mixed samples on a busy shared host, not a proven win/regression", + "minimum_candidate_fps": 221.35067444226442 + }, + "x3-default": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-cost-x3-default.json", + "median_time_change_percent": 3.0261839572331417, + "range_percent": [ + -0.8720543983877005, + 4.370754555707768 + ], + "classification": "neutral/inconclusive: small mixed samples on a busy shared host, not a proven win/regression", + "minimum_candidate_fps": 194.69049807919438 + }, + "x3-maoh-684": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-cost-x3-maoh-684.json", + "median_time_change_percent": 1.558962903296135, + "range_percent": [ + -8.390596924800187, + 11.370765520505199 + ], + "classification": "neutral/inconclusive: small mixed samples on a busy shared host, not a proven win/regression", + "minimum_candidate_fps": 146.89372110919726 + } + }, + "settings": "Release software/dummy QA, native APU time,SLICE8 CRC,coverageOFF. FULL audio trace is the actual compiler value2 forced by TRACE=1; SMALL cache request is not the effective profile. Default342 plus forced-interpreter684 checks. Owner normal audio/window settings are preserved.", + "unit_tests": [ + "Live filtered-VRAM provider/native/fine-scroll/8-16px/history/lifecycle", + "World mirror/clip/edge-repeat production pixels,8-16px/mosaic/2-4bpp/684/native/shake/damage/reset/source limits", + "Elastic bands", + "Raster journal", + "Sprite limits", + "HD Mode7" + ], + "storage": "One private candidate per game and frozen former owner baselines outside delivery folders; small full states/PNG/RAM/JSON/PCM/SPC and unit/build evidence retained. Duplicate private BMP cleanup follows.", + "promotion": "One current executable per owner title, verified replacement/current-build states; settings/native saves/notes/acceptance preserved. Frozen previous binaries remain private evidence. No merge/release.", + "remaining": [ + "Four individual owner visuals/optional actual Kaiser hit", + "Bit human floor/exit deferred; automated checks pass", + "Full capture/rescue width matrix, remaining stage/branch/exit coverage, independent original-game music/SFX", + "Ordinary physical escape and earlier actual Zero loss/fresh-stage rescue branch", + "Broader engine consumer follow-up; old and new package measurements retain exact identities" + ], + "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-publication.json" } } From e6e55dbc611bb86370b56a894b36b54f5a76b13c Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 15:28:19 -0700 Subject: [PATCH 31/40] Qualify actual Zero loss and native retreat at three widths --- docs/WIDESCREEN.md | 21 ++++++++++++ docs/widescreen-trigger-audit.json | 54 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 7d38c2b..aca8116 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -463,3 +463,24 @@ and mixed: neutral/inconclusive, without a speed claim. Actual trace is FULL in these diagnostic builds despite the SMALL cache request. Remaining human/content/branch/audio gaps are unchanged; see `maoh_object_canvas_followup` for precise identities and bypasses. + +### Actual earlier Zero loss (2026-10-27) + +Build10994be1 passes the real Zero-loss prerequisite at256/default, +342/default and684/interpreter. The original communication menu/Start +selects playable28HP Zero. Only HP1 is supplied before idle survival; +actual Right/jump contact causes HP0/death. The original retreat sets +1FB2.40 and restores16HP X with normal control. All three current-build +return states replay with exact full output and128KiB WRAM. No position, +camera, AI, character, current result or unavailable-bit writes are used. + +A saved ready menu bypasses upstream travel. Four contact pulses and30 +retreat/dialogue pulses occur in each width case. Earlier too-early Start +inputs did not wait for the communication-page animation and are excluded +as setup errors; they do not establish a widescreen menu defect. + +The naturally earned bit also survives a fresh original final-stage +checkpoint0 loader after a stage/counter teleport. Propagating it through +the complete alternate rescue remains open, as do the actual Kaiser +finishing hit and ordinary escape. Prior alternate-rescue evidence with +a supplied prerequisite keeps its original3435 binary and assists. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 0833575..fdf7f64 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -2150,5 +2150,59 @@ "Broader engine consumer follow-up; old and new package measurements retain exact identities" ], "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-publication.json" + }, + "actual_zero_loss_followup": { + "date": "2026-10-27T22:28:13.031128+00:00", + "passed": true, + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualification.json", + "variants": { + "256": { + "execution": "default hybrid", + "contact_pulses": 4, + "retreat_pulses": 30, + "save_replay": { + "case": "zero-loss-qualified-256-x-return", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "result_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-256-x-return.sav", + "result_sha256": "27dbbaca591eff10425fcadcef36682ee23e0341239357121ccf2292ac2392f3" + }, + "342": { + "execution": "default hybrid", + "contact_pulses": 4, + "retreat_pulses": 30, + "save_replay": { + "case": "zero-loss-qualified-342-x-return", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "result_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-342-x-return.sav", + "result_sha256": "8fe7ee863e8ff88d1fd007638b772111ac0a3a8701b7bbec16479a8c5b9342d1" + }, + "684": { + "execution": "pure interpreter", + "contact_pulses": 4, + "retreat_pulses": 30, + "save_replay": { + "case": "zero-loss-qualified-684-x-return", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "result_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-684-x-return.sav", + "result_sha256": "b8e73886aeabf290e023fb8ad3c5c4a8eb15d3f798827f3cd6dd4ed4f030a2e2" + } + }, + "observed": "Original communication/Start selects live Zero,HP1 survives idle,actual controller movement/enemy contact gives HP0/death,original native retreat sets1FB2.40,then X returns with16HP and normal control. Current-build X-return save/load replays match full output/128KiB WRAM.", + "assists": "Saved current-build ready character menu bypasses prior travel. Only Zero HP1 is written before live idle survival. All selection, movement, damage, retreat and X return use original execution/controller input; no position, AI,camera,character/current result/progression/unavailable flag writes.", + "remaining": "Actual earlier loss is now qualified; fresh fortress-stage loading and alternate-rescue propagation of this naturally earned result still require their own test. Kaiser finishing hit and ordinary physical escape remain separate.", + "fresh_loader": { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-fresh-final-first-load.json", + "scope": "Earned unavailable bit survives the original fresh stage13/counter3/checkpoint0 loader. Stage/counter selection bypassed prior fortress eligibility; this alone is not final alternate-rescue validation. Wrong checkpoint1 probe dies in unused geometry and is excluded as setup failure, not a product/branch failure." + } } } From 3a0e9bd79f9577734c8da2c16afd6d7cbd62f47b Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 16:10:45 -0700 Subject: [PATCH 32/40] Anchor the X3 final-stage entrance view inside its room --- docs/WIDESCREEN.md | 26 ++++++++++++++++ docs/widescreen-trigger-audit.json | 48 ++++++++++++++++++++++++++++++ snesrecomp | 2 +- src/x3_rtl.c | 35 ++++++++++++++++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index aca8116..da042ff 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -484,3 +484,29 @@ checkpoint0 loader after a stage/counter teleport. Propagating it through the complete alternate rescue remains open, as do the actual Kaiser finishing hit and ordinary escape. Prior alternate-rescue evidence with a supplied prerequisite keeps its original3435 binary and assists. + +### Final-stage entrance camera (2026-10-27) + +Buildd897f993 reuses the parked X1 view-anchor mechanism in engine819e2e1. +At the demonstrated final-stage entrance, the extra columns go inside the +room, removing the unused strip to its left. Native camera/scroll/OAM and +sequence state are unchanged. HUD and dialogue retain screen coordinates. +This is scoped to the measured chamber and internal widths up to512;684 +retains the previous centred policy because its one-sided ordinary OBJ span +exceeds512. Other rooms and wider anchoring remain separate work. + +Twenty-five controller-only movement samples retain the complete native +picture outside the existing HUD footprints and exact128KiB WRAM. The +observed image origin moves from0 to43 as X leaves the wall. Kaiser, escape, +Byte and factory retain whole output/WRAM in68 samples. Native256 and +684/interpreter remain unchanged in16 samples. Current-build entry/Kaiser +save/load and Pause/Capture/restart checks pass; seven PPU fixtures pass. +One initial unsettled Byte picture is retained as an inconclusive observer +sample; the independent settled replay passes every sample. + +The unmodified Snes9x reference confirms the entrance composition and the +original shaft pipe walls. Static shaft-art inspection uses explicit camera +positioning and does not certify an independent original escape sequence. +The walls above the fire are authored background art. The owner separately +accepts the absence of a duplicate Kaiser head. Actual finishing-hit, +ordinary escape and other pending audit gates retain their own status. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index fdf7f64..e31f7a3 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -2204,5 +2204,53 @@ "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-fresh-final-first-load.json", "scope": "Earned unavailable bit survives the original fresh stage13/counter3/checkpoint0 loader. Stage/counter selection bypassed prior fortress eligibility; this alone is not final alternate-rescue validation. Wrong checkpoint1 probe dies in unused geometry and is excluded as setup failure, not a product/branch failure." } + }, + "final_entry_camera_followup": { + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "engine": "819e2e1174335dc1c751e3bc6f0623e1438a42a2", + "compiled_engine": "952705a04c670d6be7bff2baf17001e8c84ff459", + "engine_tree": "f8c6ebfd0472b1f5580b7aeab768d420a5452afd", + "source_sha256": "456ccf4fb89cb98afa45d2e43dcafd2680abdb5affb2c51aca0b4ae985cb8304", + "passed": true, + "scope": "Final-stage entry chamber camera presentation at342. No guest camera, AI, OAM or progression writes are introduced by the fix.", + "native_image_samples": 25, + "unchanged_scene_samples": 68, + "regressions": { + "escape": { + "passed": true, + "samples": 8 + }, + "kaiser": { + "passed": true, + "samples": 8 + }, + "byte": { + "passed": true, + "samples": 28 + }, + "factory": { + "passed": true, + "samples": 24 + } + }, + "width_limits": [ + "The anchor is enabled only for the demonstrated entry chamber and widths up to512;684 keeps previous centred presentation because the ordinary one-sided OBJ span is limited. Wider anchoring and other rooms are not certified.", + "No duplicate head accepted separately by owner; actual Kaiser finishing hit awaits clarification. Ordinary escape, alternate fresh-stage rescue, Bit and broader audit remain open." + ], + "current_save_replay": { + "case": "chamber-anchor-entry-current", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "capture_passed": true, + "reference": { + "directory": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\original-x3-chamber-shaft-layout", + "core": "Unmodified snes9x_libretro", + "observation": "Original fresh stage13/checkpoint0 renders the same chamber. Original shaft BG1 contains the pipe walls, including above the lava line in the recomp native escape view.", + "assists": "Stage/counter teleport and explicit camera/player positioning for STATIC shaft-art inspection only. Not an independent original escape sequence validation." + }, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\chamber-anchor-qualification.json", + "owner_acceptance": "No duplicate head accepted. Chamber camera still needs focused visual confirmation; no repeat Byte/doors/factory or X2 handoff." } } diff --git a/snesrecomp b/snesrecomp index 05786e5..819e2e1 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 05786e50bca11dff1f09f76c0e7ac9d48072c440 +Subproject commit 819e2e1174335dc1c751e3bc6f0623e1438a42a2 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index 400d9c3..fae4cc2 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -271,9 +271,44 @@ static bool x3_ws_boss_hud_present(void) { } /* Call once per frame from the host's frame-prep, after g_ws_extra is known. */ +static void x3_configure_chamber_view(void) { + /* The final-stage entrance starts at world256. Its left neighbour is + * unused map data, not room art. Reuse X1's presentation anchor to spend + * the widescreen allowance inside this authored room. Leave the guest's + * camera, scroll limits, OAM and sequence comparisons untouched. + * Locked boss/escape views keep their separate arena policies. */ + if (!g_ws_active || g_ws_extra > 128 || g_ram[0xd1] != 4 || + g_ram[0x1fae] != 13 || (g_ppu->bgmode & 7) != 1 || + g_ppu->bgXsc[0] != 0x51 || g_ppu->bgXsc[1] != 0x59) + return; + const int camera = g_ram[0x1e5d] | g_ram[0x1e5e] << 8; + const int left_bound = g_ram[0x1e6e] | g_ram[0x1e6f] << 8; + const int right_bound = g_ram[0x1e68] | g_ram[0x1e69] << 8; + const int top = g_ram[0x1e6a] | g_ram[0x1e6b] << 8; + if (left_bound != 256 || right_bound != 1536 || top != 3584 || + camera < left_bound - 16 || camera > right_bound + 16) + return; + const int cx = camera < left_bound ? left_bound : + camera > right_bound ? right_bound : camera; + int left = cx - left_bound; + if (left > g_ws_extra) left = g_ws_extra; + int right = right_bound - cx; + if (right > 2 * g_ws_extra - left) right = 2 * g_ws_extra - left; + left = cx - left_bound; + if (left > 2 * g_ws_extra - right) left = 2 * g_ws_extra - right; + PpuSetWidescreenViewAnchor(g_ppu, true); + PpuSetExtraSideSpace(g_ppu, left, right, 0); + /* Dialogue is authored in screen coordinates. Keep its complete native + * sheet at the physical centre while only the world view slides. */ + const int shift = g_ws_extra - g_ppu->extraFrameLeft; + const PpuWsElasticSeg dialogue = {shift, shift + 256, 0, 256}; + PpuSetWidescreenLayerElasticBand(g_ppu, 2, 0, 224, &dialogue, 1); +} + void X3ConfigureWsHud(void) { extern bool g_ws_active; if (!g_ppu) return; + x3_configure_chamber_view(); /* X3's HUD is OAM-only; BG3 is gameplay dialogue and must stay centered. */ PpuSetWidescreenHudSplit(g_ppu, 0, 0, 0); if (!g_ws_active || !x3_ws_hud_present()) { From 3b7405894a5cd7801ae625f5ca9cbba86cb68c22 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 16:14:33 -0700 Subject: [PATCH 33/40] Record owner confirmation of the actual Kaiser finishing hit --- docs/WIDESCREEN.md | 5 +++++ docs/widescreen-trigger-audit.json | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index da042ff..72128bb 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -510,3 +510,8 @@ positioning and does not certify an independent original escape sequence. The walls above the fire are authored background art. The owner separately accepts the absence of a duplicate Kaiser head. Actual finishing-hit, ordinary escape and other pending audit gates retain their own status. + +The owner subsequently confirms that a normal charged shot finished the live +1HP Kaiser in build10994. This actual finishing-hit gate is now passed, along +with the no-duplicate-head check. No repeat combat handoff is required; the +new chamber camera visual and the other independent audit gaps remain open. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index e31f7a3..56c523e 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -2235,7 +2235,7 @@ }, "width_limits": [ "The anchor is enabled only for the demonstrated entry chamber and widths up to512;684 keeps previous centred presentation because the ordinary one-sided OBJ span is limited. Wider anchoring and other rooms are not certified.", - "No duplicate head accepted separately by owner; actual Kaiser finishing hit awaits clarification. Ordinary escape, alternate fresh-stage rescue, Bit and broader audit remain open." + "Owner confirms no duplicate head and actual charged-shot Kaiser hit. Ordinary escape, alternate fresh-stage rescue, Bit and broader audit remain open." ], "current_save_replay": { "case": "chamber-anchor-entry-current", @@ -2251,6 +2251,12 @@ "assists": "Stage/counter teleport and explicit camera/player positioning for STATIC shaft-art inspection only. Not an independent original escape sequence validation." }, "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\chamber-anchor-qualification.json", - "owner_acceptance": "No duplicate head accepted. Chamber camera still needs focused visual confirmation; no repeat Byte/doors/factory or X2 handoff." + "owner_acceptance": "Owner accepts no duplicate head and actual charged-shot Kaiser finishing hit. Only new chamber camera visual is pending; no repeat accepted fight/doors/Byte/factory/X2." + }, + "kaiser_owner_finishing_hit": { + "owner_confirmed": true, + "date": "2026-10-27T23:13:51.165148+00:00", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", + "message": "Yes, the charged shot finished him" } } From af8912e1f3f8cce2102b93cedff1cfc57f50b667 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 16:31:23 -0700 Subject: [PATCH 34/40] Qualify Mac capture and X rescue at native and wide sizes --- docs/WIDESCREEN.md | 19 +++++++ docs/widescreen-trigger-audit.json | 88 +++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 72128bb..b9b328e 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -515,3 +515,22 @@ The owner subsequently confirms that a normal charged shot finished the live 1HP Kaiser in build10994. This actual finishing-hit gate is now passed, along with the no-duplicate-head check. No repeat combat handoff is required; the new chamber camera visual and the other independent audit gaps remain open. + +### Opening capture and rescue matrix (2026-10-27) + +Buildd897f993 passes the fresh controller-only opening, original Mac +capture/Zero control, actual Mac and restraint finishing hits, and original +X rescue/control at256/default,342/default and684/interpreter. Capture takes +39/39/40 dialogue pulses and rescue16 at each width. All six current-build +Zero/X save-load replays preserve full output and128KiB WRAM. Original Mac +is32HP and restraints5HP before the separate HP1/idle/real-shot assists. + +Connecting travel uses saved original-route approaches. Player aiming/health +and live target HP1 assists are explicit; capture/rescue scripts run only on +controller edges. No camera, AI, character, result or progression flags are +supplied. This is sequence qualification, not complete natural stage travel +or cross-width byte-identical timing. The initial retirement/flat-ground +assertion mistakes are retained separately from product results. + +The owner also accepts the16:9 entrance camera anchor. The focused human +handoff is complete; do not repeat camera, Kaiser, doors, Byte, factory or X2. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 56c523e..93efe33 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -2251,12 +2251,98 @@ "assists": "Stage/counter teleport and explicit camera/player positioning for STATIC shaft-art inspection only. Not an independent original escape sequence validation." }, "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\chamber-anchor-qualification.json", - "owner_acceptance": "Owner accepts no duplicate head and actual charged-shot Kaiser finishing hit. Only new chamber camera visual is pending; no repeat accepted fight/doors/Byte/factory/X2." + "owner_acceptance": "Owner accepts camera anchor at16:9, actual Kaiser charged-shot hit and no duplicate head. Focused handoff complete; no repeat." }, "kaiser_owner_finishing_hit": { "owner_confirmed": true, "date": "2026-10-27T23:13:51.165148+00:00", "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", "message": "Yes, the charged shot finished him" + }, + "intro_capture_rescue_followup": { + "date": "2026-10-27T23:31:22.647426+00:00", + "passed": true, + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "engine": "819e2e1174335dc1c751e3bc6f0623e1438a42a2", + "game_code": "3a0e9bd79f9577734c8da2c16afd6d7cbd62f47b", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-intro-capture-rescue-qualification.json", + "variants": { + "256": { + "execution": "default hybrid", + "capture_pulses": 39, + "rescue_pulses": 16, + "mac_real_hit": true, + "restraint_real_hit": true, + "zero_control_save_replay": { + "case": "x3-intro-qualified-256-zero-control", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "x_control_save_replay": { + "case": "x3-intro-qualified-256-x-control", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + }, + "342": { + "execution": "default hybrid", + "capture_pulses": 39, + "rescue_pulses": 16, + "mac_real_hit": true, + "restraint_real_hit": true, + "zero_control_save_replay": { + "case": "intro-342-zero-after-mobility", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "x_control_save_replay": { + "case": "x3-intro-qualified-342-x-control", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + }, + "684": { + "execution": "pure interpreter", + "capture_pulses": 40, + "rescue_pulses": 16, + "mac_real_hit": true, + "restraint_real_hit": true, + "zero_control_save_replay": { + "case": "x3-intro-qualified-684-zero-control", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "x_control_save_replay": { + "case": "x3-intro-qualified-684-x-control", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + } + }, + "scope": "Fresh original opening and original Mac capture/Zero control, real Mac/restraint hits, X rescue/control at native256,342 and684. Ordinary travel between scripted encounters is explicitly bypassed by the saved original-route setups; final intro boss/clear and other stages require separate checks.", + "assists": "Player position/health during upstream travel and live fights, main enemy/restraint HP1 before idle and real shots. Controller-only capture and rescue scripts; no AI, camera, control, current outcome or progression writes. No natural-traversal, natural-collection or unassisted-combat claim.", + "equality": "Each current-build Zero/X control save/load replay preserves all presented pixels and128KiB WRAM. Exact cross-width timing/RAM or whole-output equality is not asserted.", + "setup_corrections": [ + "Native Mac primary04 retirement can finish after Zero control returns; live capture actor is gone before movement completes. The initial immediate-deallocation assertion is excluded as a QA sequencing mistake.", + "The342 Zero movement reaches a raised floor rail after31 pixels. Actual left/right input and jump cross it; a flat-ground distance assumption is excluded as a QA setup mistake. Controller mobility, native retirement and current-state replay are verified." + ], + "limits": [ + "Upstream connecting travel is explicitly bypassed by original-route approach snapshots. No complete natural traversal, original-audio or exhaustive visual certification.", + "Current capture/rescue mechanics and per-width state replay pass; cross-width byte-identical timing/WRAM/full output is not asserted." + ], + "camera_owner_accepted": true, + "owner_playtest_untouched": true + }, + "camera_owner_acceptance": { + "date": "2026-10-27T23:27:20.318565+00:00", + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "message": "x3 is good on camera anchor", + "passed": true } } From c33ed97f4dd63191e79a82aa9fd35de1dc3ef8ac Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 17:05:03 -0700 Subject: [PATCH 35/40] Qualify earned Zero-loss finale and current Bit exit --- docs/WIDESCREEN.md | 30 ++++ docs/widescreen-trigger-audit.json | 218 +++++++++++++++++++++++++---- 2 files changed, 223 insertions(+), 25 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index b9b328e..5379632 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -534,3 +534,33 @@ assertion mistakes are retained separately from product results. The owner also accepts the16:9 entrance camera anchor. The focused human handoff is complete; do not repeat camera, Kaiser, doors, Byte, factory or X2. + +### Earned Zero-loss finale and current Bit follow-up (2026-10-27) + +Build d897f993 passes the fresh final-stage route at 256/default, 342/default +and 684/interpreter using the earlier naturally earned Zero-loss fixtures. +The original loader preserves that result; real Sigma damage, full Kaiser +introduction, actual virus damage, original top-camera arrival, controller +wall jumps over the raised ledge, alternate rescue, native counter 3->5/clear +and ending all execute. All three ending save/load replays preserve the +complete output and 128 KiB WRAM. Cross-width timing equality is not asserted. + +Earlier fortress eligibility and connecting travel/shaft ascent are assisted. +Kaiser HP=0 explicitly bypasses the finishing hit, which the owner has already +qualified separately. After selecting earlier fortress eligibility, no +unavailable, camera, AI, current encounter outcome or later progression flags +are supplied; no writes occur after the native clear. +The earlier actual-loss fixture retains its 10994 identity. This closes fresh +loss-result propagation, not ordinary whole-stage traversal. + +Current Bit also passes original floor contact at Y=679 (feet=703, floor=704, +camera Y=559), full 32 HP introduction, a real assisted Buster finishing hit, +native departure/result 01, right-door crossing and normal control return. +The before-room floor-only owner setup includes original resident door art. +Only Bit floor appearance awaits human confirmation; no accepted Byte, +door, camera, Kaiser, factory or X2 check needs repeating. + +Very-wide entrance anchoring above 512, uncovered stage/sublevel/branch/exit +travel, independent original-game music/SFX and broader shared-engine consumer +qualification remain open. Machine-readable current_status is authoritative; +older identity-specific remaining lists describe their historical milestone. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 93efe33..aabc1e0 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -3,16 +3,18 @@ "current_status": { "accepted": [ "Byte floor/grab/recovery/exit", - "door face and opening/closing animation", - "factory background/pickup/lift/forms/escape" + "single doors and opening/closing animation", + "factory background/pickup/lift/forms/escape", + "Kaiser no duplicate head and actual charged-shot finishing hit", + "16:9 final-stage entrance camera anchor" ], "unverified": [ - "Bit human floor/exit follow-up (automatic checks pass)", - "Real Kaiser finishing hit; uninterrupted normal escape/ledge approach", - "Four individual pending owner visual checks; skipped traversal/content inventory and independent original-game audio", - "Broader other-consumer follow-up; current X2/X3 new-base qualification remains passed without a speed claim" + "Very-wide final-entry camera anchoring: widths above512 retain the prior centred policy.", + "Bit floor-only human confirmation; current landing, actual hit/departure, door crossing and control-return automation pass.", + "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", + "Broader shared-engine consumer qualification and final merge handoff." ], - "next_cross_title_priority": "Four focused selector segments remain: Serges front, Ostrich entrance and X2/X3 final-arena visuals plus optional Kaiser hit. Accepted scenes are not repeated.", + "next_cross_title_priority": "X2 released; continue X3 very-wide anchoring and uncovered content/audio. Accepted owner checks stay complete.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -79,28 +81,39 @@ } }, "pending_visual": [ - "New final Sigma arena wall extension/head-wrap correction" + "Bit corrected floor appearance only" ], - "bossrush": "All8 transfers/real defeats/returns and cumulativeFF qualified on the retained ca0 build in pure684, with causalHP1 checks. Current339 preserves framing and sampled native rematch/hub output; no complete339 all8 replay is claimed. Exit/handoff remains separate.", - "next_priority": "Kaiser finishing hit/escape/ending, skipped traversal/content/audio and broader consumer/startup/memory qualification. Both Lab2 branches now have actual entrance/death/native-counter evidence.", + "bossrush": "Historical all8 native pad transfers/real defeats/returns and cumulativeFF retain their ca0/684 identity. Original hub-door crossing and normal fortress handoff pass in native_context_fortress_progress; later packages preserve sampled framing and guest state. No complete currentd897 all8 replay is claimed.", + "next_priority": "Very-wide chamber anchoring, uncovered content/exit/audio and broader shared-engine consumer qualification.", "current_owner_build": { - "sha256": "c3d20fc68615c8a265160c72c111c391044b7952db66baa7f425ff1f7cec9bdc", - "engine": "0095609940bc3a304da8c70f2dcab79264bbb8ab", - "compiled_engine": "e772aca74d06cef9435df2f34cda1689329b19c4", - "source_tree": "396f26717c1bf151b0e110950c5fd5f179c1823a", - "title_pin": "e0fb303780fe8b0ec938d579409c3d7d521b7ac6", - "title_code": "a0142c8e13f1f2e4c526784955654356faecbe92", - "source": "new_main_qualification", - "owner_data_unchanged": true + "sha256": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "engine": "819e2e1174335dc1c751e3bc6f0623e1438a42a2", + "game_code": "3a0e9bd79f9577734c8da2c16afd6d7cbd62f47b", + "source": "final_entry_camera_followup", + "owner_camera_accepted": true }, - "new_main_automated_gate": "Passed for current X2/X3: full images/WRAM, scalar/native game PCM+SPC, current save/Capture and matched runtime/startup/memory. Human/content/ending and broader-consumer caveats remain.", + "new_main_automated_gate": "Earlier frozen-main X2/X3 gate passed with its recorded binary identities: full images/WRAM, scalar/native PCM+SPC, current save/Capture and matched runtime/startup/memory. Current camera/intro/finale milestones add their explicitly scoped evidence; independent original audio and broader-consumer gates remain open.", "latest_native_final": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-native-final-qualification.json", "current_package": { + "engine": "819e2e1174335dc1c751e3bc6f0623e1438a42a2", + "compiled_engine": "952705a04c670d6be7bff2baf17001e8c84ff459", + "game_code": "3a0e9bd79f9577734c8da2c16afd6d7cbd62f47b", + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\chamber-anchor-qualification.json", + "additional_qualification": [ + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-intro-capture-rescue-qualification.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-qualification.json", + "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\bit-current-qualification-milestone.json" + ] + }, + "status_policy": "Authoritative current burndown. Earlier remaining/unverified lists in identity-specific followups are historical and superseded by these current milestones.", + "previous_maoh_package": { "engine": "05786e50bca11dff1f09f76c0e7ac9d48072c440", "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1", "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-qualification.json", "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-publication.json" - } + }, + "current_earned_loss_finale": "All three current-binary fresh routes pass with real upper-ledge wall jumps; connecting travel/ascent and Kaiser finishing hit are explicitly bypassed." }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", @@ -127,14 +140,23 @@ }, { "sequence": "Godkarmachine, Press Disposer and Doppler combat/aftermath", - "result": "Live32HP originals, real projectile defeats after HP assistance, native1FAF0->1 or2->3. Separate checkpoint/position/prerequisite bypasses and unresolved normal next-stage selection are recorded in fortress_branch_followup." + "result": "Live32HP originals, real projectile defeats after HP assistance, native1FAF0->1 or2->3. Separate checkpoint/position/prerequisite bypasses retain their recorded identities; original normal fortress transitions are qualified in native_context_fortress_progress." + }, + { + "sequence": "Current earned-Zero-loss fresh final-stage propagation", + "result": "All three widths pass; exact scope, explicit bypasses and per-build state replay recorded in earned_loss_current_fresh_followup." + }, + { + "sequence": "Current Bit landing, actual hit and exit", + "result": "Original floor contact, real assisted finishing hit, native departure/result, right-door crossing and normal control return pass. Human check is floor appearance only." } ], "partial_checks": [], "unverified": [ - "Bit corrected floor human confirmation and exit (automated landing/combat/exit checks pass; human exit deferred)", - "Remaining fortress branches, final Sigma/endings, complete stage/sublevel/exit coverage", - "Independent music/SFX qualification" + "Very-wide final-entry camera anchoring: widths above512 retain the prior centred policy.", + "Bit floor-only human confirmation; current landing, actual hit/departure, door crossing and control-return automation pass.", + "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", + "Broader shared-engine consumer qualification and final merge handoff." ], "assists": [ "Disposable profiles; dummy audio/video during unattended work", @@ -2199,7 +2221,7 @@ }, "observed": "Original communication/Start selects live Zero,HP1 survives idle,actual controller movement/enemy contact gives HP0/death,original native retreat sets1FB2.40,then X returns with16HP and normal control. Current-build X-return save/load replays match full output/128KiB WRAM.", "assists": "Saved current-build ready character menu bypasses prior travel. Only Zero HP1 is written before live idle survival. All selection, movement, damage, retreat and X return use original execution/controller input; no position, AI,camera,character/current result/progression/unavailable flag writes.", - "remaining": "Actual earlier loss is now qualified; fresh fortress-stage loading and alternate-rescue propagation of this naturally earned result still require their own test. Kaiser finishing hit and ordinary physical escape remain separate.", + "remaining": "Earlier actual loss retains its10994 binary identity. The later earned_loss_current_fresh_followup qualifies fresh-stage propagation through the alternate rescue and ending on currentd897 at256,342 and684. Ordinary connecting travel remains assisted.", "fresh_loader": { "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-fresh-final-first-load.json", "scope": "Earned unavailable bit survives the original fresh stage13/counter3/checkpoint0 loader. Stage/counter selection bypassed prior fortress eligibility; this alone is not final alternate-rescue validation. Wrong checkpoint1 probe dies in unused geometry and is excluded as setup failure, not a product/branch failure." @@ -2344,5 +2366,151 @@ "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", "message": "x3 is good on camera anchor", "passed": true + }, + "earned_loss_current_fresh_followup": { + "date": "2026-10-28T00:04:12.180364+00:00", + "passed": true, + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "engine": "819e2e1174335dc1c751e3bc6f0623e1438a42a2", + "game_code": "3a0e9bd79f9577734c8da2c16afd6d7cbd62f47b", + "variants": { + "256": { + "execution": "default hybrid", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-256.json", + "raw_sha256": "f6c09c37ac1e511ef6f8d9a18cc4f5f9b301d14aa4c1896de97606ae41929803", + "earlier_loss_fixture": { + "info": { + "frame": 27472, + "mode": "0204040000000003", + "stage": "00020000004000020001", + "player": "0002000200800100", + "x": 384, + "y": 927, + "hp": 16, + "camera": [ + 256, + 768 + ], + "bounds": "000a000300030001000af8ff0000000000030001", + "event": "0000000000000000000000000000000000000000000000000000000300000000000000040000000000000000000000000000000000000000000100000000000000000000000000000000000000000000" + }, + "source": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-256-x-return.sav", + "sha256": "27dbbaca591eff10425fcadcef36682ee23e0341239357121ccf2292ac2392f3", + "proof": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualification.json", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1" + }, + "sigma_real_hit": true, + "virus_contact_hp": 15, + "controller_ledge_frames": 108, + "final_pulses": 81, + "native_clear": "020408000000b701", + "native_counter": 5, + "ending": "0206000202003800", + "save_replay": { + "case": "earned-loss-fresh-finale-256-ending", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "ending_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-256-ending.sav" + }, + "342": { + "execution": "default hybrid", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-342.json", + "raw_sha256": "c4200cbabed5015120a82f0dd7da6abb8355b11149c66e24a9b3396a9aba7515", + "earlier_loss_fixture": { + "info": { + "frame": 27472, + "mode": "0204040000000003", + "stage": "00020000004000020001", + "player": "0002000200800100", + "x": 384, + "y": 927, + "hp": 16, + "camera": [ + 256, + 768 + ], + "bounds": "000a000300030001000af8ff0000000000030001", + "event": "0000000000000000000000000000000000000000000000000000000300000000000000040000000000000000000000000000000000000000000100000000000000000000000000000000000000000000" + }, + "source": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-342-x-return.sav", + "sha256": "8fe7ee863e8ff88d1fd007638b772111ac0a3a8701b7bbec16479a8c5b9342d1", + "proof": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualification.json", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1" + }, + "sigma_real_hit": true, + "virus_contact_hp": 15, + "controller_ledge_frames": 108, + "final_pulses": 81, + "native_clear": "020408000000c401", + "native_counter": 5, + "ending": "0206000202003800", + "save_replay": { + "case": "earned-loss-fresh-finale-342-ending", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "ending_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-342-ending.sav" + }, + "684": { + "execution": "pure interpreter", + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-684.json", + "raw_sha256": "55826ae2a0e95bf7a380e7e58d487f8f419e25e93e2af24de5392a9c84fefa2a", + "earlier_loss_fixture": { + "info": { + "frame": 27472, + "mode": "0204040000000003", + "stage": "00020000004000020001", + "player": "0002000200800100", + "x": 384, + "y": 927, + "hp": 16, + "camera": [ + 256, + 768 + ], + "bounds": "000a000300030001000af8ff0000000000030001", + "event": "0000000000000000000000000000000000000000000000000000000300000000000000040000000000000000000000000000000000000000000100000000000000000000000000000000000000000000" + }, + "source": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualified-684-x-return.sav", + "sha256": "b8e73886aeabf290e023fb8ad3c5c4a8eb15d3f798827f3cd6dd4ed4f030a2e2", + "proof": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\zero-loss-qualification.json", + "binary": "10994be18c6ac7dcb5dc1794d499dd751af71973528be9fdd93d9c4b6d3abbd1" + }, + "sigma_real_hit": true, + "virus_contact_hp": 15, + "controller_ledge_frames": 108, + "final_pulses": 80, + "native_clear": "020408000000c701", + "native_counter": 5, + "ending": "0206000202003800", + "save_replay": { + "case": "earned-loss-fresh-finale-684-ending", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + "ending_state": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned-loss-fresh-finale-684-ending.sav" + } + }, + "helper": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\earned_loss_fresh_finale.py", + "helper_sha256": "bde61665b2facf4ace7413d67d3ea2419787928c33af8b9aae545900ec531cd5", + "scope": "Naturally earned earlier Zero loss survives original fresh stage13/counter3/checkpoint0 loading. Current binary executes the Sigma real hit, full Kaiser intro, actual virus contact, original shaft camera, real upper-ledge wall jumps/control takeover, alternate rescue, clear and ending at all three widths.", + "assists": "Load the earlier naturally earned Zero-loss fixture. Select stage13/counter3/checkpoint0 before the original loader, explicitly bypassing earlier fortress eligibility. Player position/health/protection bypass connecting travel and shaft ascent; SigmaHP1 precedes an actual shot; KaiserHP0 explicitly bypasses the separately owner-qualified finishing hit. At the top camera, only right/jump input and health cross the native ledge and run the alternate rescue. No unavailable, camera, AI, character, current encounter outcome or later progression writes. No guest writes after original stage clear.", + "limits": "Assisted sequence qualification, not ordinary whole-stage traversal or an automated real Kaiser hit. The earlier actual-loss fixture retains its original10994 binary identity. Fresh loader, Sigma/Kaiser introduction, real virus damage, native top camera/wall jump/control takeover, alternate rescue, clear and ending run on this current binary.", + "cross_width_equality": "Not asserted. Each ending replay separately preserves all presented pixels and128KiB WRAM.", + "owner_playtest_untouched": true + }, + "bit_current_followup": { + "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "passed_automation": true, + "human_floor": "pending", + "floor_raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-bit-current-floor-qualification.json", + "exit_raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-bit-current-real-exit.json", + "scope": "Before-room setup has valid original door graphics and no live hunter/result. Original Bit lands atY679, feet703/floor704, with cameraY559. Full32HP introduction, HP1 idle/real Buster hit, original result01/deallocation, right-door crossing and normal control return pass.", + "assists": "Current-build before-room state re-save; earlier Maverick eligibility comes from the original prepared snapshot. Only controller right/B dialogue edges and player health; no hunter position,AI,HP,collision,floor,camera or result writes. Main BitHP1 before live idle and real Buster input, player aiming/health only. Original result01/deallocation, actual right door crossing/camera advance and control return; no result,door,AI,camera or control writes.", + "human_scope": "Only corrected floor appearance; prior Byte/door acceptance remains complete. No human fight or exit repeat required." } } From 47f4d91b5e6c7dbf8606d0041b82fe01b035867e Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 17:31:40 -0700 Subject: [PATCH 36/40] Accept owner Bit floor validation --- docs/WIDESCREEN.md | 4 ++-- docs/widescreen-trigger-audit.json | 24 +++++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 5379632..e7da183 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -557,8 +557,8 @@ Current Bit also passes original floor contact at Y=679 (feet=703, floor=704, camera Y=559), full 32 HP introduction, a real assisted Buster finishing hit, native departure/result 01, right-door crossing and normal control return. The before-room floor-only owner setup includes original resident door art. -Only Bit floor appearance awaits human confirmation; no accepted Byte, -door, camera, Kaiser, factory or X2 check needs repeating. +The owner subsequently accepts Bit's corrected floor appearance. All prepared +human checks are complete; accepted scenes do not need repeating. Very-wide entrance anchoring above 512, uncovered stage/sublevel/branch/exit travel, independent original-game music/SFX and broader shared-engine consumer diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index aabc1e0..85e4dec 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -6,11 +6,11 @@ "single doors and opening/closing animation", "factory background/pickup/lift/forms/escape", "Kaiser no duplicate head and actual charged-shot finishing hit", - "16:9 final-stage entrance camera anchor" + "16:9 final-stage entrance camera anchor", + "Bit corrected floor appearance" ], "unverified": [ "Very-wide final-entry camera anchoring: widths above512 retain the prior centred policy.", - "Bit floor-only human confirmation; current landing, actual hit/departure, door crossing and control-return automation pass.", "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], @@ -80,9 +80,7 @@ "performance": "Separate gate; compiler definitions establish both trace builds use AUDIO_TRACE_HISTORY=2 (FULL), despite earlier cache-based mismatch inference." } }, - "pending_visual": [ - "Bit corrected floor appearance only" - ], + "pending_visual": [], "bossrush": "Historical all8 native pad transfers/real defeats/returns and cumulativeFF retain their ca0/684 identity. Original hub-door crossing and normal fortress handoff pass in native_context_fortress_progress; later packages preserve sampled framing and guest state. No complete currentd897 all8 replay is claimed.", "next_priority": "Very-wide chamber anchoring, uncovered content/exit/audio and broader shared-engine consumer qualification.", "current_owner_build": { @@ -148,13 +146,12 @@ }, { "sequence": "Current Bit landing, actual hit and exit", - "result": "Original floor contact, real assisted finishing hit, native departure/result, right-door crossing and normal control return pass. Human check is floor appearance only." + "result": "Original landing, real assisted hit, native departure/result, right-door crossing and normal control return pass automation. Owner also accepts corrected floor appearance." } ], "partial_checks": [], "unverified": [ "Very-wide final-entry camera anchoring: widths above512 retain the prior centred policy.", - "Bit floor-only human confirmation; current landing, actual hit/departure, door crossing and control-return automation pass.", "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], @@ -2506,11 +2503,20 @@ "bit_current_followup": { "binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", "passed_automation": true, - "human_floor": "pending", + "human_floor": "passed", "floor_raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-bit-current-floor-qualification.json", "exit_raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\x3-bit-current-real-exit.json", "scope": "Before-room setup has valid original door graphics and no live hunter/result. Original Bit lands atY679, feet703/floor704, with cameraY559. Full32HP introduction, HP1 idle/real Buster hit, original result01/deallocation, right-door crossing and normal control return pass.", "assists": "Current-build before-room state re-save; earlier Maverick eligibility comes from the original prepared snapshot. Only controller right/B dialogue edges and player health; no hunter position,AI,HP,collision,floor,camera or result writes. Main BitHP1 before live idle and real Buster input, player aiming/health only. Original result01/deallocation, actual right door crossing/camera advance and control return; no result,door,AI,camera or control writes.", - "human_scope": "Only corrected floor appearance; prior Byte/door acceptance remains complete. No human fight or exit repeat required." + "human_scope": "Owner accepted corrected Bit floor appearance; the focused handoff is complete.", + "owner_acceptance": { + "at": "2026-10-28T00:26:25.521088+00:00", + "message": "what other issues do I need to check? bit looks good", + "accepted": [ + "Bit corrected floor appearance" + ], + "binary_sha256": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "scope": "Owner confirms the prepared before-room Bit floor check. Prior automated original landing, actual hit, departure, exit and control return remain passed. No repeat accepted visual checks." + } } } From ffd0637d0dcc225909ff14f58d41ab3e93d0d5ea Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 18:36:39 -0700 Subject: [PATCH 37/40] Anchor very-wide entrance views using original CX4 sprite positions --- docs/WIDESCREEN.md | 29 +++++++ docs/widescreen-trigger-audit.json | 118 ++++++++++++++++++++++++++++- framework_pins.txt | 2 +- snesrecomp | 2 +- src/x3_rtl.c | 83 ++++++++++++++++++-- 5 files changed, 223 insertions(+), 11 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index e7da183..78f92e8 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -564,3 +564,32 @@ Very-wide entrance anchoring above 512, uncovered stage/sublevel/branch/exit travel, independent original-game music/SFX and broader shared-engine consumer qualification remain open. Machine-readable current_status is authoritative; older identity-specific remaining lists describe their historical milestone. + +### Producer coordinates for very-wide entrance views (2026-10-27) + +The private candidate now anchors the final-stage entrance at684 and800px. +It observes full signed X at the original CX4 microcode write02:80E6 and +binds it to the actual OAM XY upload. An exact microcode signature guards +the policy; guest camera, OAM, collision, AI and progression stay untouched. +Pending and uploaded positions travel through the title save/rollback extension. +The shared desktop host also retains the16-bit budget: casting272 to eight +bits previously collapsed800px output to288px. + +All nine PPU fixtures and the synthetic original-instruction observer pass. +Forty-six runtime samples retain full WRAM/VRAM/OAM equality;256/342px full +images match the accepted build in entry, Byte, factory and Kaiser workloads. +At684/800 the corresponding native world pixels below the HUD match; actual +800px output replaces the baseline288px wrap. Current-build full-image/WRAM +save/load replays pass at342,684 and800. Matched342px runtime samples are +inconclusive on the shared host (median+3.14%, range-2.64%..+5.05%); +this is not a speed claim. Raw evidence is `cx4-coordinate-qualification.json` +in the retained audit workspace. + +The current owner build remainsd897 and all prepared human checks are accepted. +Full very-wide chamber travel/transitions, uncovered +content/audio and broader engine qualification remain before release. + +Image inspection also exposed a moving61px BG2 strip outside its slower +parallax canvas. Very-wide anchoring now stays within both BG layers. The +repeated46samples and three current-state replays pass;<=512 placement +retains its accepted behavior. No new owner check is prepared. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 85e4dec..81949bb 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -10,11 +10,11 @@ "Bit corrected floor appearance" ], "unverified": [ - "Very-wide final-entry camera anchoring: widths above512 retain the prior centred policy.", + "The private684/800 entrance anchor now passes presentation automation; full chamber traversal/transition qualification remain before any new handoff. Current owner build staysd897.", "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], - "next_cross_title_priority": "X2 released; continue X3 very-wide anchoring and uncovered content/audio. Accepted owner checks stay complete.", + "next_cross_title_priority": "Continue full ultra-wide chamber travel/transitions, uncovered content/audio and broader engine qualification. All prepared owner checks are accepted.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -111,7 +111,119 @@ "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-qualification.json", "publication": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\maoh-package-publication.json" }, - "current_earned_loss_finale": "All three current-binary fresh routes pass with real upper-ledge wall jumps; connecting travel/ascent and Kaiser finishing hit are explicitly bypassed." + "current_earned_loss_finale": "All three current-binary fresh routes pass with real upper-ledge wall jumps; connecting travel/ascent and Kaiser finishing hit are explicitly bypassed.", + "ultrawide_producer_followup": { + "date": "2026-10-28T01:29:57.860042+00:00", + "passed": true, + "engine": "9a0c96eba07493e4e128cdf349332e6d094b5393", + "title_base": "47f4d91b5e6c7dbf8606d0041b82fe01b035867e", + "candidate_binary": "53e9944f471fa24747b6454e8d76dc7711f0678264b2aafdf83b7e59a70f5c61", + "compiled_engine_base": "b94e0a43c65da718449bd3f7abe927cb38ab694c", + "source": "Committed engine observer/DMA/PPU changes plus the accompanying X3 producer policy; title submodule pin/docs are bookkeeping after qualification.", + "runtime": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\cx4-coordinate-runtime-qualification.json", + "runtime_samples": 46, + "current_state_replays": 3, + "ppu_fixtures": 9, + "synthetic_observer_test": "cx4_ram_observer_test: PASS", + "microcode_replay": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\cx4-coordinate-trace\\proof.json", + "signed_coordinate_cases": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\cx4-coordinate-trace\\signed-coordinate-proof.json", + "read_only_inspection": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\cx4-inspection-command-proof.json", + "cost": { + "candidate": "53e9944f471fa24747b6454e8d76dc7711f0678264b2aafdf83b7e59a70f5c61", + "baseline": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "width": 342, + "frames": 240, + "warmup": 60, + "samples": [ + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.8911516999360174, + "fps": 269.31441640882406 + }, + "baseline": { + "seconds": 0.8570100000360981, + "fps": 280.04340671624715 + }, + "candidate_time_change_percent": 3.9838158129404944 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8319208000320941, + "fps": 288.4890003841005 + }, + "candidate": { + "seconds": 0.8739230999490246, + "fps": 274.6237054656171 + }, + "candidate_time_change_percent": 5.048833965361865 + }, + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.8426415999419987, + "fps": 284.8185990538799 + }, + "baseline": { + "seconds": 0.8654665000503883, + "fps": 277.30709390372357 + }, + "candidate_time_change_percent": -2.6372944657084507 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8236906999954954, + "fps": 291.3715063206523 + }, + "candidate": { + "seconds": 0.842620600014925, + "fps": 284.8256973491379 + }, + "candidate_time_change_percent": 2.2981806179835695 + } + ], + "median_time_change_percent": 3.140998215462032, + "range_percent": [ + -2.6372944657084507, + 5.048833965361865 + ], + "classification": "Shared-host matched diagnostic workload; small mixed results are neutral/inconclusive, no speed claim", + "settings": "Software/dummy audio and video, default hybrid, same current state, serial alternating order, coverage disabled, TRACE+REVERSE_DEBUG build" + }, + "scope": "Full image equality at256/342 in entry/Byte/factory/Kaiser scenes. Full WRAM/VRAM/OAM equality at256/342/684/800. Matched native world pixels below HUD at684/800. Actual800px output fixes an existing uint8 budget wrap whose baseline produces288px. Three current-build full-image/WRAM save/load replays. Original CX4 program replay matches all3072 RAM bytes; signed coordinate cases cover -600 through900. Both renderers pass the synthetic full-position pixel sweep.", + "assist_limits": "Prepared approaches bypass earlier travel/prerequisites; controller-only sampled replays do not establish whole-stage trigger/content or independent original audio coverage.", + "owner_runtime_unchanged": true, + "owner_binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "open": [ + "Full ultra-wide chamber traversal/transition qualification before any new human handoff.", + "Uncovered stage/sublevel/branch/exit travel and independent original-game music/SFX.", + "Broader engine consumers and final merge handoff." + ], + "excluded_qa": [ + "The original00:D7B1 breakpoint addresses were copied to7E:26E1 at runtime; corrected capture uses the observed WRAM sites.", + "An initial probe used an unrecognized execution environment name; its breakpoint timeout is a setup failure, not a product defect.", + "The inspection executable hash was initially typed with65 characters; the proof was repeated with a computed64-character hash.", + "A prototype added redundant PPU residue fields, then was simplified to serialize presentation metadata through the title extension already used by rollback.", + "get_ppu_state after host presentation observes reset per-frame policies; actual presented images and guest state comparisons are the gate." + ], + "title_source_sha256": "3d958452513ed4088fe201f2ee9a49989dd0dc30b39679d0c07b75d601c6d478", + "source_pin_build": "Final53e9 candidate uses engine9a0c96e and the matching X3 submodule/framework pin. The measured source files are retained by hash; committing their unchanged contents does not require another build.", + "parallax_followup": "Actual684/800 image inspection found a61px unused BG2 strip after camera motion. Anchor now respects the slower BG2 layer left allowance. Repeated46samples/three replays pass; measured left backdrop row changes132/115/107 ->8/16/8. Both images inspected. Accepted <=512 policy unchanged." + } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", "framework_head": "b4a4e00fbf37782deb57066fb4c54f8aa587f527", diff --git a/framework_pins.txt b/framework_pins.txt index e519f18..3d5790e 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=a4e30664c078a2ee33ef61625cc73f5f1d546841 +snesrecomp=9a0c96eba07493e4e128cdf349332e6d094b5393 recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index 819e2e1..9a0c96e 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 819e2e1174335dc1c751e3bc6f0623e1438a42a2 +Subproject commit 9a0c96eba07493e4e128cdf349332e6d094b5393 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index fae4cc2..b5d5e10 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -23,6 +23,7 @@ #include "cpu_state.h" #include "cpu_trace.h" #include "snes/cart.h" +#include "snes/cx4.h" #include "snes/interp_bridge.h" #include "snes/snes.h" #include "snes/dma.h" @@ -49,6 +50,53 @@ static bool s_execution_loaded; static void x3_patch_ws_interp_obj_windows(void); static void x3_patch_hunter_landing(void); +/* The original HG51B program computes signed screen X, then writes its low + * byte at02:80E6. Retain that value for presentation, and attach it only when + * DMA actually commits the corresponding XY word to PPU OAM. Neither the + * microcode nor guest OAM/camera/collision/progression is changed. */ +static int16_t s_cx4_oam_x[128]; +static uint8_t s_cx4_oam_valid[16]; +static bool s_cx4_oam_supported; + +static void x3_cx4_ram_written(void *context, uint32_t instruction, + uint16_t address, unsigned byte, uint32_t value) { + (void)context; + if (address >= 512 || (address & 3)) return; + const unsigned slot = address >> 2; + s_cx4_oam_valid[slot >> 3] &= ~(1u << (slot & 7)); + if (instruction == 0x0280e6 && byte == 0) { + int x = (int)(value & 0xffff); + if (x >= 32768) x -= 65536; + s_cx4_oam_x[slot] = (int16_t)x; + s_cx4_oam_valid[slot >> 3] |= 1u << (slot & 7); + } +} + +static void x3_oam_xy_uploaded(uint8_t bank, uint16_t y_address, uint8_t slot) { + if (!g_snes || !g_snes->cart || !s_cx4_oam_supported || + !cart_is_cx4_window(g_snes->cart, bank, y_address)) return; + /* Accept both RAM mirrors, but never IO, a shifted byte pair, or a source + * whose current byte no longer matches the captured full coordinate. */ + const unsigned offset = y_address & 0xfff; + if (offset >= 512 || (offset & 3) != 1) return; + const unsigned source_slot = offset >> 2; + if (!(s_cx4_oam_valid[source_slot >> 3] & (1u << (source_slot & 7)))) return; + const int16_t x = s_cx4_oam_x[source_slot]; + if ((g_ppu->oam[slot * 2] & 255) == (x & 255)) + PpuWsSetOamFullX(g_ppu, slot, x); +} + +static void x3_install_oam_observers(void) { + static const uint8_t signature[] = {0x60,0x80,0x68,0x80,0x66,0xe0,0x0c,0xe0,0x00,0xec}; + Cart *cart = g_snes ? g_snes->cart : NULL; + s_cx4_oam_supported = cart && cart->cx4 && cart->romSize >= 0x100e8 && + !memcmp(cart->rom + 0x100de, signature, sizeof(signature)); + if (cart && cart->cx4) + cx4_set_ram_write_observer(cart->cx4, + s_cx4_oam_supported ? x3_cx4_ram_written : NULL, NULL); + dma_set_oam_xy_notify_hook(s_cx4_oam_supported ? x3_oam_xy_uploaded : NULL); +} + /* Read a 16-bit CPU vector out of bank $00's vector table. */ static uint32_t x3_read_vector_pc24(uint16_t vec_addr) { uint8 lo = cpu_read8(&g_cpu, 0x00, vec_addr); @@ -94,6 +142,7 @@ static int x3_boot_log_enabled(void) { } void RunOneFrameOfGame(void) { + x3_install_oam_observers(); /* Generated bodies route viewport constants through X3WsObjWin*. * Interpreter fallbacks fetch the original ROM bytes, so mirror those * dynamic constants into the private runtime ROM copy each frame. */ @@ -277,7 +326,7 @@ static void x3_configure_chamber_view(void) { * the widescreen allowance inside this authored room. Leave the guest's * camera, scroll limits, OAM and sequence comparisons untouched. * Locked boss/escape views keep their separate arena policies. */ - if (!g_ws_active || g_ws_extra > 128 || g_ram[0xd1] != 4 || + if (!g_ws_active || (g_ws_extra > 128 && !s_cx4_oam_supported) || g_ram[0xd1] != 4 || g_ram[0x1fae] != 13 || (g_ppu->bgmode & 7) != 1 || g_ppu->bgXsc[0] != 0x51 || g_ppu->bgXsc[1] != 0x59) return; @@ -290,13 +339,22 @@ static void x3_configure_chamber_view(void) { return; const int cx = camera < left_bound ? left_bound : camera > right_bound ? right_bound : camera; - int left = cx - left_bound; + int left_available = cx - left_bound; + /* BG2 starts at map phase0 in this chamber and advances at half speed. + * Spending BG1's entire left allowance exposes BG2's unused predecessor + * cells while moving away from the entrance. Slide within both layers' + * authored art. The accepted <=512 policy retains its existing origin. */ + const int bg2_left_available = g_ppu->hScroll[1] & 1023; + if (g_ws_extra > 128 && left_available > bg2_left_available) + left_available = bg2_left_available; + int left = left_available; if (left > g_ws_extra) left = g_ws_extra; int right = right_bound - cx; if (right > 2 * g_ws_extra - left) right = 2 * g_ws_extra - left; - left = cx - left_bound; + left = left_available; if (left > 2 * g_ws_extra - right) left = 2 * g_ws_extra - right; PpuSetWidescreenViewAnchor(g_ppu, true); + PpuWsEnableOamFullX(g_ppu, g_ws_extra > 128); PpuSetExtraSideSpace(g_ppu, left, right, 0); /* Dialogue is authored in screen coordinates. Keep its complete native * sheet at the physical centre while only the world view slides. */ @@ -308,6 +366,7 @@ static void x3_configure_chamber_view(void) { void X3ConfigureWsHud(void) { extern bool g_ws_active; if (!g_ppu) return; + x3_install_oam_observers(); x3_configure_chamber_view(); /* X3's HUD is OAM-only; BG3 is gameplay dialogue and must stay centered. */ PpuSetWidescreenHudSplit(g_ppu, 0, 0, 0); @@ -921,7 +980,7 @@ typedef struct X3LleSaveChunk { void X3StateSaveExtra(SaveLoadInfo *sli) { X3LleSaveChunk c; memset(&c, 0, sizeof(c)); - c.magic = kX3LleSaveMagic + 1; + c.magic = kX3LleSaveMagic + 2; c.resume_pc24 = s_lle_resume_pc; c.A = g_cpu.A; c.X = g_cpu.X; c.Y = g_cpu.Y; c.S = g_cpu.S; c.D = g_cpu.D; c.DB = g_cpu.DB; c.PB = g_cpu.PB; c.P = g_cpu.P; @@ -935,6 +994,10 @@ void X3StateSaveExtra(SaveLoadInfo *sli) { c.host_frames = (uint32_t)s_lle_host_frames; sli->func(sli, &c, sizeof(c)); RtlSaveExecutionState(sli); + sli->func(sli, s_cx4_oam_x, sizeof(s_cx4_oam_x)); + sli->func(sli, s_cx4_oam_valid, sizeof(s_cx4_oam_valid)); + sli->func(sli, g_ppu->wsOamFullX, sizeof(g_ppu->wsOamFullX)); + sli->func(sli, g_ppu->wsOamFullXValid, sizeof(g_ppu->wsOamFullXValid)); } void X3StateLoadExtra(SaveLoadInfo *sli, uint32_t version) { @@ -943,7 +1006,7 @@ void X3StateLoadExtra(SaveLoadInfo *sli, uint32_t version) { memset(&c, 0, sizeof(c)); sli->func(sli, &c, sizeof(c)); s_execution_loaded = false; - if (c.magic != kX3LleSaveMagic && c.magic != kX3LleSaveMagic + 1) { + if (c.magic < kX3LleSaveMagic || c.magic > kX3LleSaveMagic + 2) { fprintf(stderr, "[x3_rtl] save extra: bad magic $%08X — ignoring LLE chunk\n", (unsigned)c.magic); @@ -964,8 +1027,16 @@ void X3StateLoadExtra(SaveLoadInfo *sli, uint32_t version) { s_lle_resume_pc = c.resume_pc24 & 0xFFFFFFu; s_lle_host_frames = c.host_frames ? c.host_frames : 1u; s_lle_extra_loaded = true; - if (c.magic == kX3LleSaveMagic + 1) + if (c.magic >= kX3LleSaveMagic + 1) s_execution_loaded = RtlLoadExecutionState(sli); + memset(s_cx4_oam_valid, 0, sizeof(s_cx4_oam_valid)); + memset(g_ppu->wsOamFullXValid, 0, sizeof(g_ppu->wsOamFullXValid)); + if (c.magic == kX3LleSaveMagic + 2) { + sli->func(sli, s_cx4_oam_x, sizeof(s_cx4_oam_x)); + sli->func(sli, s_cx4_oam_valid, sizeof(s_cx4_oam_valid)); + sli->func(sli, g_ppu->wsOamFullX, sizeof(g_ppu->wsOamFullX)); + sli->func(sli, g_ppu->wsOamFullXValid, sizeof(g_ppu->wsOamFullXValid)); + } fprintf(stderr, "[x3_rtl] LLE load extra resume=$%06X master=%llu\n", (unsigned)s_lle_resume_pc, (unsigned long long)g_cpu.master_cycles); From 2cc0691c365c30d911a049238475f27040223bb5 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 19:48:08 -0700 Subject: [PATCH 38/40] Pin native OBJ-quota fix and record fortress traversal gaps --- docs/WIDESCREEN.md | 32 +++ docs/widescreen-trigger-audit.json | 335 ++++++++++++++++++++++++++++- framework_pins.txt | 2 +- snesrecomp | 2 +- 4 files changed, 367 insertions(+), 4 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 78f92e8..da60a6d 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -593,3 +593,35 @@ Image inspection also exposed a moving61px BG2 strip outside its slower parallax canvas. Very-wide anchoring now stays within both BG layers. The repeated46samples and three current-state replays pass;<=512 placement retains its accepted behavior. No new owner check is prepared. + +### Native OBJ quotas and the connecting fortress route (2026-10-27) + +Busy wide margins were consuming the native32-object/34-sliver quotas. The +private3368 build keeps margin work outside those quotas while retaining +authentic native overflow, OAM order and the explicit NoSpriteLimits option. +The old evaluator fails eight synthetic assertions across both renderers; all +nine PPU fixtures now pass. Twelve exact corridor inputs match zero-extra +native OBJ pixels and overflow flags below the HUD. The observed missing +native pixels (3,10,3 in three samples) are repaired. + +Thirty-eight paired samples retain whole images and full WRAM/VRAM/OAM at +256/342 in entry, Byte, factory and Kaiser scenes. Three current-build image/ +WRAM replays pass, including full32HP Kaiser at800. The assisted800 route +now crosses the corridor, both ladder transitions and the long shaft into +full32HP Sigma, an actual HP1-assisted Buster defeat, and full32HP Kaiser. +All119 sampled route states retain paired WRAM/VRAM/OAM equality. Traversal +positions, health and protection are assists; ladders/dialogue/boss damage run +on original controller input. No camera, AI, control or result flags are set. + +Matched diagnostic cost samples retain neutral native256 throughput. The busy +342 workload measures median+4.02% (+0.003..+0.199ms/frame) while rendering +required sprites the old quotas discarded.800 measures-1.72% on the shared +host; it does not offset the342 cost or establish an optimization win. Slowest +observed candidate throughput is170fps. Broader consumers remain a separate +gate. Raw evidence: `native-quota-qualification.json`. + +The connecting route exposes a separate unresolved issue: unused background +space and out-of-room projectiles beside the vertical travel rooms, including +the full43px right gutter at342. `beads-8wg.19.5` owns that fix. Trigger +progress does not clear this visual failure. The owner build remainsd897, +all prepared human checks stay accepted, and no release/handoff is made. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 81949bb..634ee90 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -10,11 +10,11 @@ "Bit corrected floor appearance" ], "unverified": [ - "The private684/800 entrance anchor now passes presentation automation; full chamber traversal/transition qualification remain before any new handoff. Current owner build staysd897.", + "Bounded final-fortress travel-room presentation (beads-8wg.19.5): blank shaft gutters/out-of-room projectiles reproduce at342 and800. Assisted800 corridor/ladders/shaft, full Sigma intro/real assisted hit and full Kaiser intro pass; this does not clear the visual gap.", "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], - "next_cross_title_priority": "Continue full ultra-wide chamber travel/transitions, uncovered content/audio and broader engine qualification. All prepared owner checks are accepted.", + "next_cross_title_priority": "Fix final-fortress travel-room canvas (19.5), then uncovered content/audio and broader engine qualification. Existing owner checks stay complete.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -223,6 +223,337 @@ "title_source_sha256": "3d958452513ed4088fe201f2ee9a49989dd0dc30b39679d0c07b75d601c6d478", "source_pin_build": "Final53e9 candidate uses engine9a0c96e and the matching X3 submodule/framework pin. The measured source files are retained by hash; committing their unchanged contents does not require another build.", "parallax_followup": "Actual684/800 image inspection found a61px unused BG2 strip after camera motion. Anchor now respects the slower BG2 layer left allowance. Repeated46samples/three replays pass; measured left backdrop row changes132/115/107 ->8/16/8. Both images inspected. Accepted <=512 policy unchanged." + }, + "native_obj_quota_followup": { + "date": "2026-10-28T02:43:16.696704+00:00", + "issue": "beads-8wg.2.159", + "implemented": true, + "component_qualified": true, + "whole_x3_ready": false, + "compiled_engine_base": "9a0c96eba07493e4e128cdf349332e6d094b5393", + "compiled_working_patch_sha256": "2cc96e2a248b8fba33f5d0743d7fe354fdee8631d9963f2dc308ee5005b569db", + "title_code": "ffd0637d0dcc225909ff14f58d41ab3e93d0d5ea", + "candidate_binary": "3368da39e6a8ae5b6219545af0bc49e911d58e21bf4b01a2bb916cfb413d8d3d", + "baseline_binary": "53e9944f471fa24747b6454e8d76dc7711f0678264b2aafdf83b7e59a70f5c61", + "synthetic": { + "negative_control_exit": 1, + "negative_assertions": 8, + "positive_ppu_fixtures": 9, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultrawide-anchor-tests\\results.json" + }, + "original_real_case": { + "native_missing_pixels": 3, + "before_flags": 3, + "native_flags": 0, + "after_missing_pixels": 0, + "raw_before": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\chamber-obj-quota-probe-before.jsonl" + }, + "twelve_native_references": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-native-quota-reference.json", + "standard": { + "samples": 38, + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\native-quota-standard-qualification.json", + "scope": "Current build native256 and accepted342 presentation regression, full output/128KiB WRAM/64KiB VRAM/OAM. Two current-state replays; separate800px full32HP Kaiser replay. Prepared approaches bypass earlier travel; not full-stage coverage or new human acceptance." + }, + "current_state_replays": [ + { + "case": "native-quota-native-current", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + { + "case": "native-quota-byte-current", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + }, + { + "case": "ultra-chamber800-kaiser-full32-current", + "ram_difference": 0, + "pixel_difference": 0, + "passed": true + } + ], + "route": [ + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-horizontal-final.json", + "samples": 13 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-ladder-approach.json", + "samples": 2 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-ladder1.json", + "samples": 14 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-ladder2.json", + "samples": 16 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-sigma-shaft.json", + "samples": 17 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-sigma-intro.json", + "samples": 22 + }, + { + "raw": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-kaiser-intro.json", + "samples": 35 + } + ], + "real_sigma_hit": { + "candidate": true, + "baseline": true, + "main_hp_assist": 1, + "idle_survives": true, + "cycles": 6, + "finishing_damage": "actual controller Buster projectile" + }, + "kaiser": "Original full32HP intro reached, paired full WRAM/VRAM/OAM and native world pixels agree. Actual Kaiser finishing hit remains separately owner-qualified; no new automated finishing-hit claim.", + "producer_coverage": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-producer-coverage.json", + "costs": { + "candidate": "3368da39e6a8ae5b6219545af0bc49e911d58e21bf4b01a2bb916cfb413d8d3d", + "baseline": "53e9944f471fa24747b6454e8d76dc7711f0678264b2aafdf83b7e59a70f5c61", + "fixture": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-chamber800-horizontal-final-ppu-input-120.sav", + "cases": { + "256": { + "width": 256, + "samples": [ + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.839136999915354, + "fps": 286.0081250430019 + }, + "baseline": { + "seconds": 0.8029985000612214, + "fps": 298.8797612719104 + }, + "time_change_percent": 4.500444253803382 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8250705000245944, + "fps": 290.88423352046385 + }, + "candidate": { + "seconds": 0.7940487000159919, + "fps": 302.2484640994519 + }, + "time_change_percent": -3.759896882469771 + }, + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.8095782999880612, + "fps": 296.4506336243687 + }, + "baseline": { + "seconds": 0.7791185000678524, + "fps": 308.04043284699145 + }, + "time_change_percent": 3.909520813272449 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8171895999694243, + "fps": 293.6894938567252 + }, + "candidate": { + "seconds": 0.7836314999731258, + "fps": 306.2664020119542 + }, + "time_change_percent": -4.106525584460952 + } + ], + "median_percent": 0.07481196540133905, + "range_percent": [ + -4.106525584460952, + 4.500444253803382 + ], + "extra_required_pixels": false, + "scope": "Matched shared-host diagnostic software/dummy-audio workload, four serial alternating pairs. Width800 now renders required margin sprites previously discarded; do not aggregate widths or claim an optimization win." + }, + "342": { + "width": 342, + "samples": [ + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.8871251000091434, + "fps": 270.53681605618686 + }, + "baseline": { + "seconds": 0.8393530999310315, + "fps": 285.9344893343701 + }, + "time_change_percent": 5.691526019506843 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8527871000114828, + "fps": 281.43014827120203 + }, + "candidate": { + "seconds": 0.8535340001108125, + "fps": 281.183877817218 + }, + "time_change_percent": 0.08758341904089306 + }, + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 0.8655765999574214, + "fps": 277.2718209015884 + }, + "baseline": { + "seconds": 0.8324201999930665, + "fps": 288.3159250604431 + }, + "time_change_percent": 3.9831325530820916 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 0.8481509999837726, + "fps": 282.9684808537534 + }, + "candidate": { + "seconds": 0.8825752000557259, + "fps": 271.93150225028575 + }, + "time_change_percent": 4.058734832902622 + } + ], + "median_percent": 4.020933692992356, + "range_percent": [ + 0.08758341904089306, + 5.691526019506843 + ], + "extra_required_pixels": true, + "scope": "Matched shared-host diagnostic software/dummy-audio workload, four serial alternating pairs. Width800 now renders required margin sprites previously discarded; do not aggregate widths or claim an optimization win." + }, + "800": { + "width": 800, + "samples": [ + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 1.412044099997729, + "fps": 169.96636294885263 + }, + "baseline": { + "seconds": 1.4261314000468701, + "fps": 168.2874383048521 + }, + "time_change_percent": -0.9877981824590654 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 1.4011675000656396, + "fps": 171.2857313552854 + }, + "candidate": { + "seconds": 1.394343400024809, + "fps": 172.12402625904764 + }, + "time_change_percent": -0.4870295693063853 + }, + { + "order": [ + "candidate", + "baseline" + ], + "candidate": { + "seconds": 1.3760040999623016, + "fps": 174.4180849508917 + }, + "baseline": { + "seconds": 1.4106234000064433, + "fps": 170.13754344278124 + }, + "time_change_percent": -2.4541844438411786 + }, + { + "order": [ + "baseline", + "candidate" + ], + "baseline": { + "seconds": 1.3968166999984533, + "fps": 171.81925158846238 + }, + "candidate": { + "seconds": 1.3152291999431327, + "fps": 182.47770047256935 + }, + "time_change_percent": -5.840959666032841 + } + ], + "median_percent": -1.720991313150122, + "range_percent": [ + -5.840959666032841, + -0.4870295693063853 + ], + "extra_required_pixels": true, + "scope": "Matched shared-host diagnostic software/dummy-audio workload, four serial alternating pairs. Width800 now renders required margin sprites previously discarded; do not aggregate widths or claim an optimization win." + } + } + }, + "cost_assessment": "Native256 neutral within variation. Busy342 workload measured median+4.02% / +0.003..+0.199ms per frame while drawing required sprites the old quota discarded; do not call that a speed win or offset it with800 results. All observed candidate throughput at least170fps.800 results are shared-host observations, not an optimization claim. Broader consumer qualification remains separate.", + "assistance": "Earlier native Zero-loss fixture and original stage13/counter3/checkpoint0 loader bypass fortress eligibility. Position/protection/health assists bypass corridor/platforming and the long shaft. Both ladders then use original controller inputs, with one X-position correction before the second ladder. B dialogue edges run original Sigma/Kaiser introductions. SigmaHP1 precedes idle survival and a real Buster defeat. No camera, AI, control, unavailable, current encounter result or later progression writes.", + "excluded_qa": [ + "Initial regular-record descriptor-bank6 guess rejected; bank3C uniquely matches all31 loaded records.", + "Initial slot-save snapshots were one frame later than the image; a live before/after calibration established phase. Final12 source OAM/VRAM blobs match their images byte-for-byte." + ], + "open_visual_issue": { + "id": "beads-8wg.19.5", + "scope": "Unused backdrop and out-of-room projectiles beside bounded fortress travel rooms, also reproduced at342. Mechanics passing does not clear this visual gap.", + "before": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\cx4-coordinate-probe2\\fortress-shaft342-before.png", + "layout": "G:\\Temp\\Codex\\mmx23-trigger-audit-20261026\\burndown\\ultra-fortress-shaft-layout-observations.json" + }, + "owner_runtime_unchanged": true, + "owner_binary": "d897f99300a6fcd187f85775bd4cbb4029c470c92a028ea04affed1963a62c64", + "private_probes": "stopped", + "no_new_human_handoff": true, + "engine_commit": "3e2e56737c2494bc7cce8e765948973068d8b2d7" } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", diff --git a/framework_pins.txt b/framework_pins.txt index 3d5790e..37d3d9c 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=9a0c96eba07493e4e128cdf349332e6d094b5393 +snesrecomp=3e2e56737c2494bc7cce8e765948973068d8b2d7 recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index 9a0c96e..3e2e567 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 9a0c96eba07493e4e128cdf349332e6d094b5393 +Subproject commit 3e2e56737c2494bc7cce8e765948973068d8b2d7 From efa5839bef8a4fc9caf8c4ae16c137f807c42460 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 20:34:28 -0700 Subject: [PATCH 39/40] Continue fortress shaft walls and contain out-of-room sprites --- docs/WIDESCREEN.md | 26 ++++++++++++++ docs/widescreen-trigger-audit.json | 10 ++++-- framework_pins.txt | 2 +- snesrecomp | 2 +- src/x3_rtl.c | 57 ++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 4 deletions(-) diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index da60a6d..914ccf2 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -625,3 +625,29 @@ space and out-of-room projectiles beside the vertical travel rooms, including the full43px right gutter at342. `beads-8wg.19.5` owns that fix. Trigger progress does not clear this visual failure. The owner build remainsd897, all prepared human checks stay accepted, and no release/handoff is made. + +### Bounded final-fortress travel canvas (2026-10-27) + +The connecting shafts now continue their authored outer wall pixel into +overflow gutters. Bounds come from the loaded BG1 screen rows, preserving +intentional transparent cells and genuine offscreen terrain. The two visible +source rows can have different spans. BG2 retains its live circular canvas, +including negative logical Y; BG2 and guest OAM are clipped outside the room. +Configured HUD slots and native OBJ quotas remain intact. The accepted +entrance anchor and closed boss policies retain ownership. No camera, AI, +collision, encounter-result or progression value is replaced. + +Native256/342/684/800 static comparisons and moving342/684/800 ladder/shaft +routes preserve native pixels and full WRAM/VRAM/OAM. Bit, Byte, factory and +the entrance retain their full342px output in automated regression; all three +current-build shaft save/load replays pass. Nine PPU fixtures pass; the new +guest-OAM clipping assertions fail on the preceding engine, across both +renderers. Before/after images show the342px brown gutter and stray projectile +replaced by wall continuation, including the wider source-row transitions. + +This resolves the demonstrated canvas gap in `beads-8wg.19.5`; it does not +qualify skipped stage/sublevel/branch/exit travel or independent original +music/SFX. Raw qualification and matched diagnostic cost samples are retained +in `fortress-travel-qualification.json`. This is a correctness change, not an +optimization claim. The owner runtime remainsd897, all prepared checks remain +accepted, and broader engine consumer/final merge qualification stays open. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index 634ee90..f326e8e 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -10,11 +10,10 @@ "Bit corrected floor appearance" ], "unverified": [ - "Bounded final-fortress travel-room presentation (beads-8wg.19.5): blank shaft gutters/out-of-room projectiles reproduce at342 and800. Assisted800 corridor/ladders/shaft, full Sigma intro/real assisted hit and full Kaiser intro pass; this does not clear the visual gap.", "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], - "next_cross_title_priority": "Fix final-fortress travel-room canvas (19.5), then uncovered content/audio and broader engine qualification. Existing owner checks stay complete.", + "next_cross_title_priority": "Uncovered content/audio and broader engine qualification. Prepared human checks complete; fortress travel canvas fixed/automatically qualified.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -554,6 +553,13 @@ "private_probes": "stopped", "no_new_human_handoff": true, "engine_commit": "3e2e56737c2494bc7cce8e765948973068d8b2d7" + }, + "fortress_travel_canvas": { + "passed": true, + "bead": "beads-8wg.19.5", + "candidate": "be7d1f8e58613050fab7621377502175ad1fcea59337e7a2ad0454e644fac857", + "evidence": "fortress-travel-qualification.json", + "scope": "Assisted connecting-route presentation/trigger regression, not exhaustive natural stage traversal or independent original-game audio. Broader shared-engine consumers/final integration still open." } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", diff --git a/framework_pins.txt b/framework_pins.txt index 37d3d9c..62c31b4 100644 --- a/framework_pins.txt +++ b/framework_pins.txt @@ -1,4 +1,4 @@ -snesrecomp=3e2e56737c2494bc7cce8e765948973068d8b2d7 +snesrecomp=633cf3418ce7443cbcea2421746929dea6d753e8 recomp-ui=0546fbcb0126bb14bf88d2128b4fe8a4229570a3 recomp-net=8c76fb643339144a3a84d5ba8f5defe6250dcd26 retcomm-rbengine=2a03e73693acee0fb78076ea058642c931bef12e diff --git a/snesrecomp b/snesrecomp index 3e2e567..633cf34 160000 --- a/snesrecomp +++ b/snesrecomp @@ -1 +1 @@ -Subproject commit 3e2e56737c2494bc7cce8e765948973068d8b2d7 +Subproject commit 633cf3418ce7443cbcea2421746929dea6d753e8 diff --git a/src/x3_rtl.c b/src/x3_rtl.c index b5d5e10..d37bf81 100644 --- a/src/x3_rtl.c +++ b/src/x3_rtl.c @@ -392,9 +392,66 @@ static uint16_t x3_maoh_margin_tile(void *context, uint16_t address, return (tile & 0x3ff) >= 0x300 ? tile : 0; } +static void x3_configure_fortress_travel(void) { + if (!g_ws_active || !g_ppu || g_ram[0xd1] != 4 || g_ram[0x1fae] != 13 || + (g_ppu->bgmode & 7) != 1 || g_ppu->bgXsc[0] != 0x51 || + g_ppu->bgXsc[1] != 0x59) + return; + const int camera_y = g_ram[0x1e60] | g_ram[0x1e61] << 8; + const int left = g_ram[0x1e6e] | g_ram[0x1e6f] << 8; + const int right = g_ram[0x1e68] | g_ram[0x1e69] << 8; + const int top = g_ram[0x1e6a] | g_ram[0x1e6b] << 8; + const int bottom = g_ram[0x1e6c] | g_ram[0x1e6d] << 8; + /* The entrance anchor and closed boss arenas already own their framing. + * Verify the loaded fortress layout before interpreting screen0 as void. */ + if (camera_y < 2560 || camera_y > 3584 || + (left == 256 && right == 1536 && top == 3584) || + (left == right && top == bottom) || + g_ram[0xe800 + 10 * 32 + 7] != 10 || + g_ram[0xe800 + 14 * 32 + 1] != 17) + return; + const int camera_x = g_ram[0x1e5d] | g_ram[0x1e5e] << 8; + int dx = (g_ppu->hScroll[0] - camera_x) & 511; + int dy = (g_ppu->vScroll[0] - camera_y) & 255; + if (dx >= 256) dx -= 512; + if (dy >= 128) dy -= 256; + const int world_x = camera_x + dx, world_y = camera_y + dy; + /* At most two256px source rows intersect the native224px frame. Their + * nonzero screen spans describe the authored canvas, including intentional + * transparent holes inside it. Never infer room bounds from opaque pixels. + * Continue only the outermost wall pixel, avoiding reflected doors/actors. + * BG2 remains its live circular canvas (its logical Y may be negative). */ + for (unsigned slot = 0; slot < 2; ++slot) { + const int row = (world_y >> 8) + slot; + if (row < 10 || row > 14) continue; + int y0 = row * 256 - world_y, y1 = y0 + 256; + if (y0 < 0) y0 = 0; + if (y1 > 224) y1 = 224; + if (y0 >= y1) continue; + int first = 32, last = -1; + for (int x = 0; x < 32; ++x) { + if (!g_ram[0xe800 + row * 32 + x]) continue; + if (first == 32) first = x; + last = x; + } + if (last < first) continue; + int a = first * 256 - world_x + g_ppu->hScroll[0]; + int b = (last + 1) * 256 - world_x + g_ppu->hScroll[0]; + /* Keep authentic quake/scroll overhang. World policies use the hardware + * phase; a distant negative bound is outside the widest supported view. */ + if (a > g_ppu->hScroll[0]) a = g_ppu->hScroll[0]; + if (a < 0) a = 0; + if (b < g_ppu->hScroll[0] + 256) b = g_ppu->hScroll[0] + 256; + PpuSetWidescreenLayerWorldRepeatBandSlot(g_ppu,slot,0,y0,y1,a,b,1); + PpuSetWidescreenLayerWorldClipBandSlot(g_ppu,slot,1,y0,y1,0,a,b); + PpuSetWidescreenLayerWorldClipBandSlot(g_ppu,slot,4,y0,y1,0,a,b); + } +} + /* Exact background source for the widescreen margins. */ void X3ConfigureWsBgMargins(void) { Mmx23ConfigureWsBgMargins(g_snes, g_ppu, g_ram, g_ws_active); + x3_configure_fortress_travel(); /* Keep Maoh's genuine offscreen body inside its512px canvas while BG1 * supplies the roof. Never reflect the boss or expose stale map * cells beside it. Enter the policy when the original camera reaches the From 9ad6c7d796e3e5153c3626858551ce96f5383f76 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Tue, 27 Oct 2026 21:28:32 -0700 Subject: [PATCH 40/40] Release v0.0.7 with accepted widescreen fixes --- VERSION | 2 +- docs/WIDESCREEN.md | 9 +++++++++ docs/widescreen-trigger-audit.json | 14 +++++++++++++- tools/make_release.ps1 | 15 +++++++++++---- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index 1750564..5a5831a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.6 +0.0.7 diff --git a/docs/WIDESCREEN.md b/docs/WIDESCREEN.md index 914ccf2..22f0571 100644 --- a/docs/WIDESCREEN.md +++ b/docs/WIDESCREEN.md @@ -651,3 +651,12 @@ music/SFX. Raw qualification and matched diagnostic cost samples are retained in `fortress-travel-qualification.json`. This is a correctness change, not an optimization claim. The owner runtime remainsd897, all prepared checks remain accepted, and broader engine consumer/final merge qualification stays open. + +### v0.0.7 closeout (2026-10-27) + +The owner accepts all prepared visual checks and authorizes releasing the +frozen fixes without another production gameplay/save-load pass. Existing +qualified runtime evidence is reused. Production packaging verifies the +diagnostics-disabled build, DLL closure, archive contents and checksums. +Uncovered routes/audio and broader shared-engine consumers remain follow-up +work; this release does not claim exhaustive full-game validation. diff --git a/docs/widescreen-trigger-audit.json b/docs/widescreen-trigger-audit.json index f326e8e..abc5506 100644 --- a/docs/widescreen-trigger-audit.json +++ b/docs/widescreen-trigger-audit.json @@ -13,7 +13,7 @@ "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", "Broader shared-engine consumer qualification and final merge handoff." ], - "next_cross_title_priority": "Uncovered content/audio and broader engine qualification. Prepared human checks complete; fortress travel canvas fixed/automatically qualified.", + "next_cross_title_priority": "Publish frozen X3 v0.0.7; no further stage audit. Uncovered content/audio and broader shared-engine integration remain separate follow-up work.", "shared_engine_regression": { "engine": "5e88adcb8eae370254c2ed0f6daad82763e02711", "cases": [ @@ -560,6 +560,18 @@ "candidate": "be7d1f8e58613050fab7621377502175ad1fcea59337e7a2ad0454e644fac857", "evidence": "fortress-travel-qualification.json", "scope": "Assisted connecting-route presentation/trigger regression, not exhaustive natural stage traversal or independent original-game audio. Broader shared-engine consumers/final integration still open." + }, + "release_closeout": { + "version": "0.0.7", + "owner_authorized": true, + "gameplay_frozen_at": "efa5839bef8a4fc9caf8c4ae16c137f807c42460", + "engine": "633cf3418ce7443cbcea2421746929dea6d753e8", + "additional_runtime_validation": "Skipped at owner request; reuse existing accepted visual/automated evidence. Production compilation and package-integrity checks only.", + "follow_up": [ + "Remaining stage/sublevel/branch/exit coverage, including skipped connecting travel, and independent original-game music/SFX.", + "Broader shared-engine consumer qualification and final merge handoff." + ], + "no_new_human_checks": true } }, "base_title_head": "371c3e83b97c258ac553430742b2f79d7e93ebe9", diff --git a/tools/make_release.ps1 b/tools/make_release.ps1 index 18de2d5..ddd8b41 100644 --- a/tools/make_release.ps1 +++ b/tools/make_release.ps1 @@ -37,7 +37,11 @@ param( $ErrorActionPreference = 'Stop' $root = Split-Path -Parent $PSScriptRoot -$build = Join-Path $root $BuildDir +$build = if ([IO.Path]::IsPathRooted($BuildDir)) { + [IO.Path]::GetFullPath($BuildDir) +} else { + Join-Path $root $BuildDir +} $exeName = 'MegaManX3SNESRecomp.exe' $exe = Join-Path $build $exeName $assets = Join-Path $build 'assets' @@ -78,10 +82,10 @@ if (-not $stageFull.StartsWith($outFull, [StringComparison]::OrdinalIgnoreCase) } if (Test-Path -LiteralPath $stage) { - Remove-Item -LiteralPath $stage -Recurse -Force + Remove-Item -LiteralPath $stage -Recurse } if (Test-Path -LiteralPath $zip) { - Remove-Item -LiteralPath $zip -Force + Remove-Item -LiteralPath $zip } New-Item -ItemType Directory -Path $stage -Force | Out-Null @@ -90,6 +94,9 @@ Copy-Item -LiteralPath (Join-Path $root 'README.md') -Destination $stage Copy-Item -LiteralPath (Join-Path $root 'LICENSE') -Destination $stage New-Item -ItemType Directory -Path (Join-Path $stage 'docs') -Force | Out-Null Copy-Item -LiteralPath (Join-Path $root 'docs\COVERAGE_2026-10-18.md') -Destination (Join-Path $stage 'docs') +foreach ($doc in @('WIDESCREEN.md', 'SAVE_STATES.md', 'CX4.md')) { + Copy-Item -LiteralPath (Join-Path $root "docs\$doc") -Destination (Join-Path $stage 'docs') +} Copy-Item -LiteralPath $assets -Destination $stage -Recurse # Release-owned mod catalog, when the build stages one. Ships as a nested # directory tree, which is exactly what made portable ZIP entry names matter @@ -106,7 +113,7 @@ if (Test-Path -LiteralPath $mods) { $stageMods = Join-Path $stage 'mods' if (Test-Path -LiteralPath $stageMods) { Get-ChildItem -LiteralPath $stageMods -Recurse -File -Filter 'state.toml*' | - ForEach-Object { Remove-Item -LiteralPath $_.FullName -Force } + ForEach-Object { Remove-Item -LiteralPath $_.FullName } } # Never publish an unattended diagnostic build. $cache = Join-Path $build 'CMakeCache.txt'