Scriptname _00E_QuestFunctions extends Quest Conditional {This script is meant to be attached to any quests and serves as a Function library. Simply import it to call Global functions, and create a script property to access non-global functions} Import math Import Utility ;===================================================================================== ; EXP ;===================================================================================== Function GiveEP(int ToGive) If (PlayerREF as _00E_EPUpdateFunctions).receiveEP(ToGive) ; Player receives EP EndIf EndFunction ;===================================================================================== ; SYMPATHY ;===================================================================================== Function ModSympathyNG(Actor akSympathyActor, int iSympathyMod, bool bIsFlirt = False, bool bStringOverride = False, String sOverride = "") Levelsystem_SympathyActor.ForceRefTo(akSympathyActor) ActorBase sympathyBase = akSympathyActor.GetActorBase() If sympathyBase == _00E_MC_Jespar SympathyJespar.Mod(iSympathyMod) ElseIf sympathyBase == _00E_MC_Calia SympathyCalia.Mod(iSympathyMod) ElseIf sympathyBase == _00E_CapitalCityMaelGroschenfrst SympathyMaelGroschenfuerst.Mod(iSympathyMod) ElseIf sympathyBase == _00E_SC_Dijaam SympathyDijaam.Mod(iSympathyMod) ElseIf sympathyBase == _00E_SC_Tharael SympathyTharael.Mod(iSympathyMod) ElseIf sympathyBase == _00E_MQ11c_Ryneus SympathyRyneus.Mod(iSympathyMod) ElseIf sympathyBase == _00E_MC_Yuslan SympathyYuslan.Mod(iSympathyMod) ElseIf sympathyBase == _00E_FS_NQ02_Esme SympathyEsme.Mod(iSympathyMod) EndIf If bIsFlirt If sympathyBase == _00E_MC_Jespar JesparFlirtCounter.SetValueInt(JesparFlirtCounter.GetValueInt() + 1) ElseIf sympathyBase == _00E_MC_Calia CaliaFlirtCounter.SetValueInt(CaliaFlirtCounter.GetValueInt() + 1) ElseIf sympathyBase == _00E_SC_Dijaam DijaamFlirtCounter.SetValueInt(DijaamFlirtCounter.GetValueInt() + 1) ElseIf sympathyBase == _00E_SC_Tharael TharaelFlirtCounter.SetValueInt(TharaelFlirtCounter.GetValueInt() + 1) EndIf EndIf String sActorName = sympathyBase.GetName() If !bStringOverride If (iSympathyMod > 0) && (iSympathyMod <= 5) _00E_Levelsystem_sApproves.Show() ; Debug.Notification(sActorName + sLevelsystemAppreciate + ".") ElseIf (iSympathyMod > 5) && (iSympathyMod <= 10) _00E_Levelsystem_sAppreciates.Show() ; Debug.Notification(sActorName + sLevelsystemAppreciateALot + ".") ElseIf (iSympathyMod > 10) && (iSympathyMod <= 20) _00E_Levelsystem_sAppreciatesALot.Show() ; Debug.Notification(sActorName + sLevelsystemApproves + ".") ElseIf (iSympathyMod < 0) && (iSympathyMod >= -5) _00E_Levelsystem_sDislikes.Show() ; Debug.Notification(sActorName + sLevelsystemDislikes + ".") ElseIf (iSympathyMod < -5) && (iSympathyMod >= -10) _00E_Levelsystem_sHurt.Show() ; Debug.Notification(sActorName + sLevelsystemOffended + ".") ElseIf (iSympathyMod < -10) && (iSympathyMod >= -20) _00E_Levelsystem_sVeryHurt.Show() ; Debug.Notification(sActorName + sLevelsystemVeryOffended + ".") EndIf Else Debug.Notification(sActorName + sOverride) EndIf EndFunction ;===================================================================================== ; CAMERA ;===================================================================================== Function LockCamera() fCameraMaxDistance = Utility.GetINIFloat("fVanityModeMaxDist:Camera") Utility.SetINIFloat("fVanityModeMaxDist:Camera", Utility.GetIniFloat("fVanityModeMinDist:Camera")) EndFunction Function UnlockCamera() Utility.SetINIFloat("fVanityModeMaxDist:Camera", fCameraMaxDistance) EndFunction ;===================================================================================== ; GLOBAL FUNCTIONS ;===================================================================================== Function Brawl(Actor pTarget, Actor pTargetFriend = None) BrawlKeyword.SendStoryEvent(None, pTarget, pTargetFriend) EndFunction function PlayerAIWalkStop() Global Game.ShowFirstPersonGeometry(True) Game.SetPlayerAIDriven(False) Game.EnablePlayerControls() endFunction function PlayerAIWalk(bool abLockedSight = True) Global Game.ShowFirstPersonGeometry(False) Game.SetPlayerAIDriven(True) If abLockedSight == True Game.DisablePlayerControls(true, true, true, true, true, true, true, true) ElseIf abLockedSight == False Game.DisablePlayerControls(true, true, true, False, true, true, true, true) EndIf endFunction Function DisableDialogueQuitting() Global {Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye.} if UI.IsMenuOpen("Dialogue Menu") if UI.GetBool("Dialogue Menu", "_root.DialogueMenu_mc.bEnableTab") != true ; Suspected non-Enderal dialoguemenu.swf replacer, rechecking value in order to be sure. UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", True) if UI.GetBool("Dialogue Menu", "_root.DialogueMenu_mc.bEnableTab") != true Debug.Notification("Detected incompatible dialoguemenu.swf!") endif endif endif UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", False) (Game.GetForm(0x10AA2) as Quest).RegisterForKey(1) ; Escape (Game.GetForm(0x10AA2) as Quest).RegisterForKey(15) ; Tab int iControllerKey = Input.GetMappedKey("Tween Menu", 0x02) if iControllerKey > -1 (Game.GetForm(0x10AA2) as Quest).RegisterForKey(iControllerKey) ; Controller endif EndFunction Function EnableDialogueQuitting() Global {Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye.} UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", True) UnregisterDialogQuitKey() EndFunction function UnregisterDialogQuitKey() Global (Game.GetForm(0x10AA2) as Quest).UnregisterForKey(1) (Game.GetForm(0x10AA2) as Quest).UnregisterForKey(15) int iControllerKey = Input.GetMappedKey("Tween Menu", 0x02) if iControllerKey > -1 (Game.GetForm(0x10AA2) as Quest).UnregisterForKey(iControllerKey) endif endfunction Event OnKeyDown(Int KeyCode) if UI.IsMenuOpen("Dialogue Menu") if ! UI.IsMenuOpen("MessageBoxMenu") if (Game.GetFormFromFile(0x163D, "Update.esm") as Message).Show() == 1 Game.QuitToMainMenu() endif endif else UnregisterDialogQuitKey() endif EndEvent Function RefreshFace() Global String facegen = "bUseFaceGenPreprocessedHeads:General" Utility.SetINIBool(facegen, False) Game.GetPlayer().QueueNiNodeUpdate() Utility.SetINIBool(facegen, True) EndFunction Function ShowHelpMessage(Message msg, Float fDuration = 5.0, String sEvent = "Empty") Global Message.ResetHelpMessage(sEvent) msg.ShowAsHelpMessage(sEvent, fDuration, 1.0, 1) EndFunction Function SafeMoveTo(ObjectReference refToMove, ObjectReference targetRef, Bool bFadeIn = False) Global ; A safer way to move an object reference to another ref than just MoveTo. ; Mostly for actors to take their intended positions. ; It's better for the actor to be already running a package that moves them to targetRef at the moment this function is called. refToMove.Disable() refToMove.MoveTo(targetRef) refToMove.Enable(bFadeIn) EndFunction Function SafeMoveTo_NoWait(ObjectReference refToMove, ObjectReference targetRef, Bool bFadeIn = False) Global ; A safer way to move an object reference to another ref than just MoveTo (without waiting for it to be fully enabled). ; Mostly for actors to take their intended positions. ; It's better for the actor to be already running a package that moves them to targetRef at the moment this function is called. refToMove.Disable() refToMove.MoveTo(targetRef) refToMove.EnableNoWait(bFadeIn) EndFunction Bool Function DistanceFailsafeMoveTo(ObjectReference refToMove, ObjectReference targetRef, Float fTooFarDistance) Global ; Moves refToMove to targetRef if refToMove is not within fTooFarDistance from targetRef. ; Mostly for character travel failsafes in scenes. ; Debug.Trace("FailsafeMoveTo: refToMove = " + refToMove + "; d = " + refToMove.GetDistance(targetRef)) If refToMove.GetDistance(targetRef) >= fTooFarDistance refToMove.MoveTo(targetRef) ; Debug.Trace("FailsafeMoveTo: refToMove = " + refToMove + " force-moved to marker") Return True Else Return False EndIf EndFunction Function WaitForReferenceToLoad(ObjectReference ref) Global Int maxIterationsToWait = 180 While ref.Is3DLoaded() == False && maxIterationsToWait > 0 ; Utility.Wait(0.02) maxIterationsToWait -= 1 EndWhile EndFunction Float Function NormalizeHour(Float fHour) Global If fHour >= 24.0 Return (fHour - 24.0) ElseIf fHour < 0.0 Return (fHour + 24.0) Else Return fHour EndIf EndFunction Bool Function HourIsInRange(Float fHour, Float fHourStart, Float fHourEnd) Global ; "Smart" test for fHour being withing a range. ; Works both with "day" ranges (e.g., 06:00- 20:00) and with "night" ranges (e.g., 21:00-06:00) fHour = NormalizeHour(fHour) fHourStart = NormalizeHour(fHourStart) fHourEnd = NormalizeHour(fHourEnd) If fHourStart <= fHourEnd ; Something like 06:00 - 20:00 Return (fHour >= fHourStart && fHour < fHourEnd) Else ; Something like 20:00 - 06:00 Return (fHour >= fHourStart || fHour < fHourEnd) EndIf EndFunction Function EnableReferenceFormList(FormList referenceList) Global Int nItems = referenceList.GetSize() Int i = 0 If nItems < 128 && nItems > 1 Form[] refArray = referenceList.ToArray() While i < nItems (refArray[i] as ObjectReference).EnableNoWait() i += 1 EndWhile Else While i < nItems (referenceList.GetAt(i) as ObjectReference).EnableNoWait() i += 1 EndWhile EndIf EndFunction Function DisableReferenceFormList(FormList referenceList) Global Int nItems = referenceList.GetSize() Int i = 0 If nItems < 128 && nItems > 1 Form[] refArray = referenceList.ToArray() While i < nItems (refArray[i] as ObjectReference).DisableNoWait() i += 1 EndWhile Else While i < nItems (referenceList.GetAt(i) as ObjectReference).DisableNoWait() i += 1 EndWhile EndIf EndFunction Float Function SetActorScale(Actor akActor, Float fNewScale) Global ; Sets the scale of akActor to fNewScale and returns the old scale. ; This is a workaround for GetScale() returning the cumulative scale of Race.Height * Actor.Scale for actors. ; So it results in a messed up scale if the value returned by GetScale() is used to revert the scale change for an actor whose race has a non-1.00 height (for example, HighElfRace) Float fOriginalScale = akActor.GetScale() akActor.SetScale(fNewScale) ; Now use the known fNewScale and the return of GetScale() to get the race height coeff, and apply that coeff to fOriginalScale to calculate the true actor's reference scale. Return fOriginalScale * fNewScale / akActor.GetScale() EndFunction Float Function AdjustTimePeriodByEngineTimerError(Float fUnadjustedPeriod) Global ; In SE, the game time runs slower than the real time by about 2.5/60 second Return fUnadjustedPeriod - (2.5 * Math.Floor(fUnadjustedPeriod) / 60.0) EndFunction Function PrintDebugMessage(String msg) Global ; Dummy to fix error messages in Papyrus.log about missing function EndFunction Function PDB(String msg) Global ; Dummy to fix error messages in Papyrus.log about missing function EndFunction ;===================================================================================== ; GENERAL NON-GLOBAL FUNCTIONS ;===================================================================================== Function RemoveSilence() _00E_SilenceTransitionLowPriority02.Remove() _00E_Music_Special_MQ12b_Samael.Remove() _00E_SilenceLongTransitionHighPriority.Remove() _00E_SilenceTransitionLowPriority.Remove() _00E_SilenceTransitionHighPriority.Remove() _00E_SilenceAbruptHighPriority.Remove() _00E_Music_Special_TavernSilence.Remove() AudioCategoryAMB.UnMute() AudioCategoryAMBr.UnMute() AudioCategorySFX.UnMute() EndFunction Function RemoveCombatSoundtracks() int iIndex = _00E_MUS_AllCombatSoundtracks.GetSize() while iIndex > 0 iIndex -= 1 MusicType musicToRemove = _00E_MUS_AllCombatSoundtracks.GetAt(iIndex) as MusicType musicToRemove.Remove() endwhile EndFunction Function ShowFailedMessage(String companionName = "Jespar") if companionName == "Jespar" && _00E_DisableQuestTutorials.GetValueInt() == 0 _00E_Tutorial_Companions02_Jespar.Show() ElseIf _00E_DisableQuestTutorials.GetValueInt() == 0 _00E_Tutorial_Companions02_Calia.Show() EndIf EndFunction Function ShowBrawlTutorial() If _00E_DisableSkillTutorials.GetValueInt() == 0 Message.ResetHelpMessage("Brawl") _00E_Tutorial_Brawl.ShowAsHelpMessage("Brawl", 3, 3, 1) EndIf EndFunction Function PriestHeal() {Called in dialoges with priests} PlayerREF.RestoreActorValue("Health", PlayerREF.GetAV("Health")) _00E_PriestCureDiseases.Cast(PlayerREF, PlayerREF) EndFunction Function TeleportNPC(Actor NPCToTeleport, ObjectReference TeleportTarget) {Teleport an NPC, with animations and FX} Weapon weap01 = NPCToTeleport.GetEquippedWeapon(0) Weapon weap02 = NPCToTeleport.GetEquippedWeapon(1) If weap01 != None NPCToTeleport.UnEquipItem(weap01) EndIf If weap02 != None NPCToTeleport.UnEquipItem(weap02) EndIf NPCToTeleport.PlayIdle(IdleMagic_01) _00E_TeleportCastSound.Play(NPCToTeleport) Wait(3) if NPCToTeleport.GetActorBase().GetSex() == 0 NPCToTeleport.PlayIdle(IdleT02AscendMale) Else NPCToTeleport.PlayIdle(IdleT02AscendFemale) EndIf _00E_MagicProtectionSpellM.Play(NPCToTeleport) Wait(4) TimeFadeOut01FXS.Play(NPCToTeleport) Wait(2) _00E_A2_Ghostwalk_TeleportDoneSound.Play(NPCToTeleport) ObjectReference TeleportFXMarker = NPCToTeleport.PlaceAtMe(XMarkerHeading, 1) TeleportFXMarker.MoveTo(NPCToTeleport, 0.0, 0.0, 100.0) ObjectReference FXExplosion = TeleportFXMarker.PlaceAtMe(_00E_TeleportExplosion, 1) _00E_NPCTeleportExplosionIMOD.Apply() Game.ShakeCamera(afStrength = 0.2) NPCToTeleport.MoveTo(TeleportTarget) Debug.sendAnimationEvent(NPCToTeleport, "IdleWebEnterInstant") NPCToTeleport.setActorValue("Variable03", 5) TimeFadeOut01FXS.Stop(NPCToTeleport) If NPCToTeleport.Is3DLoaded() TimeFadeIn01FXS.Play(NPCToTeleport) EndIf Wait(0.5) NPCToTeleport.playidle(WebIdleExit) Wait(1) TimeFadeIn01FXS.Stop(NPCToTeleport) NPCToTeleport.setActorValue("Variable03", 0) If weap01 != None NPCToTeleport.EquipItem(weap01) EndIf If weap02 != None NPCToTeleport.EquipItem(weap02) EndIf Return EndFunction Function SetAllowIdleChatter(bool bAllow = False) if !bAllow bAllowIdleChatter = False SendModEvent("IdleChatterOff") Elseif bAllow bAllowIdleChatter = True EndIf EndFunction Function ShowSynergyMessage() _00E_Levelsystem_sSynergyDiscovered.Show() GiveEP(150) If _00E_AchievementsEnabled.GetValueInt() == 1 && !bUnlockedSynergyAchievement Steam.UnlockAchievement("END_SYNERGY_01") bUnlockedSynergyAchievement = true EndIf EndFunction Function SkipTimeToHour(Float fNewHourOfDay, Float fMinHoursToSkip = 0.0) ; Progresses the current in-game time to the desired hour (and optionally, by no less than fMinHoursToSkip hours), moving to the next day if needed Float fCurHour = GameHour.GetValue() If fNewHourOfDay <= fCurHour fNewHourOfDay += 24.0 ; Go to the next day EndIf If (fNewHourOfDay - fCurHour) < fMinHoursToSkip fNewHourOfDay += 24.0 ; Go to the next day EndIf GameHour.SetValue(fNewHourOfDay) SendModEvent("TimeSkip") EndFunction Function SkipHours(Float fHoursToSkip) ; Progresses the current in-game time by fHoursToSkip hours GameHour.SetValue(GameHour.GetValue() + fHoursToSkip) SendModEvent("TimeSkip") EndFunction ;===================================================================================== ; Player Teleport ;===================================================================================== Event OnUpdate() Game.EnablePlayerControls() EndEvent Function TeleportPlayer(ObjectReference TeleportTarget) Game.DisablePlayerControls(abCamSwitch = true) Wait(3) If PlayerREF.IsWeaponDrawn() PlayerREF.SheatheWeapon() EndIf Wait(2) TeleportIn() PlayerREF.MoveTo(TeleportTarget) TeleportOut() RefreshFace() EndFunction Function TeleportIn() Game.ForceThirdPerson() if Player.GetSex() == 0 PlayerREF.PlayIdle(IdleT02AscendMale) Else PlayerREF.PlayIdle(IdleT02AscendFemale) EndIf _00E_MagicProtectionSpellM.Play(PlayerREF) Wait(2.7) TimeFadeOut01FXS.Play(PlayerREF) Wait(1.3) _00E_TeleportImod.Apply() Wait(2) EndFunction Function TeleportOut() _00E_A2_Ghostwalk_TeleportDoneSound.Play(playerREF) PlayerREF.PlaceAtMe(_00E_NPCOorbayaTeleportExplosionBlue, 1) Debug.sendAnimationEvent(playerREF, "IdleWebEnterInstant") PlayerREF.setActorValue("Variable03", 5) TimeFadeOut01FXS.Stop(PlayerREF) TimeFadeIn01FXS.Play(PlayerREF) Wait(0.5) PlayerREF.playidle(WebIdleExit) TimeFadeIn01FXS.Stop(PlayerREF) PlayerREF.setActorValue("Variable03", 0) PlayerREF.DrawWeapon() Wait(3) Debug.SendAnimationEvent(PlayerREF, "IdleForceDefaultState") PlayerREF.PlayIdle(IdleForceDefaultState) PlayerREF.setActorValue("Variable03", 0) Game.EnablePlayerControls() _FS_Phasmalist_ControlQuest.MoveApparitionToPlayer() RegisterForSingleUpdate(2) EndFunction ;===================================================================================== ; FADE TO BLACK ;===================================================================================== Function FadeToBlackAndBack() FadeToBlackIMOD.Apply() Wait(2.8) FadeToBlackIMOD.PopTo(FadeToBlackHoldIMOD) Wait(1.9) FadeToBlackHoldIMOD.PopTo(FadeToBlackBackIMOD) EndFunction Function FadeToBlack() FadeToBlackIMOD.Apply() Wait(2.8) FadeToBlackIMOD.PopTo(FadeToBlackHoldImod) EndFunction Function FadeToBlackBack() FadeToBlackHoldImod.PopTo(FadeToBlackBackImod) EndFunction ;===================================================================================== ; FAKEHEADTRACK (unused?) ;===================================================================================== function FakeHeadtrackStart() _00E_HeadtrackGlobal.SetValueInt(1) game.SetPlayerAIDriven(true) game.DisablePlayerControls(true, true, true, true, true, true, true, false, 0) PlayerREF.AddPerk(_00E_VisionPerk) UpdateSpeed(PlayerREF) Wait(0.500000) PlayerREF.RemoveSpell(_00E_Vision_UpdateAb) endFunction function FakeHeadtrackEnd() _00E_HeadtrackGlobal.SetValueInt(0) game.EnablePlayerControls(true, true, true, true, true, true, true, true, 0) game.SetPlayerAIDriven(false) PlayerREF.RemovePerk(_00E_VisionPerk) UpdateSpeed(PlayerREF) Wait(0.500000) endFunction ;===================================================================================== ; VISION ;===================================================================================== 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 VisionLight.Delete() 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.GetActorValue("SpeedMult") PlayerREF.SetActorValue("SpeedMult", 35) UpdateSpeed(PlayerREF) 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) float fSpeedMultBefore = PlayerREF.GetAV("speedMult") PlayerREF.SetGhost(False) Game.DisablePlayerControls() PlayerREF.SetActorValue("SpeedMult", PlayerSpeed) PlayerREF.SetGhost(False) AudioCategoryFST.UnMute() UpdateSpeed(PlayerREF) Game.ShowFirstPersonGeometry(True) If !bMovementHasBeenLocked If PlayerVisionFailsaveMarker.GetDistance(PlayerREF) <= 1000 PlayerREF.MoveTo(PlayerVisionStartMarker) Elseif PlayerVisionFailsaveMarker.GetDistance(PlayerREF) >= 1000 PlayerREF.MoveTo(PlayerVisionFailsaveMarker) EndIf EndIf PlayerREF.SetGhost(False) Sound.StopInstance(VisionSound) MAGConjurePortalClose.Play(PlayerREF) _00E_SilenceAbruptHighPriority.Remove() PlayerREF.RemoveSpell(_00E_Vision_TimeSpell) _00E_VisionShaderParticles.Remove(0.5) _00E_VisionEndImod.ApplyCrossFade(1) Wait(0.5) PlayerREF.SetAV("speedMult", fPlayerSpeedBeforeVision) If PlayerREF.GetAV("speedMult") < 50 PlayerREF.SetAV("speedMult", 100) EndIf UpdateSpeed(PlayerREF) Game.EnablePlayerControls() Game.SetPlayerAIDriven(0) Game.ShowFirstPersonGeometry(True) _00E_SilenceAbruptHighPriority.Remove() EndFunction Function VisionEffectNoTimestop(Formlist RefsInvolved, Formlist ActorsToFreeze, 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 = RefsInvolved.GetSize() while iIndex > 0 iIndex -= 1 Actor VisionREF = RefsInvolved.GetAt(iIndex) as Actor if VisionREF.IsDisabled() VisionREF.EnableNoWait() EndIf VisionRef.SetAlpha(0.5) MS04MemoryFXBody01VFX.Play(VisionREF) 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, 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 iIndex = RefsInvolved.GetSize() while iIndex > 0 iIndex -= 1 Actor VisionREF = RefsInvolved.GetAt(iIndex) as Actor MS04MemoryFXBody01VFX.Stop(VisionREF) VisionRef.SetAlpha(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.GetAV("speedMult") < 50 PlayerREF.SetAV("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 ;===================================================================================== ; AREMOVE ITEMS SAFE ;===================================================================================== Function RemoveAllItemsSafeVersion(ObjectReference TransferToLoc = NONE) If Gold001 == NONE || _00E_AllAmmos == NONE Return EndIf RemoveItemsIncrementally(Gold001, TransferToLoc) Form[] arrows = _00E_AllAmmos.ToArray() Int i = 0 While i < arrows.Length RemoveItemsIncrementally(arrows[i], TransferToLoc) i += 1 EndWhile If TransferToLoc == NONE PlayerREF.removeAllItems(_00E_RemoveAllItems_TrashContainer, abRemoveQuestItems = false) _00E_RemoveAllItems_TrashContainer.removeAllItems() Else PlayerREF.RemoveAllItems(akTransferTo = TransferToLoc, abRemoveQuestItems = true) EndIf EndFunction Function RemoveItemsIncrementally(Form akItem, ObjectReference TransferToLoc) Int nCount = PlayerREF.GetItemCount(akItem) If nCount > 3000000 && akItem == Gold001 _00E_PleaseRemoveMoney.Show() EndIf While nCount > 0 PlayerREF.RemoveItem(akItem, 10000, true, TransferToLoc) nCount -= 10000 EndWhile EndFunction ;===================================================================================== ; ADDED IN FORGOTTEN STORIES ;===================================================================================== Function SlowMotion(float fDuration = 5.0, bool bSound = true) PlayerREF.AddSpell(_00E_FS_NQR05_SlowMotionSP, False) if bSound _00E_FS_NQR05_SlowMotion_IntroM.Play(PlayerREF) endif Wait(fDuration) if bSound _00E_FS_NQR05_SlowMotion_OutroM.Play(PlayerREF) endif PlayerREF.RemoveSpell(_00E_FS_NQR05_SlowMotionSP) EndFunction Function UnsummonApparitionIfExists() Global _FS_Phasmalist_ControlQuest.UnsummonApparitionIfExists() EndFunction Function EndWerewolfModeWhenTransformed() Global ; This function ends the werewolf mode if the player is currently transformed, with no penalties. _FS_TheriantrophistControlQuest.TransformBackIfTransformed() ; Links to Theriantrophist script. EndFunction Function SetNPCAsCompanion(Actor akActor, bool bCompanion = True, int iCompanionHealth = 100, int iCompanionStamina = 100, int iCompanionMagicka = 100) Global ;Sets an NPC as companion, showing his health bar, making him friendly, unflagging him as ghost. Does the opposite when bCompanion is set to false. ;Additionally sets the AVs Health, Stamina, Magicka for the NPC companion If bCompanion akActor.SetRelationshipRank(Game.GetForm(0x14) as Actor, 3) akActor.SetGhost(False) akActor.getActorbase().SetEssential(true) ; just in case, had trouble with FS_NQR05 akActor.SetPlayerTeammate(True) akActor.IgnoreFriendlyHits() akActor.SetActorValue("Health", iCompanionHealth) akActor.SetActorValue("Stamina", iCompanionStamina) akActor.SetActorValue("Magicka", iCompanionMagicka) HealthBarManager.Show(akActor) Else akActor.SetGhost(True) akActor.getActorbase().SetEssential(true) ; just in case, had trouble with FS_NQR05 akActor.ResetHealthAndLimbs() akActor.SetPlayerTeammate(False) akActor.IgnoreFriendlyHits(False) HealthBarManager.Hide(akActor) EndIf EndFunction Function StartVoicedLetter(MusicType MTVoicedLetter) MTToRemove = MTVoicedLetter RegisterForMenu("Book Menu") MTVoicedLetter.Add() EndFunction Event OnMenuClose(String MenuName) If MenuName == "Book Menu" MTToRemove.Remove() UnregisterForMenu("Book Menu") EndIf EndEvent ; SKILL BOOKS Message Property _00E_SkillbookWarning Auto Bool _SkillBookReadLocked = False Function _ReadSkillBook(String skillName, Int skillTopLimit, Form bookItem, Message msgSkillIncrease, GlobalVariable availablePoints, Message msgNoPoints) Message failMsg = None While _SkillBookReadLocked WaitMenuMode(0.1) EndWhile _SkillBookReadLocked = True ; DO NOT FORGET TO FALSE _SkillBookReadLocked ON RETURN If availablePoints.GetValue() >= 1 Int curSkill = PlayerREF.GetBaseActorValue(skillName) as Int If curSkill >= skillTopLimit failMsg = _00E_Levelsystem_sSkillTooWellDeveloped ElseIf curSkill >= (skillTopLimit - 25) || (_00E_SkillbookWarning.Show() == 0) ; If cur. skill is within the book's limit or the player says "Yes" ; Do skill increase curSkill += 1 PlayerREF.SetActorValue(skillName, curSkill) availablePoints.Mod(-1) _SkillBookReadLocked = False msgSkillIncrease.Show(1, curSkill) Return EndIf Else ; availablePoints < 1 failMsg = msgNoPoints EndIf ; Processing failed read _SkillBookReadLocked = False If failMsg != None failMsg.Show() EndIf PlayerREF.AddItem(bookItem, 1, True) EndFunction Function ReadPrimarySkillBook(String skillName, Int skillTopLimit, Form bookItem, Message msgSkillIncrease) _ReadSkillBook(skillName, skillTopLimit, bookItem, msgSkillIncrease, Lernpunkte, _00E_Levelsystem_sNoMoreLearningPoints) EndFunction Function ReadCraftingSkillBook(String skillName, Int skillTopLimit, Form bookItem, Message msgSkillIncrease) _ReadSkillBook(skillName, skillTopLimit, bookItem, msgSkillIncrease, Handwerkspunkte, _00E_Levelsystem_sNoMoreCraftingPoints) EndFunction Function ReadMemorySkillBook(String sClass, Int iTier, Message talentMessage, float fRecoveryTime02, float fRecoveryTime03, Potion PotionItem, Shout TaughtTalent, WordOfPower Word01, WordOfPower Word02, WordOfPower Word03, Perk Perk01, Perk Perk02, Perk Perk03) While _MemoryBookReadLocked WaitMenuMode(0.1) EndWhile _MemoryBookReadLocked = True int iButton = talentMessage.Show() if iButton == 0 if iTier == 1 iRequiredPoints = iPointRequirementTier01 Elseif iTier == 2 iRequiredPoints = iPointRequirementTier02 Else iRequiredPoints = iPointRequirementTier03 EndIf if RequirementsMetMemoryBook(iTier, Perk01, Perk02, Perk03, sClass) TeachTalent(iTier, TaughtTalent, Perk01, Perk02, Perk03, Word01, Word02, Word03, fRecoveryTime02, fRecoveryTime03) Else if bValidSkilllevel Message messageToShow = _00E_FS_A3_sMageClassName if sClass == "Rogue" messageToShow = _00E_FS_A3_sRogueClassName Elseif sClass == "Warrior" messageToShow = _00E_FS_A3_sWarriorClassName EndIf Debug.Notification(_00E_FS_A3_sYouNeedSkillpoints.GetName() + " " + iRequiredPoints + _00E_FS_A3_sIn.GetName() + messageToShow.GetName() + _00E_FS_A3_sToUnlockThisClass.GetName()) EndIf PlayerREF.AddItem(PotionItem, 1, true) EndIf _MemoryBookReadLocked = False Else PlayerREF.AddItem(PotionItem, 1, true) _MemoryBookReadLocked = False Return EndIf EndFunction bool Function RequirementsMetMemoryBook(int iTier, Perk Perk01, Perk Perk02, Perk Perk03, string sClass) Formlist ClassFormList01 Formlist ClassFormList02 Formlist ClassFormList03 if (iTier == 3 && !PlayerREF.HasPerk(Perk02)) || (iTier == 2 && !PlayerREF.HasPerk(Perk01)) _00E_FS_A3_NeedToLearnOtherLevels.Show() bValidSkilllevel = False Return False Elseif (iTier == 1 && PlayerREF.HasPerk(Perk01)) || (iTier == 2 && PlayerREF.HasPerk(Perk02)) || (iTier == 3 && PlayerREF.HasPerk(Perk03)) _00E_FS_A3_AlreadyKnowThisLevel.Show() bValidSkilllevel = False Return False Else bValidSkilllevel = True if sClass == "Rogue" ClassFormList01 = EspionagePerks ClassFormList02 = TrickeryPerks ClassFormList03 = VagabondPerks Elseif sClass == "Warrior" ClassFormList01 = BastionPerks ClassFormList02 = DerwishPerks ClassFormList03 = RagePerks Elseif sClass == "Mage" ClassFormList01 = ElementalismPerks ClassFormList02 = LifeAndDeathPerks ClassFormList03 = ManipulationPerks EndIf int iTotalPointsInRequiredClass = (PlayerSkillMenu.GetPointsInClass(ClassFormList01) + PlayerSkillMenu.GetPointsInClass(ClassFormList02) + PlayerSkillMenu.GetPointsInClass(ClassFormList03)) if iTotalPointsInRequiredClass >= iRequiredPoints Return True Else Return False EndIf EndIf EndFunction Function TeachTalent(int iLevel, Shout TaughtTalent, Perk Perk01, Perk Perk02, Perk Perk03, WordOfPower Word01, WordOfPower Word02, WordOfPower Word03, float fRecoveryTime02, float fRecoveryTime03) if iLevel == 1 PlayerREF.AddPerk(Perk01) PlayerREF.AddShout(TaughtTalent) Game.UnlockWord(Word01) Game.TeachWord(Word01) Elseif iLevel == 2 PlayerREF.AddPerk(Perk02) Game.UnlockWord(Word02) Game.TeachWord(Word02) SetRecoveryTimeMemoryBook(2, TaughtTalent, fRecoveryTime02, fRecoveryTime03) Else PlayerREF.AddPerk(Perk03) Game.UnlockWord(Word03) Game.TeachWord(Word03) SetRecoveryTimeMemoryBook(3, TaughtTalent, fRecoveryTime02, fRecoveryTime03) EndIf TalentPoints.Mod(-1) If _00E_AchievementsEnabled.GetValueInt() == 1 Steam.UnlockAchievement("END_TALENT_BOOK_01") EndIf EndFunction Function SetRecoveryTimeMemoryBook(int iWord, Shout TaughtTalent, float fRecoveryTime02, float fRecoveryTime03) {This function handles the issue of cooldowns not depending on the value in the CK but on the duration the player presses the [Shout] key on his keyboard.} If iWord == 2 TaughtTalent.SetNthRecoveryTime(0, fRecoveryTime02) TaughtTalent.SetNthRecoveryTime(1, fRecoveryTime02) Else TaughtTalent.SetNthRecoveryTime(0, fRecoveryTime03) TaughtTalent.SetNthRecoveryTime(1, fRecoveryTime03) TaughtTalent.SetNthRecoveryTime(2, fRecoveryTime03) EndIf EndFunction ; EQUIPPING SETS Function OnArmorSetBonusAdded(Bool bFullSet) Sound.SetInstanceVolume(MAGIllusionCharm.Play(PlayerREF), 0.4) ; Play MAGIllusionCharm at lower volume If bFullSet && bSetAchievementUnlocked == False && _00E_AchievementsEnabled.GetValueInt() == 1 Steam.UnlockAchievement("END_SET_01") bSetAchievementUnlocked = True EndIf EndFunction Function OnArmorSetBonusRemoved() _00E_ArmorSetScript_sSetBonusRemoved.Show() EndFunction Float fDefaultHeadTrackTimerOldValue = 0.0 Float fStayHeadTrackTimerOldValue = 0.0 Function StopRandomHeadTracking() ; Raise "change headtrack target" timers a lot so the NPCs would stare at what the scene tells them, without randomly switching to the player or other NPCs If fDefaultHeadTrackTimerOldValue == 0.0 fDefaultHeadTrackTimerOldValue = Game.GetGameSettingFloat("fAIHoldDefaultHeadTrackTimer") Game.SetGameSettingFloat("fAIHoldDefaultHeadTrackTimer", 1000.0) EndIf If fStayHeadTrackTimerOldValue == 0.0 fStayHeadTrackTimerOldValue = Game.GetGameSettingFloat("fAIStayonScriptHeadtrack") Game.SetGameSettingFloat("fAIStayonScriptHeadtrack", 1000.0) EndIf EndFunction Function ResumeRandomHeadTracking() If fDefaultHeadTrackTimerOldValue > 0.0 Game.SetGameSettingFloat("fAIHoldDefaultHeadTrackTimer", fDefaultHeadTrackTimerOldValue) fDefaultHeadTrackTimerOldValue = 0.0 EndIf If fStayHeadTrackTimerOldValue > 0.0 Game.SetGameSettingFloat("fAIStayonScriptHeadtrack", fStayHeadTrackTimerOldValue) fStayHeadTrackTimerOldValue = 0.0 EndIf EndFunction ;===================================================================================== ; PROPERTIES ;===================================================================================== int Property iMajorClassIndex Auto Conditional Hidden int Property iMinorClassIndex Auto Conditional Hidden bool Property bAllowIdleChatter = True Auto Conditional Hidden ; Set this to true when NPCs shouldn't Idle around float Property fPlayerSpeedBeforeVision Auto Hidden float Property fCameraMaxDistance Auto Hidden float Property fBaseGravity Auto Hidden ;Actor akPlayerCopy Sound Property _00E_FS_NQR05_SlowMotion_IntroM Auto Sound Property _00E_FS_NQR05_SlowMotion_OutroM Auto ActorBase Property _00E_MC_Jespar Auto ActorBase Property _00E_MC_Calia Auto ActorBase Property _00E_SC_Tharael Auto ActorBase Property _00E_SC_Dijaam Auto ActorBase Property _00E_MQ11c_Ryneus Auto ActorBase Property _00E_CapitalCityMaelGroschenfrst Auto ActorBase Property _00E_MC_Yuslan Auto ActorBase Property _00E_FS_NQ02_Esme Auto GlobalVariable Property SympathyTharael Auto GlobalVariable Property SympathyJespar Auto GlobalVariable Property SympathyDijaam Auto GlobalVariable Property SympathyMaelGroschenfuerst Auto GlobalVariable Property SympathyCalia Auto GlobalVariable Property SympathyYuslan Auto GlobalVariable Property SympathyEsme Auto GlobalVariable Property CaliaFlirtCounter Auto GlobalVariable Property DijaamFlirtCounter Auto GlobalVariable Property JesparFlirtCounter Auto GlobalVariable Property TharaelFlirtCounter Auto GlobalVariable Property _00E_AchievementsEnabled Auto ReferenceAlias Property Levelsystem_SympathyActor Auto Formlist Property _00E_AllAmmos Auto MiscObject Property Gold001 Auto Message Property _00E_PleaseRemoveMoney Auto GlobalVariable Property GameHour Auto ;--------------------------------------VISION----------------------------------- float PlayerSpeed int VisionSound Perk Property _00E_VisionPerk Auto SoundCategory Property AudioCategoryFST Auto VisualEffect Property MS04MemoryFXBody01VFX Auto ImageSpaceModifier Property _00E_VisionStartImod Auto ImageSpaceModifier Property _00E_VisionIMOD Auto ImageSpaceModifier Property _00E_VisionEndImod Auto Sound Property _00E_VisionLPM Auto Sound Property MagRacialBattlecryFire Auto Sound Property MAGConjurePortalClose Auto Spell Property _00E_Vision_UpdateAb Auto MusicType Property _00E_SilenceTransitionLowPriority02 Auto MusicType Property _00E_Music_Special_MQ12b_Samael Auto MusicType Property _00E_SilenceLongTransitionHighPriority Auto MusicType Property _00E_SilenceTransitionLowPriority Auto MusicType Property _00E_SilenceTransitionHighPriority Auto MusicType Property _00E_SilenceAbruptHighPriority Auto MusicType Property _00E_Music_Special_TavernSilence Auto Formlist Property _00E_MUS_AllCombatSoundtracks Auto ;--------------------------------------LEVELSYSTEM----------------------------------- GlobalVariable Property Handwerkspunkte auto GlobalVariable Property SympathyRyneus auto GlobalVariable Property Lernpunkte auto GlobalVariable Property TalentPoints auto GlobalVariable Property _00E_DisableQuestTutorials Auto GlobalVariable Property _00E_DisableSkillTutorials Auto Keyword Property BrawlKeyword Auto Message Property _00E_FS_A3_sYouNeedSkillpoints Auto Message Property _00E_FS_A3_sIn Auto Message Property _00E_FS_A3_sToUnlockThisClass Auto Message Property _00E_FS_A3_sWarriorClassName Auto Message Property _00E_FS_A3_sRogueClassName Auto Message Property _00E_FS_A3_sMageClassName Auto Message Property _00E_FS_A3_NeedToLearnOtherLevels Auto Message Property _00E_FS_A3_AlreadyKnowThisLevel Auto int iPointRequirementTier01 = 5 int iPointRequirementTier02 = 10 int iPointRequirementTier03 = 15 int iRequiredPoints bool bValidSkilllevel Formlist Property EspionagePerks Auto Formlist Property TrickeryPerks Auto Formlist Property VagabondPerks Auto Formlist Property BastionPerks Auto Formlist Property DerwishPerks Auto Formlist Property RagePerks Auto Formlist Property ElementalismPerks Auto Formlist Property LifeAndDeathPerks Auto Formlist Property ManipulationPerks Auto _00E_Game_SkillmenuSC Property PlayerSkillMenu Auto Bool _MemoryBookReadLocked = False ;-------------------------------------TELEPORT SCRIPT----------------------------------- VisualEffect Property MGTeleportInEffect Auto Actor Property PlayerREF Auto ActorBase Property Player Auto EffectShader Property TimeFadeOut01FXS Auto EffectShader Property TimeFadeIn01FXS Auto Explosion Property _00E_TeleportExplosion Auto Explosion Property _00E_NPCOorbayaTeleportExplosionBlue Auto Idle Property WebIdleExit Auto Idle Property IdleT02AscendMale Auto Idle Property IdleT02AscendFemale Auto Idle Property IdleForceDefaultState Auto Static Property XMarkerHeading Auto Sound Property _00E_MagicProtectionSpellM Auto Sound Property _00E_A2_Ghostwalk_TeleportDoneSound Auto Sound Property _00E_TeleportCastSound Auto Message Property _00E_Tutorial_Brawl Auto Message Property _00E_Tutorial_Companions02_Jespar Auto Message Property _00E_Tutorial_Companions02_Calia Auto Message Property _00E_Levelsystem_sApproves Auto Message Property _00E_Levelsystem_sAppreciates Auto Message Property _00E_Levelsystem_sAppreciatesALot Auto Message Property _00E_Levelsystem_sDislikes Auto Message Property _00E_Levelsystem_sHurt Auto Message Property _00E_Levelsystem_sVeryHurt Auto Message Property _00E_Levelsystem_sDoesNotTrust Auto Message Property _00E_Levelsystem_sExtremelyHurt Auto Message Property _00E_Levelsystem_sIsHurt Auto Message Property _00E_Levelsystem_sSynergyDiscovered Auto Message Property _00E_Levelsystem_sNoMoreCraftingPoints Auto Message Property _00E_Levelsystem_sNoMoreLearningPoints Auto Message Property _00E_Levelsystem_sSkillTooWellDeveloped Auto Message Property _00E_Levelsystem_sSkillBy Auto Message Property _00E_Levelsystem_sSkillTo Auto Message Property _00E_Levelsystem_sSkillFrom Auto Message Property _00E_Levelsystem_sSkillIncreased Auto Message Property _00E_Levelsystem_sAbilityEnemyLevelTooHigh Auto Message Property _00E_Levelsystem_sAbilityEnemyHasToBeAlive Auto Message Property _00E_Levelsystem_sEnemyHasToBeDead Auto Message Property _00E_Levelsystem_sAbilityEnemyTooFarAway Auto Message Property _00E_Levelsystem_sAbilityTargetImmune Auto Message Property _00E_Levelsystem_sAbilityMarkingRemoved Auto Message Property _00E_Levelsystem_sEnemyMarked Auto Message Property _00E_Levelsystem_sAbilityStanceStarted Auto Message Property _00E_Levelsystem_sAbilityStanceEnded Auto Message Property _00E_Levelsystem_sAbilityStanceQyrai Auto Message Property _00E_Levelsystem_sAbilityStanceSkaragg Auto Message Property _00E_Levelsystem_sEnemyAlreadyMarked Auto Message Property _00E_Levelsystem_sEldritchBloodVictimMarked Auto Message Property _00E_Levelsystem_sEldritchBloodAttackTargetMarked Auto Message Property _00E_Levelsystem_sEldritchBloodAttackVictimMarkingRemoved Auto Message Property _00E_Levelsystem_sEldritchBloodVictimMarkingRemoved Auto Message Property _00E_Levelsystem_sGhostwalkEnemyTooCloseToWall Auto Message Property _00E_DialogueQuitGame Auto ObjectReference Property PlayerVisionStartMarker Auto Hidden ObjectReference Property PlayerVisionFailsaveMarker Auto Hidden ObjectReference Property VisionLight Auto Hidden ObjectReference Property _00E_RemoveAllItems_TrashContainer Auto Idle Property IdleMagic_01 Auto Spell Property _00E_Vision_NoTimeSpell Auto Spell Property _00E_Vision_NoTimeSubtleSpell Auto Spell Property _00E_Vision_TimeSpell Auto Spell Property _00E_PriestCureDiseases Auto Spell Property _00E_FS_NQR05_SlowMotionSP Auto GlobalVariable Property _00E_HeadtrackGlobal Auto ImageSpaceModifier Property FadeToBlackIMOD Auto ImageSpaceModifier Property FadeToBlackHoldIMOD Auto ImageSpaceModifier Property FadeToBlackBackIMOD Auto ImageSpaceModifier Property _00E_NPCTeleportExplosionIMOD Auto ImageSpaceModifier Property _00E_TeleportImod Auto ImageSpaceModifier Property _00E_VisionStartTimestopIMOD Auto ImageSpaceModifier Property _00E_MQ16_VisionIMOD Auto ShaderParticleGeometry Property _00E_VisionShaderParticles Auto SoundCategory Property AudioCategoryAMB Auto SoundCategory Property AudioCategoryAMBr Auto SoundCategory Property AudioCategorySFX Auto Static Property XMarker Auto int doOnce int done float SpeedBefore bool bUnlockedSynergyAchievement ;for re-equipping the player after the bathouse scene Armor PlayerHelmet Armor PlayerCuirass Armor PlayerGauntlets Armor PlayerBoots Armor PlayerRing01 Armor PlayerRing02 Armor PlayerNecklace Weapon RightHandWeapon Weapon LeftHandWeapon Spell RightHandSpell Spell LeftHandSpell Armor Shield ;for VoiceLetters MusicType MTToRemove ;for sets Sound Property MAGIllusionCharm Auto Message Property _00E_ArmorSetScript_sSetBonusRemoved Auto bool bSetAchievementUnlocked = false