1
enderalse/source/scripts/_00e_mq11c_minigameshootingsphere.psc

368 lines
11 KiB
Plaintext
Raw Normal View History

Scriptname _00E_MQ11c_MinigameShootingSphere extends ObjectReference
Import Utility
;=====================================================================================
; STATES
;=====================================================================================
;-----------------------------AUTO STATE-------------------
Auto State WaitingForFirstActivation ; State the sphere will automatically be set to once initialized
Event OnActivate(ObjectReference akActionRef)
if (akActionRef == SphereButton01) && (MQ11c.GetStage() == 150) ; Have the sphere levitate upwards a little and play a cool sound once Rynéus hits the switch!
NPCDwarvenSphereOpen.Play(Self)
Move(0.0, 0.0, 170, 65, 50)
SphereInactiveLoop = QSTDA02ShrineActivateLPMMarker.Play(Self)
Wait(3)
MQ11c.SetStage(155)
goToState("Pending") ; Go to the pending state and wait for input
EndIf
EndEvent
EndState
;------------------------------PENDING STATE----------------
State Pending
Event OnActivate(ObjectReference akActionRef)
if (GameRunning == False) && (akActionRef == SphereButton02)
PlayerREF.EquipItem(_00E_MQ11c_SphereArrow, False, True) ; Have the player equip a bow and draw it
PlayerREF.EquipItem(_00E_MQ11c_SphereBow, False, True)
PlayerREF.DrawWeapon()
Sound.StopInstance(SphereInactiveLoop)
Self.PlayAnimation("Open") ; Play opening animation and sound
_00E_NPCDwarvenSphereScanM.Play(Self)
MakeRyneusLookAtSphere()
Wait(3)
MakeRyneusLookAtSphere()
SphereLoop = _00E_NPCDwarvenSphereConsciousLPM.Play(Self)
_00E_MQ11c_Sphere_GameRunning.SetValue(1)
SphereAngleX = Self.GetAngleX()
SphereAngleY = Self.GetAngleY()
SphereAngleZ = Self.GetAngleZ()
SphereOffsetX = Self.GetPositionX()
SphereOffsetY = Self.GetPositionY()
SphereOffsetZ = Self.GetPositionZ()
Phase = 0
GameRunning = True
if StartRound == 1
GoToState("RoundOne") ; Determine which movement pattern to follow
; Debug.Trace("Moving to round 1 state")
ElseIf StartRound == 2
GoToState("RoundTwo")
; Debug.Trace("Moving to round 2 state")
ElseIf StartRound == 3
GoToState("RoundThree")
; Debug.Trace("Moving to round 3 state")
EndIf
ElseIf GameRunning == True
if StartRound == 1
GoToState("RoundOne")
; Debug.Trace("Moving to round 1 state")
ElseIf StartRound == 2
GoToState("RoundTwo")
; Debug.Trace("Moving to round 2 state")
ElseIf StartRound == 3
GoToState("RoundThree")
; Debug.Trace("Moving to round 3 state")
EndIf
If MQ11c.GetStage() < 175
MakeRyneusLookAtSphere()
EndIf
EndIf
EndEvent
EndState
;----------------------------RESTART STATE-----------------------------------------------
State Restart
Event OnBeginState() ; Make sure we still want to run the game - If it is, have Rynéus hit the switch again and thus raise the sphere level, if not, have Rynéus forcegreet the player to initiate the end-minigame dialogue
Actor akRyneus = Ryneus.GetActorReference()
_00E_MQ11c_Sphere_NextStaqge.SetValue(_00E_MQ11c_Sphere_NextStaqge.GetValue() + 1)
if (_00E_MQ11c_Sphere_NextStaqge.GetValueInt() <= 2)
akRyneus.ClearLookAt()
MQ11c_SC7_RyneusRaiseSphereLevel.Start()
ElseIf (_00E_MQ11c_Sphere_NextStaqge.GetValueInt() == 3)
akRyneus.ClearLookAt()
akRyneus.EvaluatePackage()
EndIf
EndEvent
Event OnActivate(ObjectReference akActionRef) ; Play the opening animation, refresh ammo, et cetera
if MQ11c.GetStage() == 170
if akActionRef == SphereButton02
if (_00E_MQ11c_Sphere_NextStaqge.GetValueInt() == 0)
Phase = 0
StartRound = 1
EndIf
PlayerREF.RemoveItem(_00E_MQ11c_SphereArrow, 50, True)
PlayerREF.AddItem(_00E_MQ11c_SphereArrow, 50, True)
PlayerREF.EquipItem(_00E_MQ11c_SphereArrow, False, True)
Self.PlayAnimation("Open")
_00E_NPCDwarvenSphereScanM.Play(Self)
Wait(1)
MakeRyneusLookAtSphere()
Wait(3)
SphereLoop = _00E_NPCDwarvenSphereConsciousLPM.Play(Self)
RegisterForSingleUpdate(5.0)
_00E_MQ11c_Sphere_GameRunning.SetValue(1)
SphereAngleX = Self.GetAngleX()
SphereAngleY = Self.GetAngleY()
SphereAngleZ = Self.GetAngleZ()
SphereOffsetX = Self.GetPositionX()
SphereOffsetY = Self.GetPositionY()
SphereOffsetZ = Self.GetPositionZ()
Phase = 0
GameRunning = True
if StartRound == 1
GoToState("RoundOne")
; Debug.Trace("Moving to round 1 state")
ElseIf StartRound == 2
GoToState("RoundTwo")
; Debug.Trace("Moving to round 2 state")
ElseIf StartRound == 3
GoToState("RoundThree")
; Debug.Trace("Moving to round 3 state")
EndIf
EndIf
ElseIf MQ11c.GetStage() == 175 ; If the minigame has ended, return to origin
Move(0.0, 0.0, -170.0, 65, 50)
SphereInactiveLoop = QSTDA02ShrineActivateLPMMarker.Play(Self)
Wait(3)
Sound.StopInstance(SphereInactiveLoop)
NPCDwarvenSphereClose.Play(Self)
EndIf
EndEvent
EndState
;----------------------------TRANSLATING STATE-----------------------------------------------
State Translating
Event OnTranslationAlmostComplete()
; Debug.Trace("Translation complete") ; Once the sphere has almost finished translating, return to pending state to determine the next movement
Phase = (Phase + 1)
GoToState("Pending")
Self.Activate(Self)
EndEvent
EndState
State ReturningToBase
Event OnTranslationAlmostComplete() ; Add one to the start round integer to have the sphere enter the next round after re-activating itself
StartRound = (StartRound +1)
Phase = 0
Sound.StopInstance(SphereLoop)
Wait(5.5)
; Debug.Trace("This should have worked!")
GoToState("Restart")
GameRunning == False
Self.Activate(Self)
EndEvent
EndState
;----------------------------SPHERE ROUND #1-----------------------------------------------
State RoundOne
Event OnBeginState()
; Debug.Trace("Entering" + Phase as Int)
if Phase == 0
Move(0.0, 0.0, 300, SphereRound01, 50)
ElseIf Phase == 1
Move(- 300.0, 0.0, 0.0, SphereRound01, 50)
ElseIf Phase == 2
Move(600, 0.0, 0.0, SphereRound01, 50)
ElseIf Phase == 3
Move(0.0, 300, 0.0, SphereRound01, 50)
ElseIf Phase == 4
Move(- 300, 0.0, 0, SphereRound01, 50)
ElseIf Phase == 5
Move(0.0, -600, 0, SphereRound01, 50)
ElseIf Phase == 6
Move(300, 0.0, 0.0, SphereRound01, 50)
ElseIf Phase == 7
Move(0.0, 300, -300.0, SphereRound01, 50)
ElseIf Phase == 8
Wait(1.5)
CloseAndReturnToBase()
EndIf
EndEvent
EndState
;----------------------------SPHERE ROUND #2-----------------------------------------------
State RoundTwo
Event OnBeginState()
; Debug.Trace("Entering" + Phase as Int)
if Phase == 0
Move(250, 0.0, 250, SphereRound02, 50)
ElseIf Phase == 1
Move(- 200, 300, 0.0, SphereRound02, 40)
ElseIf Phase == 2
Move(0.0, - 200, 150, SphereRound02, 40)
ElseIf Phase == 3
Move(200, 200, 0.0, SphereRound02, 40)
ElseIf Phase == 4
Move(- 50, - 300, - 150, SphereRound02, 40)
ElseIf Phase == 5
Move(250, 250, 250, SphereRound02, 40)
ElseIf Phase == 6
Move(- 150, - 150, - 150, SphereRound02, 40)
ElseIf Phase == 7
Move(100, -100, -100, SphereRound02, 40)
ElseIf Phase == 8
Move(- 200, 100, 50, SphereRound02, 40)
ElseIf Phase == 9
Wait(1.5)
CloseAndReturnToBase()
EndIf
EndEvent
EndState
;----------------------------SPHERE ROUND #3-----------------------------------------------
State RoundThree
Event OnBeginState()
; Debug.Trace("Entering" + Phase as Int)
if Phase == 0
Move(250, 0.0, 250, SphereRound03, 450)
ElseIf Phase == 1
Move(-400, - 350, 0.0, SphereRound03, 480)
ElseIf Phase == 2
Move(250, 250, - 150, SphereRound03, 460)
ElseIf Phase == 3
Move(0.0, 200, 100, SphereRound03, 460)
ElseIf Phase == 4
Move(- 350, 350, - 150, SphereRound03, 480)
ElseIf Phase == 5
Move(400, - 350, 350, SphereRound03, 470)
ElseIf Phase == 6
Move(- 250, - 200, - 100, SphereRound03, 460)
ElseIf Phase == 7
Move(100.0, 0.0, 450, SphereRound03, 490)
ElseIf Phase == 8
Move(-200, 200, - 250, SphereRound03, 460)
ElseIf Phase == 9
Wait(1.5)
CloseAndReturnToBase()
EndIf
EndEvent
EndState
;=====================================================================================
; FUNKTIONEN
;=====================================================================================
;x-value: + = Right, - Left, y-value: + = Backward, - = Forward
Function Move(float MoveX, float MoveY, float MoveZ, float SphereSpeed, float SphereSpline)
_00E_MQ11c_SpherePrepareM.Play(Self)
;Wait(0.7)
Self.SplineTranslateTo((Self.GetPositionX() + MoveX), (Self.GetPositionY() + MoveY), (Self.GetPositionZ() + MoveZ), (Self.GetAngleX() + 47), SphereAngleY, SphereAngleZ, (15.0 + SphereSpline), (SphereSpeed + GSM), 30.0)
_00E_MQ11c_SphereMoveM.Play(Self)
GoToState("Translating")
EndFunction
Function CloseAndReturnToBase()
Closing = True
_00E_MQ11c_SphereClose.Play(Self)
_00E_MQ11c_Sphere_GameRunning.SetValue(0)
Self.SplineTranslateTo(SphereOffsetX, SphereOffsetY, SphereOffsetZ, SphereAngleX, SphereAngleY, SphereAngleZ, 55.0, 150, 60.0)
Self.PlayAnimation("Close")
GoToState("ReturningToBase")
EndFunction
Function MakeRyneusLookAtSphere()
Ryneus.GetActorReference().SetLookAt(Self)
EndFunction
;=====================================================================================
; PROPERTIES
;=====================================================================================
Float SphereAngleX
Float SphereAngleY
Float SphereAngleZ
Float SphereOffsetX
Float SphereOffsetY
Float SphereOffsetZ
int Phase
int SphereLoop
int SphereInactiveLoop
Float Property SphereRound01 Auto
Float Property SphereRound02 Auto
Float Property SphereRound03 Auto
Float Property GSM Auto
Float Property RyneusDialogueChance Auto
Bool Property Closing = False Auto Hidden
Bool Property GameRunning = False Auto Hidden
Bool Property TranslationInProgress = False Auto Hidden
int Property StartRound = 1 Auto
Actor Property PlayerREF Auto
Quest Property MQ11C Auto
ReferenceAlias Property Ryneus Auto
Sound Property _00E_NPCDwarvenSphereScanM Auto
Sound Property _00E_NPCDwarvenSphereConsciousLPM Auto
Sound Property _00E_MQ11c_SpherePrepareM Auto
Sound Property _00E_MQ11c_SphereMoveM Auto
Sound Property _00E_MQ11c_SphereClose Auto
Sound Property NPCDwarvenSphereOpen Auto
Sound Property NPCDwarvenSphereClose Auto
Sound Property QSTDA02ShrineActivateLPMMarker Auto
ObjectReference Property SphereButton01 Auto
ObjectReference Property SphereButton02 Auto
GlobalVariable Property _00E_MQ11c_Sphere_GameRunning Auto
GlobalVariable Property _00E_MQ11c_Sphere_NextStaqge Auto
Ammo Property _00E_MQ11c_SphereArrow Auto
Weapon Property _00E_MQ11c_SphereBow Auto
Scene Property MQ11c_SC7_RyneusRaiseSphereLevel Auto