UnrealShare
Class Brute

source: e:\games\UnrealTournament\UnrealShare\Classes\Brute.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Pawn
         |
         +--UnrealShare.ScriptedPawn
            |
            +--UnrealShare.Brute
Direct Known Subclasses:Behemoth, LesserBrute

class Brute
extends UnrealShare.ScriptedPawn

//============================================================================= // Brute. //=============================================================================
Variables
 byte WhipDamage
           Basic damage done by pistol-whip.
 bool bBerserk
           Basic damage done by pistol-whip.
 bool bLongBerserk
           Basic damage done by pistol-whip.
 bool bTurret
           Doesn't move

States
RangedAttack, Charging, Attacking

Function Summary
 eAttitude AttitudeToCreature(Pawn Other)
 bool CanFireAtEnemy()
 void GoBerserk()
 void GutShotTarget()
 void PlayBigDeath(name DamageType)
 void PlayChallenge()
 void PlayGutDeath(name DamageType)
 void PlayHeadDeath(name DamageType)
 void PlayLeftDeath(name DamageType)
 void PlayMeleeAttack()
 void PlayMovingAttack()
 void PlayPatrolStop()
 void PlayRangedAttack()
 void PlayRightDeath(name DamageType)
 void PlayRunning()
 void PlayThreatening()
 void PlayTurning()
 void PlayVictoryDance()
 void PlayWaiting()
 void PlayWaitingAmbush()
 void PlayWalking()
 void PostBeginPlay()
     
// Sounds
 void SpawnLeftShot()
 void SpawnRightShot()
 void Step()
 void TweenToFighter(float tweentime)
 void TweenToPatrolStop(float tweentime)
 void TweenToRunning(float tweentime)
 void TweenToWaiting(float tweentime)
 void TweenToWalking(float tweentime)
 void WhipDamageTarget()


State RangedAttack Function Summary
 void TweenToFighter(float TweenTime)


State Charging Function Summary
 void EndState()
 void BeginState()
 void Timer()
 void AnimEnd()


State Attacking Function Summary
 void ChooseAttackMode()



Source Code


