mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-21 13:09:54 +02:00
71 lines
2.7 KiB
Lua
71 lines
2.7 KiB
Lua
-- SAVE confirmation layout (#1522): PrintSaveScreenText's own box and
|
|
-- SaveTheGame_YesOrNo's TWO_OPTION_MENU at hlcoord 0, 7
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local T = require("tests.modkit")
|
|
local Data = T.fixtures.load()
|
|
|
|
local SaveData = require("src.core.SaveData")
|
|
local StartMenu = require("src.ui.StartMenu")
|
|
local ChoiceBox = require("src.ui.ChoiceBox")
|
|
|
|
local function newStack()
|
|
local stack = { states = {} }
|
|
function stack:push(state) table.insert(self.states, state) end
|
|
function stack:pop() return table.remove(self.states) end
|
|
function stack:top() return self.states[#self.states] end
|
|
return stack
|
|
end
|
|
|
|
local game = {
|
|
data = Data,
|
|
save = SaveData.newGame(),
|
|
stack = newStack(),
|
|
input = { wasPressed = function() return false end,
|
|
isDown = function() return false end },
|
|
}
|
|
game.save.player.name = "RED"
|
|
game.save.playTime = 3 * 3600 + 7 * 60
|
|
|
|
local menu = StartMenu.new(game)
|
|
local save
|
|
for _, item in ipairs(menu.items) do
|
|
if item.label == "SAVE" then save = item end
|
|
end
|
|
T.check(save ~= nil, "the start menu lists SAVE")
|
|
|
|
save.onSelect()
|
|
-- PrintSaveScreenText ends `ld c, 30 / jp DelayFrames`: the bare panel
|
|
-- holds 30 frames before the prompt (main_menu.asm:404-405)
|
|
T.eq(#game.stack.states, 1, "the panel shows alone first")
|
|
for _ = 1, 30 do game.stack:top().update() end
|
|
T.eq(#game.stack.states, 2, "the panel and the prompt are two separate states")
|
|
local panel, prompt = game.stack.states[1], game.stack.states[2]
|
|
T.check(type(panel.draw) == "function" and not panel.isTextBox,
|
|
"the info panel is its own drawn state, not a TextBox page")
|
|
T.check(prompt.isTextBox == true, "the prompt is the dialogue box on top")
|
|
T.eq(#prompt.pages, 1, "the prompt is one page: no \\f-merged info panel")
|
|
T.check(prompt.pages[1][1]:find("Would you like to"),
|
|
"the prompt page is WouldYouLikeToSaveText")
|
|
|
|
-- save.asm:188 hlcoord 0, 7
|
|
T.eq(prompt.choiceBox.tx, 0, "the save Yes/No box sits at column 0 (left)")
|
|
T.eq(prompt.choiceBox.ty, 7, "the save Yes/No box sits at row 7")
|
|
T.eq(prompt.choiceBox, require("src.ui.Theme").saveBox,
|
|
"the geometry routes through Theme so field.theme can restyle it")
|
|
local choice = ChoiceBox.new(game, function() end, { box = prompt.choiceBox })
|
|
T.eq(choice.tx, 0, "ChoiceBox honours the save-specific left placement")
|
|
|
|
-- answering NO takes the panel back down with the prompt
|
|
prompt.done = true
|
|
prompt:update(1 / 60)
|
|
local yesno = game.stack:top()
|
|
T.check(getmetatable(yesno) == ChoiceBox, "the prompt pushes the Yes/No box")
|
|
T.eq(yesno.tx, 0, "the pushed Yes/No box is the left-hand one")
|
|
game.stack:pop()
|
|
game.stack:pop()
|
|
prompt.choice(false)
|
|
T.eq(#game.stack.states, 0, "declining closes the info panel too")
|
|
|
|
T.finish("save_confirm_layout_bug1522")
|