You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

457 lines
18 KiB

--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Lords of Dread", 2481, 2457)
if not mod then return end
mod:RegisterEnableMob(181398, 181399) -- Mal'Ganis, Kin'tessa
mod:SetEncounterID(2543)
mod:SetRespawnTime(30)
--------------------------------------------------------------------------------
-- Locals
--
local untoDarknessCount = 1
local cloudOfCarrionCount = 1
local manifestShadowsCount = 1
local infiltrationOfDreadCount = 1
local fearfulTrepidationCount = 1
local slumberCloudCount = 1
local tankList = {}
local fearTimers = {27.2, 53.5, 29.0, 12.0, 29.2, 49.9, 29.1, 22.1, 58.5, 29.2, 12.8, 29.1, 49.8, 29.2, 23.7} -- 4, 8, 11, 15 are timers from Among Us _End
local fearCasts = 0
local empCarrion = false
local bitesOnMe = false
local bitesSayTimer = nil
local nextAmongUs = 0
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.unto_darkness = "AoE Phase"-- Unto Darkness
L.cloud_of_carrion = "Carrion" -- Cloud of Carrion
L.empowered_cloud_of_carrion = "Big Carrion" -- Empowered Cloud of Carrion
L.leeching_claws = "Frontal (M)" -- Leeching Claws
L.infiltration_of_dread = "Among Us" -- Infiltration of Dread
L.infiltration_removed = "Imposters found in %.1fs" -- "Imposters found in 1.1s" s = seconds
L.fearful_trepidation = "Fears" -- Fearful Trepidation
L.slumber_cloud = "Clouds" -- Slumber Cloud
L.anguishing_strike = "Frontal (K)" -- Anguishing Strike
L.custom_on_repeating_biting_wound = "Repeating Biting Wound"
L.custom_on_repeating_biting_wound_desc = "Repeating Biting Wound say messages with icons {rt7} to make it more visible."
end
--------------------------------------------------------------------------------
-- Initialization
--
local fearfulTrepidationMarker = mod:AddMarkerOption(false, "player", 8, 360146, 1, 2) -- Fearful Trepidation
function mod:GetOptions()
return {
360374, -- Rampaging Swarm
"berserk",
-- Mal'Ganis
360319, -- Unto Darkness
360012, -- Cloud of Carrion
"custom_on_repeating_biting_wound",
361913, -- Manifest Shadows
--361923, -- Ravenous Hunger
361934, -- Incomplete Form
{359960, "TANK"}, -- Leeching Claws
359963, -- Opened Veins
-- Kin'tessa
360717, -- Infiltration of Dread
{360146, "SAY", "SAY_COUNTDOWN"}, -- Fearful Trepidation
fearfulTrepidationMarker,
360229, -- Slumber Cloud
{360284, "TANK"}, -- Anguishing Strike
},{
[360374] = "general",
[360319] = -23927, -- Mal'Ganis
[360417] = -23929, -- Kin'tessa
},{
[360319] = L.unto_darkness, -- Unto Darkness
[366574] = L.cloud_of_carrion, -- Cloud of Carrion
[361913] = CL.adds, -- Manifest Shadows
[359960] = L.leeching_claws, -- Leeching Claws
[360417] = L.infiltration_of_dread, -- Infiltration of Dread
[360146] = L.fearful_trepidation, -- Fearful Trepidation
[360229] = L.slumber_cloud, -- Slumber Cloud
[360284] = L.anguishing_strike, -- Anguishing Strike
}
end
function mod:OnBossEnable()
-- Mal'Ganis
self:Log("SPELL_CAST_START", "SwarmOfDecay", 360300)
self:Log("SPELL_CAST_START", "CloudOfCarrion", 360006)
self:Log("SPELL_AURA_APPLIED", "CloudOfCarrionApplied", 360012)
self:Log("SPELL_AURA_REMOVED", "CloudOfCarrionRemoved", 360012)
self:Log("SPELL_AURA_APPLIED", "BitingWoundsApplied", 364985)
self:Log("SPELL_AURA_REMOVED", "BitingWoundsRemoved", 364985)
self:Log("SPELL_CAST_START", "ManifestShadows", 361913)
--self:Log("SPELL_CAST_START", "RavenousHunger", 361923)
self:Log("SPELL_AURA_REMOVED", "IncompleteFormRemoved", 361934)
self:Log("SPELL_CAST_START", "LeechingClaws", 359960)
self:Log("SPELL_AURA_APPLIED", "OpenedVeinsApplied", 359963)
self:Log("SPELL_CAST_SUCCESS", "RampagingSwarm", 360374)
-- Kin'tessa
self:Log("SPELL_CAST_SUCCESS", "InfiltrationOfDread", 360717)
self:Log("SPELL_AURA_REMOVED", "InfiltrationOfDreadOver", 360418) -- Paranoia
self:Log("SPELL_CAST_SUCCESS", "FearfulTrepidation", 360145)
self:Log("SPELL_AURA_APPLIED", "FearfulTrepidationApplied", 360146)
self:Log("SPELL_AURA_REMOVED", "FearfulTrepidationRemoved", 360146)
self:Log("SPELL_CAST_START", "SlumberCloud", 360229)
self:Log("SPELL_CAST_START", "AnguishingStrike", 360284)
self:Log("SPELL_AURA_APPLIED", "AnguishingStrikeApplied", 360287)
self:Log("SPELL_AURA_APPLIED_DOSE", "AnguishingStrikeApplied", 360287)
self:RegisterEvent("GROUP_ROSTER_UPDATE")
self:GROUP_ROSTER_UPDATE()
end
function mod:OnEngage()
untoDarknessCount = 1
cloudOfCarrionCount = 1
manifestShadowsCount = 1
infiltrationOfDreadCount = 1
fearfulTrepidationCount = 1
slumberCloudCount = 1
fearCasts = 0
empCarrion = false
bitesOnMe = false
self:Bar(360012, self:Mythic() and 7 or 6, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount)) -- Cloud of Carrion
self:Bar(361913, 13, CL.count:format(CL.adds, manifestShadowsCount)) -- Manifest Shadows
self:Bar(359960, 15.5, L.leeching_claws) -- Leeching Claws
self:Bar(360319, 51, CL.count:format(L.unto_darkness, untoDarknessCount)) -- Unto Darkness
self:Bar(360284, 8.5, L.anguishing_strike) -- Anguishing Strike
self:Bar(360229, 13, CL.count:format(L.slumber_cloud, slumberCloudCount)) -- Slumber Cloud
self:Bar(360146, 25.1, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount)) -- Fearful Trepidation
self:Bar(360717, 124, CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount)) -- Infiltration of Dread
nextAmongUs = GetTime() + 124
if self:Mythic() then
self:Berserk(540)
else
self:Berserk(600)
end
end
--------------------------------------------------------------------------------
-- Event Handlers
--
function mod:GROUP_ROSTER_UPDATE() -- Compensate for quitters (LFR)
tankList = {}
for unit in self:IterateGroup() do
if self:Tank(unit) then
tankList[#tankList+1] = unit
end
end
end
function mod:RampagingSwarm(args)
self:Message(args.spellId, "red")
self:PlaySound(args.spellId, "long")
end
-- Mal'Ganis
function mod:SwarmOfDecay()
self:StopBar(CL.count:format(L.unto_darkness, untoDarknessCount))
self:Message(360319, "yellow", CL.count:format(L.unto_darkness, untoDarknessCount))
self:PlaySound(360319, "alert")
untoDarknessCount = untoDarknessCount + 1
if self:Mythic() then
empCarrion = true
self:Bar(360012, 30.5, CL.count:format(L.empowered_cloud_of_carrion, cloudOfCarrionCount))
self:Bar(361913, 33.6, CL.count:format(CL.adds, manifestShadowsCount))
self:StopBar(CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
local cd = fearCasts == 2 and 40 or 28
self:Bar(360146, cd, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
end
end
do
local playerList = {}
local prev = 0
function mod:CloudOfCarrion(args)
local text = empCarrion and L.empowered_cloud_of_carrion or L.cloud_of_carrion
self:StopBar(CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount))
self:StopBar(CL.count:format(L.empowered_cloud_of_carrion, cloudOfCarrionCount))
self:Message(360012, "orange", CL.casting:format(CL.count:format(text, cloudOfCarrionCount)))
self:PlaySound(360012, "alert")
playerList = {}
prev = args.time
cloudOfCarrionCount = cloudOfCarrionCount + 1
if self:Mythic() then
if cloudOfCarrionCount % 2 == 0 then
self:Bar(360012, 21.9, CL.count:format(text, cloudOfCarrionCount))
end
else
if cloudOfCarrionCount % 4 ~= 1 then -- Skip 5, 9, 13...
self:Bar(360012, cloudOfCarrionCount % 2 == 1 and 51.5 or 21.8, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount))
end
end
end
function mod:CloudOfCarrionApplied(args)
if args.time-prev < 3 then
playerList[#playerList+1] = args.destName
if self:Me(args.destGUID) then
self:PlaySound(args.spellId, "warning")
end
self:NewTargetsMessage(args.spellId, "cyan", playerList, nil, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount-1))
else -- Personal warnings only
if self:Me(args.destGUID) then
self:PersonalMessage(args.spellId)
self:PlaySound(args.spellId, "warning")
end
end
end
function mod:CloudOfCarrionRemoved(args)
if self:Me(args.destGUID) then
self:Message(args.spellId, "green", CL.removed:format(args.spellName))
self:PlaySound(args.spellId, "info")
end
end
end
function mod:BitingWoundsApplied(args)
if self:Me(args.destGUID) then
if self:GetOption("custom_on_repeating_biting_wound") then
self:Say(false, "{rt7}", true)
bitesSayTimer = self:ScheduleRepeatingTimer("Say", 1.5, false, "{rt7}", true)
end
bitesOnMe = true
end
end
function mod:BitingWoundsRemoved(args)
if self:Me(args.destGUID) then
if bitesSayTimer then
self:CancelTimer(bitesSayTimer)
bitesSayTimer = nil
end
bitesOnMe = false
end
end
function mod:ManifestShadows(args)
self:StopBar(CL.count:format(CL.adds, manifestShadowsCount))
self:Message(args.spellId, "yellow", CL.count:format(CL.adds, manifestShadowsCount))
self:PlaySound(args.spellId, "alert")
manifestShadowsCount = manifestShadowsCount + 1
if not self:Mythic() and manifestShadowsCount % 2 == 0 then -- Only start a bar for all even casts
self:Bar(args.spellId, 72.5, CL.count:format(CL.adds, manifestShadowsCount))
end
end
-- function mod:RavenousHunger(args)
-- local canDo, ready = self:Interrupter(args.sourceGUID)
-- if canDo then
-- self:Message(args.spellId, "yellow")
-- if ready then
-- self:PlaySound(args.spellId, "alert")
-- end
-- end
-- end
function mod:IncompleteFormRemoved(args)
self:Message(args.spellId, "cyan", CL.removed:format(args.spellName))
self:PlaySound(args.spellId, "info")
end
function mod:LeechingClaws(args)
local bossUnit = self:GetBossId(args.sourceGUID)
for i = 1, #tankList do
local unit = tankList[i]
if bossUnit and self:Tanking(bossUnit, unit) then
self:TargetMessage(args.spellId, "yellow", self:UnitName(unit), CL.casting:format(L.leeching_claws))
break
elseif i == #tankList then
self:Message(args.spellId, "yellow", CL.casting:format(L.leeching_claws))
end
end
self:PlaySound(args.spellId, "alarm")
-- XXX Fix timers around specials
self:CDBar(args.spellId, 17, L.leeching_claws)
end
function mod:OpenedVeinsApplied(args)
if self:Tank() and self:Tank(args.destName) then
self:TargetMessage(args.spellId, "purple", args.destName)
self:PlaySound(args.spellId, "warning") -- You should swap, prolly.
elseif self:Me(args.destGUID) then -- Not a tank
self:PersonalMessage(args.spellId)
self:PlaySound(args.spellId, "warning")
end
end
-- Kin'tessa
do
local amongUsStart = 0
function mod:InfiltrationOfDread(args)
if self:MobId(args.sourceGUID) == 181399 then -- Kin'tessa
self:StopBar(CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount))
self:Message(args.spellId, "yellow", CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount))
self:PlaySound(args.spellId, "alert")
infiltrationOfDreadCount = infiltrationOfDreadCount + 1
self:StopBar(CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
self:StopBar(CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount))
self:StopBar(CL.count:format(L.empowered_cloud_of_carrion, cloudOfCarrionCount))
self:CDBar(359960, 5, L.leeching_claws) -- Leeching Claws
self:Bar(360012, 7.5, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount)) -- Cloud of Carrion
self:Bar(361913, self:Mythic() and 9.5 or 10, CL.count:format(CL.adds, manifestShadowsCount)) -- Manifest Shadows
self:Bar(360319, 51, CL.count:format(L.unto_darkness, untoDarknessCount)) -- Unto Darkness
self:CDBar(360284, 8, L.anguishing_strike) -- Anguishing Strike
self:Bar(360717, 126, CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount)) -- Infiltration of Dread
nextAmongUs = GetTime() + 126
if self:Mythic() then
local cd = 10.7 -- 10.7 on first Among Us
if infiltrationOfDreadCount == 3 then -- either short or long
cd = fearCasts == 3 and 5 or 22
elseif infiltrationOfDreadCount == 4 then -- last one, short or long
cd = fearCasts == 3 and 10.5 or 17
end
self:CDBar(360146, cd, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount)) -- Fearful Trepidation
self:Bar(360229, cd == 5 and 7 or 5, CL.count:format(L.slumber_cloud, slumberCloudCount)) -- Slumber Cloud
else
self:CDBar(360146, fearTimers[fearfulTrepidationCount], CL.count:format(L.fearful_trepidation, fearfulTrepidationCount)) -- Fearful Trepidation
self:Bar(360229, 5, CL.count:format(L.slumber_cloud, slumberCloudCount)) -- Slumber Cloud
end
fearCasts = 0
empCarrion = false
amongUsStart = args.time
-- Pauze to show timers once you finish Among Us
self:PauseBar(359960, L.leeching_claws) -- Leeching Claws
self:PauseBar(360012, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount)) -- Cloud of Carrion
self:PauseBar(361913, CL.count:format(CL.adds, manifestShadowsCount)) -- Manifest Shadows
self:PauseBar(360319, CL.count:format(L.unto_darkness, untoDarknessCount)) -- Unto Darkness
self:PauseBar(360229, CL.count:format(L.slumber_cloud, slumberCloudCount)) -- Slumber Cloud
self:PauseBar(360284, L.anguishing_strike) -- Anguishing Strike
self:PauseBar(360717, CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount)) -- Infiltration of Dread
self:PauseBar(360146, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount)) -- Fearful Trepidation
end
end
do
local prev = 0
function mod:InfiltrationOfDreadOver(args)
if args.time - 10 > prev then
prev = args.time
self:Message(360717, "green", L.infiltration_removed:format(args.time-amongUsStart), "inv_eyeofnzothpet")
self:PlaySound(360717, "long")
-- Resume bars!
self:ResumeBar(359960, L.leeching_claws) -- Leeching Claws
self:ResumeBar(360012, CL.count:format(L.cloud_of_carrion, cloudOfCarrionCount)) -- Cloud of Carrion
self:ResumeBar(361913, CL.count:format(CL.adds, manifestShadowsCount)) -- Manifest Shadows
self:ResumeBar(360319, CL.count:format(L.unto_darkness, untoDarknessCount)) -- Unto Darkness
self:ResumeBar(360229, CL.count:format(L.slumber_cloud, slumberCloudCount)) -- Slumber Cloud
self:ResumeBar(360284, L.anguishing_strike) -- Anguishing Strike
self:ResumeBar(360717, CL.count:format(L.infiltration_of_dread, infiltrationOfDreadCount)) -- Infiltration of Dread
self:ResumeBar(360146, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount)) -- Fearful Trepidation
end
end
end
end
do
local playerList = {}
local prev = 0
function mod:FearfulTrepidation(args)
playerList = {}
self:StopBar(CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
self:Message(360146, "yellow", CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
self:PlaySound(360146, "alert")
fearfulTrepidationCount = fearfulTrepidationCount + 1
fearCasts = fearCasts + 1
if self:Mythic() then
if fearfulTrepidationCount ~= 2 or nextAmongUs > GetTime() + 15 then
self:Bar(360146, 29.1, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
end
else
if fearfulTrepidationCount ~= 4 and fearfulTrepidationCount ~= 8 and fearfulTrepidationCount ~= 11 and fearfulTrepidationCount ~= 15 then
self:Bar(360146, fearfulTrepidationCount % 2 == 0 and 50 or 30, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount))
end
end
end
function mod:FearfulTrepidationApplied(args)
local count = #playerList+1
local icon = count
playerList[count] = args.destName
playerList[args.destName] = count -- Set raid marker
if self:Me(args.destGUID)then
local sayIcon = bitesSayTimer and 7 or nil
local sayText = bitesSayTimer and CL.count_rticon:format(L.fearful_trepidation, icon, sayIcon) or nil
self:Say(args.spellId, sayText)
self:SayCountdown(args.spellId, 8, sayIcon, 5)
if bitesSayTimer then
self:CancelTimer(bitesSayTimer)
bitesSayTimer = nil
end
end
self:NewTargetsMessage(args.spellId, "orange", playerList, nil, CL.count:format(L.fearful_trepidation, fearfulTrepidationCount-1))
self:CustomIcon(fearfulTrepidationMarker, args.destName, icon)
end
function mod:FearfulTrepidationRemoved(args)
if self:Me(args.destGUID) then
self:CancelSayCountdown(args.spellId)
end
self:CustomIcon(fearfulTrepidationMarker, args.destName)
end
end
function mod:SlumberCloud(args)
self:StopBar(CL.count:format(L.slumber_cloud, slumberCloudCount))
self:Message(args.spellId, "yellow", CL.count:format(L.slumber_cloud, slumberCloudCount))
self:PlaySound(args.spellId, "alert")
slumberCloudCount = slumberCloudCount + 1
if self:Mythic() then
local cd = slumberCloudCount % 3 == 2 and 33 or slumberCloudCount % 3 == 0 and 53 or 0
self:Bar(args.spellId, cd, CL.count:format(L.slumber_cloud, slumberCloudCount))
else
if slumberCloudCount % 2 == 0 then -- Only start a bar for all even casts
local cd = slumberCloudCount == 2 and 69.3 or slumberCloudCount == 4 and 73 or slumberCloudCount == 6 and 75 or slumberCloudCount == 8 and 73
self:Bar(args.spellId, 72, CL.count:format(L.slumber_cloud, slumberCloudCount))
end
end
end
function mod:AnguishingStrike(args)
local bossUnit = self:GetBossId(args.sourceGUID)
self:Message(args.spellId, "purple", CL.casting:format(L.anguishing_strike))
if self:Tanking(bossUnit) then
self:PlaySound(args.spellId, "alert")
end
-- Stop around specials?
self:Bar(args.spellId, 9.7, L.anguishing_strike)
end
function mod:AnguishingStrikeApplied(args)
local bossUnit = self:GetBossId(args.sourceGUID)
local amount = args.amount or 1
self:NewStackMessage(360284, "purple", args.destName, amount, 3)
if amount > 2 and not self:Tanking(bossUnit) then -- Maybe swap?
self:PlaySound(360284, "alarm")
end
end