--------------------------------------------------------------------------------
-- Module Declaration
--
local mod , CL = BigWigs : NewBoss ( " Dausegne, the Fallen Oracle " , 2481 , 2459 )
if not mod then return end
mod : RegisterEnableMob ( 181224 ) -- Dausegne
mod : SetEncounterID ( 2540 )
mod : SetRespawnTime ( 30 )
--------------------------------------------------------------------------------
-- Locals
--
local barrageCount = 1
local coreCount = 1
local arcCount = 1
local haloCount = 1
local haloTimer = nil
local teleportCount = 1
local nextTeleport = 0
--------------------------------------------------------------------------------
-- Localization
--
local L = mod : GetLocale ( )
if L then
L.staggering_barrage = " Barrage " -- Staggering Barrage
L.obliteration_arc = " Arc " -- Obliteration Arc
L.disintergration_halo = " Rings " -- Disintegration Halo
L.rings_x = " Rings x%d "
L.rings_enrage = " Rings (Enrage) "
L.ring_count = " Ring (%d/%d) "
L.custom_on_ring_timers = " Individual Halo Timers "
L.custom_on_ring_timers_desc = " Disintegration Halo triggers a set of rings, this will show bars for when each of the rings starts moving. Uses settings from Disintegration Halo. "
L.custom_on_ring_timers_icon = 363200
L.absorb_text = " %s (%.0f%%) "
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod : GetOptions ( )
return {
361966 , -- Infused Strikes
{ 361018 , " ICON " , " SAY_COUNTDOWN " , " SAY " } , -- Staggering Barrage
359483 , -- Domination Core
361225 , -- Encroaching Dominion
361513 , -- Obliteration Arc
363200 , -- Disintegration Halo
" custom_on_ring_timers " ,
361630 , -- Teleport
{ 361651 , " INFOBOX " } , -- Siphoned Barrier
365418 , -- Total Dominion
} , nil , {
[ 361018 ] = L.staggering_barrage , -- Staggering Barrage (Barrage)
[ 359483 ] = CL.add , -- Domination Core (Add)
[ 361513 ] = L.obliteration_arc , -- Obliteration Arc (Arc)
[ 363200 ] = L.disintergration_halo , -- Disintegration Halo (Rings)
}
end
function mod : OnBossEnable ( )
self : Log ( " SPELL_AURA_APPLIED " , " InfusedStrikesApplied " , 361966 )
self : Log ( " SPELL_AURA_APPLIED_DOSE " , " InfusedStrikesApplied " , 361966 )
self : Log ( " SPELL_AURA_REMOVED " , " InfusedStrikesRemoved " , 361966 )
self : Log ( " SPELL_AURA_APPLIED " , " StaggeringBarrageApplied " , 361018 )
self : Log ( " SPELL_AURA_REMOVED " , " StaggeringBarrageRemoved " , 361018 )
self : Log ( " SPELL_CAST_START " , " DominationCore " , 359483 )
self : Log ( " SPELL_CAST_START " , " ObliterationArc " , 361513 )
self : Log ( " SPELL_CAST_SUCCESS " , " DisintegrationHaloSuccess " , 362805 )
self : Log ( " SPELL_CAST_START " , " Teleport " , 361630 )
self : Log ( " SPELL_AURA_APPLIED " , " SiphonedBarrierApplied " , 361651 )
self : Log ( " SPELL_AURA_REMOVED " , " SiphonedBarrierRemoved " , 361651 )
self : Log ( " SPELL_CAST_START " , " TotalDominion " , 365418 )
self : Log ( " SPELL_AURA_APPLIED " , " GroundDamage " , 361225 ) -- Encroaching Dominion
self : Log ( " SPELL_PERIODIC_DAMAGE " , " GroundDamage " , 361225 )
self : Log ( " SPELL_PERIODIC_MISSED " , " GroundDamage " , 361225 )
end
function mod : OnEngage ( )
barrageCount = 1
coreCount = 1
arcCount = 1
haloCount = 1
teleportCount = 1
nextTeleport = GetTime ( ) + ( self : Easy ( ) and 80 or 72.8 )
self : SetStage ( 1 )
self : Bar ( 359483 , self : Easy ( ) and 7 or 6.5 , CL.count : format ( CL.add , coreCount ) ) -- Domination Core
self : Bar ( 363200 , self : Easy ( ) and 5.5 or 5 , CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) ) -- Disintegration Halo (emote at 5, ring at ~13)
self : Bar ( 361513 , self : Easy ( ) and 16.5 or 15 , CL.count : format ( L.obliteration_arc , arcCount ) ) -- Obliteration Arc
self : Bar ( 361018 , self : Easy ( ) and 32 or 29 , CL.count : format ( L.staggering_barrage , barrageCount ) ) -- Staggering Barrage
self : Bar ( 361630 , self : Easy ( ) and 80 or 72.8 , CL.count : format ( self : SpellName ( 361630 ) , teleportCount ) ) -- Teleport
end
--------------------------------------------------------------------------------
-- Event Handlers
--
do
local tankTimers = { }
function mod : InfusedStrikesApplied ( args )
self : CancelTimer ( tankTimers [ args.destName ] )
self : StopBar ( CL.bomb , args.destName )
if self : Tank ( ) then
local amount = args.amount or 1
if amount % 2 == 0 and amount > 8 then -- XXX Finetune
self : NewStackMessage ( args.spellId , " purple " , args.destName , amount , 5 )
if amount > 15 and not self : Tanking ( " boss1 " ) then
self : PlaySound ( args.spellId , " alarm " )
end
end
end
tankTimers [ args.destName ] = self : ScheduleTimer ( " TargetBar " , 10 , args.spellId , 10 , args.destName , CL.bomb )
end
function mod : InfusedStrikesRemoved ( args )
self : StopBar ( CL.bomb , args.destName )
self : CancelTimer ( tankTimers [ args.destName ] )
end
end
function mod : StaggeringBarrageApplied ( args )
self : TargetMessage ( args.spellId , " orange " , args.destName , CL.count : format ( L.staggering_barrage , barrageCount ) )
if self : Me ( args.destGUID ) then
self : PlaySound ( args.spellId , " warning " )
self : Yell ( args.spellId , L.staggering_barrage )
self : YellCountdown ( args.spellId , 8 )
else
self : PlaySound ( args.spellId , " alert " , nil , args.destName )
end
self : SecondaryIcon ( args.spellId , args.destName )
barrageCount = barrageCount + 1
local cd = self : Easy ( ) and 38.8 or 35
if barrageCount < 4 and nextTeleport > GetTime ( ) + cd then -- 3 per rotation, except first
self : Bar ( 361018 , cd , CL.count : format ( L.staggering_barrage , barrageCount ) )
end
end
function mod : StaggeringBarrageRemoved ( args )
if self : Me ( args.destGUID ) then
self : CancelYellCountdown ( args.spellId )
end
self : SecondaryIcon ( args.spellId , nil )
end
function mod : DominationCore ( args )
self : Message ( args.spellId , " yellow " , CL.incoming : format ( CL.count : format ( CL.add , coreCount ) ) )
self : PlaySound ( args.spellId , " long " )
coreCount = coreCount + 1
local cd = self : Easy ( ) and ( coreCount == 2 and 37.2 or 40.5 ) or ( coreCount == 2 and 33.5 or 36.5 )
if coreCount < 4 and nextTeleport > GetTime ( ) + cd then -- 3 per rotation, except first
self : Bar ( args.spellId , cd , CL.count : format ( CL.add , coreCount ) )
end
end
function mod : ObliterationArc ( args )
self : Message ( args.spellId , " yellow " , CL.count : format ( L.obliteration_arc , arcCount ) )
self : PlaySound ( args.spellId , " alert " )
arcCount = arcCount + 1
local cd = self : Easy ( ) and 38.8 or 35
if arcCount < 4 and nextTeleport > GetTime ( ) + cd then -- 3 per rotation, except first
self : Bar ( args.spellId , cd , CL.count : format ( L.obliteration_arc , arcCount ) )
end
end
do
local ringCount = 1
function mod : DisintegrationHalo ( )
if ringCount == 1 then
if haloCount == 4 then
self : Message ( 363200 , " orange " , L.rings_enrage )
else
self : Message ( 363200 , " orange " , CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount - 1 ) )
end
self : PlaySound ( 363200 , " long " )
end
if ringCount < teleportCount and haloCount < 3 then -- skip enrage rings
ringCount = ringCount + 1
self : CDBar ( 363200 , 5.5 , L.ring_count : format ( ringCount , teleportCount ) )
haloTimer = self : ScheduleTimer ( " DisintegrationHalo " , 5.5 )
end
end
function mod : DisintegrationHaloSuccess ( args )
self : StopBar ( CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) )
self : Message ( 363200 , " orange " , CL.soon : format ( CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) ) )
self : PlaySound ( 363200 , " info " )
haloCount = haloCount + 1
ringCount = 1
if teleportCount > 1 and haloCount < 3 then -- 2 per rotation, except first
self : Bar ( 363200 , self : Easy ( ) and 77.8 or 70 , CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) )
elseif teleportCount == 4 and haloCount == 3 then -- enrage, shorter cd, then triggers infinite rings
--self:Bar(363200, 35, CL.count:format(L.rings_enrage, haloCount)) -- Don't need to show do we?
end
if self : GetOption ( " custom_on_ring_timers " ) then
self : Bar ( 363200 , 8.5 , L.ring_count : format ( ringCount , teleportCount ) )
haloTimer = self : ScheduleTimer ( " DisintegrationHalo " , 8.5 )
end
end
end
function mod : Teleport ( args )
-- clean up anything we messed up
self : StopBar ( CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) ) -- Disintegration Halo
self : StopBar ( CL.count : format ( CL.add , coreCount ) ) -- Domination Core
self : StopBar ( CL.count : format ( L.obliteration_arc , arcCount ) ) -- Obliteration Arc
self : StopBar ( CL.count : format ( L.staggering_barrage , barrageCount ) ) -- Staggering Barrage
self : StopBar ( CL.count : format ( args.spellName , teleportCount ) ) -- Teleport
self : CancelTimer ( haloTimer )
for i = 2 , teleportCount do
self : StopBar ( L.ring_count : format ( i , teleportCount ) )
end
self : Message ( args.spellId , " cyan " , CL.count : format ( args.spellName , teleportCount ) )
self : PlaySound ( args.spellId , " info " )
teleportCount = teleportCount + 1
end
do
local timer , maxAbsorb = nil , 0
local appliedTime = 0
local function updateInfoBox ( self )
local absorb = UnitGetTotalAbsorbs ( " boss1 " )
local absorbPercentage = absorb / maxAbsorb
self : SetInfoBar ( 361651 , 1 , absorbPercentage )
self : SetInfo ( 361651 , 2 , L.absorb_text : format ( self : AbbreviateNumber ( absorb ) , absorbPercentage * 100 ) )
end
function mod : SiphonedBarrierApplied ( args )
if self : CheckOption ( args.spellId , " INFOBOX " ) then
self : OpenInfo ( args.spellId , args.spellName )
self : SetInfoBar ( args.spellId , 1 , 1 )
self : SetInfo ( args.spellId , 1 , _G.ABSORB )
maxAbsorb = args.amount
timer = self : ScheduleRepeatingTimer ( updateInfoBox , 0.1 , self )
end
appliedTime = args.time
end
function mod : SiphonedBarrierRemoved ( args )
self : CloseInfo ( args.spellId )
if timer then
self : CancelTimer ( timer )
timer = nil
end
self : SetStage ( self : GetStage ( ) + 1 )
self : Message ( args.spellId , " green " , CL.removed_after : format ( args.spellName , args.time - appliedTime ) )
self : PlaySound ( args.spellId , " info " )
barrageCount = 1
coreCount = 1
arcCount = 1
haloCount = 1
self : Bar ( 363200 , self : Easy ( ) and 7.5 or 7 , CL.count : format ( L.rings_x : format ( teleportCount ) , haloCount ) ) -- Disintegration Halo
self : Bar ( 359483 , self : Easy ( ) and 9.3 or 8.5 , CL.count : format ( CL.add , coreCount ) ) -- Domination Core
self : Bar ( 361513 , self : Easy ( ) and 18.7 or 17 , CL.count : format ( L.obliteration_arc , arcCount ) ) -- Obliteration Arc
self : Bar ( 361018 , self : Easy ( ) and 34.3 or 31 , CL.count : format ( L.staggering_barrage , barrageCount ) ) -- Staggering Barrage
nextTeleport = GetTime ( ) + ( self : Easy ( ) and 121 or 110.2 )
if teleportCount < 4 then -- Only 3 teleports before berserk
self : Bar ( 361630 , self : Easy ( ) and 121 or 110.2 , CL.count : format ( self : SpellName ( 361630 ) , teleportCount ) ) -- Teleport
else
self : Bar ( 365418 , ( self : Easy ( ) and 121 or 110.2 ) ) -- Total Domination
end
end
end
function mod : TotalDominion ( args )
self : Message ( args.spellId , " red " )
self : PlaySound ( args.spellId , " warning " )
end
do
local prev = 0
function mod : GroundDamage ( args )
if self : Me ( args.destGUID ) then
local t = args.time
if t - prev > 2 then
prev = t
self : PlaySound ( args.spellId , " underyou " )
self : PersonalMessage ( args.spellId , " underyou " )
end
end
end
end