mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 16:31:05 +02:00
3069b2e2a9
* new launcher and save converts and pipeline * fixing bugs
163 lines
4.9 KiB
Lua
163 lines
4.9 KiB
Lua
-- Driver: level-up learn with a full moveset (#173).
|
|
-- Injects the post-KO level-up queue (grew + StatBox + learnMove) inside
|
|
-- a live wild battle so MoveLearnMenu runs the same path as a real win.
|
|
--
|
|
-- SHOT_DIR=/tmp/learn173 POKEPORT_DRIVER=tests/drivers/learn_move_full_test.lua love .
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
local DIR = os.getenv("SHOT_DIR") or "/tmp/learn173"
|
|
os.execute("mkdir -p " .. DIR)
|
|
|
|
local Pokemon = require("src.pokemon.Pokemon")
|
|
local mon = Pokemon.new(game.data, "CHARMANDER", 14)
|
|
mon.moves = {
|
|
{ id = "SCRATCH", pp = 35 },
|
|
{ id = "GROWL", pp = 40 },
|
|
{ id = "EMBER", pp = 25 },
|
|
{ id = "SMOKESCREEN", pp = 20 },
|
|
}
|
|
table.insert(game.save.party, 1, mon)
|
|
game.save.options = game.save.options or {}
|
|
game.save.options.textSpeed = 1
|
|
|
|
U.teleport(game, "ROUTE_1", 5, 5, "down")
|
|
local ow = game.overworld
|
|
local BattleState = require("src.battle.BattleState")
|
|
local battle = BattleState.newWild(game, "RATTATA", 2)
|
|
battle.onFinish = function() end
|
|
ow:pushBattle(battle)
|
|
|
|
local function top() return game.stack:top() end
|
|
local function stackIds()
|
|
local parts = {}
|
|
for _, st in ipairs(game.stack.states or {}) do
|
|
local id = st.screenId or (st.pages and "TextBox")
|
|
or (st.onChoose and "ChoiceBox")
|
|
or (st.mon and st.stats and "StatBox")
|
|
or (st.newMoveId and "MoveLearnMenu")
|
|
or (st.phase and ("Battle:" .. tostring(st.phase)))
|
|
or "?"
|
|
if st.selecting ~= nil then
|
|
id = id .. (st.selecting and "[sel]" or "[ask]")
|
|
end
|
|
if st.pages then
|
|
id = id .. string.format("[p%d/%d%s%s]", st.pageIndex or 0, #st.pages,
|
|
st.waiting and "W" or "", st.done and "D" or "")
|
|
end
|
|
parts[#parts + 1] = id
|
|
end
|
|
return table.concat(parts, ">")
|
|
end
|
|
local function isText()
|
|
local t = top()
|
|
return t and t.pages ~= nil
|
|
end
|
|
local function isChoice()
|
|
local t = top()
|
|
return t and t.onChoose ~= nil and t.index ~= nil and not t.mon
|
|
end
|
|
local function learnMenu()
|
|
for _, st in ipairs(game.stack.states or {}) do
|
|
if st.newMoveId and st.mon and st.index then return st end
|
|
end
|
|
end
|
|
local function waitFor(cond, max)
|
|
for i = 1, max or 900 do
|
|
if cond() then return true end
|
|
U.wait(1)
|
|
end
|
|
return false
|
|
end
|
|
local function atPrompt()
|
|
local t = top()
|
|
return t and t.pages and (t.waiting or t.done)
|
|
end
|
|
-- #163: \v conts pause with ▼ mid-page; tap through them so the shot
|
|
-- lands on the full page (or the done+choice tail)
|
|
local function advanceTextPage()
|
|
waitFor(atPrompt, 300)
|
|
for _ = 1, 4 do
|
|
local t = top()
|
|
if not (t and t.pages and t.waiting and t.contAdvance) then break end
|
|
U.tap(game, "a")
|
|
U.wait(2)
|
|
waitFor(atPrompt, 300)
|
|
end
|
|
U.wait(2)
|
|
end
|
|
|
|
waitFor(function() return battle.phase == "menu" end, 400)
|
|
local StatBox = BattleState.StatBox
|
|
battle.phase = "messages"
|
|
battle.afterQueue = "menu"
|
|
battle.queue = {}
|
|
battle.current = nil
|
|
battle.nextInsert = 0
|
|
battle:say("CHARMANDER gained\n16 EXP. Points!")
|
|
battle:say("CHARMANDER grew\nto level 15!")
|
|
battle:ui(function() return StatBox.new(game, mon) end)
|
|
mon.level = 15
|
|
-- append (not uiNext): learnMove uses uiNext for mid-fn ordering
|
|
battle:ui(function()
|
|
return battle:buildScreen("MoveLearnMenu", mon, "LEER")
|
|
end)
|
|
|
|
for _ = 1, 400 do
|
|
if learnMenu() then break end
|
|
U.tap(game, "a")
|
|
U.wait(2)
|
|
end
|
|
if not learnMenu() then error("MoveLearnMenu never opened: " .. stackIds()) end
|
|
U.log("opened", stackIds())
|
|
|
|
-- page 1
|
|
advanceTextPage()
|
|
U.log("shot0", stackIds())
|
|
U.shot(game, DIR .. "/learn_0_trying.png")
|
|
U.tap(game, "a"); U.wait(2)
|
|
|
|
-- page 2
|
|
advanceTextPage()
|
|
U.log("shot1", stackIds())
|
|
U.shot(game, DIR .. "/learn_1_cant_more.png")
|
|
U.tap(game, "a"); U.wait(2)
|
|
|
|
-- page 3 types out (through its cont), then ChoiceBox overlays
|
|
advanceTextPage()
|
|
if not waitFor(isChoice, 120) then
|
|
error("ChoiceBox never appeared: " .. stackIds())
|
|
end
|
|
U.wait(4) -- let choice settle over Delete prompt
|
|
U.log("shot2", stackIds())
|
|
U.shot(game, DIR .. "/learn_2_delete_yesno.png")
|
|
U.tap(game, "a"); U.wait(4) -- YES
|
|
|
|
if not waitFor(function()
|
|
local m = learnMenu()
|
|
return m and m.selecting and top() == m
|
|
end, 120) then
|
|
error("forget list never active: " .. stackIds())
|
|
end
|
|
U.log("shot3", stackIds())
|
|
U.shot(game, DIR .. "/learn_3_which_move.png")
|
|
U.tap(game, "a"); U.wait(4) -- forget SCRATCH
|
|
|
|
local n = 4
|
|
for _ = 1, 60 do
|
|
if not isText() then break end
|
|
local t = top()
|
|
if t.done or t.waiting then
|
|
U.log("shot" .. n, stackIds())
|
|
U.shot(game, ("%s/learn_%d_after.png"):format(DIR, n))
|
|
n = n + 1
|
|
U.tap(game, "a")
|
|
U.wait(4)
|
|
else
|
|
U.wait(1)
|
|
end
|
|
end
|
|
|
|
U.log("done", DIR, "moves[1]=", mon.moves[1] and mon.moves[1].id, stackIds())
|
|
love.event.quit()
|
|
end
|