111 lines
3.2 KiB
Ucode
111 lines
3.2 KiB
Ucode
|
//=============================================================================
|
||
|
// KFSM_Patriarch_Heal
|
||
|
//=============================================================================
|
||
|
// Patriarch's minigun barrage attack
|
||
|
//=============================================================================
|
||
|
// Killing Floor 2
|
||
|
// Copyright (C) 2015 Tripwire Interactive LLC
|
||
|
//=============================================================================
|
||
|
|
||
|
class KFSM_Patriarch_Heal extends KFSM_PlaySingleAnim;
|
||
|
|
||
|
/** Cached reference to pawn */
|
||
|
var KFPawn_ZedPatriarch MyPatPawn;
|
||
|
|
||
|
/** Current battle phase (0-3) */
|
||
|
var int BattlePhase;
|
||
|
|
||
|
/** Heal animation names */
|
||
|
var array<Name> HealAnimNames;
|
||
|
|
||
|
/** Pack the animation type we'll be using (changes depending on battle phase) */
|
||
|
static function byte PackSMFlags( int inBattlePhase )
|
||
|
{
|
||
|
return inBattlePhase - 1;
|
||
|
}
|
||
|
|
||
|
/** Notification called when Special Move starts */
|
||
|
function SpecialMoveStarted( bool bForced, Name PrevMove )
|
||
|
{
|
||
|
MyPatPawn = KFPawn_ZedPatriarch(KFPOwner);
|
||
|
|
||
|
BattlePhase = MyPatPawn.SpecialMoveFlags;
|
||
|
AnimName = HealAnimNames[BattlePhase];
|
||
|
|
||
|
Super.SpecialMoveStarted( bForced,PrevMove );
|
||
|
|
||
|
MyPatPawn.SetTimer( KFSkeletalMeshComponent(MyPatPawn.Mesh).GetAnimInterruptTime(AnimName), false, nameOf(DoHeal), self );
|
||
|
MyPatPawn.RotationRate = rot(0,0,0);
|
||
|
}
|
||
|
|
||
|
function DoHeal()
|
||
|
{
|
||
|
local float HealPercent;
|
||
|
local int HealAmount, MyDifficulty;
|
||
|
|
||
|
if( MyPatPawn != None && MyPatPawn.WorldInfo.Game != None )
|
||
|
{
|
||
|
// Set our difficulty and phase-based heal amount
|
||
|
MyDifficulty = MyPatPawn.WorldInfo.Game.GetModifiedGameDifficulty();
|
||
|
HealPercent = MyPatPawn.BattlePhases[BattlePhase].HealAmounts[MyDifficulty];
|
||
|
|
||
|
// Randomly scale heal amount by +/-5%
|
||
|
HealPercent *= 1.0 + ( fRand() < 0.5f ? float(-Rand(50))*0.001f : float(Rand(50))*0.001f );
|
||
|
|
||
|
// Amount to heal up to is a percentage of max health
|
||
|
HealAmount = int( float(MyPatPawn.HealthMax) * (HealPercent - MyPatPawn.GetHealthPercentage()) );
|
||
|
|
||
|
//`log("HealPercent:"@HealPercent);
|
||
|
//`log("HealAmount:"@HealAmount);
|
||
|
//`log("HealTotal:"@HealAmount+MyPatPawn.Health@"/"@MyPatPawn.HealthMax);
|
||
|
|
||
|
// Perform heal
|
||
|
if( HealAmount > 0 )
|
||
|
{
|
||
|
MyPatPawn.HealDamage( HealAmount, MyPatPawn.Controller, class'KFDT_Healing' );
|
||
|
MyPatPawn.DisablebOnDeathAchivement();
|
||
|
}
|
||
|
|
||
|
// Exit flee and heal phase
|
||
|
MyPatPawn.SetFleeAndHealMode( false );
|
||
|
}
|
||
|
|
||
|
// Play a material effect on the syringe
|
||
|
if( MyPatPawn.WorldInfo.NetMode != NM_DedicatedServer )
|
||
|
{
|
||
|
MyPatPawn.ActiveSyringe = MyPatPawn.CurrentSyringeMeshNum;
|
||
|
MyPatPawn.SyringeInjectTimeRemaining = MyPatPawn.SyringeInjectTimeDuration;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** Special move ended */
|
||
|
function SpecialMoveEnded( Name PrevMove, Name NextMove )
|
||
|
{
|
||
|
if( MyPatPawn != none )
|
||
|
{
|
||
|
MyPatPawn.RotationRate = MyPatPawn.default.RotationRate;
|
||
|
MyPatPawn.ClearTimer( nameOf(DoHeal) );
|
||
|
}
|
||
|
|
||
|
super.SpecialMoveEnded( PrevMove, NextMove );
|
||
|
|
||
|
MyPatPawn = None;
|
||
|
}
|
||
|
|
||
|
DefaultProperties
|
||
|
{
|
||
|
// SpecialMove
|
||
|
Handle=KFSM_Patriarch_Heal
|
||
|
bDisableTurnInPlace=true
|
||
|
bDisableMovement=true
|
||
|
bUseRootmotion=true
|
||
|
bCanBeInterrupted=false
|
||
|
|
||
|
// Animation
|
||
|
HealAnimNames(0)=Heal_V1
|
||
|
HealAnimNames(1)=Heal_V2
|
||
|
HealAnimNames(2)=Heal_V3
|
||
|
|
||
|
BlendInTime=0.15f
|
||
|
BlendOutTime=0.1f
|
||
|
}
|