UnrealI
Class Queen

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

class Queen
extends UnrealShare.ScriptedPawn

//============================================================================= // Queen. //=============================================================================
Variables
 int ClawDamage,
 name ScreamEvent
 QueenShield Shield
 vector TelepDest
 bool bEndFootStep
 bool bJustScreamed
 byte row

States
Teleporting, Hunting, TacticalMove

Function Summary
 eAttitude AttitudeToCreature(Pawn Other)
 void ClawDamageTarget()
 void FootStep()
 void PlayChallenge()
 void PlayDying(name DamageType, vector HitLocation)
 void PlayInAir()
 void PlayLanded(float impactVel)
 void PlayMeleeAttack()
 void PlayRangedAttack()
 void PlayRunning()
 void PlayTakeHit(float tweentime, vector HitLoc, int Damage)
 void PlayThreatening()
 void PlayTurning()
 void PlayVictoryDance()
 void PlayWaiting()
 void PlayWalking()
 void PostBeginPlay()
 void Scream()
 void SpawnShield()
 void SpawnShot()
 void StabDamageTarget()
 void ThrowOther(Pawn Other)
 void TryToDuck(vector duckDir, bool bReversed)
 void TweenToFalling()
 void TweenToFighter(float tweentime)
 void TweenToPatrolStop(float tweentime)
 void TweenToRunning(float tweentime)
 void TweenToWaiting(float tweentime)
 void TweenToWalking(float tweentime)


State Teleporting Function Summary
 void EndState()
 void BeginState()
 void ChooseDestination()
 void Tick(float DeltaTime)


State Hunting Function Summary
 void PickDestination()


State TacticalMove Function Summary
 void PickDestination(bool bNoCharge)



Source Code


