Files
gen1recomp/tests/drivers/menu_speed_bug2578.lua
T
2026-10-02 13:52:21 -04:00

152 lines
6.5 KiB
Lua

local U = require("tests.drivers.util")
local DIR = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/menu_speed_bug2578"
local failed = 0
local function check(ok, label)
print((ok and "PASS " or "FAIL ") .. label)
if not ok then failed = failed + 1 end
return ok
end
local function gen1(game)
game.speedOverride = 200
game.save.party = { require("src.pokemon.Pokemon").new(game.data, "PIKACHU", 20) }
U.teleport(game, "PALLET_TOWN", 10, 12, "down")
local Screens = require("src.ui.Screens")
local Game = require("src.core.Game")
local opts = game.save.options
opts.speedOverworld, opts.speedBattle, opts.speedMenu = 4, 10, 2
game.speedOverride = nil
check(game:logicSpeed() == 4, "2578_gen1_field_speed")
for _, name in ipairs({ "StartMenu", "PartyMenu", "BagMenu" }) do
Screens.push(game, name)
U.wait(20)
check(Game.speedCategoryInStack(game.stack) == "menu" and game:logicSpeed() == 2,
"2578_gen1_field_" .. name .. "_menu_speed")
check(U.still(game, DIR .. "/2578_gen1_field_" .. name .. ".png"), "2578_gen1_" .. name .. "_shot")
game.stack:pop()
check(game:logicSpeed() == 4, "2578_gen1_" .. name .. "_pop_restores_field")
end
local Menu = require("src.ui.Menu")
local function reachPCMenu()
for _ = 1, 600 do
local top = game.stack:top()
if getmetatable(top) == Menu then return top end
U.tap(game, "a")
U.wait(2)
end
error("actual interactive PC menu was not reached")
end
game.overworld:openPC()
local pc = reachPCMenu()
check(#pc.items >= 3 and pc.noSound and Game.speedCategoryInStack(game.stack) == "menu"
and game:logicSpeed() == 2, "2578_gen1_pc_main_uses_MENU_SPEED")
check(U.still(game, DIR .. "/2578_gen1_pc_main.png"), "2578_gen1_pc_main_shot")
U.tap(game, "b")
U.wait(2)
check(game.stack:top() == game.overworld and game:logicSpeed() == 4,
"2578_gen1_pc_main_pop_restores_field")
game.speedOverride = 200
U.teleport(game, "BILLS_HOUSE", 2, 3, "up")
game.speedOverride = nil
game.overworld:billsHousePokemonList()
local bill = reachPCMenu()
check(#bill.items == 5 and bill.items[1].keepOpen and Game.speedCategoryInStack(game.stack) == "menu"
and game:logicSpeed() == 2, "2578_gen1_bill_pc_viewer_uses_MENU_SPEED")
check(U.still(game, DIR .. "/2578_gen1_bill_pc_viewer.png"), "2578_gen1_bill_pc_viewer_shot")
U.tap(game, "b")
U.wait(2)
check(game.stack:top() == game.overworld and game:logicSpeed() == 4,
"2578_gen1_bill_pc_viewer_pop_restores_field")
game.speedOverride = 200
U.teleport(game, "PALLET_TOWN", 10, 12, "down")
game.speedOverride = nil
local battle = require("src.battle.BattleState").newWild(game, "RATTATA", 3)
game.overworld:pushBattle(battle)
game.speedOverride = 200
for _ = 1, 1500 do
if game.stack:top() == battle and battle.phase == "menu" then break end
U.tap(game, "a")
U.wait(2)
end
game.speedOverride = nil
check(Game.speedCategoryInStack(game.stack) == "battle" and game:logicSpeed() == 10,
"2578_gen1_actual_battle_speed")
for _, name in ipairs({ "PartyMenu", "BagMenu" }) do
Screens.push(game, name, { battle = battle })
U.wait(20)
check(game:logicSpeed() == 2, "2578_gen1_battle_" .. name .. "_menu_speed")
check(U.still(game, DIR .. "/2578_gen1_battle_" .. name .. ".png"), "2578_gen1_battle_" .. name .. "_shot")
game.stack:pop()
check(game:logicSpeed() == 10, "2578_gen1_battle_" .. name .. "_pop_restores_battle")
end
end
local function gen3(game)
game.speedOverride = 200
for _ = 1, 900 do
if game.phase == "boot" and game.boot then break end
U.wait(1)
end
game:_handleBootAction({ action = "new_game", name = "RED", gender = 0 })
U.wait(240)
local Runtime = require("src.core.game3.runtime")
local session = Runtime.getSession()
assert(session, "new game did not reach field")
session.party = {}
require("src.core.game3.party").giveMon(session, 25, 20)
local Stack = require("src.ui.game3.stack")
local Start = require("src.ui.game3.start_menu")
local Party = require("src.ui.game3.party_menu")
local Bag = require("src.ui.game3.bag_menu")
game.options.speedOverworld, game.options.speedBattle, game.options.speedMenu = 4, 10, 2
game.speedOverride = nil
check(game:logicSpeed() == 4, "2578_gen3_field_speed")
local menus = {
{ id = "start", open = function() Start.show({ session = session, game = game }) end, close = Start.close },
{ id = "party", open = function() Party.show(session.party, nil, { session = session }) end, close = Party.close },
{ id = "bag", open = function() Bag.show(session, { session = session }) end, close = Bag.close },
}
for _, menu in ipairs(menus) do
menu.open()
U.wait(120)
check(Stack.has(menu.id) and game:logicSpeed() == 2, "2578_gen3_field_" .. menu.id .. "_menu_speed")
check(U.still(game, DIR .. "/2578_gen3_field_" .. menu.id .. ".png"), "2578_gen3_" .. menu.id .. "_shot")
menu.close()
check(game:logicSpeed() == 4, "2578_gen3_" .. menu.id .. "_pop_restores_field")
end
local Battle = require("src.core.game3.battle")
local Bridge = require("src.core.game3.battle_bridge")
local started, err = Bridge.startWild(Runtime._mod, game, { species = 16, level = 3 }, { fade = false })
assert(started, tostring(err))
game.speedOverride = 200
for _ = 1, 1800 do
if Battle._phase == "command" then break end
U.tap(game, "a")
U.wait(2)
end
game.speedOverride = nil
check(Battle.isActive() and game:logicSpeed() == 10, "2578_gen3_actual_battle_speed")
Party.show(session.party, nil, { session = session, battle = true, mode = "battle_switch" })
U.wait(120)
check(game:logicSpeed() == 2, "2578_gen3_battle_party_menu_speed")
check(U.still(game, DIR .. "/2578_gen3_battle_party.png"), "2578_gen3_battle_party_shot")
Party.close()
check(game:logicSpeed() == 10, "2578_gen3_battle_party_pop_restores_battle")
Bag.show(session, { session = session, battle = true })
U.wait(120)
check(game:logicSpeed() == 2 and Stack.top().fullscreen == false, "2578_gen3_nonfullscreen_battle_bag_menu_speed")
check(U.still(game, DIR .. "/2578_gen3_battle_bag.png"), "2578_gen3_battle_bag_shot")
Bag.close()
check(game:logicSpeed() == 10, "2578_gen3_battle_bag_pop_restores_battle")
end
return function(game)
local ok, err = xpcall(function()
if game.phase ~= nil then gen3(game) else gen1(game) end
end, debug.traceback)
if not ok then failed = failed + 1; print("FAIL 2578_driver " .. tostring(err)) end
print((failed == 0 and "PASS " or "FAIL ") .. "2578_menu_speed failures=" .. failed)
love.event.quit(failed == 0 and 0 or 1)
end