scriptName TrapFirePlate extends TrapTriggerBase
;
;
;
;================================================================

int Count				;if Finite = 1, Determines how many times this trigger can be used
int CountUsed		;Used to compare times triggered to max triggers allowed
int Type

;weapon property pressEffect auto
ammo property pressEffectAmmo auto
hazard property fireHazard auto hidden
objectReference property myHazardRef auto hidden
bool property weaponResolved = false auto hidden
int Property TrapLevel = 1 auto
{Used to determine the difficulty of the trap, currently only tied to damage
	0 = Easy
	1 = Medium (DEFAULT)
	2 = Hard
	3 = VeryHard}

;event onLoad()
	;objectReference selfRef = self
	;fireHazard = game.getForm(0X0005A1A3)
;endEvent

State Active
	Event onBeginState()
		goToState( "DoNothing" )
		if !weaponResolved
			ResolveLeveledHazard ()
		endif
		;pressEffect.fire(selfRef, pressEffectAmmo)
		; EFFECT IS HERE ^^^^^ UNCOMMENT ONCE PROJECTILES OR PARTICLES CAN LEAVE A TRIGGER BOX CORRECTLY
		activate(self as objectReference)
		;playAnimationAndWait( "trigger", "reset" )
		TriggerSound.play(self)
		playAnimation("Down")
		myHazardRef = PlaceAtMe(fireHazard, 1)
		if objectsInTrigger == 0
			goToState( "Inactive" )
			playAnimation("Up")
			removeMyHazard()
		endif
	endEvent
	
	event OnTriggerEnter( objectReference triggerRef )	
		if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been entered by " + triggerRef)
			objectsInTrigger = self.GetTriggerObjectCount()
		endif
	endEvent
	
	event OnTrigger( objectReference triggerRef )	
	endEvent
	
	event OnTriggerLeave( objectReference triggerRef )
		;if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been exited by " + triggerRef)
			objectsInTrigger = self.GetTriggerObjectCount()
			if objectsInTrigger == 0
				goToState ("Inactive")
				playAnimation("Up")
				removeMyHazard()
			endif
		;endif
	endEvent
endState

State DoNothing			;Dummy state, don't do anything if animating
	event OnTriggerEnter( objectReference triggerRef )
		if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been entered by " + triggerRef)
			objectsInTrigger = self.GetTriggerObjectCount()
		endif
	endEvent
	
	event OnTrigger( objectReference triggerRef )	
		if (triggerRef == game.getPlayer()) && !checkPerks(triggerRef)
			objectsInTrigger = self.GetTriggerObjectCount()
			if objectsInTrigger == 1
				goToState ("Inactive")
				playAnimation("Up")
				removeMyHazard()
			endif
		endif
	endEvent
	
	event OnTriggerLeave( objectReference triggerRef )
		;if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been exited by " + triggerRef)
			objectsInTrigger = self.GetTriggerObjectCount()
			if objectsInTrigger == 0
				goToState ("Inactive")
				playAnimation("Up")
				removeMyHazard()
			endif
		;endif
	endEvent
EndState

;Single point of change for removal of hazard
function removeMyHazard()
	objectReference refToRemove = myHazardRef
	utility.wait(1.0)
	if refToRemove
		refToRemove.Disable()
		refToRemove.Delete()
	endif
endFunction

