local mod	= DBM:NewMod(2447, "DBM-SanctumOfDomination", nil, 1193)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20220205042222")
mod:SetCreatureID(175730)
mod:SetEncounterID(2431)
mod:SetUsedIcons(1, 2, 3, 4, 5, 6, 7, 8)
mod:SetHotfixNoticeRev(20210902000000)
mod:SetMinSyncRevision(20210706000000)
mod.respawnTime = 29

mod:RegisterCombat("combat")

mod:RegisterEventsInCombat(
	"SPELL_CAST_START 351680 350554 350421 353426 350169 354367 354265 357144 353603",
	"SPELL_CAST_SUCCESS 350355",
	"SPELL_AURA_APPLIED 354365 351680 353432 350568 356065 353195 354964 357739",
--	"SPELL_AURA_APPLIED_DOSE",
	"SPELL_AURA_REMOVED 354365 351680 350568 356065 353195 357739",
--	"SPELL_PERIODIC_DAMAGE",
--	"SPELL_PERIODIC_MISSED",
	"UNIT_DIED",
	"UNIT_SPELLCAST_SUCCEEDED boss1"
)

--Extended todo, stuff that probably won't get done do to diminished time investment these days. Hard to stay motivated with so much support decline
--TODO, https://ptr.wowhead.com/spell=354966/unstable-accretion trackingn for mythic phase 2
--TODO, further timer data for longer pulls?
--TODO, add cast bars for the double beam casts that don't actually have double casts events
--TODO, verify add auto marking off IEEU
--TODO, improve P3 timers for invoke/bombs to account for when it will be delayed by runes? (likely will never actually get done, time investment these days is as diminished as support)
--[[
(ability.id = 350421 or ability.id = 351680 or ability.id = 350554 or ability.id = 354367 or ability.id = 354265 or ability.id = 357144) and type = "begincast"
 or (ability.id = 353195 or ability.id = 357739) and (type = "applybuff" or type = "removebuff")
 or (ability.id = 353195) and type = "applydebuff"
 or ability.id = 354964 and type = "applydebuff"
 --]]
--Stage One: Scrying Fate
mod:AddOptionLine(DBM:EJ_GetSectionInfo(22926), "announce")
local warnProbe									= mod:NewCastAnnounce(353603, 2)
local warnGrimPortent							= mod:NewTargetNoFilterAnnounce(354365, 4)--Mythic
local warnTwistFate								= mod:NewCountAnnounce(353931, 2, nil, "RemoveMagic")
local warnCallofEternity						= mod:NewTargetAnnounce(350554, 4, nil, nil, 37859)

local specWarnGrimPortent						= mod:NewSpecialWarningYouPos(354365, nil, nil, nil, 1, 2, 4)--Mythic
local yellGrimPortent							= mod:NewYell(354365)--Mythic
local yellGrimPortentFades						= mod:NewShortFadesYell(354365)--Mythic
local specWarnInvokeDestiny						= mod:NewSpecialWarningMoveAway(351680, nil, nil, nil, 1, 2)
local yellInvokeDestiny							= mod:NewYell(351680)
local yellInvokeDestinyFades					= mod:NewShortFadesYell(351680)
local specWarnInvokeDestinySwap					= mod:NewSpecialWarningTaunt(351680, nil, nil, nil, 1, 2)
local specWarnBurdenofDestinyYou				= mod:NewSpecialWarningRun(353432, nil, 244657, nil, 4, 2)--"Fixate"
local specWarnBurdenofDestiny					= mod:NewSpecialWarningSwitch(353432, "Dps", nil, nil, 1, 2)
local specWarnFatedConjunction					= mod:NewSpecialWarningDodge(350355, nil, 207544, nil, 2, 2)
local specWarnCallofEternity					= mod:NewSpecialWarningMoveAway(350554, nil, 37859, nil, 1, 2)
local yellCallofEternity						= mod:NewShortPosYell(350554, 37859)--"Bomb"
local yellCallofEternityFades					= mod:NewIconFadesYell(350554, 37859)

