enderalse/source/scripts/fxdragonblooddamagescript.psc

202 lines
5.9 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.90 auto
{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
;2017-01-05 by Taka2nd ========================
;
;Nexus ver1.2
;・変数をデフォルトのものに戻す
;・不要な変数をコメントアウト
;Nexus ver1.2a
;・不要な変数をコメントアウトを外す
;Nexus ver1.2b
;・機能していない不要なイベント処理を削除
;
;
;・PlaySubAnimation()の頻繁なエラーおよびエラースタック
;↓
;PlaySubAnimation()へのコマンドが逆行および多重化を起こしていた
;→排他制御を行っていなかったのとグローバル変数で計算していたのが原因
;↓
;State文によるの排他の追加および変数の見直しにより解決、それにより多少の負荷軽減効果もあり
;
;・死亡チェックを追加
;・HP計算の不具合→GetActorValuePercentage()に変更
;
;・PlaySubAnimation()の定期的なエラー、Bleed**を順番通りに実行することで解決
;
;
;Entire script rewritten for USLEEP 3.0.10. Used with permission from Taka2nd.
Event OnEffectStart(Actor Target, Actor Caster)
selfRef = Caster
stateFront = 0
stateBack = 0
stateLeft = 0
stateRight = 0
PreviousHP = 1.0
HPfront = 1.0
HPback = 1.0
HPleft = 1.0
HPright = 1.0
;USSEP 4.1.5 for Bug #13547: added this line:
USSEP_RegisterForAnimationEvents (selfRef)
endEvent
State __Busy__
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
endEvent
endState
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
GotoState("__Busy__")
if !selfRef
return ;OnHit Event Finish
endif
if akAggressor
float fCurrentHP = selfRef.GetActorValuePercentage("health")
if fCurrentHP <= 0
return ;OnHit Event Finish
endif
float fDiffHP = PreviousHP - fCurrentHP
if fDiffHP > 0
PreviousHP = fCurrentHP
float fHitAngle = selfRef.GetHeadingAngle(akAggressor)
;FRONT
if fHitAngle >= -45 && fHitAngle <= 45
HPfront -= fDiffHP
if GetBleedState(HPfront) > stateFront
stateFront += 1
selfRef.PlaySubGraphAnimation("HeadBleed0" + stateFront)
endif
;BACK
elseif fHitAngle >= 135 || fHitAngle <= -135
HPback -= fDiffHP
if GetBleedState(HPback) > stateBack
stateBack += 1
selfRef.PlaySubGraphAnimation("TailBleed0" + stateBack)
endif
;LEFT
elseif fHitAngle < 0
HPleft -= fDiffHP
if GetBleedState(HPleft) > stateLeft
stateLeft += 1
selfRef.PlaySubGraphAnimation("WingLBleed0" + stateLeft)
endif
;RIGHT
else
HPright -= fDiffHP
if GetBleedState(HPright) > stateRight
stateRight += 1
selfRef.PlaySubGraphAnimation("WingRBleed0" + stateRight)
endif
endif
endif
endif
;Debug.Trace("OnHit : akAggressor=" + akAggressor + " : akSource=" + akSource + " (" + akSource.GetType() + ") : akProjectile=" + akProjectile)
GotoState("")
endEVENT
int FUNCTION GetBleedState(float fHP)
if fHP > HPpctT1
return 0
elseif fHP > HPpctT2
return 1
elseif fHP > HPpctT3
return 2
elseif fHP > HPpctT4
return 3
endif
return 4
endFUNCTION
;-----------------------------------------------------------------
; Added by USSEP 4.1.5 for Bug #13547:
;-----------------------------------------------------------------
Event OnAnimationEvent (ObjectReference akSource, string asEventName)
;do nothing
EndEvent
function USSEP_RegisterForAnimationEvents (actor dragonRef)
if dragonRef
RegisterForAnimationEvent (dragonRef, "HeadBleed01")
RegisterForAnimationEvent (dragonRef, "HeadBleed02")
RegisterForAnimationEvent (dragonRef, "HeadBleed03")
RegisterForAnimationEvent (dragonRef, "HeadBleed04")
RegisterForAnimationEvent (dragonRef, "TailBleed01")
RegisterForAnimationEvent (dragonRef, "TailBleed02")
RegisterForAnimationEvent (dragonRef, "TailBleed03")
RegisterForAnimationEvent (dragonRef, "TailBleed04")
RegisterForAnimationEvent (dragonRef, "WingLBleed01")
RegisterForAnimationEvent (dragonRef, "WingLBleed02")
RegisterForAnimationEvent (dragonRef, "WingLBleed03")
RegisterForAnimationEvent (dragonRef, "WingLBleed04")
RegisterForAnimationEvent (dragonRef, "WingRBleed01")
RegisterForAnimationEvent (dragonRef, "WingRBleed02")
RegisterForAnimationEvent (dragonRef, "WingRBleed03")
RegisterForAnimationEvent (dragonRef, "WingRBleed04")
endif
endFunction