Files
bryanthaboi 96d23ab93b battle stuff
2026-09-18 13:11:33 -04:00

157 lines
5.1 KiB
Lua

local U = require("tests.drivers.util")
local DIR = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/game3_anim_g1"
local MOVES = {
{ 30, "HORN_ATTACK", { 8, 20, 30 } },
{ 29, "HEADBUTT", { 8, 16 } },
{ 47, "SING", { 30, 80 } },
{ 80, "PETAL_DANCE", { 20, 60 } },
{ 75, "RAZOR_LEAF", { 15, 45 } },
{ 345, "MAGICAL_LEAF", { 20, 40 } },
{ 73, "LEECH_SEED", { 20, 50 } },
{ 147, "SPORE", { 20, 60 } },
{ 63, "HYPER_BEAM", { 20, 40 } },
{ 182, "PROTECT", { 10, 30 } },
{ 199, "LOCK_ON", { 30, 60, 90 } },
{ 208, "MILK_DRINK", { 20, 60 } },
{ 236, "MOONLIGHT", { 30, 90 } },
{ 15, "CUT", { 6, 12 } },
{ 163, "SLASH", { 6 } },
{ 206, "FALSE_SWIPE", { 8, 20 } },
{ 102, "MIMIC", { 20, 40 } },
{ 275, "INGRAIN", { 20, 50 } },
{ 338, "FRENZY_PLANT", { 20, 40 } },
{ 271, "TRICK", { 20, 60 } },
{ 217, "PRESENT", { 20, 50 } },
{ 162, "SUPER_FANG", { 8 } },
{ 118, "METRONOME", { 20, 50 } },
{ 266, "FOLLOW_ME", { 20, 50 } },
{ 269, "TAUNT", { 20, 50 } },
{ 187, "BELLY_DRUM", { 20, 40 } },
{ 160, "CONVERSION", { 20, 60 } },
{ 176, "CONVERSION_2", { 20, 50 } },
{ 348, "LEAF_BLADE", { 10, 30 } },
{ 173, "SNORE", { 20 } },
{ 311, "WEATHER_BALL", { 10, 40 } },
{ 132, "CONSTRICT", { 10, 30 } },
{ 239, "TWISTER", { 20, 50 } },
{ 64, "PECK", { 6 } },
{ 159, "SHARPEN", { 20 } },
{ 203, "ENDURE", { 20 } },
{ 76, "SOLAR_BEAM", { 20, 40 }, 1 },
{ 244, "PSYCH_UP", { 20 } },
{ 109, "CONFUSE_RAY", { 20, 50 } },
{ 298, "TEETER_DANCE", { 20 } },
{ 185, "FAINT_ATTACK", { 30 } },
{ 315, "OVERHEAT", { 30, 60 } },
{ 41, "TWINEEDLE", { 10 } },
{ 238, "CROSS_CHOP", { 20 } },
{ 129, "SWIFT", { 10, 20 } },
{ 168, "THIEF", { 20, 40 } },
{ 282, "KNOCK_OFF", { 20, 40 } },
{ 97, "AGILITY", { 10, 30 } },
{ 104, "DOUBLE_TEAM", { 30, 60 } },
{ 148, "FLASH", { 10, 30 } },
{ 130, "SKULL_BASH", { 10, 30 }, 0 },
{ 183, "MACH_PUNCH", { 6, 12 } },
}
return function(game)
local fails = 0
local function result(ok, label)
print((ok and "PASS " or "FAIL ") .. label)
if not ok then fails = fails + 1 end
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 BattleBridge = require("src.core.game3.battle_bridge")
local Battle = require("src.core.game3.battle")
local Anim = require("src.core.game3.battle.anim")
local Ui = require("src.core.game3.battle.ui")
local session = Runtime.getSession()
session.party = {}
Party.giveMon(session, 6, 36)
local ok, err = BattleBridge.startWild(Runtime._mod, game, { species = 9, level = 36 }, { fade = false })
result(ok == true, "g1 wild battle started " .. tostring(err or ""))
if not ok then love.event.quit(1) return end
local ready = false
for _ = 1, 3000 do
if Ui._mode == "menu" and not Anim.busy() then ready = true break end
if Ui.dialogPending and Ui.dialogPending() then U.tap(game, "a") else U.wait(1) end
end
result(ready, "g1 battle reached the action menu")
if not ready then love.event.quit(1) return end
U.wait(20)
local st = Battle._st
local pSpecies = st and st.player and (st.player.species or (st.player.mon and st.player.mon.species)) or 6
local eSpecies = st and st.enemy and (st.enemy.species or (st.enemy.mon and st.enemy.mon.species)) or 9
local only = os.getenv("G1_MOVES")
local sides = os.getenv("G1_SIDES") or "player,enemy"
local function runEntry(name, shots, side, launch)
launch()
local f, si = 0, 1
while f < 1200 do
if shots[si] and f >= shots[si] then
U.shot(game, string.format("%s/%s_%s_%03d.png", DIR, name:lower(), side, shots[si]))
f = f + 2
si = si + 1
else
U.wait(1)
f = f + 1
end
if not Anim.busy() and not shots[si] then break end
end
local vm = Anim.vm()
result(vm and vm:idle(), string.format("%s (%s) finished in %d frames", name, side, f))
for _, s in ipairs({ "player", "enemy" }) do
local p = Anim.present(s)
if p then
p.visible = true
p.ox, p.oy, p.sx, p.sy, p.rotation = 0, 0, 1, 1, 0
p.blendCoeff = 0
end
end
for _ = 1, 20 do U.wait(1) end
end
local function opts(side, turn)
return {
attackerSide = side,
targetSide = side == "player" and "enemy" or "player",
isReversed = side == "enemy",
attackerSpecies = side == "player" and pSpecies or eSpecies,
targetSpecies = side == "player" and eSpecies or pSpecies,
moveTurn = turn or 0,
turn = turn or 0,
}
end
for _, entry in ipairs(MOVES) do
if not only or only:find(entry[2], 1, true) then
for side in sides:gmatch("[^,]+") do
runEntry(entry[2], entry[3], side, function() Anim.launchMove(entry[1], opts(side, entry[4])) end)
end
end
end
if not only or only:find("CONFUSION", 1, true) then
for side in sides:gmatch("[^,]+") do
runEntry("STATUS_CONFUSION", { 20, 50 }, side, function() Anim.launchStatus(1, opts(side)) end)
end
end
love.event.quit(fails == 0 and 0 or 1)
end