enderalse/source/scripts/trapflamethrower.psc

452 lines
11 KiB
Plaintext

scriptName TrapFlamethrower Extends TrapBase
;
;
;
;=========================================
spell property magicWeapon auto hidden
;ammo property magicWeaponAmmo auto
float property initialDelay = 0.5 auto hidden
float property firingRate = 7.0 auto hidden
float property firingRateOverride = 0.0 auto
{Overrides the spedified firing rate if > 0.0
only used for a few special uses}
float property firingSpinup = 0.5 auto hidden
int property castingAim = 0 auto
{use to determin how the aiming type of the magic cast
0 = straight fire (default)
1 = fire at linked Ref
2 = fire at the object that activated my trigger}
objectReference property targetRef auto hidden
bool property forwardFiring = false auto
int property aaSpellToCast = 2 Auto
{The type of spell to cast, the leveled version is resolved internally
0 = firebolt
1 = fireball
2 = flames
3 = lightning bolt
4 = chain lightning
5 = sparks
6 = ice spike
7 = frostbite
8 = ice storm
}
import utility
import game
import math
bool finishedFiring = false
bool weaponResolved = false
bool concentrationCastLoop = false
bool property isFiring auto hidden
bool property isLoaded auto hidden
event onLoad()
if !weaponResolved
ResolveLeveledWeapon ()
weaponResolved = True
endif
isLoaded = TRUE
if isFiring == True
fireTrap()
endif
EndEvent
event onUnload()
; debug.Trace(self + " has recieved onUnload event")
isLoaded = FALSE
endEvent
Function fireTrap()
isFiring = True
if !weaponResolved
ResolveLeveledWeapon()
weaponResolved = True
endif
if trapDisarmed == false
;playAnimation("alarm")
;WindupSound.play( self as ObjectReference) ;play windup sound
;wait( initialDelay ) ;wait for windup
wait(firingSpinup)
while(finishedFiring == False) && isLoaded == TRUE
;3D Loaded check added by USKP 1.3.3 - Otherwise this thing will unload and then sit in your Papyrus stack. FOREVER.
if( Is3DLoaded() )
;playAnimation("fire")
;if statement to handle concentration casting loop
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
if concentrationCastLoop == false
fireByCastingType() ;does the actual casting
concentrationCastLoop = True
endif
Else
fireByCastingType() ;does the actual casting
endif
finishedFiring = True
;playAnimation("alarm")
wait(firingRate)
if (loop == TRUE) ;Reset Limiter
resetLimiter()
endif
Else
isLoaded = False
EndIf
endWhile
concentrationCastLoop = false
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
interruptCast()
endif
if isLoaded
isFiring = false
;playAnimation("idle")
goToState("Reset")
endif
endif
endFunction
State Reset
Event OnBeginState()
;TRACE("State Reset")
GoToState ( "Idle" )
;TrapHitBase hitBase = (self as objectReference) as TrapHitBase
;hitBase.goToState("CanHit")
endEvent
Event OnActivate( objectReference activateRef )
EndEvent
endState
function resetLimiter()
finishedFiring = false
endFunction
function fireByCastingType()
if castingAim == 0
magicWeapon.cast(self)
elseIf castingAim == 1
if forwardFiring
if refIsValidForwardTarget(getLinkedRef())
magicWeapon.cast(self, getLinkedRef())
Else
magicWeapon.cast(self)
endif
Else
magicWeapon.cast(self, getLinkedRef())
endif
ElseIf castingAim == 2
targetRef = (lastActivateRef as traptriggerbase).lastTriggerRef
if forwardFiring
if refIsValidForwardTarget(targetRef)
magicWeapon.cast(self, targetRef)
Else
magicWeapon.cast(self)
endif
Else
magicWeapon.cast(self, targetRef)
endif
Else
; debug.Trace(self + " error: castingAim = " + castingAim)
endif
endFunction
float property horizontalSweepHalf = 90.0 auto
float property verticalSweepHalf = 90.0 auto
bool function refIsValidForwardTarget(objectReference testRef)
; debug.Trace(self + " is checking if refIsValidForwardTarget on " + testRef)
float deltaX = testRef.X - self.X
float deltaY = testRef.Y - self.Y
float deltaZ = testRef.Z - self.Z
float fAngleToRef = atan(deltaX/deltaY)
if (deltaX < 0.0) && (deltaY < 0.0)
fAngleToRef = fAngleToRef + 180
endIf
float deltaAngle = self.getAngleZ()-fAngletoRef
if (deltaAngle < -180.0)
deltaAngle = deltaAngle + 360.0
endIf
if (deltaAngle > 180.0)
deltaAngle = deltaAngle - 360.0
endIf
if Abs(deltaAngle) < horizontalSweepHalf
; debug.Trace(self + " is firing at a valid angle at " + testRef)
return true
Else
; debug.Trace(self + " could not fire at a valid angle at " + testRef)
return False
endif
endFunction
;-----------------------------------------------
int property TESTLvlEncValue auto
int property LvlThreshold1 auto
spell property LvlWeapon1 auto hidden
int property LvlThreshold2 auto
spell property LvlWeapon2 auto hidden
int property LvlThreshold3 auto
spell property LvlWeapon3 auto hidden
int property LvlThreshold4 auto
spell property LvlWeapon4 auto hidden
int property LvlThreshold5 auto
spell property LvlWeapon5 auto hidden
spell property LvlWeapon6 auto hidden
bool spellAndCastingTypeResolved = false
Function ResolveLeveledWeapon ()
; debug.Trace(self + " trying to ResolveLeveledWeapon")
if spellAndCastingTypeResolved == false
ResolveSpellType()
ResolveCastingDelay()
spellAndCastingTypeResolved = True
endif
int damageLevel
damageLevel = CalculateEncounterLevel(TrapLevel)
spell lvlWeapon = LvlWeapon1
if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
lvlWeapon = LvlWeapon2
;Trace("damage threshold =")
;Trace("2")
elseif (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
lvlWeapon = LvlWeapon3
;Trace("damage threshold =")
;Trace("3")
elseif (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
lvlWeapon = LvlWeapon4
;Trace("damage threshold =")
;Trace("4")
elseif (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
lvlWeapon = LvlWeapon5
;Trace("damage threshold =")
;Trace("5")
elseif (damageLevel > LvlThreshold5)
lvlWeapon = LvlWeapon6
;Trace("damage threshold =")
;Trace("6")
endif
magicWeapon = lvlWeapon
EndFunction
function ResolveCastingDelay()
; debug.Trace(self + " trying to ResolveCastingDelay")
if castingAim == 0
initialDelay = 0.5
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
firingRate = 7.0
else
firingRate = 2.0
endif
elseif castingAim == 1
initialDelay = 0.5
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
firingRate = 7.0
else
firingRate = 2.0
endif
elseif castingAim == 2
initialDelay = 0.5
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
firingRate = 7.0
else
firingRate = 2.0
endif
Else
; debug.Trace(self + " cannot resolveCastingDelay: unknown castingAim")
endIf
if firingRateOverride > 0.0
firingRate = firingRateOverride
endif
endFunction
function ResolveSpellType()
; debug.Trace(self + " trying to ResolveSpellType")
if aaSpellToCast == 0
LvlWeapon1 = sLvlfirebolt1
LvlWeapon2 = sLvlfirebolt2
LvlWeapon3 = sLvlfirebolt3
LvlWeapon4 = sLvlfirebolt4
LvlWeapon5 = sLvlfirebolt5
LvlWeapon6 = sLvlfirebolt6
elseif aaSpellToCast == 1
LvlWeapon1 = sLvlfireball1
LvlWeapon2 = sLvlfireball2
LvlWeapon3 = sLvlfireball3
LvlWeapon4 = sLvlfireball4
LvlWeapon5 = sLvlfireball5
LvlWeapon6 = sLvlfireball6
elseif aaSpellToCast == 2
LvlWeapon1 = sLvlFlames1
LvlWeapon2 = sLvlFlames2
LvlWeapon3 = sLvlFlames3
LvlWeapon4 = sLvlFlames4
LvlWeapon5 = sLvlFlames5
LvlWeapon6 = sLvlFlames6
elseif aaSpellToCast == 3
LvlWeapon1 = sLvlLightningBolt1
LvlWeapon2 = sLvlLightningBolt2
LvlWeapon3 = sLvlLightningBolt3
LvlWeapon4 = sLvlLightningBolt4
LvlWeapon5 = sLvlLightningBolt5
LvlWeapon6 = sLvlLightningBolt6
elseif aaSpellToCast == 4
LvlWeapon1 = sLvlChainLightning1
LvlWeapon2 = sLvlChainLightning2
LvlWeapon3 = sLvlChainLightning3
LvlWeapon4 = sLvlChainLightning4
LvlWeapon5 = sLvlChainLightning5
LvlWeapon6 = sLvlChainLightning6
elseif aaSpellToCast == 5
LvlWeapon1 = sLvlSparks1
LvlWeapon2 = sLvlSparks2
LvlWeapon3 = sLvlSparks3
LvlWeapon4 = sLvlSparks4
LvlWeapon5 = sLvlSparks5
LvlWeapon6 = sLvlSparks6
elseif aaSpellToCast == 6
LvlWeapon1 = sLvlIceSpike1
LvlWeapon2 = sLvlIceSpike2
LvlWeapon3 = sLvlIceSpike3
LvlWeapon4 = sLvlIceSpike4
LvlWeapon5 = sLvlIceSpike5
LvlWeapon6 = sLvlIceSpike6
elseif aaSpellToCast == 7
LvlWeapon1 = sLvlFrostBite1
LvlWeapon2 = sLvlFrostBite2
LvlWeapon3 = sLvlFrostBite3
LvlWeapon4 = sLvlFrostBite4
LvlWeapon5 = sLvlFrostBite5
LvlWeapon6 = sLvlFrostBite6
elseif aaSpellToCast == 8
LvlWeapon1 = sLvlIceStorm1
LvlWeapon2 = sLvlIceStorm2
LvlWeapon3 = sLvlIceStorm3
LvlWeapon4 = sLvlIceStorm4
LvlWeapon5 = sLvlIceStorm5
LvlWeapon6 = sLvlIceStorm6
else
; debug.Trace(self + " has been set to an invalid spell type")
endif
endFunction
spell property sLvlfirebolt1 auto
spell property sLvlfirebolt2 auto
spell property sLvlfirebolt3 auto
spell property sLvlfirebolt4 auto
spell property sLvlfirebolt5 auto
spell property sLvlfirebolt6 auto
spell property sLvlfireball1 auto
spell property sLvlfireball2 auto
spell property sLvlfireball3 auto
spell property sLvlfireball4 auto
spell property sLvlfireball5 auto
spell property sLvlfireball6 auto
spell property sLvlFlames1 auto
spell property sLvlFlames2 auto
spell property sLvlFlames3 auto
spell property sLvlFlames4 auto
spell property sLvlFlames5 auto
spell property sLvlFlames6 auto
spell property sLvlLightningBolt1 auto
spell property sLvlLightningBolt2 auto
spell property sLvlLightningBolt3 auto
spell property sLvlLightningBolt4 auto
spell property sLvlLightningBolt5 auto
spell property sLvlLightningBolt6 auto
spell property sLvlChainlightning1 auto
spell property sLvlChainlightning2 auto
spell property sLvlChainlightning3 auto
spell property sLvlChainlightning4 auto
spell property sLvlChainlightning5 auto
spell property sLvlChainlightning6 auto
spell property sLvlSparks1 auto
spell property sLvlSparks2 auto
spell property sLvlSparks3 auto
spell property sLvlSparks4 auto
spell property sLvlSparks5 auto
spell property sLvlSparks6 auto
spell property sLvlIceSpike1 auto
spell property sLvlIceSpike2 auto
spell property sLvlIceSpike3 auto
spell property sLvlIceSpike4 auto
spell property sLvlIceSpike5 auto
spell property sLvlIceSpike6 auto
spell property sLvlFrostbite1 auto
spell property sLvlFrostbite2 auto
spell property sLvlFrostbite3 auto
spell property sLvlFrostbite4 auto
spell property sLvlFrostbite5 auto
spell property sLvlFrostbite6 auto
spell property sLvlIceStorm1 auto
spell property sLvlIceStorm2 auto
spell property sLvlIceStorm3 auto
spell property sLvlIceStorm4 auto
spell property sLvlIceStorm5 auto
spell property sLvlIceStorm6 auto
;Event OnTrapHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
; if (hitOnce == FALSE)
; hitOnce = TRUE
; endif
;endEvent