Scriptname _00E_VisionControl extends Quest Hidden 

import Utility

int function _GetScriptVersion() Global
    return 1
endFunction

;/ Unused
function EndVision(bool ScenePlaying, Scene RunningScene = None)

	If PlayerREF.HasSpell(_00E_Vision_TimeSpell)
		PlayerREF.RemoveSpell(_00E_Vision_TimeSpell)
	ElseIf PlayerREF.HasSpell(_00E_Vision_NoTimeSpell)
		PlayerREF.RemoveSpell(_00E_Vision_NoTimeSpell)
	ElseIf PlayerREF.HasSpell(_00E_Vision_NoTimeSubtleSpell)
		PlayerREF.RemoveSpell(_00E_Vision_NoTimeSubtleSpell)
	EndIf
	If ScenePlaying == True && RunningScene.IsPlaying()
		RunningScene.Stop()
	EndIf
	PlayerREF.MoveTo(PlayerVisionStartMarker)

endFunction
/;

Function VisionEffectTimestop(bool bSilent = False, bool bCustomImod = False, bool bCustomMusic = False)

	If bCustomImod == False
		_00E_VisionStartTimestopIMOD.Apply()
		_00E_VisionImod.ApplyCrossFade(0.25)
	EndIf

	PlayerREF.AddSpell(_00E_Vision_TimeSpell, False)
	
	if !bCustomMusic
		_00E_SilenceAbruptHighPriority.Add()
	EndIf
	
	MagRacialBattlecryFire.Play(PlayerREF)
	fPlayerSpeedBeforeVision = PlayerREF.GetBaseActorValue("SpeedMult")
	PlayerREF.SetActorValue("SpeedMult", 35)
	UpdateSpeed(PlayerREF)
	
	VisionSound = 0
	If !bSilent
		VisionSound = _00E_VisionLPM.Play(PlayerREF)
	EndIf
	
	_00E_VisionShaderParticles.Apply(0.5)
	AudioCategoryFST.Mute()
	
	PlayerREF.SetGhost(True)
	
	PlayerVisionStartMarker = PlayerREF.PlaceAtMe(XMarker as form, 1, false, false)
	PlayerVisionFailsaveMarker.MoveTo(PlayerREF)
	Game.DisablePlayerControls(false, true, true, false, true, false, true, false)
	Game.ForceFirstPerson()
	Game.ShowFirstPersonGeometry(False)
	Wait(0.100000)
		
EndFunction

Function VisionEffectTimestopStop(bool bMovementHasBeenLocked = False)

	Game.DisablePlayerControls()
	AudioCategoryFST.UnMute()
	
	If !bMovementHasBeenLocked
		If PlayerVisionFailsaveMarker.GetDistance(PlayerREF) <= 1000
			PlayerREF.MoveTo(PlayerVisionStartMarker)
		Elseif PlayerVisionFailsaveMarker.GetDistance(PlayerREF) >= 1000
			PlayerREF.MoveTo(PlayerVisionFailsaveMarker)
		EndIf
	EndIf
	
	if VisionSound
		Sound.StopInstance(VisionSound)
		VisionSound = 0
	endif
	MAGConjurePortalClose.Play(PlayerREF)
	PlayerREF.RemoveSpell(_00E_Vision_TimeSpell)
	_00E_VisionShaderParticles.Remove(0.5)
	_00E_VisionEndImod.ApplyCrossFade(1)
	Wait(0.5)
	PlayerREF.SetActorValue("speedMult", fPlayerSpeedBeforeVision)
	
	If PlayerREF.GetActorValue("speedMult") < 50
		PlayerREF.SetActorValue("speedMult", 100)
	EndIf

	UpdateSpeed(PlayerREF)
	Game.EnablePlayerControls()
	Game.SetPlayerAIDriven(false)
	Game.ShowFirstPersonGeometry(True)
	_00E_SilenceAbruptHighPriority.Remove()
	PlayerREF.SetGhost(False)
	
EndFunction

Function VisionEffectNoTimestop(Formlist RefsInvolved, Formlist ActorsToFreeze = None, bool bCustomMusic = False)

	Game.ShowFirstPersonGeometry(False)
	PlayerREF.SetAlpha(0.1)
	PlayerREF.AddPerk(_00E_VisionPerk)
	UpdateSpeed(PlayerREF)
	MagRacialBattlecryFire.Play(PlayerREF)
	
	if !bCustomMusic
		_00E_SilenceAbruptHighPriority.Add()
	EndIf
	
	AudioCategoryFST.Mute()
	PlayerVisionStartMarker = PlayerREF.PlaceAtMe(XMarker as form, 1, false, false)
	PlayerVisionFailsaveMarker.MoveTo(PlayerREF)
	PlayerREF.SetGhost(True)
	VisionSound = _00E_VisionLPM.Play(PlayerREF)
	_00E_VisionStartImod.Apply()
	
	If PlayerREF.IsInInterior()
		_00E_VisionShaderParticles.Apply(0.5)
	EndIf
	
	if RefsInvolved != None
		Int iIndex = 0
		int nItems = RefsInvolved.GetSize()
		While iIndex < nItems
			Actor VisionREF = RefsInvolved.GetAt(iIndex) as Actor
			if VisionREF
				if VisionREF.IsDisabled()
					VisionREF.EnableNoWait()
				EndIf
				VisionRef.SetAlpha(0.5)
				MS04MemoryFXBody01VFX.Play(VisionREF)
			endif
			iIndex += 1
		EndWhile
	endif

	if ActorsToFreeze != None
		int iIndex02 = ActorsToFreeze.GetSize()

		while iIndex02 > 0
			iIndex02 -= 1
			Actor FreezeREF = ActorsToFreeze.GetAt(iIndex02) as Actor
			FreezeREF.EnableAI(False)
		EndWhile
	endif
	
	_00E_MQ16_VisionIMOD.Remove()
	_00E_VisionImod.ApplyCrossFade(1)
	
