361 lines
12 KiB
Plaintext
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
|
|
|