00001	//=============================================================================
00002	// Brute.
00003	//=============================================================================
00004	class Brute extends ScriptedPawn;
00005	
00006	#exec MESH IMPORT MESH=Brute1 ANIVFILE=Models\Brute_a.3D DATAFILE=Models\Brute_d.3D
00007	#exec MESH ORIGIN MESH=Brute1 X=-20 Y=-160 Z=-215 YAW=64 ROLL=-64
00008	
00009	#exec MESH SEQUENCE MESH=Brute1 SEQ=All          STARTFRAME=0   NUMFRAMES=310
00010	#exec MESH SEQUENCE MESH=Brute1 SEQ=GutHit       STARTFRAME=0   NUMFRAMES=1
00011	#exec MESH SEQUENCE MESH=Brute1 SEQ=Breath2      STARTFRAME=1   NUMFRAMES=8  RATE=6
00012	#exec MESH SEQUENCE MESH=Brute1 SEQ=Charge       STARTFRAME=9   NUMFRAMES=10 RATE=15
00013	#exec MESH SEQUENCE MESH=Brute1 SEQ=CockGun      STARTFRAME=19  NUMFRAMES=18 RATE=15
00014	#exec MESH SEQUENCE MESH=Brute1 SEQ=Dead1        STARTFRAME=37  NUMFRAMES=13 RATE=15
00015	#exec MESH SEQUENCE MESH=Brute1 SEQ=Dead2        STARTFRAME=50  NUMFRAMES=15 RATE=15
00016	#exec MESH SEQUENCE MESH=Brute1 SEQ=Dead3        STARTFRAME=65  NUMFRAMES=11 RATE=15
00017	#exec MESH SEQUENCE MESH=Brute1 SEQ=Dead4        STARTFRAME=76  NUMFRAMES=23 RATE=15
00018	#exec MESH SEQUENCE MESH=Brute1 SEQ=Fighter      STARTFRAME=99  NUMFRAMES=1
00019	#exec MESH SEQUENCE MESH=Brute1 SEQ=Gutshot      STARTFRAME=100 NUMFRAMES=34		 Group=Attack
00020	#exec MESH SEQUENCE MESH=Brute1 SEQ=HeadHit      STARTFRAME=134 NUMFRAMES=1
00021	#exec MESH SEQUENCE MESH=Brute1 SEQ=Hit          STARTFRAME=135 NUMFRAMES=5  RATE=15
00022	#exec MESH SEQUENCE MESH=Brute1 SEQ=LeftHit      STARTFRAME=140 NUMFRAMES=1
00023	#exec MESH SEQUENCE MESH=Brute1 SEQ=StillLook    STARTFRAME=141 NUMFRAMES=23 RATE=15
00024	#exec MESH SEQUENCE MESH=Brute1 SEQ=Precharg     STARTFRAME=164 NUMFRAMES=15 RATE=15
00025	#exec MESH SEQUENCE MESH=Brute1 SEQ=PistolWhip   STARTFRAME=179 NUMFRAMES=10 RATE=15 Group=Attack
00026	#exec MESH SEQUENCE MESH=Brute1 SEQ=Punch        STARTFRAME=189 NUMFRAMES=13 RATE=15 Group=Attack
00027	#exec MESH SEQUENCE MESH=Brute1 SEQ=StillFire    STARTFRAME=202 NUMFRAMES=20         Group=Attack
00028	#exec MESH SEQUENCE MESH=Brute1 SEQ=RightHit     STARTFRAME=222 NUMFRAMES=1
00029	#exec MESH SEQUENCE MESH=Brute1 SEQ=Sleep        STARTFRAME=223 NUMFRAMES=6  RATE=6
00030	#exec MESH SEQUENCE MESH=Brute1 SEQ=T8           STARTFRAME=229 NUMFRAMES=12 RATE=15
00031	#exec MESH SEQUENCE MESH=Brute1 SEQ=Walk         STARTFRAME=242 NUMFRAMES=23 RATE=15
00032	#exec MESH SEQUENCE MESH=Brute1 SEQ=WalkFire     STARTFRAME=265 NUMFRAMES=44		 Group=MovingAttack
00033	
00034	#exec TEXTURE IMPORT NAME=jBrute1 FILE=Models\Brute2C.PCX GROUP=Skins
00035	#exec OBJ LOAD FILE=textures\FireEffect18.utx PACKAGE=UnrealShare.Effect18
00036	#exec MESHMAP SCALE MESHMAP=Brute1 X=0.125 Y=0.125 Z=0.25
00037	#exec MESHMAP SETTEXTURE MESHMAP=Brute1 NUM=0 TEXTURE=jBrute1 
00038	#exec MESHMAP SETTEXTURE MESHMAP=Brute1 NUM=1 TEXTURE=UnrealShare.Effect18.FireEffect18
00039	
00040	#exec MESH NOTIFY MESH=Brute1 SEQ=WalkFire TIME=0.18 FUNCTION=SpawnRightShot
00041	#exec MESH NOTIFY MESH=Brute1 SEQ=WalkFire TIME=0.68 FUNCTION=SpawnLeftShot
00042	#exec MESH NOTIFY MESH=Brute1 SEQ=StillFire TIME=0.5 FUNCTION=SpawnLeftShot
00043	#exec MESH NOTIFY MESH=Brute1 SEQ=PistolWhip TIME=0.5 FUNCTION=WhipDamageTarget
00044	#exec MESH NOTIFY MESH=Brute1 SEQ=Punch TIME=0.55 FUNCTION=WhipDamageTarget
00045	#exec MESH NOTIFY MESH=Brute1 SEQ=GutShot TIME=0.3 FUNCTION=GutShotTarget
00046	#exec MESH NOTIFY MESH=Brute1 SEQ=GutShot TIME=0.6 FUNCTION=GutShotTarget
00047	#exec MESH NOTIFY MESH=Brute1 SEQ=Walk TIME=0.31 FUNCTION=Step
00048	#exec MESH NOTIFY MESH=Brute1 SEQ=Walk TIME=0.8 FUNCTION=Step
00049	#exec MESH NOTIFY MESH=Brute1 SEQ=Dead1 TIME=0.56 FUNCTION=LandThump
00050	#exec MESH NOTIFY MESH=Brute1 SEQ=Dead2 TIME=0.5 FUNCTION=LandThump
00051	#exec MESH NOTIFY MESH=Brute1 SEQ=Dead3 TIME=0.52 FUNCTION=LandThump
00052	#exec MESH NOTIFY MESH=Brute1 SEQ=Dead4 TIME=0.71 FUNCTION=LandThump
00053	#exec MESH NOTIFY MESH=Brute1 SEQ=Charge TIME=0.25 FUNCTION=Step
00054	#exec MESH NOTIFY MESH=Brute1 SEQ=Charge TIME=0.75 FUNCTION=Step
00055	
00056	#exec AUDIO IMPORT FILE="Sounds\Brute\walk1a.WAV" NAME="walk1br" GROUP="Brute"
00057	#exec AUDIO IMPORT FILE="Sounds\Brute\pwhip1a.WAV" NAME="pwhip1br" GROUP="Brute"
00058	#exec AUDIO IMPORT FILE="Sounds\Brute\injur1a.WAV" NAME="injur1br" GROUP="Brute"
00059	#exec AUDIO IMPORT FILE="Sounds\Brute\injur2a.WAV" NAME="injur2br" GROUP="Brute"
00060	#exec AUDIO IMPORT FILE="Sounds\Brute\yell1a.WAV" NAME="yell1br" GROUP="Brute"
00061	#exec AUDIO IMPORT FILE="Sounds\Brute\yell2a.WAV" NAME="yell2br" GROUP="Brute"
00062	#exec AUDIO IMPORT FILE="Sounds\Brute\nearby2a.WAV" NAME="nearby2br" GROUP="Brute"
00063	#exec AUDIO IMPORT FILE="Sounds\Brute\death1a.WAV" NAME="death1br" GROUP="Brute"
00064	#exec AUDIO IMPORT FILE="Sounds\Brute\death2br.WAV" NAME="death2br" GROUP="Brute"
00065	#exec AUDIO IMPORT FILE="Sounds\Brute\walk1b.WAV" NAME="walk2br" GROUP="Brute"
00066	#exec AUDIO IMPORT FILE="Sounds\Brute\pstlhit1.WAV" NAME="pstlhit1br" GROUP="Brute"
00067	#exec AUDIO IMPORT FILE="Sounds\Brute\amb1br.WAV" NAME="amb1br" GROUP="Brute"
00068	
00069	//-----------------------------------------------------------------------------
00070	// Brute variables.
00071	
00072	// Attack damage.
00073	var() byte WhipDamage;		// Basic damage done by pistol-whip.
00074	var bool   bBerserk;
00075	var bool   bLongBerserk;
00076	var() bool bTurret;			// Doesn't move
00077	
00078	// Sounds
00079	var(Sounds) sound Footstep;
00080	var(Sounds) sound Footstep2;
00081	var(Sounds) sound PistolWhip;
00082	var(Sounds) sound GutShot;
00083	var(Sounds) sound PistolHit;
00084	var(Sounds) sound Die2;
00085	
00086	function PostBeginPlay()
00087	{
00088		Super.PostBeginPlay();
00089		if (Skill > 1)
00090			bLeadTarget = true;
00091		if ( Skill == 0 )
00092			ProjectileSpeed *= 0.85;
00093		else if ( Skill > 2 )
00094			ProjectileSpeed *= 1.1;
00095	}
00096	
00097	function eAttitude AttitudeToCreature(Pawn Other)
00098	{
00099		if ( Other.IsA('Brute') )
00100			return ATTITUDE_Friendly;
00101		else if ( Other.IsA('Nali') )
00102			return ATTITUDE_Hate;
00103		else
00104			return ATTITUDE_Ignore;
00105	}
00106	
00107	function GoBerserk()
00108	{
00109		bLongBerserk = false;
00110		if ( (bBerserk || ((Health < 0.75 * Default.Health) && (FRand() < 0.65))) 
00111			&& (VSize(Location - Enemy.Location) < 500) )
00112			bBerserk = true;
00113		else 
00114			bBerserk = false;
00115		if ( bBerserk )
00116		{
00117			AccelRate = 4 * AccelRate;
00118			GroundSpeed = 2.5 * Default.GroundSpeed;
00119		}
00120	}
00121	
00122	function PlayWaiting()
00123	{
00124		local float decision;
00125		local float animspeed;
00126	
00127		bReadyToAttack = true;
00128		animspeed = 0.3 + 0.5 * FRand(); //fixme - add to all creatures
00129	
00130		decision = FRand();
00131		if ( AnimSequence == 'Sleep' )
00132		{
00133			if ( decision < 0.07 )
00134			{
00135				SetAlertness(0.0);
00136				PlayAnim('Breath2',animspeed, 0.4);
00137				return;
00138			}
00139			else
00140			{
00141				SetAlertness(-0.3);
00142				PlayAnim('Sleep', 0.3 + 0.3 * FRand());
00143				return;
00144			}
00145		} 
00146		else if ( AnimSequence == 'Breath2' )
00147		{
00148			if ( decision < 0.2 )
00149			{
00150				SetAlertness(-0.3);
00151				PlayAnim('Sleep',animspeed,0.4);
00152				return;
00153			}
00154			else if ( decision < 0.37 )
00155				PlayAnim('StillLook', animspeed);
00156			else if ( decision < 0.55 )
00157				PlayAnim('CockGun', animspeed);
00158			else
00159				PlayAnim('Breath2', 0.3 + 0.3 * FRand(), 0.4);
00160		}
00161		else if ( decision < 0.1 )
00162			PlayAnim('StillLook', animspeed, 0.4);
00163		else
00164			PlayAnim('Breath2', 0.3 + 0.3 * FRand(), 0.4);
00165		
00166		if ( AnimSequence == 'StillLook' )
00167		{
00168			SetAlertness(0.7);
00169			if ( !bQuiet && (FRand() < 0.7) )
00170				PlayRoamingSound();	
00171		}		
00172		else
00173			SetAlertness(0.0);
00174	}
00175	
00176	function PlayThreatening()
00177	{
00178		local float decision;
00179	
00180		decision = FRand();
00181	
00182		if ( decision < 0.7 )
00183			PlayAnim('Breath2', 0.4, 0.3);
00184		else if ( decision < 0.8 )
00185			LoopAnim('PreCharg', 0.4, 0.25);
00186		else
00187		{
00188			PlayThreateningSound();
00189			TweenAnim('Fighter', 0.3);
00190		}
00191	}
00192	
00193	function PlayPatrolStop()
00194	{
00195		local float decision;
00196		local float animspeed;
00197		animspeed = 0.5 + 0.4 * FRand(); //fixme - add to all creatures
00198	
00199		decision = FRand();
00200		if ( AnimSequence == 'Breath2' )
00201		{
00202			if ( decision < 0.4 )
00203				PlayAnim('StillLook', animspeed);
00204			else if (decision < 0.6 )
00205				PlayAnim('CockGun', animspeed);
00206			else
00207				PlayAnim('Breath2', animspeed);
00208		}
00209		else if ( decision < 0.2 )
00210			PlayAnim('StillLook', animspeed);
00211		else
00212			PlayAnim('Breath2', animspeed);
00213			
00214		if ( AnimSequence == 'StillLook' )
00215		{
00216			SetAlertness(0.7);
00217			if ( !bQuiet && (FRand() < 0.7) )
00218				PlayRoamingSound();	
00219		}		
00220		else
00221			SetAlertness(0.0);
00222	}
00223	
00224	function PlayWaitingAmbush()
00225	{
00226		bQuiet = true;
00227		PlayPatrolStop();
00228	}
00229	
00230	function PlayChallenge()
00231	{
00232		PlayAnim('PreCharg', 0.7, 0.2);
00233	}
00234	
00235	function TweenToFighter(float tweentime)
00236	{
00237		TweenAnim('Fighter', tweentime);
00238	}
00239	
00240	function TweenToRunning(float tweentime)
00241	{
00242		if ( bBerserk )
00243			TweenAnim('Charge', tweentime);
00244		if ( IsAnimating() && (AnimSequence == 'WalkFire') )
00245			return;
00246		if (AnimSequence != 'Walk' || !bAnimLoop)
00247			TweenAnim('Walk', tweentime);
00248	}
00249	
00250	function TweenToWalking(float tweentime)
00251	{
00252		TweenAnim('Walk', tweentime);
00253	}
00254	
00255	function TweenToWaiting(float tweentime)
00256	{
00257		TweenAnim('Breath2', tweentime);
00258	}
00259	
00260	function TweenToPatrolStop(float tweentime)
00261	{
00262		TweenAnim('Breath2', tweentime);
00263	}
00264	
00265	function PlayRunning()
00266	{
00267		if (Focus == Destination)
00268		{
00269			LoopAnim('Walk', -1.1/GroundSpeed,,0.4);
00270			return;
00271		}	
00272	
00273		LoopAnim('Walk', StrafeAdjust(),,0.3);
00274	}
00275	
00276	function PlayWalking()
00277	{
00278		LoopAnim('Walk', -1.1/GroundSpeed,,0.4);
00279	}
00280	
00281	function PlayTurning()
00282	{
00283		TweenAnim('Walk', 0.3);
00284	}
00285	
00286	function PlayBigDeath(name DamageType)
00287	{
00288		PlaySound(Die2, SLOT_Talk, 4 * TransientSoundVolume);
00289		PlayAnim('Dead2',0.7,0.1);
00290	}
00291	
00292	function PlayHeadDeath(name DamageType)
00293	{
00294		PlayAnim('Dead4',0.7,0.1);
00295		PlaySound(Die, SLOT_Talk, 4 * TransientSoundVolume);
00296	}
00297	
00298	function PlayLeftDeath(name DamageType)
00299	{
00300		PlayAnim('Dead2',0.7,0.1);
00301		PlaySound(Die,SLOT_Talk, 4 * TransientSoundVolume);
00302	}
00303	
00304	function PlayRightDeath(name DamageType)
00305	{
00306		PlayAnim('Dead3',0.7,0.1);
00307		PlaySound(Die,SLOT_Talk, 4 * TransientSoundVolume);
00308	}
00309	
00310	function PlayGutDeath(name DamageType)
00311	{
00312		PlayAnim('Dead1',0.7,0.1);
00313		PlaySound(Die,SLOT_Talk, 4 * TransientSoundVolume);
00314	}
00315	
00316	function PlayMovingAttack()
00317	{
00318		PlayAnim('WalkFire', 1.1);
00319	}
00320	
00321	function PlayVictoryDance()
00322	{
00323		PlayAnim('PreCharg', 0.7, 0.3);
00324	}
00325	
00326	function bool CanFireAtEnemy()
00327	{
00328		local vector HitLocation, HitNormal,X,Y,Z, projStart, EnemyDir, EnemyUp;
00329		local actor HitActor1, HitActor2;
00330		local float EnemyDist;
00331			
00332		EnemyDir = Enemy.Location - Location;
00333		EnemyDist = VSize(EnemyDir);
00334		EnemyUp = Enemy.CollisionHeight * vect(0,0,0.9);
00335		if ( EnemyDist > 300 )
00336		{
00337			EnemyDir = 300 * EnemyDir/EnemyDist;
00338			EnemyUp = 300 * EnemyUp/EnemyDist;
00339		}
00340	
00341		GetAxes(Rotation,X,Y,Z);
00342		projStart = Location + 0.5 * CollisionRadius * X + 0.8 * CollisionRadius * Y + 0.4 * CollisionRadius * Z;
00343		HitActor1 = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
00344		if ( (HitActor1 != Enemy) && (Pawn(HitActor1) != None) 
00345			&& (AttitudeTo(Pawn(HitActor1)) > ATTITUDE_Ignore) )
00346			return false;
00347			 
00348		projStart = Location + 0.5 * CollisionRadius * X - 0.8 * CollisionRadius * Y + 0.4 * CollisionRadius * Z;
00349		HitActor2 = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
00350	
00351		if ( (HitActor2 == None) || (HitActor2 == Enemy) 
00352			|| ((Pawn(HitActor2) != None) && (AttitudeTo(Pawn(HitActor2)) <= ATTITUDE_Ignore)) )
00353			return true;
00354	
00355		HitActor2 = Trace(HitLocation, HitNormal, projStart + EnemyDir, projStart , true);
00356	
00357		return ( (HitActor2 == None) || (HitActor2 == Enemy) 
00358				|| ((Pawn(HitActor2) != None) && (AttitudeTo(Pawn(HitActor2)) <= ATTITUDE_Ignore)) );
00359	}
00360		
00361	function SpawnLeftShot()
00362	{
00363		FireProjectile( vect(1.2,0.7,0.4), 750);
00364	}
00365	
00366	function SpawnRightShot()
00367	{
00368		FireProjectile( vect(1.2,-0.7,0.4), 750);
00369	}
00370	
00371	function WhipDamageTarget()
00372	{
00373		if ( MeleeDamageTarget(WhipDamage, (WhipDamage * 1000.0 * Normal(Target.Location - Location))) )
00374			PlaySound(PistolWhip, SLOT_Interact);
00375	}
00376	
00377	function Step()
00378	{
00379		if (FRand() < 0.6)
00380			PlaySound(FootStep, SLOT_Interact,,,2000);
00381		else
00382			PlaySound(FootStep2, SLOT_Interact,,,2000);
00383	}
00384	
00385	function GutShotTarget()
00386	{
00387		FireProjectile( vect(1.2,-0.55,0.0), 800);
00388	}
00389	
00390	function PlayMeleeAttack()
00391	{
00392		local float decision;
00393		
00394		decision = FRand();
00395		If ( decision < 0.6 )
00396	 	{
00397	 		PlaySound(PistolWhip, SLOT_Interact);
00398	  		PlayAnim('PistolWhip');
00399	  	}
00400	 	else
00401	 	{
00402			PlaySound(PistolWhip, SLOT_Interact);
00403	 		PlayAnim('Punch');
00404	 	}
00405	}
00406	
00407	function PlayRangedAttack()
00408	{
00409		//FIXME - if going to ranged attack need to
00410		//	TweenAnim('StillFire', 0.2);
00411		//What I need is a tween into time for the PlayAnim()
00412	
00413		if ( (AnimSequence == 'T8') || (VSize(Target.Location - Location) > 230) ) 
00414		{
00415			SpawnRightShot();
00416			PlayAnim('StillFire');
00417		}
00418	  	else
00419	 		PlayAnim('GutShot');
00420	}
00421	
00422	state Attacking
00423	{
00424	ignores SeePlayer, HearNoise, Bump, HitWall;
00425	
00426		function ChooseAttackMode()
00427		{
00428			local eAttitude AttitudeToEnemy;
00429			local float Aggression;
00430			local pawn changeEn;
00431		
00432			if ( !bTurret )
00433			{
00434				Super.ChooseAttackMode();
00435				return;
00436			}
00437				
00438			if ((Enemy == None) || (Enemy.Health <= 0))
00439			{
00440				if (Orders == 'Attacking')
00441					Orders = '';
00442				GotoState('Waiting', 'TurnFromWall');
00443				return;
00444			}
00445	
00446			if (AttitudeToEnemy == ATTITUDE_Threaten)
00447			{
00448				GotoState('Threatening');
00449				return;
00450			}
00451			else if (!LineOfSightTo(Enemy))
00452			{
00453				if ( (OldEnemy != None) 
00454					&& (AttitudeTo(OldEnemy) == ATTITUDE_Hate) && LineOfSightTo(OldEnemy) )
00455				{
00456					changeEn = enemy;
00457					enemy = oldenemy;
00458					oldenemy = changeEn;
00459				}	
00460				else 
00461				{
00462					GotoState('StakeOut');
00463					return;
00464				}
00465			}	
00466			
00467			if (bReadyToAttack)
00468			{
00469				////log("Attack!");
00470				Target = Enemy;
00471				If (VSize(Enemy.Location - Location) <= (MeleeRange + Enemy.CollisionRadius + CollisionRadius))
00472					GotoState('MeleeAttack');
00473				else
00474					GotoState('RangedAttack');
00475				return;
00476			}
00477	
00478			GotoState('RangedAttack', 'Challenge'); 			
00479		}
00480	}
00481	
00482	state Charging
00483	{
00484	ignores SeePlayer, HearNoise;
00485	
00486		function AnimEnd()
00487		{
00488			If ( bBerserk )
00489				LoopAnim('Charge', -1.1/GroundSpeed,,0.5);
00490			else
00491				PlayCombatMove();
00492		}
00493	
00494		function Timer()
00495		{
00496			if ( bBerserk && bLongBerserk && (FRand() < 0.3) )
00497			{
00498				AccelRate = Default.AccelRate;
00499				GroundSpeed = Default.GroundSpeed;
00500				bBerserk = false;
00501			}
00502			bLongBerserk = bBerserk;
00503		
00504			Super.Timer();
00505		}
00506				
00507		function BeginState()
00508		{
00509			GoBerserk();
00510			Super.BeginState();
00511		}
00512	
00513		function EndState()
00514		{
00515			if ( bBerserk )
00516			{
00517				GroundSpeed = Default.GroundSpeed;
00518				AccelRate = Default.AccelRate;
00519			}
00520			Super.EndState();
00521		}
00522	}
00523	
00524	
00525	state RangedAttack
00526	{
00527	ignores SeePlayer, HearNoise, Bump;
00528	
00529		function TweenToFighter(float TweenTime)
00530		{
00531			if ( AnimSequence == 'T8' )
00532				return;
00533			if ( (GetAnimGroup(AnimSequence) == 'Hit') || (Skill > 3 * FRand()) || (VSize(Location - Target.Location) < 320)  )
00534				TweenAnim('Fighter', tweentime);
00535			else
00536				PlayAnim('T8', 1.0, 0.15);
00537		}
00538	}
00539		
00540	
00541	defaultproperties
00542	{
00543	     WhipDamage=20
00544	     footstep=Sound'UnrealShare.Brute.walk1br'
00545	     Footstep2=Sound'UnrealShare.Brute.walk2br'
00546	     PistolWhip=Sound'UnrealShare.Brute.pwhip1br'
00547	     PistolHit=Sound'UnrealShare.Brute.pstlhit1br'
00548	     Die2=Sound'UnrealShare.Brute.death2br'
00549	     CarcassType=Class'UnrealShare.BruteCarcass'
00550	     Aggressiveness=1.000000
00551	     RefireRate=0.300000
00552	     WalkingSpeed=0.600000
00553	     bHasRangedAttack=True
00554	     bMovingRangedAttack=True
00555	     bLeadTarget=False
00556	     RangedProjectile=Class'UnrealShare.BruteProjectile'
00557	     ProjectileSpeed=700.000000
00558	     Acquire=Sound'UnrealShare.Brute.yell1br'
00559	     Fear=Sound'UnrealShare.Brute.injur2br'
00560	     Roam=Sound'UnrealShare.Brute.nearby2br'
00561	     Threaten=Sound'UnrealShare.Brute.yell2br'
00562	     bCanStrafe=True
00563	     MeleeRange=70.000000
00564	     GroundSpeed=140.000000
00565	     WaterSpeed=100.000000
00566	     JumpZ=-1.000000
00567	     Visibility=150
00568	     SightRadius=1500.000000
00569	     Health=340
00570	     ReducedDamageType=exploded
00571	     ReducedDamagePct=0.300000
00572	     UnderWaterTime=60.000000
00573	     HitSound1=Sound'UnrealShare.Brute.injur1br'
00574	     HitSound2=Sound'UnrealShare.Brute.injur2br'
00575	     Land=None
00576	     Die=Sound'UnrealShare.Brute.death1br'
00577	     WaterStep=None
00578	     CombatStyle=0.800000
00579	     AmbientSound=Sound'UnrealShare.Brute.amb1br'
00580	     DrawType=DT_Mesh
00581	     Mesh=LodMesh'UnrealShare.Brute1'
00582	     TransientSoundVolume=3.000000
00583	     CollisionRadius=52.000000
00584	     CollisionHeight=52.000000
00585	     Mass=400.000000
00586	     Buoyancy=390.000000
00587	     RotationRate=(Pitch=3072,Yaw=45000,Roll=0)
00588	}

End Source Code