enderalse/source/scripts/trapdwepiston.psc

179 lines
4.1 KiB
Plaintext

scriptName TrapDwePiston extends MovingTrap
;
;
;This is the script for the blade trap
;Activating the trap causes it to toggle on and off
;If activated while in the process of stopping, it should be able to handle that.
;================================================================
import debug
import utility
;If Loop is true, it swings until activated again.
;If Loop is false, it swings once when activated.
bool restartLooping = false
bool finishedPlaying = false
bool hasPlayedAttackAnimOnce = FALSE
float property initialDelay = 0.25 auto
string property fireAnim = "Up" auto
{firing animation, should not need to change}
string property fireEvent = "TransUp" auto
{firing animation event, should not need to change}
string property resetAnim = "Down" auto
{reset animation, should not need to change}
string property resetEvent = "TransDown" auto
{reset animation event, should not need to change}
string property startSwungAnim = "StartUp" auto
{anim event to start already swung}
bool property startSwung = false auto hidden
{set to true to start swung}
;-----------------------------------
EVENT OnCellAttach()
isLoaded = TRUE
if isFiring || startSwung
if startSwung
;isFiring == True
loop = True
goToState("On")
endif
fireTrap()
endif
endEVENT
Function fireTrap()
;Basic wind up and fire once checking
;TRACE("fireTrap called")
isFiring = True
if !startSwung
if WindupSound
WindupSound.play( self as ObjectReference) ;play windup sound
endif
wait( initialDelay ) ;wait for windup
endif
hasPlayedAttackAnimOnce = FALSE
;TRACE("Initial Delay complete")
if (fireOnlyOnce == True) ;If this can be fired only once then disarm
trapDisarmed = True
endif
;TRACE("Looping =")
;TRACE(Loop)
;Trap Guts
finishedPlaying = False
while !finishedPlaying && isLoaded
;trace(self + "Firing trap: playanimation(" + fireAnim + ")")
;trace(self + "Firing trap: waiting for event(" + fireEvent + ")")
if !hasPlayedAttackAnimOnce
if !startSwung
PlayAnimationAndWait(fireAnim, fireEvent)
; ;debug.Trace(self + "has finished anim once")
hasPlayedAttackAnimOnce = TRUE
else
startSwung = False
playAnimation(startSwungAnim)
hasPlayedAttackAnimOnce = TRUE
endif
Else
wait(0.5)
endif
finishedPlaying = True
if loop ;Reset Limiter
; ;debug.Trace(self + "is looping because loop = " + loop)
resetLimiter()
endif
endWhile
if isLoaded
isFiring = false
PlayAnimationAndWait(resetAnim, resetEvent)
goToState("Reset")
endif
;trace(self + "Reset trap: playanimation(" + resetAnim + ")")
;trace(self + "Reset trap: waiting for event(" + resetEvent + ")")
endFunction
;/
Function fireTrap()
isFiring = True
if hitbase
hitBase.goToState("CanHit")
endif
if windupSound
WindupSound.play( self as ObjectReference) ;play windup sound
endif
ResolveLeveledDamage()
wait( initialDelay ) ;wait for windup
hasPlayedAttackAnimOnce = FALSE
;TRACE("Initial Delay complete")
if (fireOnlyOnce == True) ;If this can be fired only once then disarm
trapDisarmed = True
endif
;TRACE("Looping =")
;TRACE(Loop)
;Trap Guts
while(finishedPlaying == False && isLoaded == true)
;trace(self + "Firing trap: playanimation(" + fireAnim + ")")
;trace(self + "Firing trap: waiting for event(" + fireEvent + ")")
if (hasPlayedAttackAnimOnce == FALSE)
PlayAnimationAndWait(fireAnim, fireEvent)
; ;debug.Trace(self + "has finished anim once")
hasPlayedAttackAnimOnce = TRUE
Else
wait(0.5)
endif
finishedPlaying = True
if (loop == TRUE) ;Reset Limiter
; ;debug.Trace(self + "is looping because loop = " + loop)
resetLimiter()
endif
endWhile
if isLoaded
isFiring = false
hitBase.goToState("CannotHit")
PlayAnimationAndWait(resetAnim, resetEvent)
goToState("Reset")
endif
;trace(self + "Reset trap: playanimation(" + resetAnim + ")")
;trace(self + "Reset trap: waiting for event(" + resetEvent + ")")
endFunction
/;
Function ResetLimiter()
finishedPlaying = False
;TrapHitBase hitBase = (self as objectReference) as TrapHitBase
;hitBase.goToState("CanHit")
EndFunction
Event onReset()
self.reset()
goToState("Idle")
endEvent