00001	//=============================================================================
00002	// Queen.
00003	//=============================================================================
00004	class Queen extends ScriptedPawn;
00005	
00006	#exec MESH IMPORT MESH=SkQueen ANIVFILE=MODELS\queen_a.3D DATAFILE=MODELS\queen_d.3D X=0 Y=0 Z=0
00007	#exec MESH ORIGIN MESH=SkQueen X=0 Y=-130 Z=80 YAW=64 ROLL=-64
00008	
00009	#exec MESH SEQUENCE MESH=Skqueen SEQ=All		STARTFRAME=0	NUMFRAMES=171
00010	#exec MESH SEQUENCE MESH=Skqueen SEQ=ThreeHit	STARTFRAME=0	NUMFRAMES=18	RATE=15  Group=Attack 
00011	#exec MESH SEQUENCE MESH=Skqueen SEQ=Claw		STARTFRAME=18   NUMFRAMES=10	RATE=15  Group=Attack
00012	#exec MESH SEQUENCE MESH=Skqueen SEQ=Gouge		STARTFRAME=28   NUMFRAMES=13	RATE=15  Group=Attack
00013	#exec MESH SEQUENCE MESH=Skqueen SEQ=Jump		STARTFRAME=41   NUMFRAMES=1
00014	#exec MESH SEQUENCE MESH=Skqueen SEQ=Land		STARTFRAME=42   NUMFRAMES=1
00015	#exec MESH SEQUENCE MESH=Skqueen SEQ=Meditate	STARTFRAME=43   NUMFRAMES=8		RATE=6
00016	#exec MESH SEQUENCE MESH=Skqueen SEQ=OutCold	STARTFRAME=51   NUMFRAMES=21	RATE=15
00017	#exec MESH SEQUENCE MESH=Skqueen SEQ=TakeHit	STARTFRAME=52   NUMFRAMES=1
00018	#exec MESH SEQUENCE MESH=Skqueen SEQ=Run		STARTFRAME=72   NUMFRAMES=10	RATE=17
00019	#exec MESH SEQUENCE MESH=Skqueen SEQ=Scream		STARTFRAME=82   NUMFRAMES=23	RATE=15
00020	#exec MESH SEQUENCE MESH=Skqueen SEQ=Fighter	STARTFRAME=105  NUMFRAMES=1
00021	#exec MESH SEQUENCE MESH=Skqueen SEQ=Shoot1		STARTFRAME=105  NUMFRAMES=23	RATE=15  Group=Attack
00022	#exec MESH SEQUENCE MESH=Skqueen SEQ=Stab		STARTFRAME=128  NUMFRAMES=8		RATE=15  Group=Attack
00023	#exec MESH SEQUENCE MESH=Skqueen SEQ=Walk		STARTFRAME=136  NUMFRAMES=15	RATE=17
00024	#exec MESH SEQUENCE MESH=Skqueen SEQ=Shield		STARTFRAME=151  NUMFRAMES=20	RATE=25
00025	
00026	
00027	#exec TEXTURE IMPORT NAME=JQueen1 FILE=MODELS\queen.PCX GROUP=Skins
00028	#exec MESHMAP SCALE MESHMAP=Skqueen X=0.22 Y=0.22 Z=0.44
00029	#exec MESHMAP SETTEXTURE MESHMAP=Skqueen NUM=1 TEXTURE=Jqueen1 
00030	
00031	#exec MESH NOTIFY MESH=Skqueen SEQ=Shoot1 TIME=0.167 FUNCTION=SpawnShot
00032	#exec MESH NOTIFY MESH=Skqueen SEQ=Shoot1 TIME=0.255 FUNCTION=SpawnShot
00033	#exec MESH NOTIFY MESH=Skqueen SEQ=Shoot1 TIME=0.344 FUNCTION=SpawnShot
00034	#exec MESH NOTIFY MESH=Skqueen SEQ=Shoot1 TIME=0.433 FUNCTION=SpawnShot
00035	#exec MESH NOTIFY MESH=Skqueen SEQ=OutCold TIME=0.60 FUNCTION=LandThump
00036	#exec MESH NOTIFY MESH=Skqueen SEQ=Claw   TIME=0.5   FUNCTION=ClawDamageTarget
00037	#exec MESH NOTIFY MESH=Skqueen SEQ=Gouge  TIME=0.4   FUNCTION=ClawDamageTarget
00038	#exec MESH NOTIFY MESH=Skqueen SEQ=Stab   TIME=0.33  FUNCTION=StabDamageTarget
00039	#exec MESH NOTIFY MESH=Skqueen SEQ=Walk   TIME=0.26  FUNCTION=FootStep
00040	#exec MESH NOTIFY MESH=Skqueen SEQ=Walk   TIME=0.76  FUNCTION=FootStep
00041	#exec MESH NOTIFY MESH=Skqueen SEQ=Run    TIME=0.25  FUNCTION=FootStep
00042	#exec MESH NOTIFY MESH=Skqueen SEQ=Run    TIME=0.75  FUNCTION=FootStep
00043	#exec MESH NOTIFY MESH=Skqueen SEQ=Shield TIME=0.75  FUNCTION=SpawnShield
00044	
00045	#exec AUDIO IMPORT FILE="Sounds\Queen\claw1Q.WAV" NAME="claw1Q" GROUP="Queen"
00046	#exec AUDIO IMPORT FILE="Sounds\Queen\shoot1Q.WAV" NAME="shoot1Q" GROUP="Queen"
00047	#exec AUDIO IMPORT FILE="Sounds\Queen\yell1Q.WAV" NAME="yell1Q" GROUP="Queen"
00048	#exec AUDIO IMPORT FILE="Sounds\Queen\yell2Q.WAV" NAME="yell2Q" GROUP="Queen"
00049	#exec AUDIO IMPORT FILE="Sounds\Queen\yell3Q.WAV" NAME="yell3Q" GROUP="Queen"
00050	#exec AUDIO IMPORT FILE="Sounds\Queen\stab1Q.WAV" NAME="stab1Q" GROUP="Queen"
00051	#exec AUDIO IMPORT FILE="Sounds\Queen\outcoldQ.WAV" NAME="outcoldQ" GROUP="Queen"
00052	#exec AUDIO IMPORT FILE="Sounds\Queen\nearby2Q.WAV" NAME="nearby2Q" GROUP="Queen"
00053	#exec AUDIO IMPORT FILE="Sounds\Queen\amb1Q.WAV" NAME="amb1Q" GROUP="Queen"
00054	#exec AUDIO IMPORT FILE="Sounds\Titan\step1a.WAV" NAME="step1t" GROUP="Titan"
00055	#exec AUDIO IMPORT FILE="..\UnrealShare\Sounds\Generic\teleport1.WAV" NAME="Teleport1" GROUP="Generic"
00056	
00057	//Queen variables;
00058	var() int ClawDamage,
00059		StabDamage;
00060	var() name ScreamEvent;
00061	
00062	var byte row;
00063	var(Sounds) sound footstepSound;
00064	var(Sounds) sound ScreamSound;
00065	var(Sounds) sound stab;
00066	var(Sounds) sound shoot;
00067	var(Sounds) sound claw;
00068	
00069	var bool	bJustScreamed;
00070	var bool	bEndFootStep;
00071	var QueenShield Shield;
00072	var vector TelepDest;
00073	
00074	function PostBeginPlay()
00075	{
00076		Super.PostBeginPlay();
00077		ProjectileSpeed = 1200 + 100 * Skill;
00078		GroundSpeed = GroundSpeed * (1 + 0.1 * Skill);
00079	}
00080	
00081	event bool EncroachingOn( actor Other )
00082	{
00083		if ( (Other.Brush != None) || (Brush(Other) != None) )
00084			return true;
00085			
00086		return false;
00087	}
00088	
00089	function TryToDuck(vector duckDir, bool bReversed)
00090	{
00091		if ( (Shield != None) || (AnimSequence == 'Shield') )
00092			return;
00093	
00094		PlayAnim('Shield', 1.0, 0.1);
00095		bCrouching = true;
00096		GotoState('RangedAttack', 'Challenge');
00097	}
00098	
00099	function SpawnShield()
00100	{
00101		Shield = Spawn(class'QueenShield',,,Location + 150 * Vector(Rotation)); 
00102		Shield.SetBase(self);
00103	}
00104	
00105	function eAttitude AttitudeToCreature(Pawn Other)
00106	{
00107		if ( Other.IsA('Skaarj') )
00108		{
00109			if ( Other.IsA('SkaarjBerserker') )
00110				return ATTITUDE_Hate;
00111			else
00112				return ATTITUDE_Friendly;
00113		}
00114		else if ( Other.IsA('Pupae') )
00115			return ATTITUDE_Friendly;
00116		else if ( Other.IsA('Nali') )
00117			return ATTITUDE_Hate;
00118		else
00119			return ATTITUDE_Ignore;
00120	}
00121	
00122	function ThrowOther(Pawn Other)
00123	{
00124		local float dist, shake;
00125		local PlayerPawn aPlayer;
00126		local vector Momentum;
00127	
00128		if ( Other.mass > 500 )
00129			return;
00130	
00131		aPlayer = PlayerPawn(Other);				
00132		if (aPlayer == None)
00133		{	
00134			if (Other.Physics != PHYS_Walking)
00135				return;
00136			dist = VSize(Location - Other.Location);
00137			if (dist > 500)
00138				return;
00139		}
00140		else
00141		{
00142			dist = VSize(Location - Other.Location);
00143			shake = FMax(500, 1500 - dist);
00144			if ( dist > 1500 )
00145				return;
00146			aPlayer.ShakeView( FMax(0, 0.35 - dist/20000), shake, 0.015 * shake);
00147			if ( (Other.Physics != PHYS_Walking) || (dist > 1500) )
00148				return;
00149		}
00150		
00151		Momentum = -0.5 * Other.Velocity + 100 * Normal(Other.Location - Location);
00152		Momentum.Z =  7000000.0/((0.5 * dist + 500) * Other.Mass);
00153		Other.AddVelocity(Momentum);
00154	}
00155	
00156	function FootStep()
00157	{
00158		bEndFootstep = false;
00159		PlaySound(FootstepSound, SLOT_Interact, 8);
00160	}
00161	
00162	function Scream()
00163	{
00164		local actor A;
00165		local pawn Thrown;
00166	
00167		if (ScreamEvent != '')
00168			foreach AllActors( class 'Actor', A, ScreamEvent )
00169				A.Trigger( Self, Instigator );
00170	
00171		PlaySound(ScreamSound, SLOT_Talk, 2 * TransientSoundVolume);
00172		PlaySound(ScreamSound, SLOT_None, 2 * TransientSoundVolume);
00173		PlaySound(ScreamSound, SLOT_None, 2 * TransientSoundVolume);
00174		PlaySound(ScreamSound, SLOT_None, 2 * TransientSoundVolume);
00175		PlayAnim('Scream');
00176		bJustScreamed = true;
00177	}
00178	
00179	function PlayWaiting()
00180	{
00181		local float decision;
00182		local float animspeed;
00183		
00184		if (bEndFootStep)
00185			FootStep();
00186		decision = FRand();
00187		animspeed = 0.2 + 0.5 * FRand();
00188		LoopAnim('Meditate', animspeed);
00189	}
00190	
00191	function PlayChallenge()
00192	{
00193		if (bEndFootStep)
00194			FootStep();
00195		if ( IsAnimating() && (AnimSequence == 'Shield') )
00196			return;
00197		Scream();
00198	}
00199	
00200	function TweenToFighter(float tweentime)
00201	{
00202		bEndFootStep = ( ((AnimSequence == 'Walk') || (AnimSequence == 'Run')) && (AnimFrame > 0.1) );   
00203		TweenAnim('Fighter', tweentime);
00204	}
00205	
00206	function TweenToRunning(float tweentime)
00207	{
00208		if ( (AnimSequence != 'Run') || !bAnimLoop )
00209			TweenAnim('Run', tweentime);
00210	}
00211	
00212	function TweenToWalking(float tweentime)
00213	{
00214		TweenAnim('Walk', tweentime);
00215	}
00216	
00217	function TweenToWaiting(float tweentime)
00218	{
00219		TweenAnim('Meditate', tweentime);
00220	}
00221	
00222	function TweenToPatrolStop(float tweentime)
00223	{
00224		TweenAnim('Meditate', tweentime);
00225	}
00226	
00227	function PlayRunning()
00228	{
00229		LoopAnim('Run', -1.0/GroundSpeed,, 0.8);
00230	}
00231	
00232	function PlayWalking()
00233	{
00234		LoopAnim('Walk', -1.0/GroundSpeed,, 0.8);
00235	}
00236	
00237	function PlayThreatening()
00238	{
00239		DesiredSpeed = 0.0;
00240	
00241		if ( FRand() < 0.75)
00242			PlayAnim('Meditate', 0.4 + 0.6 * FRand(), 0.3);
00243		else 
00244		{
00245			TweenAnim('Fighter', 0.3);
00246			PlayThreateningSound();
00247		}
00248	}
00249	
00250	function PlayTurning()
00251	{
00252		if (bEndFootStep)
00253			FootStep();
00254		DesiredSpeed = 0.0;
00255		TweenAnim('Run', 0.4);
00256	}
00257	
00258	function PlayDying(name DamageType, vector HitLocation)
00259	{
00260		PlayAnim('OutCold', 0.7, 0.1);
00261		PlaySound(Die, SLOT_Talk);	
00262	}
00263	
00264	function PlayTakeHit(float tweentime, vector HitLoc, int Damage)
00265	{
00266		TweenAnim('TakeHit', tweentime);
00267	}
00268	
00269	function SpawnShot()
00270	{
00271		local vector X,Y,Z, projStart;
00272	
00273		GetAxes(Rotation,X,Y,Z);
00274		
00275		if (row == 0)
00276			MakeNoise(1.0);
00277		
00278		projStart = Location + 1 * CollisionRadius * X + ( 0.7 - 0.2 * row) * CollisionHeight * Z + 0.2 * CollisionRadius * Y;
00279		spawn(RangedProjectile ,self,'',projStart,AdjustAim(ProjectileSpeed, projStart, 400 * (4 - row)/(3.5-skill), false, bWarnTarget));
00280	
00281		projStart = Location + 1 * CollisionRadius * X + ( 0.7 - 0.2 * row) * CollisionHeight * Z - 0.2 * CollisionRadius * Y;
00282		spawn(RangedProjectile ,self,'',projStart,AdjustAim(ProjectileSpeed, projStart, 400 * (4 - row)/(3.5-skill), true, bWarnTarget));
00283		row++;
00284	}
00285	
00286	function PlayVictoryDance()
00287	{
00288		if (bEndFootStep)
00289			FootStep();
00290		DesiredSpeed = 0.0;
00291		PlayAnim('ThreeHit', 0.7, 0.15); //gib the enemy here!
00292		PlaySound(Threaten, SLOT_Talk);		
00293	}
00294	
00295	function ClawDamageTarget()
00296	{
00297		if ( MeleeDamageTarget(ClawDamage, (50000.0 * (Normal(Target.Location - Location)))) )
00298			PlaySound(Claw, SLOT_Interact);
00299	}
00300	
00301	function StabDamageTarget()
00302	{
00303		local vector X,Y,Z;
00304		GetAxes(Rotation,X,Y,Z);
00305		
00306		if ( MeleeDamageTarget(StabDamage, (15000.0 * ( Y + vect(0,0,1)))) )
00307			PlaySound(Stab, SLOT_Interact);
00308	}
00309	
00310	function PlayMeleeAttack()
00311	{
00312		local float decision;
00313	
00314		if (bEndFootStep)
00315			FootStep();
00316		decision = FRand();
00317		if (decision < 0.4)
00318		{
00319			PlaySound(Stab, SLOT_Interact);
00320	 		PlayAnim('Stab');
00321	 	}
00322		else if (decision < 0.7)
00323		{
00324			PlaySound(Claw, SLOT_Interact);
00325			PlayAnim('Claw');
00326		} 
00327		else 
00328		{
00329			PlaySound(Claw, SLOT_Interact);
00330			PlayAnim('Gouge');
00331		}
00332	}
00333	
00334	function TweenToFalling()
00335	{
00336		TweenAnim('Jump', 0.2);
00337	}
00338	
00339	function PlayInAir()
00340	{
00341		TweenAnim('Jump', 0.5);
00342	}
00343	
00344	function PlayLanded(float impactVel)
00345	{
00346		local Pawn Thrown;
00347	
00348		TweenAnim('Land', 0.1);
00349	
00350		//throw all nearby creatures, and play sound
00351		Thrown = Level.PawnList;
00352		While ( Thrown != None )
00353		{
00354			ThrowOther(Thrown);
00355			Thrown = Thrown.nextPawn;
00356		}
00357	}
00358	
00359	function PlayRangedAttack()
00360	{
00361		if (bEndFootStep)
00362			FootStep();
00363	
00364		if ( !bJustScreamed && (FRand() < 0.15) )
00365			Scream();
00366		else if ( (Shield != None) && (FRand() < 0.5)
00367			&& (((Enemy.Location - Location) Dot (Shield.Location - Location)) > 0) )
00368			Scream();
00369		else
00370		{
00371			if ( Shield != None )
00372				Shield.Destroy();
00373			row = 0;
00374			bJustScreamed = false;
00375			PlayAnim('Shoot1'); 
00376			PlaySound(Shoot, SLOT_Interact);			
00377		}
00378	}
00379	
00380	state TacticalMove
00381	{
00382	ignores SeePlayer, HearNoise;
00383	
00384		function PickDestination(bool bNoCharge)
00385		{
00386			if ( FRand() < 0.26 )
00387				GotoState('Teleporting');
00388			else
00389				Super.PickDestination(bNoCharge);
00390		}
00391	}		
00392			
00393	state Hunting
00394	{
00395	ignores EnemyNotVisible; 
00396	
00397		function PickDestination()
00398		{
00399			GotoState('Teleporting');
00400		}
00401	}
00402	
00403	
00404	State Teleporting
00405	{
00406	ignores TakeDamage, SeePlayer, EnemyNotVisible, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, WarnTarget, Died;
00407	
00408		function Tick(float DeltaTime)
00409		{
00410			local int NewFatness; 
00411			local rotator EnemyRot;
00412	
00413			if ( Style == STY_Translucent )
00414			{
00415				ScaleGlow -= 3 * DeltaTime;
00416				if ( ScaleGlow < 0.3 )
00417				{
00418					Spawn(class'QueenTeleportEffect',,, TelepDest);
00419					Spawn(class'QueenTeleportLight',,, TelepDest);
00420					EnemyRot = rotator(Enemy.Location - Location);
00421					EnemyRot.Pitch = 0;
00422					SetLocation(TelepDest);
00423					setRotation(EnemyRot);
00424					PlaySound(sound'Teleport1', SLOT_Interface);
00425					GotoState('Attacking');
00426				}
00427				return;
00428			}
00429			else
00430			{
00431				NewFatness = fatness - 100 * DeltaTime;
00432				if ( NewFatness < 80 )
00433				{
00434					bUnlit = true;
00435					ScaleGlow = 2.0;
00436					Style = STY_Translucent;
00437				}
00438			}
00439	
00440			fatness = Clamp(NewFatness, 0, 255);
00441		}
00442	
00443		function ChooseDestination()
00444		{
00445			local NavigationPoint N;
00446			local vector ViewPoint, HitLocation, HitNormal, Best;
00447			local actor HitActor;
00448			local float rating, newrating;
00449	
00450			N = Level.NavigationPointList;
00451			Best = Location;
00452			rating = 0;
00453	
00454			while ( N != None )
00455			{
00456				if ( N.IsA('QueenDest') ) // rate it
00457				{
00458					newrating = 0;
00459					if ( Best == Location )
00460						Best = N.Location;
00461					ViewPoint = N.Location + EyeHeight * vect(0,0,1);
00462					HitActor = Trace(HitLocation, HitNormal, Enemy.Location, ViewPoint, false);
00463					if ( HitActor == None )
00464						newrating = 20000;
00465	
00466					newrating = newrating - VSize(N.Location - Enemy.Location) + 1000 * FRand()
00467								+ 4 * VSize(N.Location - Location);
00468					if ( N.Location.Z > Enemy.Location.Z )
00469						newrating += 1000;
00470					
00471					if ( newrating > rating )
00472					{
00473						rating = newrating;
00474						Best = N.Location;
00475					}
00476				}
00477	
00478				N = N.nextNavigationPoint;
00479			}
00480	
00481			TelepDest = Best;
00482		}
00483	
00484		function BeginState()
00485		{
00486			Acceleration = Vect(0,0,0);
00487			ChooseDestination();
00488		}
00489	
00490		function EndState()
00491		{
00492			bUnlit = false;
00493			Style = STY_Normal;
00494			ScaleGlow = 1.0;
00495			fatness = Default.fatness;
00496		}
00497	}
00498	
00499		
00500	
00501	defaultproperties
00502	{
00503	     ClawDamage=50
00504	     StabDamage=80
00505	     FootstepSound=Sound'UnrealI.Titan.step1t'
00506	     ScreamSound=Sound'UnrealI.Queen.yell3Q'
00507	     Stab=Sound'UnrealI.Queen.stab1Q'
00508	     Shoot=Sound'UnrealI.Queen.shoot1Q'
00509	     claw=Sound'UnrealI.Queen.claw1Q'
00510	     Aggressiveness=5.000000
00511	     RefireRate=0.400000
00512	     bHasRangedAttack=True
00513	     bCanDuck=True
00514	     bIsBoss=True
00515	     RangedProjectile=Class'UnrealI.QueenProjectile'
00516	     Acquire=Sound'UnrealI.Queen.yell1Q'
00517	     Fear=Sound'UnrealI.Queen.yell2Q'
00518	     Roam=Sound'UnrealI.Queen.nearby2Q'
00519	     Threaten=Sound'UnrealI.Queen.yell2Q'
00520	     MeleeRange=100.000000
00521	     GroundSpeed=400.000000
00522	     AccelRate=1500.000000
00523	     JumpZ=800.000000
00524	     Visibility=250
00525	     SightRadius=3000.000000
00526	     Health=1500
00527	     ReducedDamageType='
00528	     ReducedDamagePct=0.500000
00529	     Intelligence=BRAINS_HUMAN
00530	     HitSound1=Sound'UnrealI.Queen.yell2Q'
00531	     HitSound2=Sound'UnrealI.Queen.yell2Q'
00532	     Die=Sound'UnrealI.Queen.outcoldQ'
00533	     CombatStyle=0.950000
00534	     NameArticle=" the "
00535	     AmbientSound=Sound'UnrealI.Queen.amb1Q'
00536	     DrawType=DT_Mesh
00537	     Mesh=LodMesh'UnrealI.SkQueen'
00538	     SoundRadius=32
00539	     TransientSoundVolume=16.000000
00540	     CollisionRadius=90.199997
00541	     CollisionHeight=106.699997
00542	     Mass=1000.000000
00543	     RotationRate=(Pitch=6000)
00544	}

End Source Code