EndFunction

Function VisionEffectNoTimestopStop(Formlist RefsInvolved, Formlist ActorsToFreeze = None, bool bHasBeenRestrained = False)

	PlayerREF.SetAlpha(1.0)
	Game.ShowFirstPersonGeometry(True)
	
	If !bHasBeenRestrained
		If PlayerVisionFailsaveMarker.GetDistance(PlayerREF) <= 1000
			PlayerREF.MoveTo(PlayerVisionStartMarker)
		Elseif PlayerVisionFailsaveMarker.GetDistance(PlayerREF) >= 1000
			PlayerREF.MoveTo(PlayerVisionFailsaveMarker)
		EndIf
	EndIf
	
	_00E_VisionEndImod.ApplyCrossFade(1)
	If PlayerREF.IsInInterior()
		_00E_VisionShaderParticles.Remove(0.5)
	EndIf
	
	if RefsInvolved != None
		int nItems = RefsInvolved.GetSize()
		Int iIndex = 0
		While iIndex < nItems
			Actor VisionREF = RefsInvolved.GetAt(iIndex) as Actor
			if VisionREF
				MS04MemoryFXBody01VFX.Stop(VisionREF)
				VisionRef.SetAlpha(1)
			endif
			iIndex += 1
		EndWhile
	endif

	if ActorsToFreeze != None
		int iIndex02 = ActorsToFreeze.GetSize()

	    while iIndex02 > 0
	        iIndex02 -= 1
	        Actor FreezeREF = ActorsToFreeze.GetAt(iIndex02) as Actor
	        FreezeREF.EnableAI(True)
	    EndWhile
	endif
	
	AudioCategoryFST.UnMute()
	PlayerREF.SetGhost(False)
	Sound.StopInstance(VisionSound)
	MAGConjurePortalClose.Play(PlayerREF)
	_00E_SilenceAbruptHighPriority.Remove()
	PlayerREF.RemovePerk(_00E_VisionPerk)
	
	If PlayerREF.GetActorValue("speedMult") < 50
		PlayerREF.SetActorValue("speedMult", 100)
	EndIf
	
	UpdateSpeed(PlayerREF)
	_00E_MQ16_VisionIMOD.Remove()
	_00E_VisionImod.Remove()

EndFunction

Function UpdateSpeed(Actor SpeedUpdateActor)

	If SpeedUpdateActor.HasSpell(_00E_Vision_UpdateAb)
		SpeedUpdateActor.RemoveSpell(_00E_Vision_UpdateAb)
	EndIf
	
	SpeedUpdateActor.AddSpell(_00E_Vision_UpdateAb, False)
	Wait(0.1)
	SpeedUpdateActor.RemoveSpell(_00E_Vision_UpdateAb)

EndFunction

float fPlayerSpeedBeforeVision

ObjectReference Property PlayerVisionStartMarker Auto Hidden
ObjectReference Property PlayerVisionFailsaveMarker Auto

int VisionSound

SPELL Property _00E_Vision_TimeSpell  Auto  

SPELL Property _00E_Vision_NoTimeSpell  Auto  

SPELL Property _00E_Vision_NoTimeSubtleSpell  Auto  

ImageSpaceModifier Property _00E_VisionStartTimestopIMOD  Auto  

ImageSpaceModifier Property _00E_VisionIMOD  Auto  

MusicType Property _00E_SilenceAbruptHighPriority  Auto  

Sound Property MagRacialBattlecryFire  Auto  

actor Property PlayerRef  Auto  

Sound Property _00E_VisionLPM  Auto  

ImageSpaceModifier Property _00E_VisionStartImod  Auto  

ShaderParticleGeometry Property _00E_VisionShaderParticles  Auto  

SoundCategory Property AudioCategoryFST  Auto  

VisualEffect Property MS04MemoryFXBody01VFX  Auto  

ImageSpaceModifier Property _00E_MQ16_VisionIMOD  Auto  

Sound Property MAGConjurePortalClose  Auto  

SPELL Property _00E_Vision_UpdateAb  Auto  

Perk Property _00E_VisionPerk  Auto  

STATIC Property XMarker  Auto  

ImageSpaceModifier Property _00E_VisionEndImod  Auto