mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-16 16:21:30 +02:00
big bug squash
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
-- Driver: Rocket Hideout elevator gates (#199).
|
||||
--
|
||||
-- Gen1 stamps a closed barred gate over the elevator doorway on every map
|
||||
-- load, opening it only once the guarding Rockets are beaten:
|
||||
-- scripts/RocketHideoutB1F.asm RocketHideoutB1FDoorCallbackScript
|
||||
-- closed block $54 at (12,8), open block $0e; opens once
|
||||
-- EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4 is set (the guard by the lift;
|
||||
-- EVENT_ENTERED_ROCKET_HIDEOUT is never SetEvent -- the SFX bug noted
|
||||
-- in the source -- so it is not part of the effective open condition).
|
||||
-- scripts/RocketHideoutB4F.asm RocketHideoutB4FDoorCallbackScript
|
||||
-- closed block $2d at (12,5), open block $0e; opens once BOTH
|
||||
-- EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0 and _1 are set.
|
||||
-- B2F/B3F call no door callback (spinner-tile floors), so they get no gate.
|
||||
--
|
||||
-- The recomp shipped no stamping, so the .blk's open floor block ($0e/14)
|
||||
-- showed through -- the reporter's "gate is open" screenshots. Pre-fix the
|
||||
-- closed-gate asserts read 14 and fail; post-fix they read the barred block.
|
||||
--
|
||||
-- SHOT_DIR=/tmp/shots POKEPORT_DRIVER=tests/drivers/rocket_hideout_gate_bug199_test.lua \
|
||||
-- POKEPORT_IDENTITY=bug199 POKEPORT_TOUCH=0 POKEPORT_VERSION=red love .
|
||||
return function(game)
|
||||
local U = dofile("tests/drivers/util.lua")
|
||||
local DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
|
||||
local OW = require("src.world.OverworldController")
|
||||
|
||||
local failures = {}
|
||||
local function check(cond, msg)
|
||||
if cond then U.log("ok:", msg) else
|
||||
table.insert(failures, msg); U.log("FAIL:", msg)
|
||||
end
|
||||
return cond
|
||||
end
|
||||
|
||||
-- swap map, wiping event flags to a known slate, then settle until the
|
||||
-- map has loaded and the player is idle so the door callback has stamped
|
||||
local function load(mapId, x, y, flags)
|
||||
while game.stack:top() do game.stack:pop() end
|
||||
game.save.flags = {}
|
||||
for k, v in pairs(flags or {}) do game.save.flags[k] = v end
|
||||
game.stack:push(OW, mapId, x, y, "down")
|
||||
for _ = 1, 240 do
|
||||
local ow = game.overworld
|
||||
if ow and ow.map and ow.map.id == mapId and not ow.transitioning
|
||||
and not (ow.player and ow.player.moving) then
|
||||
break
|
||||
end
|
||||
U.wait(1)
|
||||
end
|
||||
U.wait(3)
|
||||
return game.overworld
|
||||
end
|
||||
|
||||
local OPEN = 14 -- $0e floor block (doorway when unlocked)
|
||||
local CLOSED_B1F = 84 -- $54 barred gate (bars in the north cell-row)
|
||||
local CLOSED_B4F = 45 -- $2d barred gate (bars in the south cell-row)
|
||||
|
||||
-- B1F: barred until the lift guard (trainer 4) is beaten
|
||||
local ow = load("ROCKET_HIDEOUT_B1F", 24, 14)
|
||||
U.shot(game, DIR .. "/b1f_gate_closed.png")
|
||||
check(ow.map:blockAt(12, 8) == CLOSED_B1F,
|
||||
"B1F doorway (12,8) barred, got " .. tostring(ow.map:blockAt(12, 8)))
|
||||
check(ow.map:blockAt(12, 9) == 44,
|
||||
"B1F warp carpet (12,9) untouched, got " .. tostring(ow.map:blockAt(12, 9)))
|
||||
|
||||
-- B1F: opens once the guard is beaten
|
||||
ow = load("ROCKET_HIDEOUT_B1F", 24, 14,
|
||||
{ EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4 = true })
|
||||
U.shot(game, DIR .. "/b1f_gate_open.png")
|
||||
check(ow.map:blockAt(12, 8) == OPEN,
|
||||
"B1F doorway opens after guard, got " .. tostring(ow.map:blockAt(12, 8)))
|
||||
|
||||
-- B4F: barred until BOTH guards are beaten
|
||||
ow = load("ROCKET_HIDEOUT_B4F", 24, 8)
|
||||
U.shot(game, DIR .. "/b4f_gate_closed.png")
|
||||
check(ow.map:blockAt(12, 5) == CLOSED_B4F,
|
||||
"B4F doorway (12,5) barred, got " .. tostring(ow.map:blockAt(12, 5)))
|
||||
|
||||
-- B4F: one guard is not enough
|
||||
ow = load("ROCKET_HIDEOUT_B4F", 24, 8,
|
||||
{ EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0 = true })
|
||||
check(ow.map:blockAt(12, 5) == CLOSED_B4F,
|
||||
"B4F stays barred with only one guard, got " .. tostring(ow.map:blockAt(12, 5)))
|
||||
|
||||
-- B4F: opens once both guards are beaten
|
||||
ow = load("ROCKET_HIDEOUT_B4F", 24, 8,
|
||||
{ EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0 = true,
|
||||
EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1 = true })
|
||||
U.shot(game, DIR .. "/b4f_gate_open.png")
|
||||
check(ow.map:blockAt(12, 5) == OPEN,
|
||||
"B4F doorway opens after both guards, got " .. tostring(ow.map:blockAt(12, 5)))
|
||||
|
||||
-- B2F has no dynamic gate in pokered (spinner floor); it must still load
|
||||
ow = load("ROCKET_HIDEOUT_B2F", 24, 14)
|
||||
check(ow and ow.map and ow.map.id == "ROCKET_HIDEOUT_B2F",
|
||||
"B2F loads with no gate callback")
|
||||
|
||||
-- regression: the shared Silph Co card-key path must still stamp
|
||||
ow = load("SILPH_CO_2F", 4, 4)
|
||||
check(ow.map:blockAt(2, 2) == 84,
|
||||
"SILPH_CO_2F door1 (2,2) still barred, got " .. tostring(ow.map:blockAt(2, 2)))
|
||||
ow = load("SILPH_CO_2F", 4, 4, { EVENT_SILPH_CO_2_UNLOCKED_DOOR1 = true })
|
||||
check(ow.map:blockAt(2, 2) == 14,
|
||||
"SILPH_CO_2F door1 opens with its event, got " .. tostring(ow.map:blockAt(2, 2)))
|
||||
|
||||
if #failures > 0 then
|
||||
error(#failures .. " check(s) failed: " .. table.concat(failures, " | "))
|
||||
end
|
||||
U.log("all Rocket Hideout gate checks passed")
|
||||
end
|
||||
Reference in New Issue
Block a user