Scriptname SprigganFXSCRIPT extends ActiveMagicEffect  
{Attaches and controlss spriggan FX}

; Eddoursul 2024.01.27: Multi-stage dying, fixed the KillFX Papyrus warning

VisualEffect Property SprigganFXAttachEffect Auto
Spell Property crSprigganHeal01 Auto
Spell Property crSprigganCallCreatures Auto
Idle Property FFselfIdle  Auto  
bool bAnimEffects = true
;===============================================

auto state Alive

	event OnEffectStart(Actor Target, Actor Caster)
		If ! Target || Target == Game.GetForm(0x14)
			GotoState("DoNothing")
			Dispel()
			return
		EndIf
		
		if bAnimEffects
			bAnimEffects = false
			SprigganFXAttachEffect.Stop(Target)
			Target.PlaySubGraphAnimation("KillFX")
		endif
		
		If Target.IsDead()
			GotoState("DoNothing")
			Dispel()
		EndIf
	endevent
	
	event OnCombatStateChanged(Actor akTarget, int aeCombatState)
		Actor actorRef = GetTargetActor()
	
		if ! actorRef || ! actorRef.Is3DLoaded()
			return
		endif

		if aeCombatState == 0
			if actorRef.IsDead()
				GotoState("Dying")
				return
			endif
			SprigganFXAttachEffect.Stop(actorRef)
			return
		endif
		
		if aeCombatState == 1
			if ! bAnimEffects
				bAnimEffects = true
				actorRef.PlaySubGraphAnimation("Revive")
			endif
			SprigganFXAttachEffect.Play(actorRef, -1)
			actorRef.playIdle(FFselfIdle)
			Utility.Wait(Utility.RandomFloat(1.0, 3.0))
			if GetState() == "Alive"
				crSprigganCallCreatures.cast(actorRef, actorRef)
			endif
		endif
	endevent

	event onDying(actor myKiller)
		GotoState("Dying")
	endevent

	event onDeath(actor myKiller)
		GotoState("Dying")
	endevent

	event OnEnterBleedout()
		Actor actorRef = GetTargetActor()
		SprigganFXAttachEffect.Stop(actorRef)
		
		if actorRef.GetActorValue("Variable07")
			RegisterForAnimationEvent(actorRef, "BleedoutStop")
			return
		endif
		
		actorRef.SetActorValue("Variable07", 1)
		Utility.Wait(Utility.RandomFloat(2.0, 3.5))
		
		if GetState() == "Alive"
			RegisterForAnimationEvent(actorRef, "BleedoutStop")
			crSprigganHeal01.Cast(actorRef)
			actorRef.EvaluatePackage()
		endif
	endevent
	
	event OnAnimationEvent(ObjectReference akSource, string asEventName)
		UnregisterForAnimationEvent(akSource, asEventName)
		SprigganFXAttachEffect.Play(akSource)
	endevent

endstate

state Dying

	event OnBeginState()
		RegisterForSingleUpdate(Utility.RandomFloat(2.0, 3.5))
		UnregisterForAnimationEvent(GetTargetActor(), "BleedoutStop")
	endevent

	event OnCellAttach()
		RegisterForSingleUpdate(1.0)
	endevent
	
	event OnCellDetach()
		UnregisterForUpdate()
		GotoState("Dead")
		SprigganFXAttachEffect.Stop(GetTargetActor())
		Dispel()
	endevent
	
	event OnUpdate()
		SprigganFXAttachEffect.Stop(GetTargetActor())
		GotoState("Dead")
		RegisterForSingleUpdate(Utility.RandomFloat(3.0, 7.5))
	endevent
	
endstate

state Dead

	event OnUpdate()
		Dispel()
	endevent
	
	event OnEffectFinish(Actor akTarget, Actor akCaster)
		GotoState("DoNothing")
		if bAnimEffects
			bAnimEffects = false
			akTarget.PlaySubGraphAnimation("KillFX")
		endif
	endevent
	
endstate

state DoNothing
endstate

; Compiler wants it here
event OnEnterBleedout()
endevent