mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 00:10:56 +02:00
117 lines
4.1 KiB
Lua
117 lines
4.1 KiB
Lua
-- Smoke: Gold bedroom → downstairs → outside → house → carpet out → Route 29.
|
|
--
|
|
-- A New Game now starts at SPAWN_HOME (PLAYERS_HOUSE_2F 3,3), the way
|
|
-- engine/menus/intro_menu.asm NewGame does, so the walk begins upstairs: the
|
|
-- stairs warp is at (7,0) on 2F and the front door at (6,7)/(7,7) on 1F.
|
|
-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_walk_smoke.lua love .
|
|
return function(game)
|
|
local function wait(frames)
|
|
for _ = 1, frames do coroutine.yield() end
|
|
end
|
|
|
|
local function clearDirs()
|
|
for _, d in ipairs({ "up", "down", "left", "right" }) do
|
|
game.input.state[d] = false
|
|
end
|
|
end
|
|
|
|
local function hold(dir, frames)
|
|
clearDirs()
|
|
for _ = 1, frames do
|
|
table.insert(game.input.pressQueue, dir)
|
|
game.input.state[dir] = true
|
|
coroutine.yield()
|
|
end
|
|
clearDirs()
|
|
end
|
|
|
|
-- Entering the house runs MeetMomScript, and a driver that only holds a
|
|
-- direction would sit behind its text boxes forever. Tap A until the world
|
|
-- accepts input again. That script is long -- an approach walk, ten text
|
|
-- boxes and three yes/no prompts, ~1300 frames at this tap rate -- so the
|
|
-- budget has to be generous or the run looks like a hang.
|
|
local function clearDialogue()
|
|
for _ = 1, 1200 do
|
|
if not game.world:busy() then return end
|
|
table.insert(game.input.pressQueue, "a")
|
|
coroutine.yield()
|
|
coroutine.yield()
|
|
end
|
|
end
|
|
|
|
local function mapId()
|
|
return game.world and game.world.map and game.world.map.id
|
|
end
|
|
|
|
local function pos()
|
|
local p = game.world.player
|
|
return p.cellX, p.cellY
|
|
end
|
|
|
|
wait(45)
|
|
assert(mapId() == "PLAYERS_HOUSE_2F", "boot map " .. tostring(mapId()))
|
|
|
|
-- The bedroom is where a New Game lands, but this driver is about warps and
|
|
-- the Route 29 edge crossing, and the indoor route down two floors is a
|
|
-- fragile way to get to them. Drop straight outside instead: the door and
|
|
-- carpet warps below are the ones under test.
|
|
game.world:setMap("NEW_BARK_TOWN", 13, 6, "down")
|
|
wait(15)
|
|
assert(mapId() == "NEW_BARK_TOWN",
|
|
("after setMap: %s @ (%d,%d)"):format(tostring(mapId()), pos()))
|
|
|
|
-- Walk back into the player's house door (one cell north of the doorstep).
|
|
hold("up", 40)
|
|
wait(15)
|
|
assert(mapId() == "PLAYERS_HOUSE_1F",
|
|
"after door: " .. tostring(mapId()))
|
|
clearDialogue()
|
|
|
|
-- Entry faces up and keeps walking off the carpet into the room; hold
|
|
-- down to step back onto the carpet and warp out.
|
|
hold("down", 60)
|
|
wait(15)
|
|
-- Walking in can trip another coord script; clear it and try the carpet
|
|
-- again before deciding the exit is broken.
|
|
clearDialogue()
|
|
if mapId() ~= "NEW_BARK_TOWN" then
|
|
hold("up", 24)
|
|
clearDialogue()
|
|
hold("down", 48)
|
|
wait(15)
|
|
end
|
|
assert(mapId() == "NEW_BARK_TOWN",
|
|
("after carpet: %s @ (%d,%d)"):format(tostring(mapId()), pos()))
|
|
|
|
-- New Bark's west exit is gated: at scene SCENE_NEWBARKTOWN_TEACHER_STOPS_YOU
|
|
-- the coord events at (1,8)/(1,9) run the teacher's "It's dangerous to go out
|
|
-- without a POKéMON!" script and walk the player back, so a party-less save
|
|
-- can never reach Route 29. ElmsLab.asm sets the town to SCENE_NEWBARKTOWN_
|
|
-- NOOP once the errand starts; do the same rather than fight the guard.
|
|
game.world.mapScenes["NEW_BARK_TOWN"] = 1
|
|
|
|
-- West→Route 29 only has a walkable landing at y=9: row 8 has the tree at
|
|
-- x=8 and row 10 is wall west of x=6. Re-square onto y=9 every pass rather
|
|
-- than only after a bump, and bound the walk -- a wandering townsfolk can
|
|
-- stand in the way for a step or two, and an unbounded retry loop turns that
|
|
-- into a run that never ends.
|
|
local x, y = pos()
|
|
for _ = 1, 60 do
|
|
if mapId() == "ROUTE_29" then break end
|
|
assert(mapId() == "NEW_BARK_TOWN",
|
|
"unexpected map " .. tostring(mapId()))
|
|
if y < 9 then
|
|
hold("down", 24)
|
|
elseif y > 9 then
|
|
hold("up", 24)
|
|
else
|
|
hold("left", 24)
|
|
end
|
|
x, y = pos()
|
|
end
|
|
assert(mapId() == "ROUTE_29",
|
|
("after west edge: %s @ (%d,%d)"):format(tostring(mapId()), pos()))
|
|
|
|
print("[driver] PASS gold walk house + Route 29")
|
|
end
|