mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 08:21:02 +02:00
112 lines
4.4 KiB
Lua
112 lines
4.4 KiB
Lua
-- Manual check that Silph Co Giovanni gets the ordinary trainer theme (#782).
|
|
-- PlayBattleMusic (audio/play_battle_music.asm) only picks
|
|
-- MUSIC_GYM_LEADER_BATTLE when wGymLeaderNo is set, and scripts/SilphCo11F.asm
|
|
-- never writes it -- only the eight gym scripts do. The port keyed the boss
|
|
-- check on the trainer class alone, so this fight (OPP_GIOVANNI#2) borrowed
|
|
-- the Viridian Gym roster's theme, victory jingle, and Pikachu happiness bump.
|
|
-- The data half is asserted in tests/parity_battle_music_bug782.lua.
|
|
-- POKEPORT_DRIVER=tests/drivers/battle_music_bug782_test.lua POKEPORT_IDENTITY=bug782 POKEPORT_TOUCH=0 POKEPORT_VERSION=red love .
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
local Pokemon = require("src.pokemon.Pokemon")
|
|
local Music = require("src.core.Music")
|
|
local BattleState = require("src.battle.BattleState")
|
|
|
|
local function check(label, ok)
|
|
U.log(ok and "PASS" or "FAIL", label)
|
|
return ok
|
|
end
|
|
|
|
local vol = game.save.options and game.save.options.musicVol
|
|
if vol == 0 then
|
|
U.log("music volume is 0 in options; raise it or nothing will be audible")
|
|
end
|
|
|
|
-- record what the engine asks the music system for; the real playback
|
|
-- still happens underneath, so the listening half is unaffected
|
|
local played = {}
|
|
local realPlayBattle = Music.playBattle
|
|
Music.playBattle = function(data, kind, trainerId)
|
|
played[#played + 1] = { call = "battle", kind = kind }
|
|
return realPlayBattle(data, kind, trainerId)
|
|
end
|
|
local realPlayVictory = Music.playVictory
|
|
Music.playVictory = function(data, kind, trainerId)
|
|
played[#played + 1] = { call = "victory", kind = kind }
|
|
return realPlayVictory(data, kind, trainerId)
|
|
end
|
|
|
|
-- a party that can win this quickly, so the victory jingle is reachable
|
|
game.save.party = {
|
|
Pokemon.new(game.data, "MEWTWO", 90),
|
|
Pokemon.new(game.data, "CHARIZARD", 80),
|
|
}
|
|
game.save.player.name = "RED"
|
|
|
|
-- Giovanni's fight is a coordinate trigger, not a talk:
|
|
-- SilphCo11FDefaultScript (pokered scripts/SilphCo11F.asm
|
|
-- .PlayerCoordsArray) fires on (6,13) or (7,12), walks him three tiles
|
|
-- down from his object_event spot at (6,9)
|
|
-- (pokered data/maps/objects/SilphCo11F.asm), shows his speech and starts
|
|
-- the battle. The (6,13) pad sits behind the 11F card key door, which this
|
|
-- teleported-in save has not opened (no CARD KEY, so tryCardKeyDoor never
|
|
-- swaps the door block), so take the pad on the open side: stand on (6,12)
|
|
-- and step east onto (7,12).
|
|
U.teleport(game, "SILPH_CO_11F", 6, 12, "right")
|
|
U.wait(10)
|
|
U.hold(game, "right", 40)
|
|
U.wait(10)
|
|
|
|
-- Giovanni's approach, then his pre-battle text box: mash A until the
|
|
-- battle state is on top of the stack
|
|
local battle
|
|
for _ = 1, 400 do
|
|
local top = game.stack:top()
|
|
if getmetatable(top) == BattleState and top.kind == "trainer" then
|
|
battle = top
|
|
break
|
|
end
|
|
U.tap(game, "a")
|
|
U.wait(3)
|
|
end
|
|
|
|
check("the coordinate trigger engaged a trainer battle", battle ~= nil)
|
|
if battle then
|
|
check("the opponent is Giovanni (OPP_GIOVANNI#2)",
|
|
battle.oppClass == "OPP_GIOVANNI" and battle.partyIndex == 2)
|
|
check("musicKind is \"trainer\", not \"gym\"",
|
|
battle.musicKind == "trainer")
|
|
check("isGymLeader is unset (no Pikachu GYMLEADER happiness bump)",
|
|
not battle.isGymLeader)
|
|
local battleCall
|
|
for _, p in ipairs(played) do
|
|
if p.call == "battle" then battleCall = p.kind end
|
|
end
|
|
check("Music.playBattle was asked for the trainer theme",
|
|
battleCall == "trainer")
|
|
end
|
|
|
|
U.log("You are in the Silph Co Giovanni fight. The theme playing now")
|
|
U.log("should be the ordinary Vs. Trainer battle music, not the gym-leader")
|
|
U.log("theme this fight used to borrow. Win it (MEWTWO 90 vs his level")
|
|
U.log("~40 party) and the jingle at \"defeated GIOVANNI\" should be the")
|
|
U.log("plain trainer victory fanfare, again not the gym-leader one.")
|
|
U.log("For the correct-by-contrast case, the Viridian Gym rematch")
|
|
U.log("(OPP_GIOVANNI#3) still keeps the gym-leader theme.")
|
|
|
|
-- report the victory request when the win lands, then keep idling
|
|
local reported = false
|
|
while true do
|
|
if not reported then
|
|
for _, p in ipairs(played) do
|
|
if p.call == "victory" then
|
|
check("Music.playVictory was asked for the trainer jingle",
|
|
p.kind == "trainer")
|
|
reported = true
|
|
end
|
|
end
|
|
end
|
|
coroutine.yield()
|
|
end
|
|
end
|