126 lines
3.1 KiB
Ucode
126 lines
3.1 KiB
Ucode
//-----------------------------------------------------------
|
|
//Still behaves like a Fleshpound for the most part, although quicker to rage.
|
|
//Thanks to Scary for the work on this one. - Whisky
|
|
//-----------------------------------------------------------
|
|
class FFPController extends FleshpoundZombieController;
|
|
|
|
var bool bFindNewEnemy, bSmashDoor, bStartled, bAttackedTarget, bMissTarget;
|
|
var float prevRageTimer,prevRageThreshold;
|
|
|
|
//I fear nothing but you WILL fear me!!
|
|
//FFP will not bother trying to avoid nades when raged, prevents players from using their nades to stop her in a door.
|
|
//(I know because as a medic I was doing it all the time. - Whisky)
|
|
function FearThisSpot(AvoidMarker aSpot)
|
|
{
|
|
local FemaleFP FFP;
|
|
FFP = FemaleFP(Pawn);
|
|
|
|
if (!FFP.bChargingPlayer)
|
|
{
|
|
if ( Skill > 1 + 2.0 * FRand() )
|
|
super(Controller).FearThisSpot(aSpot);
|
|
}
|
|
}
|
|
|
|
function PostBeginPlay()
|
|
{
|
|
super.PostBeginPlay();
|
|
prevRageThreshold= default.RageFrustrationThreshhold + (Frand() * 5);
|
|
}
|
|
|
|
function bool FindNewEnemy()
|
|
{
|
|
bFindNewEnemy= true;
|
|
return super.FindNewEnemy();
|
|
}
|
|
|
|
function BreakUpDoor(KFDoorMover Other, bool bTryDistanceAttack)
|
|
{
|
|
bSmashDoor= true;
|
|
super.BreakUpDoor(Other,bTryDistanceAttack);
|
|
}
|
|
|
|
function Startle(Actor Feared)
|
|
{
|
|
bStartled= True;
|
|
super.Startle(Feared);
|
|
}
|
|
|
|
state SpinAttack
|
|
{
|
|
ignores EnemyNotVisible, GetOutOfTheWayOfShot;
|
|
|
|
function DoSpinDamage()
|
|
{
|
|
local Actor A;
|
|
|
|
//log("FLESHPOUND DOSPINDAMAGE!");
|
|
foreach CollidingActors(class'actor', A, (KFM.MeleeRange * 1.5)+pawn.CollisionRadius, pawn.Location)
|
|
FemaleFP(pawn).SpinDamage(A);
|
|
}
|
|
|
|
Begin:
|
|
|
|
WaitForAnim:
|
|
While( KFM.bShotAnim )
|
|
{
|
|
Sleep(0.1);
|
|
DoSpinDamage();
|
|
}
|
|
|
|
WhatToDoNext(152);
|
|
if ( bSoaking )
|
|
SoakStop("STUCK IN SPINATTACK!!!");
|
|
}
|
|
|
|
state ZombieCharge
|
|
{
|
|
function BeginState()
|
|
{
|
|
super.BeginState();
|
|
|
|
if (!bSmashDoor && ((bAttackedTarget && bMissTarget) || bFindNewEnemy || bStartled))
|
|
{
|
|
RageFrustrationTimer= prevRageTimer;
|
|
RageFrustrationThreshhold= prevRageThreshold;
|
|
}
|
|
bFindNewEnemy= false;
|
|
bSmashDoor= false;
|
|
bStartled= false;
|
|
bAttackedTarget= false;
|
|
bMissTarget= false;
|
|
}
|
|
|
|
function EndState()
|
|
{
|
|
prevRageTimer= RageFrustrationTimer;
|
|
prevRageThreshold= RageFrustrationThreshhold;
|
|
}
|
|
|
|
function Tick( float Delta )
|
|
{
|
|
local FemaleFP FFP;
|
|
|
|
Global.Tick(Delta);
|
|
|
|
// Make the FP rage if we haven't reached our enemy after a certain amount of time
|
|
if( RageFrustrationTimer < RageFrustrationThreshhold ) {
|
|
RageFrustrationTimer += Delta;
|
|
|
|
if( RageFrustrationTimer >= RageFrustrationThreshhold ) {
|
|
FFP = FemaleFP(Pawn);
|
|
|
|
if( FFP != none && !FFP.bChargingPlayer ) {
|
|
FFP.StartCharging();
|
|
FFP.bFrustrated = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
RageFrustrationThreshhold=30.000000
|
|
}
|