enderalse/source/scripts/fxdragonblooddamagescript.psc

361 lines
12 KiB
Plaintext

Scriptname FXDragonBloodDamageScript extends ActiveMagicEffect
{This script applies blood damage geometry to the dragon and turns it on when they are hit based on the direction they are hit from}
;===============================================
; MARK'S ORIGINAL VARS & PROPERTIES
int frontBloodStepper
int backBloodStepper
int leftBloodStepper
int rightBloodStepper
int dragonHealth
string hitDirection ;0=front 1=right 2=back 3=left
float hitAngle
Armor Property DragonBloodHeadFXArmor Auto
Armor Property DragonBloodTailFXArmor Auto
Armor Property DragonBloodWingLFXArmor Auto
Armor Property DragonBloodWingRFXArmor Auto
Actor selfRef
; JOEL'S VARS & PROPERTIES
; user can override HP percentages
float property HPpctT1 = 0.98 auto
{relative total HP at which first blood should appear DEFAULT: 0.??}
float property HPpctT2 = 0.95 auto
{relative total HP at which second blood should appear DEFAULT: 0.??}
float property HPpctT3 = 0.90auto
{relative total HP at which third blood should appear DEFAULT: 0.??}
float property HPpctT4 = 0.80 auto
{relative total HP at which final blood should appear DEFAULT: "+HPpctT4}
float previousHP
float diffHP
; tracking values for the amount of damage each "side" has taken.
float HPFront
float HPBack
float HPLeft
float HPRight
; tracking vars for damage to each side
; 0 = no blood, 1 = tier 1 blood, etc.
int stateFront = 0
int stateBack = 0
int stateLeft = 0
int stateRight = 0
; HP tiers. These are the threshold values below which each blood will play
float HPt1
float HPt2
float HPt3
float HPt4
bool bDebug = FALSE
;===============================================
EVENT OnEffectStart(Actor Target, Actor Caster)
;Setup stuff has to go here for activeMagicEffect
selfRef = caster
; store HP for future use. THis should usually be 100% HP.
previousHP = selfRef.getActorValue("health")
; ; debug.TraceConditional("TEST JOEL: Dragon has set previousHP to :"+previousHP, bDebug)
; ; debug.TraceConditional("TEST JOEL: Dragon Blood FX onEffectStart initialized", bDebug)
dragonBloodInit()
ENDEVENT
EVENT onLoad()
; ; debug.traceConditional("TEST JOEL: Dragon has loaded ("+selfRef+")", bDebug)
endEVENT
EVENT OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
; first intercept to figure out how much damage was done.
; ; debug.TraceConditional("||===============================", bDebug)
; ; debug.TraceConditional("|| TEST JOEL: DRAGON HP DIAGNOSTIC", bDebug)
; ; debug.TraceConditional("|| TEST JOEL: Dragon previous HP="+previousHP, bDebug)
; ; debug.TraceConditional("|| TEST JOEL: Dragon current HP="+selfRef.getActorValue("health"), bDebug)
diffHP = previousHP - (selfRef.getActorValue("health"))
; ; debug.TraceConditional("|| TEST JOEL: Dragon damaged for "+diffHP+"HP", bDebug)
; determine if I was hit in the front/back/left/right
hitAngle = selfRef.GetHeadingAngle(akAggressor)
if hitAngle >= -45 && hitAngle <= 45
hitDirection = "FRONT"
; decrement a fake HP counter for this side of the body
HPfront = (HPfront - diffHP)
endif
if hitAngle >= 135 || hitAngle <= -135
hitDirection = "BACK"
; decrement a fake HP counter for this side of the body
HPback = (HPback - diffHP)
endif
if hitAngle < -45 && hitAngle > -135
hitDirection = "LEFT"
; decrement a fake HP counter for this side of the body
HPleft = (HPleft - diffHP)
endif
if hitAngle > 45 && hitAngle < 135
hitDirection = "RIGHT"
; decrement a fake HP counter for this side of the body
HPright = (HPright - diffHP)
endif
; ; debug.TraceConditional("|| TEST JOEL: Dragon was hit from the "+hitDirection, bDebug)
; ; debug.TraceConditional("|| TEST JOEL: "+hitdirection+" HP = "+HPleft, bDebug)
; ==============================================
; check for updates to blood state
if hitDirection == "FRONT"
int prevStateFront = stateFront
if (HPfront <= HPt1) && (HPfront > HPt2)
stateFront = 1
elseif (HPfront <= HPt2) && (HPfront > HPt3)
stateFront = 2
elseif (HPfront <= HPt3) && (HPfront > HPt4)
stateFront = 3
elseif (HPfront <= HPt4)
stateFront = 4
endif
; see if there was a change in state for this side
if stateFront != prevStateFront
; concatenate and play appropriate blood FX
; ; debug.TraceConditional("|| TEST JOEL: Blood FX State Change: HeadBleed0"+stateFront, bDebug)
selfRef.PlaySubGraphAnimation("HeadBleed0"+stateFront)
endif
endif
if hitDirection == "BACK"
int prevStateback = stateback
if (HPback <= HPt1) && (HPback > HPt2)
stateback = 1
elseif (HPback <= HPt2) && (HPback > HPt3)
stateback = 2
elseif (HPback <= HPt3) && (HPback > HPt4)
stateback = 3
elseif (HPback <= HPt4)
stateback = 4
endif
; see if there was a change in state for this side
if stateback != prevStateback
; concatenate and play appropriate blood FX
; ; debug.TraceConditional("|| TEST JOEL: Blood FX State Change: BackBleed0"+stateback, bDebug)
selfRef.PlaySubGraphAnimation("TailBleed0"+stateback)
endif
endif
if hitDirection == "LEFT"
int prevStateleft = stateleft
if (HPleft <= HPt1) && (HPleft > HPt2)
stateleft = 1
elseif (HPleft <= HPt2) && (HPleft > HPt3)
stateleft = 2
elseif (HPleft <= HPt3) && (HPleft > HPt4)
stateleft = 3
elseif (HPleft <= HPt4)
stateleft = 4
endif
; see if there was a change in state for this side
if stateleft != prevStateleft
; concatenate and play appropriate blood FX
; ; debug.TraceConditional("|| TEST JOEL: Blood FX State Change: WingLBleed0"+stateleft, bDebug)
selfRef.PlaySubGraphAnimation("WingLBleed0"+stateleft)
endif
endif
if hitDirection == "RIGHT"
int prevStateright = stateright
if (HPright <= HPt1) && (HPright > HPt2)
stateright = 1
elseif (HPright <= HPt2) && (HPright > HPt3)
stateright = 2
elseif (HPright <= HPt3) && (HPright > HPt4)
stateright = 3
elseif (HPright <= HPt4)
stateright = 4
endif
; see if there was a change in state for this side
if stateright != prevStateright
; concatenate and play appropriate blood FX
; ; debug.TraceConditional("|| TEST JOEL: Blood FX State Change: WingRBleed0"+stateright, bDebug)
selfRef.PlaySubGraphAnimation("WingRBleed0"+stateright)
endif
endif
; ==============================================
; store our current HP as the previous for accurate maths on future hits.
previousHP = selfRef.getActorValue("health")
if bDebug == TRUE
; ; debug.TraceConditional("|| TEST JOEL: End of onHit()", bDebug)
bDebug = false
debugVars()
endif
endEVENT
; EVENT onDeath(actor myKiller)
; utility.wait(8.5)
; selfRef.PlaySubGraphAnimation("BloodFade")
; utility.wait(1.5)
; ENDEVENT
;====================================================================
; Initialize a bunch of variables
;====================================================================
FUNCTION dragonBloodInit()
; quick safety net to convert percentages if they are entered incorrectly (ie 75% = 0.75)
; ; debug.TraceConditional("convert % values to integers", bDebug)
if HPpctT1 > 1.0 && HPpctT1 < 100
HPpctT1 = HPpctT1*0.01
endif
if HPpctT2 > 1.0 && HPpctT2 < 100
HPpctT2 = HPpctT2*0.01
endif
if HPpctT2 > 1.0 && HPpctT2 < 100
HPpctT2 = HPpctT2*0.01
endif
if HPpctT3 > 1.0 && HPpctT3 < 100
HPpctT3 = HPpctT3*0.01
endif
; store hard point values so we don't have to always work in percentages later
HPt1 = HPpctT1 * (selfRef.getBaseAV("health"))
HPt2 = HPpctT2 * (selfRef.getBaseAV("health"))
HPt3 = HPpctT3 * (selfRef.getBaseAV("health"))
HPt4 = HPpctT4 * (selfRef.getBaseAV("health"))
; set fake location HP counters to current(assume full?) HP
HPfront = selfRef.getAV("health")
HPback = selfRef.getAV("health")
HPleft = selfRef.getAV("health")
HPright = selfRef.getAV("health")
if bDebug == TRUE
; ; debug.TraceConditional("|| TEST JOEL : finished Init()", bDebug)
debugVars()
endif
endFUNCTION
FUNCTION debugVars()
; ; debug.TraceConditional("||===============================", bDebug)
; ; debug.TraceConditional("|| DRAGON BLOOD FX VARIABLE READOUT", bDebug)
; ; debug.TraceConditional("|| HPpctT1 = "+HPpctT1, bDebug)
; ; debug.TraceConditional("|| HPpctT2 = "+HPpctT2, bDebug)
; ; debug.TraceConditional("|| HPpctT3 = "+HPpctT3, bDebug)
; ; debug.TraceConditional("|| HPpctT4 = "+HPpctT4, bDebug)
; ; debug.TraceConditional("|| HPFront = "+HPFront, bDebug)
; ; debug.TraceConditional("|| HPBack = "+HPBack, bDebug)
; ; debug.TraceConditional("|| HPLeft = "+HPLeft, bDebug)
; ; debug.TraceConditional("|| HPRight = "+HPRight, bDebug)
; ; debug.TraceConditional("|| stateFront = "+stateFront, bDebug)
; ; debug.TraceConditional("|| stateBack = "+stateBack, bDebug)
; ; debug.TraceConditional("|| stateLeft = "+stateLeft, bDebug)
; ; debug.TraceConditional("|| stateRight = "+stateRight, bDebug)
; ; debug.TraceConditional("|| HPt1 = "+HPt1, bDebug)
; ; debug.TraceConditional("|| HPt2 = "+HPt2, bDebug)
; ; debug.TraceConditional("|| HPt3 = "+HPt3, bDebug)
; ; debug.TraceConditional("|| HPt4 = "+HPt4, bDebug)
endFUNCTION
STATE markSTATE
Event OnLoad()
; ;Debug.Trace("This dragon is loaded, playing animations should work now")
endEvent
EVENT OnEffectStart(Actor Target, Actor Caster)
;Play your particles.
selfRef = caster
dragonHealth = selfRef.GetAV("Health") as int
ENDEVENT
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
dragonHealth = selfRef.GetAV("Health") as int
; ; Debug.TraceConditional("Dragon's health is" + dragonHealth, bDebug)
hitAngle = selfRef.GetHeadingAngle(akAggressor)
if hitAngle >= -45 && hitAngle <= 45
; ; Debug.TraceConditional(akAggressor + " angle is " + hitAngle, bDebug)
; ; Debug.TraceConditional("Dragon was hit in front", bDebug)
hitDirection = 0
frontBloodStepper = frontBloodStepper + 1
elseIf hitAngle > 45 && hitAngle < 135
; ; Debug.TraceConditional(akAggressor + " angle is " + hitAngle, bDebug)
; ; Debug.TraceConditional("Dragon was hit on right", bDebug)
hitDirection = 1
rightBloodStepper = rightBloodStepper + 1
elseIf hitAngle >= 135 || hitAngle <= -135
; ; Debug.TraceConditional(akAggressor + " angle is " + hitAngle, bDebug)
; ; Debug.TraceConditional("Dragon was hit in back", bDebug)
hitDirection = 2
backBloodStepper = backBloodStepper + 1
elseIf hitAngle < -45 && hitAngle > -135
; ; Debug.TraceConditional(akAggressor + " angle is " + hitAngle, bDebug)
; ; Debug.TraceConditional("Dragon was hit on left", bDebug)
hitDirection = 3
leftBloodStepper = leftBloodStepper + 1
endif
if hitDirection == 0
if frontBloodStepper <= 4
; ; Debug.TraceConditional("Dragon head blood stage0" + frontBloodStepper, bDebug)
selfRef.PlaySubGraphAnimation("HeadBleed0" + frontBloodStepper)
endif
elseif hitDirection == 1
if rightBloodStepper <= 4
; ; Debug.TraceConditional("Dragon wing r blood stage0" + rightBloodStepper, bDebug)
selfRef.PlaySubGraphAnimation("WingRBleed0" + rightBloodStepper)
endif
elseif hitDirection == 2
if backBloodStepper <= 4
; ; Debug.TraceConditional("Dragon back blood stage0" + backBloodStepper, bDebug)
selfRef.PlaySubGraphAnimation("TailBleed0" + backBloodStepper)
endif
elseif hitDirection == 3
if leftBloodStepper <= 4
; ; Debug.TraceConditional("Dragon wing l blood stage0" + leftBloodStepper, bDebug)
selfRef.PlaySubGraphAnimation("WingLBleed0" + leftBloodStepper)
endif
endif
ENDEVENT
EVENT onDeath(actor myKiller)
; selfRef.UnequipItem(ChaurusSpitSkin)
ENDEVENT
endSTATE