Core.Object | +--Engine.Actor | +--Engine.Pawn | +--UnrealShare.ScriptedPawn | +--UnrealI.Queen
int
ClawDamage,
name
ScreamEvent
QueenShield
Shield
vector
TelepDest
bool
bEndFootStep
bJustScreamed
byte
row
eAttitude
AttitudeToCreature(Pawn Other)
void
ClawDamageTarget()
FootStep()
PlayChallenge()
PlayDying(name DamageType, vector HitLocation)
PlayInAir()
PlayLanded(float impactVel)
PlayMeleeAttack()
PlayRangedAttack()
PlayRunning()
PlayTakeHit(float tweentime, vector HitLoc, int Damage)
PlayThreatening()
PlayTurning()
PlayVictoryDance()
PlayWaiting()
PlayWalking()
PostBeginPlay()
Scream()
SpawnShield()
SpawnShot()
StabDamageTarget()
ThrowOther(Pawn Other)
TryToDuck(vector duckDir, bool bReversed)
TweenToFalling()
TweenToFighter(float tweentime)
TweenToPatrolStop(float tweentime)
TweenToRunning(float tweentime)
TweenToWaiting(float tweentime)
TweenToWalking(float tweentime)
EndState()
BeginState()
ChooseDestination()
Tick(float DeltaTime)
PickDestination()
PickDestination(bool bNoCharge)
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 }