mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-28 18:06:09 +02:00
114 lines
4.2 KiB
Lua
114 lines
4.2 KiB
Lua
-- Manual check of the Game Corner slot prompt, emote and menus (#1811).
|
|
-- PromptUserToPlaySlots prints "Want to play?" and floats SMILE_BUBBLE over
|
|
-- the player on the map, and only then loads the slot screen, whose bet menu
|
|
-- is hlcoord 14,11 b=5 c=4 (engine/slots/slot_machine.asm:9-23, :83-86).
|
|
-- Box geometry is asserted in tests/engine/slot_machine_boxes_bug1811.lua.
|
|
-- POKEPORT_DRIVER=tests/drivers/slots_prompt_bug1811_test.lua POKEPORT_TOUCH=0 POKEPORT_VERSION=red love .
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
local TextBox = require("src.render.TextBox")
|
|
local SlotMachine = require("src.ui.SlotMachine")
|
|
local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
|
|
|
|
local function check(label, ok)
|
|
U.log(ok and "PASS" or "FAIL", label)
|
|
return ok
|
|
end
|
|
|
|
local vol = game.save.options and game.save.options.sfxVol
|
|
if vol == 0 then
|
|
U.log("sfx volume is 0 in options; raise it or the menu beeps are silent")
|
|
end
|
|
|
|
-- AbleToPlaySlotsCheck wants a COIN CASE with coins in it
|
|
game.save.inventory = game.save.inventory or {}
|
|
game.save.inventory.COIN_CASE = 1
|
|
game.save.coins = math.max(game.save.coins or 0, 50)
|
|
|
|
-- the seats are hidden events on the machine tiles (data/events/
|
|
-- hidden_events.asm StartSlotMachine); stand on any walkable neighbour
|
|
local seats = (game.data.field.slotMachines or {}).GAME_CORNER or {}
|
|
local placed = nil
|
|
U.teleport(game, "GAME_CORNER", 9, 15, "down")
|
|
local ow = game.overworld
|
|
local sides = {
|
|
{ 0, 1, "up" }, { 0, -1, "down" }, { 1, 0, "left" }, { -1, 0, "right" },
|
|
}
|
|
for _, seat in ipairs(seats) do
|
|
if seat.state == "ok" then
|
|
for _, s in ipairs(sides) do
|
|
local cx, cy = seat.x + s[1], seat.y + s[2]
|
|
if ow.map:isWalkableCell(cx, cy) and not ow:npcAtCell(cx, cy) then
|
|
U.teleport(game, "GAME_CORNER", cx, cy, s[3])
|
|
U.wait(10)
|
|
ow = game.overworld
|
|
local fx, fy = ow.player:facingCell()
|
|
if fx == seat.x and fy == seat.y then
|
|
placed = { seat = seat, x = cx, y = cy, facing = s[3] }
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if placed then break end
|
|
end
|
|
check("standing at a working slot machine", placed ~= nil)
|
|
if placed then
|
|
U.log(("machine at (%d, %d), player at (%d, %d) facing %s")
|
|
:format(placed.seat.x, placed.seat.y, placed.x, placed.y,
|
|
placed.facing))
|
|
end
|
|
|
|
U.tap(game, "a")
|
|
U.wait(30)
|
|
local top = game.stack:top()
|
|
local isBox = getmetatable(top) == TextBox
|
|
check("A opens a text box, not the slot screen", isBox)
|
|
check("the slot screen is not on the stack yet",
|
|
getmetatable(top) ~= SlotMachine)
|
|
if isBox then
|
|
local shown = {}
|
|
for _, page in ipairs(top.pages or {}) do
|
|
for _, line in ipairs(page) do shown[#shown + 1] = line end
|
|
end
|
|
U.log("box reads:", table.concat(shown, " / "))
|
|
end
|
|
U.shot(game, SHOT_DIR .. "/bug1811_prompt.png")
|
|
|
|
-- through the text, then YES
|
|
for _ = 1, 8 do
|
|
if game.overworld.emote then break end
|
|
U.tap(game, "a")
|
|
U.wait(12)
|
|
end
|
|
U.wait(4)
|
|
local emote = game.overworld.emote
|
|
check("YES floats an emotion bubble over the player", emote ~= nil)
|
|
check("it is SMILE_BUBBLE, the third crop", emote and emote.bubble == 3)
|
|
check("and it is over the player, not an NPC",
|
|
emote and emote.npc == game.overworld.player)
|
|
U.shot(game, SHOT_DIR .. "/bug1811_smile.png")
|
|
|
|
for _ = 1, 120 do
|
|
if getmetatable(game.stack:top()) == SlotMachine then break end
|
|
U.wait(2)
|
|
end
|
|
local slots = game.stack:top()
|
|
check("the slot screen opens after the bubble",
|
|
getmetatable(slots) == SlotMachine)
|
|
check("and it opens on the bet menu", slots.stage == "bet")
|
|
U.wait(10)
|
|
U.shot(game, SHOT_DIR .. "/bug1811_bet.png")
|
|
U.log("captured", SHOT_DIR .. "/bug1811_{prompt,smile,bet}.png")
|
|
|
|
U.log("Right: the prompt box sits over the still-drawn Game Corner floor,")
|
|
U.log("then a smiley pops over the player, then the machine appears with a")
|
|
U.log("bet menu whose bottom edge is the last row of the screen. The")
|
|
U.log("near-miss is the machine already drawn behind the prompt, or a bet")
|
|
U.log("box two rows short of the bottom.")
|
|
|
|
while true do
|
|
coroutine.yield()
|
|
end
|
|
end
|