Merge pull request #538 from sirj0k3r/hook/low-health

This commit is contained in:
bryanthaboi
2026-08-01 00:21:10 -04:00
committed by GitHub
2 changed files with 53 additions and 3 deletions
+17 -3
View File
@@ -2677,10 +2677,24 @@ function BattleState:updateFx()
-- so a sounding siren rides out the next hit's HP drain instead of -- so a sounding siren rides out the next hit's HP drain instead of
-- dropping out mid-announcement (#293) -- dropping out mid-announcement (#293)
self.lowHealthAlarmOn = self:lowHealthAlarmActive() self.lowHealthAlarmOn = self:lowHealthAlarmActive()
if self.lowHealthAlarmOn then -- battle.low_health_alarm: on/off toggle for the siren loop, ctx.on
Sound.startLoop(self.data, "Low_Health_Alarm") -- mirrors self.lowHealthAlarmOn. Vanilla just starts/stops the loop
-- each frame; a mod can wrap this to reshape the toggle (e.g. force
-- ctx.on false after some budget) before letting vanilla act on it.
if Runtime.wantsHook("battle.low_health_alarm") then
Runtime.call("battle.low_health_alarm", function(ctx)
if ctx.on then
Sound.startLoop(ctx.battle.data, "Low_Health_Alarm")
else
Sound.stopLoop("Low_Health_Alarm")
end
end, { on = self.lowHealthAlarmOn, battle = self })
else else
Sound.stopLoop("Low_Health_Alarm") if self.lowHealthAlarmOn then
Sound.startLoop(self.data, "Low_Health_Alarm")
else
Sound.stopLoop("Low_Health_Alarm")
end
end end
end end
+36
View File
@@ -718,6 +718,42 @@ do
unsub() unsub()
end end
-- ------- battle.low_health_alarm hook: mirrors the siren toggle
do
local Sound = require("src.core.Sound")
local calls = {}
local origStart, origStop = Sound.startLoop, Sound.stopLoop
Sound.startLoop = function(data, name) calls[#calls + 1] = { "start", name } end
Sound.stopLoop = function(name) calls[#calls + 1] = { "stop", name } end
local game = makeGame({ Pokemon.new(Data, "BULBASAUR", 20) })
local battle = BattleState.newWild(game, "RATTATA", 5)
battle.player.mon.hp = 1
battle.player.shownHP = 1
local seenOn = nil
local unsub = hooks:wrap("battle.low_health_alarm", function(nextFn, ctx)
seenOn = ctx.on
return nextFn(ctx)
end)
battle:updateFx()
check(seenOn == true, "battle.low_health_alarm hook sees the alarm toggle on")
check(calls[#calls][1] == "start" and calls[#calls][2] == "Low_Health_Alarm",
"an unmodified hook still starts the siren loop")
unsub()
unsub = hooks:wrap("battle.low_health_alarm", function(nextFn, ctx)
ctx.on = false
return nextFn(ctx)
end)
battle:updateFx()
check(calls[#calls][1] == "stop", "a mod can force the alarm off before vanilla acts")
unsub()
Sound.startLoop, Sound.stopLoop = origStart, origStop
end
-- ------- battle events: the scripted sequence -- ------- battle events: the scripted sequence
do do