Files
bryanthaboi ae6cac89e1 G2 support
2026-08-11 11:53:30 -04:00

112 lines
4.5 KiB
Lua

-- Assertion driver: the champion's ending, end to end on the real game.
--
-- POKEPORT_GAME=gold POKEPORT_IDENTITY=gold-dev POKEPORT_SPEED=200 \
-- POKEPORT_DRIVER=tests/drivers/gold_hof_continue.lua love .
--
-- The chain under test is the cart's own (engine/events/halloffame.asm,
-- engine/overworld/scripting.asm ReturnFromCredits, engine/menus/
-- intro_menu.asm Continue / FinishContinueFunction):
--
-- halloffame -> induction ceremony -> credits roll -> `jp Reset` (title)
-- CONTINUE -> wSpawnAfterChampion = SPAWN_LANCE consumed -> New Bark Town
--
-- tests/gen2_hof_continue_test.lua proves each link against registry fakes;
-- this runs the real screens on the real stack, lets the real induction write
-- the real save slot, and then CONTINUEs through Game2:continueGame exactly
-- as the main menu does. The active save slot is backed up first and
-- restored on the way out, whatever happens.
local U = require("tests.drivers.util")
local Gen2Save = require("src.core.gen2.Save")
local Mon = require("src.battle.gen2.Mon")
return function(game)
U.wait(45)
assert(game.world and game.world.map, "gold world did not boot")
-- Guard the slot: the induction's SaveGameData writes it for real.
local main, bak, tmp = Gen2Save.filenames("gold")
local keep = {}
for _, name in ipairs({ main, bak, tmp }) do
keep[name] = love.filesystem.read(name)
end
local function restoreSlot()
for _, name in ipairs({ main, bak, tmp }) do
if keep[name] then
love.filesystem.write(name, keep[name])
else
love.filesystem.remove(name)
end
end
end
local ok, err = pcall(function()
local world, save, data = game.world, game.save, game.data
save.party = { Mon.new(data, "TYPHLOSION", 50) }
assert(save.party[1], "no party could be built from this cache")
save.player.name = save.player.name or "GOLD"
-- Stand where Script_halloffame runs: the Hall of Fame chamber.
assert(world:setMap("HALL_OF_FAME", 4, 12, "up"), "setMap HALL_OF_FAME")
U.wait(5)
-- The `halloffame` command, off the live world.
local resumed = false
assert(world:hallOfFame(function() resumed = true end),
"halloffame did not take the screen")
assert(save.spawnAfterChampion == "SPAWN_LANCE",
"induction did not write wSpawnAfterChampion")
-- The ceremony auto-advances; the roll follows it on the same call. A
-- first-time champion cannot skip, so ride it out and press A at THE END.
local sawCredits = false
for _ = 1, 700 do
local top = game.stack:top()
if top and top.screenId == "Gen2Credits" then
sawCredits = true
if top.exiting then break end
end
U.wait(30)
end
assert(sawCredits, "the credits never followed the induction")
local top = game.stack:top()
assert(top and top.exiting, "the credits never reached CREDITS_END")
U.tap(game, "a")
U.wait(10)
-- `jp Reset`: back on the title, world torn down, script resumed first.
assert(resumed, "the script never resumed out of the credits")
assert(game.phase == "boot", "the credits did not end on the title screen")
assert(game.world == nil, "the world survived the reset")
U.log("post-credits: reset to title, as FinishContinueFunction does")
-- The slot on disk carries the one-shot and the sealed room.
local written = Gen2Save.load("gold")
assert(written, "the induction never saved")
assert(written.spawnAfterChampion == "SPAWN_LANCE",
"the saved slot lost wSpawnAfterChampion")
assert(written.position and written.position.map == "HALL_OF_FAME",
"the saved position is not the Hall of Fame")
U.log("slot: spawnAfterChampion=SPAWN_LANCE, position=HALL_OF_FAME")
-- CONTINUE, exactly as the main menu's row does it.
game:continueGame(written)
U.wait(10)
assert(game.world and game.world.map, "CONTINUE did not boot a world")
assert(game.world.map.id == "NEW_BARK_TOWN",
"CONTINUE resumed on " .. tostring(game.world.map.id)
.. ", expected NEW_BARK_TOWN")
assert(game.world.player.cellX == 13 and game.world.player.cellY == 6,
("CONTINUE landed at (%d,%d), expected SPAWN_NEW_BARK (13,6)")
:format(game.world.player.cellX, game.world.player.cellY))
assert(game.save.spawnAfterChampion == nil,
"PostCreditsSpawn did not zero the byte")
U.log("CONTINUE: spawned at New Bark Town, byte consumed")
end)
restoreSlot()
assert(ok, err)
U.log("PASS gold_hof_continue")
love.event.quit()
end