scriptName TrapPoisonGas extends objectReference
;
;
;===================================================================
;;Properties from MQShoutTrigger
;===================================================================

Spell property voicelv01 auto		; level 1 shout
Spell property voicelv02 auto		; and 2
Spell property voicelv03 auto		; and 3, the most powerful

float property timeToClear auto hidden							; this variable is set according to what power of shout hit the fog

float property ClearTimeWeak = 5.0 auto			
{tweak setting for how long fog stays cleared by weakest shout
	default = 5.0}

float property ClearTimeMed = 10.0 auto
{tweak setting for how long fog stays cleared by medium shout
	default = 10.0}

float property ClearTimeStrong = 15.0 auto
{tweak setting for how long fog stays cleared by strongest shout
	default = 15.0}

bool property allowEnableFlag = true auto
{when true, trigger will enable after clear time is up
 when false, trigger will stay disabled}

; return value for IsFogOn function
; hidden property for use in child scripts
bool property bIsFogOn = false auto hidden

explosion property PoisonGasExplosion 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}

;===================================================================
;;Gas Properties
;===================================================================

keyword property gasKeyword auto
magicEffect property gasMagicEffect01 Auto
float property fDuration = 15.0 auto
bool property isInitiallyActive = True auto
{Set whether the poison gas is initially active
	default == TRUE}

bool property init = FALSE auto hidden
bool property TemporarilyCleared auto hidden
bool property loop = False auto hidden

;===================================================================
;;EVENT BLOCK
;===================================================================

event onCellLoad()
	if !init && isInitiallyActive
		goToState("On")	;onAnim
		bIsFogOn = true
		loop = true
		init = TRUE
	else
		init = TRUE
	endif
	
	if !weaponResolved
		ResolveLeveledExplosion ()
	endif
endEvent

;===================================================================
;;STATE BLOCK
;===================================================================

;/
STATE WaitingForTrigger
	event onBeginState()
		if !weaponResolved
			ResolveLeveledExplosion ()
		endif
	endEvent

	event onTrigger(objectReference triggerRef)
; 		Debug.Trace("Triggered: " + triggerRef + " " + !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword))
		if triggerRef as actor
			if !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword)
; 				debug.Trace(self + " has applied gas to " + triggerRef)
				;(triggerRef as actor).addSpell(gasSpell01)
				triggerRef.placeAtMe(PoisonGasExplosion)
			endif
		endif
	endEvent
	
	; event OnTriggerEnter (objectReference TriggerRef)
			; resolveTriggerLogic(triggerRef)
	; endEvent
	
	Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
		if Aggressor == Game.GetPlayer()
			resolveTriggerLogic(None, (akSource as spell))
		endif
	endEvent
	
	event onActivate(objectReference activateRef)
		ResolveGasActivation(activateRef)
	endEvent
endState


