mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-19 20:20:19 +02:00
121 lines
4.9 KiB
Lua
121 lines
4.9 KiB
Lua
-- _TrainerSentOutText (data/text/text_2.asm:923) and the
|
|
-- Go!/Do it!/Get'm! chain ending in _PlayerMon1Text (:1274-1294) end in
|
|
-- `done`, not `prompt`: PrintText returns and the flow runs straight into
|
|
-- AnimateSendingOutMon + PlayCry (engine/battle/core.asm:1421-1434,
|
|
-- :1723-1765). _AIBattleWithdrawText (:1-7) does end in `prompt` and
|
|
-- keeps its button wait. The port made every send-out box wait (#1472).
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local T = require("tests.modkit")
|
|
local Data = T.fixtures.fresh()
|
|
require("src.render.Font").load(Data)
|
|
local BattleState = require("src.battle.BattleState")
|
|
local Pokemon = require("src.pokemon.Pokemon")
|
|
local SaveData = require("src.core.SaveData")
|
|
local TypeChart = require("src.battle.TypeChart")
|
|
TypeChart.load(Data)
|
|
|
|
local function newBattle()
|
|
local save = SaveData.newGame()
|
|
save.party = { Pokemon.new(Data, "FIXMON_A", 30), Pokemon.new(Data, "FIXMON_B", 30) }
|
|
local game = { data = Data, save = save,
|
|
stack = { top = function() return nil end, push = function() end } }
|
|
local battle = BattleState.newWild(game, "FIXMON_C", 30)
|
|
battle.rng = function() return 0 end
|
|
battle.enemyAction = function() return { id = "FIX_SCRATCH", pp = 35 } end
|
|
return battle
|
|
end
|
|
|
|
local function rowWith(battle, needle)
|
|
for _, item in ipairs(battle.queue) do
|
|
if item.text and item.text:find(needle, 1, true) then return item end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- the voluntary switch: the shout auto-continues into the send-out anim
|
|
-- ---------------------------------------------------------------------
|
|
do
|
|
local battle = newBattle()
|
|
battle.queue, battle.nextInsert = {}, 0
|
|
battle:resolveSwitch(battle.game.save.party[2])
|
|
-- run the first act so the nested switch rows land in the queue
|
|
local first = table.remove(battle.queue, 1)
|
|
battle.nextInsert = 0
|
|
first.fn()
|
|
local withdraw = rowWith(battle, "Come back!")
|
|
T.check(withdraw ~= nil, "the withdraw line is queued")
|
|
T.eq(withdraw.auto, true, "RetreatMon's page ends `done` (#1534)")
|
|
local swap = table.remove(battle.queue, 2)
|
|
battle.nextInsert = 1
|
|
swap.fn()
|
|
local shout = rowWith(battle, battle.player.name)
|
|
T.check(shout ~= nil, "the send-out shout is queued")
|
|
T.eq(shout.auto, true, "_PlayerMon1Text ends `done`, so no button wait")
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- the AI switch: the sent-out box goes auto, the withdraw box does not,
|
|
-- and EnemySendOut's grow-in + cry now follow it
|
|
-- ---------------------------------------------------------------------
|
|
do
|
|
local save = SaveData.newGame()
|
|
save.party = { Pokemon.new(Data, "FIXMON_A", 30) }
|
|
local game = { data = Data, save = save,
|
|
stack = { top = function() return nil end, push = function() end } }
|
|
local battle = BattleState.newTrainer(game, "OPP_FIX_YOUNGSTER", 1)
|
|
battle.rng = function() return 0 end
|
|
battle.enemyParty = { Pokemon.new(Data, "FIXMON_B", 30),
|
|
Pokemon.new(Data, "FIXMON_C", 30) }
|
|
battle.enemyIndex = 1
|
|
battle.enemy = battle.enemy or nil
|
|
battle.queue, battle.nextInsert = {}, 0
|
|
battle:executeAction(battle.enemy, battle.player,
|
|
{ special = "aiSwitch", index = 2 })
|
|
local withdrew = rowWith(battle, "with-")
|
|
local sent = rowWith(battle, "sent")
|
|
T.check(withdrew ~= nil, "the AI withdraw line is queued")
|
|
T.eq(withdrew.auto, nil, "_AIBattleWithdrawText ends `prompt` and still waits")
|
|
T.check(sent ~= nil, "the sent-out line is queued")
|
|
T.eq(sent.auto, true, "_TrainerSentOutText ends `done`")
|
|
T.eq(battle.enemySendingOut, true,
|
|
"the new pic stays hidden until AnimateSendingOutMon")
|
|
local acts = 0
|
|
for _, item in ipairs(battle.queue) do
|
|
if item.fn then acts = acts + 1 end
|
|
end
|
|
T.check(acts >= 1, "EnemySendOut queues the grow-in act after the text")
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- the post-faint replacement (ChooseNextMon -> SendOutMon, core.asm:1124)
|
|
-- ---------------------------------------------------------------------
|
|
do
|
|
local battle = newBattle()
|
|
local pushedUI
|
|
battle.game.stack.push = function(_, s) pushedUI = s end
|
|
battle.queue, battle.nextInsert = {}, 0
|
|
battle.player.mon.hp = 0
|
|
battle:openReplacementMenu()
|
|
local onSwitch
|
|
for _, item in ipairs(battle.queue) do
|
|
if item.ui then
|
|
local screen = item.ui()
|
|
onSwitch = screen and screen.onSwitch
|
|
end
|
|
end
|
|
onSwitch = onSwitch or (pushedUI and pushedUI.onSwitch)
|
|
if onSwitch then
|
|
battle.nextInsert = 0
|
|
onSwitch(battle.game.save.party[2])
|
|
local shout = rowWith(battle, battle.player.name)
|
|
T.check(shout ~= nil, "the replacement shout is queued")
|
|
T.eq(shout.auto, true, "SendOutMon's message ends `done` here too")
|
|
else
|
|
T.check(false, "the replacement menu offers an onSwitch callback")
|
|
end
|
|
end
|
|
|
|
T.finish("trainer send-out boxes (#1472)")
|