local timerGrimPortentCD						= mod:NewCDCountTimer(28.8, 354365, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)--28-46?
local timerGrimPortent							= mod:NewBuffFadesTimer(9, 354365, nil, nil, nil, 5, nil, DBM_COMMON_L.HEALER_ICON)
local timerInvokeDestinyCD						= mod:NewCDCountTimer(37.8, 351680, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON)--37.8-41
local timerInvokeDestiny						= mod:NewAddsCustomTimer(8, 351680, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerTwistFateCD							= mod:NewCDCountTimer(48.7, 353931, nil, nil, 2, 5, nil, DBM_COMMON_L.MAGIC_ICON..DBM_COMMON_L.HEALER_ICON)
local timerFatedConjunctionCD					= mod:NewCDCountTimer(59.7, 350355, 207544, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON, nil, 1, 3)--"Beams"
local timerFatedConjunction						= mod:NewCastTimer(6.7, 350355, 207544, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
local timerCallofEternityCD						= mod:NewCDCountTimer(37.9, 350554, 167180, nil, nil, 3)--"Bombs"

mod:AddSetIconOption("SetIconOnCallofEternity", 350554, true, false, {1, 2, 3, 4, 5})
mod:AddSetIconOption("SetIconOnGrimPortent", 354365, false, false, {1, 2, 3, 4, 5, 6, 7, 8})
mod:AddNamePlateOption("NPAuraOnBurdenofDestiny", 353432, true)
--Stage Two: Defying Destiny
mod:AddOptionLine(DBM:EJ_GetSectionInfo(22927), "announce")
local warnRunicAffinity							= mod:NewTargetNoFilterAnnounce(354964, 4)--Mythic

local specWarnRealignFate						= mod:NewSpecialWarningCount(351969, nil, nil, nil, 2, 2)
local specWarnRunicAffinity						= mod:NewSpecialWarningYou(354964, nil, nil, nil, 2, 2, 4)

local timerDespairCD							= mod:NewCDCountTimer("d17", 357144, nil, nil, nil, 4)--Tricky to type, it's interrupt bar in 3/4 difficulties, aoe run out in mythic
local timerDarkestDestiny						= mod:NewCastTimer(40, 353122, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)
----Monstrosity
local warnDespair								= mod:NewCountAnnounce(357144, 3)

local specWarnDespair							= mod:NewSpecialWarningInterruptCount(357144, "HasInterrupt", nil, nil, 1, 2)--Non mythic only
local specWarnDespairRun						= mod:NewSpecialWarningRun(357144, nil, nil, nil, 4, 2, 4)

mod:AddSetIconOption("SetIconOnMonstrosity", "ej23764", true, true, {7, 8})
--Stage Three: Fated Terminus
mod:AddOptionLine(DBM:EJ_GetSectionInfo(23486), "announce")
local warnExtemporaneousFate					= mod:NewSoonAnnounce(353195, 3)

local specWarnExtemporaneousFate				= mod:NewSpecialWarningCount(353195, nil, nil, nil, 2, 2)

local timerRunicAffinityCD						= mod:NewCDCountTimer(39, 354964, nil, nil, nil, 3, nil, nil, true)--Used in state 3 only, in stage 1 it happens at same time as rings
local timerExtemporaneousFateCD					= mod:NewCDCountTimer(39, 353195, nil, nil, nil, 6, nil, nil, true)

--local berserkTimer							= mod:NewBerserkTimer(600)

mod:GroupSpells(351680, 353432)--Burden and invoke bundled (invoke is add fixate at end of burden)
mod:GroupSpells(351969, 353122)--Realign fate and darkest destiny which is channel for how long you have for fate

mod.vb.EternityIcon = 1
mod.vb.DebuffIcon = 1
mod.vb.realignCount = 0
mod.vb.twistCount = 0
mod.vb.eternityCount = 0
mod.vb.destinyCount = 0
mod.vb.conjunctionCount = 0
mod.vb.portentCount = 0
mod.vb.affinityCount = 0
mod.vb.extemporaneousCount = 0
mod.vb.addIcon = 8
local grimDebuffs = 0--Local variable for timer canceling only
local castsPerGUID = {}
local difficultyName = "normal"
local allTimers = {
	["mythic"] = {
		[1] = {
			--Twist Fate
			[354265] = {5.8, 31.5, 20, 37.7, 27.9, 18.2},--first is 11 the second time around
			--Call of Eternity
			[350554] = {17.8, 57.1, 37.6},--first is 23 the second time around
			--Invoke Destiny
			[351680] = {20, 45, 44.9, 34.4},--first is 25 the second time around
			--Fated Conjunction
			[350421] = {30, 47.4, 5, 7},--first is 35 the second time around
			--Grim Portent
			[354367] = {43, 75},--first is 48 the second time around
		},
		[3] = {
			--Twist Fate
			[354265] = {40, 16, 29, 46.5},
			--Call of Eternity
			[350554] = {13, 54.7, 29},
			--Invoke Destiny
			[351680] = {26, 44, 44.1},
			--Fated Conjunction
			[350421] = {18, 75, 7},
			--Extemporaneous Fate
			[353195] = {54, 89.4},--or 56?
		}
	},
	["normal"] = {--Same as heroic
		[1] = {--Timers after Realign Fate
			--Twist Fate
			[354265] = {10, 49.2, 75.2, 35.2, 10.9},--Last one is 10.9-38.9 for some reason
			--Call of Eternity
			[350554] = {29.4, 38.8, 34.1, 44.9, 41.3},
			--Invoke Destiny
			[351680] = {40.4, 39.3, 38.7, 40},
			--Fated Conjunction
			[350421] = {18.5, 59.7, 26.7, 23.4, 48.5},
		},
		[3] = {
			--Twist Fate
			[354265] = {50.5, 48.6, 38.8},
			--Call of Eternity
			[350554] = {11.5, 38.6, 38.8, 57.1},--second and third one can be flipped based on phasing timing, so for sequence sake lowest seen is used for both :\
					  --11.53, 75.89, 40.14
					  --11.5, 38.6, 73.1, 57.1
			--Invoke Destiny
			[351680] = {25.6, 43.7, 90},
			--Fated Conjunction
			[350421] = {9.4, 50.4, 51.1, 40.1, 26.7},
			--Extemporaneous Fate
			[353195] = {36.7, 43.1, 43.7},--Huge variations, 36-50
		}
	},
}

--Attempts to fix destiny timer when it's 73.1 instead of 38.6
--This schedule function will only run if it doesn't come on time, and restart the timer for remainder of 73.1
--local function fixEternity(self)
--	timerCallofEternityCD:Update(50, 73.1, self.vb.eternityCount+1)
--end

function mod:OnCombatStart(delay)
	table.wipe(castsPerGUID)
	self.vb.DebuffIcon = 1
	self:SetStage(1)
	self.vb.realignCount = 0
	self.vb.twistCount = 0
	self.vb.eternityCount = 0
	self.vb.destinyCount = 0
	self.vb.conjunctionCount = 0
	self.vb.portentCount = 0
	self.vb.extemporaneousCount = 0
--	berserkTimer:Start(-delay)
	if self:IsMythic() then
		difficultyName = "mythic"
		timerTwistFateCD:Start(5.8-delay, 1)
		timerCallofEternityCD:Start(17.8-delay, 1)
		timerInvokeDestinyCD:Start(20-delay, 1)
		timerFatedConjunctionCD:Start(30-delay, 1)
		timerGrimPortentCD:Start(43-delay, 1)
	else
		difficultyName = "normal"
		--Normal and Heroic timers are same here
		timerTwistFateCD:Start(4.6-delay, 1)
		timerFatedConjunctionCD:Start(13.1-delay, 1)--13.1-14.4
		timerCallofEternityCD:Start(24-delay, 1)
		timerInvokeDestinyCD:Start(35-delay, 1)
	end
	if self.Options.NPAuraOnBurdenofDestiny then
		DBM:FireEvent("BossMod_EnableHostileNameplates")
	end
--	DBM:AddMsg("Abilities on this fight can be volatile and sometimes skip casts/change order. DBM timers attempt to match the most common scenario of events but sometimes fight will do it's own thing")
end

function mod:OnCombatEnd()
	table.wipe(castsPerGUID)
	self:UnregisterShortTermEvents()
	if self.Options.NPAuraOnBurdenofDestiny then
		DBM.Nameplate:Hide(true, nil, nil, nil, true, true)
	end
end

function mod:OnTimerRecovery()
	if self:IsMythic() then
		difficultyName = "mythic"
	else
		difficultyName = "normal"
	end
end

function mod:SPELL_CAST_START(args)
	local spellId = args.spellId
	if spellId == 351680 then
		self.vb.destinyCount = self.vb.destinyCount + 1
		local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.destinyCount+1]
		if timer then
			timerInvokeDestinyCD:Start(timer, self.vb.destinyCount+1)
		end
	elseif spellId == 350554 then--Two sub cast IDs, but one primary?
--		self:Unschedule(fixEternity)
		self.vb.EternityIcon = 1
		self.vb.eternityCount = self.vb.eternityCount + 1
		local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.eternityCount+1]
		if timer then
			timerCallofEternityCD:Start(timer, self.vb.eternityCount+1)
			--if (self.vb.eternityCount+1) == 2 and self.vb.phase == 3 then
			--	self:Schedule(50, fixEternity, self)
			--end
		end
	elseif (spellId == 350421 or spellId == 353426 or spellId == 350169) then--350421 confiremd, others unknown
		self.vb.conjunctionCount = self.vb.conjunctionCount + 1
		specWarnFatedConjunction:Show()
		specWarnFatedConjunction:Play("watchstep")
		local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][350421][self.vb.conjunctionCount+1]
		if timer then
			timerFatedConjunctionCD:Start(timer, self.vb.conjunctionCount+1)
		end
		timerFatedConjunction:Start()--6.7
	elseif spellId == 354367 then
		grimDebuffs = 0
		self.vb.DebuffIcon = 1
		self.vb.portentCount = self.vb.portentCount + 1
		local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.portentCount+1]
		if timer then
			timerGrimPortentCD:Start(timer, self.vb.portentCount+1)
		end
	elseif spellId == 354265 then--Twist Fate
		self.vb.twistCount = self.vb.twistCount + 1
		warnTwistFate:Show(self.vb.twistCount)
		local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][spellId][self.vb.twistCount+1]
		if timer then
			timerTwistFateCD:Start(timer, self.vb.twistCount+1)
		end
	elseif spellId == 357144 then
		if not castsPerGUID[args.sourceGUID] then--Shouldn't happen, but failsafe
			castsPerGUID[args.sourceGUID] = 0
		end
		castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
		local count = castsPerGUID[args.sourceGUID]
		timerDespairCD:Start(17, count, args.sourceGUID)
		if self:IsMythic() then--Not interruptable on mythic
			if self:CheckBossDistance(args.destGUID, true, 21519, 23) or self:IsTank() then--23 yards away (mistletoe) or you're a tank, regular warning
				if self:AntiSpam(3, 1) then
					warnDespair:Show(count)
				end
			else--Special warning
				if self:AntiSpam(3, 2) then
					specWarnDespairRun:Show()
					specWarnDespairRun:Play("justrun")
				end
			end
		else
			timerDespairCD:UpdateInline(DBM_COMMON_L.INTERRUPT_ICON, count, args.sourceGUID)--It's only interruptable in non mythic, add icon there
			if self:CheckInterruptFilter(args.sourceGUID, false, false) then
				specWarnDespair:Show(args.sourceName, count)
				if count == 1 then
					specWarnDespair:Play("kick1r")
				elseif count == 2 then
					specWarnDespair:Play("kick2r")
				elseif count == 3 then
					specWarnDespair:Play("kick3r")
				elseif count == 4 then
					specWarnDespair:Play("kick4r")
				elseif count == 5 then
					specWarnDespair:Play("kick5r")
				else
					specWarnDespair:Play("kickcast")
				end
			end
		end
	elseif spellId == 353603 then
		if self:IsTanking("player", "boss1", nil, true) then
			warnProbe:Show()
		end
	end
