scriptname _00E_MQ08_Questfunctions extends Quest Conditional Import _00E_QuestFunctions ;===================================================================================== ; FUNCTIONS ;===================================================================================== Function JesparGivePresent() PlayerREF.AddItem(_00E_Lehrbuch_Plus2Skillpoints, 1) EndFunction Function PortFollowerToNebelhaim() Levelsystem.RemoveSilence() _00E_MC_JesparREF.MoveTo(MQ08PortMarker) If _00E_MC_JesparREF.IsDisabled() _00E_MC_JesparREF.Enable() EndIf _00E_MC_JesparREF.EvaluatePackage() EndFunction Function TeleportJesparToTemple() if _00E_MC_JesparREF.GetDistance(PlayerREF) >= 800 _00E_MC_JesparREF.MoveTo(MQ09a_JesparTemplePortMarkerREF) EndIf EndFunction Function PortKontantinToNebelaim() _00E_MC_KonstantinREF.MoveTO(MQ08PortMarker) _00E_MC_JesparREF.EvaluatePackage() _00E_MC_KonstantinREF.EvaluatePackage() EndFunction Function JesparAndConstantineNebelhaimFailsave() _00E_MC_JesparREF.MoveTo(MQ08PortMarker) _00E_MC_KonstantinREF.MoveTO(MQ08PortMarker) EndFunction Function EnableFollower() MQ09a_FollowStartBoxREF.Enable() SetNPCAsCompanion(_00E_MC_JesparREF, True, 350, 400, 100) EndFunction Function FollowerStopBeforeTemple() SetNPCAsCompanion(_00E_MC_JesparREF, False) EndFunction Function OpenDoor() MQ09aDoorRathaus.Lock(False) MQ09aDoorRathaus.BlockActivation(False) EndFunction Function KonstantinMadnessSceneFailsave() _00E_MC_KonstantinREF.Reset() _00E_MC_KonstantinREF.MoveTo(MQ08_KonstantinPortMarker02REF) MQ08_IntoTheDeep_SceneTempleOutside.Stop() If !MQ08_IntoTheDeep_SceneTempleInside.IsPlaying() MQ08_IntoTheDeep_SceneTempleInside.ForceStart() EndIf EndFunction Function PortKonstantin() _00E_MC_KonstantinREF.MoveTo(MQ08PortKonstantinMarker) EndFunction Function AddMadnessMusic() _00E_Music_Special_Event_Dark.Add() _00E_SilenceTransitionHighPriority.Add() EndFunction Function JesparEVP() Utility.Wait(2.0) _00E_MC_JesparREF.EvaluatePackage() EndFunction Function GoToTrain() Game.DisablePlayerControls() Game.FadeOutGame(true, true, 1, 4) Utility.Wait(2) FadeToBlackHoldImod.Apply() MQ08TombKonstantin.Enable() _00E_MC_KonstantinREF.Disable() PlayerREF.MoveTo(MQ08PlayerSpawnTomb) Utility.Wait(2) _00E_MC_JesparREF.Disable() _00E_MC_JesparREF.MoveTo(MQ08JesparSpawnTomb) _00E_MC_JesparREF.Enable() Utility.Wait(3) FadeToBlackBackImod.Apply() FadeToBlackHoldImod.Remove() Utility.Wait(3) Game.EnablePlayerControls() EndFunction Function SetJesparCombatGlobal(int iValue) JesparNoCombatComments.SetValue(iValue) EndFunction Function AddMusic() _00E_Music_Special_Character_Jespar_Long.Add() EndFunction Function RemoveMusic() _00E_Music_Special_Character_Jespar_Long.Remove() EndFunction function PlayerAIWalk(bool abLockedSight = True) if abLockedSight == True Game.SetPlayerAIDriven(True) Game.DisablePlayerControls(true, true, true, true, true, true, true, true) NewPlayerRef.ApplyHavokImpulse(1.0, 1.0, 0.0, 25.0) ElseIf abLockedSight == False Game.SetPlayerAIDriven(True) Game.DisablePlayerControls(true, true, true, False, true, true, true, true) EndIf endFunction function PlayerStopAIWalk() Game.SetPlayerAIDriven(false) Game.EnablePlayerControls(true, true, true, true, true, true, true, true) endFunction Function KonstantinStartCombat() SetNPCAsCompanion(_00E_MC_JesparREF, True, 350, 400, 100) ;We also need to change Constanine's stats, since they were adjusted upon entering the Living Temple _00E_MC_KonstantinREF.SetAV("Health", 850) _00E_MC_KonstantinREF.SetAV("Stamina", 850) _00E_MC_KonstantinREF.SetAV("Magicka", 240) _00E_SilenceTransitionHighPriority.Remove() _00E_Music_Special_Event_Dark.Remove() _00E_Music_Combat_Epic.Add() Game.EnablePlayerControls() Utility.Wait(0.5) _00E_MC_KonstantinREF.SetGhost(False) _00E_MC_KonstantinREF.SetActorValue("Aggression", 3) _00E_MC_KonstantinREF.StartCombat(PlayerREF) _00E_MC_JesparREF.StartCombat(_00E_MC_KonstantinREF) EndFunction Function KillKonstantin() _00E_MC_KonstantinREF.GetActorBase().SetEssential(False) _00E_MC_KonstantinREF.Kill(PlayerREF) SetNPCAsCompanion(_00E_MC_JesparREF, False) SetStage(155) EndFunction Function RemoveCombatMusic() _00E_Music_Combat_Epic.Remove() EndFunction Function HouseSceneDisableControls() Game.DisablePlayerControls() EndFunction Function StartSC06() Game.EnablePlayerControls() MQ08_IntoTheDeep_GoToTrain.Stop() MQ08_IntoTheDeep_GoToTrain2.ForceStart() If !MQ08_IntoTheDeep_GoToTrain2.IsPlaying() MQ08_IntoTheDeep_GoToTrain2 = Game.GetForm(0x000E1A26) as Scene MQ08_IntoTheDeep_GoToTrain2.ForceStart() EndIf EndFunction Function StartSC06_Failsave() If !MQ08_IntoTheDeep_GoToTrain2.IsPlaying() MQ08_IntoTheDeep_GoToTrain2.ForceStart() EndIf EndFunction Function StartSC07() MQ08_IntoTheDeep_GoToTrain3.ForceStart() If !MQ08_IntoTheDeep_GoToTrain3.IsPlaying() MQ08_IntoTheDeep_GoToTrain3 = Game.GetForm(0x000E1A12) as Scene MQ08_IntoTheDeep_GoToTrain3.ForceStart() EndIf EndFunction Function CreatePlayerCopy() NewPlayer = MQ08PlayerCloneMarker.PlaceActorAtMe(Player) NewPlayer.RemoveAllItems() NewPlayerRef = NewPlayer as Actor NewPlayer.Kill(PlayerREF) NewPlayerRef.RemoveAllItems() NewPlayerRef.ApplyHavokImpulse(1.0, 0.5, 0.5, 350.0) NewPlayerRef.SetOutfit(PrisonerPantsOutfit) EndFunction Function PlayStartSound() _00E_MQ09a_RailwayStartM.Play(PlayerREF) EndFunction Function JesparMoveFailsave() _00E_MC_JesparREF.MoveTo(MQ09a_SC06_JesparFailsaveMarkerREF) EndFunction Function AnotherTrainFailsave() ; Prevent the player from leaving the train, but makes Jespar ; enter it. if _00E_MC_JesparREF.GetParentCell() != PlayerREF.GetParentCell() if MQ09a_SC06_JesparFailsaveMarkerREF == None MQ09a_SC06_JesparFailsaveMarkerREF = Game.GetForm(0x00153B4F) as ObjectReference endif _00E_MC_JesparREF.MoveTo(MQ09a_SC06_JesparFailsaveMarkerREF) endif MQ08TrainDoorRef.SetLockLevel(255) MQ08TrainDoorRef.Lock() KillTrainStationEnemies() EndFunction Function StartTrainScene() MQ08_IntoTheDeep_GoToTrain4.ForceStart() If !MQ08_IntoTheDeep_GoToTrain4.IsPlaying() MQ08_IntoTheDeep_GoToTrain4 = Game.GetForm(0x000EA944) as Scene MQ08_IntoTheDeep_GoToTrain4.ForceStart() EndIf MQ08TrainDoorRef.BlockActivation(True) MQ09StaticDoor.enable() ; Give some time for MQ09StaticDoor to appear While MQ09StaticDoor.Is3DLoaded() == False ; Wait... EndWhile MQ08TrainDoorRef.Disable() If MQ08DwemerSound ; Gavrant: don't know why, but MQ08DwemerSound is currently NONE in the properties MQ08DwemerSound.enable() EndIf iTrainSound = _00E_MQ09a_RailwayLPM.Play(PlayerREF) While !Done Game.ShakeCamera(PlayerREF, Utility.RandomFloat(0.05, 0.1), 3) Utility.Wait(3) if GetStage() >= 220 Done = True EndIf EndWhile ;Deleting the new player. Otherwise certain events in scripts attached to the ActorBase Player get triggered a second time (e.g. OnActorAction in _00E_Game_TalentControlSC) NewPlayer.Delete() EndFunction Function CheckTrainScene() ; Failsave. Not sure if this works. If !MQ08_IntoTheDeep_GoToTrain4.IsPlaying() MQ08_IntoTheDeep_GoToTrain4 = Game.GetForm(0x000EA944) as Scene MQ08_IntoTheDeep_GoToTrain4.ForceStart() EndIf EndFunction Function RefreshCombatState() While _00E_MC_KonstantinREF.IsDead() == 0 || GetStage() >= 156 _00E_MC_KonstantinREF.StartCombat(_00E_MC_JesparREF) Utility.Wait(4) EndWhile EndFunction Function RemoveSoundtrack() _00E_Music_Combat_Epic.Remove() EndFunction Function OpenGate() MQ09a_SC07_RailwayGateREF.TranslateTo(MQ09a_SC07_RailwayGateREF.GetPositionX(), MQ09a_SC07_RailwayGateREF.GetPositionY(), (MQ09a_SC07_RailwayGateREF.GetPositionZ() + 250), 0, 0, 0, 100.0) _00E_DRSElevatorM.Play(MQ09a_SC07_RailwayGateREF) EndFunction Function KillTrainStationEnemies() ; Kill all skeleta in cell MQ08TempleUnderground. This is to avoid ; Jespar running out of the train. int iIndex = _00E_MQ09a_TrainStationEnemies.GetSize() while iIndex > 0 iIndex -= 1 Actor akKillMe = _00E_MQ09a_TrainStationEnemies.getAt(iIndex) as Actor if !akKillMe.IsDead() akKillMe.kill() endif endwhile EndFunction Function FadeToBlack() FadeToBlackImod.Apply() Utility.Wait(2) FadeToBlackHoldImod.Apply() FadeToBlackImod.Remove() EndFunction Function PrepareOstianTalk() _00E_QuestFunctions.PlayerAIWalk() MQ09a_SC08_PlayerBenchMarker = Game.GetForm(0x00150B74) as ObjectReference PlayerREF.MoveTo(MQ09a_SC08_PlayerBenchMarker) EndFunction Function FadeBack() JesparNoCombatComments.SetValueInt(0) If MQ09a_SC08_JesparLoungeMarker == None MQ09a_SC08_JesparLoungeMarker = Game.GetForm(0x00150B73) as ObjectReference EndIf _00E_MC_JesparREF.MoveTo(MQ09a_SC08_JesparLoungeMarker) Utility.Wait(2) FadeToBlackBackImod.Apply() FadeToBlackHoldImod.Remove() EndFunction Function StopTrainSound() Sound.StopInstance(iTrainSound) EndFunction Function JesparResetCombatComments() JesparNoCombatComments.SetValueInt(0) EndFunction ;===================================================================================== ; PROPERTIES ;===================================================================================== _00E_QuestFunctions Property Levelsystem Auto bool Done = false; bool Property bAvoidedQuestion Auto Conditional Hidden int iTrainSound Actor NewPlayerRef Actor NewPlayer Potion Property _00E_Lehrbuch_Plus2Skillpoints Auto ActorBase Property Player Auto Actor Property _00E_MC_JesparREF Auto Actor Property _00E_MC_KonstantinREF Auto Actor Property PlayerREF Auto FormList Property _00E_MQ09a_TrainStationEnemies Auto ObjectReference Property MQ08PortMarker Auto ObjectReference Property MQ08PortKonstantinMarker Auto ObjectReference Property MQ08TombKonstantin Auto ObjectReference Property MQ08PlayerSpawnTomb Auto ObjectReference Property MQ08JesparSpawnTomb Auto ObjectReference Property MQ08PlayerCloneMarker Auto ObjectReference Property MQ08DwemerSound Auto ObjectReference Property MQ09a_SC07_RailwayGateREF Auto ObjectReference Property MQ09aDoorRathaus Auto ObjectReference Property MQ09a_SC08_JesparLoungeMarker Auto ObjectReference Property MQ09a_SC08_PlayerBenchMarker Auto ObjectReference Property MQ09a_SC06_JesparFailsaveMarkerREF Auto ObjectReference Property MQ08TrainDoorRef Auto ObjectReference Property MQ09StaticDoor Auto ObjectReference Property MQ09a_FollowStartBoxREF Auto ObjectReference Property MQ09a_JesparTemplePortMarkerREF Auto ObjectReference Property MQ08_KonstantinPortMarker02REF Auto GlobalVariable Property JesparNoCombatComments Auto Sound Property _00E_DRSElevatorM Auto Sound Property _00E_MQ09a_RailwayLPM Auto Sound Property _00E_MQ09a_RailwayStartM Auto Scene Property MQ08_IntoTheDeep_GoToTrain Auto Scene Property MQ08_IntoTheDeep_GoToTrain2 Auto Scene Property MQ08_IntoTheDeep_GoToTrain3 Auto Scene Property MQ08_IntoTheDeep_GoToTrain4 Auto Scene Property MQ08_IntoTheDeep_SceneTempleInside Auto Scene Property MQ08_IntoTheDeep_SceneTempleOutside Auto Outfit Property PrisonerPantsOutfit Auto MusicType Property _00E_Music_Special_Event_Dark Auto MusicType Property _00E_Music_Combat_Epic Auto MusicType Property _00E_SilenceTransitionHighPriority Auto MusicType Property _00E_Music_Special_Character_Jespar_Long Auto ImageSpaceModifier Property FadeToBlackImod Auto ImageSpaceModifier Property FadeToBlackHoldImod Auto ImageSpaceModifier Property FadeToBlackBackImod Auto