mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-15 15:51:17 +02:00
144 lines
4.6 KiB
Lua
144 lines
4.6 KiB
Lua
-- Fury Attack / Barrage hit 2-5 times, Twineedle stays at 2. Issue #1168.
|
|
-- pokegold engine/battle/effect_commands.asm:5228 (BattleCommand_EndLoop).
|
|
-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/multihit_bug1168_test.lua love .
|
|
-- Do not add POKEPORT_SPEED: the per-strike HP steps are what you are judging.
|
|
|
|
local U = require("tests.drivers.util")
|
|
local Battle = require("src.battle.gen2.Battle")
|
|
local Effects = require("src.battle.gen2.Effects")
|
|
local Mon = require("src.battle.gen2.Mon")
|
|
|
|
return function(game)
|
|
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
|
|
|
|
local function claim(ok, text)
|
|
print((ok and "[multihit] PASS " or "[multihit] FAIL ") .. text)
|
|
end
|
|
|
|
U.wait(45)
|
|
local world = game.world
|
|
if not (world and world.map) then
|
|
print("[multihit] FAIL gold world did not boot")
|
|
while true do U.wait(60) end
|
|
end
|
|
|
|
local fury = game.data.moves and game.data.moves.FURY_ATTACK
|
|
local twine = game.data.moves and game.data.moves.TWINEEDLE
|
|
claim(fury ~= nil, "FURY_ATTACK is in the move table")
|
|
claim(fury and fury.effect == "EFFECT_MULTI_HIT",
|
|
"FURY_ATTACK is EFFECT_MULTI_HIT")
|
|
claim(twine ~= nil, "TWINEEDLE is in the move table")
|
|
claim(twine and twine.effect == "EFFECT_POISON_MULTI_HIT",
|
|
"TWINEEDLE is EFFECT_POISON_MULTI_HIT")
|
|
claim(Effects.hitCount("EFFECT_DOUBLE_HIT") == 2, "DOUBLE_HIT is 2")
|
|
claim(Effects.hitCount("EFFECT_POISON_MULTI_HIT") == 2,
|
|
"POISON_MULTI_HIT (Twineedle) is 2")
|
|
|
|
local seq, si = { 0, 1, 2, 0, 3, 3 }, 0
|
|
local function scripted()
|
|
si = si + 1
|
|
return seq[si] or 0
|
|
end
|
|
claim(Effects.hitCount("EFFECT_MULTI_HIT", scripted) == 2, "roll 0 -> 2 hits")
|
|
claim(Effects.hitCount("EFFECT_MULTI_HIT", scripted) == 3, "roll 1 -> 3 hits")
|
|
claim(Effects.hitCount("EFFECT_MULTI_HIT", scripted) == 2,
|
|
"roll 2 then 0 -> 2 hits")
|
|
claim(Effects.hitCount("EFFECT_MULTI_HIT", scripted) == 5,
|
|
"roll 3 then 3 -> 5 hits")
|
|
|
|
local function fiveHitRandom(n)
|
|
if n == 4 then return 3 end
|
|
return 0
|
|
end
|
|
|
|
local headP = Mon.new(game.data, "CYNDAQUIL", 20)
|
|
local headW = Mon.new(game.data, "SNORLAX", 20)
|
|
if headP and headW then
|
|
headP.moves = { { id = "FURY_ATTACK", pp = 20, maxPp = 20 } }
|
|
local b = Battle.new({
|
|
data = game.data, party = { headP }, wild = headW,
|
|
random = fiveHitRandom,
|
|
})
|
|
local landed, hitLine = 0, nil
|
|
for _, ev in ipairs(b:takeTurn({ kind = "move", move = "FURY_ATTACK" })) do
|
|
if ev.kind == "damage" and ev.side == "enemy" then
|
|
landed = landed + 1
|
|
end
|
|
if ev.kind == "message" and ev.text then
|
|
local n = ev.text:match("Hit (%d+) time")
|
|
if n then hitLine, landed = ev.text, tonumber(n) end
|
|
end
|
|
end
|
|
claim(landed == 5,
|
|
("scripted Fury Attack hit %d times (want 5, not 2)"):format(landed))
|
|
if hitLine then print("[multihit] " .. hitLine) end
|
|
else
|
|
claim(false, "could not build a headless Fury Attack pair")
|
|
end
|
|
|
|
local player = Mon.new(game.data, "CYNDAQUIL", 20)
|
|
if not player then
|
|
print("[multihit] FAIL could not build CYNDAQUIL")
|
|
while true do U.wait(60) end
|
|
end
|
|
player.moves = { { id = "FURY_ATTACK", pp = 20, maxPp = 20 } }
|
|
game.save.party = { player }
|
|
|
|
local wild = Mon.new(game.data, "SNORLAX", 20)
|
|
if not wild then
|
|
print("[multihit] FAIL could not build SNORLAX")
|
|
while true do U.wait(60) end
|
|
end
|
|
if not world:startBattle({ wild = wild }) then
|
|
print("[multihit] FAIL startBattle failed")
|
|
while true do U.wait(60) end
|
|
end
|
|
|
|
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
|
|
if not (screen and screen.battle) then
|
|
print("[multihit] FAIL battle screen never came up")
|
|
while true do U.wait(60) end
|
|
end
|
|
|
|
local left = 2
|
|
screen.battle.random = function(n)
|
|
if n == 4 and left > 0 then
|
|
left = left - 1
|
|
return 3
|
|
end
|
|
if left > 0 then return 0 end
|
|
if love and love.math and love.math.random then
|
|
return love.math.random(n) - 1
|
|
end
|
|
return math.random(n) - 1
|
|
end
|
|
|
|
for _ = 1, 200 do
|
|
if screen.phase == "menu" then break end
|
|
tap("a", 3)
|
|
end
|
|
if screen.phase ~= "menu" then
|
|
print("[multihit] FAIL never reached the battle menu")
|
|
while true do U.wait(60) end
|
|
end
|
|
|
|
tap("a")
|
|
U.wait(6)
|
|
tap("a")
|
|
print("[multihit] Fury Attack should strike five times on this turn.")
|
|
print("[multihit] later turns are 2-5. Twineedle would stay at 2.")
|
|
|
|
while true do U.wait(60) end
|
|
end
|