mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
187 lines
6.1 KiB
Lua
187 lines
6.1 KiB
Lua
-- pokefirered/data/scripts/pc.inc:1
|
|
local U = require("tests.drivers.util")
|
|
local DIR = os.getenv("POKEPORT_SHOT_DIR") or "/tmp"
|
|
|
|
local PC_X, PC_Y = 11, 2
|
|
local SE_PC_LOGIN, SE_PC_OFF, SE_PC_ON, SE_SELECT = 2, 3, 4, 5 -- include/constants/songs.h:6
|
|
|
|
local failures = 0
|
|
local function result(ok, label)
|
|
if ok then
|
|
print("PASS " .. label)
|
|
else
|
|
failures = failures + 1
|
|
print("FAIL " .. label)
|
|
end
|
|
return ok
|
|
end
|
|
|
|
local function finish()
|
|
if failures == 0 then
|
|
print("PASS game3_pc_se_2415")
|
|
love.event.quit(0)
|
|
else
|
|
print("FAIL game3_pc_se_2415 failures=" .. failures)
|
|
love.event.quit(1)
|
|
end
|
|
end
|
|
|
|
local function waitFor(pred, n)
|
|
for _ = 1, n do
|
|
if pred() then return true end
|
|
U.wait(1)
|
|
end
|
|
return pred()
|
|
end
|
|
|
|
local function PcMenu() return package.loaded["src.ui.game3.pc_menu"] end
|
|
local function Space() return package.loaded["src.core.game3.scripting.space"] end
|
|
local function Message() return package.loaded["src.ui.game3.message"] end
|
|
local function menuOpen()
|
|
local M = PcMenu()
|
|
return M and M.isOpen and M.isOpen() and M.mode == "root"
|
|
end
|
|
|
|
return function(game)
|
|
U.wait(30)
|
|
game:_handleBootAction({ action = "new_game", name = "RED" })
|
|
U.wait(120)
|
|
local Map = require("src.core.game3.map")
|
|
Map.load(nil, game, "FR_VIRIDIAN_CITY_POKEMON_CENTER_1F", { x = PC_X, y = PC_Y, facing = "up" })
|
|
game.session.x, game.session.y, game.session.facing = PC_X, PC_Y, "up"
|
|
U.wait(90)
|
|
|
|
local Audio = require("src.core.game3.audio")
|
|
local orig = Audio.playSe
|
|
local log = {}
|
|
Audio.playSe = function(id, ...)
|
|
log[#log + 1] = id
|
|
print("SE " .. tostring(id))
|
|
return orig(id, ...)
|
|
end
|
|
local function since(n)
|
|
local t = {}
|
|
for i = n + 1, #log do t[#t + 1] = tostring(log[i]) end
|
|
return table.concat(t, ",")
|
|
end
|
|
|
|
U.tap(game, "a")
|
|
local booted = waitFor(function()
|
|
local Msg = Message()
|
|
return Msg and Msg.isOpen and Msg.isOpen()
|
|
end, 60)
|
|
U.wait(10)
|
|
result(booted, "interact opens the booted-up message")
|
|
result(log[1] == SE_PC_ON and #log == 1,
|
|
"SE_PC_ON (4) plays on interact before the menu (got " .. since(0) .. ")")
|
|
U.shot(game, DIR .. "/2415_01_booted_up_pc.png")
|
|
|
|
local mark = #log
|
|
for _ = 1, 8 do
|
|
if menuOpen() then break end
|
|
U.tap(game, "a")
|
|
U.wait(20)
|
|
end
|
|
if not result(menuOpen(), "Center PC opens the root menu") then return finish() end
|
|
result(since(mark) == "", "root menu open plays no SE (got " .. since(mark) .. ")")
|
|
|
|
mark = #log
|
|
U.tap(game, "a")
|
|
U.wait(20)
|
|
result(since(mark) == SE_SELECT .. "," .. SE_PC_LOGIN,
|
|
"SOMEONE'S PC selection plays SE_SELECT then SE_PC_LOGIN (got " .. since(mark) .. ")")
|
|
U.shot(game, DIR .. "/2415_02_storage_menu_after_login.png")
|
|
|
|
local M = PcMenu()
|
|
local function advanceUntil(pred, n)
|
|
for _ = 1, n do
|
|
if pred() then return true end
|
|
local Msg = Message()
|
|
local page = Msg and Msg.isOpen() and tostring(Msg.currentPage() or ""):gsub("[\n\f]", " ") or ""
|
|
if Msg and Msg.isOpen() and Msg.isWaiting() and not page:find("Which PC", 1, true) then
|
|
U.tap(game, "a")
|
|
end
|
|
U.wait(1)
|
|
end
|
|
return pred()
|
|
end
|
|
local function released()
|
|
local S = Space()
|
|
local running = S and S.vm and S.vm.isRunning and S.vm:isRunning()
|
|
local Msg = Message()
|
|
return not M.isOpen() and not running and not (Msg and Msg.isOpen and Msg.isOpen())
|
|
end
|
|
local function waitReleased(n)
|
|
for _ = 1, n do
|
|
if released() then return true end
|
|
U.wait(1)
|
|
end
|
|
return released()
|
|
end
|
|
|
|
if not result(advanceUntil(function() return M.isOpen() and M.mode == "storage_menu" end, 600),
|
|
"storage system menu opens") then return finish() end
|
|
mark = #log
|
|
U.tap(game, "b")
|
|
if not result(advanceUntil(menuOpen, 600), "B out of storage reshows the PC menu") then return finish() end
|
|
result(since(mark) == tostring(SE_SELECT),
|
|
"B out of storage plays SE_SELECT only (got " .. since(mark) .. ")")
|
|
local rows = M._rootEntries()
|
|
local ids = {}
|
|
for _, r in ipairs(rows) do ids[#ids + 1] = r.id end
|
|
result(table.concat(ids, ",") == "storage,player,quit",
|
|
"new game root menu has 3 rows (got " .. table.concat(ids, ",") .. ")")
|
|
for _ = 1, #rows + 1 do
|
|
if rows[M.cursor] and rows[M.cursor].id == "quit" then break end
|
|
U.tap(game, "down")
|
|
U.wait(8)
|
|
end
|
|
mark = #log
|
|
U.tap(game, "a")
|
|
result(waitReleased(180), "LOG OFF releases the player")
|
|
result(since(mark) == SE_SELECT .. "," .. SE_PC_OFF,
|
|
"LOG OFF plays SE_SELECT then SE_PC_OFF once (got " .. since(mark) .. ")")
|
|
|
|
U.wait(30)
|
|
U.tap(game, "a")
|
|
if not result(advanceUntil(menuOpen, 600), "Center PC reopens the root menu") then return finish() end
|
|
mark = #log
|
|
U.tap(game, "b")
|
|
result(waitReleased(180), "B on the PC menu releases the player")
|
|
result(since(mark) == SE_SELECT .. "," .. SE_PC_OFF,
|
|
"B on the PC menu plays SE_SELECT then SE_PC_OFF once (got " .. since(mark) .. ")")
|
|
|
|
Map.load(nil, game, "FR_PLAYERS_HOUSE_2F", { x = 1, y = 2, facing = "up" })
|
|
game.session.x, game.session.y, game.session.facing = 1, 2, "up"
|
|
U.wait(90)
|
|
mark = #log
|
|
U.tap(game, "a")
|
|
if not result(advanceUntil(function() return M.isOpen() and M.mode == "player_pc" end, 600),
|
|
"bedroom PC opens the player PC menu") then return finish() end
|
|
result(since(mark) == tostring(SE_PC_ON), "bedroom PC plays SE_PC_ON (got " .. since(mark) .. ")")
|
|
U.shot(game, DIR .. "/2415_03_bedroom_pc_menu.png")
|
|
for _ = 1, 4 do
|
|
if M.cursor == #M.TOP_ACTIONS then break end
|
|
U.tap(game, "down")
|
|
U.wait(8)
|
|
end
|
|
mark = #log
|
|
U.tap(game, "a")
|
|
result(waitReleased(180), "bedroom TURN OFF releases the player")
|
|
result(since(mark) == SE_SELECT .. "," .. SE_PC_OFF,
|
|
"bedroom TURN OFF plays SE_SELECT then SE_PC_OFF once (got " .. since(mark) .. ")")
|
|
|
|
U.wait(30)
|
|
U.tap(game, "a")
|
|
if not result(advanceUntil(function() return M.isOpen() and M.mode == "player_pc" end, 600),
|
|
"bedroom PC reopens") then return finish() end
|
|
mark = #log
|
|
U.tap(game, "b")
|
|
result(waitReleased(180), "bedroom B releases the player")
|
|
result(since(mark) == SE_SELECT .. "," .. SE_PC_OFF,
|
|
"bedroom B plays SE_SELECT then SE_PC_OFF once (got " .. since(mark) .. ")")
|
|
|
|
Audio.playSe = orig
|
|
finish()
|
|
end
|