Files
bryanthaboi ae6cac89e1 G2 support
2026-08-11 11:53:30 -04:00

110 lines
4.4 KiB
Lua

-- Smoke: a real Gold wild battle, driven end to end from the overworld.
--
-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_battle_smoke.lua love .
--
-- Starts a battle against a live extracted species with a live extracted
-- moveset, presses FIGHT until something faints, and shoots the screen along
-- the way. This is the check that the extracted moves/pokemon/type_chart
-- actually agree with the engine -- a fixture test cannot say that.
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/gold-battle"
local function tap(button, frames)
game.input.pressQueue[#game.input.pressQueue + 1] = button
game.input.state[button] = true
U.wait(2)
game.input.state[button] = false
U.wait(frames or 6)
end
U.wait(45)
local world = game.world
assert(world and world.map, "gold world did not boot")
-- `givepoke` is how the STARTER arrives, and it used to hand back a mon with
-- an empty move list (it went through Gen 1's Pokemon.new, whose
-- level1Moves/learnset fields the Gen 2 extractor does not write). That is
-- what left FIGHT with nothing in it. Drive the VM hook directly so the
-- check does not depend on walking the whole Elm's Lab script.
local cyndaquilIndex = game.data.pokemon.CYNDAQUIL.index
game.save.party = {}
world.vm.givePokeFn(cyndaquilIndex, 5, 0)
local gift = game.save.party[1]
assert(gift, "givepoke put nothing in the party")
assert(#gift.moves > 0,
"givepoke handed over a mon with no moves -- FIGHT would be empty")
print(("[driver] givepoke gave %s L%d with %d moves (%s)"):format(
gift.species, gift.level, #gift.moves, gift.moves[1].id))
assert(game.save.pokedex and game.save.pokedex.caught[gift.species],
"givepoke did not tick the starter off in the #DEX")
-- Give the player a real Cyndaquil built from the extracted tables, so the
-- moveset and stats come from the cart rather than the driver.
local player = Mon.new(game.data, "CYNDAQUIL", 12)
assert(player, "could not build a CYNDAQUIL from pokemon.lua")
assert(#player.moves > 0,
"CYNDAQUIL learned no moves -- levelMoves or moves.lua is missing")
print(("[driver] player %s L%d hp %d/%d, %d moves (%s)"):format(
player.species, player.level, player.hp, player.maxHp, #player.moves,
player.moves[1].id))
game.save.party = { player }
game.save.inventory = { POKE_BALL = 5, POTION = 3 }
local wild = Mon.new(game.data, "PIDGEY", 4)
assert(wild and #wild.moves > 0, "could not build a wild PIDGEY")
local Music = require("src.core.Music")
assert(world:startBattle({ wild = wild }), "startBattle failed")
-- PlayBattleMusic runs before the transition, so the theme is already going
-- while the wipe is spinning.
print("[driver] battle music " .. tostring(Music.current()))
assert(Music.current() == "Music_JohtoWildBattle"
or Music.current() == "Music_JohtoWildBattleNight",
"the wild battle did not start the Johto wild theme: "
.. tostring(Music.current()))
-- DoBattleTransition owns the screen first; shoot it, then wait it out.
U.wait(4)
U.shot(game, out .. "/00-transition.png")
local battle
for _ = 1, 600 do
local top = game.stack:top()
if top and top.battle then battle = top break end
U.wait(1)
end
assert(battle and battle.battle,
"battle screen never came up after the transition")
U.wait(20)
U.shot(game, out .. "/01-battle-open.png")
-- Page through the intro messages, then attack until the battle resolves.
for _ = 1, 120 do
if battle.battle.over then break end
if battle.phase == "menu" then
U.shot(game, out .. "/02-battle-menu.png")
tap("a") -- FIGHT
U.wait(4)
U.shot(game, out .. "/03-move-list.png")
tap("a") -- first move
else
tap("a", 3)
end
end
assert(battle.battle.over,
"battle did not resolve in 120 presses (phase " .. tostring(battle.phase) .. ")")
print("[driver] outcome " .. tostring(battle.battle.outcome))
assert(battle.battle.outcome == "win",
"expected the L12 starter to win, got " .. tostring(battle.battle.outcome))
print(("[driver] player ended at %d/%d hp, exp %d")
:format(player.hp, player.maxHp, player.experience))
assert(player.experience > 0, "no experience was awarded")
U.shot(game, out .. "/04-battle-end.png")
print("[driver] PASS gold wild battle in " .. out)
end