mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
195 lines
6.7 KiB
Lua
195 lines
6.7 KiB
Lua
local U = require("tests.drivers.util")
|
|
local DIR = os.getenv("POKEPORT_SHOT_DIR") or ".bazinga/BSA/09-24-26-00-unassigned/shots/game3_catch_ball_sheets_2445"
|
|
|
|
local NAMES = { [0] = "poke", "great", "safari", "ultra", "master", "net",
|
|
"dive", "nest", "repeat", "timer", "luxury", "premier" }
|
|
|
|
return function(game)
|
|
local fails = 0
|
|
local function pass(label, ok, detail)
|
|
if ok then
|
|
print("PASS " .. label)
|
|
else
|
|
fails = fails + 1
|
|
print("FAIL " .. label .. (detail and (" " .. detail) or ""))
|
|
end
|
|
end
|
|
local function quit()
|
|
print(fails == 0 and "PASS 2445 all" or ("FAIL 2445 " .. fails .. " check(s)"))
|
|
love.event.quit(fails == 0 and 0 or 1)
|
|
end
|
|
|
|
for _ = 1, 600 do
|
|
if game.phase == "boot" and game.boot then break end
|
|
U.wait(1)
|
|
end
|
|
game:_handleBootAction({ action = "new_game", name = "RED" })
|
|
U.wait(180)
|
|
|
|
local Runtime = require("src.core.game3.runtime")
|
|
local Party = require("src.core.game3.party")
|
|
local Bag = require("src.core.game3.bag")
|
|
local BattleBridge = require("src.core.game3.battle_bridge")
|
|
local Battle = require("src.core.game3.battle")
|
|
local Ui = require("src.core.game3.battle.ui")
|
|
local Anim = require("src.core.game3.battle.anim")
|
|
local BallOpen = require("src.core.game3.battle.ball_open")
|
|
local CatchSeq = require("src.core.game3.battle.catch_seq")
|
|
local Catching = require("src.core.game3.battle.catching")
|
|
local SummaryMenu = require("src.ui.game3.summary_menu")
|
|
local session = Runtime.getSession()
|
|
session.party = {}
|
|
Party.giveMon(session, 4, 50)
|
|
session.party[1].pokeball = 12
|
|
local ITEMS = { 12, 2, 3, 4, 1, 11, 7, 6, 8, 9, 10 }
|
|
for _, item in ipairs(ITEMS) do Bag.add(session.bag, item, 3) end
|
|
|
|
local draws = {}
|
|
local realDraw = love.graphics.draw
|
|
love.graphics.draw = function(img, q, ...)
|
|
if img and img == Ui._ballSheet and type(q) == "userdata" and q.getViewport then
|
|
local x, y = q:getViewport()
|
|
draws[#draws + 1] = { col = math.floor(x / 16), frame = math.floor(y / 16) }
|
|
end
|
|
return realDraw(img, q, ...)
|
|
end
|
|
local function drawnCols()
|
|
local seen, out = {}, {}
|
|
for _, d in ipairs(draws) do
|
|
if not seen[d.col] then seen[d.col] = true out[#out + 1] = d.col end
|
|
end
|
|
table.sort(out)
|
|
return table.concat(out, ",")
|
|
end
|
|
|
|
SummaryMenu.openMenu(session.party, 1, { session = session })
|
|
U.wait(30)
|
|
draws = {}
|
|
U.wait(2)
|
|
U.still(game, DIR .. "/2445_summary_premier_icon.png")
|
|
pass("2445 summary ball icon premier", drawnCols() == "11", "cols=" .. drawnCols())
|
|
SummaryMenu.close()
|
|
U.wait(10)
|
|
|
|
Catching.tryCatch = function() return false, 1 end
|
|
|
|
local ok = BattleBridge.startWild(Runtime._mod, game, { species = 16, level = 3 }, { fade = false })
|
|
if not ok then pass("2445 battle start", false) quit() return end
|
|
|
|
local shotSend = false
|
|
local held = 0
|
|
for _ = 1, 1500 do
|
|
local s = Anim.stage() and Anim.stage().ball
|
|
if Ui.dialogPending() and not (s and s.visible) then
|
|
held = held + 1
|
|
if held % 20 == 0 then U.tap(game, "a") end
|
|
end
|
|
if s and s.visible and s.side == "player" then
|
|
U.wait(8)
|
|
draws = {}
|
|
U.wait(1)
|
|
U.still(game, DIR .. "/2445_sendout_premier_midarc.png")
|
|
pass("2445 sendout premier ballId", s.ballId == 11, "ballId=" .. tostring(s.ballId))
|
|
pass("2445 sendout premier sheet", drawnCols() == "11", "cols=" .. drawnCols())
|
|
shotSend = true
|
|
break
|
|
end
|
|
U.wait(1)
|
|
end
|
|
if not shotSend then pass("2445 sendout seen", false) end
|
|
|
|
local function toCommand(maxFrames)
|
|
for _ = 1, maxFrames do
|
|
if Battle._phase == "command" and not Ui.dialogPending() then return true end
|
|
if Ui.dialogPending() then U.tap(game, "a") U.wait(3) else U.wait(1) end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local Healthbox = require("src.core.game3.battle.healthbox")
|
|
local BattleChrome = require("src.ui.game3.battle_chrome")
|
|
local function enemyBoxRect()
|
|
local hb = Anim.stage().healthbox and Anim.stage().healthbox.enemy
|
|
local w, h = BattleChrome._enemyBox:getDimensions()
|
|
return Healthbox.ENEMY_CENTER.x - 32 + ((hb and hb.ox) or 0), Healthbox.ENEMY_CENTER.y - 16, w, h
|
|
end
|
|
|
|
local function throw(item)
|
|
local prev = CatchSeq._ball
|
|
Ui._pendingCommand = { kind = "bag", user = "player", itemId = item }
|
|
Ui._mode = "none"
|
|
for _ = 1, 400 do
|
|
if CatchSeq._ball and CatchSeq._ball ~= prev then return CatchSeq._ball end
|
|
if Ui.dialogPending() then U.tap(game, "a") U.wait(2) else U.wait(1) end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
for _, item in ipairs(ITEMS) do
|
|
local want = BallOpen.ballIdForItem(item)
|
|
local name = NAMES[want]
|
|
local ready = toCommand(2000)
|
|
if not ready and Battle._phase == nil then
|
|
print("[driver] battle ended before " .. name .. "; starting another")
|
|
U.wait(60)
|
|
if BattleBridge.startWild(Runtime._mod, game, { species = 16, level = 3 }, { fade = false }) then
|
|
ready = toCommand(3000)
|
|
end
|
|
end
|
|
if not ready then
|
|
pass("2445 command before " .. name, false,
|
|
"phase=" .. tostring(Battle._phase) .. " dialog=" .. tostring(Ui.dialogPending()) .. " mode=" .. tostring(Ui._mode))
|
|
break
|
|
end
|
|
local b = throw(item)
|
|
if not b then pass("2445 throw " .. name, false) break end
|
|
draws = {}
|
|
local clear = false
|
|
local startX
|
|
for _ = 1, 120 do
|
|
U.wait(1)
|
|
local s = Anim.stage().ball
|
|
if s.visible and s.frame == 0 then
|
|
local bx = (s.x or 0) + (s.ox or 0) - 8
|
|
local by = (s.y or 0) + (s.oy or 0) - 8
|
|
startX = startX or bx
|
|
local hbx, hby, hbw, hbh = enemyBoxRect()
|
|
local apart = bx + 16 <= hbx or bx >= hbx + hbw or by + 16 <= hby or by >= hby + hbh
|
|
if apart and bx >= 0 and by >= 0 and bx - startX >= 24 then
|
|
U.still(game, DIR .. "/2445_" .. name .. "_midthrow.png")
|
|
print(string.format("[driver] %s midthrow ball (%d,%d) healthbox (%d,%d %dx%d)",
|
|
name, bx, by, hbx, hby, hbw, hbh))
|
|
clear = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
pass("2445 throw " .. name .. " clear of healthbox", clear)
|
|
local midCols = drawnCols()
|
|
local opened = false
|
|
for _ = 1, 200 do
|
|
local s = Anim.stage().ball
|
|
if s.visible and s.frame == 2 then
|
|
draws = {}
|
|
U.wait(1)
|
|
if s.visible and s.frame == 2 then
|
|
U.still(game, DIR .. "/2445_" .. name .. "_open.png")
|
|
opened = true
|
|
break
|
|
end
|
|
end
|
|
U.wait(1)
|
|
end
|
|
local openFrame2 = false
|
|
for _, d in ipairs(draws) do
|
|
if d.frame == 2 and d.col == want then openFrame2 = true end
|
|
end
|
|
pass("2445 throw " .. name .. " sheet", midCols == tostring(want), "cols=" .. midCols)
|
|
pass("2445 open " .. name .. " frame2", opened and openFrame2, "cols=" .. drawnCols())
|
|
U.wait(150)
|
|
end
|
|
|
|
love.graphics.draw = realDraw
|
|
quit()
|
|
end
|