auto State Inactive

	event onBeginState()
		objectsInTrigger = self.GetTriggerObjectCount()
		if (Type == 1 && objectsInTrigger == 0)								;type 1 = hold, so deprecate here if necessary
			if (FiniteUse == TRUE && CountUsed < Count);if finite use and count > count used
				CountUsed += 1						;increase count for hold type triggers
			endif
			
			
		endif
		if objectsInTrigger == 0
			removeMyHazard()
		endif
	endEvent
	
	event OnTriggerEnter (objectReference triggerRef)
		if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been entered by " + triggerRef)
			lastTriggerRef = triggerRef
			objectsInTrigger = self.GetTriggerObjectCount()
			if (FiniteUse == TRUE	&& CountUsed < Count)	;if finite use and count > count used
				;TRACE("Finite Use")
				if (Type != 1)							;type 1 = hold so only increase on leave
					CountUsed += 1						;increase count used
					;TRACE("Increasing Count on enter")
				endif
				goToState( "Active" )
			endif
			
			if (FiniteUse == FALSE)
				;TRACE("Infinite Use")
				goToState( "Active" )
			endif		
		endif
	endevent

	event OnTriggerLeave (objectReference triggerRef)
		;if acceptableTrigger(triggerRef)
; 			;debug.TRACE(self + " has been exited by " + triggerRef)
			lastTriggerRef = triggerRef
			objectsInTrigger = self.GetTriggerObjectCount()
			if (Type == 1 && objectsInTrigger == 0)								;type 1 = hold, so deprecate here if necessary
				if (FiniteUse == TRUE && CountUsed < Count);if finite use and count > count used
					CountUsed += 1						;increase count for hold type triggers
				endif
				
				activate(self as objectReference)
				
			endif
		;endif
	endevent
	
endstate

event onCellAttach()
	objectsInTrigger = self.GetTriggerObjectCount()
	if !weaponResolved
		ResolveLeveledHazard ()
	endif
	if myHazardRef
		removeMyHazard()
	endif
	
	if objectsInTrigger == 0
		goToState ("Inactive")
		playAnimation("Up")
	else
		goToState ("Active")
	endif
endEvent

;================================================================

int property LvlThreshold1 auto
int property LvlThreshold2 auto
int property LvlThreshold3 auto
int property LvlThreshold4 auto
int property LvlThreshold5 auto
hazard property TrapFirePlateFXHaz01 auto
hazard property TrapFirePlateFXHaz02 auto
hazard property TrapFirePlateFXHaz03 auto
hazard property TrapFirePlateFXHaz04 auto
hazard property TrapFirePlateFXHaz05 auto
hazard property TrapFirePlateFXHaz06 auto

Function ResolveLeveledHazard ()
	;Trace("ResolveLeveledWeapon")
	int damageLevel
	damageLevel = CalculateEncounterLevel(TrapLevel)
	
	; weapon lvlWeaponM = LvlWeaponM1
	; weapon lvlWeaponL = LvlWeaponL1
	; weapon lvlWeaponR = LvlWeaponR1
	hazard LvlHazard = TrapFirePlateFXHaz01
	
	if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
		; lvlWeaponM = LvlWeaponM2
		; lvlWeaponL = LvlWeaponL2
		; lvlWeaponR = LvlWeaponR2
		LvlHazard = TrapFirePlateFXHaz02
		;Trace("damage threshold =")
		;Trace("2")
	endif
	if (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
		;lvlWeaponM = LvlWeapon3
		LvlHazard = TrapFirePlateFXHaz03
		;Trace("damage threshold =")
		;Trace("3")
	endif
	if (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
		;lvlWeaponM = LvlWeapon4
		LvlHazard = TrapFirePlateFXHaz04
		;Trace("damage threshold =")
		;Trace("4")
	endif
	if (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
		;lvlWeaponM = LvlWeapon5
		LvlHazard = TrapFirePlateFXHaz05
		;Trace("damage threshold =")
		;Trace("5")
	endif
	if (damageLevel > LvlThreshold5)
		;lvlWeaponM = LvlWeapon6
		LvlHazard = TrapFirePlateFXHaz06
		;Trace("damage threshold =")
		;Trace("6")
	endif
	
	; ballistaWeaponM = lvlWeaponM
	; ballistaWeaponL = lvlWeaponL
	; ballistaWeaponR = lvlWeaponR
	fireHazard = LvlHazard
	weaponResolved = True
EndFunction