end

--[[
function mod:SPELL_CAST_SUCCESS(args)
	local spellId = args.spellId
	if spellId == 353931 then
		timerTwistFateCD:Start()
	end
end
--]]

function mod:SPELL_AURA_APPLIED(args)
	local spellId = args.spellId
	if spellId == 354365 then
		if args:IsDestTypePlayer() then
			grimDebuffs = grimDebuffs + 1
			local icon = self.vb.DebuffIcon
			if self.Options.SetIconOnGrimPortent and icon < 9 then
				self:SetIcon(args.destName, icon)
			end
			if args:IsPlayer() then
				specWarnGrimPortent:Show()
				specWarnGrimPortent:Play("targetyou")
				yellGrimPortent:Yell()
				yellGrimPortentFades:Countdown(spellId)
			end
			warnGrimPortent:CombinedShow(0.5, args.destName)
			self.vb.DebuffIcon = self.vb.DebuffIcon + 1
			timerGrimPortent:Start()
		end
	elseif spellId == 351680 then
		if args:IsPlayer() then
			specWarnInvokeDestiny:Show()
			specWarnInvokeDestiny:Play("runout")
			yellInvokeDestiny:Yell()
			yellInvokeDestinyFades:Countdown(spellId)
		else
			specWarnInvokeDestinySwap:Show(args.destName)
			specWarnInvokeDestinySwap:Play("tauntboss")
			specWarnInvokeDestinySwap:ScheduleVoice(1.5, "defensive")
		end
		timerInvokeDestiny:Start(8, self.vb.destinyCount)
	elseif spellId == 353432 then
		if args:IsPlayer() then
			specWarnBurdenofDestinyYou:Show()
			specWarnBurdenofDestinyYou:Play("justrun")
			if self.Options.NPAuraOnBurdenofDestiny then
				DBM.Nameplate:Show(true, args.sourceGUID, spellId)
			end
		elseif self:IsHard() then--Normal and LFR just blow it up, it doesn't do any damage
			specWarnBurdenofDestiny:Show()
			specWarnBurdenofDestiny:Play("killmob")
		end
	elseif spellId == 350568 or spellId == 356065 then
		local icon = self.vb.EternityIcon
		if self.Options.SetIconOnCallofEternity then
			self:SetIcon(args.destName, icon)
		end
		if args:IsPlayer() then
			specWarnCallofEternity:Show()--self:IconNumToTexture(icon)
			specWarnCallofEternity:Play("runout")--"mm"..icon
			yellCallofEternity:Yell(icon, icon)
			yellCallofEternityFades:Countdown(spellId, nil, icon)
		end
		warnCallofEternity:CombinedShow(0.5, args.destName)
		self.vb.EternityIcon = self.vb.EternityIcon + 1
	elseif spellId == 353195 then--Extemporaneous Fate
		self.vb.extemporaneousCount = self.vb.extemporaneousCount + 1
		specWarnExtemporaneousFate:Show(self.vb.extemporaneousCount)
		specWarnExtemporaneousFate:Play("specialsoon")
		timerDarkestDestiny:Start(30)
		local timer = allTimers[difficultyName][3][spellId][self.vb.extemporaneousCount+1] or 39--(technically timer is always 39 unless spell queued behind other spells. this seems to be lowest cast order priority)
		if timer then
			timerExtemporaneousFateCD:Start(timer, self.vb.extemporaneousCount+1)
		end
	elseif spellId == 354964 then
		warnRunicAffinity:CombinedShow(0.3, args.destName)
		if args:IsPlayer() then
			specWarnRunicAffinity:Show()
			specWarnRunicAffinity:Play("targetyou")
		end
		if self:AntiSpam(5, 3) and self.vb.phase == 3 then
			self.vb.affinityCount = self.vb.affinityCount + 1
			--The same timer a Extemporaneous fate, just earlier, offset self handled
			local timer = allTimers[difficultyName][self.vb.phase] and allTimers[difficultyName][self.vb.phase][353195][self.vb.affinityCount+1] or 39
			if timer then
				timerRunicAffinityCD:Start(timer, self.vb.affinityCount+1)
			end
		end
	elseif spellId == 357739 then
		self:SetStage(2)
		self.vb.addIcon = 8
		self.vb.realignCount = self.vb.realignCount + 1
		specWarnRealignFate:Show(self.vb.realignCount)
		specWarnRealignFate:Play("specialsoon")
		timerInvokeDestinyCD:Stop()
		timerTwistFateCD:Stop()
		timerFatedConjunctionCD:Stop()
		timerCallofEternityCD:Stop()
		timerGrimPortentCD:Stop()
		timerDarkestDestiny:Start()
		self:RegisterShortTermEvents(
			"INSTANCE_ENCOUNTER_ENGAGE_UNIT"
		)
	end
