mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-28 09:54:43 +02:00
114 lines
4.0 KiB
Lua
114 lines
4.0 KiB
Lua
-- The forget-a-move text is not one uninterrupted string: pokered's
|
|
-- OneTwoAndText holds the box with text_pause, plays SFX_SWAP, prints
|
|
-- " Poof!" and holds it again before the paragraph break
|
|
-- (engine/pokemon/learn_move.asm:208-222, home/text.asm:492-504). The port
|
|
-- typed all of it straight through in silence (#1818). TextBox.PAUSE now
|
|
-- carries those waits inside the string, with opts.pauseSounds naming the
|
|
-- sfx each one fires. ROM-free.
|
|
-- luajit tests/engine/textbox_pause_bug1818.lua
|
|
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local T = require("tests.harness")
|
|
local check, eq = T.check, T.eq
|
|
love = love or require("tests.love_stub")
|
|
|
|
local TextBox = require("src.render.TextBox")
|
|
local MoveLearnMenu = require("src.ui.MoveLearnMenu")
|
|
local Sound = require("src.core.Sound")
|
|
|
|
local played = {}
|
|
local realPlay = Sound.play
|
|
Sound.play = function(data, name)
|
|
played[#played + 1] = name
|
|
return nil
|
|
end
|
|
|
|
local function newGame()
|
|
local game = {
|
|
save = { player = {}, options = { textSpeed = "FAST" } },
|
|
data = { text = {}, moves = { MEGA_PUNCH = { name = "MEGA PUNCH" } },
|
|
pokemon = { NIDORINO = { name = "NIDORINO" } } },
|
|
}
|
|
game.stack = {
|
|
states = {},
|
|
push = function(self, s) table.insert(self.states, s) end,
|
|
pop = function(self) return table.remove(self.states) end,
|
|
top = function(self) return self.states[#self.states] end,
|
|
}
|
|
game.input = {
|
|
queue = {},
|
|
wasPressed = function(self, btn) return self.queue[btn] or false end,
|
|
isDown = function(self, btn) return self.queue[btn] or false end,
|
|
}
|
|
return game
|
|
end
|
|
|
|
local game = newGame()
|
|
local box = TextBox.new(game, "1, 2 and..." .. TextBox.PAUSE .. " Poof!",
|
|
nil, { pauseSounds = { "Swap" } })
|
|
|
|
eq(box.pages[1][1], "1, 2 and... Poof!",
|
|
"the marker is stripped out of the line the font ever sees")
|
|
check(box.pauseAt and box.pauseAt[1] and box.pauseAt[1][1],
|
|
"the pause is re-anchored onto page 1, line 1")
|
|
eq(box.pauseAt[1][1][11], 1, "it sits on the 11th glyph, the last of \"1, 2 and...\"")
|
|
|
|
-- type up to the marker
|
|
local frames = 0
|
|
while not box.pauseFrames and frames < 600 do
|
|
box:update(1 / 60)
|
|
frames = frames + 1
|
|
end
|
|
check(box.pauseFrames, "typing stops at the marker")
|
|
eq(box.charIndex, 11, "it stops with \"1, 2 and...\" printed and nothing after it")
|
|
eq(#played, 0, "SFX_SWAP has not sounded yet -- the wait comes first")
|
|
|
|
local frozen = box.charIndex
|
|
for _ = 1, 31 do
|
|
box:update(1 / 60)
|
|
if #played > 0 then break end
|
|
eq(box.charIndex, frozen, "nothing types while the pause runs")
|
|
end
|
|
eq(played[1], "Swap", "the wait ends with SFX_SWAP (learn_move.asm:210-213)")
|
|
|
|
for _ = 1, 600 do
|
|
if box.done then break end
|
|
box:update(1 / 60)
|
|
end
|
|
check(box.done, "\" Poof!\" types out after the sound")
|
|
eq(box.charIndex, 17, "the whole line printed, marker included in nothing")
|
|
|
|
-- a held A/B skips the wait: TextCommand_PAUSE reads hJoyHeld
|
|
local held = newGame()
|
|
held.input.queue = { a = true }
|
|
local box2 = TextBox.new(held, "1, 2 and..." .. TextBox.PAUSE .. " Poof!",
|
|
nil, { pauseSounds = { "Swap" } })
|
|
local before = #played
|
|
for _ = 1, 40 do
|
|
if box2.done then break end
|
|
box2:update(1 / 60)
|
|
end
|
|
check(box2.done, "with A held the box runs straight through the pause")
|
|
check(#played > before, "the sound still plays on the skipped wait")
|
|
|
|
-- and the real caller wires both waits with the swap on the first
|
|
local mlm = MoveLearnMenu.new(game, { species = "NIDORINO", level = 20,
|
|
moves = {} }, "MEGA_PUNCH")
|
|
mlm.forgot = "HORN ATTACK"
|
|
game.stack:push(mlm)
|
|
mlm:finish(true)
|
|
local learned = game.stack:top()
|
|
check(learned.pauseAt, "the learned-move box carries text_pause waits")
|
|
eq(learned.pauseSounds[1], "Swap", "the first wait carries SFX_SWAP")
|
|
local count = 0
|
|
for _, lines in pairs(learned.pauseAt) do
|
|
for _, chars in pairs(lines) do
|
|
for _ in pairs(chars) do count = count + 1 end
|
|
end
|
|
end
|
|
eq(count, 2, "both of learn_move.asm's text_pause commands survive")
|
|
|
|
Sound.play = realPlay
|
|
T.finish()
|