4
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

432 lines
13 KiB

Scriptname MQ03_Functions extends Quest
; This is the script on quest MQ04 (Wave Taming).
Import Utility
Import Math
int function _GetScriptVersion() Global
return 1
endFunction
;=====================================================================================
; FUNCTIONS
;=====================================================================================
Function DisableBarrier()
MQ04Barriere.Disable()
MQ04_Rock02.Disable()
EndFunction
Function EnableLishari()
if !(Self.IsObjectiveCompleted(20))
Self.SetObjectiveDisplayed(20, False)
EndIf
_00E_MQ04_CrystalTouch.Play(MQ04_SC1_CrystalTrap)
Game.DisablePlayerControls(true, true, true, false, true, true, true, true)
Wait(0.4)
_00E_MC_LishariREF.Enable()
_00E_MC_LishariREF.MoveTo(MQ04_SC1_LishariAppearMarker)
MQ04_SC1_LishariAppears.ForceStart()
EndFunction
Function DetonateMines()
MQ04_SC1_CrystalTrap.PlaceAtMe(FXdustDropMedExplosion, 1)
MQ04_CrystalTrap02.PlaceAtMe(_00E_MQ04_CrystalExplosion, 1)
MQ04_CrystalTrap03.PlaceAtMe(_00E_MQ04_CrystalExplosion, 1)
MQ04_SC1_CrystalTrap.PlaceAtMe(_00E_MQ04_CrystalExplosion, 1)
MQ04_SC1_CrystalTrap.PlayImpactEffect(FXDragonLandingImpactSet, "crystaleffect01", 0, 0, -1, 90)
MQ04_CrystalTrap02.PlayImpactEffect(FXDragonLandingImpactSet, "crystaleffect01", 0, 0, -1, 90)
MAGShockExpImod.Apply()
ObjectReference KnockBackMarker = PlayerREF.PlaceAtMe(XMarkerHeading)
KnockBackMarker.MoveTo(PlayerRef, -(90.0 * Math.Sin(PlayerRef.GetAngleZ())), -(90.0 * Math.Cos(PlayerRef.GetAngleZ())), 0.0)
KnockBackMarker.KnockAreaEffect(1, 1024)
Game.ShakeCamera(afStrength = 2)
PlayerREF.PlayIdle(PlayerStagger)
MQ04_SC1_CrystalTrap.Disable()
KnockBackMarker.Delete()
Wait(3)
FadeToBlackBackImod.ApplyCrossFade()
Self.SetCurrentStageID(25)
EndFunction
Function UglyLishariFailsave()
If GetCurrentStageID() < 38
bDeadBodyFailsaveUsed = True
MQ04_SC3_DeadBodyComment.ForceStart()
Else
SetCurrentStageID(40)
EndIf
EndFunction
Function SetStageIfFailsaveUsed()
If bDeadBodyFailsaveUsed
SetCurrentStageID(40)
Else
Return
EndIf
EndFunction
Function StartFollowing()
_00E_MC_LishariREF.EvaluatePackage()
_00E_Func_SetNPCAsCompanion.SetNPCAsCompanion(_00E_MC_LishariREF, true, 200, 100, 200)
EndFunction
Function GivePlayerSpell()
PlayerREF.AddSpell(_00E_MQ04_FeuerloescherSpell)
EndFunction
Function StartSevfScene()
Sevf.GetActorReference().PlayIdle(IdleCowerEnter)
MQ04_SC4_SevfScreamsForHelp.ForceStart()
EndFunction
Function StartSC03()
_00E_Func_SetNPCAsCompanion.SetNPCAsCompanion(_00E_MC_LishariREF, false)
MQ04_SC3_DeadBodyComment.ForceStart()
EndFunction
Function KillSevf()
_00E_MAGBottleBreak.Play(MQ04_SC4_SevfKillBurner)
_00E_MAGFireballExplosionM.Play(MQ04_SC4_SevfKillBurner)
MQ04_SC4_SevfKillBurner.PlaceAtMe(FireBallExp01, 1)
MQ04_Sc4_SevfKillBurner.DisableNoWait()
MQ04_Sc4_SevfKillBurner.PushActorAway(Sevf.GetActorReference(), 18.0)
Sevf.GetActorReference().KillEssential(PlayerREF)
Game.ShakeCamera(afStrength = 0.3)
Utility.Wait(0.7)
_00E_MAGFXFireOilIgniteLow.Play(MQ04_SC4_SevfKillFire)
MQ04_SC4_SevfKillFire.Enable(True)
Self.SetObjectiveCompleted(65)
Self.SetObjectiveFailed(60)
EndFunction
Function SevfUseFlashpowder()
Sevf.GetReference().PlaceAtMe(_00E_MQ04_FlashpowderExplosion)
_00E_MQ04_FlashpowderFlash.Apply()
Utility.Wait(0.7)
Sevf.GetReference().Disable()
Self.SetObjectiveCompleted(60)
Self.SetObjectiveFailed(65)
_00E_MQ04_SavedSevf.SetValueInt(1)
EndFunction
Function ActivateLift()
If _00E_MC_LishariREF.IsDisabled()
_00E_MC_LishariREF.Enable()
EndIf
MQ04_SC3_DeadBodyComment.Stop()
_00E_MC_LishariREF.MoveTo(MQ04_SC6_LishariStandMarker)
_00E_MC_LishariREF.EvaluatePackage()
Wait(1)
;Failsafe in case that the property is NONE like in report ERB-694. However, this was most likely caused by one of the installed mods of the player
If MQ04_SC6_LishariLiftPlatform == None
MQ04_SC6_LishariLiftPlatform = Game.GetFormFromFile(0x000329E8, "Skyrim.esm") as ObjectReference
EndIf
MQ04_SC6_LishariLiftPlatform.Activate(MQ04_SC6_LishariLiftPlatform)
EndFunction
Function FadeToBlackAndBack()
Game.DisablePlayerControls()
FadeToBlackImod.Apply()
Wait(2.5)
FadeToBlackImod.PopTo(FadeToBlackHoldImod)
_00E_MC_LishariREF.MoveTo(MQ04_D4_LishariLeanMarker)
_00E_MC_LishariREF.EvaluatePackage()
PlayerREF.MoveTo(MQ04_D4_PlayerStandMarker)
Wait(4)
FadeToBlackHoldImod.PopTo(FadeToBlackBackImod)
Self.SetCurrentStageID(80)
_00E_MC_LishariREF.EvaluatePackage()
EndFunction
Function LishariStartRitualScene()
Game.DisablePlayerControls()
If _00E_MC_LishariREF.IsDisabled()
_00E_MC_LishariREF.Enable()
_00E_MC_LishariREF.MoveTo(MQ04_D4_LishariLeanMarker)
EndIf
MQ04_SC6_LishariPerformsRitual.ForceStart()
EndFunction
Function LevitatePlayer()
Debug.SetGodMode(True)
Game.DisablePlayerControls(True, True, True, False, True, True, True, True)
Game.ForceFirstPerson()
PlayerOrigin = PlayerREF.PlaceAtMe(XMarkerHeading, 1)
float TranslateZ = PlayerRef.GetHeight() + 85.0
TranslateMarker = PlayerREF.PlaceAtMe(XMarkerHeading, 1)
TranslateMarker.MoveTo(PlayerRef, -(120.0 * Math.Sin(PlayerRef.GetAngleZ())), -(120.0 * Math.Cos(PlayerRef.GetAngleZ())), TranslateZ)
PlayerREF.SplineTranslateToRef(TranslateMarker, 1.0, 30.0)
_00E_MQ04_RitualAttachClouds.Play(PlayerREF)
_00E_MagConjureReanimate.Play(PlayerREF)
_00E_MQ04RitualImod.Apply()
EndFunction
Function RitualFailsave()
Wait(2)
PlayerREF.RemoveSpell(_00E_MQP03_MagicFeverSpell)
ImageSpaceModifier.RemoveCrossFade(afFadeDuration = 3.0)
PlayerREF.PlayIdle(TG05_GetUp)
Wait(2)
Game.EnablePlayerControls()
Self.SetCurrentStageID(90)
EndFunction
ObjectReference Function GetTranslateMarker()
Return PlayerOrigin
EndFunction
Function FinishUp()
PlayerREF.UnequipSpell(_00E_MQ04_FeuerloescherSpell, 1)
PlayerREF.UnequipSpell(_00E_MQ04_FeuerloescherSpell, 0)
PlayerREF.RemoveSpell(_00E_MQ04_FeuerloescherSpell)
PlayerREF.RemoveSpell(_00E_MQP03_MagicFeverSpell)
_00E_MQ04_RitualAttachClouds.Stop(PlayerREF)
EnvironmentScene02_StartBox.Enable()
_00E_PlayerFunctions.GetSoundControl().RemoveSilence()
_00E_EPHandler.GiveEP(__Config_RewardEXP)
Self.SetObjectiveCompleted(70)
NQ41.SetCurrentStageID(10)
MQ05Prologue.Start()
If MQ04_SC6_LishariLiftPlatform == None
MQ04_SC6_LishariLiftPlatform = Game.GetFormFromFile(0x000329E8, "Skyrim.esm") as ObjectReference
EndIf
MQ04_SC6_LishariLiftPlatform.lock(0)
PlayerOrigin.Delete()
TranslateMarker.Delete()
; calling the following line again, it seems to persist on the player for some reason
_00E_MQ04_RitualAttachClouds.Stop(PlayerREF)
; failsafe for issue 1536, fills empty aliases
If MQ05PrologueFunctions == None
MQ05PrologueFunctions = Game.GetFormFromFile(0x00033A5B, "Skyrim.esm") as _00E_MQ05Prologue_Functions
EndIf
MQ05PrologueFunctions.FillEmptyAliasesFailsafe()
EndFunction
Function GiveEPForStones()
int TotalReward = (_00E_MQ04_StonesSaved.GetValueInt()*__Config_RewardEXP_PerStone)
_00E_EPHandler.GiveEP(TotalReward)
EndFunction
;=====================================================================================
; STONE MINIGAME
;=====================================================================================
Function StartStoneMinigame()
_00E_Music_CombatRegular.Add()
PlayerREF.AddSpell(_00E_MQ04_FeuerloescherSpell)
PlayerREF.EquipSpell(_00E_MQ04_FeuerloescherSpell, 0)
_00E_MQ04_StonesLeft.SetValueInt(_00E_MQ04_MagicStones.GetSize())
Self.UpdateCurrentInstanceGlobal(_00E_MQ04_StonesLeft)
RegisterForSingleUpdate(StoneInterval)
iIndex = _00E_MQ04_MagicStones.GetSize()
EndFunction
Function SaveStone(ObjectReference objSelfRef, ObjectReference objFireRef, ObjectReference objLightRef)
_00E_MQ04_StonesSaved.SetValue(_00E_MQ04_StonesSaved.GetValueInt() + 1)
UpdateObjectives()
_00E_MQ03FireISM.Apply()
int Extinguish = FXFireOut.Play(PlayerREF)
Sound.SetInstanceVolume(Extinguish, 3)
_00E_MQ04_StoneFragmentSaved.Show()
objSelfRef.Disable(True)
objFireRef.Disable(True)
objLightRef.Disable(True)
EndFunction
Function DestroyStone(ObjectReference objSelfRef, ObjectReference objStoneRef)
objStoneRef.KnockAreaEffect(0.5, 512)
objStoneRef.PlaceAtMe(_00E_GiantShockExplosionHarmless)
objSelfRef.DisableNoWait()
objStoneRef.DisableNoWait()
_00E_MQ04_StonesLeft.SetValueInt(_00E_MQ04_StonesLeft.GetValueInt() - 1)
_00E_MQ04_StoneFragmentDestroyed.Show(StoneInterval)
Game.ShakeCamera(afStrength = 0.4)
UpdateObjectives()
EndFunction
Function UpdateObjectives()
Self.UpdateCurrentInstanceGlobal(_00E_MQ04_StonesSaved)
Self.UpdateCurrentInstanceGlobal(_00E_MQ04_StonesLeft)
int AlreadySaved = _00E_MQ04_StonesSaved.GetValueInt()
int StonesLeft = _00E_MQ04_StonesLeft.GetValueInt()
if (AlreadySaved == StonesLeft) || (StonesLeft == 0)
Self.SetObjectiveCompleted(40)
Self.SetCurrentStageID(60)
_00E_Music_CombatRegular.Remove()
Else
Self.SetObjectiveCompleted(40,0)
Self.SetObjectiveDisplayed(40, True, True)
EndIf
EndFunction
;=====================================================================================
; EVENTS
;=====================================================================================
Event OnUpdate()
iIndex = iIndex - 1
ObjectReference StoneToDestroy = _00E_MQ04_MagicStones.GetAt(iIndex) as ObjectReference
StoneToCheck = StoneToDestroy as _00E_MQ04_Firescript
bool Saved = StonetoCheck.CheckSaved()
if Self.GetCurrentStageID() < 60
if !(Saved)
StoneToDestroy.Activate(StoneToDestroy)
_00E_MQ04_StoneFragmentDestroyed.Show(StoneInterval as Int)
EndIf
if _00E_MQ04_StonesLeft.GetValueInt() > 0
RegisterForSingleUpdate(StoneInterval)
EndIf
EndIf
EndEvent
;=====================================================================================
; PROPERTIES
;=====================================================================================
bool bDeadBodyFailsaveUsed
int UpdateCounter
int iIndex
int Property __Config_RewardEXP_PerStone Auto
{How much EP does the player get for every stone he saves for Lishari? Maximum: 7 Stones!}
int Property __Config_RewardEXP Auto
{How much EP does the player get on quest completion}
ObjectReference Property TranslateMarker Auto Hidden
ObjectReference Property PlayerOrigin Auto Hidden
_00E_MQ05Prologue_Functions Property MQ05PrologueFunctions Auto
Float Property StoneInterval Auto
{The interval in which a fire has destroyed a stone}
Formlist Property _00E_MQ04_MagicStones Auto
VisualEffect Property _00E_MQ04_RitualAttachClouds Auto
Sound Property _00E_MagConjureReanimate Auto
GlobalVariable Property _00E_MQ04_StonesLeft Auto
GlobalVariable Property _00E_MQ04_StonesSaved Auto
Message Property _00E_MQ04_StoneFragmentSaved Auto
Message Property _00E_MQ04_StoneFragmentDestroyed Auto
Idle Property TG05_GetUp Auto
Idle Property IdleCowerEnter Auto
Idle Property PlayerStagger Auto
Quest Property MQ05Prologue Auto
Quest Property NQ41 Auto
Actor Property PlayerREF Auto
Actor Property _00E_MC_LishariREF Auto
ReferenceAlias Property Sevf Auto
Scene Property MQ04_SC4_SevfScreamsForHelp Auto
Scene Property MQ04_SC6_LishariPerformsRitual Auto
Scene Property MQ04_SC3_DeadBodyComment Auto
Spell Property _00E_MQ04_FeuerloescherSpell Auto
Spell Property _00E_MQP03_MagicFeverSpell Auto
ObjectReference Property MQ04_SC1_LishariAppearMarker Auto
ObjectReference Property MQ04_SC1_CrystalTrap Auto
ObjectReference Property MQ04_CrystalTrap02 Auto
ObjectReference Property MQ04_CrystalTrap03 Auto
ObjectReference Property MQ04_SC4_SevfKillFire Auto
ObjectReference Property MQ04_SC6_LishariLiftPlatform Auto
ObjectReference Property MQ04_SC6_LishariStandMarker Auto
ObjectReference Property MQ04_D4_PlayerStandMarker Auto
ObjectReference Property MQ04_D4_LishariLeanMarker Auto
ObjectReference Property MQ04Barriere Auto
ObjectReference Property MQ04_Rock02 Auto
ObjectReference Property EnvironmentScene02_StartBox Auto
ImageSpaceModifier Property FadeToBlackIMOD Auto
ImageSpaceModifier Property FadeToBlackHoldIMOD Auto
ImageSpaceModifier Property FadeToBlackBackIMOD Auto
ImpactDataSet Property FXDragonLandingImpactSet Auto
GlobalVariable Property _00E_MQ04_SavedSevf Auto
ObjectReference Property MQ04_SC4_SevfKillBurner Auto
Explosion Property _00E_MQ04_CrystalExplosion Auto
Explosion Property FXdustDropMedExplosion Auto
Explosion Property FireBallExp01 Auto
Explosion Property _00E_MQ04_FlashpowderExplosion Auto
Explosion Property _00E_GiantShockExplosionHarmless Auto
_00E_MQ04_Firescript Property StonetoCheck Auto Hidden
Scene Property MQ04_SC1_LishariAppears Auto
Static Property XMarkerHeading Auto
MusicType Property _00E_Music_CombatRegular Auto
Sound Property _00E_MQ04_CrystalTouch Auto
Sound Property _00E_MAGFireballExplosionM Auto
Sound Property _00E_MAGBottleBreak Auto
Sound Property _00E_MAGFXFireOilIgniteLow Auto
Sound Property FXFireOut Auto
ImageSpaceModifier Property MAGShockExpImod Auto
ImageSpaceModifier Property _00E_MQ04_FlashpowderFlash Auto
ImageSpaceModifier Property _00E_MQ04RitualImod Auto
ImageSpaceModifier Property _00E_MQ03FireISM Auto