Skip to content

RPG Boss Timers & Loot Economy

In RPG and dungeon games, measuring how long boss fights last and verifying that drop rates conform to balance specifications is essential.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Analytics = require(ReplicatedStorage.AnalyticsModule)
local BOSS_BADGE_ID = 456789123
local function setupBossEncounter(bossModel: Model, partyPlayers: { Player })
local bossHumanoid = bossModel:WaitForChild("Humanoid") :: Humanoid
local bossName = bossModel.Name
-- 1. Start duration timers for all party members
local partyTimers: { [number]: () -> number } = {}
for _, player in ipairs(partyPlayers) do
partyTimers[player.UserId] = Analytics:StartTimer(player, "BossFight_" .. bossName)
end
-- 2. Track encounter start
Analytics:TrackEvent(nil, "BossFightStarted", {
boss = bossName,
partySize = #partyPlayers,
})
-- 3. Handle Victory
bossHumanoid.Died:Connect(function()
for _, player in ipairs(partyPlayers) do
local stopTimer = partyTimers[player.UserId]
local fightDuration = if stopTimer then stopTimer() else 0
print(string.format("%s defeated %s in %.1f seconds", player.Name, bossName, fightDuration))
-- Record virtual currency loot
Analytics:RecordEconomySource(player, "Gold", 350, "BossDrop", bossName)
-- Safely award completion badge with telemetry
Analytics:AwardBadge(player, BOSS_BADGE_ID)
end
end)
end