mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
120 lines
4.6 KiB
Lua
120 lines
4.6 KiB
Lua
-- POKEPORT_IDENTITY=crystal-sep01b POKEPORT_VERSION=crystal \
|
|
-- POKEPORT_DRIVER=tests/drivers/crystal_sendout_pic.lua \
|
|
-- POKEPORT_SHOT_DIR=/tmp/crystal-sendout-pic love .
|
|
-- ../pokecrystal/engine/battle/core.asm:82-93, :4027-4056
|
|
-- ../pokecrystal/engine/battle_anims/bg_effects.asm:647-671
|
|
local U = require("tests.drivers.util")
|
|
|
|
local Mon = require("src.battle.gen2.Mon")
|
|
|
|
return function(game)
|
|
local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/crystal-sendout-pic"
|
|
local fails = 0
|
|
local function ok(cond, line)
|
|
if not cond then fails = fails + 1 end
|
|
print("[sendout-pic] " .. (cond and "PASS " or "FAIL ") .. line)
|
|
end
|
|
|
|
U.wait(45)
|
|
local world = game.world
|
|
assert(world and world.map, "the crystal world did not boot")
|
|
|
|
local lead = Mon.new(game.data, "CYNDAQUIL", 12)
|
|
assert(lead and #lead.moves > 0, "could not build a CYNDAQUIL")
|
|
game.save.party = { lead }
|
|
game.save.inventory = { POKE_BALL = 5 }
|
|
|
|
local wild = Mon.new(game.data, "PIDGEY", 6)
|
|
assert(world:startBattle({ wild = wild }), "startBattle failed")
|
|
local screen
|
|
for _ = 1, 600 do
|
|
local top = game.stack:top()
|
|
if top and top.battle then screen = top break end
|
|
U.wait(1)
|
|
end
|
|
assert(screen and screen.battle, "battle screen never came up")
|
|
|
|
for _ = 1, 600 do
|
|
if screen.message == "Wild PIDGEY appeared!" and screen.typer
|
|
and screen.typer:done() then
|
|
break
|
|
end
|
|
U.wait(1)
|
|
end
|
|
ok(screen.message == "Wild PIDGEY appeared!", "the appeared line is up")
|
|
U.shot(game, out .. "/000-appeared.png")
|
|
|
|
U.tap(game, "a")
|
|
|
|
local function state()
|
|
local anim = screen.anim
|
|
local size = anim and anim.bg and anim.bg.picSize.player
|
|
return {
|
|
slide = screen.backpicSlide,
|
|
trainer = screen.showPlayerTrainer,
|
|
cleared = screen:picBoxCleared("player"),
|
|
message = screen.message,
|
|
typed = screen.typer and screen.typer:done(),
|
|
animFrames = anim and anim.frames or nil,
|
|
size = size,
|
|
pending = screen.afterSendOut ~= nil,
|
|
hud = screen.showPlayerHud,
|
|
phase = screen.phase,
|
|
}
|
|
end
|
|
|
|
local log = {}
|
|
local slideStart, slideEnd, goFirst, revealAt, hudAt, menuAt
|
|
local clearedDuringGo, trainerDuringSlide = true, true
|
|
local hudBeforeReveal, revealSize, revealTyped = false, nil, nil
|
|
for frame = 1, 360 do
|
|
local s = state()
|
|
log[#log + 1] = ("%03d t=%d slide=%s trainer=%s cleared=%s msg=%s typed=%s "
|
|
.. "anim=%s size=%s pending=%s hud=%s phase=%s"):format(frame, U.frame(),
|
|
tostring(s.slide), tostring(s.trainer), tostring(s.cleared),
|
|
tostring(s.message), tostring(s.typed), tostring(s.animFrames),
|
|
tostring(s.size), tostring(s.pending), tostring(s.hud), s.phase)
|
|
if s.slide then
|
|
slideStart = slideStart or U.frame() - s.slide
|
|
trainerDuringSlide = trainerDuringSlide and s.trainer
|
|
elseif slideStart and not slideEnd then
|
|
slideEnd = U.frame()
|
|
end
|
|
if s.message == "Go! CYNDAQUIL!" and not goFirst then goFirst = frame end
|
|
if goFirst and not revealAt then
|
|
if not s.cleared then
|
|
revealAt = frame
|
|
revealSize = s.size
|
|
revealTyped = s.typed
|
|
if not s.typed then clearedDuringGo = false end
|
|
end
|
|
end
|
|
if s.hud and not hudAt then hudAt = frame end
|
|
if s.hud and not revealAt then hudBeforeReveal = true end
|
|
if s.phase == "menu" and not menuAt then menuAt = frame break end
|
|
U.shot(game, out .. ("/%03d.png"):format(frame))
|
|
end
|
|
local f = io.open(out .. "/frames.log", "w")
|
|
if f then f:write(table.concat(log, "\n"), "\n") f:close() end
|
|
|
|
local slideFrames = (slideStart and slideEnd) and (slideEnd - slideStart) or -1
|
|
ok(slideFrames >= 18 and slideFrames <= 20,
|
|
"the back pic slides out over 18 frames: " .. slideFrames)
|
|
ok(trainerDuringSlide, "and it is the trainer sliding, not the mon")
|
|
ok(goFirst ~= nil, "Go! CYNDAQUIL! comes up at shot " .. tostring(goFirst))
|
|
ok(goFirst ~= nil and slideEnd ~= nil, "after the slide")
|
|
ok(clearedDuringGo, "the box stays empty while the line types")
|
|
ok(revealAt ~= nil, "the mon appears at frame " .. tostring(revealAt))
|
|
ok(revealTyped, "after the line finished typing")
|
|
ok(revealSize == 2, "as EnterMon's 2x2 square: size " .. tostring(revealSize))
|
|
ok(not hudBeforeReveal, "the HUD is not up before the mon")
|
|
ok(hudAt ~= nil and revealAt ~= nil and hudAt > revealAt,
|
|
"the HUD comes up at frame " .. tostring(hudAt) .. ", after the anim")
|
|
ok(menuAt ~= nil, "the menu follows with no A press at frame "
|
|
.. tostring(menuAt))
|
|
|
|
print("[sendout-pic] " .. (fails == 0 and "PASS all claims" or
|
|
(fails .. " claims failed")) .. " -- shots in " .. out)
|
|
love.event.quit(fails == 0 and 0 or 1)
|
|
end
|