mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
41935aa2a2
Second batch of the Gen 3 review work: the review lanes closed their queues and the test gate grew with them. Review census: 139 routed findings -- 118 fixed, 14 invalid (the report had Gen 4+ semantics in more than one place), 6 struck as stale after re-verification, 1 re-routed. Every fix carries its own pret citation in docs/game3/review-v3-triage.md; the E10 opcode closure is itemised in docs/game3/e10-opcode-spec.md (18 ops wired, 2 reclassified to the seam class). Representative ROM-grounded changes: - The POKéMON start-menu entry is now gated on FLAG_SYS_POKEMON_GET the way retail does it (pokefirered/src/start_menu.c:217-218, flag 0x828). - Money ops read their amount raw and gate the change on the disable byte (pokefirered/src/scrcmd.c:1798-1830, pokefirered/asm/macros/event.inc:1166-1186); random and the warp family VarGet theirs (pokefirered/src/scrcmd.c:455-461, :719-731). - The HM table matches FRLG: there is no Whirlpool HM (pokefirered/include/constants/items.h:411-418). - The day-care party-full guard follows src/daycare.c:525, :1081. - Knock Off keeps its battle-scoped send-out mask (pokefirered/src/battle_script_commands.c:2730-2752, :4489), carried from the first batch. Structural work: the I6/I9/J1 architecture items landed as seams (profile selector, capability flags, font provider, virtual-object layer), the adopted footprint register keeps a KEEP verdict, the quantizer target is met, and the 30 drain items plus carves 1-4 are folded in. Tests: T6 now runs 282 top-level suites (273 + 9 new), the re-sweep ends at 267 pass / 0 fail, the engine tier is 634 suites, modkit 37, and the full gate ran green twice with T3 active on an imported Red cache. Documented skips are the lua5.4 oversize-save oracle where lua5.4 is absent and the config-partials listed in docs/game3/game3-artifact-conversions-v3.md. Docs shipped: review-v3-triage.md, e10-opcode-spec.md, rse-seams.md, game3-suite-sweep-v113.md, game3-artifact-conversions-v3.md, test-baseline-v3.md (plus the first-batch docs already on the branch).
67 lines
2.7 KiB
Lua
67 lines
2.7 KiB
Lua
-- rse-seams e10 spec 5.5/5.6: loadhelp/unloadhelp drive a dedicated help
|
|
-- MESSAGE window (not the L/R Help browser).
|
|
-- pret src/scrcmd.c:1274-1280 (loadhelp: ScriptReadWord, fallback ctx->data[0])
|
|
-- pret src/scrcmd.c:1285-1289 (unloadhelp)
|
|
-- pret src/new_menu_helpers.c:701-705 (DrawHelpMessageWindowWithText)
|
|
-- pret src/new_menu_helpers.c:707-710 (DestroyHelpMessageWindow_ — safe when closed)
|
|
-- lua: luajit tests/engine/game3_help_window_opcode_test.lua
|
|
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local T = require("tests.harness")
|
|
local check, eq = T.check, T.eq
|
|
love = love or require("tests.love_stub")
|
|
|
|
local Ctx = require("src.core.game3.scripting.ctx")
|
|
local Flags = require("src.core.game3.scripting.flags")
|
|
local Ops = require("src.core.game3.scripting.ops_a")
|
|
local Opcodes = require("src.core.game3.scripting.opcodes")
|
|
local TextIR = require("src.core.game3.scripting.text_ir")
|
|
local HelpWindow = require("src.ui.game3.help_window")
|
|
|
|
local store = Flags.newStore()
|
|
local function vm(texts)
|
|
local c = Ctx.new({})
|
|
c.mode, c.status = "bytecode", "running"
|
|
return {
|
|
ctx = c,
|
|
store = store,
|
|
adapters = { log = function() end },
|
|
setPc = function() end,
|
|
texts = texts or {},
|
|
-- getText hands the dispatcher an IR table like the real Vm does
|
|
-- (Vm:getText returns the bundle's parsed text, ops_a then runs toPlain).
|
|
getText = function(self, key)
|
|
local s = self.texts[key]
|
|
return s and TextIR.fromAscii(s)
|
|
end,
|
|
}
|
|
end
|
|
|
|
-- 1. loadhelp opens the window with the resolved string.
|
|
HelpWindow.close()
|
|
local v = vm({ [Opcodes.key(0xABC)] = "Some HELP text." })
|
|
eq(Ops.dispatch(v, { op = "loadhelp", [1] = 0xABC }), false, "loadhelp does not yield")
|
|
eq(HelpWindow.isOpen(), true, "the help message window is open")
|
|
eq(HelpWindow.getText(), "Some HELP text.", "the resolved text reached the window")
|
|
|
|
-- 2. unloadhelp closes it; closing again with nothing open is a no-op
|
|
-- (pret DestroyHelpMessageWindow_ is safe either way).
|
|
eq(Ops.dispatch(v, { op = "unloadhelp" }), false, "unloadhelp does not yield")
|
|
eq(HelpWindow.isOpen(), false, "the window closed")
|
|
eq(Ops.dispatch(v, { op = "unloadhelp" }), false, "unloadhelp with no window is a no-op")
|
|
eq(HelpWindow.isOpen(), false, "still closed")
|
|
|
|
-- 3. resolve_text fallback: pointer 0/nil falls back to ctx.data[0] and an
|
|
-- unresolved pointer opens the window without raising.
|
|
v.ctx.data = v.ctx.data or {}
|
|
v.ctx.data[0] = "T_FALLBACK"
|
|
local v2 = vm()
|
|
v2.ctx.data = { [0] = "T_FALLBACK" }
|
|
v2.texts = { T_FALLBACK = "Fallback text." }
|
|
local ok = pcall(Ops.dispatch, v2, { op = "loadhelp", [1] = 0 })
|
|
check(ok, "pointer 0 falls back through resolve_text without raising")
|
|
HelpWindow.close()
|
|
|
|
T.finish("game3_help_window_opcode_test")
|