mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 00:10:56 +02:00
81 lines
2.9 KiB
Lua
81 lines
2.9 KiB
Lua
-- The MeetMomScript cutscene, shot at the moments that used to go wrong.
|
|
--
|
|
-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_mom_scene.lua love .
|
|
--
|
|
-- Three things this is watching for, all of them general rather than
|
|
-- Mom-specific:
|
|
-- * an object whose event flag a RUNNING script flips must not swap on the
|
|
-- spot -- the cart only re-reads the object list on a map load, so Mom
|
|
-- stays standing beside you until she has walked back to her chair
|
|
-- * an object that appears mid-map must have its palette baked immediately,
|
|
-- not on the next once-a-second poll, or it stands there in greyscale
|
|
-- * a `yesorno` keeps the question on screen underneath the prompt
|
|
--
|
|
-- Shots land in /tmp/gold-mom.
|
|
local U = require("tests.drivers.util")
|
|
|
|
return function(game)
|
|
local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-mom"
|
|
|
|
local function tap(button, frames)
|
|
game.input.pressQueue[#game.input.pressQueue + 1] = button
|
|
game.input.state[button] = true
|
|
U.wait(2)
|
|
game.input.state[button] = false
|
|
U.wait(frames or 4)
|
|
end
|
|
|
|
U.wait(45)
|
|
local world = game.world
|
|
assert(world and world.map, "gold world did not boot")
|
|
|
|
U.shot(game, out .. "/00-bedroom.png")
|
|
|
|
-- Drop straight into the living room at the top of the stairs, which is
|
|
-- where MeetMomScript's coord event sits. The indoor route down from the
|
|
-- bedroom is a fragile way to reach a scene that is not about stairs.
|
|
world:setMap("PLAYERS_HOUSE_1F", 7, 3, "down")
|
|
U.wait(20)
|
|
for _ = 1, 3 do tap("down", 8) end
|
|
U.wait(40)
|
|
U.shot(game, out .. "/01-scene-start.png")
|
|
|
|
-- Page through until the first yes/no is up, shooting as we go.
|
|
local shots, sawChoice = 1, false
|
|
for step = 1, 200 do
|
|
local top = game.stack:top()
|
|
local isChoice = top and top.index ~= nil and top.onChoose ~= nil
|
|
-- A TextBox that has pushed its own choice box counts too.
|
|
if game.world.choicebox and not sawChoice then
|
|
sawChoice = true
|
|
U.shot(game, out .. "/02-yes-no.png")
|
|
end
|
|
if isChoice and not sawChoice then
|
|
sawChoice = true
|
|
U.shot(game, out .. "/02-yes-no.png")
|
|
end
|
|
if step % 25 == 0 then
|
|
shots = shots + 1
|
|
U.shot(game, ("%s/03-scene-%02d.png"):format(out, shots))
|
|
end
|
|
if not world:busy() and step > 20 then break end
|
|
tap("a", 4)
|
|
end
|
|
U.wait(30)
|
|
U.shot(game, out .. "/04-scene-end.png")
|
|
|
|
-- The two invariants, checked rather than eyeballed.
|
|
local greyed = {}
|
|
for _, npc in pairs(world.npcPool or {}) do
|
|
if npc.sprite and npc.spriteDef and not npc.sprite.objColors then
|
|
greyed[#greyed + 1] = npc.spriteDef.id or "?"
|
|
end
|
|
end
|
|
print(("[driver] %d pooled NPCs, %d without a baked palette")
|
|
:format((function() local n = 0 for _ in pairs(world.npcPool or {}) do n = n + 1 end return n end)(),
|
|
#greyed))
|
|
print(("[driver] saw a yes/no prompt: %s"):format(tostring(sawChoice)))
|
|
print("[driver] PASS gold mom scene in " .. out)
|
|
love.event.quit()
|
|
end
|