Scriptname _00E_FS_Entropy_BoneSpiritMonitorSC extends activemagiceffect  

Event OnEffectStart(Actor akTarget, Actor akCaster)

	akCheckActor = akTarget
	UpdateDamage()
	fLastDamageMod = 0.0 ; Force damage updae on next UpdateDamage, just in case

EndEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)

	bEffectFinished = True

	; Wait for UpdateDamage to stop meddling with the magnitudes
	While bUpdatingDamage
		Utility.WaitMenuMode(0.1)
	EndWhile

	If fLastDamageMod != 1.0
		If spell1
			spell1.SetNthEffectMagnitude(0, fOriginalDamage1)
		EndIf
		If spell2
			spell2.SetNthEffectMagnitude(0, fOriginalDamage2)
		EndIf
	EndIf

EndEvent

Event OnPlayerLoadGame()

	; Force delayed update after player load game
	fLastDamageMod = 0.0
	RegisterForSingleUpdate(1.0)

EndEvent

Event OnUpdate()

	UpdateDamage()

EndEvent

Function UpdateDamage()

	If bEffectFinished
		Return
	EndIf
	
	bUpdatingDamage = True

	Bool bUpdateSpellDamage = False

	; Get equipped bone spirits
	Spell spellNew1 = None
	Spell spellNew2 = None

	Spell spellRight = akCheckActor.GetEquippedSpell(1) ; Right hand
	If spellRight && ((spellRight == spell1) || (spellRight == spell2) || _00E_FS_Entropy_BoneSpiritSpells.HasForm(spellRight))
		spellNew1 = spellRight
	EndIf

	Spell spellLeft = akCheckActor.GetEquippedSpell(0) ; Left hand
	If spellLeft && (spellLeft != spellRight) && ((spellLeft == spell1) || (spellLeft == spell2) || _00E_FS_Entropy_BoneSpiritSpells.HasForm(spellLeft))
		If spellNew1 == None
			spellNew1 = spellLeft
		Else
			spellNew2 = spellLeft
		EndIf
	EndIf

	; New spell1?
	If spell1 != spellNew1
		If spell1 && spell1 != spellNew2
			spell1.SetNthEffectMagnitude(0, fOriginalDamage1)
		EndIf

		spell1 = spellNew1
		If spell1
			fOriginalDamage1 = ControlQuest.GetOriginalSpellDamage(spell1)
		EndIf

		bUpdateSpellDamage = True
	EndIf

	; New spell2?
	If spell2 != spellNew2
		If spell2 && spell2 != spellNew1
			spell2.SetNthEffectMagnitude(0, fOriginalDamage2)
		EndIf

		spell2 = spellNew2
		if spell2
			fOriginalDamage2 = ControlQuest.GetOriginalSpellDamage(spell2)
		EndIf

		bUpdateSpellDamage = True
	EndIf

	; Calculate damage modifier (+13% of damage for every 10% of health lost)
	Float fDamageMod = 1.0
	Float fDamageMult = Math.Floor(10.0 - (akCheckActor.GetAVPercentage("Health") * 10.0)) as Float
	If fDamageMult > 0.0
		fDamageMod += (0.13 * fDamageMult)
	EndIf
	If fDamageMod != fLastDamageMod
		fLastDamageMod = fDamageMod
		bUpdateSpellDamage = True
	EndIf

	; Update spells' damage
	If bUpdateSpellDamage
		If spell1
			spell1.SetNthEffectMagnitude(0, fOriginalDamage1 * fDamageMod)
		EndIf
		If spell2
			spell2.SetNthEffectMagnitude(0, fOriginalDamage2 * fDamageMod)
		EndIf
	EndIf


	bUpdatingDamage = False
	
	If bEffectFinished == False
		RegisterForSingleUpdate(1.0)
	EndIf
	
EndFunction


Spell spell1 = None
Spell spell2 = None

Float fOriginalDamage1
Float fOriginalDamage2
Float fLastDamageMod

Actor akCheckActor
Bool bUpdatingDamage
Bool bEffectFinished

Formlist Property _00E_FS_Entropy_BoneSpiritSpells Auto
_00E_BoneSpiritControlScript Property ControlQuest Auto