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