UnrealI
Class Mercenary

source: e:\games\UnrealTournament\UnrealI\Classes\Mercenary.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Pawn
         |
         +--UnrealShare.ScriptedPawn
            |
            +--UnrealI.Mercenary
Direct Known Subclasses:MercenaryElite

class Mercenary
extends UnrealShare.ScriptedPawn

//============================================================================= // Mercenary //=============================================================================
Variables
 byte OrdersGiven
 byte PunchDamage
 bool bButtonPusher
 bool bCanFireWhileInvulnerable
 bool bHasInvulnerableShield
 bool bPatroling
 bool bSquatter
 bool bTalker
 float invulnerableCharge
 name phrase

States
RangedAttack, Invulnerable, SpeakOrders

Function Summary
 eAttitude AttitudeToCreature(Pawn Other)
 void BecomeInvulnerable()
 void BecomeNormal()
 bool CanFireAtEnemy()
 void ChooseLeaderAttack()
 void HitDamageTarget()
 void PainTimer()
 void PlayBigDeath(name DamageType)
 void PlayChallenge()
 void PlayDive()
 void PlayGutDeath(name DamageType)
 void PlayHeadDeath(name DamageType)
 void PlayInAir()
 void PlayLanded(float impactVel)
 void PlayLeftDeath(name DamageType)
 void PlayMeleeAttack()
 void PlayMovingAttack()
 void PlayOutOfWater()
 void PlayPatrolStop()
 void PlayRangedAttack()
 void PlayRightDeath(name DamageType)
 void PlayRunning()
 void PlaySwimming()
 void PlayThreatening()
 void PlayTurning()
 void PlayVictoryDance()
 void PlayWaiting()
 void PlayWaitingAmbush()
 void PlayWalking()
 void PreBeginPlay()
     
//======================================================================
// Mercenary Functions
 void SetMovementPhysics()
 void SpawnRocket()
 void Speak()
 void SpeakOrderTo(ScriptedPawn TeamMember)
 void SpeakTo(ScriptedPawn Other)
 void SpeechTimer()
     
//=========================================================================================
// Speech
 void SprayTarget()
 void Step()
     
//=========================================================================================
 void TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType)
 void TryToDuck(vector duckDir, bool bReversed)
 void TweenToFalling()
 void TweenToFighter(float tweentime)
 void TweenToPatrolStop(float tweentime)
 void TweenToRunning(float tweentime)
 void TweenToSwimming(float tweentime)
 void TweenToWaiting(float tweentime)
 void TweenToWalking(float tweentime)
 void WalkStep()
 void WarnTarget(Pawn shooter, float projSpeed, vector FireDir)
 void ZoneChange(ZoneInfo newZone)


State RangedAttack Function Summary
 void BeginState()
 void TryToDuck(vector duckDir, bool bReversed)


State Invulnerable Function Summary
 void AnimEnd()
 void TryToDuck(vector duckDir, bool bReversed)


State SpeakOrders Function Summary
 void EnemyNotVisible()
 void TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType)
 void Killed(Pawn Killer, Pawn Other, name damageType)



Source Code