end

function mod:SPELL_AURA_REMOVED(args)
	local spellId = args.spellId
	if spellId == 354365 then
		grimDebuffs = grimDebuffs - 1
		if self.Options.SetIconOnGrimPortent then
			self:SetIcon(args.destName, 0)
		end
		if grimDebuffs == 0 then
			timerGrimPortent:Stop()
		end
	elseif spellId == 351680 then
		if args:IsPlayer() then
			yellInvokeDestinyFades:Cancel()
		end
		timerInvokeDestiny:Stop()
	elseif spellId == 353432 then
		if args:IsPlayer() then
			if self.Options.NPAuraOnBurdenofDestiny then
				DBM.Nameplate:Show(true, args.sourceGUID, spellId)
			end
		end
	elseif spellId == 350568 or spellId == 356065 then
		if args:IsPlayer() then
			yellCallofEternityFades:Cancel()
		end
		if self.Options.SetIconOnCallofEternity then
			self:SetIcon(args.destName, 0)
		end
	elseif spellId == 353195 then--Extemporaneous Fate
		timerDarkestDestiny:Stop()
	elseif (spellId == 357739) and self.vb.phase == 2 then
		self:UnregisterShortTermEvents()
		timerDarkestDestiny:Stop()
		self.vb.twistCount = 0
		self.vb.eternityCount = 0
		self.vb.destinyCount = 0
		self.vb.conjunctionCount = 0
		self.vb.portentCount = 0
		if self.vb.realignCount == 1 then--first cast
			self:SetStage(1)
			if self:IsMythic() then
				timerTwistFateCD:Start(11, 1)
				timerCallofEternityCD:Start(23, 1)
				timerInvokeDestinyCD:Start(25, 1)
				timerFatedConjunctionCD:Start(30, 1)
				timerGrimPortentCD:Start(48, 1)
			else
				timerTwistFateCD:Start(10, 1)--CAST_START
				timerFatedConjunctionCD:Start(18.5, 1)
				timerCallofEternityCD:Start(29.4, 1)
				timerInvokeDestinyCD:Start(40.4, 1)
			end
		else--Second cast
			self:SetStage(3)
			if self:IsMythic() then
				timerCallofEternityCD:Start(13, 1)
				timerFatedConjunctionCD:Start(18, 1)
				timerInvokeDestinyCD:Start(26, 1)
				timerRunicAffinityCD:Start(39, 1)
				timerTwistFateCD:Start(40, 1)
				timerExtemporaneousFateCD:Start(54, 1)--Rings activating
			else
				timerFatedConjunctionCD:Start(9.4, 1)--9.4-12.1
				timerCallofEternityCD:Start(11.5, 1)--11.5-14.5
				timerInvokeDestinyCD:Start(25.6, 1)
				if self:IsHeroic() then
					timerRunicAffinityCD:Start(30, 1)
				end
				timerExtemporaneousFateCD:Start(self:IsHeroic() and 46.7 or 36.7, 1)
				timerTwistFateCD:Start(50.5, 1)
			end
		end
	end
