mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 08:21:02 +02:00
87 lines
3.4 KiB
Lua
87 lines
3.4 KiB
Lua
-- Eye check on the Viridian caterpillar speech (#250): no test can judge
|
|
-- "the text went by too fast to read".
|
|
-- pokered text/ViridianCity.asm spells that answer with line, cont and para,
|
|
-- which TextBox maps to \n, \v and \f. The port's literal fallback (the label
|
|
-- has no leading underscore, so it is not in text.lua) had all three as \n.
|
|
-- POKEPORT_DRIVER=tests/drivers/caterpillar_text_bug250_test.lua POKEPORT_IDENTITY=bug250 love .
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
|
|
local function check(label, ok)
|
|
U.log(ok and "PASS" or "FAIL", label)
|
|
return ok
|
|
end
|
|
|
|
local MAP = "VIRIDIAN_CITY"
|
|
local NPC = "VIRIDIANCITY_YOUNGSTER2"
|
|
local TEXT = "TEXT_VIRIDIANCITY_YOUNGSTER2"
|
|
|
|
-- a missing handler, or an NPC who wandered off, ends in "no text", which is
|
|
-- not the same failure as "text that does not wait"
|
|
local mapScripts = require("data.scripts.init")
|
|
check("a hand-ported handler exists for " .. TEXT,
|
|
mapScripts.talkScript(MAP, TEXT) ~= nil)
|
|
|
|
-- the page break and the scroll are what make the box wait for a button
|
|
local TextBox = require("src.render.TextBox")
|
|
local desc = "CATERPIE has no\npoison, but\vWEEDLE does.\fWatch out for its\nPOISON STING!"
|
|
local pages = TextBox.paginate(desc)
|
|
check("the description spans two pages (para -> \\f)", #pages == 2)
|
|
check("page 1 is three lines (text + line + cont)",
|
|
pages[1] ~= nil and #pages[1] == 3)
|
|
check("page 2 is two lines (para + line)",
|
|
pages[2] ~= nil and #pages[2] == 2)
|
|
-- contBefore marks the line the box holds on until a button press
|
|
check("line 3 waits for a button before scrolling in",
|
|
pages.contBefore and pages.contBefore[1] and pages.contBefore[1][3] == true)
|
|
|
|
U.teleport(game, MAP, 30, 26, "up")
|
|
U.wait(30)
|
|
|
|
local function target()
|
|
for _, n in ipairs(game.overworld and game.overworld.npcs or {}) do
|
|
if n.def and n.def.name == NPC then return n end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local npc = target()
|
|
check("the youngster is loaded on " .. MAP, npc ~= nil)
|
|
-- pin the wander: he strolls out from under the A press between reads
|
|
if npc then npc.wanders = false end
|
|
|
|
-- pokered data/maps/objects/ViridianCity.asm puts him at (30,25), so (30,26)
|
|
-- faces him; if a map edit moves him, the fallback below picks a free
|
|
-- walkable neighbour instead of parking the player at a wall.
|
|
local function facingTarget()
|
|
local ow = game.overworld
|
|
if not (ow and npc) then return false end
|
|
local fx, fy = ow.player:facingCell()
|
|
return ow:npcAtCell(fx, fy) == npc
|
|
end
|
|
|
|
if npc and not facingTarget() then
|
|
local ow = game.overworld
|
|
for _, s in ipairs({ { 0, 1, "up" }, { 1, 0, "left" },
|
|
{ -1, 0, "right" }, { 0, -1, "down" } }) do
|
|
local cx, cy = npc.cellX + s[1], npc.cellY + s[2]
|
|
if ow.map:isWalkableCell(cx, cy) and not ow:npcAtCell(cx, cy) then
|
|
U.log("approach cell blocked, standing on", cx, cy, "facing", s[3])
|
|
U.teleport(game, MAP, cx, cy, s[3])
|
|
U.wait(10)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
check("player is standing in front of the youngster", facingTarget())
|
|
|
|
U.log("Press A to talk, answer YES, and read the description.")
|
|
U.log("It should stop for you three times, and the page should CLEAR before")
|
|
U.log("'Watch out for its POISON STING!' -- under #250 all six lines poured")
|
|
U.log("past in one go. Answering NO is the control: one line, no waits.")
|
|
|
|
while true do
|
|
coroutine.yield()
|
|
end
|
|
end
|