478 lines
12 KiB
Plaintext
478 lines
12 KiB
Plaintext
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 |