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

93 lines
3.3 KiB
Lua

-- Assertion driver: the bedroom wall radio after the starter, played through
-- the real bg event -> jumpstd Radio1Script -> `special MapRadio` chain.
--
-- POKEPORT_GAME=gold POKEPORT_IDENTITY=gold-dev \
-- POKEPORT_DRIVER=tests/drivers/gold_wall_radio.lua love .
--
-- tests/gen2_map_radio_test.lua drives the screen's own logic; what it cannot
-- see is the dispatch: a real A press on the radio tile, the std script's
-- setval/special pair, the screen landing on the real stack, and the music
-- surviving the exit (ExitPokegearRadio_HandleMusic). Each check here does it
-- the way a player would, twice, because the replay is half the point: the
-- radio must answer every interaction, not just the first.
local U = require("tests.drivers.util")
return function(game)
U.wait(45)
local world = game.world
assert(world and world.map, "gold world did not boot")
local Music = require("src.core.Music")
-- Past the starter: PlayersHouseRadioScript's `checkevent
-- EVENT_GOT_A_POKEMON_FROM_ELM` picks the .NormalRadio arm, which is
-- `jumpstd Radio1Script`.
world.events:set(26, true)
-- The radio bg event sits at (3,1) in PLAYERS_HOUSE_2F; (3,2) facing up
-- reads it.
assert(world:setMap("PLAYERS_HOUSE_2F", 3, 2, "up"),
"setMap failed for PLAYERS_HOUSE_2F")
U.wait(10)
local function radioScreen()
local top = game.stack:top()
return (top and top.screenId == "Gen2MapRadio") and top or nil
end
local function listenOnce(round)
U.tap(game, "a")
local screen
for _ = 1, 120 do
screen = radioScreen()
if screen then break end
U.wait(1)
end
assert(screen, round .. ": A on the radio did not open the wall radio")
assert(screen.station, round .. ": no station resolved")
-- PlayRadio holds 100 frames with the station name up, then the show
-- starts its channel song.
U.wait(110)
for _ = 1, 240 do
if screen.radio.music then break end
U.wait(1)
end
assert(screen.radio.music, round .. ": the show never started its song")
local song = screen.radio.music
assert(Music.current() == song,
("%s: playing %s, want %s"):format(round,
tostring(Music.current()), tostring(song)))
-- A closes it, and the song KEEPS PLAYING as the map music
-- (RadioMusicRestartDE wrote it into wMapMusic).
U.tap(game, "a")
for _ = 1, 60 do
if not radioScreen() then break end
U.wait(1)
end
assert(not radioScreen(), round .. ": A did not close the radio")
U.wait(5)
assert(Music.current() == song,
round .. ": the song stopped when the radio closed")
assert(Music.mapSong() == song,
round .. ": the song did not become the map music")
U.log(round .. ": radio played " .. song .. " and it persists")
return song
end
listenOnce("first listen")
-- Back out, talk again: the radio must play again.
local song = listenOnce("second listen")
-- A map change is what replaces the song, exactly as a new map's
-- PlayMapMusic would.
assert(world:setMap("NEW_BARK_TOWN", 8, 8, "down"),
"setMap failed for NEW_BARK_TOWN")
U.wait(10)
assert(Music.current() ~= song,
"leaving the house did not restore the map's own music")
U.log("map change replaced the radio song with "
.. tostring(Music.current()))
print("[driver] PASS gold wall radio")
love.event.quit()
end