Files
gen1recomp/tests/drivers/game3_u8d_evolution_learn.lua
bryanthaboi d615ad39ab bazinga 2
2026-09-13 03:34:39 -04:00

197 lines
6.9 KiB
Lua

local U = require("tests.drivers.util")
local DIR = os.getenv("POKEPORT_SHOT_DIR") or "/tmp"
return function(game)
local fails = 0
local function check(cond, label)
if cond then
print("PASS " .. label)
else
fails = fails + 1
print("FAIL " .. label)
end
return cond
end
local function finish()
if fails == 0 then
print("PASS u8d evolution scene learn move")
love.event.quit(0)
else
print("FAIL u8d evolution scene learn move")
love.event.quit(1)
end
end
U.wait(30)
local Schema = require("src.core.game3.save_schema_firered")
local Party = require("src.core.game3.party")
local Pokemon = require("src.core.game3.pokemon")
local Runtime = require("src.core.game3.runtime")
local Audio = require("src.core.game3.audio")
local Message = require("src.ui.game3.message")
local Choice = require("src.ui.game3.choice")
local SummaryMenu = require("src.ui.game3.summary_menu")
local EvolutionScene = require("src.ui.game3.evolution_scene")
local session = Schema.newGame({ name = "RED", rivalName = "BLUE", gender = 0 })
session.party = {}
Party.giveMon(session, 11, 10)
Party.giveMon(session, 11, 10)
session.party[1].moves = { 106, 33, 81, 1 }
session.party[1].pp = { 30, 35, 40, 35 }
session.party[1].maxPp = { 30, 35, 40, 35 }
session.party[2].moves = { 106, 33 }
session.party[2].pp = { 30, 35 }
session.party[2].maxPp = { 30, 35 }
session.map = "FR_ROUTE_1"
session.x = 10
session.y = 20
session.flags = session.flags or {}
game:_enterField(session, "new_game")
U.wait(90)
local live = Runtime.getSession() or session
local learnset = Pokemon.movesLearnedAt(12, 10)
local hasConf = false
for _, m in ipairs(learnset) do if m == 93 then hasConf = true end end
if not check(hasConf, "u8d BUTTERFREE learns CONFUSION at 10 in the cache") then return finish() end
local CONF = Pokemon.moveName(93) or "CONFUSION"
local pages = {}
local lastPage
local function page()
return (Message.isOpen() and Message.currentPage and Message.currentPage()) or ""
end
local function track()
local p = page()
if p ~= lastPage then
lastPage = p
if p ~= "" then
pages[#pages + 1] = p
print("[u8d] page: " .. p:gsub("\n", " / "))
end
end
end
local function seen(needle)
local n = 0
for _, p in ipairs(pages) do
if p:find(needle, 1, true) then n = n + 1 end
end
return n
end
local function advanceUntil(pred, limit)
for f = 1, limit do
U.wait(1)
track()
if pred() then return true end
if f % 6 == 0 and not Choice.active and not Message._stay and not SummaryMenu.isOpen() then U.tap(game, "a") end
end
return false
end
local function yesNoWith(needle)
return function()
return Choice.active and Choice.kind == "yesno" and Message.isWaiting()
and page():find(needle, 1, true) ~= nil
end
end
local mon = live.party[1]
local result
EvolutionScene.start(mon, 12, {
session = live, canStop = false, savedSong = Audio._mapSong,
onDone = function(r) result = r end,
})
if not check(advanceUntil(yesNoWith("Delete a move to make"), 3000), "u8d TRYTOLEARNMOVE3 prompt with Yes/No") then
U.shot(game, DIR .. "/u8d_98_no_try3.png")
return finish()
end
check(seen("is trying to") >= 1 and seen("can't learn") >= 1, "u8d TRYTOLEARNMOVE1 and TRYTOLEARNMOVE2 shown first")
local preName, postName = Pokemon.name(11) or "METAPOD", Pokemon.name(12) or "BUTTERFREE"
check(seen("Congratulations! Your " .. preName .. "\nevolved into " .. postName .. "!") == 1
and seen("Your " .. postName .. "\nevolved") == 0,
"u8d congrats names the pre-evo " .. preName .. ", not " .. postName)
check(seen("wants to learn") == 0 and seen("Should a move be deleted") == 0, "u8d no field party-menu wording")
check(Choice.style == "battle" and Choice.left == 24 and Choice.top == 9, "u8d battle Yes/No window at 24,9")
U.shot(game, DIR .. "/u8d_01_evo_try3_yesno.png")
U.tap(game, "down")
U.wait(2)
U.tap(game, "a")
if not check(advanceUntil(yesNoWith("Stop learning"), 600), "u8d NO opens Stop learning prompt") then
U.shot(game, DIR .. "/u8d_98_no_stop.png")
return finish()
end
U.shot(game, DIR .. "/u8d_02_evo_stop_learning.png")
U.tap(game, "down")
U.wait(2)
U.tap(game, "a")
if not check(advanceUntil(yesNoWith("Delete a move to make"), 900), "u8d NO to stop re-asks") then
U.shot(game, DIR .. "/u8d_98_no_reask.png")
return finish()
end
check(seen("is trying to") >= 2 and seen("can't learn") >= 2, "u8d re-ask reprints TRYTOLEARNMOVE1 and 2")
U.tap(game, "a")
if not check(advanceUntil(function()
return SummaryMenu.isOpen() and SummaryMenu._mode == "select_move"
end, 300), "u8d YES opens summary move select") then
U.shot(game, DIR .. "/u8d_98_no_summary.png")
return finish()
end
check(SummaryMenu._moveToLearn == 93, "u8d summary fifth move is CONFUSION")
U.wait(20)
U.shot(game, DIR .. "/u8d_03_evo_summary_select_move.png")
U.tap(game, "a")
local learnedShot = false
local learnedLastSeen
local ok = advanceUntil(function()
local p = page()
if p:find("learned", 1, true) and p:find(CONF, 1, true) then
if not learnedShot and Message.isWaiting() then
learnedShot = true
U.shot(game, DIR .. "/u8d_04_evo_learned_confusion.png")
end
learnedLastSeen = U.frame()
end
return result ~= nil
end, 1200)
check(ok and result == "evolved", "u8d forget-path scene finished evolved")
check(seen("Poof!") >= 1 and seen("forgot") >= 1 and seen("And") >= 1, "u8d 123POOF, PKMNFORGOTMOVE, ANDELLIPSIS shown")
check(learnedShot, "u8d PKMNLEARNEDMOVE CONFUSION shown")
check(mon.species == 12 and mon.moves[1] == 93, "u8d CONFUSION replaced HARDEN on BUTTERFREE")
local gap = learnedLastSeen and (U.frame() - learnedLastSeen) or -1
check(gap >= 0x40, "u8d scene held 0x40 frames after the learned text (" .. tostring(gap) .. ")")
U.wait(30)
pages = {}
lastPage = nil
result = nil
local mon2 = live.party[2]
EvolutionScene.start(mon2, 12, {
session = live, canStop = false, savedSong = Audio._mapSong,
onDone = function(r) result = r end,
})
learnedLastSeen = nil
local learned2 = false
ok = advanceUntil(function()
local p = page()
if p:find("learned", 1, true) and p:find(CONF, 1, true) then
learned2 = true
learnedLastSeen = U.frame()
end
return result ~= nil
end, 3000)
check(ok and result == "evolved" and learned2, "u8d free-slot scene learned CONFUSION and finished")
check(mon2.moves[3] == 93 and seen("is trying to") == 0, "u8d free slot taught without the replace prompts")
gap = learnedLastSeen and (U.frame() - learnedLastSeen) or -1
check(gap >= 0x40, "u8d free-slot scene held 0x40 frames after the learned text (" .. tostring(gap) .. ")")
U.wait(20)
U.shot(game, DIR .. "/u8d_05_back_on_field.png")
check(not EvolutionScene.isOpen(), "u8d evolution scene closed")
finish()
end