mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-16 00:02:23 +02:00
79 lines
3.6 KiB
Lua
79 lines
3.6 KiB
Lua
-- #1104: the Ruins of Alph ladders warp somewhere else.
|
|
-- POKEPORT_GAME=gold POKEPORT_TOUCH=0 \
|
|
-- POKEPORT_DRIVER=tests/drivers/gold_bug1104_test.lua love .
|
|
local Mon = require("src.battle.gen2.Mon")
|
|
|
|
-- maps/RuinsOfAlphInnerChamber.asm:76, maps/RuinsOfAlphOutside.asm:126,
|
|
-- maps/RuinsOfAlphKabutoChamber.asm and its three siblings.
|
|
local CASES = {
|
|
{ "RUINS_OF_ALPH_INNER_CHAMBER", 10, 13, "RUINS_OF_ALPH_OUTSIDE", 10, 13 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 10, 13, "RUINS_OF_ALPH_INNER_CHAMBER", 10, 13 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 2, 17, "RUINS_OF_ALPH_HO_OH_CHAMBER", 3, 9 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 14, 7, "RUINS_OF_ALPH_KABUTO_CHAMBER", 3, 9 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 2, 29, "RUINS_OF_ALPH_OMANYTE_CHAMBER", 3, 9 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 16, 33, "RUINS_OF_ALPH_AERODACTYL_CHAMBER", 3, 9 },
|
|
{ "RUINS_OF_ALPH_OUTSIDE", 17, 11, "RUINS_OF_ALPH_RESEARCH_CENTER", 2, 7 },
|
|
{ "RUINS_OF_ALPH_KABUTO_CHAMBER", 3, 9, "RUINS_OF_ALPH_OUTSIDE", 14, 7, "down" },
|
|
{ "RUINS_OF_ALPH_HO_OH_CHAMBER", 3, 9, "RUINS_OF_ALPH_OUTSIDE", 2, 17, "down" },
|
|
{ "RUINS_OF_ALPH_OMANYTE_CHAMBER", 3, 9, "RUINS_OF_ALPH_OUTSIDE", 2, 29, "down" },
|
|
{ "RUINS_OF_ALPH_AERODACTYL_CHAMBER", 3, 9, "RUINS_OF_ALPH_OUTSIDE", 16, 33, "down" },
|
|
{ "RUINS_OF_ALPH_RESEARCH_CENTER", 2, 7, "RUINS_OF_ALPH_OUTSIDE", 17, 11, "down" },
|
|
}
|
|
|
|
return function(game)
|
|
local function wait(n) for _ = 1, n do coroutine.yield() end end
|
|
local function clearDirs()
|
|
for _, d in ipairs({ "up", "down", "left", "right" }) do
|
|
game.input.state[d] = false
|
|
end
|
|
end
|
|
-- Hold until the map changes, then let the load settle and STOP: holding
|
|
-- past the arrival would walk the player off the landing tile.
|
|
local function walkUntilWarp(dir, frames, fromMap)
|
|
for _ = 1, frames do
|
|
clearDirs()
|
|
game.input.state[dir] = true
|
|
table.insert(game.input.pressQueue, dir)
|
|
coroutine.yield()
|
|
if game.world.map and game.world.map.id ~= fromMap then
|
|
clearDirs()
|
|
-- The ARRIVAL cell is the one the warp table names. Standing on a
|
|
-- door/cave/staircase tile then forces one step DOWN off it
|
|
-- (engine/overworld/player_movement.asm:201-213), so the settled cell
|
|
-- is legitimately one row lower on an outdoor mouth.
|
|
local ax, ay = game.world.player.cellX, game.world.player.cellY
|
|
for _ = 1, 45 do coroutine.yield() end
|
|
return game.world.map.id, ax, ay,
|
|
game.world.player.cellX, game.world.player.cellY
|
|
end
|
|
end
|
|
clearDirs()
|
|
return game.world.map and game.world.map.id, nil, nil
|
|
end
|
|
|
|
wait(30)
|
|
local world = game.world
|
|
game.save.party = { Mon.new(game.data, "PIDGEY", 5) }
|
|
|
|
local bad = 0
|
|
for _, c in ipairs(CASES) do
|
|
local src, wx, wy, wantMap, wantX, wantY = c[1], c[2], c[3], c[4], c[5], c[6]
|
|
-- default approach is from below, the way the report describes facing the
|
|
-- ladder from below; a chamber's exit sits on the bottom row instead
|
|
local dir = c[7] or "up"
|
|
local sy = (dir == "up") and wy + 1 or wy - 1
|
|
world:setMap(src, wx, sy, dir)
|
|
wait(12)
|
|
local from = ("%s (%d,%d)"):format(src, world.player.cellX, world.player.cellY)
|
|
local m, ax, ay, sx, sy = walkUntilWarp(dir, 90, src)
|
|
local ok = (m == wantMap and ax == wantX and ay == wantY)
|
|
if not ok then bad = bad + 1 end
|
|
print(("[driver] %-12s %s -> %s (%s,%s) settled (%s,%s) want %s (%d,%d)")
|
|
:format(ok and "OK" or "MISMATCH", from, tostring(m),
|
|
tostring(ax), tostring(ay), tostring(sx), tostring(sy),
|
|
wantMap, wantX, wantY))
|
|
end
|
|
print(("[driver] %s ruins warps: %d mismatches")
|
|
:format(bad == 0 and "PASS" or "FAIL", bad))
|
|
end
|