00001	//=============================================================================
00002	// Mercenary
00003	//=============================================================================
00004	class Mercenary extends ScriptedPawn;
00005	
00006	#exec MESH IMPORT MESH=Merc ANIVFILE=MODELS\Merc_a.3D DATAFILE=MODELS\Merc_d.3D X=0 Y=0 Z=0 ZEROTEX=1
00007	#exec MESH ORIGIN MESH=Merc X=00 Y=-230 Z=-40 YAW=64 ROLL=-64
00008	
00009	#exec MESH SEQUENCE MESH=Merc SEQ=All      STARTFRAME=0   NUMFRAMES=447
00010	#exec MESH SEQUENCE MESH=Merc SEQ=Breath   STARTFRAME=0   NUMFRAMES=9   RATE=6
00011	#exec MESH SEQUENCE MESH=Merc SEQ=Button1  STARTFRAME=9   NUMFRAMES=8   RATE=15
00012	#exec MESH SEQUENCE MESH=Merc SEQ=Button2  STARTFRAME=17  NUMFRAMES=8   RATE=15
00013	#exec MESH SEQUENCE MESH=Merc SEQ=Button3  STARTFRAME=25  NUMFRAMES=8   RATE=15
00014	#exec MESH SEQUENCE MESH=Merc SEQ=Button4  STARTFRAME=33  NUMFRAMES=8   RATE=15
00015	#exec MESH SEQUENCE MESH=Merc SEQ=Button5  STARTFRAME=41  NUMFRAMES=10  RATE=15
00016	#exec MESH SEQUENCE MESH=Merc SEQ=Button6  STARTFRAME=51  NUMFRAMES=10  RATE=15
00017	#exec MESH SEQUENCE MESH=Merc SEQ=MButton1 STARTFRAME=9   NUMFRAMES=24  RATE=15
00018	#exec MESH SEQUENCE MESH=Merc SEQ=MButton2 STARTFRAME=17  NUMFRAMES=24  RATE=15
00019	#exec MESH SEQUENCE MESH=Merc SEQ=MButton3 STARTFRAME=25  NUMFRAMES=26  RATE=15
00020	#exec MESH SEQUENCE MESH=Merc SEQ=MButton4 STARTFRAME=33  NUMFRAMES=28  RATE=15
00021	#exec MESH SEQUENCE MESH=Merc SEQ=Death    STARTFRAME=61  NUMFRAMES=33  RATE=15
00022	#exec MESH SEQUENCE MESH=Merc SEQ=Dead2    STARTFRAME=94  NUMFRAMES=16  RATE=15
00023	#exec MESH SEQUENCE MESH=Merc SEQ=Dead3    STARTFRAME=110 NUMFRAMES=18  RATE=15
00024	#exec MESH SEQUENCE MESH=Merc SEQ=Dead4    STARTFRAME=128 NUMFRAMES=16  RATE=15
00025	#exec MESH SEQUENCE MESH=Merc SEQ=Duck     STARTFRAME=144 NUMFRAMES=1            Group=Ducking
00026	#exec MESH SEQUENCE MESH=Merc SEQ=HeadHit  STARTFRAME=145 NUMFRAMES=1
00027	#exec MESH SEQUENCE MESH=Merc SEQ=LeftHit  STARTFRAME=146 NUMFRAMES=1
00028	#exec MESH SEQUENCE MESH=Merc SEQ=GutHit   STARTFRAME=147 NUMFRAMES=1
00029	#exec MESH SEQUENCE MESH=Merc SEQ=RightHit STARTFRAME=148 NUMFRAMES=1
00030	#exec MESH SEQUENCE MESH=Merc SEQ=Jump     STARTFRAME=149 NUMFRAMES=15  RATE=15
00031	#exec MESH SEQUENCE MESH=Merc SEQ=Jump2    STARTFRAME=164 NUMFRAMES=1
00032	#exec MESH SEQUENCE MESH=Merc SEQ=Land     STARTFRAME=165 NUMFRAMES=1
00033	#exec MESH SEQUENCE MESH=Merc SEQ=Punch    STARTFRAME=166 NUMFRAMES=10  RATE=15  Group=Attack
00034	#exec MESH SEQUENCE MESH=Merc SEQ=Run      STARTFRAME=176 NUMFRAMES=10  RATE=15
00035	#exec MESH SEQUENCE MESH=Merc SEQ=Shoot    STARTFRAME=186 NUMFRAMES=5   RATE=15  Group=Attack
00036	#exec MESH SEQUENCE MESH=Merc SEQ=Spray    STARTFRAME=191 NUMFRAMES=15  RATE=15  Group=Attack
00037	#exec MESH SEQUENCE MESH=Merc SEQ=Squat1   STARTFRAME=206 NUMFRAMES=10  RATE=15
00038	#exec MESH SEQUENCE MESH=Merc SEQ=Squat2   STARTFRAME=216 NUMFRAMES=18  RATE=15
00039	#exec MESH SEQUENCE MESH=Merc SEQ=Squat3   STARTFRAME=234 NUMFRAMES=7   RATE=6
00040	#exec MESH SEQUENCE MESH=Merc SEQ=Stealth1 STARTFRAME=241 NUMFRAMES=4   RATE=6   Group=Attack
00041	#exec MESH SEQUENCE MESH=Merc SEQ=Stealth2 STARTFRAME=245 NUMFRAMES=3   RATE=6   Group=Attack
00042	#exec MESH SEQUENCE MESH=Merc SEQ=Swat     STARTFRAME=248 NUMFRAMES=10  RATE=15  Group=Attack
00043	#exec MESH SEQUENCE MESH=Merc SEQ=Swim     STARTFRAME=258 NUMFRAMES=15  RATE=15
00044	#exec MESH SEQUENCE MESH=Merc SEQ=Talk1    STARTFRAME=273 NUMFRAMES=13  RATE=15
00045	#exec MESH SEQUENCE MESH=Merc SEQ=Talk2    STARTFRAME=286 NUMFRAMES=15  RATE=15
00046	#exec MESH SEQUENCE MESH=Merc SEQ=Talk3    STARTFRAME=301 NUMFRAMES=23  RATE=15
00047	#exec MESH SEQUENCE MESH=Merc SEQ=Walk     STARTFRAME=324 NUMFRAMES=15  RATE=15
00048	#exec MESH SEQUENCE MESH=Merc SEQ=WalkFire STARTFRAME=339 NUMFRAMES=15  RATE=15  Group=MovingAttack
00049	#exec MESH SEQUENCE MESH=Merc SEQ=WalkSpray STARTFRAME=339 NUMFRAMES=15 RATE=15  Group=MovingAttack
00050	#exec MESH SEQUENCE MESH=Merc SEQ=Weapon   STARTFRAME=354 NUMFRAMES=10  RATE=6
00051	#exec MESH SEQUENCE MESH=Merc SEQ=Fighter  STARTFRAME=166 NUMFRAMES=1
00052	#exec MESH SEQUENCE MESH=Merc SEQ=ChargeUp STARTFRAME=364 NUMFRAMES=16  RATE=15
00053	#exec MESH SEQUENCE MESH=Merc SEQ=BigDance STARTFRAME=364 NUMFRAMES=31  RATE=15
00054	#exec MESH SEQUENCE MESH=Merc SEQ=Dance    STARTFRAME=380 NUMFRAMES=15  RATE=15
00055	#exec MESH SEQUENCE MESH=Merc SEQ=Dead5    STARTFRAME=395 NUMFRAMES=26  RATE=15
00056	#exec MESH SEQUENCE MESH=Merc SEQ=NeckCrak STARTFRAME=421 NUMFRAMES=10  RATE=6
00057	#exec MESH SEQUENCE MESH=Merc SEQ=SwimFire STARTFRAME=431 NUMFRAMES=15  RATE=15
00058	#exec MESH SEQUENCE MESH=Merc SEQ=TiedUp   STARTFRAME=446 NUMFRAMES=1  
00059	
00060	#exec TEXTURE IMPORT NAME=JMerc1 FILE=MODELS\Mercenar.PCX GROUP=Skins 
00061	#exec TEXTURE IMPORT NAME=Silver FILE=MODELS\Silver.PCX GROUP=Skins 
00062	#exec MESHMAP SCALE MESHMAP=Merc X=0.082 Y=0.082 Z=0.164
00063	#exec MESHMAP SETTEXTURE MESHMAP=Merc NUM=0 TEXTURE=JMerc1
00064	
00065	#exec MESH NOTIFY MESH=Merc SEQ=Swat TIME=0.48 FUNCTION=HitDamageTarget
00066	#exec MESH NOTIFY MESH=Merc SEQ=Punch TIME=0.48 FUNCTION=HitDamageTarget
00067	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.16 FUNCTION=SprayTarget
00068	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.26 FUNCTION=SprayTarget
00069	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.36 FUNCTION=SprayTarget
00070	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.46 FUNCTION=SprayTarget
00071	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.56 FUNCTION=SprayTarget
00072	#exec MESH NOTIFY MESH=Merc SEQ=Spray TIME=0.66 FUNCTION=SprayTarget
00073	#exec MESH NOTIFY MESH=Merc SEQ=WalkSpray TIME=0.2 FUNCTION=SprayTarget
00074	#exec MESH NOTIFY MESH=Merc SEQ=WalkSpray TIME=0.3 FUNCTION=SprayTarget
00075	#exec MESH NOTIFY MESH=Merc SEQ=WalkSpray TIME=0.4 FUNCTION=SprayTarget
00076	#exec MESH NOTIFY MESH=Merc SEQ=Run TIME=0.3 FUNCTION=Step
00077	#exec MESH NOTIFY MESH=Merc SEQ=Run TIME=0.8 FUNCTION=Step
00078	#exec MESH NOTIFY MESH=Merc SEQ=Walk TIME=0.33 FUNCTION=WalkStep
00079	#exec MESH NOTIFY MESH=Merc SEQ=Walk TIME=0.83 FUNCTION=WalkStep
00080	#exec MESH NOTIFY MESH=Merc SEQ=WalkFire TIME=0.2 FUNCTION=SpawnRocket
00081	#exec MESH NOTIFY MESH=Merc SEQ=WalkFire TIME=0.83 FUNCTION=Step
00082	#exec MESH NOTIFY MESH=Merc SEQ=SwimFire TIME=0.2 FUNCTION=SpawnRocket
00083	#exec MESH NOTIFY MESH=Merc SEQ=Death TIME=0.72 FUNCTION=LandThump
00084	#exec MESH NOTIFY MESH=Merc SEQ=Dead2 TIME=0.64 FUNCTION=LandThump
00085	#exec MESH NOTIFY MESH=Merc SEQ=Dead3 TIME=0.69 FUNCTION=LandThump
00086	#exec MESH NOTIFY MESH=Merc SEQ=Dead4 TIME=0.81 FUNCTION=LandThump
00087	#exec MESH NOTIFY MESH=Merc SEQ=Dead5 TIME=0.76 FUNCTION=LandThump
00088	#exec MESH NOTIFY MESH=Merc SEQ=Dead5 TIME=0.325 FUNCTION=SprayTarget
00089	#exec MESH NOTIFY MESH=Merc SEQ=Dead5 TIME=0.5  FUNCTION=SprayTarget
00090	
00091	#exec AUDIO IMPORT FILE="Sounds\Mercenary\amb1mr.WAV" NAME="amb1mr" GROUP="Mercenary"
00092	#exec AUDIO IMPORT FILE="Sounds\Mercenary\merspr4a.WAV" NAME="spray1mr" GROUP="Mercenary"
00093	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl01.WAV" NAME="syl1mr" GROUP="Mercenary"
00094	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl02.WAV" NAME="syl2mr" GROUP="Mercenary"
00095	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl03.WAV" NAME="syl3mr" GROUP="Mercenary"
00096	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl04.WAV" NAME="syl4mr" GROUP="Mercenary"
00097	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl05.WAV" NAME="syl5mr" GROUP="Mercenary"
00098	#exec AUDIO IMPORT FILE="Sounds\Mercenary\syl11.WAV" NAME="syl6mr" GROUP="Mercenary"
00099	#exec AUDIO IMPORT FILE="Sounds\Mercenary\swat1mr.WAV" NAME="swat1mr" GROUP="Mercenary"
00100	#exec AUDIO IMPORT FILE="Sounds\Mercenary\injur2a.WAV" NAME="injur2mr" GROUP="Mercenary"
00101	#exec AUDIO IMPORT FILE="Sounds\Mercenary\injur3a.WAV" NAME="injur3mr" GROUP="Mercenary"
00102	#exec AUDIO IMPORT FILE="Sounds\Mercenary\chlng2a.WAV" NAME="chlng2mr" GROUP="Mercenary"
00103	#exec AUDIO IMPORT FILE="Sounds\Mercenary\nearbymr.WAV" NAME="nearbymr" GROUP="Mercenary"
00104	#exec AUDIO IMPORT FILE="Sounds\Mercenary\weapon1a.WAV" NAME="weapon1mr" GROUP="Mercenary"
00105	#exec AUDIO IMPORT FILE="Sounds\Mercenary\chlng3a.WAV" NAME="chlng3mr" GROUP="Mercenary"
00106	#exec AUDIO IMPORT FILE="Sounds\Mercenary\land1a.WAV" NAME="land1mr" GROUP="Mercenary"
00107	#exec AUDIO IMPORT FILE="Sounds\Mercenary\walk2mr.WAV" NAME="walk2mr" GROUP="Mercenary"
00108	#exec AUDIO IMPORT FILE="Sounds\Mercenary\death1a.WAV" NAME="death1mr" GROUP="Mercenary"
00109	#exec AUDIO IMPORT FILE="Sounds\Mercenary\death2b.WAV" NAME="death2mr" GROUP="Mercenary"
00110	#exec AUDIO IMPORT FILE="Sounds\Mercenary\death3b.WAV" NAME="death3mr" GROUP="Mercenary"
00111	#exec AUDIO IMPORT FILE="Sounds\Mercenary\flip1mr.WAV" NAME="flip1mr" GROUP="Mercenary"
00112	#exec AUDIO IMPORT FILE="Sounds\Mercenary\hit1mr.WAV" NAME="hit1mr" GROUP="Mercenary"
00113	// FIXME - also have sound breathmr
00114	
00115	//======================================================================
00116	// Mercenary Functions
00117	
00118	var() byte PunchDamage;
00119	var() byte OrdersGiven;
00120	var() bool	bButtonPusher;
00121	var() bool  bTalker;
00122	var() bool	bSquatter;
00123	var   bool	bPatroling;
00124	var() bool	bHasInvulnerableShield;
00125	var() bool	bCanFireWhileInvulnerable;
00126	var	  bool  bIsInvulnerable;
00127	var	  bool	bAlertedTeam;
00128	
00129	var(Sounds) sound Punch;
00130	var(Sounds) sound PunchHit;
00131	var(Sounds) sound Flip;
00132	var(Sounds) sound CheckWeapon;
00133	var(Sounds) sound WeaponSpray;
00134	var(Sounds) sound syllable1;
00135	var(Sounds) sound syllable2;
00136	var(Sounds) sound syllable3;
00137	var(Sounds) sound syllable4;
00138	var(Sounds) sound syllable5;
00139	var(Sounds) sound syllable6;
00140	var(Sounds) sound breath;
00141	var(Sounds) sound footstep1;
00142	var 	name phrase;
00143	var		byte phrasesyllable;
00144	var		float	voicePitch;
00145	var		int		sprayoffset;
00146	var		float	invulnerableTime;
00147	var()	float	invulnerableCharge;
00148	
00149	//======================================================================
00150	// Mercenary Functions
00151	
00152	function PreBeginPlay()
00153	{
00154		bCanSpeak = true;
00155		voicePitch = 0.5 + 0.75 * FRand();
00156		Super.PreBeginPlay();
00157		if ( bHasInvulnerableShield )
00158			bHasInvulnerableShield = ( Skill > 2.5 * FRand() - 1 ); 
00159		bCanDuck = bHasInvulnerableShield;
00160		if ( bMovingRangedAttack )
00161			bMovingRangedAttack = ( 0.2 * Skill + 0.3 > FRand() );
00162	}
00163	
00164	function ZoneChange(ZoneInfo newZone)
00165	{
00166		bCanSwim = newZone.bWaterZone; //only when it must
00167			
00168		if ( newZone.bWaterZone )
00169			CombatStyle = 1.0; //always charges when in the water
00170		else if (Physics == PHYS_Swimming)
00171			CombatStyle = Default.CombatStyle;
00172	
00173		Super.ZoneChange(newZone);
00174	}
00175	
00176	event FootZoneChange(ZoneInfo newFootZone)
00177	{
00178		local float OldPainTime;
00179	
00180		OldPainTime = PainTime;
00181		Super.FootZoneChange(newFootZone);
00182		if ( bIsInvulnerable && (PainTime <= 0) )
00183			PainTime = FMax(OldPainTime, 0.1);
00184	} 
00185	
00186	event HeadZoneChange(ZoneInfo newHeadZone)
00187	{
00188		local float OldPainTime;
00189	
00190		OldPainTime = PainTime;
00191		Super.HeadZoneChange(newHeadZone);
00192		if ( bIsInvulnerable && (PainTime <= 0) )
00193			PainTime = FMax(OldPainTime, 0.1);
00194	}
00195	
00196	function SetMovementPhysics()
00197	{
00198		if ( Region.Zone.bWaterZone )
00199			SetPhysics(PHYS_Swimming);
00200		else if (Physics != PHYS_Walking)
00201			SetPhysics(PHYS_Walking); 
00202	}
00203	
00204	function TryToDuck(vector duckDir, bool bReversed)
00205	{
00206		BecomeInvulnerable();
00207	}
00208	
00209	function BecomeInvulnerable()
00210	{
00211		if ( bIsInvulnerable )
00212			return;
00213		if ( invulnerableTime > 0 )
00214		{
00215			InvulnerableCharge += (Level.TimeSeconds - InvulnerableTime)/2;
00216			InvulnerableTime = Level.TimeSeconds;
00217		}
00218		if ( InvulnerableCharge > 4 )
00219			GotoState('Invulnerable');
00220	
00221	}
00222	
00223	function BecomeNormal()
00224	{
00225		AmbientGlow = 0;
00226		bUnlit = false;
00227		bMeshEnviroMap = false;
00228		LightType = LT_None;
00229		InvulnerableTime = Level.TimeSeconds;
00230		bIsInvulnerable = false;
00231		if ( !Region.Zone.bPainZone )
00232			PainTime = -1.0;
00233	}
00234	
00235	function PainTimer()
00236	{
00237		if ( Health <= 0 )
00238			return;
00239		if ( !bIsInvulnerable )
00240		{
00241			if ( bHasInvulnerableShield && Region.Zone.bPainZone && (Region.Zone.DamagePerSec > 0) )
00242				BecomeInvulnerable();
00243			Super.PainTimer();
00244			if ( bIsInvulnerable )
00245				PainTime = 1.0;
00246			return;
00247		}
00248		
00249		InvulnerableCharge -= 1.0;
00250		if ( (InvulnerableCharge < 0) || (Level.TimeSeconds - InvulnerableTime > 4 + 5 * FRand()) )
00251			BecomeNormal();
00252		else
00253			PainTime = 1.0;
00254	
00255	}
00256			
00257	function WarnTarget(Pawn shooter, float projSpeed, vector FireDir)
00258	{
00259		if ( !bIsInvulnerable )
00260			Super.WarnTarget(shooter, projSpeed, FireDir);
00261	}
00262	
00263	function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
00264							Vector momentum, name damageType)
00265	{
00266		if ( !bIsInvulnerable )
00267			Super.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType);
00268		else if ( Damage > 0 )
00269		{
00270			InvulnerableCharge = InvulnerableCharge - Damage/100;
00271			PainTime = 0.3;
00272			//change to take-damage invulnerable skin
00273		}
00274	}
00275	
00276	
00277	function eAttitude AttitudeToCreature(Pawn Other)
00278	{
00279		if ( Other.IsA('Mercenary') )
00280			return ATTITUDE_Friendly;
00281		else
00282			return ATTITUDE_Ignore;
00283	}
00284	
00285	//=========================================================================================
00286	// Speech
00287	
00288	function SpeechTimer()
00289	{
00290		//last syllable expired.  Decide whether to keep the floor or quit
00291		if (FRand() < 0.3)
00292		{
00293			bIsSpeaking = false;
00294			if (TeamLeader != None)
00295				TeamLeader.bTeamSpeaking = false;
00296		}
00297		else
00298			Speak();
00299	}
00300	
00301	function SpeakOrderTo(ScriptedPawn TeamMember)
00302	{
00303		phrase = '';
00304		if ( !TeamMember.bCanSpeak || (FRand() < 0.5) )
00305			Speak();
00306		else  
00307		{
00308			if (Mercenary(TeamMember) != None)
00309				Mercenary(TeamMember).phrase = '';
00310			TeamMember.Speak();
00311		}
00312	}
00313	
00314	function SpeakTo(ScriptedPawn Other)
00315	{
00316		if (Other.bIsSpeaking || ((TeamLeader != None) && TeamLeader.bTeamSpeaking) )
00317			return;
00318		
00319		phrase = '';
00320		Speak();
00321	}
00322	
00323	function Speak()
00324	{
00325		local float decision;
00326		
00327		//if (phrase != '')
00328		//	SpeakPhrase();
00329		bIsSpeaking = true;
00330		decision = FRand();
00331		if (TeamLeader != None)	
00332			TeamLeader.bTeamSpeaking = true;
00333		if (decision < 0.167)
00334			PlaySound(Syllable1,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00335		else if (decision < 0.333)
00336			PlaySound(Syllable2,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00337		else if (decision < 0.5)
00338			PlaySound(Syllable3,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00339		else if (decision < 0.667)
00340			PlaySound(Syllable4,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00341		else if (decision < 0.833)
00342			PlaySound(Syllable5,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00343		else 
00344			PlaySound(Syllable6,SLOT_Talk,0.3 + 2 * FRand(),,, FRand() + voicePitch);
00345	
00346		SpeechTime = 0.1 + 0.3 * FRand();
00347	}
00348	
00349	//=========================================================================================
00350	function Step()
00351	{
00352		PlaySound(footstep1, SLOT_Interact,,,1500);
00353	}
00354	
00355	function WalkStep()
00356	{
00357		PlaySound(footstep1, SLOT_Interact,0.2,,500);
00358	}
00359	
00360	function PlayWaiting()
00361	{
00362		local float decision;
00363		local float animspeed;
00364		if (Region.Zone.bWaterZone)
00365		{
00366			PlaySwimming();
00367			return;
00368		}
00369		animspeed = 0.4 + 0.6 * FRand(); 
00370		decision = FRand();
00371	
00372		if ( bButtonPusher )
00373		{
00374			SetAlertness(-1.0);
00375			if (decision < 0.3)
00376				LoopAnim('Breath', animspeed, 1.0);
00377			else if (decision < 0.4)
00378				LoopAnim('MButton1', animspeed);
00379			else if (decision < 0.5)
00380				LoopAnim('MButton2', animspeed);
00381			else if (decision < 0.6)
00382				LoopAnim('MButton3', animspeed);
00383			else if (decision < 0.7)
00384				LoopAnim('MButton4', animspeed);
00385			else if (decision < 0.75)
00386				LoopAnim('Button1', animspeed);
00387			else if (decision < 0.80)
00388				LoopAnim('Button2', animspeed);
00389			else if (decision < 0.85)
00390				LoopAnim('Button3', animspeed);
00391			else if (decision < 0.90)
00392				LoopAnim('Button4', animspeed);
00393			else if (decision < 0.95)
00394				LoopAnim('Button5', animspeed);
00395			else
00396				LoopAnim('Button6', animspeed);
00397			return;
00398		}
00399		else if ( bTalker ) 
00400		{
00401			SetAlertness(-0.5);
00402			if ( (TeamLeader == None) || TeamLeader.bTeamSpeaking )
00403			{
00404				if ( FRand() < 0.1 )
00405					LoopAnim('NeckCrak', animspeed, 0.5);
00406				else
00407					LoopAnim('Breath', animspeed, 0.5);
00408				return;
00409			}
00410			phrase = '';
00411			Speak();
00412	
00413			if (decision < 0.5)
00414				LoopAnim('Talk1', animspeed, 0.5);
00415			else if (decision < 0.75)
00416				LoopAnim('Talk2', animspeed, 0.5);
00417			else
00418				LoopAnim('Talk3', animspeed, 0.5);
00419			return;
00420		}
00421		else if ( bSquatter )
00422		{
00423			SetAlertness(-0.5);
00424			if ( (TeamLeader == None) || TeamLeader.bTeamSpeaking )
00425			{
00426				LoopAnim('Squat3', animspeed);
00427				return;
00428			}
00429			phrase = '';
00430			Speak();
00431			if (decision < 0.5)
00432				LoopAnim('Squat1', animspeed);
00433			else
00434				LoopAnim('Squat2', animspeed);
00435			return;
00436		}
00437	
00438		SetAlertness(0.0);
00439		if ( bPatroling )
00440			decision *= 0.4;
00441		if ( (AnimSequence == 'Breath') && (decision < 0.15) )
00442		{
00443			LoopAnim('Weapon', animspeed);			
00444			PlaySound(CheckWeapon, SLOT_Interact);			
00445		}
00446		else if ( (AnimSequence == 'Breath') && (decision < 0.25) )
00447			LoopAnim('NeckCrak', animspeed);			
00448		else 
00449			LoopAnim('Breath', animspeed);
00450		bPatroling = false;			
00451	}
00452	
00453	function PlayPatrolStop()
00454	{
00455		bPatroling = true;
00456		PlayWaiting();
00457	}
00458	
00459	function PlayWaitingAmbush()
00460	{
00461		PlayWaiting();
00462	}
00463		
00464	function PlayChallenge()
00465	{
00466		if (Region.Zone.bWaterZone)
00467		{
00468			PlaySwimming();
00469			return;
00470		}
00471		if ( TryToCrouch() )
00472		{
00473			TweenAnim('Duck', 0.12);
00474			return;
00475		}	
00476		PlayThreateningSound();
00477		if ( FRand() < 0.6 )
00478			PlayAnim('Talk1', 0.7, 0.2);
00479		else 
00480			PlayAnim('Talk2', 0.7, 0.2);
00481	}
00482	
00483	
00484	function PlayDive()
00485	{
00486		TweenToSwimming(0.2);
00487	}
00488	
00489	function TweenToFighter(float tweentime)
00490	{
00491		bButtonPusher = false;
00492		bTalker = false;
00493		bSquatter = false;
00494		if (Region.Zone.bWaterZone)
00495		{
00496			TweenToSwimming(tweentime);
00497			return;
00498		}
00499		TweenAnim('Fighter', tweentime);
00500	}
00501	
00502	function TweenToRunning(float tweentime)
00503	{
00504		bButtonPusher = false;
00505		bTalker = false;
00506		bSquatter = false;
00507		if (Region.Zone.bWaterZone)
00508		{
00509			TweenToSwimming(tweentime);
00510			return;
00511		}
00512		if (AnimSequence != 'Run' || !bAnimLoop)
00513			TweenAnim('Run', tweentime);
00514	}
00515	
00516	function TweenToWalking(float tweentime)
00517	{
00518		if (Region.Zone.bWaterZone)
00519		{
00520			TweenToSwimming(tweentime);
00521			return;
00522		}
00523		TweenAnim('Walk', tweentime);
00524	}
00525	
00526	function TweenToWaiting(float tweentime)
00527	{
00528		if (Region.Zone.bWaterZone)
00529		{
00530			TweenToSwimming(tweentime);
00531			return;
00532		}
00533		if ( bSquatter )
00534		{
00535			TweenAnim('Squat3', tweentime);
00536			return;
00537		}
00538		TweenAnim('Breath', tweentime);
00539	}
00540	
00541	function TweenToPatrolStop(float tweentime)
00542	{
00543		if (Region.Zone.bWaterZone)
00544		{
00545			TweenToSwimming(tweentime);
00546			return;
00547		}
00548		TweenAnim('Breath', tweentime);
00549	}
00550	
00551	function PlayRunning()
00552	{
00553		DesiredSpeed = 1.0;
00554		if (Region.Zone.bWaterZone)
00555		{
00556			PlaySwimming();
00557			return;
00558		}
00559	
00560		if (Focus == Destination)
00561		{
00562			LoopAnim('Run', -1.0/GroundSpeed,, 0.4);
00563			return;
00564		}	
00565	
00566		LoopAnim('Run', StrafeAdjust(),,0.3);
00567	
00568	}
00569	
00570	function PlayWalking()
00571	{
00572		if (Region.Zone.bWaterZone)
00573		{
00574			PlaySwimming();
00575			return;
00576		}
00577		LoopAnim('Walk', 0.8);
00578	}
00579	
00580	
00581	function TweenToSwimming(float tweentime)
00582	{
00583		if (AnimSequence != 'Swim' || !bAnimLoop)
00584			TweenAnim('Swim', tweentime);
00585	}
00586	
00587	function PlaySwimming()
00588	{
00589		LoopAnim('Swim', -1.0/GroundSpeed,,0.3);
00590	}
00591	
00592	
00593	function TweenToFalling()
00594	{
00595		TweenAnim('Jump2', 0.35);
00596	}
00597	
00598	function PlayInAir()
00599	{
00600		TweenAnim('Jump2', 0.2);
00601	}
00602	
00603	function PlayOutOfWater()
00604	{
00605		TweenAnim('Land', 0.8);
00606	}
00607	
00608	function PlayLanded(float impactVel)
00609	{
00610		TweenAnim('Land', 0.1);
00611	}
00612	
00613	function PlayMovingAttack()
00614	{
00615		if ( bIsInvulnerable && !bCanFireWhileInvulnerable )
00616		{
00617			if ( Level.TimeSeconds - InvulnerableTime < 4 )
00618			{
00619				PlayRunning();
00620				return;
00621			}
00622			else
00623				BecomeNormal();
00624		}	
00625		if (Region.Zone.bWaterZone)
00626		{
00627			PlayAnim('SwimFire');
00628			return;
00629		}
00630		DesiredSpeed = 0.4;
00631		MoveTimer += 0.2;
00632		if ( FRand() < 0.5 )
00633		{
00634			if ( GetAnimGroup(AnimSequence) == 'MovingAttack' )
00635				PlayAnim('WalkFire');
00636			else
00637				PlayAnim('WalkFire', 1.0, 0.05);
00638		}
00639		else
00640		{
00641			sprayoffset = 0;
00642			PlaySound(WeaponSpray, SLOT_Interact);
00643			if ( GetAnimGroup(AnimSequence) == 'MovingAttack' )
00644				PlayAnim('WalkSpray');
00645			else
00646				PlayAnim('WalkSpray', 1.0, 0.05);
00647		}
00648	}
00649	
00650	function PlayThreatening()
00651	{
00652		local float decision, animspeed;
00653	
00654		if (Region.Zone.bWaterZone)
00655		{
00656			PlaySwimming();
00657			return;
00658		}
00659		decision = FRand();
00660		animspeed = 0.6 + 0.4 * FRand(); 
00661	
00662		if ( decision < 0.3 )
00663			PlayAnim('Breath', animspeed, 0.25);
00664		else if ( decision < 0.45 )
00665			PlayAnim('Weapon', animspeed, 0.25);
00666		else
00667		{
00668			PlayThreateningSound();
00669			if ( decision < 0.65 )
00670				TweenAnim('Fighter', 0.3);
00671			else if ( decision < 0.85 )
00672				PlayAnim('Talk1', animspeed, 0.25);
00673			else 
00674				PlayAnim('Talk2', animspeed, 0.25);
00675		}
00676	}
00677	
00678	function PlayTurning()
00679	{
00680		if (Region.Zone.bWaterZone)
00681		{
00682			PlaySwimming();
00683			return;
00684		}
00685		TweenAnim('Walk', 0.3);
00686	}
00687	
00688	function PlayBigDeath(name DamageType)
00689	{
00690		PlayAnim('Dead2',0.7,0.1);
00691		PlaySound(sound'Death3mr', SLOT_Talk, 4 * TransientSoundVolume);
00692	}
00693	
00694	function PlayHeadDeath(name DamageType)
00695	{
00696		local carcass carc;
00697	
00698		if ( ((DamageType == 'Decapitated') || ((Health < -20) && (FRand() < 0.5)))
00699			 && !Level.Game.bVeryLowGore )
00700		{
00701			carc = Spawn(class 'CreatureChunks',,, Location + CollisionHeight * vect(0,0,0.8), Rotation + rot(3000,0,16384) );
00702			if (carc != None)
00703			{
00704				carc.Mesh = mesh'MercHead';
00705				carc.Initfor(self);
00706				carc.Velocity = Velocity + VSize(Velocity) * VRand();
00707				carc.Velocity.Z = FMax(carc.Velocity.Z, Velocity.Z);
00708			}
00709			PlayAnim('Dead5',0.7,0.1);
00710			SprayOffset = 0;
00711		}
00712		else
00713			PlayAnim('Death',0.7,0.1);
00714		PlaySound(Die, SLOT_Talk, 4 * TransientSoundVolume);
00715	}
00716	
00717	function PlayLeftDeath(name DamageType)
00718	{
00719		PlayAnim('Dead4',0.7,0.1);
00720		PlaySound(sound'Death2mr', SLOT_Talk, 4 * TransientSoundVolume);
00721	}
00722	
00723	function PlayRightDeath(name DamageType)
00724	{
00725		PlayAnim('Death',0.7,0.1);
00726		PlaySound(Die, SLOT_Talk, 4 * TransientSoundVolume);
00727	}
00728	
00729	function PlayGutDeath(name DamageType)
00730	{
00731		PlayAnim('Dead3',0.7,0.1);
00732		PlaySound(sound'Death2mr', SLOT_Talk, 4 * TransientSoundVolume);
00733	}
00734	
00735	function PlayVictoryDance()
00736	{
00737		//if ( FRand() < 0.5 )
00738		//{
00739			PlaySound(Flip, SLOT_Interact);
00740			PlayAnim('Jump', 1.0, 0.1);
00741		//}
00742		//else
00743		//	PlayAnim('BigDance', 0.7, 0.25);
00744	}
00745	
00746	function PlayMeleeAttack()
00747	{
00748		local float decision;
00749		decision = FRand();
00750		if (AnimSequence == 'Swat')
00751			decision -= 0.2;
00752	
00753		PlaySound(Punch, SLOT_Interact);
00754		If (decision < 0.3)
00755	 		PlayAnim('Punch'); 
00756	 	else
00757	  		PlayAnim('Swat');
00758	}
00759	
00760	function bool CanFireAtEnemy()
00761	{
00762		local vector HitLocation, HitNormal,X,Y,Z, projStart, EnemyDir, EnemyUp;
00763		local actor HitActor;
00764		local float EnemyDist;
00765			
00766		EnemyDir = Enemy.Location - Location;
00767		EnemyDist = VSize(EnemyDir);
00768		EnemyUp = Enemy.CollisionHeight * vect(0,0,0.9);
00769		if ( EnemyDist > 300 )
00770		{
00771			EnemyDir = 300 * EnemyDir/EnemyDist;
00772			EnemyUp = 300 * EnemyUp/EnemyDist;
00773		}
00774		
00775		GetAxes(Rotation,X,Y,Z);
00776		projStart = Location + 0.9 * CollisionRadius * X - 0.6 * CollisionRadius * Y;
00777		HitActor = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
00778	
00779		if ( (HitActor == None) || (HitActor == Enemy) 
00780			|| ((Pawn(HitActor) != None) && (AttitudeTo(Pawn(HitActor)) <= ATTITUDE_Ignore)) )
00781			return true;
00782	
00783		HitActor = Trace(HitLocation, HitNormal, projStart + EnemyDir, projStart , true);
00784	
00785		return ( (HitActor == None) || (HitActor == Enemy) 
00786				|| ((Pawn(HitActor) != None) && (AttitudeTo(Pawn(HitActor)) <= ATTITUDE_Ignore)) );
00787	}
00788	
00789	function SpawnRocket()
00790	{
00791		FireProjectile( vect(0.9, -0.4, 0), 400);
00792	}
00793	
00794	function SprayTarget()
00795	{
00796		local vector EndTrace, fireDir;
00797		local vector HitNormal, HitLocation;
00798		local actor HitActor;
00799		local rotator AdjRot;
00800		local vector X,Y,Z;
00801	
00802		AdjRot = Rotation;
00803		if ( AnimSequence == 'Dead5' )
00804			AdjRot.Yaw += 3000 * (2 - sprayOffset);
00805		else
00806			AdjRot.Yaw += 1000 * (3 - sprayOffset);
00807		sprayoffset++;
00808		fireDir = vector(AdjRot);
00809		if ( (sprayoffset == 1) || (sprayoffset == 3) || (sprayoffset == 5) )
00810		{
00811			GetAxes(Rotation,X,Y,Z);
00812			if ( AnimSequence == 'Spray' )
00813				spawn(class'MercFlare', self, '', Location + 1.25 * CollisionRadius * X - CollisionRadius * (0.2 * sprayoffset - 0.3) * Y);
00814			else
00815				spawn(class'MercFlare', self, '', Location + 1.25 * CollisionRadius * X - CollisionRadius * (0.1 * sprayoffset - 0.1) * Y);
00816		}
00817		if ( AnimSequence == 'Dead5' )
00818			sprayoffset++;
00819		EndTrace = Location + 2000 * fireDir; 
00820		EndTrace.Z = Target.Location.Z + Target.CollisionHeight * 0.6;
00821		HitActor = TraceShot(HitLocation,HitNormal,EndTrace,Location);
00822		if (HitActor == Level)   // Hit a wall
00823		{
00824			spawn(class'SmallSpark2',,,HitLocation+HitNormal*5,rotator(HitNormal*2+VRand()));
00825			spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9);		
00826		}
00827		else if ((HitActor != self) && (HitActor != Owner))
00828		{
00829			HitActor.TakeDamage(10, self, HitLocation, 10000.0*fireDir, 'shot');			
00830			spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9);		
00831		} 
00832	}
00833	
00834	
00835	function HitDamageTarget()
00836	{
00837		if (MeleeDamageTarget(PunchDamage, (PunchDamage * 1000 * Normal(Target.Location - Location))))
00838			PlaySound(PunchHit, SLOT_Interact);
00839	}
00840	
00841	function PlayRangedAttack()
00842	{
00843		//FIXME - if going to ranged attack need to
00844		//	TweenAnim('StillFire', 0.2);
00845		//What I need is a tween into time for the PlayAnim()
00846	
00847		if ( bIsInvulnerable && !bCanFireWhileInvulnerable )
00848		{
00849			if ( Level.TimeSeconds - InvulnerableTime > 3 )
00850				BecomeNormal();	
00851			else if ( FRand() < 0.75 )
00852			{
00853				PlayChallenge();
00854				return;
00855			}
00856		}
00857	
00858		if (Region.Zone.bWaterZone)
00859		{
00860			PlayAnim('SwimFire');
00861			return;
00862		}
00863	
00864		MakeNoise(1.0);
00865		if (FRand() < 0.35)
00866		{
00867			PlayAnim('Shoot');
00868			SpawnRocket();
00869		}
00870		else
00871		{
00872			sprayoffset = 0;
00873			PlaySound(WeaponSpray, SLOT_Interact);
00874			PlayAnim('Spray');
00875		}
00876	}
00877	
00878	function ChooseLeaderAttack()
00879	{
00880		if ( bReadyToAttack && bHasInvulnerableShield && !bIsInvulnerable && (InvulnerableCharge > 0) )
00881		{
00882			BecomeInvulnerable();
00883			if ( IsInState('Invulnerable') )
00884				return;
00885		}
00886		if ( !bAlertedTeam && (OrdersGiven < 2) )
00887		{
00888			OrdersGiven = OrdersGiven + 1; 
00889			GotoState('SpeakOrders');
00890		}
00891		else
00892			GotoState('TacticalMove', 'NoCharge');
00893	}
00894	
00895	state SpeakOrders
00896	{
00897		ignores SeePlayer, HearNoise, Bump;
00898	
00899	
00900		function Killed(pawn Killer, pawn Other, name damageType)
00901		{
00902			Super.Killed(Killer, Other, damageType);
00903			if ( (Health > 0) && !bTeamLeader )
00904				GotoState('Attacking');
00905		}
00906	
00907		function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, 
00908								Vector momentum, name damageType)
00909		{
00910			Global.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType);
00911			if ( health <= 0 )
00912				return;
00913			if (NextState == 'TakeHit')
00914			{
00915				NextState = 'Attacking'; 
00916				NextLabel = 'Begin';
00917				GotoState('TakeHit'); 
00918			}
00919		}
00920			
00921		function EnemyNotVisible()
00922		{
00923		}
00924			
00925	Begin:
00926		bAlertedTeam = true;
00927		Acceleration = vect(0,0,0);
00928		if (NeedToTurn(enemy.Location))
00929		{
00930			PlayTurning();
00931			TurnToward(Enemy);
00932		}
00933		TweenAnim('Talk2', 0.1);
00934		FinishAnim();
00935		phrase = '';
00936		Speak();
00937		if (FRand() < 0.5)
00938			PlayAnim('Talk2', 0.6);
00939		else
00940			PlayAnim('Talk3', 0.6);
00941		FinishAnim();
00942		if (FRand() < 0.3)
00943			Goto('Done');	
00944		if (FRand() < 0.5)
00945			PlayAnim('Talk2', 0.9);
00946		else
00947			PlayAnim('Talk3', 0.9);
00948		FinishAnim();
00949	Done:
00950		bReadyToAttack = true;
00951		GotoState('Attacking');
00952	}
00953	
00954	state Invulnerable
00955	{
00956		ignores SeePlayer, HearNoise, Bump;
00957	
00958		function TryToDuck(vector duckDir, bool bReversed)
00959		{
00960		}
00961	
00962		function AnimEnd()
00963		{
00964			if (AnimSequence == 'Stealth1')
00965			{
00966				bIsInvulnerable = true;
00967				bMeshEnviroMap = true;
00968				invulnerableTime = Level.TimeSeconds;
00969				PainTime = 1.0;
00970				AmbientGlow = 70;
00971				bUnlit = true;
00972				LightType=LT_Pulse;
00973				PlayAnim('Stealth2');
00974			}
00975			else
00976				GotoState('Attacking');
00977		}		
00978			
00979	Begin:
00980		Acceleration = vect(0,0,0);
00981		PlayAnim('Stealth1', 1.4, 0.07);
00982	KeepTurning:
00983		TurnToward(Enemy);
00984		Sleep(0.0);
00985		Goto('KeepTurning');
00986	}
00987	
00988	state RangedAttack
00989	{
00990	ignores SeePlayer, HearNoise;
00991	
00992		function TryToDuck(vector duckDir, bool bReversed)
00993		{
00994			if ( bCanFireWhileInvulnerable || (FRand() < 0.5) )
00995				BecomeInvulnerable();
00996		}
00997	
00998		function BeginState()
00999		{
01000			Super.BeginState();
01001			if ( !bIsInvulnerable && bHasInvulnerableShield 
01002				&& bCanFireWhileInvulnerable && (InvulnerableCharge > 4) && (FRand() > 0.75) )
01003			{
01004				bReadyToAttack = true;
01005				BecomeInvulnerable();
01006			}
01007		}
01008	}
01009	
01010	defaultproperties
01011	{
01012	     PunchDamage=20
01013	     bHasInvulnerableShield=True
01014	     Punch=Sound'UnrealI.Mercenary.swat1mr'
01015	     PunchHit=Sound'UnrealI.Mercenary.hit1mr'
01016	     Flip=Sound'UnrealI.Mercenary.flip1mr'
01017	     CheckWeapon=Sound'UnrealI.Mercenary.weapon1mr'
01018	     WeaponSpray=Sound'UnrealI.Mercenary.spray1mr'
01019	     syllable1=Sound'UnrealI.Mercenary.syl1mr'
01020	     syllable2=Sound'UnrealI.Mercenary.syl2mr'
01021	     syllable3=Sound'UnrealI.Mercenary.syl3mr'
01022	     syllable4=Sound'UnrealI.Mercenary.syl4mr'
01023	     syllable5=Sound'UnrealI.Mercenary.syl5mr'
01024	     syllable6=Sound'UnrealI.Mercenary.syl6mr'
01025	     Footstep1=Sound'UnrealI.Mercenary.walk2mr'
01026	     invulnerableCharge=9.000000
01027	     CarcassType=Class'UnrealI.MercCarcass'
01028	     Aggressiveness=0.500000
01029	     RefireRate=0.500000
01030	     bHasRangedAttack=True
01031	     bMovingRangedAttack=True
01032	     bGreenBlood=True
01033	     RangedProjectile=Class'UnrealI.MercRocket'
01034	     Acquire=Sound'UnrealI.Mercenary.chlng2mr'
01035	     Fear=Sound'UnrealI.Mercenary.chlng3mr'
01036	     Roam=Sound'UnrealI.Mercenary.nearbymr'
01037	     Threaten=Sound'UnrealI.Mercenary.chlng3mr'
01038	     bCanStrafe=True
01039	     MeleeRange=50.000000
01040	     GroundSpeed=280.000000
01041	     AirSpeed=300.000000
01042	     AccelRate=800.000000
01043	     Health=180
01044	     UnderWaterTime=-1.000000
01045	     Intelligence=BRAINS_HUMAN
01046	     HitSound1=Sound'UnrealI.Mercenary.injur2mr'
01047	     HitSound2=Sound'UnrealI.Mercenary.injur3mr'
01048	     Land=Sound'UnrealI.Mercenary.land1mr'
01049	     Die=Sound'UnrealI.Mercenary.death1mr'
01050	     CombatStyle=0.500000
01051	     AmbientSound=Sound'UnrealI.Mercenary.amb1mr'
01052	     DrawType=DT_Mesh
01053	     Texture=Texture'UnrealI.Skins.Silver'
01054	     Mesh=LodMesh'UnrealI.Merc'
01055	     CollisionRadius=35.000000
01056	     CollisionHeight=48.000000
01057	     LightEffect=LE_NonIncidence
01058	     LightBrightness=255
01059	     LightHue=170
01060	     LightSaturation=96
01061	     LightRadius=12
01062	     Mass=150.000000
01063	     Buoyancy=150.000000
01064	     RotationRate=(Pitch=3072,Yaw=65000,Roll=0)
01065	}

End Source Code