scriptName HazardBase extends objectReference
;
;
;============================================
import utility

int property damage auto hidden
int property soundLevel = 10 auto 
int property trapPushBack auto
sound property TrapHitSound auto
weapon property hitFX auto
ammo property hitFXAmmo auto
int property trapLevel = 1 auto
bool isWaitingToEvaluate = False
float property staggerAmount = 0.0 auto
bool property CheckAngle = false auto
{if true this will check the angle of the actors velocity to the "up" vector of the trap
	default == False}


auto State CanHit
	
	Event OnTrapHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
; 		debug.Trace(self + ": TrapHit")
; 		debug.Trace(self + ": XYZ = (" + afXPos + "," + afYPos + "," +afZPos + ")")
		if !CheckAngle
			doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
		else
			if isAngleAcceptable(afXVel, afYVel, afZVel)
				doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
			endif
		endif
	endEvent
	
	
	Event OnTrapHitStart(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
; 		debug.Trace(self + ": TrapHitStart")
; 		debug.Trace(self + ": XYZ = (" + afXPos + "," + afYPos + "," +afZPos + ")")
		if !CheckAngle
			doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
		else
			if isAngleAcceptable(afXVel, afYVel, afZVel)
				doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
			endif
		endif
	endEvent
EndState

State CannotHit
endState

event onLoad()
	ResolveLeveledDamage()				;set damage appropriate to player level
endEvent

event onUpdate()
	unRegisterForUpdate()
	;EvaluateStoredRefs()
	isWaitingToEvaluate = FALSE
endEvent

function doLocalHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
	akTarget.ProcessTrapHit(self, damage, trapPushBack, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, staggerAmount)
; 	debug.Trace(self + " has hit " + akTarget)
	TrapHitSound.play( self as ObjectReference)		;play hit sound
	hitFX.fire(self, hitFxAmmo)
	CreateDetectionEvent(akTarget as actor, soundLevel) ; creates a detection event
endFunction



bool function isAngleAcceptable(float afXVel, float afYVel, float afZVel)
	float maxZVelocity = 1.0
	float minZVelocity = 0.3
	; float selfX
	; float selfY
	; float selfZ
	; float selfNodeX
	; float selfNodeY
	; float selfNodeZ
	
	
	
	; float dotProduct
	; dotProduct = sqrt()
	; if acos(MAXANGLE) < dotProduct
	
; 	debug.trace (self + ": X velocity = " + afXVel)
; 	debug.trace (self + ": Y velocity = " + afYVel)
; 	debug.trace (self + ": Z velocity = " + afZVel)
	
	float absoluteZ = (math.abs(afZVel))
	float absoluteY = math.abs(afYVel)
	float absoluteX = math.abs(afXVel)
	if  absoluteZ  >= maxZVelocity
		return true
	elseif absoluteZ  >= minZVelocity
		if (absoluteZ * (0.6)) >= absoluteY 
			return True
		elseif (absoluteZ * (0.6)) >= absoluteX
			Return True
		else
			return False
		endif
	else
		return false
	endif
endFunction

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

	
int property LvlThreshold1 auto
int property LvlDamage1 auto
int property LvlThreshold2 auto
int property LvlDamage2 auto
int property LvlThreshold3 auto
int property LvlDamage3 auto
int property LvlThreshold4 auto
int property LvlDamage4 auto
int property LvlThreshold5 auto
int property LvlDamage5 auto
int property LvlDamage6 auto

;int Function ResolveLeveledDamage (int damage)
Function ResolveLeveledDamage()
	int damageLevel
	damageLevel = CalculateEncounterLevel(TrapLevel)
	
	damage = LvlDamage1
	
	if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
		damage = LvlDamage2
		;Trace("damage threshold =")
		;Trace("2")
	endif
	if (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
		damage = LvlDamage3
		;Trace("damage threshold =")
		;Trace("3")
	endif
	if (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
		damage = LvlDamage4
		;Trace("damage threshold =")
		;Trace("4")
	endif
	if (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
		damage = LvlDamage5
		;Trace("damage threshold =")
		;Trace("5")
	endif
	if (damageLevel > LvlThreshold5)
		damage = LvlDamage6
		;Trace("damage threshold =")
		;Trace("6")
	endif
	
	;Trace("damage =")
	;Trace(damage)
	
	;return damage
EndFunction