STATE	HasBeenTriggered
	; Nothing happens - this is a holding state
	EVENT OnHit(ObjectReference akAggressor, Form akWeapon, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
; 		debug.Trace("Hit but inactive: "+self)
	endEVENT 
endSTATE

STATE Inactive
	event onActivate(objectReference activateRef)
		ResolveGasActivation(activateRef)
	endEvent
endSTATE
/;

;;;;;;;;;;;;;;;;;;;;New stuff;;;;;;;;;;;;;;;;;;;;;;;;;

State On
	event onBeginState()
		bIsFogOn = True
		playAnimation("playAnim02")	;onAnim
	endEvent
	
	;Currently has an actor inside
	event onTrigger(objectReference triggerRef)
		if triggerRef as actor && !(triggerRef as actor).isDead()
		
			;If the actor does not already have a poison effect on them
			if !(triggerRef as actor).HasMagicEffectWithKeyword(gasKeyword)
; 				debug.Trace(self + " has applied gas to " + triggerRef)
				;(triggerRef as actor).addSpell(gasSpell01)
				triggerRef.placeAtMe(PoisonGasExplosion)
			endif
		endif
	endEvent
	
	;Activated by a trap trigger object
	event onActivate(objectReference activateRef)
		ResolveGasActivation(activateRef)
	endEvent
	
	;This occurs when hit by a shout
	Event OnHit(ObjectReference Aggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
		if Aggressor == Game.GetPlayer() && (akSource as spell)
			resolveShoutLogic(akSource as spell)
		endif
	endEvent
endState

auto State Off
	event onBeginState()
		bIsFogOn = False
		playAnimation("playAnim01")	;offAnim
	endEvent
	
	event onActivate(objectReference activateRef)
		ResolveGasActivation(activateRef)
	endEvent
endState

State TempCleared
	event onBeginState()
		bIsFogOn = False
		playAnimation("playAnim01")	;offAnim
		utility.wait(timeToClear)
		if TemporarilyCleared
			TemporarilyCleared = False
			goToState("On")
		else
			goToState("Off")
		endif
		
	endEvent
	
	event onActivate(objectReference activateRef)
		ResolveGasActivation(activateRef)
	endEvent
endState
;===================================================================
;;FUNCTION BLOCK
;===================================================================

Function ResolveShoutLogic(Spell akSpell)
; 	debug.Trace(self + "MQShoutTrigger: fireTriggerEvent from " + akSpell)
	TemporarilyCleared = True
	; set the time that this fog portion will stay cleared based on strength of the shout
	if akSpell == voicelv01
		timeToClear = clearTimeWeak
	elseif akSpell == voicelv02
		timeToClear = clearTimeMed
	elseif akSpell == voicelv03
		timeToClear = clearTimeStrong
	endif
	goToState("TempCleared")
	;setFogState(false)
; 	;debug.Trace(self + "Waiting " + timeToClear)
	;utility.wait(timeToClear)
	; if allowEnableFlag
		;self.enable()
		; setFogState(true)
	; endif
	; goToState("WaitingForTrigger")
endFunction

; Function resolveTriggerLogic(ObjectReference TriggerRef = None, Spell SpellRef = None)

	;respond if struck by one of the shout projectiles
; 	; debug.Trace( self + "MQShoutTrigger: resolveTriggerLogic ObjectRef=" + TriggerRef + ",  SpellRef=" + spellRef)
	
	; if spellRef;&& (spellRef == voicelv01 || spellRef == voicelv02 || spellRef == voicelv03)
		; goToState("HasBeenTriggered")
		; fireTriggerEvent(spellRef)
	; endif

; endFunction

;Handle turning on or off
function ResolveGasActivation(objectReference activateRef)
	TrapTriggerBase TriggerRef					;TriggerRef will always be a TrapTriggerBase
	TriggerRef = activateRef as TrapTriggerBase		;Set TriggerRef to our activateRef

	if TriggerRef
		if TriggerRef.TriggerType == 0			;single
			loop = False
			if bIsFogOn
				;do nothing
				
			Else
				;turn on
				unregisterForUpdate()
				registerForSingleUpdate(fDuration)
				goToState("On")	;onAnim
			endif
		elseif TriggerRef.TriggerType == 1		;hold
		
			if loop
				loop = False
			else
				loop = True
			endif
			
			if bIsFogOn
				;turn off
				if TemporarilyCleared
					TemporarilyCleared = False
				else
					goToState("Off")	;offAnim
				endif
			Else
				;turn on
				goToState("On")	;onAnim
			endif
		elseif TriggerRef.TriggerType == 2		;toggle
			if bIsFogOn
				loop = False
				;turn off
				if TemporarilyCleared
					TemporarilyCleared = False
				else
					goToState("Off")	;offAnim
				endif
			Else
				loop = True
				;turn on
				goToState("On")	;onAnim
			endif
		elseif TriggerRef.TriggerType == 3		;turn on
			loop = True
			if bIsFogOn
				;do nothing
			else
				;turn on
				goToState("On")	;onAnim
			endif
		elseif TriggerRef.TriggerType == 4		;turn off
			loop = False
			if bIsFogOn
				;turn off
				if TemporarilyCleared
					TemporarilyCleared = False
				else
					goToState("Off")	;offAnim
				endif
			Else
				;do nothing
			endif
		endif
	Else
		
	endif
endFunction

event onUpdate()
	unregisterForUpdate()
	if getState() == "On"
		if !loop
			goToState("Off")
		endif
	elseif getState() == "TempCleared"
		TemporarilyCleared = False
	else
	endif
endEvent
; Function setFogState(bool bTurnOnFog)
	; bIsFogOn = bTurnOnFog
	; if bTurnOnFog
; 		; debug.Trace("Re-fogging: "+self)
		; self.enable()
	; else
; 		; debug.Trace("unfogging: "+self)
		; self.disable()
	; endif
; endFunction

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

int property LvlThreshold1 auto
int property LvlThreshold2 auto
int property LvlThreshold3 auto
int property LvlThreshold4 auto
int property LvlThreshold5 auto
Explosion property TrapPoisonGasExplosion01 auto
Explosion property TrapPoisonGasExplosion02 auto
Explosion property TrapPoisonGasExplosion03 auto
Explosion property TrapPoisonGasExplosion04 auto
Explosion property TrapPoisonGasExplosion05 auto
Explosion property TrapPoisonGasExplosion06 auto

Function ResolveLeveledExplosion ()
	;Trace("ResolveLeveledWeapon")
	int damageLevel
	damageLevel = CalculateEncounterLevel(TrapLevel)
	
	; weapon lvlWeaponM = LvlWeaponM1
	; weapon lvlWeaponL = LvlWeaponL1
	; weapon lvlWeaponR = LvlWeaponR1
	explosion LvlExplosion = TrapPoisonGasExplosion01
	
	if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
		; lvlWeaponM = LvlWeaponM2
		; lvlWeaponL = LvlWeaponL2
		; lvlWeaponR = LvlWeaponR2
		LvlExplosion = TrapPoisonGasExplosion02
		;Trace("damage threshold =")
		;Trace("2")
	endif
	if (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
		;lvlWeaponM = LvlWeapon3
		LvlExplosion = TrapPoisonGasExplosion03
		;Trace("damage threshold =")
		;Trace("3")
	endif
	if (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
		;lvlWeaponM = LvlWeapon4
		LvlExplosion = TrapPoisonGasExplosion04
		;Trace("damage threshold =")
		;Trace("4")
	endif
	if (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
		;lvlWeaponM = LvlWeapon5
		LvlExplosion = TrapPoisonGasExplosion05
		;Trace("damage threshold =")
		;Trace("5")
	endif
	if (damageLevel > LvlThreshold5)
		;lvlWeaponM = LvlWeapon6
		LvlExplosion = TrapPoisonGasExplosion06
		;Trace("damage threshold =")
		;Trace("6")
	endif
	
	; ballistaWeaponM = lvlWeaponM
	; ballistaWeaponL = lvlWeaponL
	; ballistaWeaponR = lvlWeaponR
	PoisonGasExplosion = LvlExplosion
	weaponResolved = True
EndFunction