enderalse/source/scripts/trappoisongas.psc

393 lines
10 KiB
Plaintext

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