*E@WO[ԉC ;8NoneChat1 MultiSkinsSoundsCockGunRunLgFrAltFireAnimEndRunLgFire Breath1LWalkEngineHumaneSystemCore StillLgFrIdle Breath2L PlaySwimmingBegin FallingStateDead2ShieldBump UnrealShare EndStateCollisionHeightPlayRangedAttackCollisionRadiusRiseUp PlayFiringTweenToFighter TryToDuck ShieldDown DrawScaleNewClip RangedAttack LandLgFrMeleeDamageTarget RefireRate DownWeaponRunSmFrsliceclawspin PlayCockLookLSkillTimeBetweenAttacks AltFiring PlayTakeHit WeaponTypeTweenToSwimmingMesh HitSound3DieCanFireAtEnemy MeleeAttackUnrealI FaceTargetPlayChallenge TacticalMove Attacking HitSound4 PushButtonsDoneSetFallDead1BotVectorDead8 NeedToTurnPlayMeleeAttack WarnTarget PlayRunningStrafeRStrafeLPlayThreateningSound DuckWlkLBotpack TakeDamage HitSound2AggressivenessFiring FireWeaponKeepAttacking BeginStateFlipReadyToAttack CheckDist Shieldup ShieldedEjectLungeDamageTarget AttitudeTo FullAutoGunSway1 PlayTurning hitdamage DoneFiringHealthSkaarjWarriorShoot0Twiddle FinishDodge LongFallTweenToFallingClientAltFireProcessTraceHit Decapitatedshot PlayBigDeathPlayLeftDeathPlayRightDeath AnimSequenceSpinDamageTargetBackOffLightSaturation ItemName NormalFirePlayPostSelect AccelRate ClawDamage TryToCrouchWaveFatnessRifle bNoSmooth SpinDamage PlayGutDeathMinigun AirSpeedJumpZCarcassPlayHeadDeath AmbientSoundTurnSmDuckMassLightBrightnessDuckingInitforAltRefireRate SpecialFire AIRating LungeDamagePlayerViewOffsetAutoSwitchPriorityPlayMovingAttackTweenToPatrolStopPlayThreateningPlayPatrolStopSetHomePlayTakeHitSound TossWeaponTurnLgDown shakemag shakevertlungeInventoryGroup ChallengeFire1 AddVelocity PlayRecoilPawn ShldFireSelect PlayIdleAnimShootUseAmmoPickupMessageDamage RateSelfTouchAcquireDie2ProjectileFireClawDamageTarget CarcassTypeASMD ThreatenLanded PlayLandedTimer DeathMessagedamageAttitudeToShoot2FinishSpeakTweenToRunningRoam PlayInAir LightHueWalkLgDead7DiedTakeHit StillFrRpShoot1Dead9BSkinSetHandDead4ChangedWeaponBreath2Hunting PreBeginPlayChat2 MeleeRangegunnerPlayerViewMeshPickupViewMeshThirdPersonMesh PickupSoundstartupLeftHit AmmoNamePickupAmmoCountDead3 Retreating bInstantHitbAltInstantHit Charging HumangrantRecon FireOffsetAltProjectileClassTweenToWaiting FireSound AltFireSound CockingSound SelectSound Misc1Sound Misc2SoundSwitchToBestWeapon superbeam TobimasuRThrustPutDownPlayVictoryDance SniperRifle minigun2 HitSound1 ShockRifle assaultgun PlayWaiting bWaterZone EAttitudeLastPainSoundLand bAltFirebFireClick VoicePitch AmmoAmountFireDir projStartBaseEyeHeight ViewRotation FiringSpeedbChangeWeaponbAltWarnTarget bPointing AmmoType bUseAltModeFocus Destination MoveTimer FootRegion SpeechTime instigatedBy Rotation bCanSwim bAnimLoopValue impactVellandVolMultlookDir HitActor bVeryLowGoredist ScriptedPawncarc TimeSecondsOwnerStartZoneTargetRegionbQuietGameEnemy VelocitySkaarj AccelerationbCanFly HitNormal HitLocation MomentumbHasRangedAttack projSpeedshooterKillerhandHitLoc TweenTimeOtherCalcDrawOffset MaxSpeedAltProjectileSpeed aimerrorbMovingRangedAttackSoundDampening Intelligence AnimFrame PointRegion LocationSpriteSmokePuffMaxStepHeight GroundSpeedMaxDesiredSpeed DesiredSpeed bIsPlayerPlayOwnedSoundExtentDesiredRotation RespawnTimeFlyTransientSoundVolumeAutoMagPhysics DamageType syllable4 syllable3Pitch syllable2 syllable1S syllable5Z syllable6 ReturnValueYX SetAlertness ScriptTextWeaponDAmmo2WallHitEffectMale ShellCase LevelInfoCreatureChunks GameInfo ZoneInfoCockingAmmo InventoryLevelbFiringPaused bCanDuck TeamLeader TargetDist enemyDistattduckDir enemyDirFocus2D strafemag bReversedbTeamSpeaking bIsSpeakingEnemyUpLoc2DDest2D animspeedThumpAttackSuccessbButtonPusher bFakeDeath inflection duckLeftmoveDirMLand3MJump3lland01MJump1MInjur2MInjur4MInjur1Pickups WeaponPickupMDeath3 ducktimeGibs decisionMInjur3MDeath4MDeath1AutoMagPickupauto3rd AutoMagL AutoMagRflakReload AltAccuracy ClipCountrealLocDispM2Actor PlayerPawnLodMeshSoundTextureClassSkaarjTrooperPackage myWeapon TextBufferObjectEnum FunctionStateTournamentWeaponStructStructProperty RocketPack UT_GrenadeTMale1Carcass CommandobNovice headmalembCanClientFireClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertycommandoskins_grants afbd2Ironafbd3afbd4afbd1belg3belg4belg1 usmc2Scoutusmc3usmc4usmc1 belg2Shock`(f ]cQ6/- <S|aB6]",^t~tԝXԝXԝX1ԝX1ԝXԝXtԝXԝXtttttttt"/1tt1X'X'ѸBX'ѸB1X'X'ѸBX'ѸBX'X'X'1]H]H]H]H]H1ԝX111X'X'X'X'ttX'X'X'X'X'X'X'X'X'X'tttX'X'X'X'X'X'X'X'X'X'X'1111ԝXԝXX' ; -,+84ZRxA{7@`qt1$L?S$@?($L?p@vR$?e"0$fff?tRsCHJ6#$?$B$4B #0C)!,8IFM57S.;[*WBH q!2 EGD42UPVVZ`2RY1&̻ѸBtttѸBtttԝXĉ0ԝXԝXԝXԝXtԝXtttԝXtѸBtttԝXt P c"<Z["^_c:F ^$HC_$@Q$L>($fff?O$=fghijkz]%o got gatted by %k's %w.Tal]You got the FullAutoHandGunw] AutomagS:F@ٿ,TUVW6@S$A$ AK$pAKj@`:Wwv 2Z[ԝXԝXtttѸBԝXԝXԝXtԝXL]tttt P c"dYX9b\%kJi_X::$ ::$H::${X::$ r* ::$>L> $ $Q=> 6]9 $,96L? [V?%?!'g!( _^ijghO1Bf32D&$!83fgh od39"a%!Ya&!?7diO qBeB~> - /6-5B a&!B C@KSo2@%@?& 0  pTE$-(TKU >QOiHa%!\ !g9:>L>>[Y:S |3V6> - /6-53 a&!3 RJx}<\"a%!&a&!&=ZMJ?a!&?=Za&!&= D=-(-(46-5= i! L?Cq!!! -a&!= y?W :{6- ?*>?a?333?a!*>yNa!*> r TY'a%!a&!L=U   #?JL>" ?,96- 6 -a$?  6? 8::$o$u!a! Wv!U zNI*+&! L>AA! L>-(6- ? a!Xae$a!Xaj$ {H#  r* a/!E 6#?w.*2aMP?,. (#@A@A@A2w2*8 H k,q!2-'a/!Ea!>$r.::$.-?,..P. e-'r-lH ghZw(I!> f>a$@??a$@?@?a$@?a$@? &US3 w*Nw* n55%$$  ?$$ ?K 6- #a!fff > 06066/0F&/F&L?a!L > &La!M > L>?4/#?4?%! !a!  ?a! =? !* !*a!*  ? a!* =? O+K&7$$:6- ea!fff ? ,6,66-,8+-8+L?a!L ?5H+La!M ?57-#?7?%! !a!  ?a! =?5! !a!  ?5a! =? pQ9a%!\ ra! q!:!" _- !v! e^-w.*.4d`jG  ox%1[Hv!aq!?v!#P =a = !v!IH ba =a fff?q!:!Y-q!?P u!a !Tv!V !< dTYZL<[ab"~e9to #L??,?,?,r*(EDG 6 Eի?6 D6 Ga/!ua/!Ca/!a/!ua/!sa/!r a'C ' a'C'r '>w *'?,(kw. *:_. :$(' a!C%> ?,2 6--`6 6 6  a%#?,( w *--? a%#?,(  w *  a%#?,#??,( pr * C-a!O̬?a!O̬?6HCo$q!!M ELG3B0gL!n ?-a  #L?a<" @w* N 6 6 6a!L333?=da/!f6?,x96C?a!D333?=a!G333?=a$@ LmRI .a .!I?,!6<;w.*.T]ծ>>!ծL>L><ծ>?;?,ra  ()?, P)w w w*>L>!?,+QW.(;E!!oa/!fa/!Fa  ()?,  x ~kK-'Cff&???>off??L? w*-'  +>ac$ q ~>a^$ q  ?ab$ q3 *?a_$ q[ }?U?a\$ qaX$ => `NwA k!@?6o; #<a $q!! ! ! 6o<6-a$Aq!!i N _k6^D!a? !1-o$ !Ba333? L>- w*aaw9a=ak6?jo$w* 6zC !ja-(#C-a??,a! 333?a-' !B iPj}dmwQd%6- *- ;-A >?!/>a! 333?-a$)\>a/!fa!Na!a! #N!<L>>a!L>?Ia! #!>.a!p>a! a!  #C!333?a!>&Y?a! 333?>?a! #!=a!333??a!Q-a$ #!̾R^?a!.a! #a! ?  GFp'Z/K!33>a!I333?=3a!G333?=a$@ IHr.K!>a!333?=3a!\333?=a$@ KJB-*a!333?=a$@ vLq3-K!?a!D333?=3a!D333?=a$@ MS=B%\6- 7|a&!J= Na!GL??= tC; Pr;_a&!L>]w*w* Qq1<a!}?= dTX^$U6- 0-A L>a!/>? rVF= }W=$$ UX]t>>>$$ WZ`>>$$ Y\>?X?$$ [^O L@?9$$16--( ]:@8P a ! "(aaJK>!a!>Ka&!/> i$l  lmX nY x#!w*o WpP-'Nw*-'aNw* AkN0?a&! L>.a! 333?= q[3O r*      sM-(-'-'?,  ?  ? {^RQO':?: -'v!a1$ ut!W|? $$H!a&!>q!%![ ta%!r@?q!o!   usVXy - w r*% 9pa%!a!q!%!"wq!? v$YWH!  ?:% :%q!%!dUa&!? w,Z$$ AznB6yo_{gԝX  D$Cz$DE$Ae"I?Na!H@',ի?,zD a$q!>!u L;$.@a!c?L= }s1B@':?: a1$ ~t,FB@':?: a1$ b#WCr*?,a!I>>Ua!\>> ePE3?,>-(-(  fclass Tobimasu extends fly; function PlayMeleeAttack() { PlayAnim('Shoot1'); if ( MeleeDamageTarget(220, (220 * 1000.0 * Normal(Target.Location - Location))) ) PlaySound(Threaten, SLOT_Talk); //FIXME - stingdamage instead of projectile GotoState('TacticalMove', 'BackOff'); } AL6 $a$@. Em"DL&`F  m$HC6#$@~LBv?%class superbeam extends DAmmo2; nx]&h$!ga!j @ ף<aa!g> #=ar ,$a$`@.-q!):r.*:%w.q!: ,q!$::.%8 :::.%8a!|L?aq! XFJ$y-a!]?L=$a$?.aa!]?L=a %$a$?.a!h?)\=a-q!) :.%8  :.%8 q!  I x! AHKx* GO2q!$  N  AMP "RbB6Q J",^ ; -,+847@1$?($fff?0$Y?R#$L?$A$$B&class recon expands Humangrant; e//============================================================================= // Humangrant. //============================================================================= class Humangrant expands SkaarjTrooper; #exec MESH ORIGIN MESH=commando X=0 Y=0 Z=0 #exec OBJ LOAD FILE=..\Sounds\UTJMonsterSnd.uax PACKAGE=UTJMonsterSnd var(Sounds) sound spin; var(Sounds) sound claw; var(Sounds) sound slice; var(Sounds) sound Die; var(Sounds) sound syllable1; var(Sounds) sound syllable2; var(Sounds) sound syllable3; var(Sounds) sound syllable4; var(Sounds) sound syllable5; var(Sounds) sound syllable6; function PreBeginPlay() { Super.PreBeginPlay(); if ( TimeBetweenAttacks == Default.TimeBetweenAttacks ) TimeBetweenAttacks = TimeBetweenAttacks + (3 - Skill) * 0.3; bHasRangedAttack = false; bMovingRangedAttack = false; } function PlayTurning() { BaseEyeHeight = Default.BaseEyeHeight; if ( (Weapon == None) || (Weapon.Mass < 20) ) PlayAnim('TurnSM', 0.3, 0.3); else PlayAnim('TurnLG', 0.3, 0.3); } function SpinDamageTarget() { if (MeleeDamageTarget(SpinDamage, (SpinDamage * 1000 * Normal(Target.Location - Location))) ) PlaySound(Default.slice, SLOT_Interact); } function ClawDamageTarget() { if ( MeleeDamageTarget(ClawDamage, (ClawDamage * 900 * Normal(Target.Location - Location))) ) PlaySound(Default.slice, SLOT_Interact); } function TweenToPatrolStop(float tweentime) { if ( bFakeDeath ) return; if (Region.Zone.bWaterZone) { TweenToSwimming(tweentime); return; } TweenAnim('Breath2l', tweentime); } function TweenToWaiting(float tweentime) { if ( bFakeDeath ) return; if (Region.Zone.bWaterZone) { TweenToSwimming(tweentime); return; } TweenAnim('breath2l', tweentime); } function PlayWaiting() { local float decision; local float animspeed; if (Region.Zone.bWaterZone) { PlaySwimming(); return; } if ( bFakeDeath ) return; if ( bButtonPusher ) { PushButtons(); return; } animspeed = 0.3 + 0.6 * FRand(); //vary speed decision = FRand(); if (AnimSequence == 'lookL') { SetAlertness(0.0); if (decision < 0.15) { PlayAnim('Breath1l', AnimSpeed, 0.7); if ( !bQuiet ) PlaySound(Roam, SLOT_Talk); } else if ( decision < 0.28 ) { if ( IsA('SkaarjWarrior') ) PlayAnim('breath2', AnimSpeed); else PlayAnim('CockGun', AnimSpeed); } else LoopAnim('breath2l', AnimSpeed); return; } else if ( AnimSequence == 'CockGun' ) { if (decision < 0.2) { SetAlertness(0.3); LoopAnim('CockGun', 0.2 + 0.5 * FRand()); } else LoopAnim('Cockgun', AnimSpeed); return; } else if ( AnimSequence == 'Chat1' ) { SetAlertness(-0.3); if (decision < 0.25) { PlayCock(); LoopAnim('Chat1', animspeed); } else if (decision < 0.37) PlayAnim('breath1l', animspeed); else LoopAnim('Breath1l', animspeed); return; } else if ( AnimSequence == 'cockgun' ) { if (decision < 0.7) { SetAlertness(-0.3); LoopAnim('Chat1', animspeed); } else if (decision < 0.85) { SetAlertness(0.0); PlayAnim('Breath1l', AnimSpeed, 0.7); } else { SetAlertness(0.5); LoopAnim('Cockgun', AnimSpeed); } return; } else if ( AnimSequence == 'Chat1' ) { if (decision < 0.1) { SetAlertness(0.0); PlayAnim('Cockgun', AnimSpeed, 0.7); } else { SetAlertness(0.6); LoopAnim('Chat2', AnimSpeed); if ( !bQuiet ) PlaySound(Roam, SLOT_Talk); } return; } else if ( AnimSequence == 'cockgun' ) { SetAlertness(-0.4); if (decision < 0.87) LoopAnim('chat1', AnimSpeed); else { PlayCock(); LoopAnim('Breath2l', AnimSpeed); } return; } else { SetAlertness(-0.3); PlayAnim('breath1l', animspeed, 0.6); return; } } function TweenToRunning(float tweentime) { bButtonPusher = false; bFakeDeath = false; if (Region.Zone.bWaterZone) { TweenToSwimming(tweentime); return; } if ( (AnimSequence == 'chat1') && (AnimFrame > 0.8) ) { SetFall(); GotoState('FallingState', 'RiseUp'); } else if (((AnimSequence != 'StillLgFr')) || !bAnimLoop ) TweenAnim('RunLg', tweentime); } function ChangedWeapon() { Super.ChangedWeapon(); bIsPlayer = false; bMovingRangedAttack = true; bHasRangedAttack = true; Weapon.AimError += 200; Weapon.FireOffset = Weapon.FireOffset * 1.5 * DrawScale; Weapon.PlayerViewOffset = Weapon.PlayerViewOffset * 1.5 * DrawScale; //Weapon.SetHand(0); } function TossWeapon() { if ( Weapon == None ) return; Weapon.FireOffset = Weapon.Default.FireOffset; Weapon.PlayerViewOffset = Weapon.Default.PlayerViewOffset; Super.TossWeapon(); } function Died(pawn Killer, name damageType, vector HitLocation) { bIsPlayer = false; Super.Died(Killer, damageType, HitLocation); } function PlayTakeHit(float tweentime, vector HitLoc, int damage) { if ( GetAnimGroup(AnimSequence) == 'lefthit' ) TweenAnim('RunLg', 0.5); else Super.PlayTakeHit(tweentime, HitLoc, damage); } auto state Startup { function BeginState() { Super.BeginState(); bIsPlayer = true; // temporarily, till have weapon if ( WeaponType != None ) { bIsPlayer = true; myWeapon = Spawn(WeaponType); if ( myWeapon != None ) myWeapon.ReSpawnTime = 0.0; } } function SetHome() { Super.SetHome(); if ( myWeapon != None ) myWeapon.Touch(self); } } function Shield() { return; } function WarnTarget(Pawn shooter, float projSpeed, vector FireDir) { local float MaxSpeed, enemyDist; local eAttitude att; local vector X,Y,Z, enemyDir; att = AttitudeTo(shooter); if ( (att == ATTITUDE_Ignore) || (att == ATTITUDE_Threaten) ) { if ( intelligence >= BRAINS_Mammal ) damageAttitudeTo(shooter); if (att == ATTITUDE_Ignore) return; } // AI controlled creatures may duck if not falling if ( (Enemy == None) || (Physics == PHYS_Falling) || (FRand() > 0.4 + 0.2 * skill) ) return; // and projectile time is long enough enemyDist = VSize(shooter.Location - Location); duckTime = enemyDist/projSpeed; if (duckTime < 0.1 + 0.15 * FRand()) //FIXME - pick right value return; // only if tight FOV GetAxes(Rotation,X,Y,Z); enemyDir = (shooter.Location - Location)/enemyDist; if ((enemyDir Dot X) < 0.8) return; if ( (FireDir Dot Y) > 0 ) { Y *= -1; TryToDuck(Y, true); } else TryToDuck(Y, false); } function TryToDuck(vector duckDir, bool bReversed) { local vector HitLocation, HitNormal, Extent; local bool duckLeft; local actor HitActor; local float decision; if ( (FRand() < 0.4) || (VSize(Velocity) < 50) ) { Shield(); return; } duckDir.Z = 0; duckLeft = !bReversed; Extent.X = CollisionRadius; Extent.Y = CollisionRadius; Extent.Z = CollisionHeight; HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent); if (HitActor != None) { duckLeft = !duckLeft; duckDir *= -1; HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir, Location, false, Extent); } if (HitActor != None) { Shield(); return; } HitActor = Trace(HitLocation, HitNormal, Location + 200 * duckDir - MaxStepHeight * vect(0,0,1), Location + 200 * duckDir, false, Extent); if (HitActor == None) { Shield(); return; } SetFall(); if ( duckLeft ) PlayAnim('DuckWlkL', 1.35); else PlayAnim('DuckWlkl', 1.35); Velocity = duckDir * GroundSpeed; Velocity.Z = 200; SetPhysics(PHYS_Falling); GotoState('FallingState','Ducking'); } function bool CanFireAtEnemy() { local vector HitLocation, HitNormal,X,Y,Z, projStart, EnemyDir, EnemyUp; local actor HitActor; local float EnemyDist; EnemyDir = Enemy.Location - Location; EnemyDist = VSize(EnemyDir); EnemyUp = Enemy.CollisionHeight * vect(0,0,0.8); if ( EnemyDist > 300 ) { EnemyDir = 300 * EnemyDir/EnemyDist; EnemyUp = 300 * EnemyUp/EnemyDist; } if ( Weapon == None ) return false; GetAxes(Rotation,X,Y,Z); projStart = Location + Weapon.CalcDrawOffset() + Weapon.FireOffset.X * X + 1.2 * Weapon.FireOffset.Y * Y + Weapon.FireOffset.Z * Z; if ( Weapon.IsA('ASMD') || Weapon.IsA('Minigun') || Weapon.IsA('Rifle') || Weapon.IsA('ShockRifle') || Weapon.IsA('minigun2') || Weapon.IsA('SniperRifle')) //instant hit HitActor = Trace(HitLocation, HitNormal, Enemy.Location + EnemyUp, projStart, true); else HitActor = Trace(HitLocation, HitNormal, projStart + EnemyDir + EnemyUp, projStart, true); if ( HitActor == Enemy ) return true; if ( (HitActor != None) && (VSize(HitLocation - Location) < 200) ) return false; if ( (Pawn(HitActor) != None) && (AttitudeTo(Pawn(HitActor)) > ATTITUDE_Ignore) ) return false; return true; } function PlayCock() { if ( Weapon != None ) { if ( Weapon.CockingSound != None ) PlaySound(Weapon.CockingSound, SLOT_Interact,,,700); else if ( Weapon.SelectSound != None ) PlaySound(Weapon.CockingSound, SLOT_Interact,,,700); } } //Skaarj animations function PlayPatrolStop() { local float decision; if (Region.Zone.bWaterZone) { PlaySwimming(); return; } if ( bButtonPusher ) { PushButtons(); return; } SetAlertness(0.2); LoopAnim('LookL', 0.3 + 0.6 * FRand()); } function PlayChallenge() { if (Region.Zone.bWaterZone) { PlaySwimming(); return; } if ( TryToCrouch() ) { TweenAnim('Duck', 0.12); return; } PlayThreateningSound(); PlayAnim('StillFrRp', 0.8 + 0.5 * FRand(), 0.1); } function PlayRunning() { local float strafeMag; local vector Focus2D, Loc2D, Dest2D; local vector lookDir, moveDir, Y; bFire = 0; bAltFire = 0; DesiredSpeed = MaxDesiredSpeed; if (Region.Zone.bWaterZone) { PlaySwimming(); return; } if (Focus == Destination) { LoopAnim('RunLg', -0.9/GroundSpeed,, 0.5); return; } Focus2D = Focus; Focus2D.Z = 0; Loc2D = Location; Loc2D.Z = 0; Dest2D = Destination; Dest2D.Z = 0; lookDir = Normal(Focus2D - Loc2D); moveDir = Normal(Dest2D - Loc2D); strafeMag = lookDir dot moveDir; if (strafeMag > 0.8) LoopAnim('StrafeR', -1.0/GroundSpeed,, 0.5); else if (strafeMag < -0.8) LoopAnim('StrafeL', -1.0/GroundSpeed,, 0.5); else { Y = (lookDir Cross vect(0,0,1)); if ((Y Dot (Dest2D - Loc2D)) > 0) { if ( (AnimSequence == 'RunLg') || (AnimSequence == 'RunLg') ) LoopAnim('RunLg', -2.5/GroundSpeed,, 1.0); else LoopAnim('RunLgFr', -2.5/GroundSpeed,0.1, 1.0); } else { if ( (AnimSequence == 'RunLg') || (AnimSequence == 'RunLg') ) LoopAnim('RunLg', -2.5/GroundSpeed,, 1.0); else LoopAnim('RunLgFr', -2.5/GroundSpeed,0.1, 1.0); } } } function PlayMeleeAttack() { local int hitdamage; local float TargetDist, decision; decision = FRand(); if (AnimSequence == 'Breath1l') decision += 0.2; else if (AnimSequence == 'Breath1l') decision -= 0.2; AttackSuccess = false; //log("Start Melee Attack"); if ( Region.Zone.bWaterZone || (decision < 0.5) ) { Acceleration = AccelRate * Normal(Target.Location - Location); PlayAnim('Flip'); PlaySound(Default.Spin, SLOT_Interact); } else { PlayAnim('Flip'); PlaySound(Default.Claw, SLOT_Interact); } } function PlayLeftDeath(name DamageType) { if ( FRand() < 0.5 ) PlayAnim('Dead1',0.7,0.1); else PlayAnim('Dead7',0.7,0.1); PlaySound(Default.Die, SLOT_Talk, 4.5 * TransientSoundVolume); } function PlayGutDeath(name DamageType) { PlayAnim('Dead2',0.7, 0.1); PlaySound(Default.Die, SLOT_Talk, 4.5 * TransientSoundVolume); } function PlayRightDeath(name DamageType) { if ( FRand() < 0.3 ) PlayAnim('Dead2',0.7,0.1); else PlayAnim('Dead3',0.7,0.1); PlaySound(Default.Die, SLOT_Talk, 4.5 * TransientSoundVolume); } function PlayBigDeath(name DamageType) { if ( FRand() < 0.35 ) PlayAnim('Dead9B',0.7,0.1); else PlayAnim('Dead8',0.7,0.1); PlaySound(Default.Die, SLOT_Talk, 4.5 * TransientSoundVolume); } function PlayHeadDeath(name DamageType) { local carcass carc; if ( ((DamageType == 'Decapitated') || ((Health < -20) && (FRand() < 0.5))) && !Level.Game.bVeryLowGore ) { carc = Spawn(class 'CreatureChunks',,, Location + CollisionHeight * vect(0,0,0.8), Rotation + rot(3000,0,16384) ); if (carc != None) { carc.Mesh = mesh'headmalem'; carc.Initfor(self); carc.Velocity = Velocity + VSize(Velocity) * VRand(); carc.Velocity.Z = FMax(carc.Velocity.Z, Velocity.Z); } PlayAnim('Dead4',0.7,0.1); if ( IsA('SkaarjWarrior') && (Velocity.Z < 120) ) { Velocity = GroundSpeed * vector(Rotation); Velocity.Z = 150; } } else if ( FRand() < 0.5 ) PlayAnim('Dead1',0.7,0.1); else PlayAnim('Dead8',0.7,0.1); PlaySound(Default.Die, SLOT_Talk, 4.5 * TransientSoundVolume); } function PlayMovingAttack() { local float strafeMag; local vector Focus2D, Loc2D, Dest2D; local vector lookDir, moveDir, Y; local int bUseAltMode; if (Weapon != None) { if ( Weapon.AmmoType != None ) Weapon.AmmoType.AmmoAmount = Weapon.AmmoType.Default.AmmoAmount; Weapon.RateSelf(bUseAltMode); ViewRotation = Rotation; if ( bUseAltMode == 0 ) { bFire = 1; bAltFire = 0; Weapon.Fire(1.0); } else { bFire = 0; bAltFire = 1; Weapon.AltFire(1.0); } } else { PlayRunning(); return; } if (Region.Zone.bWaterZone) { PlaySwimming(); return; } DesiredSpeed = MaxDesiredSpeed; if (Focus == Destination) { LoopAnim('RunLgFr', -0.9/GroundSpeed,, 0.4); return; } Focus2D = Focus; Focus2D.Z = 0; Loc2D = Location; Loc2D.Z = 0; Dest2D = Destination; Dest2D.Z = 0; lookDir = Normal(Focus2D - Loc2D); moveDir = Normal(Dest2D - Loc2D); strafeMag = lookDir dot moveDir; if (strafeMag > 0.8) LoopAnim('StrafeR', -1.0/GroundSpeed,, 0.4); else if (strafeMag < -0.8) LoopAnim('StrafeL', -1.0/GroundSpeed,, 0.4); else { MoveTimer += 0.2; DesiredSpeed = 0.6; Y = (lookDir Cross vect(0,0,1)); if ((Y Dot (Dest2D - Loc2D)) > 0) { if ( (AnimSequence == 'RunLgFr') || (AnimSequence == 'RunLgFr') ) LoopAnim('Runlgfr', -2.5/GroundSpeed,, 1.0); else LoopAnim('Runlgfr', -2.5/GroundSpeed,0.1, 1.0); } else { if ( (AnimSequence == 'Runsmfr') || (AnimSequence == 'Runsmfr') ) LoopAnim('runsmfr', -2.5/GroundSpeed,, 1.0); else LoopAnim('runsmfr', -2.5/GroundSpeed,0.1, 1.0); } } } function PlayThreatening() { local float decision, animspeed; if (Region.Zone.bWaterZone) { PlaySwimming(); return; } decision = FRand(); animspeed = 0.4 + 0.6 * FRand(); if ( decision < 0.7 ) PlayAnim('Chat1', animspeed, 0.3); else { PlayThreateningSound(); PlayAnim('Chat1', animspeed, 0.3); } } function PlayRangedAttack() { PlayFiring(); } function PlayFiring() { TweenAnim('StillLgFr', 0.2); if ( (Weapon != None) && (Weapon.AmmoType != None) ) Weapon.AmmoType.AmmoAmount = Weapon.AmmoType.Default.AmmoAmount; } function PlayVictoryDance() { PlayAnim('Wave', 0.6, 0.1); } function PlayLanded(float impactVel) { if ( GetAnimGroup(AnimSequence) == 'Landlgfr' ) TweenAnim('Landlgfr', 0.1); else if (impactVel > 1.7 * JumpZ) PlayAnim('Landlgfr',1.0,0.1); else TweenAnim('Landlgfr', 0.1); } state TakeHit { ignores seeplayer, hearnoise, bump, hitwall; function BeginState() { bFire = 0; bAltFire = 0; Super.BeginState(); } } state Retreating { ignores SeePlayer, EnemyNotVisible, HearNoise; function EndState() { bFire = 0; bAltFire = 0; Super.EndState(); } } state Charging { ignores SeePlayer, HearNoise; function EndState() { bFire = 0; bAltFire = 0; Super.EndState(); } } state TacticalMove { ignores SeePlayer, HearNoise; function EndState() { bFire = 0; bAltFire = 0; Super.EndState(); } } state Hunting { ignores EnemyNotVisible; function EndState() { bFire = 0; bAltFire = 0; if ( !Region.Zone.bWaterZone ) bCanSwim = false; Super.EndState(); } } state MeleeAttack { ignores SeePlayer, HearNoise, Bump; ShieldDown: DesiredRotation = Rotator(Enemy.Location - Location); FinishAnim(); Goto('Begin'); } state FallingState { ignores Bump, Hitwall, HearNoise, WarnTarget; function Landed(vector HitNormal) { local float landVol; if ( AnimSequence == 'Dead2' ) { landVol = 0.75 + Velocity.Z * 0.004; LandVol = Mass * landVol * landVol * 0.01; PlaySound(sound'Thump', SLOT_Interact, landVol); GotoState('FallingState', 'RiseUp'); } else if ( (AnimSequence == 'Chat1') || (AnimSequence == 'walk') ) { landVol = Velocity.Z/JumpZ; landVol = 0.008 * Mass * landVol * landVol; if ( !FootRegion.Zone.bWaterZone ) PlaySound(Land, SLOT_Interact, FMin(20, landVol)); GotoState('FallingState', 'FinishDodge'); } else Super.Landed(HitNormal); } function PlayTakeHit(float tweentime, vector HitLoc, int damage) { if ( AnimSequence != 'Dead2' ) Global.PlayTakeHit(tweentime, HitLoc, damage); } LongFall: if ( AnimSequence == 'Dead2' ) { Sleep(1.5); Goto('RiseUp'); } if ( bCanFly ) { SetPhysics(PHYS_Flying); Goto('Done'); } Sleep(0.7); TweenToFighter(0.2); if ( bHasRangedAttack && (Enemy != None) ) { TurnToward(Enemy); FinishAnim(); if ( CanFireAtEnemy() ) { PlayRangedAttack(); FinishAnim(); } PlayChallenge(); FinishAnim(); } TweenToFalling(); if ( Velocity.Z > -150 ) //stuck { SetPhysics(PHYS_Falling); if ( Enemy != None ) Velocity = groundspeed * normal(Enemy.Location - Location); else Velocity = groundspeed * VRand(); Velocity.Z = FMax(JumpZ, 250); } Goto('LongFall'); RiseUp: FinishAnim(); bCanDuck = false; DesiredRotation = Rotation; Acceleration = vect(0,0,0); if ( !bFakeDeath ) Sleep(1.0 + 6 * FRand()); PlayAnim('Walk', 0.7); FinishDodge: FinishAnim(); bCanDuck = true; Goto('Done'); } function PlayInAir() { if ( AnimSequence == 'Breath2l' ) PlayAnim('Breath2l', 0.4); else if ( AnimSequence == 'Cockgun' ) PlayAnim('Chat1', 0.4); else TweenAnim('Lookl',0.4); } function PlayTakeHitSound(int Damage, name damageType, int Mult) { local float decision; if ( Level.TimeSeconds - LastPainSound < 0.25 ) return; LastPainSound = Level.TimeSeconds; decision = FRand(); //FIXME - modify based on damage if (decision < 0.25) PlaySound(Default.HitSound1, SLOT_Pain, 2.0 * Mult); else if (decision < 0.5) PlaySound(Default.HitSound2, SLOT_Pain, 2.0 * Mult); else if (decision < 0.75) PlaySound(Default.HitSound3, SLOT_Pain, 2.0 * Mult); else PlaySound(Default.HitSound4, SLOT_Pain, 2.0 * Mult); } function Speak() { local float decision, inflection, pitch; //if (phrase != '') // SpeakPhrase(); bIsSpeaking = true; if ( FRand() < 0.65) { inflection = 0.6 + 0.5 * FRand(); pitch = voicePitch + 0.4 * FRand(); } else { inflection = 1.3 + 0.5 * FRand(); pitch = voicePitch + 0.8 * FRand(); } decision = FRand(); if (TeamLeader != None) TeamLeader.bTeamSpeaking = true; if (decision < 0.167) PlaySound(Default.Syllable1,SLOT_Talk,inflection,,, pitch); else if (decision < 0.333) PlaySound(Default.Syllable2,SLOT_Talk,inflection,,, pitch); else if (decision < 0.5) PlaySound(Default.Syllable3,SLOT_Talk,inflection,,, pitch); else if (decision < 0.667) PlaySound(Default.Syllable4,SLOT_Talk,inflection,,, pitch); else if (decision < 0.833) PlaySound(Default.Syllable5,SLOT_Talk,inflection,,, pitch); else PlaySound(Default.Syllable6,SLOT_Talk,inflection,,, pitch); SpeechTime = 0.1 + 0.3 * FRand(); } function TweenToFalling() { if ( FRand() < 0.5 ) TweenAnim('walk', 0.2); else PlayAnim('Walk',0.7,0.1); } state RangedAttack { ignores SeePlayer, HearNoise; function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, name damageType) { if ( (GetAnimGroup(AnimSequence) == 'Shielded') && (AnimSequence != 'ShldFire') && ((Vector(Rotation) Dot Momentum) < -0.6) ) Damage *= 0.2; Super.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType); } function Bump (Actor Other) { if ( (GetAnimGroup(AnimSequence) == 'Shielded') && (Other == Enemy) ) { PlayAnim('Walk'); GotoState('MeleeAttack', 'ShieldDown'); return; } if ( AttackSuccess || (AnimSequence != 'cockgun') ) { Disable('Bump'); return; } else LungeDamageTarget(); if (!AttackSuccess && Pawn(Other) != None) //always add momentum Pawn(Other).AddVelocity((60000.0 * (Normal(Other.Location - Location)))/Other.Mass); } function LungeDamageTarget() { If (MeleeDamageTarget(LungeDamage, (LungeDamage * 2000 * Normal(Target.Location - Location)))) { AttackSuccess = true; disable('Bump'); PlaySound(Default.Slice, SLOT_Interact); } } function PlayRangedAttack() { local float dist; if ( GetAnimGroup(AnimSequence) == 'StillLgFr' ) { TweenAnim('StillLgFr', 0.05); FireWeapon(); return; } dist = VSize(Target.Location - Location + vect(0,0,1) * (CollisionHeight - Target.CollisionHeight)); if ( (FRand() < 0.2) && (dist < 150 + CollisionRadius + Target.CollisionRadius) && (Region.Zone.bWaterZone || !Target.Region.Zone.bWaterZone) ) { PlaySound(Lunge, SLOT_Interact); Velocity = 500 * (Target.Location - Location)/dist; //instant acceleration in that direction Velocity.Z += 1.5 * dist; if (Physics != PHYS_Swimming) SetPhysics(PHYS_Falling); Enable('Bump'); PlayAnim('walk'); } else { Disable('Bump'); FireWeapon(); } } function TryToDuck(vector duckDir, bool bReversed) { if ( FRand() < 0.5 ) return; bFire = 0; bAltFire = 0; if ( AnimSequence == 'runlgfr' ) { TweenAnim('runlgfr', 0.15); GotoState('RangedAttack', 'Shieldup'); return; } if ( GetAnimGroup(AnimSequence) == 'chat1' ) { if (FRand() < 0.75) GotoState('RThrust', 'walk'); return; } Shield(); } function KeepAttacking() { if ( bFiringPaused ) return; if ( (FRand() > ReFireRate) || (Enemy == None) || (Enemy.Health <= 0) || !CanFireAtEnemy() ) { if ( GetAnimGroup(AnimSequence) == 'StillLgFr' ) { PlayAnim('stillLgFr'); GotoState('RangedAttack', 'ShieldDown'); } else GotoState('Attacking'); } } function AnimEnd() { if ( (AnimSequence == 'Breath1l') || (FRand() < 0.5) || ((bFire == 0) && (bAltFire == 0)) ) GotoState('RangedAttack', 'DoneFiring'); else TweenAnim('runlgfr', 0.5); } function EndState() { bFire = 0; bAltFire = 0; Super.EndState(); } ShieldDown: Disable('AnimEnd'); FinishAnim(); GotoState('Attacking'); Challenge: Disable('AnimEnd'); Acceleration = vect(0,0,0); //stop DesiredRotation = Rotator(Enemy.Location - Location); PlayChallenge(); FinishAnim(); TweenToFighter(0.1); Goto('FaceTarget'); ShieldUp: Disable('AnimEnd'); Acceleration = vect(0,0,0); //stop FinishAnim(); TweenAnim('Chat1', 0.1); DesiredRotation = Rotator(Enemy.Location - Location); Sleep(duckTime + FRand()); if (NeedToTurn(Enemy.Location)) TurnToward(Enemy); Goto('CheckDist'); Begin: Acceleration = vect(0,0,0); //stop DesiredRotation = Rotator(Enemy.Location - Location); TweenToFighter(0.15); FaceTarget: Disable('AnimEnd'); if (NeedToTurn(Enemy.Location)) { PlayTurning(); TurnToward(Enemy); TweenToFighter(0.1); } FinishAnim(); CheckDist: if (VSize(Location - Enemy.Location) < 0.9 * MeleeRange + CollisionRadius + Enemy.CollisionRadius) GotoState('MeleeAttack', 'ReadyToAttack'); ReadyToAttack: if (!bHasRangedAttack) GotoState('Attacking'); DesiredRotation = Rotator(Enemy.Location - Location); PlayRangedAttack(); Enable('AnimEnd'); Firing: TurnToward(Enemy); Goto('Firing'); DoneFiring: Disable('AnimEnd'); KeepAttacking(); Goto('FaceTarget'); } "USB6TZ",^ ; -,+84R7@1$=S$33s?($33s?0$33s?#$33?$B$15) Owner.PlaySound(Misc1Sound, SLOT_None, 3.5*Pawn(Owner).SoundDampening); if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( PlayerPawn(Owner) == None ) Super.Finish(); else if ( (AmmoType.AmmoAmount<=0) || (Pawn(Owner).Weapon != self) ) GotoState('Idle'); else if (ClipCount>=20) GoToState('NewClip'); else if ( Pawn(Owner).bFire!=0 ) Global.Fire(0); else if ( Pawn(Owner).bAltFire!=0 )Global.AltFire(0); PlayAnim('Shoot2',0.8, 0.0); FinishAnim(); GoToState('Idle'); } //////////////////////////////////////////////////////// state NewClip { ignores Fire, AltFire; Begin: PlayAnim('Eject',1.5,0.05); Owner.PlaySound(Misc2Sound, SLOT_None,1.0*Pawn(Owner).SoundDampening); FinishAnim(); PlayAnim('Down',1.2,0.05); FinishAnim(); ClipCount = 0; Owner.PlaySound(SelectSound, SLOT_None,1.0*Pawn(Owner).SoundDampening); PlayAnim('Select',1.6,0.07); FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( Pawn(Owner).bFire!=0 ) Global.Fire(0); else if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0); else GotoState('Idle'); } //////////////////////////////////////////////////////// state AltFiring { ignores Fire, AltFire; Begin: gotostate('newclip'); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local shellcase s; local vector realLoc; realLoc = Owner.Location + CalcDrawOffset(); s = Spawn(class'ShellCase',Pawn(Owner), '', realLoc + 20 * X + FireOffset.Y * Y + Z); if ( s != None ) s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); if (Other == Level) Spawn(class'WallHitEffect',,, HitLocation+HitNormal*9, Rotator(HitNormal)); else if ((Other != self) && (Other != Owner) && (Other != None) ) { if ( FRand() < 0.2 ) X *= 5; Other.TakeDamage(HitDamage, Pawn(Owner), HitLocation, 3000.0*X, 'shot'); if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); } } function PlayPostSelect() { ClipCount = 0; } function Finish() { if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( PlayerPawn(Owner) == None ) Super.Finish(); else if ( (AmmoType.AmmoAmount<=0) || (Pawn(Owner).Weapon != self) ) GotoState('Idle'); else if (ClipCount>=20) GoToState('NewClip'); else if ( /*bFireMem ||*/ Pawn(Owner).bFire!=0 ) Global.Fire(0); else if ( /*bAltFireMem ||*/ Pawn(Owner).bAltFire!=0 ) Global.AltFire(0); else GotoState('Idle'); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } function Timer() { if (FRand()>0.8) PlayAnim('Twiddle',0.6,0.3); else if (AnimSequence == 'Twiddle') LoopAnim('Sway1',0.02, 0.3); } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo Disable('AnimEnd'); LoopAnim('Sway1',0.02, 0.1); SetTimer(1.5,True); if ( /*bFireMem ||*/ Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( /*bAltFireMem ||*/ Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } gclass assaultgun extends shockrifle; simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None, Pawn(Owner).SoundDampening*4.0); LoopAnim('Fire1', 1 ,0.05); } function AltFire( float Value ) { local actor HitActor; local vector HitLocation, HitNormal, Start; if ( Owner == None ) return; if ( Owner.IsA('Bot') ) //make sure won't blow self up { Start = Owner.Location + CalcDrawOffset() + FireOffset.Z * vect(0,0,1); if ( Pawn(Owner).Enemy != None ) HitActor = Trace(HitLocation, HitNormal, Start + 250 * Normal(Pawn(Owner).Enemy.Location - Start), Start, false, vect(12,12,12)); else HitActor = self; if ( HitActor != None ) { Global.Fire(Value); return; } } if ( AmmoType.UseAmmo(5) ) { GotoState('AltFiring'); bCanClientFire = true; if ( Owner.IsA('Bot') ) { if ( Owner.IsInState('TacticalMove') && (Owner.Target == Pawn(Owner).Enemy) && (Owner.Physics == PHYS_Walking) && !Bot(Owner).bNovice && (FRand() * 6 < Pawn(Owner).Skill) ) Pawn(Owner).SpecialFire(); } Pawn(Owner).PlayRecoil(FiringSpeed); bPointing=True; ProjectileFire(AltProjectileClass, AltProjectileSpeed, bAltWarnTarget); ClientAltFire(value); } } @y   % X}6-q!),r.*e%w.q!{ ,q!$:.%8 :.%8q! Y^-(=w*%.lv!a!a ף<=a?':.%8 :.%8 i []pK q!)' \yD!L?a!h?>BB!ha!a ף<> c ca\afca]afkFahc;ablalahv]v_usawa\aevfcPc`wVavlgwBz|z}agxxk~valcaiajc{vbh[vIa_i%aylcahaulQy@aaaewabaFlHwKwliiXvdaxauw{x~cLilSwKvi _DlKx|lLw1xnxEw0iFwDi]aEwE _Gvhh}x}zMiOwYaJi>aahvv6xFwLii`h3h[hQt4hPvihMxHhKvfh hwCw^hW ^RwZ ^TvlhYa] _fxda^ _BadhhwhWxz _Hh _Owz _Ev@wC _owh _Qhyew#zR _FhExkz{zAxvcVw( _K _^J _Pi%hIhehhVcM _a{hZcIhGxjh~ _Cvvxua_hwv7v@v`h3a@achAhBhphbhIhf^hshthkhrhq ^S ^U _k~ _W ^[vkvjh!h9hhhUhKhJwyhhmhWhhpxGwxhxhXh=tdwEhqxZwIhwzi:h!wRwMwOhhVh.hgyz|xjxRv{vRvtlDhlNwAw}xqxSxshyhFhvei2ixhyanhao ^pamh ^raz `| ` `~ `@ `C `D `A `E `F `} `B `Gz MkV YkN ek qkQ }k~pIlu Wl] dlN qlRY }l~YIm~G Wm}Y dm}w qmzx ~maYKnyx Yn"8fn{u tn}q Aow` Noap[o}B iovN voxN BpaoNpyy \p}n ipxW upzy Aq~@ Nqu[ ZqZ fqa$ysq~k lan y~l Eys R}l^l lk ytz Fzs Rzr ^zX kTxyXGyr U"+ bwYoqt }yY IyJ VaZ bzY ozA |aq IpmVV dY qst ~pm JtN Wnr cR"omt Q}k]}Yk}ZyyA G}V TwT aZ mrU zoN FN Swl_k mlm zwk Fao S`P `pN poq|ol JaAWRce"W spl @vxMpPE"USaV a"Rn"O|~t J"J]V"Ps"SAlt O"-\kt jkswkm ElsQ", _33l"3E_"eEdRKAi"E2j|Qc\"VB"xfA"~g"Wte|LY"IbeZEG"ZBL"U{N"KgI|bp"%sR"9BE"!IG"G_PRmZo"~IIwMR"E_"wZ d"p^~N \"r]hN E"B>QN O"q^[N yvm Evc Q"=c^" A"\a"q.}"X\kN G"F-SW+@"]-k*X"`-B*o">,Y*E"O-o@\":M\aJipGo UA b".po}X _~N k"ATwxm KxN Xaw d"p"X,OY5{WVp"kFF"[PL"M~\|^UZ|!vopet s|Vt|^s|+QnA|IT}ZFQ"sKW"tKb"bcm"PQPRX a\4qmAT ^R@jm|j\4/fRxrUR${G BT _AkT IR2>U ST pA|T Z"b$rf\40X"\4qH"S$uy\4/nR\4J~]Z\4rgRy"YR}q{Rql ]p%}X byWn