mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-15 07:41:21 +02:00
CLOSES #1091, CLOSES #1097, CLOSES #1100, CLOSES #1104, CLOSES #1135, CLOSES #1155, CLOSES #1157, CLOSES #1158, CLOSES #1159, CLOSES #1160, CLOSES #1167, CLOSES #1208
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
-- #1091: does GAME SPEED change the wild encounter rate per STEP?
|
||||
-- POKEPORT_GAME=gold POKEPORT_TOUCH=0 \
|
||||
-- POKEPORT_DRIVER=tests/drivers/gold_bug1091_test.lua love .
|
||||
local Encounter = require("src.battle.gen2.Encounter")
|
||||
local Player = require("src.world.gen2.Player")
|
||||
local Mon = require("src.battle.gen2.Mon")
|
||||
|
||||
return function(game)
|
||||
local rolls, hits, steps = 0, 0, 0
|
||||
|
||||
local realTriggers = Encounter.triggers
|
||||
Encounter.triggers = function(rate, random)
|
||||
rolls = rolls + 1
|
||||
if realTriggers(rate, random) then hits = hits + 1 end
|
||||
return false
|
||||
end
|
||||
|
||||
local World = require("src.world.gen2.World")
|
||||
local ticks = 0
|
||||
local realWorldStep = World.step
|
||||
World.step = function(self)
|
||||
ticks = ticks + 1
|
||||
return realWorldStep(self)
|
||||
end
|
||||
|
||||
local realUpdate = Player.update
|
||||
Player.update = function(self)
|
||||
local landed = realUpdate(self)
|
||||
if landed then steps = steps + 1 end
|
||||
return landed
|
||||
end
|
||||
|
||||
local function wait(n) for _ = 1, n do coroutine.yield() end end
|
||||
local function clearDirs()
|
||||
for _, d in ipairs({ "up", "down", "left", "right" }) do
|
||||
game.input.state[d] = false
|
||||
end
|
||||
end
|
||||
|
||||
wait(30)
|
||||
local world = game.world
|
||||
game.save.party = { Mon.new(game.data, "PIDGEY", 5) }
|
||||
|
||||
local function measure(speed, yields)
|
||||
world:setMap("ROUTE_29", 44, 12, "right")
|
||||
wait(20)
|
||||
world.wildCooldown = 0
|
||||
game.speedOverride = speed
|
||||
rolls, hits, steps, ticks = 0, 0, 0, 0
|
||||
local dir = "right"
|
||||
for i = 1, yields do
|
||||
if i % 8 == 0 then dir = (dir == "right") and "left" or "right" end
|
||||
clearDirs()
|
||||
game.input.state[dir] = true
|
||||
table.insert(game.input.pressQueue, dir)
|
||||
coroutine.yield()
|
||||
end
|
||||
clearDirs()
|
||||
game.speedOverride = 1
|
||||
wait(5)
|
||||
return rolls, hits, steps, ticks
|
||||
end
|
||||
|
||||
local r1, h1, s1, t1 = measure(1, 900)
|
||||
local r2, h2, s2, t2 = measure(200, 60)
|
||||
print(("[driver] 1X frames=%d cells=%d rolls=%d hits=%d rolls/cell=%.3f")
|
||||
:format(t1, s1, r1, h1, s1 > 0 and r1 / s1 or 0))
|
||||
print(("[driver] 200X frames=%d cells=%d rolls=%d hits=%d rolls/cell=%.3f")
|
||||
:format(t2, s2, r2, h2, s2 > 0 and r2 / s2 or 0))
|
||||
|
||||
Encounter.triggers = realTriggers
|
||||
Player.update = realUpdate
|
||||
World.step = realWorldStep
|
||||
local rate1 = s1 > 0 and r1 / s1 or 0
|
||||
local rate2 = s2 > 0 and r2 / s2 or 0
|
||||
assert(s1 > 20 and s2 > 20, "not enough walked cells to judge")
|
||||
assert(math.abs(rate1 - rate2) < 0.05,
|
||||
("rolls per cell changed with GAME SPEED: %.3f vs %.3f"):format(rate1, rate2))
|
||||
print("[driver] PASS encounter rolls are one per walked cell at every speed")
|
||||
end
|
||||
Reference in New Issue
Block a user