Core.Object | +--Engine.Actor | +--Engine.Pawn | +--UnrealShare.ScriptedPawn | +--UnrealI.Mercenary
byte
OrdersGiven
PunchDamage
bool
bButtonPusher
bCanFireWhileInvulnerable
bHasInvulnerableShield
bPatroling
bSquatter
bTalker
float
invulnerableCharge
name
phrase
eAttitude
AttitudeToCreature(Pawn Other)
void
BecomeInvulnerable()
BecomeNormal()
CanFireAtEnemy()
ChooseLeaderAttack()
HitDamageTarget()
PainTimer()
PlayBigDeath(name DamageType)
PlayChallenge()
PlayDive()
PlayGutDeath(name DamageType)
PlayHeadDeath(name DamageType)
PlayInAir()
PlayLanded(float impactVel)
PlayLeftDeath(name DamageType)
PlayMeleeAttack()
PlayMovingAttack()
PlayOutOfWater()
PlayPatrolStop()
PlayRangedAttack()
PlayRightDeath(name DamageType)
PlayRunning()
PlaySwimming()
PlayThreatening()
PlayTurning()
PlayVictoryDance()
PlayWaiting()
PlayWaitingAmbush()
PlayWalking()
PreBeginPlay()
//====================================================================== // Mercenary Functions
SetMovementPhysics()
SpawnRocket()
Speak()
SpeakOrderTo(ScriptedPawn TeamMember)
SpeakTo(ScriptedPawn Other)
SpeechTimer()
//========================================================================================= // Speech
SprayTarget()
Step()
//=========================================================================================
TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType)
TryToDuck(vector duckDir, bool bReversed)
TweenToFalling()
TweenToFighter(float tweentime)
TweenToPatrolStop(float tweentime)
TweenToRunning(float tweentime)
TweenToSwimming(float tweentime)
TweenToWaiting(float tweentime)
TweenToWalking(float tweentime)
WalkStep()
WarnTarget(Pawn shooter, float projSpeed, vector FireDir)
ZoneChange(ZoneInfo newZone)
BeginState()
AnimEnd()
EnemyNotVisible()
Killed(Pawn Killer, Pawn Other, name damageType)
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 }