393 lines
10 KiB
Plaintext
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
|
|
|
|
|