53 lines
1.8 KiB
Lua
53 lines
1.8 KiB
Lua
-- TotemBar - core/pulseparse.lua
|
|
-- PURE parser: periodic combat-log line -> totem name (or nil). Used by
|
|
-- ui.lua's CHAT_MSG_SPELL_PERIODIC_* handler to re-anchor pulse phase on
|
|
-- REAL observed ticks. Lua 5.0: string.find with captures only (no
|
|
-- string.match / no method-call syntax). Offline-tested via
|
|
-- tools/luatests/test_pulseparse.lua; exact accepted wordings get refined
|
|
-- from /tb pulsecal telemetry.
|
|
|
|
TotemBar = TotemBar or {}
|
|
|
|
-- Strips a trailing roman-numeral rank suffix (" IV", " VII", ...) - the
|
|
-- totem-as-caster shape names the ranked unit ("Healing Stream Totem VII").
|
|
local function stripRank(src)
|
|
local _, _, base = string.find(src, "^(.-)%s+[IVXLC]+$")
|
|
if base and base ~= "" then
|
|
return base
|
|
end
|
|
return src
|
|
end
|
|
|
|
-- Maps a raw source name to a totem name: alias table first (buff names
|
|
-- like "Mana Spring"), then any source ending in " Totem".
|
|
local function resolveSource(src)
|
|
local alias = TotemBar.PULSE_SOURCE_ALIASES and TotemBar.PULSE_SOURCE_ALIASES[src]
|
|
if alias then
|
|
return alias
|
|
end
|
|
-- Every totem's name ends in " Totem" (rank suffixes already stripped),
|
|
-- so anchor at the end - a plain substring test would false-positive on
|
|
-- player names like "Totemguy".
|
|
if string.find(src, "%sTotem$") then
|
|
return src
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function TotemBar.parseSelfGain(msg)
|
|
if not msg then
|
|
return nil
|
|
end
|
|
local _, _, src = string.find(msg, "^You gain %d+ [Mm]ana from (.+)%.$")
|
|
if not src then
|
|
_, _, src = string.find(msg, "^You gain %d+ [Hh]ealth from (.+)%.$")
|
|
end
|
|
if not src then
|
|
_, _, src = string.find(msg, "^(.-) heals you for %d+%.$")
|
|
end
|
|
if not src then
|
|
return nil
|
|
end
|
|
return resolveSource(stripRank(src))
|
|
end
|