end

function mod:UNIT_DIED(args)
	local cid = self:GetCIDFromGUID(args.destGUID)
	if cid == 180323 then--Fatespawn Monstrosity
		timerDespairCD:Stop(1, args.destGUID)
		timerDespairCD:Stop(2, args.destGUID)
		timerDespairCD:Stop(3, args.destGUID)
		timerDespairCD:Stop(4, args.destGUID)
		timerDespairCD:Stop(5, args.destGUID)
	end
end

function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
	for i = 1, 5 do
		local unitID = "boss"..i
		local unitGUID = UnitGUID(unitID)
		if UnitExists(unitID) and not castsPerGUID[unitGUID] then
			castsPerGUID[unitGUID] = 0
			local cid = self:GetUnitCreatureId(unitID)
			if cid == 180323 then--Fatespawn Monstrosity
				--Initial despair timer, with new transcriptor log
				--timerDespairCD:Start(0, 1, unitGUID)
				if not GetRaidTargetIndex(unitID) then--Not already marked
					if self.Options.SetIconOnMonstrosity then
						self:SetIcon(unitID, self.vb.addIcon)
					end
					self.vb.addIcon = self.vb.addIcon - 1
				end
			end
		end
	end
end

--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
	if spellId == 340324 and destGUID == UnitGUID("player") and not playerDebuff and self:AntiSpam(2, 4) then
		specWarnGTFO:Show(spellName)
		specWarnGTFO:Play("watchfeet")
	end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
--]]

--"<1445.83 22:22:30> [UNIT_SPELLCAST_SUCCEEDED] Fatescribe Roh-Kalo(Shazzul) -Extemporaneous Fate- [[boss1:Cast-3-2012-2450-10555-353193-000195A188:353193]]", -- [28166]
--"<1453.06 22:22:37> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\ICONS\\Achievement_GuildPerk_WorkingOvertime_Rank2.blp:20|t Fatescribe Roh-Kalo is creating an |cFFFF0000|Hspell:353195|h[Extemporaneous Fate]|h|r!#Fatescribe Roh-Kalo###Fatescribe Roh-Kalo##0#0##0#572#nil#0#false#false#false#false", -- [28352]
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
	if spellId == 353193 then--Extemporaneous Fate (precast)
		warnExtemporaneousFate:Show()--PreWarning
	end
end
