UnrealShare
Class SkaarjWarrior

source: e:\games\UnrealTournament\UnrealShare\Classes\SkaarjWarrior.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Pawn
         |
         +--UnrealShare.ScriptedPawn
            |
            +--UnrealShare.Skaarj
               |
               +--UnrealShare.SkaarjWarrior
Direct Known Subclasses:IceSkaarj, SkaarjAssassin, SkaarjBerserker, SkaarjLord, SkaarjScout

class SkaarjWarrior
extends UnrealShare.Skaarj

//============================================================================= // Skaarj. //=============================================================================

Function Summary
 bool CanFireAtEnemy()
 void PlayChallenge()
 void PlayCock()
 void PlayMovingAttack()
 void PlayPatrolStop()
 void PlayRangedAttack()
 void PlayRunning()
 void PlayThreatening()
 void PlayVictoryDance()
 void PostBeginPlay()
     
//=========================================================================================
 void SpawnTwoShots()
 void TryToDuck(vector duckDir, bool bReversed)



Source Code


00001	//=============================================================================
00002	// Skaarj.
00003	//=============================================================================
00004	class SkaarjWarrior extends Skaarj;
00005		
00006	#exec MESH IMPORT MESH=Skaarjw ANIVFILE=MODELS\Skaarj_a.3D DATAFILE=MODELS\Skaarj_d.3D X=0 Y=0 Z=0 ZEROTEX=1 LODSTYLE=2
00007	#exec MESH LODPARAMS MESH=Skaarjw  MINVERTS=130
00008	#exec MESH ORIGIN MESH=Skaarjw X=0 Y=-20 Z=-20 YAW=64 ROLL=-64
00009	
00010	#exec MESH SEQUENCE MESH=Skaarjw SEQ=All		  STARTFRAME=0   NUMFRAMES=542
00011	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Claw         STARTFRAME=0   NUMFRAMES=11  RATE=15  Group=Attack
00012	#exec MESH SEQUENCE MESH=Skaarjw SEQ=GutHit       STARTFRAME=11  NUMFRAMES=1
00013	#exec MESH SEQUENCE MESH=Skaarjw SEQ=guncheck     STARTFRAME=12  NUMFRAMES=7   RATE=6
00014	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Breath       STARTFRAME=19  NUMFRAMES=12  RATE=6
00015	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Breath2      STARTFRAME=31  NUMFRAMES=8   RATE=6
00016	#exec MESH SEQUENCE MESH=Skaarjw SEQ=MButton1     STARTFRAME=39  NUMFRAMES=33  RATE=15
00017	#exec MESH SEQUENCE MESH=Skaarjw SEQ=MButton2     STARTFRAME=49  NUMFRAMES=33  RATE=15
00018	#exec MESH SEQUENCE MESH=Skaarjw SEQ=MButton3     STARTFRAME=59  NUMFRAMES=36  RATE=15
00019	#exec MESH SEQUENCE MESH=Skaarjw SEQ=MButton4     STARTFRAME=72  NUMFRAMES=23  RATE=15
00020	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Button1      STARTFRAME=39  NUMFRAMES=10  RATE=15
00021	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Button2      STARTFRAME=49  NUMFRAMES=10  RATE=15
00022	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Button3      STARTFRAME=59  NUMFRAMES=13  RATE=15
00023	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Button4      STARTFRAME=72  NUMFRAMES=10  RATE=15
00024	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Button5      STARTFRAME=82  NUMFRAMES=13  RATE=15
00025	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Death        STARTFRAME=95  NUMFRAMES=23  RATE=15
00026	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Death2       STARTFRAME=118 NUMFRAMES=13  RATE=15
00027	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Death3       STARTFRAME=131 NUMFRAMES=21  RATE=15
00028	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Death4       STARTFRAME=152 NUMFRAMES=11  RATE=15
00029	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Duck         STARTFRAME=163 NUMFRAMES=1            Group=Ducking
00030	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Fighter      STARTFRAME=164 NUMFRAMES=15  RATE=15
00031	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Firing       STARTFRAME=179 NUMFRAMES=11  RATE=15  Group=Attack
00032	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Getup        STARTFRAME=190 NUMFRAMES=11  RATE=15
00033	#exec MESH SEQUENCE MESH=Skaarjw SEQ=HairFlip     STARTFRAME=201 NUMFRAMES=20  RATE=15
00034	#exec MESH SEQUENCE MESH=Skaarjw SEQ=HeadHit      STARTFRAME=221 NUMFRAMES=1
00035	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Headup       STARTFRAME=222 NUMFRAMES=11  RATE=15
00036	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Jog2Fight    STARTFRAME=233 NUMFRAMES=11  RATE=15
00037	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Jog          STARTFRAME=244 NUMFRAMES=10  RATE=15
00038	#exec MESH SEQUENCE MESH=Skaarjw SEQ=FullJump     STARTFRAME=254 NUMFRAMES=15  RATE=15
00039	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Jump         STARTFRAME=254 NUMFRAMES=5   RATE=15
00040	#exec MESH SEQUENCE MESH=Skaarjw SEQ=InAir        STARTFRAME=259 NUMFRAMES=1   
00041	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Landed       STARTFRAME=266 NUMFRAMES=1  
00042	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Jump2        STARTFRAME=269 NUMFRAMES=1
00043	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Land         STARTFRAME=270 NUMFRAMES=1
00044	#exec MESH SEQUENCE MESH=Skaarjw SEQ=LeftDodge    STARTFRAME=271 NUMFRAMES=13  RATE=15
00045	#exec MESH SEQUENCE MESH=Skaarjw SEQ=LeftHit      STARTFRAME=284 NUMFRAMES=1
00046	#exec MESH SEQUENCE MESH=Skaarjw SEQ=StrafeLeftFr STARTFRAME=285 NUMFRAMES=14  RATE=15  Group=MovingAttack
00047	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Looking      STARTFRAME=299 NUMFRAMES=23  RATE=15
00048	#exec MESH SEQUENCE MESH=Skaarjw SEQ=StrafeLeft   STARTFRAME=322 NUMFRAMES=14  RATE=15
00049	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Lunge        STARTFRAME=336 NUMFRAMES=13  RATE=15  Group=Attack
00050	#exec MESH SEQUENCE MESH=Skaarjw SEQ=StrafeRightFr STARTFRAME=349 NUMFRAMES=14 RATE=15  Group=MovingAttack
00051	#exec MESH SEQUENCE MESH=Skaarjw SEQ=RightHit     STARTFRAME=363 NUMFRAMES=1
00052	#exec MESH SEQUENCE MESH=Skaarjw SEQ=StrafeRight  STARTFRAME=364 NUMFRAMES=14  RATE=15
00053	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Spin         STARTFRAME=378 NUMFRAMES=20           Group=Attack
00054	#exec MESH SEQUENCE MESH=Skaarjw SEQ=gunfix       STARTFRAME=398 NUMFRAMES=8   RATE=6
00055	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Swim         STARTFRAME=406 NUMFRAMES=15  RATE=15
00056	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Walk         STARTFRAME=421 NUMFRAMES=15  RATE=15
00057	#exec MESH SEQUENCE MESH=Skaarjw SEQ=WalkFire     STARTFRAME=436 NUMFRAMES=15  RATE=15  Group=MovingAttack 
00058	#exec MESH SEQUENCE MESH=Skaarjw SEQ=RightDodge   STARTFRAME=451 NUMFRAMES=13  RATE=15
00059	#exec MESH SEQUENCE MESH=Skaarjw SEQ=JogFire      STARTFRAME=464 NUMFRAMES=10  RATE=15  Group=MovingAttack
00060	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Death5       STARTFRAME=474 NUMFRAMES=28  RATE=15  Group=MovingAttack
00061	#exec MESH SEQUENCE MESH=Skaarjw SEQ=Stretch      STARTFRAME=502 NUMFRAMES=25  RATE=15  Group=MovingAttack
00062	#exec MESH SEQUENCE MESH=Skaarjw SEQ=SwimFire     STARTFRAME=527 NUMFRAMES=15  RATE=15  Group=MovingAttack
00063	
00064	#exec TEXTURE IMPORT NAME=Skaarjw1 FILE=MODELS\Skaarj.PCX GROUP=Skins 
00065	#exec MESHMAP SCALE MESHMAP=Skaarjw X=0.1 Y=0.1 Z=0.2
00066	#exec MESHMAP SETTEXTURE MESHMAP=Skaarjw NUM=0 TEXTURE=Skaarjw1
00067	
00068	#exec MESH NOTIFY MESH=Skaarjw SEQ=WalkFire TIME=0.5 FUNCTION=SpawnTwoShots
00069	#exec MESH NOTIFY MESH=Skaarjw SEQ=JogFire TIME=0.5 FUNCTION=SpawnTwoShots
00070	#exec MESH NOTIFY MESH=Skaarjw SEQ=SwimFire TIME=0.5 FUNCTION=SpawnTwoShots
00071	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeLeftFr TIME=0.5 FUNCTION=SpawnTwoShots
00072	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeRightFr TIME=0.5 FUNCTION=SpawnTwoShots
00073	#exec MESH NOTIFY MESH=Skaarjw SEQ=Firing TIME=0.25 FUNCTION=SpawnTwoShots
00074	#exec MESH NOTIFY MESH=Skaarjw SEQ=Spin TIME=0.48 FUNCTION=SpinDamageTarget
00075	#exec MESH NOTIFY MESH=Skaarjw SEQ=Spin TIME=0.67 FUNCTION=SpinDamageTarget
00076	#exec MESH NOTIFY MESH=Skaarjw SEQ=Claw TIME=0.24 FUNCTION=ClawDamageTarget
00077	#exec MESH NOTIFY MESH=Skaarjw SEQ=Claw TIME=0.76 FUNCTION=ClawDamageTarget
00078	#exec MESH NOTIFY MESH=Skaarjw SEQ=Death TIME=0.41 FUNCTION=LandThump
00079	#exec MESH NOTIFY MESH=Skaarjw SEQ=Death2 TIME=0.61 FUNCTION=LandThump
00080	#exec MESH NOTIFY MESH=Skaarjw SEQ=Death3 TIME=0.73 FUNCTION=LandThump
00081	#exec MESH NOTIFY MESH=Skaarjw SEQ=Death4 TIME=0.62 FUNCTION=LandThump
00082	#exec MESH NOTIFY MESH=Skaarjw SEQ=Death5 TIME=0.82 FUNCTION=LandThump
00083	#exec MESH NOTIFY MESH=Skaarjw SEQ=Walk TIME=0.3 FUNCTION=WalkStep
00084	#exec MESH NOTIFY MESH=Skaarjw SEQ=Walk TIME=0.8 FUNCTION=WalkStep
00085	#exec MESH NOTIFY MESH=Skaarjw SEQ=WalkFire TIME=0.3 FUNCTION=WalkStep
00086	#exec MESH NOTIFY MESH=Skaarjw SEQ=WalkFire TIME=0.8 FUNCTION=WalkStep
00087	#exec MESH NOTIFY MESH=Skaarjw SEQ=Jog TIME=0.25 FUNCTION=RunStep
00088	#exec MESH NOTIFY MESH=Skaarjw SEQ=Jog TIME=0.75 FUNCTION=RunStep
00089	#exec MESH NOTIFY MESH=Skaarjw SEQ=JogFire TIME=0.25 FUNCTION=RunStep
00090	#exec MESH NOTIFY MESH=Skaarjw SEQ=JogFire TIME=0.75 FUNCTION=RunStep
00091	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeLeft TIME=0.25 FUNCTION=RunStep
00092	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeLeft TIME=0.75 FUNCTION=RunStep
00093	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeLeftFr TIME=0.25 FUNCTION=RunStep
00094	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeLeftFr TIME=0.75 FUNCTION=RunStep
00095	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeRight TIME=0.25 FUNCTION=RunStep
00096	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeRight TIME=0.75 FUNCTION=RunStep
00097	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeRightFr TIME=0.25 FUNCTION=RunStep
00098	#exec MESH NOTIFY MESH=Skaarjw SEQ=StrafeRightFr TIME=0.75 FUNCTION=RunStep
00099	
00100	#exec AUDIO IMPORT FILE="Sounds\Skaarj\blade1a.WAV" NAME="blade1s" GROUP="Skaarj"
00101	
00102	//-----------------------------------------------------------------------------
00103	// SkaarjWarrior variables.
00104	
00105	var(Sounds) sound Blade;
00106	
00107	//=========================================================================================
00108	
00109	function PostBeginPlay()
00110	{
00111		Super.PostBeginPlay();
00112		if ( skill == 3 )
00113		{
00114			SpinDamage = 20;
00115			ClawDamage = 17;
00116		}
00117	}
00118	
00119	function TryToDuck(vector duckDir, bool bReversed)
00120	{
00121		local vector HitLocation, HitNormal, Extent;
00122		local bool duckLeft, bSuccess;
00123		local actor HitActor;
00124		local float decision;
00125	
00126		//log("duck");
00127					
00128		duckDir.Z = 0;
00129		duckLeft = !bReversed;
00130	
00131		Extent.X = CollisionRadius;
00132		Extent.Y = CollisionRadius;
00133		Extent.Z = CollisionHeight;
00134		HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent);
00135		bSuccess = ( (HitActor == None) || (VSize(HitLocation - Location) > 150) );
00136		if ( !bSuccess )
00137		{
00138			duckLeft = !duckLeft;
00139			duckDir *= -1;
00140			HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent);
00141			bSuccess = ( (HitActor == None) || (VSize(HitLocation - Location) > 150) );
00142		}
00143		if ( !bSuccess )
00144			return;
00145		
00146		if ( HitActor == None )
00147			HitLocation = Location + 200 * duckDir;
00148		HitActor = Trace(HitLocation, HitNormal, HitLocation - MaxStepHeight * vect(0,0,1), HitLocation, false, Extent);
00149		if (HitActor == None)
00150			return;
00151			
00152		//log("good duck");
00153	
00154		SetFall();
00155		if ( duckLeft )
00156			PlayAnim('LeftDodge', 1.35);
00157		else
00158			PlayAnim('RightDodge', 1.35);
00159		Velocity = duckDir * GroundSpeed;
00160		Velocity.Z = 200;
00161		SetPhysics(PHYS_Falling);
00162		GotoState('FallingState','Ducking');
00163	}	
00164	
00165	function bool CanFireAtEnemy()
00166	{
00167		local vector HitLocation, HitNormal,X,Y,Z, projStart, EnemyDir, EnemyUp;
00168		local actor HitActor1, HitActor2;
00169		local float EnemyDist;
00170			
00171		EnemyDir = Enemy.Location - Location;
00172		EnemyDist = VSize(EnemyDir);
00173		EnemyUp = Enemy.CollisionHeight * vect(0,0,0.9);
00174		if ( EnemyDist > 300 )
00175		{
00176			EnemyDir = 300 * EnemyDir/EnemyDist;
00177			EnemyUp = 300 * EnemyUp/EnemyDist;
00178		}
00179		
00180		GetAxes(Rotation,X,Y,Z);
00181		projStart = Location + 0.9 * CollisionRadius * X + CollisionRadius * Y + 0.4 * CollisionHeight * Z;
00182		HitActor1 = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
00183		if ( (HitActor1 != Enemy) && (Pawn(HitActor1) != None) 
00184			&& (AttitudeTo(Pawn(HitActor1)) > ATTITUDE_Ignore) )
00185			return false;
00186			 
00187		projStart = Location + 0.9 * CollisionRadius * X - CollisionRadius * Y + 0.4 * CollisionHeight * Z;
00188		HitActor2 = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true);
00189	
00190		if ( (HitActor2 != Enemy) && (Pawn(HitActor2) != None) 
00191			&& (AttitudeTo(Pawn(HitActor2)) > ATTITUDE_Ignore) )
00192			return false;
00193	
00194		if ( (HitActor2 == None) || (HitActor2 == Enemy) || (HitActor1 == None) || (HitActor1 == Enemy) 
00195			|| (Pawn(HitActor2) != None) || (Pawn(HitActor1) != None) )
00196			return true;
00197	
00198		HitActor2 = Trace(HitLocation, HitNormal, projStart + EnemyDir, projStart , true);
00199	
00200		return ( (HitActor2 == None) || (HitActor2 == Enemy) 
00201				|| ((Pawn(HitActor2) != None) && (AttitudeTo(Pawn(HitActor2)) <= ATTITUDE_Ignore)) );
00202	}
00203	
00204	function PlayCock()
00205	{
00206		PlaySound(Blade, SLOT_Interact,,,800);
00207	}
00208	
00209	function PlayPatrolStop()
00210		{
00211		local float decision;
00212		if (Region.Zone.bWaterZone)
00213		{
00214			PlaySwimming();
00215			return;
00216		}
00217		if ( bButtonPusher )
00218		{
00219			PushButtons();
00220			return;
00221		}
00222	
00223		decision = FRand();
00224		if (decision < 0.05)
00225			{
00226			SetAlertness(-0.5);
00227			PlaySound(HairFlip, SLOT_Talk);
00228			PlayAnim('HairFlip', 0.4 + 0.3 * FRand());
00229			}
00230		else 
00231			{
00232			SetAlertness(0.2);	
00233			LoopAnim('Breath', 0.3 + 0.6 * FRand());
00234			}
00235		}
00236	
00237	function PlayChallenge()
00238	{
00239		if (Region.Zone.bWaterZone)
00240		{
00241			PlaySwimming();
00242			return;
00243		}
00244		PlayThreateningSound();
00245		PlayAnim('Fighter', 0.8 + 0.5 * FRand(), 0.1);
00246	}
00247	
00248	function PlayRunning()
00249	{
00250		local float strafeMag;
00251		local vector Focus2D, Loc2D, Dest2D;
00252		local vector lookDir, moveDir, Y;
00253	
00254		DesiredSpeed = MaxDesiredSpeed;
00255		if (Region.Zone.bWaterZone)
00256		{
00257			PlaySwimming();
00258			return;
00259		}
00260	
00261		if (Focus == Destination)
00262		{
00263			LoopAnim('Jog', -1.0/GroundSpeed,, 0.5);
00264			return;
00265		}	
00266		Focus2D = Focus;
00267		Focus2D.Z = 0;
00268		Loc2D = Location;
00269		Loc2D.Z = 0;
00270		Dest2D = Destination;
00271		Dest2D.Z = 0;
00272		lookDir = Normal(Focus2D - Loc2D);
00273		moveDir = Normal(Dest2D - Loc2D);
00274		strafeMag = lookDir dot moveDir;
00275		if (strafeMag > 0.8)
00276			LoopAnim('Jog', -1.0/GroundSpeed,, 0.5);
00277		else if (strafeMag < -0.8)
00278			LoopAnim('Jog', -1.0/GroundSpeed,, 0.5);
00279		else
00280		{
00281			Y = (lookDir Cross vect(0,0,1));
00282			if ((Y Dot (Dest2D - Loc2D)) > 0)
00283			{
00284				if ( (AnimSequence == 'StrafeRight') || (AnimSequence == 'StrafeRightFr') ) 
00285					LoopAnim('StrafeRight', -2.5/GroundSpeed,, 1.0);
00286				else 
00287					LoopAnim('StrafeRight', -2.5/GroundSpeed,0.1, 1.0);
00288			}
00289			else
00290			{
00291				if ( (AnimSequence == 'StrafeLeft') || (AnimSequence == 'StrafeLeftFr') ) 
00292					LoopAnim('StrafeLeft', -2.5/GroundSpeed,, 1.0);
00293				else
00294					LoopAnim('StrafeLeft', -2.5/GroundSpeed,0.1, 1.0);
00295			}
00296		}
00297	}
00298	
00299	function PlayMovingAttack()
00300	{
00301		local float strafeMag;
00302		local vector Focus2D, Loc2D, Dest2D;
00303		local vector lookDir, moveDir, Y;
00304	
00305		if (Region.Zone.bWaterZone)
00306		{
00307			LoopAnim('SwimFire', -1.0/WaterSpeed,, 0.4); 
00308			return;
00309		}
00310		DesiredSpeed = MaxDesiredSpeed;
00311	
00312		if (Focus == Destination)
00313		{
00314			LoopAnim('JogFire', -1.0/GroundSpeed,, 0.4);
00315			return;
00316		}	
00317		Focus2D = Focus;
00318		Focus2D.Z = 0;
00319		Loc2D = Location;
00320		Loc2D.Z = 0;
00321		Dest2D = Destination;
00322		Dest2D.Z = 0;
00323		lookDir = Normal(Focus2D - Loc2D);
00324		moveDir = Normal(Dest2D - Loc2D);
00325		strafeMag = lookDir dot moveDir;
00326		if (strafeMag > 0.8)
00327			LoopAnim('JogFire', -1.0/GroundSpeed,, 0.4);
00328		else if (strafeMag < -0.8)
00329			LoopAnim('JogFire', -1.0/GroundSpeed,, 0.4);
00330		else
00331		{
00332			MoveTimer += 0.2;
00333			DesiredSpeed = 0.6;
00334			Y = (lookDir Cross vect(0,0,1));
00335			if ((Y Dot (Dest2D - Loc2D)) > 0) 
00336			{
00337				if ( (AnimSequence == 'StrafeRight') || (AnimSequence == 'StrafeRightFr') ) 
00338					LoopAnim('StrafeRightFr', -2.5/GroundSpeed,, 1.0); 
00339				else
00340					LoopAnim('StrafeRightFr', -2.5/GroundSpeed,0.1, 1.0); 
00341			}
00342			else
00343			{
00344				if ( (AnimSequence == 'StrafeLeft') || (AnimSequence == 'StrafeLeftFr') ) 
00345					LoopAnim('StrafeLeftFr', -2.5/GroundSpeed,, 1.0);
00346				else
00347					LoopAnim('StrafeLeftFr', -2.5/GroundSpeed,0.1, 1.0);
00348			}
00349		}
00350	}
00351	
00352	function PlayThreatening()
00353	{
00354		local float decision, animspeed;
00355	
00356		if (Region.Zone.bWaterZone)
00357		{
00358			PlaySwimming();
00359			return;
00360		}
00361	
00362		decision = FRand();
00363		animspeed = 0.4 + 0.6 * FRand(); 
00364		
00365		if ( decision < 0.7 )
00366			PlayAnim('Breath2', animspeed, 0.3);
00367		else if ( decision < 0.9 )
00368		{
00369			PlayThreateningSound();
00370			PlayAnim('Fighter', animspeed, 0.3);
00371		}
00372		else
00373		{
00374			PlaySound(HairFlip, SLOT_Talk);
00375			PlayAnim('HairFlip', animspeed, 0.3);
00376		}	 
00377	}
00378	
00379	function SpawnTwoShots()
00380	{
00381		local rotator FireRotation;
00382		local vector X,Y,Z, projStart;
00383	
00384		GetAxes(Rotation,X,Y,Z);
00385		MakeNoise(1.0);
00386		projStart = Location + 0.9 * CollisionRadius * X + 0.9 * CollisionRadius * Y + 0.4 * CollisionHeight * Z;
00387		FireRotation = AdjustAim(ProjectileSpeed, projStart, 400, bLeadTarget, bWarnTarget);  
00388		spawn(RangedProjectile,self,'',projStart, FireRotation);
00389			
00390		projStart = projStart - 1.8 * CollisionRadius * Y;
00391		FireRotation.Yaw += 400;
00392		spawn(RangedProjectile,self,'',projStart, FireRotation);
00393	}
00394	
00395	function PlayRangedAttack()
00396	{
00397		if (Region.Zone.bWaterZone)
00398		{
00399			LoopAnim('SwimFire', -1.0/WaterSpeed,, 0.4); 
00400			return;
00401		}
00402		PlayAnim('Firing', 1.5); 
00403	}
00404	
00405	function PlayVictoryDance()
00406	{
00407		PlaySound(HairFlip, SLOT_Talk);
00408		PlayAnim('HairFlip', 0.6, 0.1);
00409	}
00410	
00411	defaultproperties
00412	{
00413	     Blade=Sound'UnrealShare.Skaarj.blade1s'
00414	     SpinDamage=16
00415	     ClawDamage=14
00416	     CombatStyle=0.600000
00417	     Mesh=LodMesh'UnrealShare.Skaarjw'
00418	}

End Source Code