*uF "GpLX  tzt{t|t}uuuNoneRangeMinMaxColorZYX RangeVector RelativeTimeVectorCore OnslaughtEngineSystemStartSizeRange MaxParticlesTextureLifetimeRange RelativeSizeInitialParticlesPerSecond UniformSizeAutomaticInitialSpawningRespawnDeadParticlesSpinParticlesInValOutVal ColorScaleStartVelocityRangeUseRegularSizeScaleTextureVSubdivisionsTextureUSubdivisionsONSWheeledCraft SizeScale UseSizeScaleStartLocationOffsetUseColorScaleUseRotationFromSpinsPerSecondRangeUseRandomSubdivisionBlendBetweenSubdivisionsMesh ONSWeaponFadeOutFadeOutStartTimeStartLocationShapeStartSpinRange DrawScaleONSHoverCraftONSChopperCraftCoordinateSystemVelocityLossRangeUseDirectionAs bNoDeleteUser StaticMesh Emitters DrawStyle DrawTypeCollisionRadiusONSTreadCraftSphereRadiusRangeFadeInEndTime DestroyedExplodeFadeIn Acceleration UnrealGameKInertiaTensor LightingForce LightColor TakeDamageMessagePostBeginPlayKarmaTickStartVelocityRadialRangeReceiveLocalizedMessageRelativeWarmupTimeONSPlaneCraftBlowUpWarmupTicksPerSecondTimerSecondsBeforeInactiveDamageStartLocationRange GetTeamNumPostNetBeginPlay AutoDestroyRelativeVelocity DeathStringSpeedRotatorFemaleSuicide MaleSuicideGetLocalPlayerController DamageRadius MaxSpeedFireSoundClass ONSVehiclePoints InterpCurveONSWeaponPawnProjectileClass XWeaponsCollisionHeightFire MovementMaxAbsVelocityLandedWeaponFireAttachmentBone Collision FireIntervalNoneSVehicleUpdateParams MyDamageType Location GearRatiosAddPrecacheMaterialEffectIsRelevant bAimableMomentumTransfer ProcessTouch AlphaTestYawBone PitchBoneDampingFactorRangeRotationDampingFactorRangeVehiclePositionStringHitWall WeaponClassVehicleNameStringVelocityScale UpdateLinks TPCamLookatBroadcastLocalizedMessageHealth WheelRadius BoneOffset UseCollisionUseVelocityScale GunClass BoneNameAltFireAddPrecacheStaticMeshProjectionNormalMutOnslaughtWeapons SoundVolumebPoweredWheelSetInitialState PoweredBy AmbientGlowUseRevolutionRevolutionsPerSecondRangeStringTPCamDistance DampRotation DrivePosVehicleDamageScaling DescriptionRedSkin BlueSkinExitPositionsTouchExplosionDecalONSHUDOnslaughtPlasmaGunBarrelBegin AddPowerLink ONSPowerCoreSpawnHitEffects WeaponBone RemoteRoleAddLocationFromOtherEmitterONSWeaponDisplayTextIntBoxX1Y1X2Y2ONSWeaponDescTextClientReceiveSetupName KFrictionONSMineProjectile SoundRadius ItemNameDriverDamageMult IconCoordsFireModeClassResetAfterChange IconMaterial PickupClassHitEffectClassInventoryType OrderListbFixedRotationDir IdleSoundSkins VehicleMassbKDoubleTickRate bClientOnlybHighDetailOnlyNoneKStartEnabledKAngularDampingKLinearDamping ShakeViewOpacityWeaponFireOffset LifeSpanGetVelocityDirectionFromNoneMessageAnnouncements PickupForce PickupSoundKParamsONSVehicleFactorySpawnProjectilebNetTemporaryPickupMessageDesiredRotationbHidden VehicleClassPowerCoreNeutralDriverWeaponsNoneFlashMuzzleFlashTrigger PlayerStart BeginStatebIgnoreEncroachers FireRateNoneDestructionEffectClass AttemptFirePlasmaEffectClassNone KUpdateStatePhysics PlayFiring TeamChangedRotationsPerSecondPowerCoreActivebDrawMeshInFP DamageTypeONSStationaryWeaponPawnRemovePowerLinkSetPowerLinkSetupNone bHardAttachXGameInitialDelayRangeAttack KDriverEnterGetNumDefendersNone KDriverLeaveSetCoreDistanceSever SetTeamNum ClosestToResetPowerLinksbKNonSphericalInertiaMaxPitchSpeed DamageMaxbCollideActorsbCollideWorld bBlockActorsFindPlayerStart bProjTarget FPCamPosKImpactThreshold OnGroundPowerCoreDestroyed FillPlayInfoWVehicleMomentumScaling TraceFire RotationRateLightBrightness DamageMinBeamEffectClassStopThresholdbZeroPCRotOnEntryPowerCoreConstructingUsedByNotifyEnemyLostLock bTurnInPlaceImpactDamageModifierValidSpawnPointPlane HurtRadius LightTypebDrawDriverInTPInstantFireModeStartLocationPolarRangeUpdateTeamBanners NeutralCoreCheckReplacement HasUDamageReconstructionActivateReticle LightHueTossZ SteerType LightRadiusDualFireOffset ImpactSoundGetDescriptionText LinkSetupONSDirtSlipEffectGunnerAttachmentBoneBeamDistanceRangebHandbrakeWheelBranchSpawnAmountRangeDetermineEndPointByRotatingSheetsLowFrequencyPointsHighFrequencyPointsBranchProbability AmbientSoundbDynamicLight AllowFireWeight Probability InitEffects AmmoClassRadiusNoneNone EndState DeactivatePostNetReceive BeginPlay ScurryingNoneUpdatePrecacheMaterialsUpdatePrecacheStaticMeshesDestroyedCorePowerCoreResetSoundRotationOffset ForceScaleStaticPrecache DisplayDebug ForceRadius ForceTypeUpdateCloseActorsPitchMaxDesireabilitySetOverlayMaterial bInstantFirePutDownSuggestDefenseStyleSuggestAttackStyle bNetNotify GetAIRating BestModeCustomCrosshairSmallViewOffset HudColor DisplayFOV EffectOffsetCurrentRating AIRating SelectForce SelectSoundTeam PutDownAnimPowerCoreReconstitutionPowerCoreDisabledHasAmmoSoundsSetupPowerLinksClientSpawnHitEffects AmmoAmountMaxAmmoBlueActiveSkinsRedActiveSkinsBlueConstructingSkinsAttachmentClassPlayerViewOffsetRedConstructingSkins GroupOffsetInventoryGroupTurretCockpit GetRotDiffThrusterOffsetsNonePassengerWeaponStructNoneDriverWeaponStructNoneProjectileFireMode CeaseFirebKStayUprightbKAllowRotate DriverDied DriverLeftNoneDestructionMessageSpecialCalcFirstPersonViewNoneNonebHeavy MomentumMult CanLockOnToOnslaughtAmmoPickupClassNamesVolumeOnslaughtWeaponClassesClientReceivePowerLink!ClientPrepareToReceivePowerLinksSpawnBeamEffect DoTeleportDrawHealthBarbFollowLookDir SpawnVehicle FriendlyNameUpdateGUIMapListsHoverSoftnessONSOnslaughtGameCalcWeaponFireHoverPenScaleHoverCheckDistIsLocallyControlled BobDampingUprightStiffnessUprightDamping ONSHoverBikeONSGrenadeProjectileONSPlasmaProjectileONSAttackCraftNone UpdateBarrel AnimateLoadSetComboTargetDampenFactorParallelDestroyTrails WaitForCombobAmbientFireSoundFireSoundVolume TraceRangeDummy02Dummy01 GetString MaxForceTransMaterials GetHitEffectDoComboAmbientEffectEmitterClassMaxBrakeTorqueAltFireInterval SteerSpeedHandbrakeThresh TorqueCurveVehicleLocked xTeamBanner UpdateDust TriggerEventYawEndConstraintTeamProjectileClasses bSpecialHUDThirdPersonEffects MaxThrustAimAtAnimEnd DampenFactorPitchTorqueFactorMPHMeterMaterial MPHMeterPosX MPHMeterPosYMPHMeterScaleMPHMeterSizeYMaxThrustForce LongDamping CanAttackNoneStickAccelerationAddPerSecMaxStrafeForce LatDampingTurnTorqueFactorTurnTorqueMaxNone TurnDamping MaxYawRatePitchTorqueMax PitchDampingRollTorqueTurnFactorRollTorqueStrafeFactorRollTorqueMax RollDampingWheelSoftnessWheelPenScaleWheelRestitutionWheelLongFrictionFuncWheelLongSlipWheelLatSlipFunc DrawRadarMapWheelLongFrictionScale ReplaceWithWheelLatFrictionScaleWheelHandbrakeSlip bAutoTurretTeamScoreEvent CheckScoreRatePlayerStartWheelHandbrakeFrictionWheelSuspensionTravelFTScaleChassisTorqueScale bTeamLockedMinBrakeFriction XEffects TransRatioChangeUpPointChangeDownPoint LSDFactorEngineBrakeFactorNoneHOLDEngineBrakeRPMScale CheckEndGame DisabledCore FreelanceEngineInertiaDefend IsRetreatingNoneFindCloseActorsIdleRPMEngineRPMSoundRangeSteerBoneAxisSteerBoneMaxAngleRevMeterScaleDamageCapacityStolenAnnouncement ShieldClassDestructionMessageIndexDisableObjectiveTellBotHowToDisableObjectiveStringSuffixFinalCoreDistanceClientOpenMenuNoneDefenderTeamIndexNoneFindNewObjectives TeamAITypeFindPathToObjectiveNone ONSHoverTankStartUp bFinalCore KCOMOffsetNoneKActorGravScaleVehicleCeaseFire ONSMineLayerONSPowerNodeEnergySphereNone REARgunBASEWheelsNone TankBarrel EnergyDome rvGUNbody WheelInertiaUseParticleColorRenderTwoSidedbAlwaysRelevantbOnlyDirtyReplicationAddVelocityFromOtherEmitter DrawScale3DParticlesPerSecond bBlockKarmaNoneNoneNone DisabledProcessSetupNameNone bArmorStops OwnerDiedbLocationalHitNoneServerSendPowerLinksNoneClientRemovePowerLinkRequestLinkDesignerNoneGibPerterbationNoneNoneFlyingDestroyEffects ActivateNoneBotRefireRateShakeOffsetMag bPoweredAttachToVehicle SVehicle MomentumONSPropsDisplayTextONSPropDescTextSavePowerLinkSetupDeletePowerLinkSetupUpdateSeveredLinksMainCoreDestroyed SameTeamAsPlayTeleportEffect DoAutoSwitch OutOfAmmoWeaponPawnClass TeamLinkScoreCustomCrossHairColorImpactDamageThresholdShakeOffsetRateShakeOffsetTimeImpactDamageMult ShakeRotTimeNotifyEnemyLockedOnMaxSteerAngleCurvePlasmaGunAttachmentInitialAmountPawnClientPlaySound RotateBarrel MutatorClassDragCoefficientCurveClientSetBehindViewPlayerTurretingTreadCraftStateParkingDampFactortire03 GetOrdersNone BeaconName MapPrefix MapListTypeHUDTypetireChainGunAttachmenttire02tire04TankCannonWeapon AirFactorbSplashDamageThrustAccelerationLeftFrontTIREWarnTargetPct FireSoundRightRearTIReRightFrontTIRE LeftRearTIREbHoverOnGround COMHeightImpactDamageSounds ShakeRotRateHoverForceCurveImpactDamageTicksImpactInfoStruct TimeLimit GoalScoreShutDownSound GameName CenteredRoll StartUpSoundCameraSwingRatioRecommendRangedAttackCameraDistanceNoneTeamNum PitchTorquePassengerWeaponsNoneNone StopFiring BankTorqueClientGameEndedNone CheckReflectDeleteNothingString GameHasEndedDeleteOfficialFailedString RespawnTimeDeleteSetupStringLoadFailedStringSaveFailedStringLoadSetupStringSaveSetupStringGetHumanReadableName VictorySoundBluePowerNodeDestroyedStringRedPowerNodeDestroyedStringBluePowerCoreDestroyedString RedColorRedPowerCoreDestroyedStringUnpoweredStringMissileLockOnStringNoneBluePowerNodeAttackedStringCrossHairColorRedPowerNodeAttackedStringBluePowerCoreAttackedStringRedPowerCoreAttackedStringNoneUnattainableNodeStringbSwitchToZeroCollisionInvincibleCoreStringVehicleLockedStringRenderOverlaysBlueTeamPowerCoreStringRedTeamPowerCoreStringBlueTeamDominatesStringRedTeamDominatesStringPlaneStateStructPossess MaxRandForceRandForceInterval SetupExistsHoverCraftState FireForce JumpDelaybModeExclusiveOvertimeCoreDrainPerSecTrailEffectPositions AmmoPerFire ShakeRotMagdrum FirepointPowerLinkSetupFlashEmitterClassScurrybConfigUseOnslaughtWeapon2NonebConfigUseOnslaughtWeapon1 DoFireEffectReplacedWeaponClassNames2ReplacedWeaponClassNames1ReplacedWeaponClassNames0 DescText DisplayTextVehicleMomentumMultNoneNoneNoneScreenShotNameNoneNoneNoneVehicleDestroyedNoneNoneNone DecoTextNameKDamageImpulse FlashFog GibModifierServerDeletePowerLinkSetupServerSavePowerLinkSetupServerSetPowerLinkSetupServerSendSetupNamesServerRemovePowerLinkNoneServerReceivePowerLinkbExtraMomentumZColorScaleRepeatsPlayerControllerbRagdollBullet bNeverSeversbKUseTearOffMomentum bAlwaysGibs TeleportToAcronym SetStartCore TweenTime TankTurretNoneLinkDesignerClassNoneNoneONSVehicleExplosionEffectONSTurretControllerNone CloseDownNoneNoneSpawnOnlyInDirectionOfNormal MeshNormalONSTurretBeamEffectBlueNoneCopyObjectToClipboard ONSTeamAINone bDirectionalONSTankHitRockEffectONSTankFireEffectONSTankFactoryNonebRotateToDesiredbBounceEnergyInducersbUseCylinderCollisionbBlockNonZeroExtentTracesbBlockZeroExtentTraces&DetermineVelocityByLocationDifferenceScaleSizeXByVelocityScaleSizeByVelocityMultiplierNoneREARgunTURRETTransientSoundRadiusTransientSoundVolume ONSSquadAI bFullVolumeNone bCanTeleportNone ONSSkyMinebCanBeDamagedNoneNonebUnlit PrePivotNoneRelativeLocationNoneSIDEgunBARREL ONSRVFactoryONSRVChainGunFireEffectbNetInitialRotationKillbUpdateSimulatedPositionNoneONSRocketProjectileONSRedPlasmaSmallFireEffectbReplicateInstigator SIDEgunBASE ParseOptionbHistoryWarmupONSRedPlasmaFireEffectONSRedEnergyEffectNonebAcceptsProjectorsONSPRVSideGunPawnONSPRVSideGunNonebStatic BaseMaterialONSPRVRearGunPawnONSPRVRearGunONSPRVFactoryLightSaturationNoneNone rvGUNTurretONSPRVONSPowerNodeShieldNoneONSPowerNodeNeutralIndependentVehicleNone ONSPowerNodeONSPowerLinkOfficialSetupONSPowerLinkCustomSetupONSPowerCoreShieldONSPowerCoreRedONSPowerCoreBreachEffectONSPowerCoreBlueONSPlayerReplicationInfoONSPlasmaHitRedONSPlasmaHitGreenONSPlasmaHitBlueONSOnslaughtMessageONSMineThrowFireONSMineProjectileREDONSMineProjectileBLUEONSMineLayerPickupONSMineLayerAttachmentOpenPositionForONSMineAmmoPickup ONSMineAmmoONSMapListOnslaughtNoneONSManualGunPlasmaProjectileDirtSlipSoundNoneNoneONSManualGunPawnNone ONSManualGunONSLinkDesignMessageONSRVbStartNeutralNoneONSHoverTankCannonPlaceExitingDriver DetachDriverONSHoverCraftFactory BallLauncherONSHoverBikePlasmaProjectileONSHoverBikePlasmaGunONSGrenadePickupONSGrenadeLauncherONSGrenadeFireONSGrenadeExplosionEffectONSGrenadeAttachmentONSGrenadeAmmoPickupONSGrenadeAmmoONSGrenadeAltFireONSGreenPlasmaSmallFireEffectONSGreenPlasmaFireEffectONSFreeRoamingEnergyEffectNoneNoneNoneNoneNoneONSDefaultMutNoneNone AttachDriverNoneNoneNoneONSBluePlasmaSmallFireEffectClientKDriverLeaveONSBluePlasmaFireEffectONSBlueEnergyEffectONSAVRiLRocketExplosionONSAVRiLRocketONSAVRiLPickup ONSAVRiLFireONSAVRiLAttachmentONSAVRiLAmmoPickup ONSAVRiLAmmoONSAVRiLAltFire ONSAVRiLNoneNone ProjectileNoneNoneNone"ONSAttackCraftPlasmaProjectileRed#ONSAttackCraftPlasmaProjectileBlueONSAttackCraftMissle RoadRampageNetWaitONSAttackCraftGunONSAttackCraftFactoryNoneLoginMenuClassbAlwaysShowLoginMenuMutLightweightVehiclesPlayWinMessagePlayStartupMessageMatchInProgressbScoreTeamKillsbSpawnInTeamAreaClientKDriverEnterConstructionTimeNoneDamTypeTurretBeamDamTypeSkyMineNoneDamTypePRVLaserDamTypePRVComboDamTypeRoadkillDamTypePancakeDamTypeONSVehicleDamTypeONSMine SquadTypeDamTypeONSGrenade CoreStageFindNewObjectiveForGetLeastDefendedObjectiveGetMostDefendedObjectiveDamTypeONSChainGunDamTypeONSAVRiLRocketLastCoreStageDamTypeAttackCraftMissleNone TryToDriveLastAttackExpirationTimeNoneClientSetViewTargetSpecialCalcBehindViewSteeringWheelSeveredDamagePerSecond RanOverSound SCarStateCrushedDamageTypeRanOverDamageType LinkHealMultTeamBeaconBorderMaterialSteerBoneNameNoneTeamBeaconTextureNoneClientStopFireKilledStyleEngagedWaitForTargetUpdateForTeam DeathMessage LinkedToErrorHumanNeutralStringConstructingStringNoneReticleOFFMaterialReticleONMaterial MaxLockRange MaxGrenades ReloadDelayAutoTurretControllerClass InitGamebEnterringUnlocks MaxMinesHealthBarViewDist BorderMatPrimaryTerrain bDefensiveLocatePowerCoreGetVehicleBaseToggleRadarMapNoneUpdateRocketAccelerationNone LinkDesignerCopyLinkSetup CopterState EyePositionbDoChainReactionNoneClientSetRotationNoneMaxChainReactionDistChainReactionDelayGetViewRotationIsHumanControlled IsPlayerPawn UpDamping MaxRiseForceNoneNoneRecommendLongRangedAttackDetectionTimer ScurrySpeedStopWeaponFiring ChooseFireAt RedMineClassLandMovementStateBlueMineClassSteerDampFactorLateralDampFactorForwardDampFactor TrailClass EncroachedByMaxSteerTorque AccelRateYawStartConstraint KApplyForceKImpact ModeTick PostLogin StopFirebSpecialCalcView bStationarybIgnoreForcesHealthBarHeightHealthBarWidth HealthBarMatHealthBarBackMatNoneNoneNone TurretBase RadarPosY RadarPosX RadarScale bCanStrafexPawn MaxMeshPPS bCrawler MaxSpritePPS BaseChangeDustSlipThreshResetTimeDelayNone DustSlipRateCrosshairTextureBumpDoTranslocateOutbDualIndependantTargetingEffectEmitterClassGetPosShowTeamScorePassC XInterface GetColorGetConsoleColorClientReceiveProjSpawnOffsetRedeemerWarheadNonePosY Gameplay StackMode LifetimeMonitorSuperExplosionbIsPartiallyUniqueComboDamageType ComboRadius bIsUnique ExplodeSoundNone bIsSpecialAltFireProjectileClassbInheritVelocityLiftCoefficientCurve CrosshairY CrosshairXLockAimInducerRotationSpeed NUM_BARRELSBARREL_ROTATION_RATEBarrelRotationFinalRotationbRotateBarrel bLockedOn MuzFlash3rd PitchAccel YawAccelGplunge SmokeTrailWeaponOptionsRecsEAxis ComboTargetDamTypeShockBeamWeapons bCanHitOwnerDamTypeMinigunBulletDamTypeLinkShaftOriginVNormNoneCoordsLastSparkTime ForceDirVelMag ComboSound ComboDamageNoneComboMomentumTransferShockBeamEffectBioFireUTWeaponPickupProjectileFire UTAmmoPickupCR bDoReflect ReflectNumBGunA EDrawPivot WeaponType InitialDir LinkColor DebugInfo OldHitCountselect3NoneNone MenuSoundsComp AS_FX_TXNoneNonerep Rotation PrevLocation UDamageTime ScriptTextUDamageWeaponMaterialGear ForwardVel bIsInverted OutputBrakeChassisPositionChassisQuaternionChassisLinVelChassisAngVelServerSteering ServerBrakeNone ChassisState CarState bNewCarState VehicleFX DustyCloud2DustNoneResetCountDownFireCountdownxWeaponAttachment OldDriverCamDir EnginePitch xTeamGamexPlayerReplicationInfoNone SpritePPSMeshPPS KParams0 Velocity PickupSoundsNone RadarWidth UT2k4AssaultNone GrenadeTex RocketProjFlakAmmoPickupFlakCannonPickupNoneNoneNone LastCamRotVMParticleTexturesVehicleExplosionsNone TankFiringPTankDustKick1None TankDustKickNoneNoneEJECTACloudParticleOrangeBMPtexNoneNoneNoneNoneDirtKICKGROUP dirtKICKTEXNoneNonepowerNodeEXPblueTEX PowerNodeEXPWeaponStaticMesh MeshEmitter0 MeshEmitter2SpriteEmitter6SpriteEmitter5 HBScreenPos MaxHealth HealthPctPlasma HomingTargetONSVehicleSounds-S HoverBike AttackCraftPRV HoverTankNone ExplosionsVehicleExplosion05NoneAttackCraftIdleAttackCraftStartUpAttackCraftShutDownNone DirtSkid03CollisionSoundsVehicleCollision07VehicleCollision01VehicleCollision02VehicleCollision03VehicleCollision04VehicleCollision05VehicleCollision06BodyHitbyVeh01 LaserSoundsLaser01NoneNoneSpriteEmitter4NoneSpriteEmitter3 BeamEmitter1SpriteEmitter16SpriteEmitter17SpriteEmitter7SpriteEmitter10SpriteEmitter11SpriteEmitter22SpriteEmitter19SpriteEmitter20SpriteEmitter15AW-2004Particles PlasmaStar SmokePanels1 BlastMarkPlasmaStarRedPlasmaHeadBlue PlasmaHeadPlasmaHeadRedPlasmaMuzzleBlue PlasmaStar2SpriteEmitter14ONSInterface-TX HealthBarNoneCurrentPlayerIconFinal avrilRETICLE MapBorderTEXSpriteEmitter2NoneNoneNone ReturnValueSpriteEmitter0Vinstagib_rifleshot BioRifleGoo2 BioRifleRocketLauncherPitchDampFactorBankTorqueFactorBankDampFactorNone FlakCannonRocketLauncherFireNoneNoneBikeMPH OutputThrust OutputTurn ServerThrust ServerTurnKPNone BaseGunTech BSeekLost1 BGrenfloor1NoneNoneRocketLauncherProjectileSwitchToFlakCannonBaseImpactAndExplosions BExplosion3Misc PGrenFloor1 P1GrenFloor1 WeaponSounds FlashFlare1Flares CopterMPHTargetHeading OutputStrafe OutputRiseNone ServerStrafe ServerRise CopStatebNewCopterState SoftFlareBeamsEpicParticlesWheelAdhesionNoneNoneNoneNone RocketCoronaNewExplosionALinkBoltScorchGrenadeSmokeTrailWheelSuspensionOffsetNone WallSparksExplosionCrap ComboDecalPlayerTransRedPlayerShaders PlayerTrans XGameShadersShockProjectile xWeaponBaseS enemyDir TargetDist enemyDist GoalStringNoneAccumulatedDamage OutputGasOutputHandbrake bIsDrivingNumPoweredWheels TotalSpinVel EngineRPMCarMPHActualSteeringRevMeterMaterial RevMeterPosX RevMeterPosYDamageEventThresholdRevMeterSizeYTakeDamageEventServerHandbrake ServerGas ServerGeartRRWheelLRWheelRFWheelLFWheel DefenseSquadNextObjectiveObjectiveStringPrefix xEmitterKarmaParamsRBFullKarmaParamsCollision KarmaParamsi KRepulsorDefensePriority bDisabledjNoneSquads Objectives BorderBoxDNoneInterfaceContentUT2K3Fanfare04 Fanfares GameSoundsZDiffDisabledObjectiveNoneWeapon WeaponFire EndGameFocus StartupStage LevelInfobOverTimeBroadcastRed_Powercore_under_attack Road_Kill GameInfoRed_Powercore_destroyedRed_powernode_destroyedPancake Hit_and_run HijackedBlue_Powercore_under_attackLockOn Car_jackedBlue_powernode_destroyedBlue_Powercore_destroyedVehicular_manslaughter NewRoundInNoneTPRINoneNoneNonePickedObjectiveObFreelanceDefendbFreelanceAttackCurrentOrdersSquadObjective NextSquad SquadLeader ranovercountSquad Teleporter bFreelanceWeaponDamageTypeNone TimerMessageInventorySpotTeamPlayerReplicationInfoTurretControllerUnrealTeamInfo DMMutatorDestroyableObjectiveUnrealMPGameInfo DeathMatch TeamGameGameObjective UnrealPlayerTeamAIHUDPlayerReplicationInfoSquadAI NewStateCriticalEventPlusNoneAimGameReplicationInfoNoneGetPropertyText Repulsors PropNameEDynamicLoadObjectGetPerObjectNames LocalMessageEffects GameRulesSVehicleFactoryMapListNoneKAcceleration bWonMatch EnemyTeamAmmo MakeColor SetDrawColorSetPosPickupDrawTileStretchedGetCameraLocationSizeYSizeXClipY InventoryClipXWorldToScreenTempNoneSlipVelbWheelOnGroundNone LatSlipFuncLongFrictionFuncHandbrakeFrictionFactorHandbrakeSlipFactorSuspensionOffsetSuspensionTravel WeaponPickupdtOwnerBase LongSlip bDeleteMeNonebWorldGeometry bNetDirtyBeamTrailAllParticlesDead Particles InstigatorAttachmentBoneNoneNone SoundPitchKRBVecKRigidBodyState bNetInitial bNetOwnerbScriptInitialized SetDrawScale SetDrawTypeDelta NewRotationSetRelativeRotation StartCoreSetRelativeLocationNonebPendingMapDisplayNoneRate SetupName__ProcessSetupName__Delegate Ammunition__UpdateGUIMapLists__DelegateStopAnimatingAnimNoneNoneGetBoneCoords OldStartCore AIController NewStart AttachToBone ControllerDetachFromBoneSetBoneLocationToSetBoneRotationGetAnimParamsoffsetposNone KAddImpulseKSetStayUprightParamsOther Softness HitCount impactVelParticleColorScale impactNormTorqueNone VehicleCountMaxVehicleCount DeltaTimemRegen HitEffect Restitution Adhesion PenScaleCoronaEventInstigator HitNormalbConfigUseOnslaughtWeapon0 HitLocation DamageAttenbUseOnslaughtWeaponReplacedWeaponClassesReplacedWeaponPickupClassesReplacedAmmoPickupClassesPhysicsVolume OnslaughtWeaponPickupClassNames TeamInfoNoneMutatorReplacedWeaponPickupClassName PowerCoresNone FinalCore FlashEmitter bReflective BaseNodeOfficialPowerLinkSetupsCustomPowerLinkSetupsbRandSetupAfterReset bIsFiring ONSPROPNUMStartReloadAnimRateNoneCustomPowerLinkSetupNames ReloadAnim GameProfileCallerNavigationPoint RandSpin BlankSetupMapName BeamEmitter CacheManagerDirCanvas TeamNodes TotalNodesEndChannelNoneNoneNoneNoneNone RelatedPRI_1 RelatedPRI_2OptionalObjectdistTargetLocationNone HudScaleNone GoldColorNone GreenColor WhiteColor PawnOwnerPRI PawnOwnerLevel PlayerOwner SetupStringBotGRIYLYPosframeN RefNormalShader TexRotator FinalBlend ModifierP CheckDist WeaponPawns ActiveWeapon MeshEmitter TeamIndex ColorNames bTeamGameEmitter bMeleeWeapon ImpactAccel ImpactInfoImpactTicksLeftTeamsWinner PRIArrayPCNoneNoneNoneNoneNone AccelMagPlayerbAdmin PlayInfo SkeletalMesh FireMode MultiplierONSVehicles-A PRVchassisbOnlySpectator bOutOfLivesNoneBest DistanceNone TerrainMap TerrainScaleWorldLocation instigatedBy bOverTimeNone NewOrdersHoverBikeChassisFinalREDRV NEWprvGroupAttackCraftChassisFinalREDVMVehicles-TXRVGroupHoverTankGroupAttackCraftGroupRVChassisFinalREDNoneNone newPRVshadHoverTankChassisFinalREDHoverBikeGroupNoneHoverTankChassisFinalBLUEAttackCraftChassisFInalBLUEHoverBikeChassisFinalBLUERVChassisFinalBLUE CoreGroupONSstructureTexturespowerNodeUpperFLAREblueFinalNone PowerNodeTEXNoneNoneNoneCoreEnergyShaderBlueCoreEnergyShaderRedCoreConstructionBlueInvisibleFinalCoreConstructionRedpowerNodeUpperFLAREredFinalNoneNoneNoneNoneCoreBreachGroupNone JumpForceNoneNoneSpriteEmitterTurnDampFactor TargetPitchSkill TreadStatebNewTreadStateModeNoneSetViewTargetNewLocMenuPitchDownLimit PitchUpLimit ZoomLevel DefaultFOV DesiredFOVCurrentThrustAccumulatedTime LastCamTime CameraDistGameRulesModifiersaPawn PlaneStatebNewPlaneStateVehicle LerpAmountCurTimebestAimNone HoverMPHbHeadingInitializedPlayerReplicationInfoClass HoverStatebNewHoverStateTargetJumpCountdown RandForce RandTorqueEnemy TrailEffectsRelVel GunnerPos GunnerRotFocus VehicleBaseNoneNoneNone VehiclePawnGunnerAttachmentBoneCoordsNonenextController ONSWeapons-A bAltFireSVehicleWheelbFirebActiveCurrentGameProfile VehicleList bWaterVolumenewRot bEnabled TeamNumber LinkedNodesnextNavigationPointResultNextHistorySlotCameraHistory FilterFramesDestroyEffectClassInOptNone BestDist TerrainInfoGrenadeLauncher_1st ParasiteMine PRVsideGun PRVrearGUNNone RVnewGun VMWeaponsTXNone AVRiLtex AVRiL_3rdHoverTankCannon PowerNodeSpiderMineTEXMineLayer_3rdGrenadeLauncher_3rdManualBaseGunNone PlasmaGunPlayerWeaponsGroupMineLayer_1stNone AVRiL_1stAVRiLreticleTEXParasiteMineImplantTEXshad NewManualGunNoneNoneSpiderMineBLUEtexAVRiLreticleTEXRed bWasAltFire VMStructuresNoneNonepowerNodeBaseSM CoreShieldSMCoreBreachTopRINGCoreBreachTopDISC NewPlayer tryPlaceInTeam PowerLinks MaterialBitmapMaterialParticleEmitter TrailEmitter bForceLeaveNoneConstructionTimeElapsedbPoweredByRedbPoweredByBlueKiller bSevered bUnderAttackLastAttackTime CamLookAtLastAttackAnnouncementTimeLastAttackMessageTimeRotZ CloseActorsRotYRoamingEnergyRotXLastDamagedBy bWasDisabledInfoNone BestDistance KilledPawnActor NextVehicleHeightNoneVictimNone ClassNameVSizeUSizeYawRollOptions SoundGroupProceduralSoundParentFactoryRoleTagFromEventDriver EnergySphereReason incomingName BestStartTelNone DriveRotClass bActivatebLastLockedOnLastHomingTarget GrenadesCurrentGrenades BestRatingRiseMines CurrentMines PrevTeam VMWeaponsSM VMGrenadeAVRiLsm AVRiLGroupAVRiLprojectileSMRadarMaxRange RadarRange bMapDisabled MapCenterbWeaponisAltFiringbWeaponisFiring NewRatingbRelativeExitPosWorldToMapScaleFactorLowestDistanceDistanceVectorNonebSuperRelevant CenterPosX CenterPosYbShowDisabledNodesNone PawnIconSizePlayerIconSize CoreIconSizeAttackIconSize MapScaleNoneMapRadarWidthNone HUDLocationNoneNone PlayerIcon ColorPercent OldDrawColorNone PitchChange YawChangeWallL TimeSecondsVMVehicleSounds-SNoneIncomingShell OwnerGun HitActorNone aimerrorPackageNone ChainTargetRadarMapImageCameraRotationConstCameraLocation ViewActor DetailMode bDropDetail HeightOffset TargetPawnNoneSwitchTargetDirectionShieldNetModebWaitingForRelease bLosingLock LostLockTimeNone EyeHeight FlashCountAIYawConstraintDeltaNone WeaponRecord TextBufferNone CurrentAimWeaponFireLocationWeaponFireRotationObjectEnum FunctionState WeaponOffsetQuatCurrentHitLocationOldFlashCountLastHitLocation LastRotationStructNameOutPosYOutPosX OutStackModeEffectEmitter OutDrawPivotAmbientEffectEmitterNonePosX DrawColor EStackModeGameNavigationPointList StrPropertyStructPropertyArrayPropertyClassPropertyNoneDelegateProperty NameProperty ProjClassObjectProperty StartTraceFloatProperty BoolPropertyWeaponBoneCoordsCurrentFireOffsetNoneONSDeadVehicles-SMRVDeadAttackCraftDeadHoverBikeDeadNone TankDead IntPropertyDestructionEffect ByteProperty LinkSetupsControllerListInducerRotationFacePlayerRotationYawRotSpriteEmitter9SpriteEmitter34SpriteEmitter35SpriteEmitter36SpriteEmitter66SpriteEmitter8SpriteEmitter12SpriteEmitter13SpriteEmitter23SpriteEmitter32SpriteEmitter53None MeshEmitter3SpriteEmitter37SpriteEmitter38SpriteEmitter39VMmeshEmittedEjectedBRASSsm BeamEmitter4TurretParticles TurretBeam5 BeamEmitter5 BeamEmitter0ONSWeapons-SMMineLayerPickupGrenadeLauncherPickupGrenadeLauncherAmmoMineLayerAmmoSpriteEmitter1NoneTintsPrecacheSoundUseMeshBlendModeONSRVWebProjectileLeader MessagesClientPlayForceFeedbackColorMultiplierRange CullDistanceOffsetY RenderStyle TextureScale DrawPivotOffsetX RefireRateONSWeaponAIInfobFireOnRelease bInstantHitAIInfo bTrySplashbTossed bLeadTargetUpdateLinkStateScaleSizeByVelocityMaxResetSetTeamDied LimitPitchScalebDelayedDamageTextureCoordsWidgetTexture ScaleMode SpriteWidget EntryRadius SpinCCWorCWExtentMultiplierONSRVWebProjectile KillSoundSupportBoneNameAddLink ChargeBar bHasAltFireDestroyedEvent KillString EnemyVisibleONSImpactSparks MaxRangeTPCamWorldOffsetSpawningSoundSetEmitterStatusNotifyUpdateLinksSpawningSoundProbabilityClientStartFireClientVehicleCeaseFire ResetLinksBlueBuildEffectClassFindLinkSetupRedBuildEffectClassONSTankSecondaryTurretONSRVWebLauncher CheckShieldSetFireRateModifier AdjustAimRelativeRevolution GroundSpeed ScoreKill HealthMaxDestructionAngularMomentumbStasisbPadWithZeroesGetPriorityAttackObjectiveFor ClearLinksExistsLinkPathToScoreObjectiveONSTeleportPad SetupLinksDrivingStatusChanged HasNodes StartUpForceDestroyedVehicleMeshDisintegrationEffectClassDestructionLinearMomentum bDoSafetimeStopForceFeedbackSetWheelsScaleDamagedEffectOffset SpawnEffectsBladeBreakOffNumericWidgetMinDigitCountbDetonatesGoop HornSoundsBeyondViewDistancebDestroyOnWorldPenetrateCriticalObjectiveWarning StopZoomUnSeverHeadlightCoronaOffset HasWeaponIsVehicleEmpty FlagRotationbDoOffsetTracebInstantRotation FlagBoneEntryPositionGetWheelsScaleForGetMaxObjectiveGetOutDist LoseLockServerChangeDriverPositionNewDrawWeaponInfoLowFrequencyNoiseRange EjectDriverHeadlightCoronaMaxSizeHeadlightCoronaMaterialHasLinkConstructedEventSupportBoneAxisDamagedEffectScalebDriverHoldsFlag OwnerEffectsDisintegrationHealth BoneRollAxisUnStickShutDownForceGetCurrentNodeBrakeLightOffsetEndZoom RemoveLink bMovableObjectiveCoveredSetHomingTargetSetThrustEnabled SetupBeam DetonateWebDestroyAppearanceUpdateHoverDust LinkInfoCancelSetNode SetNodes ClearNode IsFiring ToggleZoomSetEffectScale FreeObject AdjustSpeedStuckAccelerationMagnitudeClientClearControllerCustomCrossHairTextureNameBackup_Disabled SetObjectiveDrawHUDAcquireTarget SpokenForHighFrequencyNoiseRangePutDownAnimRateSelectAnimRateObjectiveGetOutDistRequestPowerLinksbShowChargingBarAllocateObjectSetScurryTargetPowerCoreAttackableVehicleDesireability Object02ScurryToTargetLocChangeTeamTintClientRegisterVehicleWeaponStandUpSetAttractionState PreventDeathVehicleExplosionSpawnNodeTeleportTriggerTooCloseToAttack Priority NeedsFlip PawnDied SetTimerDaredevilThreshInAirTimeDaredevilThreshInAirSpinActivateOverlay CameraBone WarnTargetCheckTouchingbPCRelativeFPRotationForceDeathUpdateUpdateHUDLocationDodge ShouldLinkToFindNodeLinkIndex GroupNameUnderAttackChange UnPossessFPCamViewOffset WasKilledByLinkedToCoreConstructingForbMakeBrakeLightsGetPriorityFreelanceObjectiveNoEntryTextureBrakeLightMaterialTimeTillResetRange bIsGreyScale ShareScoreDriverRadiusDamageTrailLocationONSNodeBeamBlueEffectONSNodeBeamRedEffectBotDesireabilitySpawnBuildEffectbSeparateTurretFocusTeleportRatingbHasHandbrakeHasUsefulVehiclesGetCameraLocationStart HasHealthBarRemovedCoreLinkMaxVehicleDistBlue_powernode_isolated VehicleIconWheelSuspensionMaxRenderTravel TeamSymbols NumMessages GetTurretsUpdateLocationNameHasOccupiedTurret JumpSoundDaredevilThreshInAirDistanceDrawWeaponInfo!Red_powernode_under_constructionWheelPenOffsetStageBlue_Powercore_vulnerableVehicleDisintegratedMaxPointsPerTrailResetOnTrigger FadedColor WhatToDoNext AttachFlag bFlamingOnCoreDestroyed VehicleFireServerVerifyVehicleWeapon ASGameInfo ScoreEvent bDoStuntInfo CoreWidgetsCoreHealthWidgetsBlue_Powercore_damagedHeadlightProjectorScaleHeadlightProjectorRotationHeadlightProjectorOffsetDriverEnteredVehicleHeadlightProjectorMaterialbRecommendSplashDamage ModifyThreatFlip ReceiveLinkServerPlayHornbAllowBigWheelsDrawNodeLabelUpdateDamagedEffectbThrowRagdoll GetViewAxesAirTurnTorqueAirPitchTorqueAirPitchDamping DrawMapImageDrawAttackIconAirRollTorquebCanCarryFlagAirRollDamping DrawCoreIcon DrawNodeIconCheckForHeadShotPlayStatusAnnouncementGetHitEffects bFadeMessageProjectileEffectClass MaxHoldTimeViewShakeRadius CARLsliderbDetailAttachment CARRsliderRed_powernode_isolatedMachineGunTurret UpdateNodeUseRevolutionScaleBlue_Powercore_critical AutoReset ActiveSound UpdateNode1TrailShadeType UpdateNode0BotNearObjectiveOnReceiveLinkNodes OnRemoveLinkPlayRewardAnnouncement SetDustColor SetDirtColor FlagOffset CanThrow SetThrustRemoveSetupNameBeamTextureUScaleSetCurrentSetupFindEntryVehicle BringUpTimeAddVelocityMultiplierRangeFireOnRelease UpdateTracer NeedToTurnRed_Powercore_criticalClientVehicleExplosion EagleEye"Blue_powernode_under_constructionClientShowMapRed_PowerCore_vulnerableFender_BenderRevolutionScale FireWeaponAt SwitchWeapon IsHeadShotTop_Gun SetupTreadsDestroyTreads SpawnOverlayClientReceiveCurrentSetup DareDevil StopDrivingDeadTeamScoreBackGroundDiscClientRemoveSetupNameTeamScoreBackGround AddHealBonusUpdateBrakelightState ScoreTeamRed_Powercore_damagedPointLifeTime SVehicleIconTriggerDisabledDrawSpriteWidgetCanHealClientTriggerPrecacheAnnouncerbShowDamageOverlaybSetPCRotOnPossessReceiveProjectileWarningAmbientSoundScalingCheckJumpDuck SymbolGBDistanceThresholdAltFireSoundClass AltFireForceRenderSpread GetRangeNode NotifyStuckMinAimDriverLeftVehicleJumpChargeTimeMaxSpinAddBotMinDamageScale ModeHoldFirebDrawVehicleShadowSimulateTraceFire MergeWithMaxCoronaSizeSetGRI ChargedLoopReservationCostMultiplierGetShootTargetAddSquadWithLeaderShowMidGameMenu SpreadAngleAltFireSoundRadius ONSHintsAltFireSoundVolume IconScale ShowPathToFollowSecondFireSoundPitchFireSoundRadiusMinProjectilesMaxProjectiles ClientResetChargeUpSoundSetTemporaryOrders bCorrectAimShieldHitSoundbIsRepeatingFFKillEnemyFirst ChargeLoop TeamSkinsbDirectionalCorona RedSkins BlueSkins BulletSounds KickMomentumbCoronaReloadAnimDelaybBlocksTeleport ParseOrder ApplyOrder ActorTagServerClearPowerLinks CheckResetSetObjectiveListsShowTeamScorePassAbScriptedRiseBeamEndPoints AddVelocityNetUpdateFrequencyClientDelayedAnnouncementNamedLineOfSightToTellBotHowToHealIsFirstPersonInWayOfVehicleSpawnStringbUseCollisionStaticMeshTargetLocFuzzScurryAnimRate MinReloadPctDrawNumericWidgetAddServerDetailRedPowerCoreCriticalStringBluePowerCoreCriticalStringPressUseToTeleportStringRedPowerCoreVulnerableStringBluePowerCoreVulnerableString$RedPowerNodeUnderConstructionString%BluePowerNodeUnderConstructionStringRedPowerCoreDamagedStringBluePowerCoreDamagedStringRedPowerNodeSeveredStringBluePowerNodeSeveredStringPowerCoresAreDrainingStringUnhealablePowerCoreStringbPlayCriticalAssaultAlarm Road_RageStuntInfoString1StuntInfoString2StuntInfoString3StuntInfoString4StuntInfoString5StuntInfoString6StuntInfoString7StuntInfoString8 CheerSoundCheerPointThreshbMonitorUnderAttackLeadTargetDelayHUDOverlayFOVCenterSpringForceCenterSpringRangeRoll LightPeriodLinkupLifetimeNearObjectiveLoadSRGrammarNoPathToPowerCoreStringLoadFailedNoPathToCoreStringSuckReduceVelFactorSuckTargetOffsetSuckTargetForceSuckTargetRangeSuckTargetClassesJumpingbOnlySuckToDrivenbSymmetricSuckTargetbEnableSuckTargetForceProjGravityScaleProjStuckNeighbourVelDamping OnDaredevilSetEndGameFocusAIShootOffsetSpringExplodeLengthShowMapOnDeathSpringMaxForceMAP_ImmediatelySpringDampingMAP_WhenBodyStill GetNodes MAP_NeverGameUMenuTypeGetServerDetails CheckVehiclePrecacheGameAnnouncementsStuckSpringStiffness PowerLinkSpringStiffnessCalcDrawOffsetCheckSquadObjectives SpringLength!ONSWheeledVehicleExplosionEffectExtraDamageMultiplierExtraDamageClassONSVehicleKillMessageClientMessageExplodeEffect StuckSound ExplodeDelayBeamSubEmitterIndex FreeScriptONSVehicleIonExplosionEffectSpawnParticle ProjNumberONSVehDeathRVViewShakeOffsetMagViewShakeOffsetFreqONSVehDeathPRV ReloadSoundONSVehDeathHoverTankWeaponShakeViewONSVehDeathHoverBike WeaponTickMustKeepEnemyTimeBetweenImpactExplosionsExplosionSoundsExplosionSoundVolumeExplosionSoundRadiusONSVehDeathAttackCraftDrawSelectionIconDrawSpawnIcon StartBerserkONSTurretBeamEffectExplosionDamageExplosionRadiusExplosionMomentumExplosionDamageTypeDestroyedRoadKillDamageTypeDamagedEffectClass StolenSoundONSTankSecondaryTurretPawnDamagedEffectHealthSmokeFactorDamagedEffectHealthFireFactorDamagedEffectAccScaleTakeImpactDamage StartMatchCoreWorldToScreenONSTankFireTrailEffectbEnableProximityViewShakebOnlyViewShakeIfDrivenmTracerPullbackbEjectPassengersWhenFlippedONSTankBuildEffectRedONSTankBuildEffectBlueONSSmallVehicleExplosionEffectONSSkyMineEffectCheckSpecialVehicleObjectives mTracerClassbAllowVehiclesGetMoveTargetForSparkEffectClassONSRVWebProjectileEffectSparkAdvanceFactorONSRVWebLauncherMuzzleFlash UpdateSparksONSRVRightBladeBreakOffEffectONSRVLeftBladeBreakOffEffectGetAllLoadHintsONSRVBuildEffectRedONSRVBuildEffectBlueNodeLabelWidgetONSRocketScorchMinRunOverWarningAimGetInventoryClassOverrideSeveredColorBSeveredColorA AttackColorBUseCrossedSheetsONSPurplePlasmaSmallFireEffect AttackColorAbNotifyLocalPlayerTeamReceivedHealthBarPositionSetActiveWeaponRenderTexture RadarTransONSPRVSideGunMuzzleFlash FormationSetReservationONSPRVRearGunChargeFluidSurfaceShootStrengthMod ProjTexturebPathCollidingNumPassengersONSPRVComboEffectONSPRVBuildEffectRed HealDamageONSPRVBuildEffectBlueLockCheckFreqONSWeaponAmbientEmitterReachedDestinationGetBotPassengerGetOutOfVehiclePreSpawnEffectTimeONSPowerCoreEnergyRedDoWaitForLandingONSPowerCoreEnergyBlueWeaponCenteredMessageSwitchBasePriorityObjectiveSetDefenseScriptForONSPowerCoreEnergyCheckSuperBerserk FireAnimRateAutoResetTimeRangeDetachFromPawnONSPlasmaHitPurpleNumForwardGears bCanFlipONSPCTeleportTriggerbDesiredBehindViewONSNodeHealEffectCenterSpringRangePitch bClientAnim StopBerserk SetGrammar GetLifeTimeDestroyedSoundONSMineLayerTargetBeamEffectGetConsoleFontNoneAwardAdrenalinebAddTransientCostsDefaultEnemyRosterClass PutOnDefense ADR_KillMaterialBlendingOp LoadingHintsNeverAllowTranslocAllowTranslocFrameBufferBlendingOpONSMineLayerAltFireFOVCheckMaxLivesMaxTraceDistance bClipBSP bGradientbNoProjectOnOwnerONSManualGunOverlayPhysicsVolumeChangeONSHUDOverlayToggleZoomWithMaxRestartPlayerbDestinationOnlyHUDSettingsMenuONSHoverBikeJumpEffectDaredevilThreshInAirPitchDaredevilThreshInAirRollONSHoverBikeHoverDustONSHoverBikeDuckEffectDaredevilMessageClassCoronaRotationONSHoverBikeBuildEffectRedNotifyTakeHitONSHoverBikeBuildEffectBlueAdrenalinePickupONSHeadlightCoronaONSGrenadeBeaconRedbOldVehicleOnGroundONSGrenadeBeaconBlue AllowMutatorONSHeadlightProjectorReAssessStrategyLastDefenderTeamIndex MaxJumpForce ShieldOffset MaxJumpSpinGetInstigatorbAlwaysSeversJumpFeedbackForceJumpMeterOriginXJumpMeterOriginYJumpMeterWidthJumpMeterHeightJumpMeterSpacingJumpMeterColorSpinMeterColorJumpMeterTexturebProjectOnUnlitONSDaredevilMessageONSCrosshairsONSChargeBeamEffectONSBrakelightCoronaAcceptPlayInfoPropertyMinAirControlDampingFenderBenderSpeedONSAvrilSmokeTrailmTracerInterval RangedAttackbProjectOnParallelBSPScaleSizeYByVelocityGetServerInfo HoverCraft bNoRepMeshIsConsoleMessagebDynamicAttach MessageClassbShowNodeBeams AddGameRulesCriticalPlayer Crosshair bSpecialONSDamagedEffectLeftBladeDummy CarRShoulderRightBladeDummy CarLShoulder RVarmEXTEND LfrontStrutLeftRearSTRUT RrearStrutRightFrontSTRUT ReloadForceShouldFireWithoutTargetONSAttackCraftStreamer RVarmRETRACT YellowColorLeftFrontSTRUTRightRearSTRUT RFrontStrutAttach LrearStrut LicensePlateLicensePlateFallBackLicensePlateBackgroundbReplicateAnimations SpectatingObjectiveDisabled HealedSound HealingSound NeutralSound bBulletHitStartConstructionSoundConstructedSoundArmExtendSoundArmRetractSoundBladeBreakSoundArmExtendForceArmRetractForceDeadStaticMeshLockedOnSoundbLightChanged bVehicleHitDetachONSAttackCraftExhaustONSAttackCraftBuildEffectRedbProjectOnAlphaClearTemporaryOrdersONSVehicleBuildEffectONSAttackCraftBuildEffectBluebFPNoZFromCameraPitchMutWheeledVehicleStunts MutBigWheelsRoundHasEnded ScrapeSoundHUDOverlayOffset SparkRate mTracerSpeedDamTypeTankShellSparkRadiusScale InvertSteeringThrottleThresholdMaxAdditionalVelocityAdditionalVelocityScaleHorizontalVelocityRangeDamTypeTankRoadkillDamTypeTankPancakeClientRoundEnded AddScorerGetTipLocation LightConeDamTypeRVRoadkill LeftFire RVfirePoint RightFireSideGunnerLocationDamTypeRVPancakeDamTypePRVRoadkillDamTypePRVPancake GetAimTargetTreadVelocityScaleDamTypeONSWebDamTypeONSVehicleExplosionDamTypeONSRVBladeDamTypeHoverBikePlasmaEndGame FontSize ChangeTeambCanFlyDamTypeHoverBikePancakeDamTypeHoverBikeHeadshot DamTypeDestroyedVehicleRoadKillDamTypeChargingBeamDamTypeAttackCraftRoadkillChargingSoundbCanBeBaseForPawnsDamTypeAttackCraftPlasmabHasOwnHealthStreamerOpacityMax Object01 MeleeRangeMaterialUSizeStreamerOpacityChangeRateGatherThresholdStreamerOpacityRampStreamerEffectClassStreamerEffectOffsetTrailEffectClassPlayHit MaxSquadSize PutDownTimeStartSuperBerserkNotifyLocalPlayerTeamReceived PawnBaseDiedHUDOverlayClassDamTypeAttackCraftPancake DuckSoundBikeDustTraceDistanceBikeDustOffset DuckForceMagBigWheelsRulesbIgnoreVehicles JumpForceMag JumpDurationBranchHFPointsRangeActionMessage_ONS VictimHealthCoreBreachShockRINGedgeDaredevilPointsshock_mark_heat bTemporaryhovercraftFANSblurTEXOldHoverStateMeshEmitter18CoreBreachShockRingTRANScoreBreachACCRETIONredcoreBreachACCRETIONbluepowerNodeBeamREDfbCoreLightShader AVRILammoPC_MantaJumpBlastIsSoftwareRenderingSizeEmitterTextures shock_ring_b LastJumpTime DuckDurationSenderDuckCountdownBBulletImpact13 GameGroup RulesGroup BikeDustBikeDustLastNormal DoBikeJumpOldDoBikeJump DoBikeDuckOldDoBikeDuck bHoldingDuck JumpEffectbClientTrigger DuckEffect bOnGroundbResult MultiFramefire3bUseHeadlightsEclipseCircle OldCopStateexp7_framesBLUEPowerCoreExplosion01 Explosion06 rockchunks02RVChargeLoop01OldPlaneStateStreamerEffect RVChargeUp01 SquadMembersPwrNodeStartBuild03StreamerCurrentOpacityStreamerActiveDesiredOpacity DeltaOpacityMaxOpacityChange ThrustAmountSpriteEmitter28NewStreamerActivebIsBehindView HitRotation MeshEmitter1 BeamFragment EnvironmentsPwrNodeBuild02PwrNodeActive02OldCollideActorsOldBlockActorsbUseTerrainForRadarRange coreDeadCamBoneCoordsMeshEmitter17bShowRadarMapNetUpdateTimeScriptedTexture HudOverlay TracerShot bDrivingbNoTeamBeaconParticleBeamEndPointshock_core_low BodyState LinTurnSpeedSlotRightTreadPanner DustSmokeRVEng01xScorchZOffsetLeftTreadPanner CarAlarmOldTreadStateHorn09 TrailBlur BaseGunCABTankMachineGun TrailBluraIcons FlickerFlare OutSpark03awSmokeShaders exp1_framessanityShapesbPendingDeletebSoundsPrecachedSmokeFragmentActionMessage BurnFlare KStartLinVel PlasmaFlare ResetTrail tankTreads exp2_framesbSparksActive SparkRadiusVehicleVelocity UseRadius ParticleRate LocalVehVelAddVelHorn04bFlameSmokeLifeScaleShockBBulletReflect1 bDoThrust TargetLocKAddAngularImpulse GoalScript DirtColorDirtColorZeroAlphaDirtColorHalfAlpha bDustActiveBBulletImpact9DustColorZeroAlphabRewardSounds HoverHeight BreakEffect bFogDistgrenadeLauncherReticle NewHUDicons ArmTipCoordsExplosionEffectBBulletImpact2 RaptorGun RVexplodedARMMANUALbaseGunDEAD newPRVdeadRAPTORexplodedRaptorTailWing RaptorWingHELLbenderExploded HellDoorHellGun HellTireHoverExploded HoverChair HoverWing TANKexplodedRvtireRVrailRVgun PRVWheelMesh RVStop01ArmBaseCoordsbClientRightArmBrokebClientLeftArmBrokebRightArmBrokebLeftArmBrokeAscCodeHighLightColorForegroundColorLicensePlateFontLicensePlateNameBBulletImpact5 SaDScorchtBBulletReflect2NextGameRulesPwrNodeBuilt01VehicleLostTime LastTouchedGenericbMenuBeforeRespawn ShakeOffset WhiteTextureSpinChargeAmountJumpChargeAmount PRVStop01mTracer lostTraction WheelCoords HealingTimemTracerMinDistance TeleportPadsTeleportTrigger OutputPitchDesiredJumpForce JumpSpin Constructor LastHealedByNodeHealEffectNodeBeamEffectmLastTracerTime BeamMask Dixie_Horn SpawnDir NextCore bPushDownbAllowChargingJumpNodeNumbAllowAirControl__UpdateLinkState__Delegate OldCarState__NotifyUpdateLinks__DelegateServerViewYawDestroyedCoreIndex__OnCoreDestroyed__DelegatehitDistServerViewPitchIndexIndoorAmbienceInAirDistance InAirTime InAirRoll InAirPitchMeshEmitter19 InAirSpinLastOnGroundTimeLastOnGroundLocation BrakeLightStaticDrawCanvasLineMetalScrape03InLatentExecutionTankColorBlueBBulletImpact14AngVel NewVolume bGameEnded PropertyName HardSpotVehicleMovingTime BackColorVehicleSpawnShaderRedAsker AskerTeam PurpleSwellRaptorColorBlue Fireball3hoverCraftBluebRepulsorInContact BaseRadius bIgnoreRangeScreenLocationPCEnergyEffectColorModulate Explosion08TeamID AdjustedLocraptorCOLORtestVehicleExplosion03VehicleExplosion02bReverseBlueTeamDirection bPreSpawnRemainingMinuteRemainingTime LastSpawnedRepSkinEDoubleClickDir RVStart01link_spark_greenLockCheckTimebAccruePointsBBulletReflect3 NumPositions Hydraulic10Amountnewray damageScalebFinalAngularImpulseLinearImpulseHalfPercentMomentumWeaponAttachmentInstigatorControllerPRVtagFallBackMomentumNormal AirBlastHealer PenOffset OldRotation RVcolorRED TraceEndSmokeReOrderedServerResponseLinebReceivedLinks Explosion03 VehicleGoalClosestWeaponPawn ZoneInfo NeutralColor ClosestDistbControlledWeaponPawn NeededPitchOldYaw ReservationLastRunOverWarningTime ResetTimeHeadlightProjector SparkEffectFont FireTime CarAlarm01Debris BestCoreWeaponBerserk EndTrace TankStart01 DestinationShockImpactFlareBCoreBreachFrontFLARE MeshEmitter5 MeshEmitter7HudCDeathmatchCurCoreSavedModulationSmokeAlphab_tCenterRadarPosXCenterRadarPosY shock_flash IconScaling HUDScalingLabelIconSize TensPlace LabelColor purple_lineDrivenVehicle bNeverReset bHadFirebDisintegrateVehiclebDestroyAppearanceMapXMapYPlayerXPlayerY DimensionsMapSize SavedAlphaDamagedEffectColorPercentage MeshEmitter4 HoldColorLastCheckUpsideDownTime bAttackableLastImpactExplosionTimeLastVelocitySizeOldExplosionCount IconColorExplosionCount Normalizeshock_Energy_green_faded bSnipingViewShakeLastCheckProjectileEffectViewShakeRotFreqViewShakeRotMag LastTickTime bBeingSucked StuckActor StuckNormalPendingWeaponHoverBikeStop01WWclass ServerState Shock_ring_a shock_core"DelayedDamageInstigatorController exp2_framesP ObjectPoolColor0bZero__UpdateNode1__Delegate__UpdateNode0__DelegateProjVelDampingbTestObjectiveCoveredbPickedObjectiveCoveredbAlreadyInList NextCoresbSuckFriendlyActorbNoSuckFromBelowNextPickedObjectivebHasVulnerableNodeValuebFoundDefenseAttackedObjectiveBigWheelsMutator ProjTeam WillowWhisp XEffectMat PathWhispstarg AccelTimeTearOffMomentumBBulletImpact12LeadTargetStartTimeLowestDesiredZ TargetPawns IgnoreActorZoneCarThreat FlagActorKSetBlockKarmaScaling ScreenPos bClosedDownbGoToTargetLoc ClientState NewTargetCamViewOffsetZAmountLinkAdditionalScale NewTargetLocNone DigitSet SelectedPCSmokeTrailEffectAttackCraftNoColor SwitchNumBrake GoopSparks DustColorbOldUnderAttack HotBolt04aw Triggers PowerBolt InitialState WasSeveredVariableTexPanner PlayerNameXAxisNewHoverCraftNOcolor TankTrail PowerSwirlbBlueCoreWasVulnerable RocketTex0bNoFXbCallInstigatorPostRenderbForceCenterAim Smokepuff2bRedCoreWasVulnerable TraceStartbAmbientAltFireSoundBBulletImpact4 bIsAltFirePRVtag NewSetupNameFireIntervalAimLockAimLockReleaseTimeTotalNumSetupsAimTraceRange IgnoredSetupHeadlightCoronaTexAnnouncerVoiceFramed MuchSmoke1 bShowPointsHorn03Extent bLevelChange RocketFlare ExplosionTexShockImpactScorchScreenYScreenXParticleTimeScaleShockImpactFlareCurrentSetupNameForwardRotation WeaponYawbCurrentSetupIsOfficialHeadlightScaling AdjustedAimControllerAimShockExplosionCore bInitialized ShockBall WeaponPawnPRVChargeLoop NewTracerVehicleInstigator NEWrvNoCOLOR NewScaleavrilRETICLEtrack HitSmokeCurAimPawnDirPowerNodeBlueFBPowerNodeBeamBLUEfbStartHoldTime HitFlame bHoldingFirebSkip BestMinelocInheritVelocityScalebShowScoreBoardbRemoteControlled ElecPanelsLastUnderFireGunDir RightDirNumProjectilesSpreadAngleRad FireAngleRadbVehicleDestroyedImmediateWarningEndTimeDamageCounter TurretFlash AvrilFire01 SourceDist PowerCoreShing2NearestMaxObjectiveGetOutDistDamageScalingLastFailedNodeTeleportTimebDefendingSquadBonusInventoryClassName spawnVel Traveled Steering OrderString Throttle RecipientID NextMutator WebLauncher WebStickWebFire SetBoneScaleRegion CoreDiffTEXMeshEmitter11MeshEmitter13MeshEmitter14MeshEmitter15 COREenergy CoreDividedMeshEmitter16CoreBreachFrontDISC BaseNodeSM PRVFire01MeshEmitter12 BeamEmitter8BeamEmitter12SpriteEmitter25 PRVChargeUpPowerNodeREDfbSpriteEmitter64SpriteEmitter68SpriteEmitter67SpriteEmitter65MeshEmitter43MeshEmitter44MeshEmitter45 MeshEmitter8 MeshEmitter9MeshEmitter20SpriteEmitter49MeshEmitter31MeshEmitter33MeshEmitter50MeshEmitter21MeshEmitter22SpriteEmitter30MeshEmitter23SpriteEmitter31MeshEmitter24MeshEmitter25AW-ShieldShadersBlueShieldFinalEnergonShield OldVehicleBaseGUIController Ammo_DummynewPRVnoColor Projector WeaponSkinsrayNumMessagingSpectatorScorer__SetCurrentSetup__Delegate__RemoveSetupName__Delegate XWeapons_rc__ResetLinks__Delegate__OnRemoveLink__Delegate__OnReceiveLink__DelegatePendingHealBonusLight Interaction we1_framesBBulletImpact1ScorersEMapPreferenceTemporaryStartCoreHorn07 TeamUseTime electricity1ShockExplosionCoreBClientHasFlagNewControllerMOBJ_HellBender bBlocked PointRegion OwnerPRIDistanceFogEndOldRotSetStaticMesh GrenadeTest HornIndex ViewTarget SoundNum projStartDeaths bNewTeam NumLivesTraceThisActor FlipTimeLeftFreelanceSquad WeaponLocker bKeyVehicle CharactersKGetRigidBodyState TankStop01ShadowCullDistanceGRADIENT_Fadenewdisthand RandRangeLeaderBBulletImpact7HoverBikeTurbo01NewDir VehicleZCamViewOffsetWorld ShakeRotoldDir bPainCausing ShockBeamTexCustomRadarRangeCurrentInterpCurveEvalbThisClassOnlyMutatorClassName bTearOffPRIF OldLocationbDoHit HUDContent bDistanceFog bIsPlayerbAdrenalineEnabled RouteGoal LargeFlames LastSeenTime RouteCacheMaxDist NextFireTimeRocketShellTex bBehindView MoveTimer MoveTarget PRVprojectorFireDirbViewingMatineeCinematic crowd_cheerratingVehicleExplosion01CrosshairPack EffectNameFirePropertiesImageprvTAGSCRIPTEDGUIControllerYAxisVehicleSpawnShaderBlue BeamEmitter2BBulletImpact11StartLocationSavedFirePropertiesBaseShieldReflectionsrocketblastmarkDoubleClickMovePlayOwnedSoundnewPRVredSHAD RVprojectorcoreLightning1shock_flare_a AttachedTrailEmitter0 TankColorRED BeamBolt1aHornsbaseGunEffectcopyLGRreticleRed RVgunGroup PRVcolorBlue RVnewGUNtexColor1 PanDirectionPanRate RVcolorBlueTrackedVehicleIcon bEjectDriver TankEng01 SpiderMines PowerBeamVehicleExplosion04ShockImpactRing HotBolt03awtankBarrelAlignedTargetCycle01EnergyEffectMASKtexHorn06Beacon Veh_Debris2 HumanShip HellB_Ring SmokePanels2PlasmaHeadDesatONSMuzzleFlashAssaultSounds NewThreatbThreatVisibleCenter DamageAmount BeamEmitter3 AttackSquadbEnableGUIForceFeedback PRVFire04 bio_flashSuspensionMaxRenderTravelWeaponShadersAggressivenessHoverBikeJump05 Veh_Debris1SpiderMineFire01 JumpDuck PRVStart01AvrilReload01RaptorColorRed PRVcolorRED RVbladesOrderIDBBulletImpact3myHUDHintsNextSquadMember TankNoColorShing1 HitFlameBigShockImpactRingB ElecPanelsPVehicleDamageTypebCancel BuildEffect NapalmSpot BioRifleGoo1BBulletImpact8BBulletImpact6 Projectiles HitEffectsPC_buildBorderNewAVRiLHoverBikeStart01ONS AirBlastPPC_buildStreaksTank TankFire01 PRVEng01 PRVFire02PwrNodeActive01PwrNodeNOTActive01HoverBikeFire01TankMachineGun01RVBladeBreakOff whooshthunk ShieldHitLa_Cucharacha_HornHoverBikeEng02Horn02 Hydraulics buildEffectsReflectionTextureSpriteEmitter18VMExp2_framesANIM WeaponEntryNoEntryAW-2004Explosions Objective SprayFire1 BeamHitFinal NodeHealRingpowerNodeEXPredTEXEnergy DrawTile OwnerBase ScaleFactor EndEffect MuzzleSpray bHitWater TextSize DrawText MeshEmitter6SetSizeHudBaseHudCTeamDeathMatch BarHeight DigitTexture RevisionFallbackMaterial DigitsBigBBulletReflect4 SparkHead DamRanOver BlackColorhoverCraftREDMineLayerReticleTacticscoreLightningNone KMaxSpeed MaxAirSpeedMaxGroundSpeedbSwapSidesAfterResetNonebCannotBeBasedNoneNoneNoneNoneEvents bCanHover WaterDamageVehicleDrowningDamTypeHasSuperWeaponValidateSpawnLocationbRepulseWaterbHasBeenAwakebDriverCannotLeaveVehicleCurrentPlayerIcon bIsAwakeRedActivationEventNameBlueActivationEventName NetPriorityDrownedbNeverActivate SuperWeapDestroyedEventNameNone CallDestroyDeadUse ShowMenubVehicleOnGround BulletSplashFluidSurfaceInfo bTraceWater bDemoOwnerbSidesAreSwitchedNoneNoneDamagedEffectFireDamagePerSecDamagedEffectAccruedDamageNoneNoneApplyFireImpulseONSLinkableWeapon PossessedBybHasAltFireImpulse FireImpulsebHasFireImpulseAltFireImpulse ChildWeaponbAltAIFocusbCustomAiming CustomAimNone VerifyLockOverrideTargetNone JustStartedImportantVehicleShouldTargetMissile FastVehicleDoRangedAttackOn TooClose StandGuardIsFastFreelanceObjectiveLegitimateTargetOf IsArtillery AlphaRefRotateVelocityLossRange RateCore&OverrideCheckSpecialVehicleObjectivesAlternateTargetbCanDoTrickJumps IsDeployedWeaponCeaseFireCoreAvailabilityScoreProjectilePostRender2DFindFastFreelanceObjectiveNewReservationCostMultiplier MayUndeployDeploy JumpOutCheckbShowAimCrosshairSPMAAcquiredString CameraDeployONSMortarCameraFindInventoryGoalIncomingMissileGetTargetLocationUseMaxCollisions PushForce AddMutatorChangedReservationbLiberalVehiclePaths StuntDegrees MoveReticlebScriptPostRenderMaxCollisions SetEnemy ShootMissile NeedWeaponBotEnteredVehicle PostRender2DAvrilLockOnString BlocksShotAtFindBestPathToward SwitchBotsbAllNodesTaken ScreenLocXrow NewScore CoreDistA LockTrace CameraSpeedbAltFocalPoint BestScoreKarmaBoostDest ShootTarget SquadMateSparkCloud_01awOPC CoreDistB SmokePuff01 PathList texturesLastJumpOutCheckbRepulsorOnWater BenTex01 ONSNewTank-AAltFocalPointSpriteEmitter265bPlayersVsBots ResultStringLastCameraCalcTime bOverWaterDirectionHint RotateSoundEnemies LastAttacker OffsetVectorWaterDustColor ScreenLocYbBlockProjectiles ReachSpec bBotLockPart_explode2DesiredTPCamDistancecolUpsideDownDamageGameDifficultyNoneNoneNoneNoneRotateSoundThresholdNoneNonexp;jNS -9:9:$GB7ZG / EG /ن3}3}WSF3}3}3},e,e3}Zs,e3}Zs,e3}WSFhh3}hhhhhh||}L|}L||h|h|||h||h|h|3}3},e,eh|\fF,e|,e|\fF|\fF'|\fF'||\fF||h|||}L|h|h||nwwg|\fF|||h|ʁ)||nwwg|||zVGBJ||}L|h|}L||||h||zVGBJ|3}|||| 堅| 堅3}| 堅|\fF||||}L|h||hhh u3}ZsJJ)M)M}L|\fF)M)M)M}L)M}L)M}L|\fF)MoUKoUKoUKu'u'KÆ3}3}KÓDIIcyʁ))Mʁ)q}oBq}oBʁ)1J1J1J3}DIIcy)M}L)M}L)M}Lʁ)q}oBʁ))Mʁ)1J1J1J3}3} u3}|\fF'3}KÆ3}3}3}KÓܓܓܓDIIcyDIIcy3}DIIcyDIIcyDIIcyDIIcyDIIcy܆3}3} u uzVGB uzVGB uKÓܓܕW=G /G /G /ن3}c*Me %,e3},e,eOR3}3}c*Me %3}Zs3}Zsphhphh,e,e3},e3}3}3}- =1'y3}3},e u uh,e3}Zs3}WSF3}WSFG /G /G /G /G /ن3}Zs3}ZsG /ن3}ɢG /G /G /ɢʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)G /كʁ)G /G /ن3}3}3}3}3}3}3}3}3}3}3}3}3}3} C EGKF[D$A@-F+z,y,{%w,v,u,Y jV,Y|Y{YzYW__[$@`$A["C"]red_powercore_destroyedC"blue_powercore_destroyedC"&%red_constructing_powercore_destroyedC"'&blue_constructing_powercore_destroyedL#]red_powercore_constructedL#blue_powercore_constructedZDt+X"^(SR(S^ i " Q ^= PowerCore:7^SgX*Ty$C;$Bj$CKL@ n'dc*@>@>G@@>ce]KdfV--9:9:$-9:9:$9:9:$9:9:$GB Y7 M[U3}3}3}3}3}3}3}3}3}Re7 堅3}3}3}3}3}3}3}_ ._ ._ ._ ._ ._ ._ ._ ._ ._ . 堅 堅 堅,eRe7Re7ҽҽҽҽҽҽҽډډ u3} uʁ)ʁ)ҽ u u 堅hh|Re73}t#kt#kt#kt#kt#k3}E$OUE$OUE$OUE$OUE$OUE$OUp%Ņp%Ņp%Ņp%ŅȆ3}3} u uʁ) u3}3}ʁ)3}3}Re7 堅3}t#kE$OURe7Re7Re7Re7h 堅 堅 堅 堅 堅 堅 堅 堅Re7C۩3}3},e,e,e,eRe7Re7Re7Re7 堅 堅3}Re73}t#kRe7Re7Re7 堅3}t#kE$OUp%Ņk+23}3}Zs,e3}Zs,eh,e,e,e,ehhhhh3}Zs,e,e u 堅 堅 堅(TRe7Re7 u u u u u 堅 堅 堅 堅 堅 堅3}hhhh3}(T(TRe7Re7(T(T3}3}hRe7Re7Re7Re7hRe7̋,e,ehRe7,e̋,eh,eh,eRe7Re7Re73}Re7hRe7̆3}hRe7hh 堅h| 堅hh 堅 堅 堅h 堅 堅 堅h 堅 堅Re7Re7Re7Re7 堅 堅 堅 堅3}3}3}3}3}3}t#kt#kt#kt#kt#k3}3}E$OUE$OUE$OUE$OUE$OUҽҽҽҽҽҽRe73}Zsh|||hh 堅,eh 堅|||||||||3}Zs|h,ehh3}Zs||hh||||3}Zsh|||hhhhRe7Re7Re7Re7Re7Re7Re7ʁ) 堅 堅Re7ʁ)Re7Re7 堅 堅 6B"q%$BQ#$H\"Z$HB$HB@>`)$=a)Y b)$@c)$HCi)$Bj)$Ck)$`jGl)P7m)]8n)p%N#$?q)$?r)$>s)$>I<$@?y){)[ : zCU : @Eo $@X : Al : HCm $ AW $ Ak $@En $RI9T YD*k+F*$?A- P*$Ga?A *h$Bg$BI\S@pi`$ fdCcOaYzo)j'Y#m;$Cn;`&`&t$Zm&%t$$B$BA$Bc$S@>Nt&Ss Sy$HCn $D@>ar%*p>- -9:9:$-9:9:$GDRe7ʁ) 堅 堅 堅ʁ)ʁ)}L}Lh}Lhʁ)̃ʁ)ʁ)3} 堅 堅 堅ʁ)ʁ)}L}Lh}Lhʁ)ܓZ$,Ɔ3}Z$,Ɩȵȵ 堅 堅 堅ȵʁ)ʁ)ȵȵh3}h uʁ) I.3}3}ʁ)ʁ)ʁ)bQ 3}Z$,ƉhhZehZeȵhhʁ)h,eȵʁ)ȵʁ)ʁ)ʁ)ʁ)ʁ)hh,ehhh,ehhhh3}3}Z$,Ɖh u uh u uZ$,Ɖh u- =1- =13}ܓܓZ$,Z$,Ɗ}L3}3}- =13}- =1ҽҽҽҽ L$GM"L"`r$@?yv<a'q$?y$ C['$CZ'$?U'$ CS'$C~=$HBv&$?uY"I"z$@F\ $?j!Zg!+l!Sk!Sm!Si!Sh!Se$DM $f!$fff?@>j!g!+l!Sk!Sm!Si!Sh!Se$DM $f!$fff?@>:gG my'$@Ty$Bh Sg SR,@>@>D@@>y @|Je6Xc# Y u u uORe#J8e#J8e#J8e#J8G /G /G /вввzVGBo>+3}G /ً,eORORG /G /G /ّ uhG /ّ uhG /ّ u uho>+j6,e,ezVGB,ezVGBJ,e,eOR,eOR,eOR||\fF|\fF|\fFG /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /ً,e,eG /G /G /ً,eG /ً,eG /ً,ehG /ً,e,eORzVGBJʁ)3},e uzVGB uzVGB- =1 u u u u uʑ uzVGB- =1,e,eo>+''''3}G /ٲ''3}G /ن3},e u u u u,e,e3}G /G /G /ن3}G /G /G /G /G /G /G /G /G /G /G /ن3},e,e,eh,eh,e3},e u,e3},e u,e,eʁ)ʁ)ʁ)ʁ)G /G /G /G /G /G /G /G /G /G /G /ن3},e,e,ezVGB,e- =13}- =1- =1zVGB- =1- =1ORG /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /Px[m1>Pxϑ u[m1>[m1> u uPxϑ u[m1>[m1>[m1>[m1>G /G /[m1>G /G /[m1> u[m1>[m1>[m1>G /G /[m1>G /G /[m1> uG /- =1- =1ORORe#J8PxPxG /PxG /Pxϑ u[m1>[m1>G /[m1>G /[m1> u- =1- =1zVGB- =1- =1OR u uPx[m1>3}ɢɢq}oBɢG /G /G /G /ɢ[m1>_ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ ._ .3},e|,e,ezVGB uzVGB,ezVGB|,ezVGB,e {C lpEGKFX "d;] ]Core Drain in Overtime] Random Link Setup After Reset] Teams Swap Sides After Reset^ ]KIIn overtime, PowerCores lose a maximum of this much health every second.^ ;:After a reset, a new link setup will be chosen at random.^ mkAfter a reset, teams will switch sides so they are defending the PowerCore they were previously attacking.T'i" HIf you receive a missile lock warning, try to get out of sight quickly!MThe Raptor's missiles will automatically lock onto Mantas and other Raptors.BIn the Raptor press %JUMP% to fly higher and %DUCK% to fly lower.UThe Manta can rapidly descend to smash your enemies by pressing %DUCK% or %ALTFIRE%.FPress %JUMP% to perform a 180 spin out in the Hellbender or Scorpion.You can heal a friendly PowerNode with the link gun alt-fire.IIt is impossible to heal the final PowerCore, so defend it at all costs!;Press %TOGGLERADARMAP% to toggle the radar map on and off.:You can be hurt or killed by vehicles exploding near you.[Enemy Spider Mines can be destroyed, but some weapons are better against them than others.ZPressing %USE% on a PowerNode allows you to teleport to any PowerNode your team controls._You won't be able to spawn at a PowerNode that is under attack, even if your team controls it.AIf you die, any Spider Mines or Grenades you fired will explode.0Press %VOICETALK% to voice chat with your team.U%BASEPATH 0% will show the way to the nearest PowerNode or PowerCore the Red Team can attack, while %BASEPATH 1% will do the same for the Blue Team.PPress %TOGGLEBEHINDVIEW% to switch between 1st and 3rd person mode in vehicles.aAVRiL rockets will home into an occupied enemy vehicle as long as you keep your crosshair on it.aWhen you find a target with the AVRiL, press alt-fire to zoom and lock your view to that target.hThe green light on top of the weaponlockers indicates that additional ammo is available at that locker.GAttack PowerNodes that have the enemy team color sky beams above them.RYou cannot attack the PowerCore or PowerNodes if there is an energy shield present. Remove the shield by controlling a node that is linked to it.fThe Grenade Launcher shoots sticky grenades that attach themselves to vehicles and players. You must detonate them yourself with the alternate fire (press %ALTFIRE%)LThe bomber that the Target Painter calls in can be shot down by enemy fire.jIn Onslaught, your team earns 2 points for winning before overtime and 1 point for a win during overtime.ASBer er w"|L+]XGame.xTeamRosterN+$@{] GUI2K4.UT2K4OnslaughtLoginMenuB*A=(] GUI2K4.UT2K4OnslaughtLoginMenua+]GUI2K4.CustomHUDMenuOnslaughtC ]Onslaught.ONSHUDOnslaughtB ]Onslaught.ONSMapListOnslaughtA ]ONS@ ]ONSF" Z "w ]Onslaught.ONSDefaultMut\ ] Onslaught`meYour team must take control over PowerNodes in a 'connect the dots' fashion to establish a direct line to the enemy PowerCore. Once you establish a link to the next PowerNode, you can destroy it if controlled by the enemy. Control the PowerNode for your team by touching it to start the build process (Use the linkgun alt-fire to speed things up). Once your team has a link to the enemy PowerCore, attack and destroy it.n ]! UT2004Thumbnails.OnslaughtShotsv ]Onslaught.ONSOnslaughtGameI ]ONS@>@>@>_xLg9)9:9:$9:9:$GB Y6 E 堅}LRe7Re7Re7Re7Re7Re7ҽҽҽҽҽҽҽډډ u3} uʁ)ʁ)ҽ u uRe7h 堅 堅 堅 堅 堅 堅 堅hh3}3}Zs,e3}Zs,eh,e,e u u,e,e3}Zs,e uRe7hRe7hRe7Re7hhRe7Re7hhhhhhhRe7Re7hRe7Re7 uhRe7̋,e,ehRe7,e̋,eh,eh|Re7Re7Re7Re7Re7Re7Re7hhhRe7̆3},ehRe7Re7hhRe7Re7Re7Re7Re73}Re7Re7Re7 u u u u3}Re7Re7Re7ҽҽҽҽҽҽRe7ҽRe7Re7Re7Re7Re7Re7ʁ)Re7ʁ)Re7Re7 6J B"A *h$Bg$BIH'Sf``t\SR$Sz!$HBBsrNqt&Sbz :N SgA x;$?JSKSLSNSh Sg Sd@>@>`1@>@>J  @>@>x@>@>G @> yzCh 3-9:9:$9:9:$9:9:$G6EOR B,3}Zs3}Zs3} u3}3}c#3}3}c#3}c#3}c#3}c#3}c# u3}c#3}3}c#3}c#3}c#Pxφ3}c#3}c#[m1>3}c#3}c#c#e#J8c#e#J83}3}c#3}c#3}Zs- =1- =1zVGB- =1- =1OR3}3}c#3}c#3}Zs- =1- =1zVGB- =1- =1OR3}c#c#e#J8c#e#J83} u u uu*F uu*F Z u uh u u uʁ) u u u,eh3}Zs,ehɢ,eɢ,e,e̋,ehJ,eh3}c#J,e,eh,eh,ehʁ),eh~)W@>Y#@@>`@>g@@>uKLo$--9:9:$G6ORqbqYԉh,eh,eʁ)G /DIIcyh,eG /G /nwwgh,eh||hhh||hhh _ _hhh|||\fF|\fFؚ|\fF|\fFؚ|\fF'|\fF E|\fF E|hh||h|hqYԢȵȵKiҽҽҽu)ҽҽҽҽҽҽҽҽҽ 6|$>@"E%*} }H3qav#$@u#$@F.$>M&$33>o n]SwitchToFlakCannonm$ ?l$ ?`]UThe Spider Mine Layer is used for deploying spider mines, autonomous mobile mines that are highly effective against both foot soldiers and vehicles.k: BBj$4BH$i*h: B.B"g"n#]"!ONSInterface-TX.MineLayerReticleA@@I~: BBj$ @}L|Zpq"r"s"(t"3@>z= Mine Layer)X@@>@>A @>qOc [m1>@E @>xbJ$--9:9:$G6/lGZqYԉh||hhh||hhKi3}n!vˉh|||ʁ)|h|hh||h|hqYn!vn!v˔ҽҽҽu)ҽҽҽҽҽҽҽҽҽ 6{"E%*}o}wqav#$ffF@u#$333@o n]SwitchToFlakCannonm$ ?l$ ?`]ljThe MGG Grenade Launcher fires magnetic sticky grenades, which will attach to enemy players and vehicles.k: BBj$4BH$ i*h: &C@BXg"n#]('ONSInterface-TX.grenadeLauncherReticleA@@f~: C B8j$ @}r|Zpq"r"s"t"$@>z]Grenade Launcher)X@@>@>@@>a@>K@>@>Q#@@>qbJY@)M(T3}Zs}Lhh u3}3}c#3}c#}L}L}L3}Zsؚؚ3}3}}L3}}L p $pAn*$@R"c#P"c#:@>@>}'@>pWb Pxσʁ) t] Default^]"mY#Sh Sg S@>@>i@>@>*@> ~A:vB Y7/1J 堅3}3}3}3}Re7Re7,e3}Re73}܆3}3}Zs,e3}Zs,eh,e,e,e,ehhhhh3}Zs,e u u u uhh3}3}- =1Re73}- =1Re7 6p $AjRy-B"SD@*S}R cY=HBCHBHBHCHBHHBA]manning a turretD]Energy Turreti`$ f:^]"SJLNh g @ dS@>r Gl$--9:9:$G6Q ٵqYԉh||hhh||ʁ)||h|h|hhKiҽҽҽҽҽҽҽډډ}L3}Zs}LhzVGBJh3}3}hh _}Lh,e}L}Lhh}Lhh,e}Lh}Lhhhhhh,ehhh3}Zs}L}Lʁ)ʁ)hh _}L}Lhh u}L 6S  xyi*$L>z$`jFi$~?A *h$Bg$BI}o}H qav#$@u#$?M&$ff>o n]SwitchToFlakCannonm$ ?l$ ?`]^\The AVRiL, or Anti-Vehicle Rocket Launcher, shoots homing missiles that pack quite a punch.k: BBj$4BH$i*h: B.B"] "|g"j *n#]#"ONSInterface-TX.avrilRETICLEtrackB($A@@n~: BBj$ @}x|Zpq"r"s"t"@>z]AVRiL)X@@>@>D&@@>P@>@>@>E@>)@><@>@>p)@>o~;a B71&'H"G /ُ||}L)on|h|h||||||)on|h||||)on)on)on)on†3}3})on)on†3})on)on)on)on†3})on)on)on)on)on)on)on)on–JJ C EGKF[u]Neutral PowerNodev] Constructing PowerNode{%jSY|Y{YzYQ["C"]red_powernode_destroyedC"blue_powernode_destroyedC"&%red_constructing_powernode_destroyedC"'&blue_constructing_powernode_destroyedL#]red_powernode_constructedL#blue_powernode_constructedZ] v+: \CX"e$?v(: C^i "^= PowerNode`+S7/$@z : A;$ Cj$Ac*S@>Zx P .'#Re7hZ$,Ƣȵȵhh}Lhh,e-+fh|88-+f}Lh||||3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} ZA'$l?}H ~~ M"@L"$o] xc-"`~"a b q$>D$@?_ _3cz&U ] PRVSideFire{&MPRVSideAltFireuwY"I"h-[ : pBAU : zDzDo $@j!Zg!+l!Sk!Sm!i!Sh!Se$DM $L>f!$?@>j!g!+l!Sk!Sm!Si!h!Se$DM $f!$@>`!$E)/$L?@>@>r@>lf!p)onƒʁ)&'H"3} u uh&'H"&'H"3}3}3}3}3} j$?Y |Y {Y zY :^gm);$Bj$BJKLNf @>@>`@>@>F @>Fb?u #$-+f$Re7Re7Re7Re7Re7ȵRe7Re7ȵȵ88ȵȵȵȵh 堅hhh 堅Re7hh 堅Re73}ܓRe7Re73} i OS$@ET$>Zo%_$@D^w\$mDb$mDU$Az$PFt}:/$ff?m;$Aj$A@>@>t3 @>@>Q&@> ABl 20 x@ u u3}G /G /ّ u3} u u uzVGB uzVGBJ u X lpEGKFN ]Red Team Achieves Victory!M ]Blue Team Achieves Victory!L ]! Red Team PowerNode Constructed!K ]"!Blue Team PowerNode Constructed!I ]Vehicle is Locked!H ]/.You Are Unable To Damage Unlinked PowerNodes!F ]/.You Are Unable To Obtain Unlinked PowerNodes!D ]%$Red Team PowerCore is under Attack!C ]&%Blue Team PowerCore is under Attack!B ]%$Red Team PowerNode is under Attack!@ ]&%Blue Team PowerNode is under Attack!~']+*You are in the way of a vehicle spawning!~ ]Missile Lock-On!} ]Turret is Unpowered!| ]Red PowerCore Destroyedz ]Blue PowerCore Destroyedy ]Red PowerNode Destroyedx ]Blue PowerNode DestroyedE(]Red PowerCore is Critical!F(]Blue PowerCore is Critical!G(]'&Press Use to teleport to another nodeH(]Red PowerCore is Vulnerable!I(]Blue PowerCore is Vulnerable!J(]#"Red PowerNode under Construction!K(]$#Blue PowerNode under Construction!L(]Red PowerCore is at 50%!M(]Blue PowerCore is at 50%!N(]Red PowerNode Isolated!O(]Blue PowerNode Isolated!P(]PowerCores are draining!Q(] You can't heal your PowerCore!K=] Incoming Heat-Seeking Missile!x<]"!Press Alt-Fire to deploy camera!C=]'&Use Forward and Strafe to Aim Reticlew<]SPMA AcquiredUsU{UvUUwU~UR&Uy%UW&UA%U~$UU&Uk&UQ%Uu%Us$w { *i,*`S]Z"YW$=@>@>. @>@>u@>&@>p@>@>|@>@>@>@>|@>@>p@>s@>T@>@>P@>@>p@@>K@>S@>@>z&@>@>@@>@>f@>@>G@>@>@>@>}@>@>@>@>X&@>@>/@>@>z@>@>@@@>o!@>@>@>Z@>Z$@>E)@>@>V@>@>T'@>@>N @>@>_@>@>c@>zi@o*Z }?ȵ܊}Lʁ)3} Ar \$Eb$EU$Ba$pCz$zEe:R$?Xdm@>@>R'v?m^9:9:$v%Zv7Pwv*vavv%v7wv*vava7%7%N9:9:$v%v7g#vg#av7g#%ws#*s#a7wx%*x%ax%*Nw\-*\-aK* G@>n "XT5.9:9:$"%"7k"a6V"k ""6T"k"-[ " e ""9:Q#7 9:Q#d, 9:Q#e,"%"7g"a6F"g "Z 6B"g"-B'""""9:9:$9:9:$ wC/*\-aC/ 9:9:$---9:9:$7g#7Y)"%s"7Y)"g#a t# a"Y)"g#a*"g#"%"g#C'"g# @$"g# |. "w|%*9:9:$s#a E$ ay.s#a*s# w.s#|%s# v.s#Dq G@>I @>@>t-@>@>W@>@>W@>@>v @>@>C@>K@>@vP!DfAxa-9:9:$-9:9:$-G(-9:9:$ -G(G2#k5fȵʁ)ʁ)hhh3}bQ hhhh,ehh _hh,eh,ehh}L}L1Jhʁ)ʁ)hʁ)ʁ)Rqbh ]$?a^$@DA($33@@("\$HDb$HDp$U$Ba$zCz$PCGtRt`!$E[SC oR$)/$L>z : 9XPB+zTy$B;$ Aj$ A@ d c W:] N@>@>{jdF~ 2mqFݖu) u u lpEGKFu ] Successfully saved Link Setup.t ]! Successfully loaded Link Setup.s ]+*You can't overwrite official Link Setups!r ]B@Failed to load Link Setup because no setup of that name exists.q ]"!Successfully deleted Link Setup.o ]('You can't delete official Link Setups!m ]DBFailed to delete Link Setup because no setup of that name exists.g(]PNCannot save Link Setup: There must be a complete path between the PowerCores.h(]][Failed to load Link Setup because it does not have a complete path between the PowerCores.cS@>tEAnh-9:9:$G*n!vˢȵBʁ)B3}3}3}3}3} u uʁ)3}ʁ)ʁ)3}܆3}3} u uʁ)bQ hBlGZ S$?u$L?A\$Db$Dp$G U$Ba$/Cz$PCGtTtef*:7`!$@E[S|oR$/$=Xdz;$?j$?N'd D]:]." @>@>N@>@>B@>@>z@>@>| @>@>@>@>[* @>@>@>@>J@>@>w@>@>j@>@>_@>@>V@>@>s @>@>c@>@>@>@>@>@>j.@@>L@>@>rkMd DIIcyʁ)G /كʁ)ʁ)ȵȵʁ)ʁ)ʁ)hʁ)h3} u u3} f'b':7^]"N Sgm~: @@?z : zY#S;$WCj$>CNf @>@>c'@>@>E@>@>@>@>@>@>{ @>@>t@>@>@>@>j&@>@>N@>@>@>@>j@v@>U@@>n@>G@>@>] @>@>u@>@>e@>@>e @>%@>a@>@>V  @>%@>b@>@>@>@>o@>@>X  @>@>@>@>]@> @>\  @>%@>@>@>g@@>@>Z @>@>8@>@>@>@>@@>@>I2@>@>x@@>@>i@>@>u@>@>]@>@>a@>@>@@>@>@>@>@>@>J5@>-@>@>@>a @>@>~ @>@>s @>@>H@>@>[@>@>@@>b@>@>@>M@>E S@KÓ 8YM"N"5S@>@>@>@>@>@>d  @>;@>@>@>@>@>M@>@>{@@>@>R@@>@>p@>@>@>@>s@>@>[*@>b@>@>@-@>@>H @>@>@>@>X@>@>r@>@>u.@@>@>@>F nw@il;V2"2"2"W=W=W=2"W=W=W=W=W=W=W=W=W=W=W= C"FA"Fx 8YK"L"`!$@E5SzT(@>@>JS@>@>@>a@>@>u  @>@>W @@>{@>h@0V@>}@>@>f@>@>K@>@>@>~$@>@>@>r@>@>@>@>L@>@>\ *@>|@>@>$@>@>[3@>@>@>-@>D @>@>e&@>@>@>@>@>@>X7@>@>g@@>@>c@>@>a@@>c@>R  @>@>C@>bc } 'Z2;2Re73}3}3}~$~(~$~(~$~(~$~(~$hhʁ)ʁ)3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} Z~$ZX }{~|M":L"oBxBQ$As$B"`Lq$>cU ] Laser01u{Y"I"z$@F\ $PCGj!Zg!+l!Sk!Sm!Si!h!Se$MDM $f!$fff?@>) ;$HBj$B@>@>c@>@>D5@pM@>|@>@>@>`@:{ B Y6a9B1JRe7Re7 6NZO$B^: H@Bz!$/CO: A\$CG: H\C{$J.J3P-: pB`($4B["$CI"7) c*@>@>_@>@>C@>@>q f@>g@>@>@>@>J$@>@>v@>@>kJ@>@>V @@>@>e@>@>M @@>z@>@>n@>3@>@>@>@>@>{SZM -9:9:$GB Y6?sg4{R~f3}Zsȵȵ3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}ʁ)ʁ)ʁ)hʁ)ʁ)ʁ)hhʁ),e 6{,|,},~,] RVBladeOpen,] RVBladeClosem$$B$?@>$HC$fff?@>$P$fff?@>@>q$o:rZf?eY9$$@>$A$t<@>$4B$@>$P$@>@>t$̌?v$̬?w$ #<|$=}$pAu$$pA~$<$>A$@q Zf1eY+$$A@>$D$0A@>$(knN$0A@>@>GZf?eY9$$A@>$HC$ A@>$D$0A@>$/E$@>@>v$v>vff&?vY?v̌?C$>D$DE$zDF$?G$8J$=C$AE$ Ce$ B[$BF$HCN$=S$CT$ Fg_UV$BW$zE^$V#: A@V# @a$M$$4CL$$?|$$AN%\%a%$ Bb%$\Bc%$ Bf%$ Bh%$ BaY C]4lE @>B"SabE^ [ g"] RVStartUph"jt,i"o5Q#$j"Z$PCH$|H@>\"Z$B$C@>n": pB A An $o:z"YBA@B@J#I#$BV%T%: B@S%:]R%$>sY q!r!s!t!G$`@fl<tm$k$^: @BcY1%B%CB%%Cz!$ CO: pAA\$Ca(] SpringONSSRVG: H": B{$L?A]in a ScorpionD] Scorpiond6c@7^$>w#$Dt"YY"$kD["$CI",r,) T;$Bj$ BXp!@>@>C@@>@>@>@>E @>@>@>@>p@@>@>@>@>@>@>@>@>F^ @>@>@>x@>@>]@>@>d@>D@>|@>@>j@>@>T@@>j@>p @>@>@>@>n@>@>@>@>q&@>@>c@>@>@>@>T@>@>@>@>\@>@>W@>@>@>@>@>@>k'@>@>J@>@>I@>@>@>@>Y@>@>G@>@>b @>@>@>@>H@>@>M@>@>@>@>B?^a} h G@>@>@>O @>@>n@>@>G @>@>m@>@>^@>@>C *@>V@>@>@>@>^@>@> bOUVC9:Q#79:Q#-i(9:Q#*Uw**owR *aR $?-A6 w*< @Eb$ -F)9?,F)9?,  G@>g'@>@>@>[yJ l9:9:$-9:9:$--e*9:9:$--r39:9:$GB Y7 V{R~f3} u u u8f2" u uu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽډډҽҽҽҽҽҽҽډډ{R~f{R~f,eʁ) u3}il;VC$ vC$ vԆ3}2"2"il;Vil;V3}C$ vC$ vC$ vԆ3}il;VC$ v2"2"2"2"2"2"2"2"2"2"2"2"2"2"3}C$ vC$ vC$ vC$ vC$ vԆ3}il;VC$ vC$ v_ .3} 6|*"H$333@E$HBM$$Bc+$Cd+$CL$$?|$$Ag+O5o+u+$PCHw+$`FC'$?z+]HoverBikeJump{${+$̌>|+$shq?}+$C >~+$xi=+$ #<@,*A,*dB,I,$=J,$;D}*A+"b("Y}@>@>@>@>l @>@>@>@>r@>@>U?J~zKF)9?&JP7%9:Q#-i'fwP *P wQ *aQ $?w.*l~%~7~=_.. (~-(~%~7`r~*A~&~~AA$~~~) G@>N@>@>Z@>@>@>@>p @>@>d1*@>@>@>I'@>@>@>@>C*@>@>q@>@>F @>@>g@>@>C/@dp@>X,@>@>Q@>@>c&@>@>Z@>@>a @>@>`@>@>d@>@>`@>@>@>@>@>@>~ @>@>@[ s@>N@>@>b'@> @>@>@>@[ v@>t@>@>@>@>@>@>CL@>@>@>@>A @>@>|@>@>m@>@>w@>@>@1 @>@>K @>@>g @>@>x @>@>@>@>@>@>}@>@>@>@>G @>@>F @>@>@>@>C @>@>I@>@>j1@>@>N@>@>W@>@>O@>dQ @RL= 8Y N#O#P#F9H9L#Y5S@>@>Q@>@>S@>@>@@>X@>@>@>b@>@>@>@>g@>@>R*@>@>K+@>@>L3@@>@>@>@>H@>@>@>@>@>@>M@>@>@>@>V@>@>E@>@>o@>@>A @>@> @>@>@>@>X6 @>@>y@>@>}@>@>}@>@>\*@>h*@>@>A@>@>X@>@>@>@>~@>_!O@>F@>@>P@>@>b@>@>o@>@>@>@>m@>@>L@>@>D)@>@>@>}Z9k @N9܆3} u u uʁ)W= 8Y X"Y"Z"["Y5S@>@>e@>@>o*@>_@>@>l@@>@>}*@>@>`  @>@>@>@>R@>@>X@>@>@>@>@>@>v&*@> iY/XQ H--Y/--[/-!@>a((a-Y/-[/q G~ZPWL9:9:$GB Y7 ]G#3}3}ffffff 6_ $ ף@>Y@>lS0^9:9:$GB Y7 _^sfffffff 6`l;R$S@>@>x/T~oMTOw*---( -i'-B' r* w.*l =_.. (}* 6}*s!6}*a+}*-(w * @  A GY @M1]9:9:$GB Y7  as||G /ُ|||h||h 6~<$PG`R$Sp-w-SY"$D@>@>B'@@>@>u@@>k!V2dWU1'i C C [] %k blew %o away with an AVRiL.^]#"%o pointed her gun the wrong way._]#"%o pointed his gun the wrong way.u!_$?@>@>@>@>h@>@>@>@>y@>@>Z#@>@>u@>j!U2lG C _g.[]#"%o was punctured by %k's minigun.^]#"%o turned the minigun on herself._]#"%o turned the minigun on himself.D x,x : Dw $D_$Q>@>@>@>@>@>@>@>@>g@@>@>@@>@>\@>@>@>@>@>a!I3wԤG C _I []%k's laser shocked %o.^]%o used her laser on herself._]%o used his laser on himself.@>@>@>@>q@>@>|*@>@>dL@>@>@>@>@>@>B@>@>ljq tk&H CsKih u ٵ ٵ3}hh3} ٵh uh ٵ}Lʁ)hhh ٵ ٵh,eʁ)hh,e ٵ}Lhhh uh u ٵh W Sh$=@>@>s@@>~@>w@>@>u@>p j2L p\" y"s "@z|Zpq"r"'s"t"U@>z]Anti-vehicle Rockets@>@>N @>@>t@>@>A0@>@>O @>@>Q@@>@>@>@>z0@>@>6@>@>U @@>@>V@>h d@Y h 8Y nGoGpGqGY5S@>@>e@@>@>a@>@>W` J[-` ---` Cad b7vX9:9:$F$ G @>z@>f m9b@^ 0<[܆3} u uʁ)W= 8YE"F"G"5S@>@>@>@>@>@>@>@>h@>@>b @>@>c @>@>@>@>w8@>@>D.@@>@>h @@>@>@>@>I@>@>m @>@>k @>@>@>@>A`H7%-G ($9?&Z9:9:$i9:9:$9?&CN&K"CB$n! G@>U@>@>R@>@ O2t +\" y"2@s|Zpq"r"Ws"t"@>z] Grenades@>@>FM]0AVE1d9:9:$?9:%DJCC q!i-(CN&K"CB$n! G@>u XsIDX-(B89:9:$Cwi*iaZwC,*C,au9:%BAwC*C q!iaE8$@9:9:$CN&K"7%_%_7!X_!+Xa/!Y.X U nXa/!e.X.X-'Xa/!v.X-P'.X D.X_CB$n! G}L@x B~ 8Y G@HW"AHBHY5S@>@>q@>@>d@>@>_@>@> ~5o^)ir.o*w.o*oW9:.o"` TL G@>q@>@>U@>@>] nkHGZt( G@>Z+@>@>j@>@>D @>@>@>@>C@>@>a@>@>I @>@>J @>@>z@@>@>L @>@>@>@>@>@>Q d@>R d@>j/d@>M @>@>@>@>O@>@>X @>@>m@>@>R9GgByGG@>@>@>d@>@>] \Po59p9V: AltFire has been called outside of a state! G@>A(Zk 56p9V: Fire has been called outside of a state! G@>g@>@>\@>@>TP@>`*@>@>{@@>@>a P@>@>@>k @>@>f@>@>@>@>C@>@>gFY2>Fp KF9=,$$FaeKp I'%'I'7Kp FKF$$9=,F/appp-- Weapon: 9SI' - 9VI'Kp F@KI'YFp KI'PKp e GQt 2o \" y"s "@S|Zpq"r"s"t"@>zMParasite Mines@>@>K@>@>C-@>@>R *@>p$CDs& p$D.|%|7D|D W |D X |D Y | Z [  G @>u *@>D@>@>x @>@>}@>@>c@>@>z @>@>y @>@>E@>Afm  [=$0RqbqYԉhqYԉhqYԢȵRqbRqbRqbRqbRqbRqbȵRqbRqbRqbRqb i aCcEN h$̌?Go hk@>@>@>@>@>@>@>@>H$*@>t@>@>D @>@>W@>@>d@>@>E @>@>N@>@>`@>@>h @>@>Q*Z$@>c *@>W*@>@@>@>P*@>T x@>R7@@>@>t1@>@>a@>@>r1 @>@>A-*@>h,*@>I*@>@>[1@>@>H,@>@>5@>@>c1| L|E(-| 9:9:$ --[3'F%F7nFnJFM N F@-v'F%F,wFf#*Ff#-'FF%F,wFf#*Ff#i&ywF++ G@>@>Z$Pv9@ @j twZ$,ƕW=3}3}3} uʁ)W=W=W=W=W=W=W=W=W=W= 8Yo"p"`!$zE5S~: >>>y Sz@>@>U>@>@>@>@>@>@>@>@>u2fnJA\ 2Pr yؚG /G /G /G /ٲ'G /ٲ'ؚG /ؚٚ\fF\fFؚG /ؚٚG /ٲ'G /ٲ'G /G /G /ٲ'G /ٲ'|ؚؚ\fFؚؚi ZYؚ\fFؚG /ؚٚ'G /ٲ'ؚؚؚؚؚؚؚؚG /ؚٚ'G /ٲ'ؚؚؚؚؚؚؚؚG /G /ٲ'G /G /ٲ'G /ٲ'G /G /G /G /G /G /G /G /G /ؚٚG /ؚٚG /ؚؚٚG /ؚٚG /٘\fF\fF\fF'yؚG /G /ٲ'G /ٲ'ؚ\fF\fF\fF\fF\fF\fF\fFG /G /ٲ'G /G /ٲ'G /ٲ'G /٘\fF||||\fF\fFG /G /G /G /ٲ'G /ٲ'G /G /G /G /G /G /G /G /G /٘\fF\fF\fF\fF\fF\fF\fF|||||hhh|h|}L||\fF\fF\fF\fF\fF\fFG /٘\fFG /٘\fF\fF\fF'r G /ٲ''r G /ٲ'3}ZsG /ٲ'r G /٘\fF\fF3}ZsG /ٲ'r G /٘\fF\fF\fF\fF\fF\fFؚG /G /G /ٲ'ؚ C lpEGKFOi C}COC}C}@>@>@>@>r@>@>O0@>@>v @>@>w@>@>@@>~ @>B7@>mv <Q9:9:$GB Y7 | jffffff 6UV$ #@>|6c'> G@>y6@@>B @>E@>@>u6VE $ G@>@ @>@>Q(@>@>E @D@>@>J @>@>\@>@>L @>@>@>@>N  @>y @>P @>@>c@>@>r'@>j[R BR 6hh1J 堅 堅Re7 C 6@>@>u@>@>T @>@>M4 @>U @>~$lr9Y @ X L[v~$3} u u uʁ)W=W=W= u 8Y A#B#C#D#E#@>@>V  @>Y  @>GL@>@>a=f@>\ f@>Z  uAM_ @ _ )m܆3}3}3}3} u3} uʁ)W=W= 8YpM"@#qMrMsMtMY5S@>@>{ fb@>ef@>a fv` @c cޟ 8Y JIKI{"|"x"w"y"z"LIMIY5SX@>@>L0Y@>S@ @>M@@>@>f @@>@>e  CXCp 2\i ZY\fF\fF\fF3}hG /G /ىh'r G /ىhG /ىhG /ٲ'r G /ُ|hh|h|hqYG /G /ُ||'r G /ُ||||'r 'yG /ٲ''y|G /ٲ'|ؚ||(T(T}L'r G /G /ٲ''y\fF\fF\fFؚ|h}L}L||}L'}L}L|G /ُ|h|h|h}LG /1J}L}L|3}Zs||'y'y3}3} uzVGB3}WSF'y\fF|||||hؚ||hؚ|||||||ؚ'G /ُ|h||||h||||||h||'yؚG /ٲ'G /ٲ'G /ُ|h||ؚ3}Zs}L}L}L}L}L}L,e|h||}L|hؚ|}L|h||h||h|||||G /ٲ'||}L||||ؚ|h|}Lؚ||}L|hؚ|}L|3}||}L||ؚ|h|}L|G /ُ||3}||hؚG /G /ُ|h|hqYԏ|h|hqYG /ُ|||hؚG /G /ُ|hؚ|||3}|G /ُ|||hؚ|||OR||G /ٲ''yؚ|3}c#'G /ٲ'ؚ|OR3}G /ُ|G /G /ٲ'G /ُ|h||||||||h|&'H"G /ٲ'|||hʁ)|hʁ)|}L||}L||ʁ)}L|}L|}Las}L}L|h||h|||}L||hʁ)|ʁ)|h|}L|hʁ)|}L3}|||||}L|||}L|||h|}L|}L|}L3}|ʁ)|h|}LhؚG /ٲ'G /G /ُ||G /ٲ'G /G /ُ|G /ُ|hG /ؚٚ3} C lpEGKF-$E."K+@>@>h @ @>k @>@>j  @>o *@>p *@>Q@>@>m  @>@>@>q  @>N4 @>J@>@>h @>TtE * z 4ȵ3}ʁ)ʁ)3}bQ 3}v \$`jFb$`jFU$Ca$%Dz$$Gti6ef*:7AR$?X`a*$ Aq Ty$zDo $?n $zDDW:]P]:]0u[Z$BW$@@>@>v  @>F@>@>e@>@>@@>Wh9K @@ r܆3} u uʁ)W= 8Yi"j"k"5S@>@>B @>@>u@>XL @C n 8YzH{HY5S@>@>z*x@>@@>@>G @>@>Q @>@>@> Y}LO B Y6I [ 堅Re7Re7 6N'cY1%CB%B%C%A#: BHBz!$*CO: A\$CG: HB{$>A]in a HellBender's side turretD]HellBender Side Turret@> ]|9T B Y6L Uƙ. 堅 u u u 6NN B"SO$m ^: BcY1k%C%BA#: Hz!$ C[$: B\$CG: BH": HB{$?A]in a HellBender's rear turretD]HellBender Rear Turret@>@>H @>^kDU !N ~Re7h܆3}3}܆3}ܓE'êE'ê3}E'ê3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} ZE'p%$ @F'$>v-M'}r~m M":L"o{xr"`y#~"a b q$@?_ \3cU ] PRVRearFireua8Y"I"z$@F\ $|Hj!Zg!+l!Sk!Sm!Si!h!e$DM $f!$Y?@>)/$L?@>@>M @>@>O @>@>S @>@>q@>@>D x{dg=[ B Y6iV :{R~f3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}Zsh|zVGB|zVGBJ3}Zs 堅3}Zs3}Zs\fF\fF\fF'3}Zs\fF|||||h\fF||Oo~3}ԵzVGBOo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~Oo~3}3}ԵOo~Oo~Oo~ 6o,p, q, m$ #=n$?$$ #$B$?@>$HC$fff?@>$P$fff?@>@>q$o:rZf?eY9$$@>$A$t<@>$4B$@>$P$@>@>t$̌?v$?w$ #<|$=}$Am$ u$$A~$<$333?A$@q Zf1eY+$$A@>$D$A@>$(knN$A@>@>GZf?eY9$$A@>$HC$ A@>$D$0A@>$@E$@>@>v$v>vff&?vY?v̌?C$G=D$DE$zDF$?G$8J$=C$AE$Be$ B[$BF$HCN$=S$CT$@FUV$BW$zE^$V#: -BAV# -Aa$M$$BL$$?N%\%a%$ Bb%$\Bc%$ Bf%$ Bh%$ Be Yg I l|@>g L l{@>a b E^ [ g"= PRVStartUpT#] PRVShutDownh"jRi"b5Q#$j"Z$$tH$PH@>\"Z$B$C@>N#$?n": B Bn $o:z"Y C4B0A C40AJ#I#$BV%T%: C0AS%:]R%$ff&?sY v!w!x!y!G$@fl<tm$O#S^: 5^A"!‡BcY1%B%CB%%CA#: Ap Az!$>CO: A HB\$CG: H": BV$@{$>A]in a HellBenderD= HellBenderdC7cE7w#$D@#|}":]t"Y t$Zm&%t$$B$BA$Bc$@>Y"$RD["$DI"X) /$L?T;$/CXu!@>@>X <@>Y <@>Z <@>[ <@>z<@>^ *Dg\ ] \DIIcy ~: ???z : \;$Bj$HC@>@>g8*@>l1@>@>L @>uf @e r 8Y ZH[H\H]H^H_H`HaHbHcHdHe"Y5S@>@>]o@>@>@>g @>@>U@>@>K @>@>iL*@>R@>@>@>@>qV{ {c9i @q 5[Ɠ܆3} u u uʁ)W= 8Y `"a"b"c"Y5S@>|]9j @r "܆3} u u uʁ)W= 8Y \"]"^"_"Y5S@>@>L1@>@>e$*@>x *@>{ *@>A @>@>B*@>E@>@>D*kBn 2CQ!k5f FY@>@>F*kCo 2EHk5f c "FY@>@>v#*EYp 2 I9Pv3}3}3}3}3}3}3}3}3}3}3} i B$: >^$333?B\]You got the Mine Layer.W V]ONSMineLayerPickup:7/$>@>@>~@>@>z#hFIq L=@B { U)/$)\>@>@>t @>@>@>@>{)Lk" G@>@>@>v@>@>Ow9" G Os 2SxG w i x"Bo \]#"You picked up some parasite minesWVMFlakAmmoPickup:7/$>@>@>V@@>@>W@@>@>@@>@>@>@>f@>@>@@>~@>h @>@>@>@>b @>@>^n@>bP@>cP@>bP@>` @>@>W@>@>1@>@>Vd@>hdZXw *j6dZ }? ANl]\$;Fb$;FU$A@>@>_ @>@>X@>@>pUO @>id@>`n@>W @>@>NqX @>S @>@>P d@>] _k?pc!wQ*QJ"'8-GZ]Z$[C v&z1(V5p G@>N @>@>ud@>s@@>@>@@>@>\ v@P A G@>@>@>H @>@>F@>@@>@>u@>@>C@@>@>BF @>OcLk)CZ+`wZ+*Qw*rZ+*Z+ F 9?a @LF D  F 9PD -9:9:$@w*-'L.aF D F 9?,F '-(-'LaF D F 9?,F '-(w.L*'w.L*.L-a  F "@ GhJDB'H!bPRe7}Lʁ)ʁ)̊}L̆3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} }L ~uM"pL"<ouQ$HCr$Q8>}&$u)@>@>iSYO#-g 9: ,y" H9Dt*##* G@>K@>@>f@>@>F @>| iVMhB Y6PMu| j 堅3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} u u uf3};h;h;h;h;h;h;h;h;h;h3}Ե3}Ե3}Ե;h;h;h3}Ե;h;h;h3} 6H$/Dh-$Cc;$HDb;$@EDYa>CC ABC AC AHC A>C AB A AH Ad$L=g$?h$Bk$Cl$CP$Bi$Bf$=e$?| $L?d$BU-$̽aY CHlH @>e Y g g.lv%@>B"Sa b E^ [ g"] TankStartUpT#] TankShutDownq%$DW): ?@X)$@h"jRi"a5Q#$j"Z$$tH$PH@>\"Z$B$C@>N#$?n": BAAx)G$@A`tR$Sk$O#SK-^: CcYHBHCBz!$CO: C[$: BG: HH": zCV$>{$A] in a GoliathD] Goliathdq6c{6^$L?@#v%}":]t"Y Y"$D["$HDI" )FYT;$Cj$pBXz!@>@>kFF@>PMB]BsV9: , 9: &7c<Bb<BB fB9:B(W9=BB\(B fBlwB*B-BE"w.B*.B-(c<Bb<BB G@>s@>@>Y oJRHG@>m@>@>H@>@ @>@>THZmG*W-nZ }? AK3ld3l#$zF\$CU$Aa$>Ctr0@>@>@>@>VH@>m@>p~CH[L\ZRe73}3}3}3}3}3}3}3}3}3}3}3} }gk$`GL$F~gogQ$As$Ar$L?q$L>D$?cU ]HoverBikeFirehWj!Zg!+l!Sk!Sm!i!Sh!Se$DM $f!$fff?@>j!g!+l!Sk!Sm!i!Sh!Se$DM $f!$fff?@>) @>@>T9@>_rMR.$BV $@@O.$CN.YAB AA AM.$HC{$L.~]HoverBikeJumpDY%B A B A Ad$Q=g$?h$Ck$Cl$CZ$A[$ ף<`$Aa$=b$zDc$Be$ Bf$?T$HCg$Ah$Ai$Cj$HBk$HAl$A[$BaY C[lr @>B"SabE^ [ g"]HoverBikeStartUpT#]HoverBikeShutDownh"jt,i"]5j"Z$0rG$PG@>\"Z$A$B@>N#$?n": HB An $8z"YB A`AB `AJ#I#$pBf`s&v'y#O#Sg%S^: pBcYaCBBCBBCCz!$ CO: HB\$CG: H": BA= in a MantaD]Mantadp7ck7^$?w#$;D@#Q,F&: 4B}":]t"Y |-$Y"$D["$HCI") y$aDX|!D<@>@>| @>vVI2 f WPv3}3}3}3}3}3}3}3}3}3}3} i B$: >^$333?B\]You got the Grenade Launcher.W V]ONSGrenadePickup:7/$>@>@>i0@>j0@>k0@>l0@>U0|YKoe$0n!vlGZlGZlGZlGZlGZ i J SW%Sh$ff&?Gt hn@>@>^CnV^ G"-A-E). wE)*wE)*E)CH}nn99aE)?nH:H}nn99a?nHg%'-U(`99adnE `A).g% wA)*wA)*A)-(RaH}dn'A)-'RaH}dn'ewR*wR g%~-k Ra/!@/.R l Hs 9D9?`>-U'}#b;R-r `H `w.R*r.R*a^HkRH}R&Hr HD `J }#ba^HkRH}Hd}#a^H]naH}g-U g,nHa9Ps 9?& G@>t@>~FMr@B { U)/$Q8>@>N2su#DG w i x"Bt \]You picked up some grenadesWVMFlakAmmoPickup:7/$>@>@>u@>@>W5@>@>{@>A zP wp6'KilGZlGZlGZn!vlGZn!vlGZlGZlGZ h$?W $@>D b9R@yc܆3} u uʁ)W= 8YO"P"Q"5S@>@>CMI-R!M*%9:9:$I-`dwI-*I-u a,(@saa,$@C,a e 7%9:9:$9?&7%\C_0I%CN&K"$q!SCB$n! G@>|@>@>}@>@>F@>@>O$@>@>pJ ]hi G@>uPHM)7h9: , 9: & P%%- r~*~-*wq*wq*O$qO$rO$* w~*  w~*P~Jwq*5qlP9?,PqrO$*5O$W9:W9=O$W9?&P% Kq%5wO$*pO$CLq\-O$9?9?P9?W-l9?&P|%\qw~*N 9?&5-l9?9? ?H 0,9: 29?9?ff>H 0,9: 2H 0,9: NH 0, 9: .9: w"qN u44w.O$*O$W9:.O$ N 0,44-l r~ .O$ N 0, G@>dJ@@>@>s@>@>O@>@>E@>@>rlT @>@>@>i7@[@>@>@>@>~$@>_@>@>f @>@>M@[@>]@>@>S@[@>W@[@>X@[@>Y@[@>Z@[@>Z@>e l9`@][!܆3} u uʁ)W= 8YH"I"J"5S@>@>_ @>@>_@>@>`@>g c@cf[ 8YtGD"Y5S@>@>b7@>D@>l@@>@>W @>i ^Me Z-9:9:$G+(gpȵ3} u u u 堅h ٵ ٵ}L}L,e}L}L}L}Lʁ)ʁ)hʁ)3}ʁ)hʁ)ʁ)3}bQ 3}3}vhhhqYԉhqY ٵ _$;D_($?\$ Db$/EU$Ba$Cz$PCGtdef*D=:7[SC Q.R$@/$L>X`Nf SDW:]P]:]0u[Z$BW$@@>@>{@>@>j@>@>Q@>@>|3m@>u*@>j Rf2nEPv3}3}3}3}3}3}3}3}3}3}3}3}3} i B$: >^$333?B \]You got the AVRiL.W VMONSAVRiLPickup:7/$L=@>k lFgo> <3}- =13}3}- =13}3}- =1hhqYԧqYԧqYԢȵqY i k': /Cm'$?T: A@J W Sx*$̌?x$̬?K $N  Z)U ] AVRiLFiree,] AVRiLReloadh$@GL Z "o $@X : l : zm $@hgW $?M $?@>@>a@>@>R@>@>s1@>N1@>l*@>@>P@>@>`@>@>M @>m hx@ { U`!$@E)| : BpA/$)\>@>@>{@>o i2zվiG w i x"BL \])(You picked up some anti-vehicle rocketsWVMFlakAmmoPickup:7/$>@>@>}@>@>v@>@>E@>@>@>@>@>@>K8@>@> @@>A@>A@@>@>B@@>}@>C@@>{@>s @>@>f,j@>@>-@>@@>@>G j@>b8@I@>w@>Ow@>Pw@>M@I@>S@I@>T@I@>r^M@>@>@>Y@>@>Z@>@>[@>@>\@>ZB!s*_ Z }? Aq l@ l#$F\$Db$PCFU$Aa$HCtq1@>@>V@I@>@ @>@>`@IZC!t*cj|Z }? ANl^ l#$F\$Db$PCFU$Aa$HCtq1@>@>R@>D!nu -9:9:$G+gl'΢ȵ܆3} u uʁ)3}ʁ)ʁ)}L}L}LbQ 3}ܓ܊}L gz.j$D\$Db$zEU$Ba$Cz$PCGt\ef*:7A R$ A/$?X Ty$BDW:]P]:]0u[Z$BW$@@>@>j@>@>N@>G!V x3k?Re7hh,e}L}Lh}Lhgl'Ά3}Zs}L}L}Lh}L}Lh}Lh}Lgl'Ί}L}Lh||h|h|3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3} M_McA'$fff?}g~gM"PFL"ogs$HBr$?q$L>D$@@cz& U ] Laser01{&] Laser01h_dgj!Zg!+l!Sk!Sm!i!Sh!Se$DM $f!$33s?@>j!g!+l!Sk!Sm!i!Sh!Se$CM $f!$?@>) @>@>^p@>c8@IaO!h;pB Y6[p\Las3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}hhhhhhhh3}3} u ul$$>#l$$>#l$$>#W$ FZ6W$ FZW=W$ FZW=W$ FZW=W$ FZW=3}l$$>#l$$>#W$ FZ3}l$$>#W$ FZ3}l$$>#W$ FZ3}l$$>#W$ FZ3}3} u uʁ) u u u u u3} 6H$DY YLBALBC.l$B.Y1[ dB[ BdBPCPACA.W$@.Z$D$D@>~-$?z-$333?k$Cl$CZ$B[$L=`$Ba$L=Y$HBX$L=b$Dc$HCe$HBf$?T$HCg$ Bh$Ai$Cj$HBk$HBl$A[$BQ $@@R $@?aY Cklr @>abE^ [ g"]AttackCraftStartUpT#]AttackCraftShutDownh"jRi"P5j"Z$PCG$|H@>\"Z$B$C@>n": ABn $o:z"YB`AB`J#I#$pBG$@`s&O#Sg%ScY%B%CBA#: z!$RC\$CG: H": HC{$A] in a RaptorD]Raptordf8ct8^$?@#r F&: B}":]t"YY"$D["$CI",) T;$Cj$BX}!@>@>pp@>m@I@>r@I@>s@I@>v@@>U!@>w@@>W!@>x@@>Y!@>@@>[!@>z@>@>t@IZ!F3{)2G C _a[]%k's turret electrified %o.^]43%o somehow managed to shoot herself with a turret._]43%o somehow managed to shoot himself with a turret.U$@?@>@>z@I^!G3}0(VG C _I []%o ran into %k's skymine.^]%o ran into her own skymine._]%o ran into his own skymine.u!@>@>r@>@>~@>@>D@>@>B@>@>@>@>v@>@>|@I@>E@I@>@>@>F@I@>H@Ib!J3K G C _I []=<%o couldn't escape the awesome power of %k's skymine combo.^]0/%o was a little hasty detonation her skymines._]0/%o was a little hasty detonating his skymines.u!_$@?U$?@>@>@>@>*@>@>e!@>Cd!L3OV!C< C s*"w$"[]%o was crushed by %k^]%o was crushed._]%o was crushed.G SG P $?@>@>J@Ig!M3Qbp []%o had an accident.^]%o had an accident._]%o had an accident.G SI S@>h!N2R)T 1'i C C[] %o trespassed on %k's property^]10%o tried out one of her own mines... it worked!_]10%o tried out one of his own mines... it worked!u!_$?@>@>@>i!P2TC1'i C C[]'&%o played with %k's happy fun ball...^]'&Silly %o, grenades are for enemies..._]'&Silly %o, grenades are for enemies...u!@>@>@>@>@>@>@@>@>v@>@>K'@>@>@>n!G@>w@>@>_@>@>@>@>co@>p@>@>A*o@>W@>@>heZ 0@=9:9:$e W G@>@>@>\/gF  G@> pNrQ  aG Nw *  d,  e, G@> q:?";29:9:$ w * a  G@>jlh*< G@>@>@>kD- G"@>r&onM1.-o+w * K G@>@>@>rsY s^Ys9=,$$sabY^Y^sYs$$9=,sap-- Gun: 9V Y^s@Y Ys^Ys@Yb G@>@>@>u:q_ ( G@>UKkAr#U%-k-k-(]-B' r*9D1wU%*w *w.U%*U%l (_.U%(U%-U%-1w.U%*.U%H-w * -i( e$    'w.*r*E#$( G@>U%@>@> }xC_*nq&#??6q&i$#?w* 9?,dM #???M9?rDaM+N+ Mi$ i$(q&*)a  Mi$~rDaM+N+ Mi$ i$(q&*)a  Mi$'J%iJ7-Fw*M aJ i$w *M  aJ  i$MaJMJD-w*w-aM+N+M i$(q&*_DDwaM+N+Mi$(q&*_]a M_'J( G@>J@>@>QK@>@>VMCW(EM*M 6*s!6*a+* G@>z@>@>{La+)UGw *)- kL(G- kL'L G@>|@>@>wu\m2 r * u-'u 0 \ u a 6uuo$ u \ u  u  G@>E 5@>~g@>xD+4<9w *x!@> x G@>HKg@>BJI34sr6r9DBJ6r9DBJ~6rs!6ra+r G@>Cg@>}@>@>hHFalABP6m99?%}?6m9[}?h} G@>o;yL~K=9:9:$zBlB 9CzBB|aw)`ww)*rw)-G*w)--G*'-G*D%D7BDB\#(Dki.k?D%kD7BDB\#'DB H&i.D!|*6|6^.6^.6^.|*|*L5J.yK5w*|*e'w*w*J.J. -G*e'e'w*2e' #<-h*(:-h*'D%0D7h#-h*-c.k..%Dh#k.%Dh#-(%Dh# e'&%Dh#-'%Dh# DA-c.-h*y G@>]q;u?\S 9:9:$u%Lu7BuBau 7B%u%u7h#uh#au[7h#%] G@>@>l$@>@>@>@>@>i@>@>QORxK $ija G@>p$SsqS p$ rs G @>@>@>Wdne79:9:$ -@ (da-@ (' G @>E< @>W@>sNK'bYw *w.*l _.( G@>z6]H=+-B']\[ZY}}w*H]\[ZY}r* G@>L<@>@>[@>@>\@>@>]@>@>T@>@>w6R:ID1=C II:9:C 9:Iq G@>a@>@>c@>@>\/bq;Z\/9D G @> eD HB$ D D N 0, G@>d@>@>g@>@>i@>@>k@>@>l@>@>d9vJ)pv-v BE v B9?Q%%%-(}E v B9?P&}&}&-(Om%%&&* G@>m@>@>o@>@>p1@>v1@>w1@>@>@>x1@>@>@>z1@>@>@>|1@>@>@>~1@>@>@>@1@>B1@>C1@>D1@>E1@>F1@>G1@>H1@>I1@>J1@>K1@>L1@>M1@>X<P LuP tP w&-I+-d0t|3-d0-I+w` x(`/a y1`/a*^!o09:9:$O BlB 9CO BC--TL(NL.}#%c}#7NLY}#NL--TL'c}#}#%}#7\#}#\#--(_*a}#C(l/_*p0#?c/aj,s,l/_*'rc/*}#\# `#(s-TL'w.c/*.c/-}#\#D&}#\#D& A0j,_*}#\#a j,9?, s,}#~'9?,}#~'s,}#\#a+9P}#~'}#\#`#'A0p0x}#\#--}#\# }#\# }#\#--'}#j G@>@>@>@>@>i@>@>TRR$ija G@>p$j<Vs p$V.p%p7VpV jpV ipV hp kl G @>^:V~nxv!L!@><7% 9=,s!Loa-I $`!jo $s G@> VN> 7% G @>`:UEZU w+c&m#wc& wc&*\U c& \ZZ\w+c&c&c&m#/w+ G@>_^d Xw d c b h.7h7rc%c7rNa  6crd 6crc 6crb Na*N-'N-'chNcC_ G@>\@>@>@>@>HUnf79:9:$ -f (UR-f (' G @>l< @>H@>ZIRF7!%9:9:$/a0 IIa/!eIa/!YIa/!vIa/!IIa/!c"rEIIa/!c"Ia7D&D&.u'I7!!I10/a0 IIa/!IIa/!c"rEIIa/!c"Ia7D&D&.u'I7!!I10 G@>dyv g' wg'*y.g'wy*rm#*grym#*m#y{m#ym#ym#V$yiyg'g' G@>r<@>@>g@>@>v6Ni/FgrN rN 7NTN-l9=9:,Ni G@>h@>@>k@>@>_@>@>jFw=T GOW$FDOAO&D-lFq$ G@>m@>@>o@>@>j:Drd&#W$D G@>p@>@>@>@>r@>@>n:O\y$J9: ,0wO*C*OOOw*C*H 0S 9:C*-b"C*9: %d$9:z0d$,9:z0 $KpJ*R.t,.dKO G@>t@>@>v@>@>w0@>x0@>{@>@>~@>@>y0@>y:p W 999:p %-{'49:p &-x'( G@>|0@>@>@>{:M):9: 9:J J   3$s A$R O$] ]$T k$` y$r 9=,s -v-@1Y$-@1-v9:9:m0m0CB$n!U" G @>A;s#H;-'-G ('wi*iaU"CB$n! G@>~0@>B0@>q rJ|9:9:$0wi*ia^9:%a C  #|a c # G@>C0@>E0@>zg\PDg%g7!g!Ra/!e.-(za/!Y.La/!v -l.-P(.A'.9=,g/a9 c@?c-c%rEcca10 G@>F0@>H0@>I0@>J0@>K0@>L0@>M0@>D;T_"wi*- ia9:9:$ \9?&r-l- VCB$n! G@>N0@>P0@>OTiuaT%T7!w.T!*\9: %.T! z.T! 9=,.T!pTT%T7D&9: %TD& q!TD& q!9=,T G@>Q0@>S0@>T0@>@>@>Z@>@>\YRZd| ?d djjdf6t%6t9D9?@6v9?C66v| 6t`mfaa #?twa~ _mf(# A A A*m~ vt G@>P@>@> j[^Pq@ ?d qjjqr6|%6|9D9?6v9?C66v@ 6|`sraa #| waA Usr(# A A A*sA v| G@>@>@>\;`;j&~!CB$n! h@>G@>A`Hl{ G@>a@>@>b@>@>c@>@>d@>@>@>@>@>@> ^;h^} G@>@>@>^Sd~Ua@-l f,4 $`q!jCB$n! h@>GD@>tJC=JK4 G@>Id;m=a@ $]K a?' h@>G,@>IS1-g8S 2u? 9?&K ?9D?F9?a( $9:&KoJ*KnJ*s9:%H 0,H 0,w@'*w@'*@' J+9?"b"@'9?@/M%@'9?@9:q7.dq!@> G@> b;p^ G@>@>@>ksL !CB$n! h@>G@>f n=9?&a((-'a(= G@>rK\9?&a---(.d G@>p$vAs_ p$A.L%L7ALA aLA bLA cL G @>@>@>Dnk 79:9:$ -N (Dw-N (' G @>\ #J N8\ #a ) #C G @>~5|;yv C9: %pppp9:  9Sx'9: ,pppp9: C 9Sx'ppE 9Sx' G@>@@>@>q x`$Fq -(Cw#*#-'#a(( G@>u z]2$u i9:9:$L9:%##ui##v#-(#a''9:9:$9:%H 0,9:&H 0, G@>w {sJw w#*#-(#a''9:9:$v9:%##w##x G@>z|R] %#-'#a((l9:9:$aa,$@a t, #HC9:9:$9?&7%\CN&K"$q!SCB$n! G@>]BK?zd ^K.I%UI7KIKaI] G @>_mK Xc K J I a.7a7Tg%g7Tga  6gTK 6gTJ 6gTI ga*g-'gaggC_ G@>s< @>m@>O ? wO *O a G@>EO#  G @>u<@>@>T ?  wT *T a G@>HO#  G @>G@>@>J@>@>}4V q7)w*p.4p. G @>L@>@>P@>@>@@>@>N@>@>R@>@>hP YXhUw. h*w. h *. h -i' G@>S@>@>Tlc :5r.*.-Pl' G@>CP@>@>@>VZn@G@>f5$ k G@>Y\o&G@>f"{*$ k G@>WP@>j@>@>^@>@>_@>@>`@>@>a@>@>@>@>d @P@>dP@>eP@>fP@>kJd#%_ &k G@> hf # G@>iXn'")-X%g&%_  G@>gP@>kP@>n@P@>o@P@>@>@> <q\' G@>o<QW{.Q.r{* r{(M-'9:{ G@>xwOxs G@>{@>@>@zP~ @Ps G@> y<sJ &- r.H &*-1s\6s9=,s$sB9?s?h 9?s?k sJafh @k @9?f9?f s G @>C=ML\2f1^J.-aJ(_J%_J7^Jw_J^J*_J^J- -aJ'_J*-aJ^J cJ^J eJ$9:9:$C-?66f1t BKB 9Ct BCwz#*z#v1999?%z#z#z#C-$w{#*{#v1999?%{#{#{#C-M G@> y|c& ̾ G@>@>@> {~bf ? G@>@>@> }@f$ G@>@>@> BedA.RwA*Aa/!y<@yrA*rA*r.A*P~ 6 6A ~ 9?8P=EA  [E9?@PE9?Q9P G@>A@>@>]Dz?S ^z.}%U}7z}za}] G @>_F} Xj } y x D.7D7qj%j7qFa  6jq} 6jqy 6jqx Fa*F-'jDFjC_ G@>@>@>p | nY79:9:$ -A (| y -A (' G @>AH` '{X.<rX*rX*'X  9?9?& G@>X@>@>N= @>p @>@>n@> F=f D G@> NB kH,B & te  B  G"@>U=@>@>OM?R9:9:$M%xM7=nwM=*M='@M= #?M7=% G@>P@>@> QTed[.*r[*r[*w[*<[ [ 9?L>V[  uVu9?=[P>89?6Vu=w[*"[->u9?33> G@>[@>@>R@>@>U@>@>I@>@> SYf Fpu 0x%%!%$|%|7=w|=*w.|=*$|M$ G@>|@>@>W@>@> X\c+ C.@rC*rC*>ZC  Z9??Z9?>̾ G@>C@>@>Z@>@>]<@> [`beE.@rE*rE*{E  9?@ G@>E@>@>^<@> _j RH%K h g :K !Pa!I?=E j  G@>a<@>c<@>d@>@> 4@>g 2.0@>X=<@>i<@>j<@>k<@>l<@>@>@>m<@>o<@> S=re\x%%\.=r\*xr\*r\^*w\*'\ %\lw.\*B\&h \M.\.\̌??M\  eMe9?=\P>9?6Me=bw\*"\->ye9?33> G@>\@>@>p<@>s<@>t<@> qwf, X).=rX)*rX)*$U,3X)  9?  ?$$ G@>X)@>@> vyc]^.@r^*r^*>I^  I9??I9?>̾ G@>^@>@>u<@>@>@> x}bL.@rL*rL*{L  9?@ G@>L@>@>s@>@>hg Aa<+lA B uP6m9u9?%s?6m9u[s?hs G@>p$K7sdxp$7%777{ 7v 7N47h 7 e 7t 7q 7m 7 j 7Z 7^ 7Y 7V 7M47 u9:9:$-v'7%u7,kw7f#*7f#a**7f#a a7h07f#a*7f#"%7f#j07 G @> K=Et;49 U%'w%*x%% G@>@>@>V=Gpbq!s!h G@>@>@>Fv DbG9?,9bbG]G-X' G@>Hx rt]x G@9?,I]b]b-X(q!@>6h 9D] !\ h %? G@>@>@>Pw n 79:9:$ -k (w l -k (' G @>IMsxAaf v a $^!FlakAmmoPickup h@>G0@>r L<-Xrr  G@> mX {m w m w m w m w m Q m Q  G @>]F>w?9:9:$w%Lw7nwnaw -v'pw%f#*%f#aw&f#*&f#a] G@>OQm w  w  w  w  w  G@>QR1 Q  Q  G@> jX{j w j w j w j w j Q j Q G @>_iJPXAt P%8P7t ?P_ G@>SQY w  w  w  w  G@>UR; Q  G@> qX {q w q w q w q w q w q Q G @>V> @>` @>WQm w  w  w  w  w  G@>d@@>]=@>a>@>@>c@>@>d@>@>e@>@>v' @>g @>h @>i @>eU$J0/a0 U$EDU$-l9:U$Q&U$10F$%Q&r9:9:$d"U$F$w.&U$*U$x'_U$y$U$U$m#}rU$* rU$F$/a0 \b\\!C10y- wb*/6b 9?b@ 9?%/9?9D 9DMa?'S G @>j@>@>m@>@>n@>@>o@>@>@>W E) rF$**U/T 6OW U6OU UQ@ET&F$NT& O6NSNSQj1T&QST&T&m#crT&* rT&F$j1 G@>p@>@>t @>@>s@>@>U@>@>t@>@>v@>@>x @>@>x@>@>@>i@>n @>{ @>q s*`1 6 ?6 ?6 ?6 ? $PJw *6J6JJ#6J6/6L3d% xw6J6JNrF$* U#F$U#p$_ U#U#U#u2U#U#m#YrU#* rU#F$$o(9?, 9?@@ $?E$?<P/ H+ F$T$xwJ/J % 7a a|& X&-D  |U#F$9-D ,9:U# ,7U#%9r*-U#U#m# 9:U#j2U#-v(9:U# %U#-ge% U#U# $o(X&U#-li% U# $|#U#o(X&j% U# $|#U#U# o(X&]% U# $o( U#x'U#U#m#rU#* rU#F$w *b' $a!s,b'$$w*b'wb'*i 6. i  6b' @b' J66/33s?6/33s? Rx6<E?w6<E?   $(9=,$( &aiEEBB   $$$ xJwJ 4a\ J@J@CC `1 G@>| @>~ @> @>@ @>A @>B @>+ @>D @>E @>F @>G @>H @>I @>J @>h> @>L@ @>M@ @>N @>O @>P @>^  @>R @>@>@>J>bO4- -db ?eb[1g bb Z1f bb sb[1Z1b ( G@> >Ul w*l G@>dv*NS|sw.*lv*%sv*7v*_.(v*+ G@>O>,_>{& - l ,,q| dF  #?S z dqz ]  G 99| r,  ddqG 9?%6r9?%6r9?,6r9?%6r9?,dF  #?F dqG 9?% r,  d6r9?%6r,6r9?%6r, db$dq,,(6re?6r, b eq }?9?G 9?Q }33>,}333?,,,(6re?6r, a e}q ,l  G@> \M^Dxa ^^:9:a 9:^qI*%uI*7I* D^I*A G@> \V)_?? V)%<V)7V)_V)  G@> sQ)p XR wu.*au.Q)%OQ)7Q)p Q)  G@>hP m=~yv9:9:$6q9P 6W 9O 6X 9M 6m9H 6Z 9 p9Dn G@>@>@>`nq6,rI09:% wx*%xWW9:& wu*%u9:9:$ 9:, w% * w& *_9: ?'n%n7n q!nF9:9:$n%Fn7g#ng# @$n G @>]m n) q_-m \9:Q#79:Q# K9:Q#n<-m  G@> S?@ HU@ N 0, G@>k%@>@>@{ AmOG-mJ9?%(EI$Y%99a<"@?((k%-{ -{ Jwk%*w.k%*k%lz%z7z(_.k%(zk%-k%-k%z%z7ze$zzzQ'( G@>a@>@>Z?Zr 0u ]<Aw~#*w~#Zr~#w~#*:~# Z a%a7ra*aa*r*)c Z*a%pa7fra*aa0* G@>[>GyI-d-d G@>hKJwN$*N$N  G@>kGLKGa /a9 rGj[6FrGjm%m7m6HrGjmmgr10[ GGa&M)Link setup copied to clipboard G@>@>@>m@>@> u?n\/ 4/9:Q#79:Q# \n( G@>@>@>@> @>Y0SJ"Epmw* wN$*wN$*0N$U#mw0* N 0, G@>@>N@>zAE @@a  @x(a _ E j9?,a<9Pj"w*9:9:$a 9PjQE a G@>@>@>@>Y@>F@>@>zwT TF3wF*w.F*9:.F %!9:F%.FW9=|rG*#9:G9:FH9:G9:F!GFGFFF KrG*G_"*G G@>C@>@>ZAyS_TC3wC*w.C*9:.C %!9:C%.CW9=|r@*#9:@9:CH9:@9:C!@C@CCC Kr@*@_"*@ G@>IJ 8]F9:9:$G'aW5 G'a*99 G@> a?vH0_D"rF  F-{ ( v{|}F G@>L@>@>cAdt j'wj'*k#.j'wk#*9:k# %!9:k# k#W9=-{+'j'j'LwL*L~ k#.LL!}L-7-{+*L!OL--rk#*k#-99:k#9:k# %Sk#W9=--{+"k#]$9=RL(9:k# &e&Lwe&*e&a!M,e&F%$Be&e&WzL!OL-wrk#*k#-x9:k# ,9:k# &G9:k#"k#W9=RL(wz%.wwz%*9:z% %k&%wk&7z%m9:k&z%9:k#Srk&z%*.wk&z%L p#z%'wk&RL(LL G@>@@>@>A@>@>}n \>d Ka Z39:9:$ x(n am I#B(wn *a  m 9P#a$? HDv-{ o$a(-'at(a G@>B@>@>D@>@>RG}XG %[ &Y &,Z 1,X <,W G,S R,M  G @>@>@> CJwo G@>KLYH4Ur*-r. *r.  *q!@>  9?%  .  Aq!@> 11 ? .  Aq!@>  G@>@>@>G@>@>vAQR  G @>[@[@> X[ N [ a`__ U[ ,  [ , [ , _ @?o[ ,_ fff?[ ,_ > G @>@>@>U@>@>V@>@>bPQ|y[P, P,  P, P, P, P,@vpP, K8v G @>@@>@>Y@>@>Z@>@>D?=LwD*DaC9:9:$ wV*V_ G@>\JR 99R I-?9:9:$Daf 9?,R Da*a=' G@>d@lSE rV* MV MR 9?%lMM333?llMW a+9P G@>[@>@>cp}U p %P !&J /,H =,F K,E Y,| g,z u,t ,s , r , m , c8 , b , ` ,V ,T ,S ,M ,b8 ,`8 +,\8 9,[8 G,_8 U,Z8 c,Y8 q,W8 ,V8 ,R8 ,P8 ,N8 ,M8 ,lL , sL ,!rL ,"pL  G @>P{S9 P{- {_|v`w.`*}{.`M 9?,  .`M {_R1!@>{l%_R1$'Mw{*w{*({_{ u H G!@> OB?c~7%  G@>`SnY@S G@>@@>@>fn{^VSwn(na/!on-@V#? G@> jquIq +OvertimeCoreDrainPerSec%h LbRandSetupAfterReset&h nbSwapSidesAfterReset,h  q G(@> QBqS@և qq@b OvertimeCoreDrainPerSecoi $($Text2;0:99q:b bRandSetupAfterResetoi $$Check 'q:b bSwapSidesAfterResetoi $$Check ' G @>hQ@ff2a   @6wD*DB D*x(a  Q_9?,9P_@-`w@-**@- 9?a  Q9P_w*9:9:$a 9P_QQ_@a G@>_@>@>qfMbk@w*_MfWR@w_*_{R/a0 G~}|9WGR0G10uwf*wf*wf*z9=fzWw.f*Z#.f[*.f[**wwZ#*bZ#9:zZ#*rZ#*Z#.fubZ#9:zZ#*rrZ#*z&.frwz&*wz&* w.z&**b.z&9:zZ#.z&zWNrZ#*9:zGW9=9:$9:zZ#9:zGNrZ#*j9C9?9:z&oCA%*A7 bA9:zN9<9:jAwNooNZ#A  No`L9:jG A ]L9:jG Z#  `L]LZ#AANrZ#*Z#9:zGA%A7Z#!w.AZ#!*N{.AZ#!zfNooNa.AZ#!AUr.a*wZ#9:zGZ#9:zGA%A7Z#!w.AZ#!*N{.AZ#!zfNooNa.AZ#!ANr.a*Warning - PATHS NOT DEFINED or NO PLAYERSTART with positive ratingo /a0 _N{_$fw._*N9?,2N9?,NooNa_10a G@>koQH *db? G@>@>@>@>@>]BwbRiww*9:wawa!jwa!m&w-vw-l G@> ^B]l;`J]99Z9:9:$vac va* G@>h@[n#D@[ G@>@>@>tO{(ebwO-r.*w.O@eeO  G@> _BYK`L8|cTimeLimit6-  $- '( Yc G@>{Zb Z$-H'&H',9:Z&H 0%y%9?H'enemy_core_destroyed%9?H'%9?&z&Gp=H 0&y&9?H'enemy_core_destroyed&9?H'&9?&z%GpK'wK'*J'.K'wJ'*J'y 'J']9:ZGJ' 9:ZG-J'[--K'N-K'K'Q G@>vg@.q/9:9:$dgcx(a` gh9?,9Pha a G@> SY]H%7w-D2-v-vuw-D2-vY$x-l9: ,q9: %9:,9:KL=-%GHH9D9?t9?t9?%K9?L*##*&GHH9D9?t9?t9?&K9?L*##* %,w*w*a/!U k?uX,Uw*>w.*.l%!A$'& ,H &&Reset Onslaught.w*w.*.^'p!/a0 D)utD)a/!AD)a/!jD)a/!hD)p!10%7>-dJ-l-vJ9C9?9:&9:Gg%w9=,&w9=,p!}-dJB%G$$B&G$$-vJ-vJ/-C77&Q"V$5Fd*w*w*- _+P ,< % G@> aBz@oZG@>y?; wv*va G@>~tC%At-g()9:t % y%y7tyt-g'9:ytiCytiy0 G@>aa 9?ia%[a7at-9@a-ga-g'aC%G%C&G&a%fa7\a-9:a ,a-g9:at-%aC\\a-g9:at-&ay"a G@>@(F9 -  -I2%G-x-H2&G-{a (%&(7(-{((-x(r%r7(9:r( %'r(-gU9:r(%(-{'9:r(&(-x'r9:( ,0(-{(-x(Q$(U"(VZ-I2%G-xH 0,-H2&G-{H 0, G@>fB@B-89:x@wy}%}7@9:9:x}@w9:y&B}@x9=9:y&}# G@> FB|oD |Aw.|*.|\ G@>@?B(w@*@B 1w~*~aa   @-  x(a Y 9P#?w*iw*te w. *. a $ #<  G@>BL*J+L*99d9:9:$@a z. 9?,L*@a*~a L*L*-?--($a='d/X6 G@>CUnG@U G@>c@>@>Dp@LQpa G@>Jy` /W9V~9V.yy _c%c7{|cWyp N m,(c5c%c7|9WcycbAc&p N m,'cp N m,( G@>@>@>FP*SY 9:9:$raK*w*w*w. *-g/-v-v. -1t. .-g/-vwt*wt*tu&-v(-v'wt*(t Z<`KaK`KaK*t{<U(tx$7U(U(tX*%X*7U(X*U(_<X*m-vwt* waK*!waK*aK 9?aKaH N** `KaK,`Kt`w.`K*P*.`K |<{P*`K cd/SP*`K P*c9?, w*R*6 6`K &R*6`K o6S6R*6SR*6S6SSSP*SSL?ccS9?,Sa+9P G@>KR_ T/(]s9V~9V.RR _%7z|WRg N m&(5%7|9WR7O%*%*7*OI 6F*O*`%`7*`6H*O`*`D*bg N m%(777&R 7O%*%1*7*OI 6F*O*`%'`7*`6H*O`*`*Jbg N m%' G@>iB%F66%7Y#% `"%%J%7%O"%d"w*%%%7p).%rp)*r.p)*p)\%b G@>I~L M. #v!LJX~ G@>;@>@>LuH:&#u%@q# G@>TUx2UUU _;%q;7g|;WUT%T7;jV%V7V6FT;jVk*6HT;jVuTOFpUsing Official Link Setup: UV$U-G.'ewR*R N m,';;%/;7%|9W;UT%eT7;OV%[V7QV6FT;OVk*6HT;OVTF7Y#%(a"%G&GC9A;&wR*R N m,8pFailed to load Custom Link SetupU: There is not a complete path between the PowerCores.h{V$ {V$U xV$*'|7%Q"'稨Can't find a better link setup to load, so usingU anyway and forcing a connection between the PowerCores.@"%G&GFT'%T'7w.T'*w.T'*.T' [%G&GT' 'pUsing Custom Link Setup: UV$U-G.(#wR*R N m,';xPwR*R N m,( G@>q@>@>K@>@>S@>@>@>@>mBQ S K%AK77|KWQ 'KK%K7z|9WKQ 'KH( G@>@@>@> ^Z ~ Z e6%| w|*`|a/!e.|-(|a/!j6.|E6N&DFE6_0Db 6-l9:6G66||+Z7%Onslaught: Level doesn't have any PowerCores!!s V 9V~9V.7%/a0 U 7U 10V  V 6%67V76V 6lI Z bRandSetupAfterResetA{l-C9KllI Z LinkSetupw|lRandomQ" zlxl*xDefault*Q"lI Z BonusVehicles9Kl<OnslaughtBP.MutBonusVehicles G@>nBVy} =B%G$$B&G$$F G@>~ 3@>@>@>@>@>@>@>@>@>@@>@>llu$.zlbConfigUseOnslaughtWeapon0%x[zlReplacedWeaponClassNames0&xzlbConfigUseOnslaughtWeapon1,xzlReplacedWeaponClassNames1,xzlbConfigUseOnslaughtWeapon2,xzlReplacedWeaponClassNames2,xl G(@>@@> @>JCYSpY c&G{%{7GK{TaBT;aBTpp6{G;6{G{#Y6bbConfigUseOnslaughtWeapon0%s$$CheckY;bReplacedWeaponClassNames0&s$$SelectTY7bbConfigUseOnslaughtWeapon1,s$$CheckY<bReplacedWeaponClassNames1,s$$SelectTY7bbConfigUseOnslaughtWeapon2,s$$CheckY<bReplacedWeaponClassNames2,s$$SelectT G @>@>@>q@k0S$w.@*%,9:k&!r.@ J.@ M  w.@*@a/!F'%,9:k&r@J(w.@*%,x9:k&r@tu@L (!w.@*%,9:k&r@S u@z(w.@*B+.@%,9:k&}'%}'7B+ r6 }'B+ J6 }'B+ M }'M'' G@>znJv8%8,8k9@9KpbConfigUseOnslaughtWeapon9S88JpReplacedWeaponClassNames9S8 |9V8Jn%n,wn8J*'wn8J *0wn8J *8S n8J n8L 9V8M 8 G@>NC@@S@>x@@S@>y@@S@>@@>@>[ ?wd*d- (- rx(a x 9P#?a 9P#a   @w.*.pw~&*~&a G@>|Y,J/q 9:9:$Y,`wY,**Y, 9?|da  99 PF-?9:9:$ w*t/9=W G@>z@]nRB]* G@>Ac uB4%zc VehicleMomentumMultWc  G(@>De SpKe e 4bVehicleMomentumMultV$$Text4;2:10 G @>@>@>B@>@>Um k/*w.m *.m U' G@>~B{W_- r* wB`*HB-wBwB-[ ^BN G@> ITB` w.F *dF  WTTWoW` PG9?,(-(o$wd*d- (9:9:$ 9?,a $-9:9:$b ? x(X,`wX,**X, 9?a^ 9PTb  G@>@>@>M@>@>I koTw.I *r.I *.I -(.I  jjI a/!l+(' G@>Ll @ Ql a G@>I@>@>@>@>|@i ^wwd*d- (-(i o$a*i Or*S# - (-'a   @ G@>yCQ~ \w.*I!tO- - -I!M-z,-w*rI!OI!}II9?& G@>@>@>ADN H$ROw.*"r`-. `F  G@>XQ z 7I#:r.*$w` - ~.` Q .f&Q Cz c G@>YU { # ;:r.*$w` - .a"%.G.&.G.R7. N m, 8._ U .vU Cz c G@>KDE | ci:r.*$w` - .xE . G@>Ox@>\ vC E   G%@>LDA} S#A%zA7. AvA.WAA%A7. Av9WA.Ava&.V$ G@>T Jsc9:9:$ 996a+a<"@a!i? G@>]X+*419:9:$9:9:$-'q!Q G@>^?4d$-  x(a x [9:9:$w.*.U G@>^A`AS cG @>} n[#9:9:$a $-'e9P} 6e@a+eq!Q G@>cF~ UKr.*$w` - rFE R.X#FE.FQc'%Rc'7Qr.c'Q*r.c'Q*H.c'QM FEc' G@>hP@ MUKr.*$w` - rPN R.@"PN.FWj&%Rj&7Wr.j&W*r.j&W*H.j&W[PNj& G@> aeBs|-qwf* w*w.f*f.fWW-'qQ-(Q G@>f@>@>@>@>jVM CC0B&VW G%@>mS[EC|/@&ST G%@>`xQM5-(a>a!T -H,' h@>G$@>vn'K _+.n'%n'7_+Y#[6W#%n'_+Y#S#6W#&n'_+Y#S#n'  G@>Sh79:9:$%wO*q!O55-G(q!# Mr*Qr#ewO*q!O G@>{\ CE0O" G%@>uf*o$#aT 'S G@>wK+ a( G@>kIO0Io$&-H,a!i-H,(a>aT 9?,' h@>G 8@>xSrO*q!S $9:9:$ xO nxnzD6xxD naCq!S ?6CP$K9Px6K@6K%a+Ka!` z*q!S  G@> MDI$S-DI$`wI$*I$-wI$* w. I$ *). I$ -wI$*I$%-D(a(9:r/9:$rI$*rI$I$ I$ 9?,dI$-(-D(a(I$Q'(I$-'-D(a(  G @>AH {w.*V& G@>I@>@>aAn"o$ G@>@>@>K}^j Fp . IM.AwI*).a I .QI w..*.. Kp . _E ?(.d (('( G@>bAK,a( G@>yQ Q?/9:9:$dQ r'%r'7r'8H9Dr' #r'6aT $a G@>ODw H X! O0U#wO0*1.bw v uuw z^ ^uv  G@>~ { J +ebr{ *1.b{ W-B7[*{ bu{  G@>@@>@>XC7-.p.u ( G@>@>@>WH Zo.nH J wo*w.*oa7.=.=o.po G@>Y//----------------------------------------------------------- // //----------------------------------------------------------- class ONSWheeledCraft extends ONSVehicle abstract native nativereplication; #exec OBJ LOAD FILE=..\textures\InterfaceContent.utx #exec OBJ LOAD FILE=..\textures\HudContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // wheel params var() float WheelSoftness; var() float WheelPenScale; var() float WheelPenOffset; var() float WheelRestitution; var() float WheelAdhesion; var() float WheelInertia; var() InterpCurve WheelLongFrictionFunc; var() float WheelLongSlip; var() InterpCurve WheelLatSlipFunc; var() float WheelLongFrictionScale; var() float WheelLatFrictionScale; var() float WheelHandbrakeSlip; var() float WheelHandbrakeFriction; var() float WheelSuspensionTravel; var() float WheelSuspensionOffset; var() float WheelSuspensionMaxRenderTravel; var() float FTScale; var() float ChassisTorqueScale; var() float MinBrakeFriction; var() InterpCurve MaxSteerAngleCurve; // degrees based on velocity var() InterpCurve TorqueCurve; // Engine output torque var() float GearRatios[5]; // 0 is reverse, 1-4 are forward var() int NumForwardGears; var() float TransRatio; // Other (constant) gearing var() float ChangeUpPoint; var() float ChangeDownPoint; var() float LSDFactor; var() float EngineBrakeFactor; var() float EngineBrakeRPMScale; var() float MaxBrakeTorque; var() float SteerSpeed; // degrees per second var() float TurnDamping; var() float StopThreshold; var() float HandbrakeThresh; var() float EngineInertia; // Pre-gear box engine inertia (racing flywheel etc.) var() float IdleRPM; var() float EngineRPMSoundRange; var() name SteerBoneName; var() EAxis SteerBoneAxis; var() float SteerBoneMaxAngle; // degrees // Wheel dirt emitter var array Dust; // FL, FR, RL, RR var() float DustSlipRate; // Ratio between dust kicked up and amount wheels are slipping var() float DustSlipThresh; // Internal var float OutputBrake; var float OutputGas; var bool OutputHandbrake; var int Gear; var float ForwardVel; var bool bIsInverted; var bool bIsDriving; var float NumPoweredWheels; var float TotalSpinVel; var float EngineRPM; var float CarMPH; var float ActualSteering; // Rev meter var material RevMeterMaterial; var() float RevMeterPosX; var() float RevMeterPosY; var() float RevMeterScale; var() float RevMeterSizeY; // Brake lights var() bool bMakeBrakeLights; var() vector BrakeLightOffset[2]; var ONSBrakelightCorona BrakeLight[2]; var() Material BrakeLightMaterial; // Stunts var rotator OldRotation; var vector LastOnGroundLocation; var float LastOnGroundTime; var float InAirSpin; // Degrees var float InAirPitch; // Degrees var float InAirRoll; // Degrees var float InAirTime; // Seconds var float InAirDistance; // Meters var int DaredevilPoints; var() float DaredevilThreshInAirSpin; var() float DaredevilThreshInAirPitch; var() float DaredevilThreshInAirRoll; var() float DaredevilThreshInAirTime; var() float DaredevilThreshInAirDistance; var() class DaredevilMessageClass; struct native SCarState { var vector ChassisPosition; var Quat ChassisQuaternion; var vector ChassisLinVel; var vector ChassisAngVel; var byte ServerHandbrake; var byte ServerBrake; var byte ServerGas; var byte ServerGear; var byte ServerSteering; var int ServerViewPitch; var int ServerViewYaw; }; var SCarState CarState, OldCarState; var KRigidBodyState ChassisState; var bool bNewCarState; var bool bOldVehicleOnGround; var() bool bDoStuntInfo; var() bool bAllowAirControl; var() bool bAllowChargingJump; var bool bAllowBigWheels; // Jumping var bool bPushDown; //jump is being charged var() float MaxJumpForce; var float JumpForce; var() float MaxJumpSpin; var float JumpSpin; var() float JumpChargeTime; var float DesiredJumpForce; //used by AI var string JumpFeedbackForce; var sound JumpSound; var() float JumpMeterOriginX, JumpMeterOriginY; var() float JumpMeterWidth, JumpMeterHeight, JumpMeterSpacing; var() color JumpMeterColor, SpinMeterColor; var Texture JumpMeterTexture; // Air control var float OutputPitch; var() float AirTurnTorque; var() float AirPitchTorque; var() float AirPitchDamping; // This is on even if bAllowAirControl is false. var() float AirRollTorque; var() float AirRollDamping; var() float MinAirControlDamping; // To limit max speed you can spin/flip at. var float FenderBenderSpeed; replication { reliable if (Role == ROLE_Authority) CarState; reliable if (bNetInitial && Role == ROLE_Authority) bAllowAirControl, bAllowChargingJump; reliable if (bNetInitial && bAllowChargingJump && Role == ROLE_Authority) JumpChargeTime, MaxJumpForce, MaxJumpSpin; reliable if (bNetInitial && bDoStuntInfo && Role == ROLE_Authority) DaredevilThreshInAirDistance, DaredevilThreshInAirTime, DaredevilThreshInAirSpin, DaredevilThreshInAirPitch, DaredevilThreshInAirRoll; } /////////////////////////////////////////// /////////////// CREATION ////////////////// /////////////////////////////////////////// simulated function PostBeginPlay() { LastOnGroundTime = Level.TimeSeconds; LastOnGroundLocation = Location; Super.PostBeginPlay(); } simulated function PostNetBeginPlay() { local int i; // Count the number of powered wheels on the car NumPoweredWheels = 0.0; for(i=0; i> Rotation) ); BrakeLight[i].SetBase(self); BrakeLight[i].SetRelativeRotation( rot(0,32768,0) ); BrakeLight[i].Skins[0] = BrakeLightMaterial; } } } } simulated event DrivingStatusChanged() { local int i; local Coords WheelCoords; Super.DrivingStatusChanged(); if (bDriving && Level.NetMode != NM_DedicatedServer && !bDropDetail) { Dust.length = Wheels.length; for(i=0; i> Rotation)); Dust[i].SetBase(self); Dust[i].SetDirtColor( Level.DustColor ); } if(bMakeBrakeLights) { for(i=0; i<2; i++) if (BrakeLight[i] == None) { BrakeLight[i] = spawn(class'ONSBrakelightCorona', self,, Location + (BrakeLightOffset[i] >> Rotation) ); BrakeLight[i].SetBase(self); BrakeLight[i].SetRelativeRotation( rot(0,32768,0) ); // Point lights backwards. BrakeLight[i].Skins[0] = BrakeLightMaterial; } } } else { if (Level.NetMode != NM_DedicatedServer) { for(i=0; i 0) Multiplier = 1-(ImpactInfo.ImpactNorm Dot Z); else Multiplier = 1.0; return Super.ImpactDamageModifier() * Multiplier; } //function bool Dodge(eDoubleClickDir DoubleClickMove) //{ // if (bAllowChargingJump) // { // Rise = -1; // return true; // } // // return false; //} simulated event KImpact(Actor Other, vector Pos, vector ImpactVel, vector ImpactNorm) { Super.KImpact(Other, Pos, ImpactVel, ImpactNorm); if ( ONSWheeledCraft(Other) != None && ONSWheeledCraft(Other).bDriving && PlayerController(Controller) != None && ONSWheeledCraft(Other).GetTeamNum() != Controller.GetTeamNum() && VSize(ImpactVel) > FenderBenderSpeed && (vector(Rotation) Dot vector(Other.Rotation)) < 0 ) PlayerController(Controller).ReceiveLocalizedMessage(class'ONSVehicleKillMessage', 7); } simulated function DrawHUD(Canvas C) { local float JumpChargeAmount, SpinChargeAmount, BarHeight; local PlayerController PC; Super.DrawHUD(C); // Don't draw if we are dead, scoreboard is visible, etc PC = PlayerController(Controller); if (!bAllowChargingJump || Health < 1 || PC == None || PC.myHUD == None || PC.MyHUD.bShowScoreboard) return; // Draw background box C.Style = ERenderStyle.STY_Alpha; C.SetPos( JumpMeterOriginX * C.ClipX, JumpMeterOriginY * C.ClipY ); //C.DrawColor = C.MakeColor(255,255,255,255); //C.DrawTile( Texture'HudContent.Generic.HUD', JumpMeterWidth * C.ClipX, JumpMeterHeight * C.ClipY, 125, 458, 166, 53); C.DrawColor = C.MakeColor(0,0,0,150); //C.DrawTile( Texture'HudContent.Generic.HUD', JumpMeterWidth * C.ClipX, JumpMeterHeight * C.ClipY, 168, 211, 166, 44); C.DrawTile( Texture'HudContent.Generic.HUD', JumpMeterWidth * C.ClipX, JumpMeterHeight * C.ClipY, 251, 211, 83, 44); // Draw charge bars C.Style = ERenderStyle.STY_Normal; BarHeight = 0.5 * (JumpMeterHeight - (3*JumpMeterSpacing)); JumpChargeAmount = FClamp( JumpForce/MaxJumpForce, 0.0, 1.0 ); C.DrawColor = JumpMeterColor; C.SetPos( (JumpMeterOriginX+JumpMeterSpacing) * C.ClipX, (JumpMeterOriginY+JumpMeterSpacing) * C.ClipY ); C.DrawTile(JumpMeterTexture, (JumpMeterWidth-(2*JumpMeterSpacing)) * C.ClipX * JumpChargeAmount, BarHeight * C.ClipY, 0, 0, JumpMeterTexture.USize, JumpMeterTexture.VSize*JumpChargeAmount); SpinChargeAmount = FClamp( Abs(JumpSpin)/MaxJumpSpin, 0.0, 1.0 ); C.DrawColor = SpinMeterColor; C.SetPos( (JumpMeterOriginX+JumpMeterSpacing) * C.ClipX, (JumpMeterOriginY+(2*JumpMeterSpacing)+BarHeight) * C.ClipY ); C.DrawTile(JumpMeterTexture, (JumpMeterWidth-(2*JumpMeterSpacing)) * C.ClipX * SpinChargeAmount, BarHeight * C.ClipY, 0, 0, JumpMeterTexture.USize, JumpMeterTexture.VSize*SpinChargeAmount); } //if bAllowChargingJump is true, this will be called just BEFORE the vehicle does a jump simulated event Jumping() { ClientPlayForceFeedback(JumpFeedbackForce); if( JumpSound != None ) PlaySound( JumpSound,, 2.5*TransientSoundVolume ); } simulated event SetWheelsScale(float NewScale) { local int i; Super.SetWheelsScale(NewScale); if(!bAllowBigWheels) return; for(i=0; io@>@>m//----------------------------------------------------------- // //----------------------------------------------------------- class ONSWeaponPawn extends Vehicle native nativereplication; var() vector GunnerPos; var() rotator GunnerRot; var() vector FireImpulse; var() vector AltFireImpulse; var ONSWeapon Gun; var class GunClass; var ONSVehicle VehicleBase; // Effect spawned when weapon is destroyed var () class DestroyEffectClass; const FilterFrames = 5; var vector CameraHistory[FilterFrames]; var int NextHistorySlot; var bool bHistoryWarmup; var bool bHasFireImpulse; var bool bHasAltFireImpulse; var bool bCustomAiming; // If true, the weapon aiming will be controlled by setting CustomAim. var Rotator CustomAim; // Movement var float YawAccel, PitchAccel; var string DebugInfo; var bool bHasOwnHealth; // If false, damage to this pawn is done to Driver instead var bool bHasAltFire; var() name CameraBone; // Lets you make the camera relative to a bone on this actor instead of the actor itself. // Correct aim indicator var config color CrosshairColor; var config float CrosshairX, CrosshairY; var config Texture CrosshairTexture; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) replication { unreliable if (Role == ROLE_Authority) VehicleBase, Gun; reliable if (Role < ROLE_Authority) ServerChangeDriverPosition; } function AttachFlag(Actor FlagActor) { if ( VehicleBase != None ) VehicleBase.AttachFlag(FlagActor); else Super.AttachFlag(FlagActor); } function Vehicle GetMoveTargetFor(Pawn P) { if ( VehicleBase != None ) return VehicleBase; return self; } function bool HasWeapon() { return (Gun != None); } function Pawn GetAimTarget() { if ( VehicleBase != None ) return VehicleBase; return self; } function bool CanAttack(Actor Other) { if (Gun != None) return Gun.CanAttack(Other); return false; } function bool TooCloseToAttack(Actor Other) { local int NeededPitch; if (Gun == None || VSize(Location - Other.Location) > 2500) return false; Gun.CalcWeaponFire(); NeededPitch = rotator(Other.Location - Gun.WeaponFireLocation).Pitch; NeededPitch = NeededPitch & 65535; return (LimitPitch(NeededPitch) == NeededPitch); } function ChooseFireAt(Actor A) { if (!bHasAltFire) Fire(0); else if (Gun != None) { if (Gun.BestMode() == 0) Fire(0); else AltFire(0); } } function float RefireRate() { if (Gun != None) { if (bWeaponisAltFiring && bHasAltFire) return Gun.AIInfo[1].RefireRate; else return Gun.AIInfo[0].RefireRate; } return 0; } function bool IsFiring() { return (Gun != None && (bWeaponisFiring || (bWeaponisAltFiring && bHasAltFire))); } function bool NeedToTurn(vector targ) { return !(Gun != None && Gun.bCorrectAim); } function bool FireOnRelease() { if (Gun != None) { if (bWeaponisAltFiring && bHasAltFire) return Gun.AIInfo[1].bFireOnRelease; else return Gun.AIInfo[0].bFireOnRelease; } return false; } simulated function bool IndependentVehicle() { return false; } simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos) { Super.DisplayDebug(Canvas, YL, YPos); Canvas.SetDrawColor(255,0,0); Canvas.DrawText(DebugInfo); YPos += YL; YPos += YL; Canvas.SetPos(0, YPos); Canvas.SetDrawColor(0,0,255); Canvas.DrawText("-- Gun: "$Gun); YPos += YL; Canvas.SetPos(4, YPos); Gun.DisplayDebug( Canvas, YL, YPos ); Canvas.SetPos(4,YPos); DebugInfo = ""; } function BeginPlay() { Super.BeginPlay(); Gun = spawn(GunClass, self,, Location); if (Gun != None) { PitchUpLimit = Gun.PitchUpLimit; PitchDownLimit = Gun.PitchDownLimit; } } simulated function PostNetBeginPlay() { local bool OldCollideActors, OldBlockActors; Super.PostNetBeginPlay(); // We need to do this to properly initiate our skeletal mesh to collide with Karma objects if (bCollideActors) { OldCollideActors = bCollideActors; OldBlockActors = bBlockActors; GetBoneCoords(''); SetCollision(False, False); SetCollision(OldCollideActors, OldBlockActors); } TeamChanged(); } simulated function TeamChanged() { Super.TeamChanged(); if (Gun != None) Gun.SetTeam(Team); } function Vehicle GetVehicleBase() { return VehicleBase; } function AttachToVehicle(ONSVehicle VehiclePawn, name WeaponBone) { if (Level.NetMode != NM_Client) { VehicleBase = VehiclePawn; VehicleBase.AttachToBone(Gun, WeaponBone); } } simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector x, y, z; local vector VehicleZ, CamViewOffsetWorld; local float CamViewOffsetZAmount; local coords CamBoneCoords; GetAxes(CameraRotation, x, y, z); ViewActor = self; CamViewOffsetWorld = FPCamViewOffset >> CameraRotation; if(CameraBone != '' && Gun != None) { CamBoneCoords = Gun.GetBoneCoords(CameraBone); CameraLocation = CamBoneCoords.Origin + (FPCamPos >> Rotation) + CamViewOffsetWorld; if(bFPNoZFromCameraPitch) { VehicleZ = vect(0,0,1) >> Rotation; CamViewOffsetZAmount = CamViewOffsetWorld Dot VehicleZ; CameraLocation -= CamViewOffsetZAmount * VehicleZ; } } else { CameraLocation = GetCameraLocationStart() + (FPCamPos >> Rotation) + CamViewOffsetWorld; if(bFPNoZFromCameraPitch) { VehicleZ = vect(0,0,1) >> Rotation; CamViewOffsetZAmount = CamViewOffsetWorld Dot VehicleZ; CameraLocation -= CamViewOffsetZAmount * VehicleZ; } } CameraRotation = Normalize(CameraRotation + PC.ShakeRot); CameraLocation = CameraLocation + PC.ShakeOffset.X * x + PC.ShakeOffset.Y * y + PC.ShakeOffset.Z * z; } simulated function vector GetCameraLocationStart() { if (VehicleBase != None && Gun != None) return VehicleBase.GetBoneCoords(Gun.AttachmentBone).Origin; else return Super.GetCameraLocationStart(); } simulated function Destroyed() { if (Level.NetMode != NM_Client && Gun != None) Gun.Destroy(); Super.Destroyed(); } event EncroachedBy( actor Other ) { } // Keeps pawn from setting PHYS_Falling singular event BaseChange() {} function Fire(optional float F) { Super.Fire(F); if (Gun != None && PlayerController(Controller) != None) Gun.ClientStartFire(Controller, false); } function AltFire(optional float F) { Super.AltFire(F); if (!bWeaponIsFiring && Gun != None && PlayerController(Controller) != None) Gun.ClientStartFire(Controller, true); } function ClientVehicleCeaseFire(bool bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); if (Gun != None) { Gun.ClientStopFire(Controller, bWasAltFire); if (!bWasAltFire && bWeaponIsAltFiring) Gun.ClientStartFire(Controller, true); } } function VehicleCeaseFire(bool bWasAltFire) { Super.VehicleCeaseFire(bWasAltFire); if (Gun != None) { Gun.CeaseFire(Controller); } } function bool TryToDrive(Pawn P) { if (VehicleBase != None) { if (VehicleBase.NeedsFlip()) { VehicleBase.Flip(vector(P.Rotation), 1); return false; } if (P.GetTeamNum() != Team) { if (VehicleBase.Driver == None) return VehicleBase.TryToDrive(P); VehicleLocked(P); return false; } } return Super.TryToDrive(P); } function KDriverEnter(Pawn P) { local rotator NewRotation; Super.KDriverEnter(P); if (VehicleBase != None && VehicleBase.bTeamLocked && VehicleBase.bEnterringUnlocks) VehicleBase.bTeamLocked = false; Gun.bActive = True; if (!bHasOwnHealth && VehicleBase == None) { Health = Driver.Health; HealthMax = Driver.HealthMax; } if (xPawn(Driver) != None && Driver.HasUDamage()) Gun.SetOverlayMaterial(xPawn(Driver).UDamageWeaponMaterial, xPawn(Driver).UDamageTime - Level.TimeSeconds, false); NewRotation = Controller.Rotation; NewRotation.Pitch = LimitPitch(NewRotation.Pitch); SetRotation(NewRotation); Driver.bSetPCRotOnPossess = false; //so when driver gets out he'll be facing the same direction as he was inside the vehicle if (Gun != None) { Gun.NetPriority = 2.0; Gun.NetUpdateFrequency = 10; } } function PossessedBy(Controller C) { Super.PossessedBy(C); NetPriority = 1.0; } function bool KDriverLeave( bool bForceLeave ) { local Controller C; // We need to get the controller here since Super.KDriverLeave() messes with it. C = Controller; if (Super.KDriverLeave(bForceLeave) || bForceLeave) { bWeaponIsFiring = False; if (!bHasOwnHealth && VehicleBase == None) { HealthMax = default.HealthMax; Health = HealthMax; } if (C != None) { if (Gun != None && xPawn(C.Pawn) != None && C.Pawn.HasUDamage()) Gun.SetOverlayMaterial(xPawn(C.Pawn).UDamageWeaponMaterial, 0, false); C.Pawn.bSetPCRotOnPossess = C.Pawn.default.bSetPCRotOnPossess; if (Bot(C) != None) Bot(C).ClearTemporaryOrders(); } if (Gun != None) { Gun.bActive = False; Gun.FlashCount = 0; Gun.NetUpdateFrequency = Gun.default.NetUpdateFrequency; Gun.NetPriority = Gun.default.NetPriority; } return True; } else { if ( (Bot(Controller) != None) && (VehicleBase.Driver == None) ) ServerChangeDriverPosition(1); //Log("Cannot leave "$self); return False; } } function DriverDied() { if (Gun != None && xPawn(Driver) != None && Driver.HasUDamage()) Gun.SetOverlayMaterial(xPawn(Driver).UDamageWeaponMaterial, 0, false); Super.DriverDied(); } simulated function ClientKDriverEnter(PlayerController PC) { local rotator NewRotation; Super.ClientKDriverEnter(PC); NewRotation = PC.Rotation; NewRotation.Pitch = LimitPitch(NewRotation.Pitch); SetRotation(NewRotation); } simulated function ClientKDriverLeave(PlayerController PC) { if (Gun != None) { if (bWeaponisFiring) Gun.ClientStopFire(PC, false); if (bWeaponisAltFiring) Gun.ClientStopFire(PC, true); } Super.ClientKDriverLeave(PC); } function bool PlaceExitingDriver() { local int i; local vector tryPlace, Extent, HitLocation, HitNormal, ZOffset; Extent = Driver.default.CollisionRadius * vect(1,1,0); Extent.Z = Driver.default.CollisionHeight; ZOffset = Driver.default.CollisionHeight * vect(0,0,0.5); //avoid running driver over by placing in direction perpendicular to velocity if (VehicleBase != None && VSize(VehicleBase.Velocity) > 100) { tryPlace = Normal(VehicleBase.Velocity cross vect(0,0,1)) * (VehicleBase.CollisionRadius * 1.25); if (FRand() < 0.5) tryPlace *= -1; //randomly prefer other side if ( (VehicleBase.Trace(HitLocation, HitNormal, VehicleBase.Location + tryPlace + ZOffset, VehicleBase.Location + ZOffset, false, Extent) == None && Driver.SetLocation(VehicleBase.Location + tryPlace + ZOffset)) || (VehicleBase.Trace(HitLocation, HitNormal, VehicleBase.Location - tryPlace + ZOffset, VehicleBase.Location + ZOffset, false, Extent) == None && Driver.SetLocation(VehicleBase.Location - tryPlace + ZOffset)) ) return true; } for(i=0; i> VehicleBase.Rotation) + ZOffset; else if (Gun != None) tryPlace = Gun.Location + (ExitPositions[i] >> Gun.Rotation) + ZOffset; else tryPlace = Location + (ExitPositions[i] >> Rotation); } else tryPlace = ExitPositions[i]; // First, do a line check (stops us passing through things on exit). if ( bRelativeExitPos ) { if (VehicleBase != None) { if (VehicleBase.Trace(HitLocation, HitNormal, tryPlace, VehicleBase.Location + ZOffset, false, Extent) != None) continue; } else if (Trace(HitLocation, HitNormal, tryPlace, Location + ZOffset, false, Extent) != None) continue; } // Then see if we can place the player there. if ( !Driver.SetLocation(tryPlace) ) continue; return true; } return false; } simulated function AttachDriver(Pawn P) { local coords GunnerAttachmentBoneCoords; if (Gun == None) return; P.bHardAttach = True; GunnerAttachmentBoneCoords = Gun.GetBoneCoords(Gun.GunnerAttachmentBone); P.SetLocation(GunnerAttachmentBoneCoords.Origin); P.SetPhysics(PHYS_None); Gun.AttachToBone(P, Gun.GunnerAttachmentBone); P.SetRelativeLocation(DrivePos); P.SetRelativeRotation( DriveRot ); } simulated function DetachDriver(Pawn P) { if (Gun != None && P.AttachmentBone != '') Gun.DetachFromBone(P); } function UpdateRocketAcceleration(float deltaTime, float YawChange, float PitchChange) { local rotator NewRotation; NewRotation = Rotation; NewRotation.Yaw += 32.0 * deltaTime * YawChange; NewRotation.Pitch += 32.0 * deltaTime * PitchChange; NewRotation.Pitch = LimitPitch(NewRotation.Pitch); SetRotation(NewRotation); } simulated function float ChargeBar() { if (Gun != None) return Gun.ChargeBar(); return 0; } function SetTeamNum(byte T) { local byte Temp; Temp = Team; PrevTeam = T; Team = T; if (Temp != T) TeamChanged(); } function Died(Controller Killer, class damageType, vector HitLocation) { local PlayerController PC; local Controller C; if ( bDeleteMe || Level.bLevelChange ) return; // already destroyed, or level is being cleaned up if ( Level.Game.PreventDeath(self, Killer, damageType, HitLocation) ) { Health = max(Health, 1); //mutator should set this higher return; } Health = Min(0, Health); if ( Controller != None ) { C = Controller; C.WasKilledBy(Killer); Level.Game.Killed(Killer, C, self, damageType); if( C.bIsPlayer ) { PC = PlayerController(C); if ( PC != None ) ClientKDriverLeave(PC); // Just to reset HUD etc. else ClientClearController(); if ( (bRemoteControlled || bEjectDriver) && (Driver != None) && (Driver.Health > 0) ) { C.Unpossess(); C.Possess(Driver); if ( bEjectDriver ) EjectDriver(); Driver = None; } else { if (PC != None && VehicleBase != None) { PC.SetViewTarget(VehicleBase); PC.ClientSetViewTarget(VehicleBase); } C.PawnDied(self); } } else C.Destroy(); } else Level.Game.Killed(Killer, Controller(Owner), self, damageType); if ( Killer != None ) TriggerEvent(Event, self, Killer.Pawn); else TriggerEvent(Event, self, None); if ( IsHumanControlled() ) PlayerController(Controller).ForceDeathUpdate(); Destroy(); } event TakeDamage(int Damage, Pawn EventInstigator, Vector HitLocation, Vector Momentum, class DamageType) { if (bHasOwnHealth) Super.TakeDamage(Damage, EventInstigator, HitLocation, Momentum, DamageType); else if (Driver != None) { Driver.TakeDamage(Damage, EventInstigator, HitLocation, Momentum, DamageType); if (VehicleBase == None) Health = Driver.Health; } } simulated function SwitchWeapon(byte F) { if (VehicleBase != None) ServerChangeDriverPosition(F); } function ServerChangeDriverPosition(byte F) { local Pawn OldDriver, Bot; if (Driver == None || VehicleBase == None) return; if (F == 1 && (VehicleBase.Driver == None || AIController(VehicleBase.Controller) != None)) { OldDriver = Driver; //if human player wants a bot's seat, bot swaps with him if (AIController(VehicleBase.Controller) != None) { Bot = VehicleBase.Driver; VehicleBase.KDriverLeave(true); } KDriverLeave(true); if (!VehicleBase.TryToDrive(OldDriver)) { KDriverEnter(OldDriver); if (Bot != None) VehicleBase.KDriverEnter(Bot); } else if (Bot != None) TryToDrive(Bot); return; } F -= 2; if (F < VehicleBase.WeaponPawns.length && (VehicleBase.WeaponPawns[F].Driver == None || AIController(VehicleBase.WeaponPawns[F].Controller) != None)) { OldDriver = Driver; //if human player wants a bot's seat, bot swaps with him if (AIController(VehicleBase.WeaponPawns[F].Controller) != None) { Bot = VehicleBase.WeaponPawns[F].Driver; VehicleBase.WeaponPawns[F].KDriverLeave(true); } KDriverLeave(true); if (!VehicleBase.WeaponPawns[F].TryToDrive(OldDriver)) { KDriverEnter(OldDriver); if (Bot != None) VehicleBase.WeaponPawns[F].KDriverEnter(Bot); } if (Bot != None) TryToDrive(Bot); } } function bool HasUDamage() { return (Driver != None && Driver.HasUDamage()); } function int LimitPitch(int pitch) { if (VehicleBase == None || Gun == None) return Super.LimitPitch(pitch); return Gun.LimitPitch(pitch, VehicleBase.Rotation); } function bool TeamLink(int TeamNum) { if (VehicleBase != None && !bHasOwnHealth) return VehicleBase.TeamLink(TeamNum); return Super.TeamLink(TeamNum); } simulated function DrawHUD(Canvas Canvas) { local PlayerController PC; local vector CameraLocation; local rotator CameraRotation; local Actor ViewActor; if (IsLocallyControlled() && Gun != None && Gun.bCorrectAim) { Canvas.DrawColor = CrosshairColor; Canvas.DrawColor.A = 255; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY); Canvas.DrawTile(CrosshairTexture, CrosshairX*2.0+1, CrosshairY*2.0+1, 0.0, 0.0, CrosshairTexture.USize, CrosshairTexture.VSize); } PC = PlayerController(Controller); if (PC != None && !PC.bBehindView && HUDOverlay != None) { if (!Level.IsSoftwareRendering()) { CameraRotation = PC.Rotation; SpecialCalcFirstPersonView(PC, ViewActor, CameraLocation, CameraRotation); HUDOverlay.SetLocation(CameraLocation + (HUDOverlayOffset >> CameraRotation)); HUDOverlay.SetRotation(CameraRotation); Canvas.DrawActor(HUDOverlay, false, false, FClamp(HUDOverlayFOV * (PC.DesiredFOV / PC.DefaultFOV), 1, 170)); } } else ActivateOverlay(False); } simulated function PostNetReceive() { local int i; if (VehicleBase != None) { bNetNotify = false; for (i = 0; i < VehicleBase.WeaponPawns.Length; i++) if (VehicleBase.WeaponPawns[i] == self) return; VehicleBase.WeaponPawns[VehicleBase.WeaponPawns.length] = self; } } event ApplyFireImpulse(bool bAlt) { if (!bAlt) VehicleBase.KAddImpulse(FireImpulse >> Gun.WeaponFireRotation, Gun.WeaponFireLocation); else VehicleBase.KAddImpulse(AltFireImpulse >> Gun.WeaponFireRotation, Gun.WeaponFireLocation); } static function StaticPrecache(LevelInfo L) { Default.GunClass.static.StaticPrecache(L); } simulated function ProjectilePostRender2D(Projectile P, Canvas C, float ScreenLocX, float ScreenLocY); @>K O Zn)W%K RW&L w*Wa O P rW**Ww.*.U.` C%C7.XIrC.X*A.XC&CC.XaA.XC&C7.X.XW.UW G@>w//----------------------------------------------------------- // //----------------------------------------------------------- class ONSWeapon extends Actor native nativereplication abstract; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // Weapon Bone Rotation System var() name YawBone; var() float YawStartConstraint; var() float YawEndConstraint; var float YawConstraintDelta; var() name PitchBone; var() int PitchUpLimit; var() int PitchDownLimit; var rotator CurrentAim; var vector WeaponFireLocation; var rotator WeaponFireRotation; var() name WeaponFireAttachmentBone; var() name GunnerAttachmentBone; var() float WeaponFireOffset; var() float DualFireOffset; var vector WeaponOffset; var rotator LastRotation; var float RotationsPerSecond; // Bools var bool bInstantRotation; //NOTE: Gradual rotation via RotationsPerSecond still used for non-owning net clients to smooth rotation changes var bool bActive; var() bool bInstantFire; var() bool bDualIndependantTargeting; // When using a DualFireOffset each shot will be independantly targeted at the crosshair var bool bShowChargingBar; var bool bCallInstigatorPostRender; //if Instigator exists, during this actor's native PostRender(), call Instigator->PostRender() (used when weapon is visible but owner is bHidden) var bool bForceCenterAim; var() bool bAimable; var bool bDoOffsetTrace; //trace from outside vehicle's collision back towards weapon to determine firing offset var() bool bAmbientFireSound; var() bool bAmbientAltFireSound; var() bool bInheritVelocity; var bool bIsAltFire; var bool bIsRepeatingFF; var() bool bReflective; var() bool bShowAimCrosshair; // Show the crosshair that indicates whether aim is good or not var const bool bCorrectAim; // output variable - set natively - means gun can hit what controller is aiming at // Aiming var() float FireIntervalAimLock; //fraction of FireInterval/AltFireInterval during which you can't move the gun var float AimLockReleaseTime; //when this time is reached gun can move again var vector CurrentHitLocation; var float Spread; var float AimTraceRange; // Impact/Damage var vector LastHitLocation; // Location of the last hit effect var byte FlashCount; // Incremented each frame of firing var byte OldFlashCount; // Stores the last FlashCount received var byte HitCount; // Incremented each time a hit effect occurs var byte OldHitCount; // Stores the last HitCount received // Team Skins // var byte Team; var() Material RedSkin; var() Material BlueSkin; // Timing var() float FireInterval, AltFireInterval; var float FireCountdown; // Effects var() class FlashEmitterClass; var Emitter FlashEmitter; var() class EffectEmitterClass; var Emitter EffectEmitter; var() class AmbientEffectEmitterClass; var ONSWeaponAmbientEmitter AmbientEffectEmitter; // Sound var() sound FireSoundClass; var() float FireSoundVolume; var() float FireSoundRadius; var() float FireSoundPitch; var() sound AltFireSoundClass; var() float AltFireSoundVolume; var() float AltFireSoundRadius; var() sound RotateSound; var float RotateSoundThreshold; // threshold in rotator units for RotateSound to play var() float AmbientSoundScaling; // Force Feedback // var() string FireForce; var() string AltFireForce; // Instant Fire Stuff var class DamageType; var int DamageMin, DamageMax; var float TraceRange; var float Momentum; // Projectile Fire Stuff var() class ProjectileClass; var() class AltFireProjectileClass; var array Projectiles; //ignore these when doing third person aiming trace (only necessary if projectiles fired have bProjTarget==true) // camera shakes // var() vector ShakeRotMag; // how far to rot view var() vector ShakeRotRate; // how fast to rot view var() float ShakeRotTime; // how much time to rot the instigator's view var() vector ShakeOffsetMag; // max view offset vertically var() vector ShakeOffsetRate; // how fast to offset view vertically var() float ShakeOffsetTime; // how much time to offset view // AI struct native ONSWeaponAIInfo { var bool bTossed, bTrySplash, bLeadTarget, bInstantHit, bFireOnRelease; var float AimError, WarnTargetPct, RefireRate; }; var ONSWeaponAIInfo AIInfo[2]; var FireProperties SavedFireProperties[2]; //// DEBUGGING //// var string DebugInfo; replication { reliable if (bNetDirty && !bNetOwner && Role == ROLE_Authority) CurrentHitLocation, FlashCount; reliable if (bNetDirty && Role == ROLE_Authority) HitCount, LastHitLocation, bActive, bForceCenterAim, bCallInstigatorPostRender, Team; } native function int LimitPitch(int Pitch, rotator ForwardRotation, optional int WeaponYaw); simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos) { // Super.DisplayDebug(Canvas, YL, YPos); Canvas.SetDrawColor(255,255,255); Canvas.DrawText("bActive: "$bActive@"bCorrectAim: "$bCorrectAim); YPos += YL; Canvas.SetPos(4, YPos); Canvas.DrawText("DebugInfo: "$DebugInfo); } simulated function PostBeginPlay() { YawConstraintDelta = (YawEndConstraint - YawStartConstraint) & 65535; if (AltFireInterval ~= 0.0) //doesn't have an altfire { AltFireInterval = FireInterval; AIInfo[1] = AIInfo[0]; } if (bShowChargingBar && Owner != None) Vehicle(Owner).bShowChargingBar = true; //for listen/standalone clients if (Level.GRI != None && Level.GRI.WeaponBerserk > 1.0) SetFireRateModifier(Level.GRI.WeaponBerserk); } simulated function PostNetBeginPlay() { if (bInstantFire) GotoState('InstantFireMode'); else GotoState('ProjectileFireMode'); InitEffects(); MaxRange(); Super.PostNetBeginPlay(); } simulated function InitEffects() { // don't even spawn on server if (Level.NetMode == NM_DedicatedServer) return; if ( (FlashEmitterClass != None) && (FlashEmitter == None) ) { FlashEmitter = Spawn(FlashEmitterClass); FlashEmitter.SetDrawScale(DrawScale); if (WeaponFireAttachmentBone == '') FlashEmitter.SetBase(self); else AttachToBone(FlashEmitter, WeaponFireAttachmentBone); FlashEmitter.SetRelativeLocation(WeaponFireOffset * vect(1,0,0)); } if (AmbientEffectEmitterClass != none && AmbientEffectEmitter == None) { AmbientEffectEmitter = spawn(AmbientEffectEmitterClass, self,, WeaponFireLocation, WeaponFireRotation); if (WeaponFireAttachmentBone == '') AmbientEffectEmitter.SetBase(self); else AttachToBone(AmbientEffectEmitter, WeaponFireAttachmentBone); AmbientEffectEmitter.SetRelativeLocation(WeaponFireOffset * vect(1,0,0)); } } simulated function SetGRI(GameReplicationInfo GRI) { if (GRI.WeaponBerserk > 1.0) SetFireRateModifier(GRI.WeaponBerserk); } simulated function SetFireRateModifier(float Modifier) { if (FireInterval == AltFireInterval) { FireInterval = default.FireInterval / Modifier; AltFireInterval = FireInterval; } else { FireInterval = default.FireInterval / Modifier; AltFireInterval = default.AltFireInterval / Modifier; } } function SpawnHitEffects(actor HitActor, vector HitLocation, vector HitNormal); simulated event ClientSpawnHitEffects(); simulated function ShakeView() { local PlayerController P; if (Instigator == None) return; P = PlayerController(Instigator.Controller); if (P != None ) P.WeaponShakeView(ShakeRotMag, ShakeRotRate, ShakeRotTime, ShakeOffsetMag, ShakeOffsetRate, ShakeOffsetTime); } //ClientStartFire() and ClientStopFire() are only called for the client that owns the weapon (and not at all for bots) simulated function ClientStartFire(Controller C, bool bAltFire) { bIsAltFire = bAltFire; if (FireCountdown <= 0) { if (bIsRepeatingFF) { if (bIsAltFire) ClientPlayForceFeedback( AltFireForce ); else ClientPlayForceFeedback( FireForce ); } OwnerEffects(); } } simulated function ClientStopFire(Controller C, bool bWasAltFire) { if (bIsRepeatingFF) { if (bIsAltFire) StopForceFeedback( AltFireForce ); else StopForceFeedback( FireForce ); } if (Role < ROLE_Authority && AmbientEffectEmitter != None) AmbientEffectEmitter.SetEmitterStatus(false); } simulated function ClientPlayForceFeedback( String EffectName ) { local PlayerController PC; if (Instigator == None) return; PC = PlayerController(Instigator.Controller); if ( PC != None && PC.bEnableGUIForceFeedback ) { PC.ClientPlayForceFeedback( EffectName ); } } simulated function StopForceFeedback( String EffectName ) { local PlayerController PC; if (Instigator == None) return; PC = PlayerController(Instigator.Controller); if ( PC != None && PC.bEnableGUIForceFeedback ) { PC.StopForceFeedback( EffectName ); } } //do effects (muzzle flash, force feedback, etc) immediately for the weapon's owner (don't wait for replication) simulated event OwnerEffects() { if (!bIsRepeatingFF) { if (bIsAltFire) ClientPlayForceFeedback( AltFireForce ); else ClientPlayForceFeedback( FireForce ); } ShakeView(); if (Role < ROLE_Authority) { if (bIsAltFire) FireCountdown = AltFireInterval; else FireCountdown = FireInterval; AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; FlashMuzzleFlash(); if (AmbientEffectEmitter != None) AmbientEffectEmitter.SetEmitterStatus(true); // Play firing noise if (!bAmbientFireSound) { if (bIsAltFire) PlaySound(AltFireSoundClass, SLOT_None, FireSoundVolume/255.0,, AltFireSoundRadius,, false); else PlaySound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius,, false); } } } event bool AttemptFire(Controller C, bool bAltFire) { if(Role != ROLE_Authority || bForceCenterAim) return False; if (FireCountdown <= 0) { CalcWeaponFire(); if (bCorrectAim) WeaponFireRotation = AdjustAim(bAltFire); if (Spread > 0) WeaponFireRotation = rotator(vector(WeaponFireRotation) + VRand()*FRand()*Spread); DualFireOffset *= -1; Instigator.MakeNoise(1.0); if (bAltFire) { FireCountdown = AltFireInterval; AltFire(C); } else { FireCountdown = FireInterval; Fire(C); } AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; return True; } return False; } function rotator AdjustAim(bool bAltFire) { local rotator AdjustedAim, ControllerAim; local int n; if ( (Instigator == None) || (Instigator.Controller == None) ) return WeaponFireRotation; if ( bAltFire ) n = 1; if ( !SavedFireProperties[n].bInitialized ) { SavedFireProperties[n].AmmoClass = class'Ammo_Dummy'; if ( bAltFire ) SavedFireProperties[n].ProjectileClass = AltFireProjectileClass; else SavedFireProperties[n].ProjectileClass = ProjectileClass; SavedFireProperties[n].WarnTargetPct = AIInfo[n].WarnTargetPct; SavedFireProperties[n].MaxRange = MaxRange(); SavedFireProperties[n].bTossed = AIInfo[n].bTossed; SavedFireProperties[n].bTrySplash = AIInfo[n].bTrySplash; SavedFireProperties[n].bLeadTarget = AIInfo[n].bLeadTarget; SavedFireProperties[n].bInstantHit = AIInfo[n].bInstantHit; SavedFireProperties[n].bInitialized = true; } ControllerAim = Instigator.Controller.Rotation; AdjustedAim = Instigator.AdjustAim(SavedFireProperties[n], WeaponFireLocation, AIInfo[n].AimError); if (AdjustedAim == Instigator.Rotation || AdjustedAim == ControllerAim) return WeaponFireRotation; //No adjustment else { AdjustedAim.Pitch = Instigator.LimitPitch(AdjustedAim.Pitch); return AdjustedAim; } } //AI: return the best fire mode for the situation function byte BestMode() { return Rand(2); } function Fire(Controller C) { log(self$": Fire has been called outside of a state!"); } function AltFire(Controller C) { log(self$": AltFire has been called outside of a state!"); } // return false if out of range, can't see target, etc. function bool CanAttack(Actor Other) { local float Dist, CheckDist; local vector HitLocation, HitNormal, projStart; local actor HitActor; if ( (Instigator == None) || (Instigator.Controller == None) ) return false; // check that target is within range Dist = VSize(Instigator.Location - Other.Location); if (Dist > MaxRange()) return false; // check that can see target if (!Instigator.Controller.LineOfSightTo(Other)) return false; if (ProjectileClass != None) { CheckDist = FMax(CheckDist, 0.5 * ProjectileClass.Default.Speed); CheckDist = FMax(CheckDist, 300); CheckDist = FMin(CheckDist, VSize(Other.Location - Location)); } if (AltFireProjectileClass != None) { CheckDist = FMax(CheckDist, 0.5 * AltFireProjectileClass.Default.Speed); CheckDist = FMax(CheckDist, 300); CheckDist = FMin(CheckDist, VSize(Other.Location - Location)); } // check that would hit target, and not a friendly CalcWeaponFire(); projStart = WeaponFireLocation; if (bInstantFire) HitActor = Trace(HitLocation, HitNormal, Other.Location + Other.CollisionHeight * vect(0,0,0.8), projStart, true); else { // for non-instant hit, only check partial path (since others may move out of the way) HitActor = Trace(HitLocation, HitNormal, projStart + CheckDist * Normal(Other.Location + Other.CollisionHeight * vect(0,0,0.8) - Location), projStart, true); } if ( (HitActor == None) || (HitActor == Other) || (Pawn(HitActor) == None) || (Pawn(HitActor).Controller == None) || !Instigator.Controller.SameTeamAs(Pawn(HitActor).Controller) ) return true; return false; } simulated function float MaxRange() { if (bInstantFire) { if (Instigator != None && Instigator.Region.Zone != None && Instigator.Region.Zone.bDistanceFog) TraceRange = FClamp(Instigator.Region.Zone.DistanceFogEnd, 8000, default.TraceRange); else TraceRange = default.TraceRange; AimTraceRange = TraceRange; } else if ( ProjectileClass != None ) AimTraceRange = ProjectileClass.static.GetRange(); else AimTraceRange = 10000; return AimTraceRange; } state InstantFireMode { function Fire(Controller C) { FlashMuzzleFlash(); if (AmbientEffectEmitter != None) { AmbientEffectEmitter.SetEmitterStatus(true); } // Play firing noise if (bAmbientFireSound) AmbientSound = FireSoundClass; else PlayOwnedSound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius, FireSoundPitch, False); TraceFire(WeaponFireLocation, WeaponFireRotation); } function AltFire(Controller C) { } simulated event ClientSpawnHitEffects() { local vector HitLocation, HitNormal, Offset; local actor HitActor; // if standalone, already have valid HitActor and HitNormal if ( Level.NetMode == NM_Standalone ) return; Offset = 20 * Normal(WeaponFireLocation - LastHitLocation); HitActor = Trace(HitLocation, HitNormal, LastHitLocation - Offset, LastHitLocation + Offset, False); SpawnHitEffects(HitActor, LastHitLocation, HitNormal); } simulated function SpawnHitEffects(actor HitActor, vector HitLocation, vector HitNormal) { local PlayerController PC; PC = Level.GetLocalPlayerController(); if (PC != None && ((Instigator != None && Instigator.Controller == PC) || VSize(PC.ViewTarget.Location - HitLocation) < 5000)) { Spawn(class'HitEffect'.static.GetHitEffect(HitActor, HitLocation, HitNormal),,, HitLocation, Rotator(HitNormal)); if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) ) { // check for splash if ( Base != None ) { Base.bTraceWater = true; HitActor = Base.Trace(HitLocation,HitNormal,HitLocation,Location + 200 * Normal(HitLocation - Location),true); Base.bTraceWater = false; } else { bTraceWater = true; HitActor = Trace(HitLocation,HitNormal,HitLocation,Location + 200 * Normal(HitLocation - Location),true); bTraceWater = false; } if ( (FluidSurfaceInfo(HitActor) != None) || ((PhysicsVolume(HitActor) != None) && PhysicsVolume(HitActor).bWaterVolume) ) Spawn(class'BulletSplash',,,HitLocation,rot(16384,0,0)); } } } } state ProjectileFireMode { function Fire(Controller C) { SpawnProjectile(ProjectileClass, False); } function AltFire(Controller C) { if (AltFireProjectileClass == None) Fire(C); else SpawnProjectile(AltFireProjectileClass, True); } } function Projectile SpawnProjectile(class ProjClass, bool bAltFire) { local Projectile P; local ONSWeaponPawn WeaponPawn; local vector StartLocation, HitLocation, HitNormal, Extent; if (bDoOffsetTrace) { Extent = ProjClass.default.CollisionRadius * vect(1,1,0); Extent.Z = ProjClass.default.CollisionHeight; WeaponPawn = ONSWeaponPawn(Owner); if (WeaponPawn != None && WeaponPawn.VehicleBase != None) { if (!WeaponPawn.VehicleBase.TraceThisActor(HitLocation, HitNormal, WeaponFireLocation, WeaponFireLocation + vector(WeaponFireRotation) * (WeaponPawn.VehicleBase.CollisionRadius * 1.5), Extent)) StartLocation = HitLocation; else StartLocation = WeaponFireLocation + vector(WeaponFireRotation) * (ProjClass.default.CollisionRadius * 1.1); } else { if (!Owner.TraceThisActor(HitLocation, HitNormal, WeaponFireLocation, WeaponFireLocation + vector(WeaponFireRotation) * (Owner.CollisionRadius * 1.5), Extent)) StartLocation = HitLocation; else StartLocation = WeaponFireLocation + vector(WeaponFireRotation) * (ProjClass.default.CollisionRadius * 1.1); } } else StartLocation = WeaponFireLocation; P = spawn(ProjClass, self, , StartLocation, WeaponFireRotation); if (P != None) { if (bInheritVelocity) P.Velocity = Instigator.Velocity; FlashMuzzleFlash(); // Play firing noise if (bAltFire) { if (bAmbientAltFireSound) AmbientSound = AltFireSoundClass; else PlayOwnedSound(AltFireSoundClass, SLOT_None, FireSoundVolume/255.0,, AltFireSoundRadius,, false); } else { if (bAmbientFireSound) AmbientSound = FireSoundClass; else PlayOwnedSound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius,, false); } } return P; } function CeaseFire(Controller C) { FlashCount = 0; HitCount = 0; if (AmbientEffectEmitter != None) { AmbientEffectEmitter.SetEmitterStatus(false); } if (bAmbientFireSound || bAmbientAltFireSound) { AmbientSound = None; } } function WeaponCeaseFire(Controller C, bool bWasAltFire); simulated event FlashMuzzleFlash() { if (Role == ROLE_Authority) { FlashCount++; NetUpdateTime = Level.TimeSeconds - 1; } else CalcWeaponFire(); if (FlashEmitter != None) FlashEmitter.Trigger(Self, Instigator); if ( (EffectEmitterClass != None) && EffectIsRelevant(Location,false) ) EffectEmitter = spawn(EffectEmitterClass, self,, WeaponFireLocation, WeaponFireRotation); } simulated function Destroyed() { DestroyEffects(); Super.Destroyed(); } simulated function DestroyEffects() { if (FlashEmitter != None) FlashEmitter.Destroy(); if (EffectEmitter != None) EffectEmitter.Destroy(); if (AmbientEffectEmitter != None) AmbientEffectEmitter.Destroy(); } simulated function SetTeam(byte T) { Team = T; if (T == 0 && RedSkin != None) { Skins[0] = RedSkin; RepSkin = RedSkin; } else if (T == 1 && BlueSkin != None) { Skins[0] = BlueSkin; RepSkin = BlueSkin; } } /* simulated TraceFire to get precise start/end of hit */ simulated function SimulateTraceFire( out vector Start, out Rotator Dir, out vector HitLocation, out vector HitNormal ) { local Vector X, End; local Actor Other; local ONSWeaponPawn WeaponPawn; local Vehicle VehicleInstigator; if ( bDoOffsetTrace ) { WeaponPawn = ONSWeaponPawn(Owner); if ( WeaponPawn != None && WeaponPawn.VehicleBase != None ) { if ( !WeaponPawn.VehicleBase.TraceThisActor(HitLocation, HitNormal, Start, Start + vector(Dir) * (WeaponPawn.VehicleBase.CollisionRadius * 1.5))) Start = HitLocation; } else if ( !Owner.TraceThisActor(HitLocation, HitNormal, Start, Start + vector(Dir) * (Owner.CollisionRadius * 1.5))) Start = HitLocation; } X = Vector(Dir); End = Start + TraceRange * X; // skip past vehicle driver VehicleInstigator = Vehicle(Instigator); if ( VehicleInstigator != None && VehicleInstigator.Driver != None ) { VehicleInstigator.Driver.bBlockZeroExtentTraces = false; Other = Trace(HitLocation, HitNormal, End, Start, true); VehicleInstigator.Driver.bBlockZeroExtentTraces = true; } else Other = Trace(HitLocation, HitNormal, End, Start, True); if ( Other != None && Other != Instigator ) { if ( !Other.bWorldGeometry ) { if ( Vehicle(Other) != None || Pawn(Other) == None ) { LastHitLocation = HitLocation; } HitNormal = vect(0,0,0); } else { LastHitLocation = HitLocation; } } else { HitLocation = End; HitNormal = Vect(0,0,0); } } function TraceFire(Vector Start, Rotator Dir) { local Vector X, End, HitLocation, HitNormal, RefNormal; local Actor Other; local ONSWeaponPawn WeaponPawn; local Vehicle VehicleInstigator; local int Damage; local bool bDoReflect; local int ReflectNum; MaxRange(); if ( bDoOffsetTrace ) { WeaponPawn = ONSWeaponPawn(Owner); if ( WeaponPawn != None && WeaponPawn.VehicleBase != None ) { if ( !WeaponPawn.VehicleBase.TraceThisActor(HitLocation, HitNormal, Start, Start + vector(Dir) * (WeaponPawn.VehicleBase.CollisionRadius * 1.5))) Start = HitLocation; } else if ( !Owner.TraceThisActor(HitLocation, HitNormal, Start, Start + vector(Dir) * (Owner.CollisionRadius * 1.5))) Start = HitLocation; } ReflectNum = 0; while ( true ) { bDoReflect = false; X = Vector(Dir); End = Start + TraceRange * X; //skip past vehicle driver VehicleInstigator = Vehicle(Instigator); if ( ReflectNum == 0 && VehicleInstigator != None && VehicleInstigator.Driver != None ) { VehicleInstigator.Driver.bBlockZeroExtentTraces = false; Other = Trace(HitLocation, HitNormal, End, Start, true); VehicleInstigator.Driver.bBlockZeroExtentTraces = true; } else Other = Trace(HitLocation, HitNormal, End, Start, True); if ( Other != None && (Other != Instigator || ReflectNum > 0) ) { if (bReflective && Other.IsA('xPawn') && xPawn(Other).CheckReflect(HitLocation, RefNormal, DamageMin*0.25)) { bDoReflect = True; HitNormal = vect(0,0,0); } else if (!Other.bWorldGeometry) { Damage = (DamageMin + Rand(DamageMax - DamageMin)); if ( Vehicle(Other) != None || Pawn(Other) == None ) { HitCount++; LastHitLocation = HitLocation; SpawnHitEffects(Other, HitLocation, HitNormal); } Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType); HitNormal = vect(0,0,0); } else { HitCount++; LastHitLocation = HitLocation; SpawnHitEffects(Other, HitLocation, HitNormal); } } else { HitLocation = End; HitNormal = Vect(0,0,0); HitCount++; LastHitLocation = HitLocation; } SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, ReflectNum); if ( bDoReflect && ++ReflectNum < 4 ) { //Log("reflecting off"@Other@Start@HitLocation); Start = HitLocation; Dir = Rotator(RefNormal); //Rotator( X - 2.0*RefNormal*(X dot RefNormal) ); } else { break; } } NetUpdateTime = Level.TimeSeconds - 1; } function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum); simulated function CalcWeaponFire() { local coords WeaponBoneCoords; local vector CurrentFireOffset; // Calculate fire offset in world space WeaponBoneCoords = GetBoneCoords(WeaponFireAttachmentBone); CurrentFireOffset = (WeaponFireOffset * vect(1,0,0)) + (DualFireOffset * vect(0,1,0)); // Calculate rotation of the gun WeaponFireRotation = rotator(vector(CurrentAim) >> Rotation); // Calculate exact fire location WeaponFireLocation = WeaponBoneCoords.Origin + (CurrentFireOffset >> WeaponFireRotation); // Adjust fire rotation taking dual offset into account if (bDualIndependantTargeting) WeaponFireRotation = rotator(CurrentHitLocation - WeaponFireLocation); } function DoCombo(); simulated function float ChargeBar(); static function StaticPrecache(LevelInfo L); @>j>//----------------------------------------------------------- // //----------------------------------------------------------- class ONSVehicleFactory extends SVehicleFactory abstract placeable; var() float RespawnTime; var float PreSpawnEffectTime; var() bool bReverseBlueTeamDirection; var bool bActive; var bool bNeverActivate; var bool bPreSpawn; // Neither the vehicle or build effect have been spawned yet var class RedBuildEffectClass, BlueBuildEffectClass; var Emitter BuildEffect; var int TeamNum; var Vehicle LastSpawned; simulated event PostBeginPlay() { Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) VehicleClass.static.StaticPrecache(Level); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'VMParticleTextures.buildEffects.PC_buildBorderNew'); Level.AddPrecacheMaterial(Material'VMParticleTextures.buildEffects.PC_buildStreaks'); VehicleClass.static.StaticPrecache(Level); } function PostNetBeginPlay() { local GameObjective O, Best; local float BestDist, NewDist; Super.PostNetBeginPlay(); if ( !bDeleteMe && !Level.Game.IsA('ONSOnslaughtGame') ) { ForEach AllActors(class'GameObjective',O) { NewDist = VSize(Location - O.Location); if ( (Best == None) || (NewDist < BestDist) ) { Best = O; BestDist = NewDist; } } if ( Best != None ) Activate(Best.DefenderTeamIndex); } } function Activate(byte T) { if (!bNeverActivate && (!bActive || TeamNum != T)) { TeamNum = T; bActive = True; bPreSpawn = True; Timer(); } } function Deactivate() { bActive = False; } event VehicleDestroyed(Vehicle V) { Super.VehicleDestroyed(V); bPreSpawn = True; SetTimer(RespawnTime - PreSpawnEffectTime, False); } function SpawnVehicle() { local Pawn P; local bool bBlocked; foreach CollidingActors(class'Pawn', P, VehicleClass.default.CollisionRadius * 1.25) { bBlocked = true; if (PlayerController(P.Controller) != None) PlayerController(P.Controller).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 11); } if (bBlocked) SetTimer(1, false); //try again later else { if (bReverseBlueTeamDirection && ONSOnslaughtGame(Level.Game) != None && ((TeamNum == 1 && !ONSOnslaughtGame(Level.Game).bSidesAreSwitched) || (TeamNum == 0 && ONSOnslaughtGame(Level.Game).bSidesAreSwitched))) LastSpawned = spawn(VehicleClass,,, Location, Rotation + rot(0,32768,0)); else LastSpawned = spawn(VehicleClass,,, Location, Rotation); if (LastSpawned != None ) { VehicleCount++; LastSpawned.SetTeamNum(TeamNum); LastSpawned.Event = Tag; LastSpawned.ParentFactory = Self; TriggerEvent(Event, Self, LastSpawned); } } } // General purpose check to make sure there aren't any pawns in the way function bool ValidateSpawnLocation(float Radius) { local Pawn P; foreach CollidingActors(class'Pawn', P, Radius) return False; return True; } function SpawnBuildEffect() { local rotator YawRot; YawRot = Rotation; YawRot.Roll = 0; YawRot.Pitch = 0; if (TeamNum == 0) BuildEffect = spawn(RedBuildEffectClass,,, Location, YawRot); else BuildEffect = spawn(BlueBuildEffectClass,,, Location, YawRot); } function Timer() { if (bActive && Level.Game.bAllowVehicles && VehicleCount < MaxVehicleCount) { if (bPreSpawn) { bPreSpawn = False; SpawnBuildEffect(); SetTimer(PreSpawnEffectTime, False); } else SpawnVehicle(); } } // Onslaught doesn't use the trigger system event Trigger( Actor Other, Pawn EventInstigator ) { } @>W@>@>e//----------------------------------------------------------- // //----------------------------------------------------------- class ONSVehicleExplosionEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" @>^//----------------------------------------------------------- // //----------------------------------------------------------- class ONSVehicle extends SVehicle native nativereplication abstract; #exec OBJ LOAD FILE=HUDContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) //// WEAPONS //// struct native export DriverWeaponStruct { var() class WeaponClass; var() name WeaponBone; }; var(SVehicle) array DriverWeapons; var array Weapons; struct native export PassengerWeaponStruct { var() class WeaponPawnClass; var() name WeaponBone; }; var(SVehicle) array PassengerWeapons; var array WeaponPawns; var byte ActiveWeapon; var Rotator CustomAim; var bool bHasAltFire; //// TEAM STATUS //// var() Material RedSkin; var() Material BlueSkin; //// SOUNDS //// var() sound IdleSound; var() sound StartUpSound; var() sound ShutDownSound; //// FORCEFEEDBACK //// var() string StartUpForce; var() string ShutDownForce; //// PROXIMITY VIEWSHAKE //// var() float ViewShakeRadius; // Distance from vehicle origin that view starts to shake. var() rotator ViewShakeRotMag; var() float ViewShakeRotFreq; var() vector ViewShakeOffsetMag; var() float ViewShakeOffsetFreq; var float ViewShakeLastCheck; // Internal //// DAMAGE AND DESTRUCTION //// var() StaticMesh DestroyedVehicleMesh; var() class DestructionEffectClass; var() class DisintegrationEffectClass; var() float DisintegrationHealth; var() range DestructionLinearMomentum; var() range DestructionAngularMomentum; var() float TimeBetweenImpactExplosions; var() array ExplosionSounds; var() float ExplosionSoundVolume; var() float ExplosionSoundRadius; var byte ExplosionCount; var byte OldExplosionCount; var float LastVelocitySize; //internal var float LastImpactExplosionTime; var float LastCheckUpsideDownTime; var float UpsideDownDamage; var float ExplosionDamage; var float ExplosionRadius; var float ExplosionMomentum; var class ExplosionDamageType; var class DestroyedRoadKillDamageType; //damagetype for when vehicle runs over/crushes someone after being destroyed var() class DamagedEffectClass; var() float DamagedEffectScale; var() vector DamagedEffectOffset; var() float DamagedEffectHealthSmokeFactor; // Proportion of default health before thing starts smoking. var() float DamagedEffectHealthFireFactor; // Proportion of default health before thing starts burning. var() float DamagedEffectAccScale; var() float DamagedEffectFireDamagePerSec; var float DamagedEffectAccruedDamage; var ONSDamagedEffect DamagedEffect; // BOOLS // var bool bDestroyAppearance; var bool bDisintegrateVehicle; var bool bHadFire; //internal var() bool bEnableProximityViewShake; var() bool bOnlyViewShakeIfDriven; var bool bSoundsPrecached; var bool bNeverReset; var bool bEjectPassengersWhenFlipped; var bool bDriverCannotLeaveVehicle; var bool bCannotBeBased; var() vector FireImpulse; var() vector AltFireImpulse; var bool bHasFireImpulse; var bool bHasAltFireImpulse; var bool bCustomAiming; // If true, the weapon aiming will be controlled by setting CustomAim. var const bool bIsAwake; // used for replication var const bool bHasBeenAwake; var bool bAltFocalPoint; // used by AI - override AI focalpoint var vector AltFocalPoint; // EXPLOSION CAMERA SHAKES // var() vector ShakeRotMag; // how far to rot view var() vector ShakeRotRate; // how fast to rot view var() float ShakeRotTime; // how much time to rot the instigator's view var() vector ShakeOffsetMag; // max view offset vertically var() vector ShakeOffsetRate; // how fast to offset view vertically var() float ShakeOffsetTime; // how much time to offset view //// IMPACT //// struct native export ImpactInfoStruct { var actor Other; var vector Pos; var vector ImpactVel; var vector ImpactNorm; var vector ImpactAccel; }; var ImpactInfoStruct ImpactInfo; var int ImpactTicksLeft; var() float ImpactDamageTicks; var() float ImpactDamageThreshold; var() float ImpactDamageMult; var() array ImpactDamageSounds; //// SPARKS //// var() class SparkEffectClass; var() editinline ONSImpactSparks SparkEffect; var() float SparkAdvanceFactor; //// HEADLIGHTS //// var array HeadlightCorona; var() array HeadlightCoronaOffset; var() Material HeadlightCoronaMaterial; var() float HeadlightCoronaMaxSize; var ONSHeadlightProjector HeadlightProjector; var() Material HeadlightProjectorMaterial; // If null, do not create projector. var() vector HeadlightProjectorOffset; var() rotator HeadlightProjectorRotation; var() float HeadlightProjectorScale; //// DEBUGGING //// var string DebugInfo; var Sound LockedOnSound; var float ResetTime; //if vehicle has no driver, CheckReset() will be called at this time var float LastRunOverWarningTime; //last time checked for pawns in front of vehicle and warned them of their impending doom var float MinRunOverWarningAim; var bot Reservation; // bot that's about to get in this vehicle var int OldYaw; // used by AI // CORRECT AIM INDICATOR var config Color CrosshairColor; var config float CrosshairX, CrosshairY; var config Texture CrosshairTexture; replication { reliable if (bNetOwner && bNetDirty && Role == ROLE_Authority) ActiveWeapon; reliable if (bNetDirty && Role == ROLE_Authority) ExplosionCount, bDestroyAppearance, bDisintegrateVehicle; reliable if (Role == ROLE_Authority) ClientRegisterVehicleWeapon; reliable if (Role < ROLE_Authority) ServerChangeDriverPosition, ServerVerifyVehicleWeapon; } //Notify vehicle that an enemy has locked on to it event NotifyEnemyLockedOn() { local int i; Super.NotifyEnemyLockedOn(); if (LockedOnSound != None) PlaySound(LockedOnSound); for (i = 0; i < WeaponPawns.length; i++) WeaponPawns[i].NotifyEnemyLockedOn(); } event NotifyEnemyLostLock() { local int i; Super.NotifyEnemyLostLock(); for (i = 0; i < WeaponPawns.length; i++) WeaponPawns[i].NotifyEnemyLostLock(); } function bool HasWeapon() { return (ActiveWeapon < Weapons.length); } function bool CanAttack(Actor Other) { if (ActiveWeapon < Weapons.Length) return Weapons[ActiveWeapon].CanAttack(Other); return false; } function Deploy(); function MayUndeploy(); function bool TooCloseToAttack(Actor Other) { local int NeededPitch, i; local bool bControlledWeaponPawn; if (VSize(Location - Other.Location) > 2500) return false; if (!HasWeapon()) { if (WeaponPawns.length == 0) return false; for (i = 0; i < WeaponPawns.length; i++) if (WeaponPawns[i].Controller != None) { bControlledWeaponPawn = true; if (!WeaponPawns[i].TooCloseToAttack(Other)) return false; } if (!bControlledWeaponPawn) return false; return true; } Weapons[ActiveWeapon].CalcWeaponFire(); NeededPitch = rotator(Other.Location - Weapons[ActiveWeapon].WeaponFireLocation).Pitch; NeededPitch = NeededPitch & 65535; return (LimitPitch(NeededPitch) != NeededPitch); } function ChooseFireAt(Actor A) { if (!bHasAltFire) Fire(0); else if (ActiveWeapon < Weapons.length) { if (Weapons[ActiveWeapon].BestMode() == 0) Fire(0); else AltFire(0); } } function float RefireRate() { if (ActiveWeapon < Weapons.length) { if (bWeaponisAltFiring && bHasAltFire) return Weapons[ActiveWeapon].AIInfo[1].RefireRate; else return Weapons[ActiveWeapon].AIInfo[0].RefireRate; } return 0; } function bool IsFiring() { return (ActiveWeapon < Weapons.length && (bWeaponisFiring || (bWeaponisAltFiring && bHasAltFire))); } function bool NeedToTurn(vector targ) { return !(ActiveWeapon < Weapons.length && Weapons[ActiveWeapon].bCorrectAim); } function bool FireOnRelease() { if (ActiveWeapon < Weapons.length) { if (bWeaponisAltFiring && bHasAltFire) return Weapons[ActiveWeapon].AIInfo[1].bFireOnRelease; else return Weapons[ActiveWeapon].AIInfo[0].bFireOnRelease; } return false; } function float ModifyThreat(float current, Pawn Threat) { if (Threat.bCanFly && ActiveWeapon < Weapons.length && !Weapons[ActiveWeapon].AIInfo[0].bInstantHit) return current - 3; return current; } function bool ChangedReservation(Pawn P) { if ( Level.Game.JustStarted(20) && (Reservation != None) && (Reservation != P.Controller) ) { if ( (Reservation.RouteGoal == Self) && (Reservation.Pawn != None) && (VSize(Reservation.Pawn.Location - Location) <= VSize(P.Location - Location)) ) { return true; } Reservation = Bot(P.Controller); return false; } return false; } function float ReservationCostMultiplier() { if ( (Reservation == None) || (Reservation.Pawn == None) ) return 1.0; if ( (Reservation.MoveTarget == self) && Reservation.InLatentExecution(Reservation.LATENT_MOVETOWARD) ) return 0; return 0.25; } function float NewReservationCostMultiplier(Pawn P) { if ( Reservation == P.Controller ) return 1.0; if ( Level.Game.JustStarted(20) && (Reservation != None) && (Reservation.Pawn != None) && (VSize(Reservation.Pawn.Location - Location) <= VSize(P.Location - Location)) ) { return 0; } return ReservationCostMultiplier(); } function bool SpokenFor(Controller C) { local Bot B; if ( Reservation == None ) return false; if ( (Reservation.Pawn == None) || (Vehicle(Reservation.Pawn) != None) ) { Reservation = None; return false; } if ( ((Reservation.RouteGoal != self) && (Reservation.MoveTarget != self)) || !Reservation.InLatentExecution(Reservation.LATENT_MOVETOWARD) ) { Reservation = None; return false; } if ( !Reservation.SameTeamAs(C) ) return false; B = Bot(C); if ( B == None ) return true; if ( WeaponPawns.Length > 0 ) return ( B.Squad != Reservation.Squad ); if( Level.Game.JustStarted(20) ) { if ( VSize(Reservation.Pawn.Location - Location) > VSize(C.Pawn.Location - Location) ) return false; } return true; } function SetReservation(controller C) { if ( !SpokenFor(C) ) Reservation = Bot(C); } function Vehicle OpenPositionFor(Pawn P) { local int i; if ( Level.Game.JustStarted(20) ) { if ( (Reservation != None) && (Reservation != P.Controller) && (Reservation.RouteGoal == Self) && (Reservation.Pawn != None) && (VSize(Reservation.Pawn.Location - Location) <= VSize(P.Location - Location)) ) { for ( i=0; i DM_Low && SparkEffectClass != None) { SparkEffect = spawn( SparkEffectClass, self,, Location); } if(Level.NetMode != NM_DedicatedServer && Level.bUseHeadlights && !(Level.bDropDetail || (Level.DetailMode == DM_Low))) { HeadlightCorona.Length = HeadlightCoronaOffset.Length; for(i=0; i> Rotation) ); HeadlightCorona[i].SetBase(self); HeadlightCorona[i].SetRelativeRotation(rot(0,0,0)); HeadlightCorona[i].Skins[0] = HeadlightCoronaMaterial; HeadlightCorona[i].ChangeTeamTint(Team); HeadlightCorona[i].MaxCoronaSize = HeadlightCoronaMaxSize * Level.HeadlightScaling; } if(HeadlightProjectorMaterial != None && Level.DetailMode == DM_SuperHigh) { HeadlightProjector = spawn( class'ONSHeadlightProjector', self,, Location + (HeadlightProjectorOffset >> Rotation) ); HeadlightProjector.SetBase(self); HeadlightProjector.SetRelativeRotation( HeadlightProjectorRotation ); HeadlightProjector.ProjTexture = HeadlightProjectorMaterial; HeadlightProjector.SetDrawScale(HeadlightProjectorScale); HeadlightProjector.CullDistance = ShadowCullDistance; } } SetTeamNum(Team); TeamChanged(); } simulated function ClientRegisterVehicleWeapon(ONSWeapon W, int Index) { if (W == None) ServerVerifyVehicleWeapon(Index); else Weapons[Index] = W; } function ServerVerifyVehicleWeapon(int Index) { if (Index < Weapons.length && Weapons[Index] != None) ClientRegisterVehicleWeapon(Weapons[Index], Index); } function Vehicle FindEntryVehicle(Pawn P) { local int x; local float Dist, ClosestDist; local ONSWeaponPawn ClosestWeaponPawn; local Bot B; local Vehicle VehicleGoal; //bots know what they want B = Bot(P.Controller); if (B != None) { VehicleGoal = Vehicle(B.RouteGoal); if (VehicleGoal == None) return None; if (VehicleGoal == self) { if (Driver == None) return self; return None; } for (x = 0; x < WeaponPawns.length; x++) if (VehicleGoal == WeaponPawns[x]) { if (WeaponPawns[x].Driver == None) return WeaponPawns[x]; if (Driver == None) return self; return None; } return None; } // Always go with driver's seat if no driver if (Driver == None) { Dist = VSize(P.Location - (Location + (EntryPosition >> Rotation))); if (Dist < EntryRadius) return self; for (x = 0; x < WeaponPawns.length; x++) { Dist = VSize(P.Location - (WeaponPawns[x].Location + (WeaponPawns[x].EntryPosition >> Rotation))); if (Dist < WeaponPawns[x].EntryRadius) return self; } return None; } // Check WeaponPawns to see if we are in radius ClosestDist = 100000.0; for (x = 0; x < WeaponPawns.length; x++) { Dist = VSize(P.Location - (WeaponPawns[x].Location + (WeaponPawns[x].EntryPosition >> Rotation))); if (Dist < WeaponPawns[x].EntryRadius && Dist < ClosestDist) { // WeaponPawn is within radius ClosestDist = Dist; ClosestWeaponPawn = WeaponPawns[x]; } } if (ClosestWeaponPawn != None || VSize(P.Location - (Location + (EntryPosition >> Rotation))) < EntryRadius) { // WeaponPawn slot is closest if (ClosestWeaponPawn != None && ClosestWeaponPawn.Driver == None) return ClosestWeaponPawn; // If closest WeaponPawn slot is open we try it else // Otherwise we try to find another open WeaponPawn slot { for (x = 0; x < WeaponPawns.length; x++) { if (WeaponPawns[x].Driver == None) return WeaponPawns[x]; } } } // No slots in range return None; } function bool TryToDrive(Pawn P) { local int x; if (FlipTimeLeft > 0) return false; if (NeedsFlip()) { Flip(vector(P.Rotation), 1); return false; } //don't allow vehicle to be stolen when somebody is in a turret if (!bTeamLocked && P.GetTeamNum() != Team) for (x = 0; x < WeaponPawns.length; x++) if (WeaponPawns[x].Driver != None) { VehicleLocked(P); return false; } return Super.TryToDrive(P); } function KDriverEnter(Pawn p) { local int x; ResetTime = Level.TimeSeconds - 1; Instigator = self; super.KDriverEnter( P ); if ( Weapons.Length > 0 ) Weapons[ActiveWeapon].bActive = True; if ( IdleSound != None ) AmbientSound = IdleSound; if ( StartUpSound != None ) PlaySound(StartUpSound, SLOT_None, 1.0); if (xPawn(Driver) != None && Driver.HasUDamage()) for (x = 0; x < Weapons.length; x++) Weapons[x].SetOverlayMaterial(xPawn(Driver).UDamageWeaponMaterial, xPawn(Driver).UDamageTime - Level.TimeSeconds, false); Driver.bSetPCRotOnPossess = false; //so when driver gets out he'll be facing the same direction as he was inside the vehicle for (x = 0; x < Weapons.length; x++) { if (Weapons[x] == None) { Weapons.Remove(x, 1); x--; } else { Weapons[x].NetUpdateFrequency = 20; ClientRegisterVehicleWeapon(Weapons[x], x); } } } function bool KDriverLeave(bool bForceLeave) { local Controller C; local int x; if (bDriverCannotLeaveVehicle) { if (FlipTimeLeft > 0) return False; if (NeedsFlip()) { Flip(vector(Rotation + rot(0,16384,0)), 1); return False; } return False; } // We need to get the controller here since Super.KDriverLeave() messes with it. C = Controller; if ( Super.KDriverLeave(bForceLeave) || bForceLeave ) { if (C != None) { if (xPawn(C.Pawn) != None && C.Pawn.HasUDamage()) for (x = 0; x < Weapons.length; x++) Weapons[x].SetOverlayMaterial(xPawn(C.Pawn).UDamageWeaponMaterial, 0, false); C.Pawn.bSetPCRotOnPossess = C.Pawn.default.bSetPCRotOnPossess; Instigator = C.Pawn; //so if vehicle continues on and runs someone over, the appropriate credit is given } for (x = 0; x < Weapons.length; x++) { Weapons[x].FlashCount = 0; Weapons[x].NetUpdateFrequency = Weapons[x].default.NetUpdateFrequency; } return True; } else return False; } function DriverDied() { local int x; if (xPawn(Driver) != None && Driver.HasUDamage()) for (x = 0; x < Weapons.length; x++) Weapons[x].SetOverlayMaterial(xPawn(Driver).UDamageWeaponMaterial, 0, false); Super.DriverDied(); } function SetActiveWeapon(int i) { Weapons[ActiveWeapon].bActive = False; ActiveWeapon = i; Weapons[ActiveWeapon].bActive = True; PitchUpLimit = Weapons[ActiveWeapon].PitchUpLimit; PitchDownLimit = Weapons[ActiveWeapon].PitchDownLimit; } event VehicleLocked( Pawn P ) { P.ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 4); } // DriverLeft() called by KDriverLeave() function DriverLeft() { if (ActiveWeapon < Weapons.Length) { Weapons[ActiveWeapon].bActive = False; Weapons[ActiveWeapon].AmbientSound = None; } if (AmbientSound != None) AmbientSound = None; if (ShutDownSound != None) PlaySound(ShutDownSound, SLOT_None, 1.0); if (!bNeverReset && ParentFactory != None && (VSize(Location - ParentFactory.Location) > 5000.0 || !FastTrace(ParentFactory.Location, Location))) { if (bKeyVehicle) ResetTime = Level.TimeSeconds + 15; else ResetTime = Level.TimeSeconds + 30; } Super.DriverLeft(); } //Vehicle has been in the middle of nowhere with no driver for a while, so consider resetting it event CheckReset() { local Pawn P; if ( bKeyVehicle && IsVehicleEmpty() ) { Died(None, class'DamageType', Location); return; } if ( !IsVehicleEmpty() ) { ResetTime = Level.TimeSeconds + 10; return; } foreach CollidingActors(class 'Pawn', P, 2500.0) { if (P.Controller != none && P != self && P.GetTeamNum() == GetTeamNum() && FastTrace(P.Location + P.CollisionHeight * vect(0,0,1), Location + CollisionHeight * vect(0,0,1))) { ResetTime = Level.TimeSeconds + 10; return; } } //if factory is active, we want it to spawn new vehicle NOW if ( ParentFactory != None ) { ParentFactory.VehicleDestroyed(self); ParentFactory.Timer(); ParentFactory = None; //so doesn't call ParentFactory.VehicleDestroyed() again in Destroyed() } Destroy(); } simulated function int NumPassengers() { local int i, num; if ( Driver != None ) num = 1; for (i=0; i damageType, vector HitLocation) { local int x; local PlayerController PC; local Controller C; if ( bDeleteMe || Level.bLevelChange || bVehicleDestroyed) return; // already destroyed, or level is being cleaned up bVehicleDestroyed = True; if ( Physics != PHYS_Karma ) { super.Died(Killer, damageType, HitLocation); return; } if ( Level.Game.PreventDeath(self, Killer, damageType, HitLocation) ) { Health = max(Health, 1); //mutator should set this higher return; } Health = Min(0, Health); if ( Controller != None ) { C = Controller; C.WasKilledBy(Killer); Level.Game.Killed(Killer, C, self, damageType); if( C.bIsPlayer ) { PC = PlayerController(C); if ( PC != None ) ClientKDriverLeave(PC); // Just to reset HUD etc. else ClientClearController(); if ( (bRemoteControlled || bEjectDriver) && (Driver != None) && (Driver.Health > 0) ) { C.Unpossess(); C.Possess(Driver); if ( bEjectDriver ) EjectDriver(); Driver = None; } else C.PawnDied(self); } else C.Destroy(); if ( Driver != None ) { if ( !bRemoteControlled && !bEjectDriver ) { if (!bDrawDriverInTP && PlaceExitingDriver()) { Driver.StopDriving(self); Driver.DrivenVehicle = self; } Driver.TearOffMomentum = Velocity * 0.25; Driver.Died(Controller, class'DamRanOver', Driver.Location); } else { if ( bEjectDriver ) EjectDriver(); else KDriverLeave( false ); } } bDriving = False; } else Level.Game.Killed(Killer, Controller(Owner), self, damageType); if ( Killer != None ) { TriggerEvent(Event, self, Killer.Pawn); Instigator = Killer.Pawn; //so if the dead vehicle crushes somebody the vehicle's killer gets the credit } else TriggerEvent(Event, self, None); RanOverDamageType = DestroyedRoadKillDamageType; CrushedDamageType = DestroyedRoadKillDamageType; if ( IsHumanControlled() ) PlayerController(Controller).ForceDeathUpdate(); for (x = 0; x < WeaponPawns.length; x++) { if ( bRemoteControlled || bEjectDriver ) { if ( bEjectDriver ) WeaponPawns[x].EjectDriver(); else WeaponPawns[x].KDriverLeave( false ); } WeaponPawns[x].Died(Killer, damageType, HitLocation); } WeaponPawns.length = 0; if (ParentFactory != None) { ParentFactory.VehicleDestroyed(self); ParentFactory = None; } GotoState('VehicleDestroyed'); } simulated function Destroyed() { local int i; Super.Destroyed(); // Destroy the weapons if (Role == ROLE_Authority) { for(i=0;i DamageType) { if (UpsideDownDamage == 0 && DamageType != class'DamTypeONSVehicle' && NeedsFlip()) Damage = Health; Super.TakeDamage(Damage, instigatedBy, Hitlocation, Momentum, damageType); } function DriverRadiusDamage(float DamageAmount, float DamageRadius, Controller EventInstigator, class DamageType, float Momentum, vector HitLocation) { local int i; Super.DriverRadiusDamage(DamageAmount, DamageRadius, EventInstigator, DamageType, Momentum, HitLocation); for (i = 0; i < WeaponPawns.length; i++) if (!WeaponPawns[i].bCollideActors) WeaponPawns[i].DriverRadiusDamage(DamageAmount, DamageRadius, EventInstigator, DamageType, Momentum, HitLocation); } function Fire(optional float F) { Super.Fire(F); if (ActiveWeapon < Weapons.length && PlayerController(Controller) != None) Weapons[ActiveWeapon].ClientStartFire(Controller, false); } function AltFire(optional float F) { Super.AltFire(F); if (!bWeaponIsFiring && ActiveWeapon < Weapons.length && PlayerController(Controller) != None) Weapons[ActiveWeapon].ClientStartFire(Controller, true); } function ClientVehicleCeaseFire(bool bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); if (ActiveWeapon < Weapons.length) { Weapons[ActiveWeapon].ClientStopFire(Controller, bWasAltFire); if (!bWasAltFire && bWeaponIsAltFiring) Weapons[ActiveWeapon].ClientStartFire(Controller, true); } } event TakeImpactDamage(float AccelMag) { local int Damage; Damage = int(AccelMag * ImpactDamageModifier()); TakeDamage(Damage, Self, ImpactInfo.Pos, vect(0,0,0), class'DamTypeONSVehicle'); //FIXME - Scale sound volume to damage amount if (ImpactDamageSounds.Length > 0) PlaySound(ImpactDamageSounds[Rand(ImpactDamageSounds.Length-1)],,TransientSoundVolume*2.5); if (Health < 0 && (Level.TimeSeconds - LastImpactExplosionTime) > TimeBetweenImpactExplosions) { VehicleExplosion(Normal(ImpactInfo.ImpactNorm), 0.5); LastImpactExplosionTime = Level.TimeSeconds; } if ( (Controller != None) && (KarmaBoostDest(Controller.MoveTarget) != None) && Controller.InLatentExecution(Controller.LATENT_MOVETOWARD) ) Controller.MoveTimer = -1; } function float ImpactDamageModifier() { return ImpactDamageMult; } event KImpact(actor Other, vector Pos, vector ImpactVel, vector ImpactNorm) { if (Role == ROLE_Authority) { ImpactInfo.Other = Other; ImpactInfo.Pos = Pos; ImpactInfo.ImpactVel = ImpactVel; ImpactInfo.ImpactNorm = ImpactNorm; ImpactInfo.ImpactAccel = KParams.KAcceleration; ImpactTicksLeft = ImpactDamageTicks; } } simulated function float ChargeBar() { if (ActiveWeapon < Weapons.length) return Weapons[ActiveWeapon].ChargeBar(); return 0; } // AI hint function bool FastVehicle() { return false; } function bool IsDeployed() { return false; } function SetTeamNum(byte T) { local byte Temp; local int x; Temp = Team; PrevTeam = T; Team = T; if ( Temp != T ) TeamChanged(); for (x = 0; x < WeaponPawns.length; x++) WeaponPawns[x].SetTeamNum(T); } simulated function SwitchWeapon(byte F) { ServerChangeDriverPosition(F); } function ServerChangeDriverPosition(byte F) { local Pawn OldDriver, Bot; if (Driver == None) return; F -= 2; if (F < WeaponPawns.length && (WeaponPawns[F].Driver == None || AIController(WeaponPawns[F].Controller) != None)) { OldDriver = Driver; //if human player wants a bot's seat, bot swaps with him if (AIController(WeaponPawns[F].Controller) != None) { Bot = WeaponPawns[F].Driver; WeaponPawns[F].KDriverLeave(true); } KDriverLeave(true); if (!WeaponPawns[F].TryToDrive(OldDriver)) { KDriverEnter(OldDriver); if (Bot != None) WeaponPawns[F].KDriverEnter(Bot); } else if (Bot != None) TryToDrive(Bot); } } function bool HasUDamage() { return (Driver != None && Driver.HasUDamage()); } event ApplyFireImpulse(bool bAlt) { if (!bAlt) KAddImpulse(FireImpulse >> Weapons[ActiveWeapon].WeaponFireRotation, Weapons[ActiveWeapon].WeaponFireLocation); else KAddImpulse(AltFireImpulse >> Weapons[ActiveWeapon].WeaponFireRotation, Weapons[ActiveWeapon].WeaponFireLocation); } simulated event DestroyAppearance() { local int i; local KarmaParams KP; // For replication bDestroyAppearance = True; // Put brakes on Throttle = 0; Steering = 0; Rise = 0; // Destroy the weapons if (Role == ROLE_Authority) { for(i=0;i 0) { SoundNum = Rand(ExplosionSounds.Length); PlaySound(ExplosionSounds[SoundNum], SLOT_None, ExplosionSoundVolume*TransientSoundVolume,, ExplosionSoundRadius); } if (bFinal) { if (Level.NetMode != NM_DedicatedServer) DestructionEffect = spawn(DisintegrationEffectClass,,, Location, Rotation); bHidden = True; GotoState('VehicleDisintegrated'); } else { if (Level.NetMode != NM_DedicatedServer) { DestructionEffect = spawn(DestructionEffectClass, self); DestructionEffect.SetBase(self); } } } state VehicleDestroyed { ignores Tick; function CallDestroy() { Destroy(); } function Died(Controller Killer, class damageType, vector HitLocation) { } Begin: DestroyAppearance(); VehicleExplosion(vect(0,0,1), 1.0); sleep(9.0); CallDestroy(); } state VehicleDisintegrated { ignores Tick; function CallDestroy() { Destroy(); } function Died(Controller Killer, class damageType, vector HitLocation) { } Begin: sleep(0.25); CallDestroy(); } simulated event SVehicleUpdateParams() { local int i; Super.SVehicleUpdateParams(); // This code just for making it easy to position coronas etc. if(Level.NetMode != NM_DedicatedServer) { for(i=0; i> Rotation) ); HeadlightCorona[i].SetBase(self); HeadlightCorona[i].Skins[0] = HeadlightCoronaMaterial; HeadlightCorona[i].MaxCoronaSize = HeadlightCoronaMaxSize * Level.HeadlightScaling; } if(HeadlightProjector != None) { HeadlightProjector.SetBase(None); HeadlightProjector.SetLocation( Location + (HeadlightProjectorOffset >> Rotation) ); HeadlightProjector.SetBase(self); HeadlightProjector.SetRelativeRotation( HeadlightProjectorRotation ); HeadlightProjector.ProjTexture = HeadlightProjectorMaterial; HeadlightProjector.SetDrawScale(HeadlightProjectorScale); } if(DamagedEffect != None) { DamagedEffect.SetBase(None); DamagedEffect.SetLocation( Location + (DamagedEffectOffset >> Rotation) ); DamagedEffect.SetBase(self); DamagedEffect.SetEffectScale(DamagedEffectScale); } } } function int LimitPitch(int pitch) { if (ActiveWeapon >= Weapons.length) return Super.LimitPitch(pitch); return Weapons[ActiveWeapon].LimitPitch(pitch, Rotation); } function ServerPlayHorn(int HornIndex) { local int i, NumPositions; local Pawn P; Super.ServerPlayHorn(HornIndex); if (HornIndex > 0 || PlayerController(Controller) == None) return; for (i = 0; i < WeaponPawns.length; i++) if (WeaponPawns[i].Driver == None) { NumPositions++; break; } if (NumPositions > 0) foreach VisibleCollidingActors(class'Pawn', P, TransientSoundRadius) if (Bot(P.Controller) != None && Vehicle(P) == None) { Bot(P.Controller).SetTemporaryOrders('Follow', Controller); NumPositions--; if (NumPositions == 0) break; } } simulated function DrawHUD(Canvas Canvas) { local PlayerController PC; local vector CameraLocation; local rotator CameraRotation; local Actor ViewActor; if (IsLocallyControlled() && ActiveWeapon < Weapons.length && Weapons[ActiveWeapon] != None && Weapons[ActiveWeapon].bShowAimCrosshair && Weapons[ActiveWeapon].bCorrectAim) { Canvas.DrawColor = CrosshairColor; Canvas.DrawColor.A = 255; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY); Canvas.DrawTile(CrosshairTexture, CrosshairX*2.0+1, CrosshairY*2.0+1, 0.0, 0.0, CrosshairTexture.USize, CrosshairTexture.VSize); } PC = PlayerController(Controller); if (PC != None && !PC.bBehindView && HUDOverlay != None) { if (!Level.IsSoftwareRendering()) { CameraRotation = PC.Rotation; SpecialCalcFirstPersonView(PC, ViewActor, CameraLocation, CameraRotation); HUDOverlay.SetLocation(CameraLocation + (HUDOverlayOffset >> CameraRotation)); HUDOverlay.SetRotation(CameraRotation); Canvas.DrawActor(HUDOverlay, false, false, FClamp(HUDOverlayFOV * (PC.DesiredFOV / PC.DefaultFOV), 1, 170)); } } else ActivateOverlay(False); } function PlayHit(float Damage, Pawn InstigatedBy, vector HitLocation, class damageType, vector Momentum) { local int i; Super.PlayHit(Damage, InstigatedBy, HitLocation, damageType, Momentum); for (i = 0; i < WeaponPawns.length; i++) if (!WeaponPawns[i].bHasOwnHealth && WeaponPawns[i].Controller != None) WeaponPawns[i].Controller.NotifyTakeHit(InstigatedBy, HitLocation, Damage, damageType, Momentum); } function array GetTurrets() { return WeaponPawns; } simulated function PrecacheAnnouncer(AnnouncerVoice V, bool bRewardSounds) { if (bRewardSounds && !bSoundsPrecached) { V.PrecacheSound('Pancake'); V.PrecacheSound('Road_Kill'); V.PrecacheSound('Vehicular_manslaughter'); V.PrecacheSound('Hit_and_run'); V.PrecacheSound('Car_jacked'); V.PrecacheSound('Hijacked'); V.PrecacheSound('RoadRampage'); V.PrecacheSound('EagleEye'); V.PrecacheSound('top_gun'); V.PrecacheSound('DareDevil'); bSoundsPrecached = true; } } static function StaticPrecache(LevelInfo L) { local int i; for(i=0;i DamageType) { if (ResetTime-Level.TimeSeconds<10.0) ResetTime = Level.TimeSeconds+10.0; return super.HealDamage(Amount, Healer, DamageType); } @>`p75.p' G@>Z6p)&a K$O&( G@> bFS^[9:9:$a a$ D (^! G@>s class ONSTurretController extends TurretController; function Possess(Pawn aPawn) { Super.Possess(aPawn); if (ONSWeaponPawn(aPawn) != None && ONSWeaponPawn(aPawn).Gun != None) ONSWeaponPawn(aPawn).Gun.bActive = true; } function bool SameTeamAs(Controller C) { if (ONSStationaryWeaponPawn(Pawn) == None || ONSStationaryWeaponPawn(Pawn).bPowered) return Super.SameTeamAs(C); return true; //don't shoot at anybody when unpowered } state Engaged { function BeginState() { Focus = Enemy; Target = Enemy; bFire = 1; Pawn.Fire(0); } } State WaitForTarget { function BeginState() { Target = Enemy; bFire = 1; Pawn.Fire(0); } } @>Yclass ONSTurretBeamEffectBlue extends ONSTurretBeamEffect; simulated function SpawnEffects(vector HitLocation, vector HitNormal) { local rotator HitRotation; local PlayerController PC; local bool bFogDist; HitRotation = rotator(HitNormal); PC = Level.GetLocalPlayerController(); if ( !PC.BeyondViewDistance(HitLocation, 0) ) { bFogDist = true; Spawn(class'ShockImpactFlare',,, HitLocation, HitRotation); Spawn(class'ShockExplosionCore',,, HitLocation+HitNormal*8, HitRotation); } if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 4000) ) { Emitters[2].Disabled = true; Emitters[3].Disabled = true; Emitters[4].Disabled = true; } if ( bFogDist && !PC.BeyondViewDistance(HitLocation, 4000) ) { Spawn(class'ShockImpactRing',,, HitLocation, HitRotation); Spawn(class'ShockImpactScorch',,, HitLocation, rotator(-HitNormal)); } } @>WA//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTreadCraft extends ONSVehicle abstract native nativereplication; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var array ThrusterOffsets; var() float HoverSoftness; var() float HoverPenScale; var() float HoverCheckDist; var() float UprightStiffness; var() float UprightDamping; var() float MaxThrust; var() float MaxSteerTorque; var() float ForwardDampFactor; var() float TurnDampFactor; var() float LateralDampFactor; var() float ParkingDampFactor; var() float SteerDampFactor; var() float PitchTorqueFactor; var() float PitchDampFactor; var() float BankTorqueFactor; var() float BankDampFactor; var() float InvertSteeringThrottleThreshold; // MPH meter var material MPHMeterMaterial; var() float MPHMeterPosX; var() float MPHMeterPosY; var() float MPHMeterScale; var() float MPHMeterSizeY; // Internal var float BikeMPH; var float OutputThrust; var float OutputTurn; // Replicated struct native TreadCraftState { var vector ChassisPosition; var Quat ChassisQuaternion; var vector ChassisLinVel; var vector ChassisAngVel; var byte ServerThrust; var byte ServerTurn; var int ServerViewPitch; var int ServerViewYaw; }; var TreadCraftState TreadState, OldTreadState; var KRigidBodyState ChassisState; var bool bNewTreadState; replication { reliable if (Role == ROLE_Authority) TreadState; } simulated event bool KUpdateState(out KRigidBodyState newState) { // This should never get called on the server - but just in case! if(Role == ROLE_Authority || !bNewTreadState) return false; newState = ChassisState; bNewTreadState = false; return true; //return false; } simulated function PostNetBeginPlay() { local vector RotX, RotY, RotZ; local KarmaParams kp; local KRepulsor rep; local int i; GetAxes(Rotation,RotX,RotY,RotZ); // Spawn and assign 'repulsors' to hold bike off the ground kp = KarmaParams(KParams); kp.Repulsors.Length = ThrusterOffsets.Length; for(i=0;iwclass ONSTeamAI extends TeamAI; var ONSPowerCore FinalCore; //this team's main powercore var bool bAllNodesTaken; function Reset() { Super.Reset(); bAllNodesTaken = false; } function SetObjectiveLists() { local GameObjective O; local ONSPowerCore Core; Super.SetObjectiveLists(); for (O = Objectives; O != None; O = O.NextObjective) { Core = ONSPowerCore(O); if (Core != None && Core.bFinalCore && Core.CoreStage == 0 && Core.DefenderTeamIndex == Team.TeamIndex) { FinalCore = Core; break; } } if (FinalCore == None) warn("Couldn't find PowerCore!"); } function ReAssessStrategy() { local GameObjective O; if (FreelanceSquad == None) return; if (FinalCore == None || ONSTeamAI(EnemyTeam.AI).FinalCore == None) { Super.ReAssessStrategy(); return; } if ( FinalCore.PoweredBy(EnemyTeam.TeamIndex) || ONSTeamAI(EnemyTeam.AI).FinalCore.PoweredBy(Team.TeamIndex) || (Level.Game.bOverTime && FinalCore.Health < ONSTeamAI(EnemyTeam.AI).FinalCore.Health) ) { FreelanceSquad.bFreelanceAttack = true; FreelanceSquad.bFreelanceDefend = false; O = GetPriorityAttackObjectiveFor(FreelanceSquad); } else if (Level.Game.bOverTime && FinalCore.Health > ONSTeamAI(EnemyTeam.AI).FinalCore.Health) { FreelanceSquad.bFreelanceAttack = false; FreelanceSquad.bFreelanceDefend = true; O = GetLeastDefendedObjective(); } else { FreelanceSquad.bFreelanceAttack = false; FreelanceSquad.bFreelanceDefend = false; O = GetPriorityFreelanceObjective(); } if ( (O != None) && (O != FreelanceSquad.SquadObjective) ) FreelanceSquad.SetObjective(O,true); } function CriticalObjectiveWarning(GameObjective AttackedObjective, Pawn EventInstigator) { local SquadAI S; local Bot M; local bool bFoundDefense; for (S = Squads; S != None; S = S.NextSquad) if (S.SquadObjective == AttackedObjective) { bFoundDefense = true; if ( EventInstigator != None ) { S.CriticalObjectiveWarning(EventInstigator); for (M = S.SquadMembers; M != None; M = M.NextSquadMember) if ( (M.Enemy == None || M.Enemy == EventInstigator) && Vehicle(M.Pawn) != None && M.Pawn.bStationary && !FastTrace(EventInstigator.Location + EventInstigator.CollisionHeight * vect(0,0,1), M.Pawn.Location) ) { Vehicle(M.Pawn).KDriverLeave(false); M.WhatToDoNext(67); } } } if ( !bFoundDefense ) { for (S = Squads; S != None; S = S.NextSquad) if ( (S.GetOrders() == 'Defend' || S.bFreelanceDefend) && (ONSPowerCore(S.SquadObjective) == None || (!ONSPowerCore(S.SquadObjective).bUnderAttack && ONSPowerCore(S.SquadObjective).CoreStage != 4)) ) { S.SetObjective(AttackedObjective, true); if ( EventInstigator != None ) S.CriticalObjectiveWarning(EventInstigator); return; } } } function FindNewObjectives(GameObjective DisabledObjective) { local SquadAI S; local Bot M; local ONSPowerCore Core, DisabledCore; local GameObjective O; local int i; local bool bHasVulnerableNode; for (O = Team.AI.Objectives; O != None; O = O.NextObjective) { Core = ONSPowerCore(O); if (Core != None && Core.CoreStage == 0 && Core.DefenderTeamIndex == Team.TeamIndex && Core.PoweredBy(EnemyTeam.TeamIndex)) { bHasVulnerableNode = true; break; } } for (S = Squads; S != None; S = S.NextSquad) { S.GetOrders(); Core = ONSPowerCore(S.SquadObjective); if (S.CurrentOrders == 'Attack' || S.bFreelanceAttack || (!bHasVulnerableNode && (S.CurrentOrders == 'Defend' || S.bFreelanceDefend))) { if ( Core == None || Core.bDisabled || (Core.DefenderTeamIndex == Team.TeamIndex && Core.CoreStage == 0) || (!Core.PoweredBy(Team.TeamIndex) && (bHasVulnerableNode || !Core.LinkedToCoreConstructingFor(Team.TeamIndex))) ) FindNewObjectiveFor(S, false); else if (Core.CoreStage == 1) for (M = S.SquadMembers; M != None; M = M.NextSquadMember) if (M.IsInState('RangedAttack')) //just finished destroying node, now take it over M.WhatToDoNext(66); } else if (S.CurrentOrders == 'Defend' || S.bFreelanceDefend) { if ( Core == None || Core.bDisabled || (Core.CoreStage != 4 && Core.CoreStage != 1 && (Core.DefenderTeamIndex != Team.TeamIndex || !Core.PoweredBy(EnemyTeam.TeamIndex))) ) FindNewObjectiveFor(S, false); else { //check if objective with higher defensepriority is now vulnerable DisabledCore = ONSPowerCore(DisabledObjective); if (DisabledCore != None && DisabledCore.CoreStage == 0) for (i = 0; i < DisabledCore.PowerLinks.Length; i++) if ( DisabledCore.PowerLinks[i].DefensePriority > Core.DefensePriority && (DisabledCore.PowerLinks[i].DefenseSquad == None || DisabledCore.PowerLinks[i].DefenseSquad.Team != Team) ) { S.SetObjective(DisabledCore, true); break; } } } else FindNewObjectiveFor(S, false); } } //ObjectiveCovered() returns true if the given objective is a SquadObjective for a squad on this team function bool ObjectiveCovered(GameObjective O) { local SquadAI S; for (S = Squads; S != None; S = S.NextSquad) if (S.SquadObjective == O) return true; return false; } function GameObjective GetPriorityAttackObjectiveFor(SquadAI AttackSquad) { local GameObjective O, NextPickedObjective; local ONSPowerCore Core; local array NextCores; local int i, j; local bool bAlreadyInList, bPickedObjectiveCovered, bTestObjectiveCovered; PickedObjective = None; for (O = Objectives; O != None; O = O.NextObjective) { Core = ONSPowerCore(O); if ( Core != None && !Core.bDisabled && (Core.DefenderTeamIndex != Team.TeamIndex || Core.CoreStage != 0) && Core.PoweredBy(Team.TeamIndex) ) { //keep track of neutral nodes that will be obtainable when the currently obtainable ones have been built //but only if this one is neutral or owned by this team because don't want bots waiting on "future" nodes //while a single team futilely attacks the enemy controlled node! if (Core.DefenderTeamIndex == Team.TeamIndex || (Core.CoreStage != 0 && Core.CoreStage != 2)) for (i = 0; i < Core.PowerLinks.Length; i++) if (Core.PowerLinks[i].CoreStage == 4 || Core.PowerLinks[i].CoreStage == 2) { bAlreadyInList = false; for (j = 0; j < NextCores.length; j++) { if (NextCores[j] == Core.PowerLinks[i]) { bAlreadyInList = true; break; } } if (!bAlreadyInList) NextCores[NextCores.length] = Core.PowerLinks[i]; } bTestObjectiveCovered = ObjectiveCovered(Core); if ( PickedObjective == None || (!bTestObjectiveCovered && (bPickedObjectiveCovered || PickedObjective.DefensePriority < Core.DefensePriority)) || (PickedObjective.DefensePriority == Core.DefensePriority && (bPickedObjectiveCovered == bTestObjectiveCovered) && FRand() < 0.5) ) { PickedObjective = Core; bPickedObjectiveCovered = bTestObjectiveCovered; } } } if (PickedObjective != None && ObjectiveCovered(PickedObjective)) { for (i = 0; i < NextCores.length; i++) if ( !ObjectiveCovered(NextCores[i]) && ( NextPickedObjective == None || NextPickedObjective.DefensePriority < NextCores[i].DefensePriority || (NextPickedObjective.DefensePriority == NextCores[i].DefensePriority && FRand() < 0.5) ) ) NextPickedObjective = NextCores[i]; if (NextPickedObjective != None) PickedObjective = NextPickedObjective; } return PickedObjective; } function GameObjective GetLeastDefendedObjective() { local GameObjective O, Best; for ( O=Objectives; O!=None; O=O.NextObjective ) { if ( ONSPowerCore(O) != None && ONSPowerCore(O).CoreStage == 0 && (O.DefenderTeamIndex == Team.TeamIndex) && ONSPowerCore(O).PoweredBy(EnemyTeam.TeamIndex) && ((Best == None) || (Best.DefensePriority < O.DefensePriority) || ((Best.DefensePriority == O.DefensePriority) && (Best.GetNumDefenders() > O.GetNumDefenders()))) ) Best = O; } if (Best == None) Best = GetPriorityAttackObjectiveFor(None); //nothing needs defending, so head to neutral node return Best; } function GameObjective GetMostDefendedObjective() { local GameObjective O, Best; for ( O=Objectives; O!=None; O=O.NextObjective ) { if ( ONSPowerCore(O) != None && ONSPowerCore(O).CoreStage == 0 && (O.DefenderTeamIndex == Team.TeamIndex) && ONSPowerCore(O).PoweredBy(EnemyTeam.TeamIndex) && ((Best == None) || (Best.DefensePriority < O.DefensePriority) || ((Best.DefensePriority == O.DefensePriority) && (Best.GetNumDefenders() < O.GetNumDefenders()))) ) Best = O; } if (Best == None) Best = GetPriorityAttackObjectiveFor(None); //nothing needs defending, so head to neutral node return Best; } function bool PutOnDefense(Bot B) { local GameObjective O; O = GetLeastDefendedObjective(); if ( O != None ) { //we need this because in Onslaught, unlike other gametypes, two defending squads (possibly from different teams!) //could be headed to the same objective if ( O.DefenseSquad == None || O.DefenseSquad.Team != Team ) { O.DefenseSquad = AddSquadWithLeader(B, O); ONSSquadAI(O.DefenseSquad).bDefendingSquad = true; } else O.DefenseSquad.AddBot(B); return true; } return false; } function bool OverrideCheckSpecialVehicleObjectives(bot B) { if ( bAllNodesTaken ) return false; if ( B.Squad == FreelanceSquad ) return true; } function bool IsFastFreelanceObjective(ONSPowerCore Core) { return ( (Core != None) && (Core.CoreStage == 4) && (Core.PoweredBy(Team.TeamIndex) || Core.LinkedToCoreConstructingFor(Team.TeamIndex)) ); } function float CoreAvailabilityScore(ONSPowerCore Core) { if ( !IsFastFreelanceObjective(Core) ) return -1; // distinguish based on whether enemy can get this node as well if ( Core.PoweredBy(1-Team.TeamIndex) ) return 1; if ( Core.LinkedToCoreConstructingFor(1-Team.TeamIndex) ) return 2; // if only linked to power core, lower score if ( Core.LinkedNodes.length == 1 ) return 3; return 4; } function GameObjective FindFastFreelanceObjective() { local GameObjective O; local ONSPowerCore OPC, Best; local float BestRating, NewRating; local float BestScore, NewScore; if ( (FreelanceSquad != None) && IsFastFreelanceObjective(ONSPowerCore(FreelanceSquad.SquadObjective)) ) return FreelanceSquad.SquadObjective; //find a node that the enemy wants to get (regardless of whether this team can get it) for (O = Objectives; O != None; O = O.NextObjective) { OPC = ONSPowerCore(O); NewScore = CoreAvailabilityScore(OPC); //log("Team "$Team.TeamIndex$" score for node "$OPC.NodeNum$" ("$OPC$") is "$NewScore$" vs best "$BestScore); if ( NewScore >= BestScore ) { if ( BestScore < NewScore ) Best = None; NewRating = OPC.RateCore(); if ( (Best == None) || (NewRating > BestRating) ) { Best = OPC; BestRating = NewRating; BestScore = NewScore; } } } //log("Team "$Team.TeamIndex$" best node "$best.NodeNum$" ("$best$")"); if ( Best == None ) bAllNodesTaken = true; return Best; } function GameObjective GetPriorityFreelanceObjective() { local GameObjective O, Best; local ONSPowerCore Core; if ( !bAllNodesTaken ) { Best = FindFastFreelanceObjective(); if ( !bAllNodesTaken ) return Best; } //find a node that the enemy wants to get (regardless of whether this team can get it) for (O = Objectives; O != None; O = O.NextObjective) { Core = ONSPowerCore(O); if ( Core != None && (Core.CoreStage == 4 || Core.CoreStage == 2 || Core.CoreStage == 5) && Core.DefenderTeamIndex != Team.TeamIndex && Core.PoweredBy(EnemyTeam.TeamIndex) && (Best == None || Best.DefensePriority < Core.DefensePriority) ) Best = O; } if (Best == None) Best = GetPriorityAttackObjectiveFor(None); return Best; } @>hJ h.  G@>oqCYT-c rh*h-1r.*-c'(V' G@>@>@> ph hew.*].. -C( G@>rp( G@> s[ n07-c"9:.%-c(D-  h-1rh.*-C-C's ia s ?hp& -C-C(][ &]?]?.B]B?*C-CiDLh.k<_wDL*GLDL   N_GL99 Uh` GLhd#a+9PDL   ,a+9Ph.   G@>F //----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankHitRockEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\VMParticleTextures.utx" simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || ((Level.DetailMode != DM_SuperHigh) && (Instigator != Level.GetLocalPlayerController().Pawn)) || (VSize(Level.GetLocalPlayerController().ViewTarget.Location - Location) > 6000) ) { Emitters[0].UseCollision = false; Emitters[0].FadeOutStartTime = 3.000000; } } @>i//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankFireEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" @>HJlH. G@>wyCHp% G@>@>@>xzd .z%z7H=wzH=*zH=0@zH= #?z7H=%Hp% G@>v//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankFactory extends ONSVehicleFactory; {a @|h)M p $AR"z4P"x4_M)@>@>ET//----------------------------------------------------------- // //----------------------------------------------------------- class ONSStationaryWeaponPawn extends ONSWeaponPawn abstract placeable; var bool bPowered; var float RespawnTime; var class DestructionEffectClass; simulated function PostBeginPlay() { Super.PostBeginPlay(); //setup for when dead SetDrawType(DT_StaticMesh); if (Gun != None) Gun.bCallInstigatorPostRender = true; } function CheckSuperBerserk() { if (Level.GRI != None && Level.GRI.WeaponBerserk > 1.0 && Gun != None) Gun.SetFireRateModifier(Level.GRI.WeaponBerserk); } simulated function bool IndependentVehicle() { return true; } function bool TryToDrive(Pawn P) { if (bPowered) return Super.TryToDrive(P); else { P.ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 13); return false; } } function SetTeamNum(byte T) { local byte Temp; Temp = Team; PrevTeam = T; Team = T; if (Temp != T) TeamChanged(); } simulated event TeamChanged() { Super.TeamChanged(); Health = HealthMax; } event VehicleLocked(Pawn P) { super.VehicleLocked( P ); P.ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 4); } function AltFire(optional float F) { local PlayerController PC; PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = true; PC.ToggleZoom(); } function ClientVehicleCeaseFire(bool bWasAltFire) { local PlayerController PC; if (!bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); return; } PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = false; PC.StopZoom(); } simulated function ClientKDriverLeave(PlayerController PC) { Super.ClientKDriverLeave(PC); bWeaponIsAltFiring = false; PC.EndZoom(); } function Reset() { } function Died(Controller Killer, class damageType, vector HitLocation) { local PlayerController PC; local Controller C; if ( bDeleteMe || Level.bLevelChange ) return; // already destroyed, or level is being cleaned up if ( Level.Game.PreventDeath(self, Killer, damageType, HitLocation) ) { Health = max(Health, 1); //mutator should set this higher return; } Health = Min(0, Health); if ( Controller != None ) { C = Controller; C.WasKilledBy(Killer); Level.Game.Killed(Killer, C, self, damageType); if( C.bIsPlayer ) { PC = PlayerController(C); if ( PC != None ) ClientKDriverLeave(PC); // Just to reset HUD etc. else ClientClearController(); if ( bRemoteControlled && (Driver != None) && (Driver.Health > 0) ) { C.Unpossess(); C.Possess(Driver); Driver = None; } else C.PawnDied(self); } else C.Destroy(); if ( Driver != None ) { if (!bRemoteControlled) { if (!bDrawDriverInTP && PlaceExitingDriver()) { Driver.StopDriving(self); Driver.DrivenVehicle = self; } Driver.TearOffMomentum = Velocity * 0.25; Driver.Died(Controller, class'DamRanOver', Driver.Location); } else KDriverLeave(false); } } else Level.Game.Killed(Killer, Controller(Owner), self, damageType); if ( Killer != None ) TriggerEvent(Event, self, Killer.Pawn); else TriggerEvent(Event, self, None); if ( IsHumanControlled() ) PlayerController(Controller).ForceDeathUpdate(); GotoState('Dead'); } simulated event ClientTrigger() { bNoTeamBeacon = bClientTrigger; if ( bClientTrigger && (Level.NetMode != NM_DedicatedServer) ) spawn(DestructionEffectClass, self).SetBase(self); } simulated function PostNetReceive() { } state Dead { function BeginState() { if (Level.NetMode != NM_DedicatedServer) spawn(DestructionEffectClass, self).SetBase(self); bClientTrigger = true; bNoTeamBeacon = true; bHidden = false; Gun.bHidden = true; SetCollision(false, false); bBlockZeroExtentTraces = false; bBlockNonZeroExtentTraces = false; SetTimer(RespawnTime, false); } function SetTeamNum(byte T) { GotoState(''); Global.SetTeamNum(T); } function Timer() { GotoState(''); } function EndState() { local Controller NewController; bClientTrigger = false; bNoTeamBeacon = false; bHidden = default.bHidden; Gun.bHidden = Gun.default.bHidden; SetCollision(default.bCollideActors, default.bBlockActors); bBlockZeroExtentTraces = default.bBlockZeroExtentTraces; bBlockNonZeroExtentTraces = default.bBlockNonZeroExtentTraces; Health = HealthMax; SetTimer(0, false); if (bAutoTurret && Controller == None && AutoTurretControllerClass != None) { NewController = spawn(AutoTurretControllerClass); if ( NewController != None ) NewController.Possess(self); } } } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Super.UpdatePrecacheMaterials(); } @>d<~+X'-a/!e/a0 ~+].~+ rD+* ].n0D+~+n0].10wD+*U D+ G@>m U <oQN-kJ-ki9:m i9:m -k'-]+'S G@>^class ONSSquadAI extends SquadAI; var bool bDefendingSquad; var float LastFailedNodeTeleportTime; var float MaxObjectiveGetOutDist; //cached highest ObjectiveGetOutDist of all the vehicles available on this level function Reset() { Super.Reset(); bDefendingSquad = false; } function name GetOrders() { local name NewOrders; if ( PlayerController(SquadLeader) != None ) NewOrders = 'Human'; else if ( bFreelance && !bFreelanceAttack && !bFreelanceDefend ) NewOrders = 'Freelance'; else if ( bDefendingSquad || bFreelanceDefend || (SquadObjective != None && SquadObjective.DefenseSquad == self) ) NewOrders = 'Defend'; else NewOrders = 'Attack'; if ( NewOrders != CurrentOrders ) { CurrentOrders = NewOrders; NetUpdateTime = Level.Timeseconds - 1; } return CurrentOrders; } function byte PriorityObjective(Bot B) { local ONSPowerCore Core; if (GetOrders() == 'Defend') { Core = ONSPowerCore(SquadObjective); if (Core != None && (Core.DefenderTeamIndex == Team.TeamIndex) && Core.bUnderAttack) return 1; } else if (CurrentOrders == 'Attack') { Core = ONSPowerCore(SquadObjective); if (Core != None) { if (Core.bFinalCore) { if (B.Enemy != None && Core.BotNearObjective(B)) return 1; } else if (VSize(B.Pawn.Location - Core.Location) < 1000) return 1; } } return 0; } function SetDefenseScriptFor(Bot B) { local ONSPowerCore Core; //don't look for defense scripts when heading for neutral node Core = ONSPowerCore(SquadObjective); if (Core == None || (Core.DefenderTeamIndex == Team.TeamIndex && (Core.CoreStage == 2 || Core.CoreStage == 0)) ) { Super.SetDefenseScriptFor(B); return; } if (B.GoalScript != None) B.FreeScript(); } function float MaxVehicleDist(Pawn P) { if ( GetOrders() != 'Attack' || SquadObjective == None ) return 3000; return FMin(3000, VSize(P.Location - SquadObjective.Location)); } /* FindPathToObjective() Returns path a bot should use moving toward a base */ function bool FindPathToObjective(Bot B, Actor O) { local vehicle OldVehicle; if ( B.Pawn.bStationary ) return false; if ( O == None ) { O = SquadObjective; if ( O == None ) { B.GoalString = "No SquadObjective"; return false; } } if ( ONSPowerNode(O) != None && (ONSPowerNode(O).CoreStage != 0 || ONSPowerCore(O).DefenderTeamIndex == Team.TeamIndex) ) { B.MoveTarget = None; if ( (Vehicle(B.Pawn) != None) && (B.Pawn.Location.Z - O.Location.Z < 500) && (VSize(B.Pawn.Location - O.Location) < Vehicle(B.Pawn).ObjectiveGetOutDist) && B.LineOfSightTo(O) ) { if ( Vehicle(B.Pawn).bKeyVehicle ) return false; OldVehicle = Vehicle(B.Pawn); B.DirectionHint = Normal(O.Location - OldVehicle.Location); Vehicle(B.Pawn).KDriverLeave(false); if ( Vehicle(B.Pawn) == None ) { if ( ONSChopperCraft(OldVehicle) != None ) { OldVehicle.KAddImpulse( ONSChopperCraft(OldVehicle).PushForce*Vector(OldVehicle.Rotation), OldVehicle.Location ); } if ( (B.Pawn.Physics == PHYS_Falling) && B.DoWaitForLanding() ) { B.Pawn.Velocity.Z = 0; return true; } } } if ( B.ActorReachable(O) ) { if ( (Vehicle(B.Pawn) != None) && Vehicle(B.Pawn).bKeyVehicle ) return false; if ( (Vehicle(B.Pawn) != None) && (B.Pawn.Location.Z - O.Location.Z < 500) ) { B.DirectionHint = Normal(O.Location - B.Pawn.Location); Vehicle(B.Pawn).KDriverLeave(false); } if ( B.Pawn.ReachedDestination(O) ) { //log(B.GetHumanReadableName()$" Force touch for reached objective"); O.Touch(B.Pawn); return false; } if ( OldVehicle != None ) OldVehicle.TeamUseTime = Level.TimeSeconds + 6; B.RouteGoal = O; B.RouteCache[0] = None; B.GoalString = "almost at "$O; B.MoveTarget = O; B.SetAttractionState(); return true; } if ( OldVehicle != None ) OldVehicle.UsedBy(B.Pawn); } if ( Super.FindPathToObjective(B,O) ) return true; if ( Vehicle(B.Pawn) != None && !Vehicle(B.Pawn).bKeyVehicle && (B.Enemy == None || !B.EnemyVisible()) ) { if (B.Pawn.HasWeapon() && Vehicle(B.Pawn).MaxDesireability > 0.5) Vehicle(B.Pawn).bDefensive = true; //have bots use it as a turret instead else Vehicle(B.Pawn).VehicleLostTime = Level.TimeSeconds + 20; //log(B.PlayerReplicationInfo.PlayerName$" Abandoning "$Vehicle(B.Pawn)$" because can't reach "$O); B.DirectionHint = Normal(O.Location - B.Pawn.Location); Vehicle(B.Pawn).KDriverLeave(false); } return false; } function bool CheckVehicle(Bot B) { local ONSPowerCore Nearest, Best, Core; local GameObjective O; local float NewRating, BestRating; local byte SourceDist; local weapon SuperWeap; local int i; local Vehicle V; if ( (ONSVehicle(B.Pawn) != None) && ((B.Skill + B.Tactics >= 3) || ONSVehicle(B.Pawn).bKeyVehicle) && ONSVehicle(B.Pawn).IsArtillery() ) { if ( ONSVehicle(B.Pawn).IsDeployed() ) { // if possible, just target and fire at nodes or important enemies if ( (SquadObjective != None) && (SquadObjective.DefenderTeamIndex != Team.TeamIndex) && (ONSPowerCore(SquadObjective) != None) && ONSPowerCore(SquadObjective).LegitimateTargetOf(B) && B.Pawn.CanAttack(SquadObjective) ) { B.DoRangedAttackOn(SquadObjective); B.GoalString = "Artillery Attack Objective"; return true; } if ( (B.Enemy != None) && B.Pawn.CanAttack(B.Enemy) ) { B.DoRangedAttackOn(B.Enemy); B.GoalString = "Artillery Attack Enemy"; return true; } // check squad enemies for ( i=0; i<8; i++ ) { if ( (Enemies[i] != None) && (Enemies[i] != B.Enemy) && B.Pawn.CanAttack(Enemies[i]) ) { B.DoRangedAttackOn(Enemies[i]); B.GoalString = "Artillery Attack Squad Enemy"; return true; } } // check other nodes for ( O=Team.AI.Objectives; O!=None; O=O.NextObjective ) { Core = ONSPowerCore(O); if ( (Core != None) && Core.PoweredBy(Team.TeamIndex) && (Core.DefenderTeamIndex != Team.TeamIndex) && Core.LegitimateTargetOf(B) && B.Pawn.CanAttack(Core) ) { B.DoRangedAttackOn(Core); B.GoalString = "Artillery Attack Other Node"; return true; } } // check important enemies for ( V=Level.Game.VehicleList; V!=None; V=V.NextVehicle ) { if ( (V.Controller != None) && !V.bCanFly && (V.ImportantVehicle() || V.IsArtillery()) && !V.Controller.SameTeamAs(B) && B.Pawn.CanAttack(V) ) { B.DoRangedAttackOn(V); B.GoalString = "Artillery Attack important vehicle"; return true; } } if ( (VSize(B.Pawn.Location - SquadObjective.Location) > Vehicle(B.Pawn).ObjectiveGetOutDist) || !B.Pawn.CanAttack(SquadObjective) ) ONSVehicle(B.Pawn).MayUndeploy(); } else if ( !B.Pawn.IsFiring() && (B.Enemy != None) && B.Pawn.CanAttack(B.Enemy) ) { B.Focus = B.Enemy; B.FireWeaponAt(B.Enemy); } } if ( SquadObjective != None ) { if ( GetOrders() == 'Attack' ) { if ( (ONSPowerCore(SquadObjective) != None) && ONSPowerCore(SquadObjective).PoweredBy(1 - Team.TeamIndex) && ((Vehicle(B.Pawn) == None) || !Vehicle(B.Pawn).bKeyVehicle) ) { SuperWeap = B.HasSuperWeapon(); if ( (SuperWeap != None) && B.LineOfSightTo(SquadObjective) ) { if ( Vehicle(B.Pawn) != None ) { B.DirectionHint = Normal(SquadObjective.Location - B.Pawn.Location); Vehicle(B.Pawn).KDriverLeave(false); } return SquadObjective.TellBotHowToDisable(B); } } } else if ( Vehicle(B.Pawn) != None && GetOrders() == 'Defend' && !Vehicle(B.Pawn).bDefensive && VSize(B.Pawn.Location - SquadObjective.Location) < 1600 && !Vehicle(B.Pawn).bKeyVehicle && ((B.Enemy == None) || (Level.TimeSeconds - B.LastSeenTime > 4) || (!Vehicle(B.Pawn).ImportantVehicle() && !B.EnemyVisible())) ) { B.DirectionHint = Normal(SquadObjective.Location - B.Pawn.Location); Vehicle(B.Pawn).KDriverLeave(false); return false; } } if (Vehicle(B.Pawn) == None && ONSPowerCore(SquadObjective) != None) { if (ONSPowerCore(SquadObjective).CoreStage == 0) { if ( GetOrders() == 'Defend' && (B.Enemy == None || (!B.EnemyVisible() && Level.TimeSeconds - B.LastSeenTime > 3)) && VSize(B.Pawn.Location - SquadObjective.Location) < GetMaxObjectiveGetOutDist() && ONSPowerCore(SquadObjective).Health < ONSPowerCore(SquadObjective).DamageCapacity && ((B.Pawn.Weapon != None && B.Pawn.Weapon.CanHeal(SquadObjective)) || (B.Pawn.PendingWeapon != None && B.Pawn.PendingWeapon.CanHeal(SquadObjective))) ) return false; } if (ONSPowerCore(SquadObjective).CoreStage == 2) { if ( (B.Enemy == None || !B.EnemyVisible()) && VSize(B.Pawn.Location - SquadObjective.Location) < GetMaxObjectiveGetOutDist() ) return false; } if ((ONSPowerCore(SquadObjective).CoreStage == 4 || ONSPowerCore(SquadObjective).CoreStage == 1) && VSize(B.Pawn.Location - SquadObjective.Location) < GetMaxObjectiveGetOutDist()) return false; } if (Super.CheckVehicle(B)) return true; if ( Vehicle(B.Pawn) != None || (B.Enemy != None && B.EnemyVisible()) || LastFailedNodeTeleportTime > Level.TimeSeconds - 20 || ONSPowerCore(SquadObjective) == None || ONSPlayerReplicationInfo(B.PlayerReplicationInfo) == None || ONSPowerCore(SquadObjective).HasUsefulVehicles(B) || B.Skill + B.Tactics < 2 + FRand() ) return false; //no vehicles around if (VSize(B.Pawn.Location - SquadObjective.Location) > 5000 && !B.LineOfSightTo(SquadObjective)) { //really want a vehicle to get to SquadObjective, so teleport to a different node to find one if (ONSPowerCore(B.RouteGoal) != None && ONSPlayerReplicationInfo(B.PlayerReplicationInfo).GetCurrentNode() == B.RouteGoal) { SourceDist = ONSPowerCore(B.RouteGoal).FinalCoreDistance[Abs(1 - Team.TeamIndex)]; for (O = Team.AI.Objectives; O != None; O = O.NextObjective) if (O != B.RouteGoal && ONSOnslaughtGame(Level.Game).ValidSpawnPoint(ONSPowerCore(O), Team.TeamIndex)) { NewRating = ONSPowerCore(O).TeleportRating(B, Team.TeamIndex, SourceDist); if (NewRating > BestRating || (NewRating == BestRating && FRand() < 0.5)) { Best = ONSPowerCore(O); BestRating = NewRating; } } if (Best != None) ONSPlayerReplicationInfo(B.PlayerReplicationInfo).TeleportTo(Best); else LastFailedNodeTeleportTime = Level.TimeSeconds; return false; } Nearest = ONSPowerCore(SquadObjective).ClosestTo(B.Pawn); if ( Nearest == None || Nearest.CoreStage != 0 || Nearest.DefenderTeamIndex != Team.TeamIndex || VSize(Nearest.Location - B.Pawn.Location) > 2000 ) return false; B.MoveTarget = B.FindPathToward(Nearest, false); if (B.MoveTarget != None) { B.RouteGoal = Nearest; B.GoalString = "Node teleport from "$B.RouteGoal; B.SetAttractionState(); return true; } } return false; } function BotEnteredVehicle(Bot B) { local bot SquadMate, Best; local float BestDist, NewDist; Super.BotEnteredVehicle(B); if ( !Level.Game.JustStarted(20) || (ONSVehicle(B.Pawn) == None) || !ONSVehicle(B.Pawn).FastVehicle() || (self == Team.AI.FreelanceSquad) || (Team.AI.FreelanceSquad == None) ) return; // don't do on teams with humans, since this might contradict their orders if ( Level.NetMode == NM_Standalone ) { if ( Level.GetLocalPlayerController().PlayerReplicationInfo.Team == Team ) return; } else if ( !UnrealMPGameInfo(Level.Game).bPlayersVsBots ) return; // if in fast vehicle, and freelance squad doesn't have one, switch for ( SquadMate=Team.AI.FreelanceSquad.SquadMembers; SquadMate!=None; SquadMate=SquadMate.NextSquadMember ) { if ( (ONSVehicle(SquadMate.Pawn) != None) && ONSVehicle(SquadMate.Pawn).FastVehicle() ) return; else if ( Best == None ) { Best = SquadMate; if ( Best.Pawn != None ) BestDist = VSize(B.Pawn.Location - SquadObjective.Location); else BestDist = 1000000; } else if (SquadMate.Pawn != None ) { NewDist = VSize(SquadMate.Pawn.Location - SquadObjective.Location); if ( NewDist < BestDist ) { Best = SquadMate; BestDist = NewDist; } } } // make the switch SwitchBots(B,Best); } //return a value indicating how useful this vehicle is to the bot function float VehicleDesireability(Vehicle V, Bot B) { local float Rating; if (CurrentOrders == 'Defend') { if ((SquadObjective == None || VSize(SquadObjective.Location - B.Pawn.Location) < 2000) && Super.VehicleDesireability(V, B) <= 0) return 0; if (V.Health < V.HealthMax * 0.125 && B.Enemy != None && B.EnemyVisible()) return 0; Rating = V.BotDesireability(self, Team.TeamIndex, SquadObjective); if (Rating <= 0) return 0; if (V.bDefensive) { if (ONSPowerCore(SquadObjective) != None) { //turret can't hit priority enemy if ( V.bStationary && B.Enemy != None && ONSPowerCore(SquadObjective).LastDamagedBy == B.Enemy.PlayerReplicationInfo && !FastTrace(B.Enemy.Location + B.Enemy.CollisionHeight * vect(0,0,1), V.Location) ) return 0; if (ONSPowerCore(SquadObjective).ClosestTo(V) != SquadObjective) return 0; } if (ONSStationaryWeaponPawn(V) != None && !ONSStationaryWeaponPawn(V).bPowered) return 0; } if ( V.SpokenFor(B) ) return Rating * V.NewReservationCostMultiplier(B.Pawn); return Rating; } return Super.VehicleDesireability(V, B); } function bool CheckSpecialVehicleObjectives(Bot B) { local ONSPowerCore Core; local SquadAI S; if ( ONSTeamAI(Team.AI).OverrideCheckSpecialVehicleObjectives(B) ) return false; if (Size > 1) return Super.CheckSpecialVehicleObjectives(B); //if bot is the only bot headed to a neutral (unclaimed) node, that's more important, so don't head to any SpecialVehicleObjectives Core = ONSPowerCore(SquadObjective); if (Core == None || Core.CoreStage != 4 || !Core.PoweredBy(Team.TeamIndex)) return Super.CheckSpecialVehicleObjectives(B); for (S = Team.AI.Squads; S != None; S = S.NextSquad) if (S != self && S.SquadObjective == Core) return Super.CheckSpecialVehicleObjectives(B); return false; } function float GetMaxObjectiveGetOutDist() { local SVehicleFactory F; if (MaxObjectiveGetOutDist == 0.0) foreach DynamicActors(class'SVehicleFactory', F) if (F.VehicleClass != None) MaxObjectiveGetOutDist = FMax(MaxObjectiveGetOutDist, F.VehicleClass.default.ObjectiveGetOutDist); return MaxObjectiveGetOutDist; } function bool CheckSquadObjectives(Bot B) { local bool bResult; if ( (B.Enemy != None) && (B.Enemy == ONSTeamAI(Team.AI).FinalCore.LastAttacker) ) { if ( B.NeedWeapon() && B.FindInventoryGoal(0) ) { B.GoalString = "Need weapon or ammo"; B.SetAttractionState(); return true; } return false; } if ( !ONSTeamAI(Team.AI).bAllNodesTaken && (self == Team.AI.FreelanceSquad) ) { // keep moving to any unpowered nodes if current objective is constructing if ( ONSPowerCore(SquadObjective).DefenderTeamIndex == Team.TeamIndex ) Team.AI.ReAssessStrategy(); } bResult = Super.CheckSquadObjectives(B); if (!bResult && CurrentOrders == 'Freelance' && B.Enemy == None && ONSPowerCore(SquadObjective) != None) { if (ONSPowerCore(SquadObjective).PoweredBy(Team.TeamIndex)) { B.GoalString = "Disable Objective "$SquadObjective; return SquadObjective.TellBotHowToDisable(B); } else if (!B.LineOfSightTo(SquadObjective)) { B.GoalString = "Harass enemy at "$SquadObjective; return FindPathToObjective(B, SquadObjective); } } return bResult; } function float ModifyThreat(float current, Pawn NewThreat, bool bThreatVisible, Bot B) { if ( NewThreat.PlayerReplicationInfo != None && ONSPowerCore(SquadObjective) != None && ONSPowerCore(SquadObjective).LastDamagedBy == NewThreat.PlayerReplicationInfo && ONSPowerCore(SquadObjective).bUnderAttack ) { if ( NewThreat == ONSTeamAI(Team.AI).FinalCore.LastAttacker ) return current + 6; if (!bThreatVisible) return current + 0.5; if ( (VSize(B.Pawn.Location - NewThreat.Location) < 2000) || B.Pawn.IsA('Vehicle') || B.Pawn.Weapon.bSniping || ONSPowerCore(SquadObjective).Health < ONSPowerCore(SquadObjective).DamageCapacity * 0.5 ) return current + 6; else return current + 1.5; } else return current; } function bool MustKeepEnemy(Pawn E) { if ( (E.PlayerReplicationInfo != None) && (ONSPowerCore(SquadObjective) != None) ) { if ( ONSPowerCore(SquadObjective).bUnderAttack && (ONSPowerCore(SquadObjective).LastDamagedBy == E.PlayerReplicationInfo) ) return true; if ( E == ONSTeamAI(Team.AI).FinalCore.LastAttacker ) return true; } return false; } //don't actually merge squads, because they could be two defending squads from different teams going to same neutral powernode function MergeWith(SquadAI S) { if ( SquadObjective != S.SquadObjective ) { SquadObjective = S.SquadObjective; NetUpdateTime = Level.Timeseconds - 1; } } @>BLG0 -k( G@>Dl r Ln&l -]+'ad L0( G@>q9class ONSSkyMine extends ShockProjectile; var ONSWeapon OwnerGun; var bool bDoChainReaction; var float MaxChainReactionDist, ChainReactionDelay; var class BeamEffectClass; var class ProjectileEffectClass; var Emitter ProjectileEffect; simulated function PostBeginPlay() { Super(Projectile).PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { ProjectileEffect = spawn(ProjectileEffectClass, self,, Location, Rotation); ProjectileEffect.SetBase(self); } Velocity = Speed * Vector(Rotation); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); OwnerGun = ONSWeapon(Owner); if (OwnerGun != None) OwnerGun.Projectiles[OwnerGun.Projectiles.length] = self; } simulated function DestroyTrails() { if (ProjectileEffect != None) ProjectileEffect.Destroy(); } simulated function Destroyed() { if (ProjectileEffect != None) ProjectileEffect.Destroy(); Super.Destroyed(); } function TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { if (DamageType == class'DamTypeShockBeam') { ComboDamageType = DamageType; bDoChainReaction = false; } Super.TakeDamage(Damage, EventInstigator, HitLocation, Momentum, DamageType); } function SuperExplosion() { local actor HitActor; local vector HitLocation, HitNormal; HurtRadius(ComboDamage, ComboRadius, class'DamTypePRVCombo', ComboMomentumTransfer, Location ); Spawn(class'ONSPRVComboEffect'); if ( (Level.NetMode != NM_DedicatedServer) && EffectIsRelevant(Location,false) ) { HitActor = Trace(HitLocation, HitNormal,Location - Vect(0,0,120), Location,false); if ( HitActor != None ) Spawn(class'ComboDecal',self,,HitLocation, rotator(vect(0,0,-1))); } PlaySound(ComboSound, SLOT_None,1.0,,800); DestroyTrails(); if (bDoChainReaction) { SetPhysics(PHYS_None); SetCollision(false); bHidden = true; SetTimer(ChainReactionDelay, false); } else Destroy(); } State WaitForCombo { function Tick(float DeltaTime) { if (ComboTarget == None || ComboTarget.bDeleteMe || ONSWeaponPawn(Instigator) == None || ONSWeaponPawn(Instigator).Gun == None) { GotoState(''); return; } if ( (Velocity Dot (ComboTarget.Location - Location)) <= 0 ) { if ( VSize(ComboTarget.Location - Location) <= ComboRadius + ComboTarget.CollisionRadius ) { ONSWeaponPawn(Instigator).Gun.DoCombo(); } GotoState(''); return; } else if ( (VSize(ComboTarget.Location - Location) <= 0.5 * ComboRadius + ComboTarget.CollisionRadius) ) { ONSWeaponPawn(Instigator).Gun.DoCombo(); GotoState(''); return; } } } function Timer() { local int x; local ShockBeamEffect Beam; local Projectile ChainTarget; local float BestDist; if (OwnerGun != None) { BestDist = MaxChainReactionDist; for (x = 0; x < OwnerGun.Projectiles.length; x++) { if (OwnerGun.Projectiles[x] == None || OwnerGun.Projectiles[x] == self) { OwnerGun.Projectiles.Remove(x, 1); x--; } else if (VSize(Location - OwnerGun.Projectiles[x].Location) < BestDist) { ChainTarget = OwnerGun.Projectiles[x]; BestDist = VSize(Location - OwnerGun.Projectiles[x].Location); } } if (ChainTarget != None) { Beam = Spawn(BeamEffectClass,,, Location, rotator(ChainTarget.Location - Location)); Beam.Instigator = None; Beam.AimAt(ChainTarget.Location, Normal(ChainTarget.Location - Location)); ChainTarget.TakeDamage(1, Instigator, ChainTarget.Location, vect(0,0,0), ComboDamageType); } } Destroy(); } @>EM,aW)/aA M,?k-{0'jw.M,*.M, N 0, 10-{0a?(2-^4w.*\i& .-vJ+i%.-vJJ$a a<"LJ$a wJ$*J$ D9=iJ$J$KJ$ G@>k<Sc`-k- Z-]+-]+(j$aL0(`a G@>IKd G@>L@>@>@>@>n *@>t//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVFactory extends ONSVehicleFactory; N @Oو)M R"P4P"O4_s) @>@>L//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVChainGunFireEffect extends ONSWeaponAmbientEmitter; simulated function SetEmitterStatus(bool bEnabled) { Emitters[0].UseCollision = ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (VSize(Level.GetLocalPlayerController().ViewTarget.Location - Location) < 1600)); if(bEnabled) { Emitters[0].ParticlesPerSecond = 20.0; Emitters[0].InitialParticlesPerSecond = 20.0; Emitters[0].AllParticlesDead = false; Emitters[1].ParticlesPerSecond = 30.0; Emitters[1].InitialParticlesPerSecond = 30.0; Emitters[1].AllParticlesDead = false; } else { Emitters[0].ParticlesPerSecond = 0.0; Emitters[0].InitialParticlesPerSecond = 0.0; Emitters[1].ParticlesPerSecond = 0.0; Emitters[1].InitialParticlesPerSecond = 0.0; } } @>d,*@>G//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRV extends ONSWheeledCraft; #exec OBJ LOAD FILE=..\Animations\ONSVehicles-A.ukx #exec OBJ LOAD FILE=..\textures\VehicleFX.utx #exec OBJ LOAD FILE=..\textures\EpicParticles.utx #exec OBJ LOAD FILE=..\textures\VMVehicles-TX.utx #exec OBJ LOAD FILE=..\sounds\ONSVehicleSounds-S.uax var bool bLeftArmBroke; var bool bRightArmBroke; var bool bClientLeftArmBroke; var bool bClientRightArmBroke; var() sound ArmExtendSound; var() sound ArmRetractSound; var() sound BladeBreakSound; var string ArmExtendForce; var string ArmRetractForce; replication { reliable if (bNetDirty && Role == ROLE_Authority) bClientLeftArmBroke, bClientRightArmBroke; } function ChooseFireAt(Actor A) { if (Pawn(A) != None && Vehicle(A) == None && VSize(A.Location - Location) < 1500 && Controller.LineOfSightTo(A)) { if (!bWeaponIsAltFiring) AltFire(0); } else if (bWeaponIsAltFiring) VehicleCeaseFire(true); Fire(0); } function AltFire(optional float F) { //avoid sending altfire to weapon Super(Vehicle).AltFire(F); } function ClientVehicleCeaseFire(bool bWasAltFire) { //avoid sending altfire to weapon if (bWasAltFire) Super(Vehicle).ClientVehicleCeaseFire(bWasAltFire); else Super.ClientVehicleCeaseFire(bWasAltFire); } function VehicleFire(bool bWasAltFire) { if (bWasAltFire) { PlayAnim('RVArmExtend'); if (!bLeftArmBroke || !bRightArmBroke) { PlaySound(ArmExtendSound, SLOT_None, 2.0,,,, False); bWeaponIsAltFiring = True; ClientPlayForceFeedback(ArmExtendForce); } } else Super.VehicleFire(bWasAltFire); } function VehicleCeaseFire(bool bWasAltFire) { if (bWasAltFire) { PlayAnim('RVArmRetract'); if (!bLeftArmBroke || !bRightArmBroke) { PlaySound(ArmRetractSound, SLOT_None, 2.0,,,, False); bWeaponIsAltFiring = False; ClientPlayForceFeedback(ArmRetractForce); } } else Super.VehicleCeaseFire(bWasAltFire); } function Pawn CheckForHeadShot(Vector loc, Vector ray, float AdditionalScale) { local vector X, Y, Z; GetAxes(Rotation,X,Y,Z); if (Driver != None && Driver.IsHeadShot(loc, ray, AdditionalScale)) return Driver; return None; } simulated function Tick(float DT) { local Coords ArmBaseCoords, ArmTipCoords; local vector HitLocation, HitNormal; local actor Victim; Super.Tick(DT); // Left Blade Arm System if (Role == ROLE_Authority && bWeaponIsAltFiring && !bLeftArmBroke) { ArmBaseCoords = GetBoneCoords('CarLShoulder'); ArmTipCoords = GetBoneCoords('LeftBladeDummy'); Victim = Trace(HitLocation, HitNormal, ArmTipCoords.Origin, ArmBaseCoords.Origin); if (Victim != None && Victim.bBlockActors) { if (Victim.IsA('Pawn') && !Victim.IsA('Vehicle')) Pawn(Victim).TakeDamage(1000, self, HitLocation, Velocity * 100, class'DamTypeONSRVBlade'); else { bLeftArmBroke = True; bClientLeftArmBroke = True; BladeBreakOff(4, 'CarLSlider', class'ONSRVLeftBladeBreakOffEffect'); // We use slot 4 here because slots 0-3 can be used by BigWheels mutator. } } } if (Role < ROLE_Authority && bClientLeftArmBroke) { bLeftArmBroke = True; bClientLeftArmBroke = False; BladeBreakOff(4, 'CarLSlider', class'ONSRVLeftBladeBreakOffEffect'); } // Right Blade Arm System if (Role == ROLE_Authority && bWeaponIsAltFiring && !bRightArmBroke) { ArmBaseCoords = GetBoneCoords('CarRShoulder'); ArmTipCoords = GetBoneCoords('RightBladeDummy'); Victim = Trace(HitLocation, HitNormal, ArmTipCoords.Origin, ArmBaseCoords.Origin); if (Victim != None && Victim.bBlockActors) { if (Victim.IsA('Pawn') && !Victim.IsA('Vehicle')) Pawn(Victim).TakeDamage(1000, self, HitLocation, Velocity * 100, class'DamTypeONSRVBlade'); else { bRightArmBroke = True; bClientRightArmBroke = True; BladeBreakOff(5, 'CarRSlider', class'ONSRVRightBladeBreakOffEffect'); } } } if (Role < ROLE_Authority && bClientRightArmBroke) { bRightArmBroke = True; bClientRightArmBroke = False; BladeBreakOff(5, 'CarRSlider', class'ONSRVRightBladeBreakOffEffect'); } } simulated function BladeBreakOff(int Slot, name BoneName, class BreakEffect) { PlaySound(BladeBreakSound, SLOT_None, 2.0,,,, False); SetBoneScale(Slot, 0.0, BoneName); if (Level.NetMode != NM_DedicatedServer) spawn(BreakEffect); } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.RVgun'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.RVrail'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.Rvtire'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.SmokeReOrdered'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); L.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVcolorRED'); L.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.NEWrvNoCOLOR'); L.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVblades'); L.AddPrecacheMaterial(Material'VMVehicles-TX.Environments.ReflectionTexture'); L.AddPrecacheMaterial(Material'VMWeaponsTX.RVgunGroup.RVnewGUNtex'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.MuzzleSpray'); L.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); L.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); L.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVcolorBlue'); L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); L.AddPrecacheMaterial(Material'XEffectMat.Link.link_spark_green'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.RVgun'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.RVrail'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RVexploded.Rvtire'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.SmokeReOrdered'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVcolorRED'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.NEWrvNoCOLOR'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVblades'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.Environments.ReflectionTexture'); Level.AddPrecacheMaterial(Material'VMWeaponsTX.RVgunGroup.RVnewGUNtex'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.MuzzleSpray'); Level.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); Level.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.RVGroup.RVcolorBlue'); Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); Level.AddPrecacheMaterial(Material'XEffectMat.Link.link_spark_green'); Super.UpdatePrecacheMaterials(); } function ShouldTargetMissile(Projectile P) { if ( (Health < 200) && (Bot(Controller) != None) && (Level.Game.GameDifficulty > 4 + 4*FRand()) && (VSize(P.Location - Location) < VSize(P.Velocity)) ) { KDriverLeave(false); TeamUseTime = Level.TimeSeconds + 4; } } @>W//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRocketProjectile extends Projectile; #exec OBJ LOAD FILE=..\Sounds\VMVehicleSounds-S.uax var Emitter SmokeTrailEffect; var bool bHitWater; var Effects Corona; var vector Dir; simulated function Destroyed() { if ( SmokeTrailEffect != None ) SmokeTrailEffect.Kill(); if ( Corona != None ) Corona.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { if ( Level.NetMode != NM_DedicatedServer) { SmokeTrailEffect = Spawn(class'ONSTankFireTrailEffect',self); Corona = Spawn(class'RocketCorona',self); } Dir = vector(Rotation); Velocity = speed * Dir; if (PhysicsVolume.bWaterVolume) { bHitWater = True; Velocity=0.6*Velocity; } if ( Level.bDropDetail ) { bDynamicLight = false; LightType = LT_None; } Super.PostBeginPlay(); } simulated function Landed( vector HitNormal ) { Explode(Location,HitNormal); } simulated function ProcessTouch (Actor Other, Vector HitLocation) { if ( (Other != instigator) && (!Other.IsA('Projectile') || Other.bProjTarget) ) Explode(HitLocation,Vect(0,0,1)); } function BlowUp(vector HitLocation) { HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); MakeNoise(1.0); } simulated function Explode(vector HitLocation, vector HitNormal) { PlaySound(sound'WeaponSounds.BExplosion3',,5.5*TransientSoundVolume); if ( EffectIsRelevant(Location,false) ) { Spawn(class'ONSTankHitRockEffect',,,HitLocation + HitNormal*16, rotator(HitNormal) + rot(-16384,0,0)); if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); } BlowUp(HitLocation); Destroy(); } @>H//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRedPlasmaSmallFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } Uj9F @V_܆3} u uʁ)W= 8Yl"m"n"5S@>@>C//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRedPlasmaFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } @>p//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRedEnergyEffect extends Emitter; @>x//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVSideGunPawn extends ONSWeaponPawn; function bool StopWeaponFiring() { if ( bWeaponIsAltFiring && (Bot(Controller) != None) ) { Gun.CalcWeaponFire(); Gun.AltFire(Controller); } return Super.StopWeaponFiring(); } @>dJ//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVSideGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx var class BeamEffectClass; var ONSSkyMine ComboTarget; var float MinAim; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'XEffectMat.shock_mark_heat'); L.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); L.AddPrecacheMaterial(Material'XEffectMat.purple_line'); L.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); L.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); L.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_core_low'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_flare_a'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_core'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_Energy_green_faded'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.EclipseCircle'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'XEffectMat.shock_mark_heat'); Level.AddPrecacheMaterial(Material'XEffectMat.shock_flash'); Level.AddPrecacheMaterial(Material'XEffectMat.purple_line'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_a'); Level.AddPrecacheMaterial(Material'XWeapons_rc.ShockBeamTex'); Level.AddPrecacheMaterial(Material'XEffects.SaDScorcht'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_core_low'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_flare_a'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_core'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_Energy_green_faded'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.EclipseCircle'); Super.UpdatePrecacheMaterials(); } function byte BestMode() { local Bot B; if (ComboTarget != None && Vehicle(Instigator).bWeaponIsAltFiring) { B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) || (B.Enemy != B.Target) || B.EnemyVisible() ) return 1; return 0; } else return 0; } function rotator AdjustAim(bool bAltFire) { if (bAltFire && ComboTarget != None) return rotator(ComboTarget.Location - WeaponFireLocation); return Super.AdjustAim(bAltFire); } function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum) { local ShockBeamEffect Beam; Beam = Spawn(BeamEffectClass,,, Start, Dir); Beam.Instigator = None; // prevents client side repositioning of beam start Beam.AimAt(HitLocation, HitNormal); } function SetComboTarget(ONSSkyMine S) { if (Bot(Instigator.Controller) == None || Instigator.Controller.Enemy == None) return; ComboTarget = S; ComboTarget.Monitor(Bot(Instigator.Controller).Enemy); } function DoCombo() { if (Vehicle(Instigator) != None && Instigator.Controller != None) { Instigator.StopWeaponFiring(); Vehicle(Instigator).bWeaponIsAltFiring = true; } } state InstantFireMode { simulated function ClientSpawnHitEffects() { } function SpawnHitEffects(Actor HitActor, vector HitLocation, vector HitNormal) { } function AltFire(Controller C) { local float CurAim, BestAim; local int x; local Projectile BestMine; ShakeView(); FlashMuzzleFlash(); if (AmbientEffectEmitter != None) { AmbientEffectEmitter.SetEmitterStatus(true); } // Play firing noise if (bAmbientFireSound) AmbientSound = FireSoundClass; else PlayOwnedSound(AltFireSoundClass, SLOT_None, AltFireSoundVolume/255.0,, AltFireSoundRadius,, False); //aiming help for hitting skymines BestAim = MinAim; for (x = 0; x < Projectiles.length; x++) { if (Projectiles[x] == None) { Projectiles.Remove(x, 1); x--; } else { CurAim = Normal(Projectiles[x].Location - WeaponFireLocation) dot vector(WeaponFireRotation); if (CurAim > BestAim) { BestMine = Projectiles[x]; BestAim = CurAim; } } } if (BestMine != None) TraceFire(WeaponFireLocation, rotator(BestMine.Location - WeaponFireLocation)); else TraceFire(WeaponFireLocation, WeaponFireRotation); } function Fire(Controller C) { local ONSSkyMine S; S = ONSSkyMine(SpawnProjectile(ProjectileClass, False)); if ( S != None && Bot(Instigator.Controller) != None ) SetComboTarget(S); } } @>e@>@>l //----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVRearGunPawn extends ONSWeaponPawn; function AltFire(optional float F) { local PlayerController PC; PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = true; PC.ToggleZoom(); } function ClientVehicleCeaseFire(bool bWasAltFire) { local PlayerController PC; if (!bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); return; } PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = false; PC.StopZoom(); } simulated function ClientKDriverLeave(PlayerController PC) { Super.ClientKDriverLeave(PC); bWeaponIsAltFiring = false; PC.EndZoom(); } @>bJ//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVRearGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx var class BeamEffectClass; var float StartHoldTime; var float MaxHoldTime; //wait this long between shots for full damage var float DamageScale, MinDamageScale; var bool bHoldingFire; var sound ChargingSound, ChargedLoop; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'EpicParticles.Flares.SoftFlare'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.BeamBolt1a'); L.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); L.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_b'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_mark_heat'); L.AddPrecacheMaterial(Material'XEffectMat.shock_core'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); L.AddPrecacheMaterial(Material'EpicParticles.Beams.HotBolt04aw'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.BurnFlare'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'EpicParticles.Flares.SoftFlare'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.BeamBolt1a'); Level.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_b'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_mark_heat'); Level.AddPrecacheMaterial(Material'XEffectMat.shock_core'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); Level.AddPrecacheMaterial(Material'EpicParticles.Beams.HotBolt04aw'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.BurnFlare'); Super.UpdatePrecacheMaterials(); } simulated function SetFireRateModifier(float Modifier) { Super.SetFireRateModifier(Modifier); MaxHoldTime = default.MaxHoldTime / Modifier; } simulated function float ChargeBar() { if (bHoldingFire) return (FMin(Level.TimeSeconds - StartHoldTime, MaxHoldTime) / MaxHoldTime); else return 0; } function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum) { local ONSChargeBeamEffect Beam; if (ReflectNum == 0) Start = WeaponFireLocation; Beam = spawn(BeamEffectClass,,, Start, Dir); Beam.SetDrawScale(DamageScale); Beam.HitLocation = HitLocation; if (Level.NetMode != NM_DedicatedServer) Beam.SetupBeam(); } simulated function InitEffects() { Super.InitEffects(); if (FlashEmitter != None) FlashEmitter.Trigger(self, Instigator); } state InstantFireMode { simulated function OwnerEffects() { if (Role < ROLE_Authority && !bHoldingFire) { bHoldingFire = true; StartHoldTime = Level.TimeSeconds; if (FlashEmitter != None) FlashEmitter.Reset(); } } simulated function ClientStopFire(Controller C, bool bWasAltFire) { Super.ClientStopFire(C, bWasAltFire); if (FireCountdown <= 0) { ClientPlayForceFeedback(FireForce); ShakeView(); } if (Role < ROLE_Authority) { bHoldingFire = false; if (FireCountdown <= 0) { if (bIsAltFire) FireCountdown = AltFireInterval; else FireCountdown = FireInterval; FlashMuzzleFlash(); if (!bIsAltFire) PlaySound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius,, false); } } } function Fire(Controller C) { if (!bHoldingFire) { StartHoldTime = Level.TimeSeconds; bHoldingFire = true; if (FlashEmitter != None) FlashEmitter.Reset(); bClientTrigger = !bClientTrigger; AmbientSound = ChargingSound; SetTimer(MaxHoldTime, False); } } function Timer() { if (bHoldingFire) AmbientSound = ChargedLoop; } function CeaseFire(Controller C) { if (!bHoldingFire) return; ClientPlayForceFeedback(FireForce); AmbientSound = None; CalcWeaponFire(); if (bCorrectAim) WeaponFireRotation = AdjustAim(false); DamageScale = FClamp((Level.TimeSeconds - StartHoldTime) / MaxHoldTime, MinDamageScale, 1.0); DamageMin = default.DamageMin * DamageScale; DamageMax = default.DamageMax * DamageScale; Momentum = default.Momentum * DamageScale; FireSoundPitch = 2.0 - DamageScale; Super.Fire(C); FireCountdown = FireInterval; bHoldingFire = false; } simulated function ClientTrigger() { if (Instigator != None && !Instigator.IsLocallyControlled() && FlashEmitter != None) FlashEmitter.Reset(); } } @>u//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVFactory extends ONSVehicleFactory; _V @` )M R"V3P"U3_V ) @>@>t//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRV extends ONSWheeledCraft; #exec OBJ LOAD FILE=..\Animations\ONSVehicles-A.ukx #exec OBJ LOAD FILE=..\Sounds\ONSVehicleSounds-S.uax #exec OBJ LOAD FILE=..\textures\VehicleFX.utx #exec OBJ LOAD FILE=..\textures\EpicParticles.utx #exec OBJ LOAD FILE=..\textures\VMVehicles-TX.utx #exec OBJ LOAD FILE=..\textures\2k4Fonts.utx var ScriptedTexture LicensePlate; var Material LicensePlateFallBack; var Material LicensePlateBackground; var string LicensePlateName; var Font LicensePlateFont; simulated function PostBeginPlay() { Super.PostBeginPlay(); if (Level.NetMode != NM_DedicatedServer) { LicensePlate = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); LicensePlate.SetSize(256,128); LicensePlate.FallBackMaterial = LicensePlateFallBack; LicensePlate.Client = Self; Skins[3] = LicensePlate; LicensePlateFont = Font(DynamicLoadObject("2k4Fonts.Verdana28", class'Font')); } } simulated event RenderTexture(ScriptedTexture Tex) { local int SizeX, SizeY; local color BackColor, ForegroundColor, HighLightColor; HighLightColor.R=100; HighLightColor.G=100; HighLightColor.B=100; HighLightColor.A=255; ForegroundColor.R=25; ForegroundColor.G=25; ForegroundColor.B=25; ForegroundColor.A=255; BackColor.R=128; BackColor.G=128; BackColor.B=128; BackColor.A=0; if (bDriving) { Tex.TextSize(LicensePlateName, LicensePlateFont, SizeX, SizeY); Tex.DrawTile(0, 0, Tex.USize, Tex.VSize, 0, 0, Tex.USize, Tex.VSize, LicensePlateBackground, BackColor); Tex.DrawText(((Tex.USize - SizeX) * 0.5) - 1, 40 - 1, LicensePlateName, LicensePlateFont, HighLightColor); Tex.DrawText((Tex.USize - SizeX) * 0.5, 40, LicensePlateName, LicensePlateFont, ForegroundColor); } else Tex.DrawTile(0, 0, Tex.USize, Tex.VSize, 0, 0, Tex.USize, Tex.VSize, LicensePlateFallBack, BackColor); } simulated event DrivingStatusChanged() { local array Characters; local int i, AscCode; if (bDriving && LicensePlate != None) { LicensePlateName = Caps(PlayerReplicationInfo.PlayerName); if (Len(LicensePlateName) > 8) { // First try removing all brackets, braces, greater/less-thans, and parentheses LicensePlateName = Repl(LicensePlateName, "[", "", false); LicensePlateName = Repl(LicensePlateName, "]", "", false); LicensePlateName = Repl(LicensePlateName, "(", "", false); LicensePlateName = Repl(LicensePlateName, ")", "", false); LicensePlateName = Repl(LicensePlateName, "{", "", false); LicensePlateName = Repl(LicensePlateName, "}", "", false); LicensePlateName = Repl(LicensePlateName, "<", "", false); LicensePlateName = Repl(LicensePlateName, ">", "", false); // If still not small enough, remove symbols one by one from right to left if (Len(LicensePlateName) > 8) { // Split into character array this way since Split() won't do this without crashing for (i=0; i=0; i--) { AscCode = Asc(Characters[i]); if (AscCode < 65 || AscCode > 90) Characters.Remove(i, 1); if (Characters.Length <= 8) break; } // If still not small enough, remove vowels one by one from right to left if (Characters.Length > 8) { for (i=Characters.Length-1; i>=0; i--) { AscCode = Asc(Characters[i]); switch(AscCode) { case 65: Characters.Remove(i, 1); break; case 69: Characters.Remove(i, 1); break; case 73: Characters.Remove(i, 1); break; case 79: Characters.Remove(i, 1); break; case 85: Characters.Remove(i, 1); break; } if (Characters.Length <= 8) break; } } // Rebuild the string from all our munging LicensePlateName = ""; for (i=0; i= 0; i--) if (WeaponPawns[i].Driver == None) return WeaponPawns[i]; return Super.FindEntryVehicle(P); } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellTire'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellDoor'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellGun'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.newPRVnoColor'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVcolorRED'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVcolorBLUE'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.EnergyEffectMASKtex'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.PowerSwirl'); L.AddPrecacheMaterial(Material'VMWeaponsTX.ManualBaseGun.baseGunEffectcopy'); L.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); L.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVtagFallBack'); L.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.prvTAGSCRIPTED'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellTire'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellDoor'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HELLbenderExploded.HellGun'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.newPRVnoColor'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVcolorRED'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVcolorBLUE'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.EnergyEffectMASKtex'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.PowerSwirl'); Level.AddPrecacheMaterial(Material'VMWeaponsTX.ManualBaseGun.baseGunEffectcopy'); Level.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); Level.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.PRVtagFallBack'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.NEWprvGroup.prvTAGSCRIPTED'); Super.UpdatePrecacheMaterials(); } @>f@>@>DB@>@>{//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerNodeShield extends ONSPowerCoreShield; @>v//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerNodeNeutral extends ONSPowerNode; &j^ B6ks&'H" C EGKF[@Y S@>@>e$//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerNodeEnergySphere extends Actor; var() float InducerRotationSpeed; var rotator InducerRotation; var ONSPowerNode PowerNode; var array RedConstructingSkins; var array BlueConstructingSkins; var array RedActiveSkins; var array BlueActiveSkins; simulated function UpdatePrecacheMaterials() { local int i; for ( i=0; i damageType) { if (PowerNode != None) PowerNode.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType); } simulated function bool TeamLink(int TeamNum) { return ( (PowerNode != None) && PowerNode.TeamLink(TeamNum) ); } simulated event Tick(float DT) { local PlayerController P; local Rotator FacePlayerRotation, YawRot; if ((PowerNode != None) && (PowerNode.CoreStage != 4)) { InducerRotation.Yaw += InducerRotationSpeed * 65535 * DT; InducerRotation.Yaw = InducerRotation.Yaw & 65535; SetBoneRotation('EnergyInducers', InducerRotation, 0); P = Level.GetLocalPlayerController(); if ((P != None) && (P.Pawn != None)) { FacePlayerRotation = Rotator((P.Pawn.Location - Location) << Rotation); FacePlayerRotation *= -1; YawRot.Yaw = FacePlayerRotation.Yaw; SetBoneRotation('EnergyDome', YawRot, 0); } } } @>x?//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerNode extends ONSPowerCore abstract; var ONSPowerNodeEnergySphere EnergySphere; var localized string NeutralString, ConstructingString; simulated event PostBeginPlay() { Super.PostBeginPlay(); EnergySphere = spawn(class'ONSPowerNodeEnergySphere', self,, Location + vect(0,0,370)); Skins = default.Skins; } function SpawnNodeTeleportTrigger() { //no trigger necessary, players can stand on top of powernodes to use them } simulated function string GetHumanReadableName() { if (CoreStage == 0) return ObjectiveStringPrefix$class'TeamInfo'.Default.ColorNames[DefenderTeamIndex]$ObjectiveStringSuffix$" "$NodeNum; else if (CoreStage == 2) return ObjectiveStringPrefix$class'TeamInfo'.Default.ColorNames[DefenderTeamIndex]$ConstructingString$" "$NodeNum; else return NeutralString$" "$NodeNum; } simulated function PowerCoreNeutral() { Super.PowerCoreNeutral(); Skins = default.Skins; bHidden = False; if (EnergySphere != None) { EnergySphere.bHidden = True; EnergySphere.SetCollision(false, false); } } simulated function PowerCoreConstructing() { Super.PowerCoreConstructing(); if (Level.NetMode != NM_DedicatedServer) { if (DefenderTeamIndex == 0) EnergySphere.Skins = EnergySphere.RedConstructingSkins; else EnergySphere.Skins = EnergySphere.BlueConstructingSkins; } EnergySphere.bHidden = False; EnergySphere.SetCollision(True, True); if (Role == ROLE_Authority) { if (DefenderTeamIndex == 0) BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 23); else if (DefenderTeamIndex == 1) BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 24); } } simulated function PowerCoreActive() { Super.PowerCoreActive(); if (EnergySphere != None) { EnergySphere.bHidden = False; EnergySphere.SetCollision(True, True); if (Level.NetMode != NM_DedicatedServer) { if (DefenderTeamIndex == 0) EnergySphere.Skins = EnergySphere.RedActiveSkins; else EnergySphere.Skins = EnergySphere.BlueActiveSkins; } } } simulated function PowerCoreDestroyed() { Health = 0; EnergySphere.bHidden = True; EnergySphere.SetCollision(False, False); if (Level.NetMode != NM_DedicatedServer) { PlaySound(DestroyedSound, SLOT_Misc, 5.0); spawn(class'ONSSmallVehicleExplosionEffect',self,, Location + vect(0,0,200)); } if (Role == ROLE_Authority) { NetUpdateTime = Level.TimeSeconds - 1; Scorers.length = 0; UpdateCloseActors(); NotifyUpdateLinks(); DefenderTeamIndex = 2; GotoState('DestroyedCore'); } UpdateLinkState(Self); } simulated function PowerCoreDisabled() { Super.PowerCoreDisabled(); if (EnergySphere != None) { EnergySphere.bHidden = true; EnergySphere.SetCollision(false, false); } } function bool TellBotHowToHeal(Bot B) { local vector AdjustedLoc; // if bot is in important vehicle, don't get out if ( (Vehicle(B.Pawn) != None) && Vehicle(B.Pawn).ImportantVehicle() ) return TooClose(B); AdjustedLoc = EnergySphere.Location; AdjustedLoc.Z = B.Pawn.Location.Z; if ( VSize(AdjustedLoc - B.Pawn.Location) < 50 ) { //standing right on top of it, move away a little B.GoalString = "Move away from "$self; B.RouteGoal = B.FindRandomDest(); B.MoveTarget = B.RouteCache[0]; B.SetAttractionState(); return true; } else if ( VSize(EnergySphere.Location - B.Pawn.Location) > 1050 ) { //too far to heal B.GoalString = "Move closer to "$self; if ( B.FindBestPathToward(B.RouteGoal, false, true) ) { B.SetAttractionState(); return true; } else return false; } return Super.TellBotHowToHeal(B); } @>d// Official PowerLink setups for Onslaught maps (can't be deleted) // Should be placed in the map // // For easy creation, use the console command "CopyLinkSetup" while in the map. // Then open the map in UnrealEd, use Paste, and open the properties of the new actor to give it a SetupName. class ONSPowerLinkOfficialSetup extends Actor DependsOn(ONSOnslaughtGame); var(LinkSetup) string SetupName; var(LinkSetup) array LinkSetups; @>M// Custom PowerLink setups for Onslaught maps class ONSPowerLinkCustomSetup extends Object DependsOn(ONSOnslaughtGame) PerObjectConfig; // no setup name because object name takes care of that var config array LinkSetups; @>j//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreShield extends Actor; var Material TeamSkins[2]; //wake up call to fools shooting invalid target var sound ShieldHitSound; var float ImmediateWarningEndTime; var int DamageCounter; var PlayerController LastDamagedBy; simulated function SetTeam(byte Team) { ImmediateWarningEndTime = Level.TimeSeconds + 5; if (Team < 2) Skins[0] = TeamSkins[Team]; } function TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { local PlayerController PC; if (Damage <= 0 || EventInstigator == None || EventInstigator.Role < ROLE_Authority) return; Owner.TakeDamage(Damage, EventInstigator, HitLocation, Momentum, DamageType); PC = PlayerController(EventInstigator.Controller); if (PC != None) { if (Level.TimeSeconds < ImmediateWarningEndTime) PC.ClientPlaySound(ShieldHitSound); else { if (PC != LastDamagedBy) { DamageCounter = Damage; LastDamagedBy = PC; } else DamageCounter += Damage; if (DamageCounter > 200) { PC.ClientPlaySound(ShieldHitSound); DamageCounter -= 200; } } } } simulated function bool TeamLink(int TeamNum) { if (Owner != None) return Owner.TeamLink(TeamNum); return false; } simulated function Touch(Actor Other) { if (Projectile(Other) != None) { TakeDamage(1, Other.Instigator, Other.Location, vect(0,0,0), Projectile(Other).MyDamageType); Projectile(Other).Explode(Other.Location, Normal(Other.Velocity)); } } function bool BlocksShotAt(Actor Other) { if ( (Other == Owner) || (Other == ONSPowerCore(Owner).ShootTarget) ) return false; return true; } @>W//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreRed extends ONSPowerCore; var ONSPowerCoreEnergy PCEnergyEffect; simulated function PowerCoreDestroyed() { Super.PowerCoreDestroyed(); if (PCEnergyEffect != None) PCEnergyEffect.Destroy(); } simulated function CheckShield() { Super.CheckShield(); if (CoreStage == 0) { if (PCEnergyEffect != None && ((PCEnergyEffect.IsA('ONSPowerCoreEnergyRed') && DefenderTeamIndex == 1) || (PCEnergyEffect.IsA('ONSPowerCoreEnergyBlue') && DefenderTeamIndex == 0))) PCEnergyEffect.Destroy(); if (PCEnergyEffect == None) { if (DefenderTeamIndex == 0) PCEnergyEffect = Spawn(class'ONSPowerCoreEnergyRed'); else PCEnergyEffect = Spawn(class'ONSPowerCoreEnergyBlue'); } } else if (PCEnergyEffect != None) PCEnergyEffect.Destroy(); } sfJe B6t G /{$ {$ {$ {$ {$  C EGKF[@>@>l//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreBreachEffect extends Emitter; #exec OBJ LOAD FILE="..\Sounds\IndoorAmbience.uax" @>X//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreBlue extends ONSPowerCore; var ONSPowerCoreEnergy PCEnergyEffect; simulated function PowerCoreDestroyed() { Super.PowerCoreDestroyed(); if (PCEnergyEffect != None) PCEnergyEffect.Destroy(); } simulated function CheckShield() { Super.CheckShield(); if (CoreStage == 0) { if (PCEnergyEffect != None && ((PCEnergyEffect.IsA('ONSPowerCoreEnergyRed') && DefenderTeamIndex == 1) || (PCEnergyEffect.IsA('ONSPowerCoreEnergyBlue') && DefenderTeamIndex == 0))) PCEnergyEffect.Destroy(); if (PCEnergyEffect == None) { if (DefenderTeamIndex == 0) PCEnergyEffect = Spawn(class'ONSPowerCoreEnergyRed'); else PCEnergyEffect = Spawn(class'ONSPowerCoreEnergyBlue'); } } else if (PCEnergyEffect != None) PCEnergyEffect.Destroy(); } vgJg B6w#^ G /{$ {$ {$ {$ {$  C EGKF[b@>@>rclass ONSPowerCore extends DestroyableObjective hidecategories(DestroyableObjective) abstract; #exec OBJ LOAD FILE="..\StaticMeshes\VMStructures.usx" #exec OBJ LOAD FILE="..\Textures\ONSstructureTextures.utx" var(Events) name RedActivationEventName; var(Events) name BlueActivationEventName; var(Events) name DestroyedEventName; var() float ConstructionTime; var() StaticMesh DeadStaticMesh; var() sound DestroyedSound; var() sound ConstructedSound; var() sound StartConstructionSound; var() sound ActiveSound; var() sound NeutralSound; var() sound HealingSound; var() sound HealedSound; var() bool bStartNeutral; var() bool bPowered; var() bool bFinalCore; var bool bPoweredByRed; var bool bPoweredByBlue; var bool bSevered; var bool bUnderAttack; var bool bOldUnderAttack; var globalconfig bool bShowNodeBeams; var array LinkedNodes; var array PowerLinks; // Internal var array RedConstructingSkins; var array BlueConstructingSkins; var array RedActiveSkins; var array BlueActiveSkins; var byte CoreStage; var byte LastCoreStage; var byte FinalCoreDistance[2]; var float ConstructionTimeElapsed; var float LastAttackTime; var float LastAttackExpirationTime; var float LastAttackAnnouncementTime; var float LastAttackMessageTime; var float SeveredDamagePerSecond; var float HealingTime; var array CloseActors; var array TeleportPads; var Triggers TeleportTrigger; var int DestructionMessageIndex; //base switch for ONSOnslaughtMessage var string DestroyedEvent[4]; var string ConstructedEvent[2]; var Controller Constructor; //player who touched me to start construction var Controller LastHealedBy; var ONSNodeHealEffect NodeHealEffect; var Emitter NodeBeamEffect; var Emitter ExplosionEffect; var ONSFreeRoamingEnergyEffect RoamingEnergy; var ONSPowerCoreShield Shield; var class ShieldClass; var vector ShieldOffset; var PlayerReplicationInfo LastDamagedBy; var Pawn LastAttacker; var ONSPowerCore NextCore; // link it :P -- rjp var byte LastDefenderTeamIndex; var(HUD) vector HUDLocation; var int NodeNum; replication { reliable if (bNetDirty && Role == ROLE_Authority) CoreStage, bUnderAttack, bPoweredByRed, bPoweredByBlue, bSevered; } delegate UpdateLinkState(ONSPowerCore Node); delegate NotifyUpdateLinks(); delegate OnCoreDestroyed( byte DestroyedCoreIndex ); simulated function UpdatePrecacheMaterials() { local int i; for ( i=0; i damageType) { local Controller InstigatorController; //if (instigatedBy != None && ScriptedController(instigatedBy.Controller) != None) // Log("SCRIPTED DAMAGE:"@Damage@"CORESTAGE:"@CoreStage@"HEALTH:"@Health@"POWEREDBYINSTIGATED:"@PoweredBy(instigatedBy.GetTeamNum())); if (CoreStage == 4 || CoreStage == 1 || Damage <= 0 || Level.Game.ResetCountdown > 0 || Level.Game.bGameEnded) return; if (damageType == None || !damageType.default.bDelayedDamage) DelayedDamageInstigatorController = None; if (instigatedBy != None && instigatedBy.Controller != None) InstigatorController = instigatedBy.Controller; else InstigatorController = DelayedDamageInstigatorController; if (InstigatorController == None && damageType != None) return; if (damageType != None) Damage *= damageType.default.VehicleDamageScaling; if (instigatedBy != None) { if (instigatedBy.HasUDamage()) Damage *= 2; Damage *= instigatedBy.DamageScaling; } if ( InstigatorController == None || (InstigatorController.GetTeamNum() != DefenderTeamIndex && PoweredBy(InstigatorController.GetTeamNum())) ) { NetUpdateTime = Level.TimeSeconds - 1; AccumulatedDamage += Damage; if ((DamageEventThreshold > 0) && (AccumulatedDamage >= DamageEventThreshold)) { TriggerEvent(TakeDamageEvent,self, InstigatedBy); AccumulatedDamage = 0; } if (InstigatorController != None) { LastDamagedBy = InstigatorController.PlayerReplicationInfo; LastAttacker = instigatedBy; AddScorer(InstigatorController, FMin(Health, Damage) / DamageCapacity); } if ( bFinalCore ) NetUpdateTime = Level.TimeSeconds - 1; Health -= Damage; if ( Health < 0 ) DisableObjective(instigatedBy); else if (damageType != None) { //attack notification if (LastAttackMessageTime + 1 < Level.TimeSeconds) { if (bFinalCore) { if (float(Health) / DamageCapacity > 0.55) BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 7 + DefenderTeamIndex,,, self); else if (float(Health) / DamageCapacity > 0.45) BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 25 + DefenderTeamIndex,,, self); else BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 18 + DefenderTeamIndex,,, self); } else BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 9 + DefenderTeamIndex,,, self); UnrealTeamInfo(Level.GRI.Teams[DefenderTeamIndex]).AI.CriticalObjectiveWarning(self, instigatedBy); LastAttackMessageTime = Level.TimeSeconds; } LastAttackTime = Level.TimeSeconds; } } else if (PlayerController(InstigatorController) != None) { if (InstigatorController.GetTeamNum() != DefenderTeamIndex) PlayerController(InstigatorController).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 5); else if (bFinalCore && DamageType == class'DamTypeLinkShaft') PlayerController(InstigatorController).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 30); } } function bool HealDamage(int Amount, Controller Healer, class DamageType) { if (CoreStage == 4 || CoreStage == 1 || Health <= 0 || Amount <= 0 || Healer == None || !TeamLink(Healer.GetTeamNum())) return false; if (Health >= DamageCapacity) { if (Level.TimeSeconds - HealingTime < 0.5) PlaySound(HealedSound, SLOT_Misc, 5.0); return false; } Amount = Min(Amount * LinkHealMult, DamageCapacity - Health); Health += Amount; if (ONSPlayerReplicationInfo(Healer.PlayerReplicationInfo) != None) ONSPlayerReplicationInfo(Healer.PlayerReplicationInfo).AddHealBonus(float(Amount) / DamageCapacity * Score); NetUpdateTime = Level.TimeSeconds - 1; HealingTime = Level.TimeSeconds; LastHealedBy = Healer; if (NodeHealEffect == None) { NodeHealEffect = Spawn(class'ONSNodeHealEffect', self,, Location + vect(0,0,363)); NodeHealEffect.AmbientSound = HealingSound; } Enable('Tick'); return true; } simulated event Tick(float DT) { if (Level.TimeSeconds - HealingTime > 0.5) { if (NodeHealEffect != None) NodeHealEffect.Destroy(); Disable('Tick'); } } simulated function bool PoweredBy(byte Team) { if (Team == 0 && bPoweredByRed) return True; if (Team == 1 && bPoweredByBlue) return True; return False; } function bool LinkedToCoreConstructingFor(byte Team) { local int i; for (i = 0; i < PowerLinks.length; i++) if ( (PowerLinks[i].DefenderTeamIndex == Team) && ((PowerLinks[i].CoreStage == 2) || (PowerLinks[i].CoreStage == 5)) ) return true; return false; } simulated event PostNetReceive() { if (CoreStage != LastCoreStage) { // log(Name@"CoreStage changed from "$LastCoreStage@"to"@CoreStage); LastCoreStage = CoreStage; switch(CoreStage) { case 0: PowerCoreActive(); break; case 1: PowerCoreDestroyed(); break; case 2: PowerCoreConstructing(); break; case 3: PowerCoreReset(); break; case 4: PowerCoreNeutral(); break; case 5: PowerCoreReconstitution(); break; case 255: PowerCoreDisabled(); break; } // UpdateLinkState(Self); } if (bUnderAttack != bOldUnderAttack) { // log(Name@"UnderAttackChanged to"@bUnderAttack); UnderAttackChange(); bOldUnderAttack = bUnderAttack; } if ( DefenderTeamIndex != LastDefenderTeamIndex ) { // log(Name@"DefenderTeamIndex changed from "$LastDefenderTeamIndex@"to"@DefenderTeamIndex); LastDefenderTeamIndex = DefenderTeamIndex; UpdateLinkState(Self); } CheckShield(); } simulated function NotifyLocalPlayerTeamReceived() { CheckShield(); } simulated function UnderAttackChange() { if (NodeBeamEffect != None && NodeBeamEffect.Emitters[2] != None) NodeBeamEffect.Emitters[2].Disabled = !bUnderAttack; } // Hide/UnHide Shield Effect simulated function CheckShield() { local PlayerController PC; UpdateLocationName(); if ( NodeBeamEffect != None ) { NodeBeamEffect.bHidden = !bShowNodeBeams; if ( (CoreStage != 0 || (NodeBeamEffect.IsA('ONSNodeBeamRedEffect') && DefenderTeamIndex == 1) || (NodeBeamEffect.IsA('ONSNodeBeamBlueEffect') && DefenderTeamIndex == 0))) NodeBeamEffect.Destroy(); } if (PoweredBy(1 - DefenderTeamIndex)) { Shield.bHidden = true; Shield.SetCollision(false); if ( (Level.NetMode != NM_DedicatedServer) && bShowNodeBeams && CoreStage == 0 && NodeBeamEffect == None) { if (DefenderTeamIndex == 0) NodeBeamEffect = spawn(class'ONSNodeBeamRedEffect'); else NodeBeamEffect = spawn(class'ONSNodeBeamBlueEffect'); } } else if (CoreStage != 0 && CoreStage != 2) { Shield.bHidden = true; Shield.SetCollision(false); if (NodeBeamEffect != None) NodeBeamEffect.Destroy(); } else { Shield.bHidden = false; Shield.SetCollision(true); Shield.SetTeam(DefenderTeamIndex); if (NodeBeamEffect != None) NodeBeamEffect.Destroy(); } if (Level.NetMode == NM_DedicatedServer || CoreStage != 4) return; PC = Level.GetLocalPlayerController(); if (PC == None || PC.PlayerReplicationInfo == None || (!PC.PlayerReplicationInfo.bOnlySpectator && PC.PlayerReplicationInfo.Team == None)) return; if (PoweredBy(PC.GetTeamNum())) { if (RoamingEnergy == None) RoamingEnergy = spawn(class'ONSFreeRoamingEnergyEffect',self,, Location + vect(0,0,30) + PrePivot * -2); } else if (RoamingEnergy != None) { RoamingEnergy.Kill(); RoamingEnergy = None; } } simulated function PowerCoreDisabled() { // log(Name@"PowerCoreDisabled"); bHidden = True; bPowered = False; if (RoamingEnergy != None) RoamingEnergy.Destroy(); CheckShield(); UpdateLinkState(Self); } simulated function PowerCoreNeutral() { AmbientSound = NeutralSound; // log(Name@"PowerCoreNeutral"); Health = 0; bPowered = False; DefenderTeamIndex = 2; NetUpdateTime = Level.TimeSeconds - 1; if (Level.NetMode != NM_DedicatedServer) UpdateTeamBanners(); if (Role == ROLE_Authority) { NetUpdateTime = Level.TimeSeconds - 1; NotifyUpdateLinks(); } UpdateLinkState(Self); } simulated function PowerCoreReconstitution() { if (Level.NetMode != NM_DedicatedServer) { if (RoamingEnergy != None) RoamingEnergy.Destroy(); if (DefenderTeamIndex == 0) Spawn(class'ONSRedEnergyEffect',self,, Location + vect(0,0,-20)); else Spawn(class'ONSBlueEnergyEffect',self,, Location + vect(0,0,-20)); } } function bool LegitimateTargetOf(Bot B) { if (DefenderTeamIndex == B.Squad.Team.TeamIndex || CoreStage == 4 || CoreStage == 1 ) return false; return Super.LegitimateTargetOf(B); } simulated function PowerCoreDestroyed() { local PlayerController PC; AmbientSound = None; // log(Name@"PowerCoreDestroyed"); Health = 0; if (Level.NetMode != NM_DedicatedServer) { PC = Level.GetLocalPlayerController(); if (PC != None) PC.ClientPlaySound(DestroyedSound, False, 2.0); else PlaySound(DestroyedSound, SLOT_Misc, 5.0); ExplosionEffect = spawn(class'ONSPowerCoreBreachEffect', self); Skins.length = 0; } if (Role == ROLE_Authority) { NetUpdateTime = Level.TimeSeconds - 1; Scorers.length = 0; UpdateCloseActors(); OnCoreDestroyed(DefenderTeamIndex); NotifyUpdateLinks(); DefenderTeamIndex = 2; GotoState('DestroyedCore'); } UpdateLinkState(Self); } function UpdateCloseActors() { local int i; local Actor A; local ONSVehicle V; for (i = 0; i < CloseActors.Length; i++) { A = CloseActors[i]; // Disable any playerstarts in the power radius if (A.IsA('PlayerStart')) PlayerStart(A).bEnabled = False; // Disable any vehicle factories in the power radius if (A.IsA('ONSVehicleFactory')) ONSVehicleFactory(A).Deactivate(); // Disable any turrets in the power radius if (A.IsA('ONSStationaryWeaponPawn') && !bFinalCore) { ONSStationaryWeaponPawn(A).bPowered = False; ONSStationaryWeaponPawn(A).KDriverLeave(True); ONSStationaryWeaponPawn(A).Team = 255; } } foreach DynamicActors(class'ONSVehicle', V) if (V.bTeamLocked && V.Health > 0 && ClosestTo(V) == self) V.Destroy(); } // Returns a rating based on nearby vehicles function float RateCore() { local int i; local float Result; for (i = 0; i < CloseActors.Length; i++) { if ( ONSVehicleFactory(CloseActors[i]) != None ) { Result += (ONSVehicleFactory(CloseActors[i]).VehicleClass.Default.MaxDesireability * ONSVehicleFactory(CloseActors[i]).VehicleClass.Default.MaxDesireability); if ( ONSVehicleFactory(CloseActors[i]).VehicleClass.Default.MaxDesireability > 0.6 ) Result += 0.5; } } return Result; } simulated function PowerCoreConstructing() { // log(Name@"PowerCoreConstructing"); AmbientSound = HealingSound; if (Level.NetMode != NM_DedicatedServer) { if (DefenderTeamIndex == 0) Skins = RedConstructingSkins; else Skins = BlueConstructingSkins; // Update shield Shield.SetTeam(DefenderTeamIndex); UpdateTeamBanners(); } bHidden = False; // Update Links NotifyUpdateLinks(); UpdateLinkState(Self); } simulated function PowerCoreActive() { local Actor A; local int i; bHidden = False; AmbientSound = ActiveSound; //log(Name@"PowerCoreActive"); // Update Visuals if (Level.NetMode != NM_DedicatedServer) { if (RoamingEnergy != None) RoamingEnergy.Destroy(); if (ExplosionEffect != None) ExplosionEffect.Destroy(); if (DefenderTeamIndex == 0) Skins = RedActiveSkins; else Skins = BlueActiveSkins; // Update shield if (Shield != None) Shield.SetTeam(DefenderTeamIndex); UpdateTeamBanners(); PlaySound(ConstructedSound, SLOT_Misc, 5.0); } if (Role == ROLE_Authority) { NotifyUpdateLinks(); Scorers.length = 0; // Update Nearby Powered Actors for (i = 0; i < CloseActors.Length; i++) { A = CloseActors[i]; // Update any vehicle factories in the power radius to be owned by the controlling team if (A.IsA('ONSVehicleFactory')) ONSVehicleFactory(A).Activate(DefenderTeamIndex); // Update any playerstarts in the power radius to the be owned by the controlling team if (A.IsA('PlayerStart')) { PlayerStart(A).TeamNumber = DefenderTeamIndex; PlayerStart(A).bEnabled = True; } // Enable any turrets in the power radius If (A.IsA('ONSStationaryWeaponPawn')) { ONSStationaryWeaponPawn(A).bPowered = True; ONSStationaryWeaponPawn(A).SetTeamNum(DefenderTeamIndex); ONSStationaryWeaponPawn(A).PrevTeam = DefenderTeamIndex; } } } UpdateLinkState(Self); } function Reset() { Health = DamageCapacity; PowerCoreReset(); } simulated function PowerCoreReset() { // log(Name@"PowerCoreReset"); if (RoamingEnergy != None && bScriptInitialized) RoamingEnergy.Destroy(); if (Role == ROLE_Authority) { SetStaticMesh(default.StaticMesh); UpdateCloseActors(); NetUpdateTime = Level.TimeSeconds - 1; if (!bFinalCore) DefenderTeamIndex = default.DefenderTeamIndex; if ( bScriptInitialized ) SetInitialState(); } UpdateLinkState(Self); } simulated function UpdateTeamBanners() { local int i; for (i = 0; i < CloseActors.length; i++) if (xTeamBanner(CloseActors[i]) != None) { if (CoreStage == 0) xTeamBanner(CloseActors[i]).Team = DefenderTeamIndex; else xTeamBanner(CloseActors[i]).Team = 255; xTeamBanner(CloseActors[i]).UpdateForTeam(); } for (i = 0; i < TeleportPads.length; i++) { if (CoreStage == 0) TeleportPads[i].SetTeam(DefenderTeamIndex); else TeleportPads[i].SetTeam(255); } } function float TeleportRating(Controller Asker, byte AskerTeam, byte SourceDist) { local int i; local ONSVehicleFactory F; local Bot B; local float Rating; B = Bot(Asker); for (i = 0; i < CloseActors.length; i++) { F = ONSVehicleFactory(CloseActors[i]); if (F != None && F.LastSpawned != None && F.LastSpawned.bTeamLocked && !F.LastSpawned.SpokenFor(Asker)) { if (B == None) Rating = FMax(Rating, F.LastSpawned.MaxDesireability); else Rating = FMax(Rating, B.Squad.VehicleDesireability(F.LastSpawned, B)); } } return (Rating - (FinalCoreDistance[Abs(1 - AskerTeam)] - SourceDist) * 0.1); } function bool HasUsefulVehicles(Controller Asker) { local int i; local ONSVehicleFactory F; local Bot B; B = Bot(Asker); for (i = 0; i < CloseActors.length; i++) { F = ONSVehicleFactory(CloseActors[i]); if ( F != None && F.LastSpawned != None && F.LastSpawned.bTeamLocked && (B == None || B.Squad.VehicleDesireability(F.LastSpawned, B) > 0) ) return true; } return false; } simulated function string GetHumanReadableName() { if ( DefenderTeamIndex > 1 ) return ObjectiveStringPrefix$class'TeamInfo'.Default.ColorNames[Default.DefenderTeamIndex]$ObjectiveStringSuffix; else return ObjectiveStringPrefix$class'TeamInfo'.Default.ColorNames[DefenderTeamIndex]$ObjectiveStringSuffix; } function UsedBy(Pawn User) { if (Vehicle(User) == None && PlayerController(User.Controller) != None && User.GetTeamNum() == DefenderTeamIndex) { PlayerController(User.Controller).ClientOpenMenu(Level.Game.GameUMenuType,,"TL"); } } // if bot is in important vehicle, and other bots can do the dirty work, // return false if within get out distance function bool StandGuard(Bot B) { local bot SquadMate; local float Dist; local int i; if ( (DefenderTeamIndex != B.PlayerReplicationInfo.Team.TeamIndex) && (DefenderTeamIndex < 2) ) { return false; } if ( (ONSVehicle(B.Pawn) != None) && Vehicle(B.Pawn).ImportantVehicle() ) { Dist = VSize(B.Pawn.Location - Location); if ( (Dist < Vehicle(B.Pawn).ObjectiveGetOutDist) && B.LineOfSightTo(self) ) { if ( (ONSVehicle(B.Pawn) != None) && ONSVehicle(B.Pawn).bKeyVehicle && B.Pawn.CanAttack(self) ) { ONSVehicle(B.Pawn).Deploy(); return true; } if ( (DefenderTeamIndex == B.PlayerReplicationInfo.Team.TeamIndex) || ((B.Enemy != None) && (Level.TimeSeconds - B.LastSeenTime < 2)) ) return true; // check if there's a passenger if ( ONSVehicle(B.Pawn).WeaponPawns.Length > 0 ) { for ( i=0; i 1) ) { //standing right on top of it, move away a little B.GoalString = "Move away from "$self; R = Rand(PathList.Length-1); B.MoveTarget = PathList[R].End; for ( SquadMate=B.Squad.SquadMembers; SquadMate!=None; SquadMate=SquadMate.NextSquadMember ) { if ( (SquadMate.Pawn != None) && (VSize(SquadMate.Pawn.Location - B.MoveTarget.Location) < B.CollisionRadius) ) { B.MoveTarget = PathList[R+1].End; break; } } B.SetAttractionState(); return true; } return false; } function bool TellBotHowToDisable(Bot B) { if (CoreStage == 4 || CoreStage == 1) { if ( StandGuard(B) ) return TooClose(B); return B.Squad.FindPathToObjective(B, self); } if (DefenderTeamIndex == B.Squad.Team.TeamIndex) return false; if (!PoweredBy(B.Squad.Team.TeamIndex)) { if (B.CanAttack(self)) return false; else return B.Squad.FindPathToObjective(B, self); } //take out defensive turrets first if (B.Enemy != None && B.Enemy.bStationary && B.EnemyVisible() && Vehicle(B.Enemy) != None && Vehicle(B.Enemy).bDefensive) return false; if ( StandGuard(B) ) return TooClose(B); return Super.TellBotHowToDisable(B); } function bool KillEnemyFirst(Bot B) { if ( bFinalCore || !bUnderAttack || Health < DamageCapacity * 0.25 || (Vehicle(B.Pawn) != None && Vehicle(B.Pawn).IndependentVehicle() && Vehicle(B.Pawn).HasOccupiedTurret()) ) return false; if (B.Enemy != None && B.Enemy.Controller != None && B.Enemy.CanAttack(B.Pawn) ) { if ( (B.Aggressiveness > 0.4) || (B.Pawn.IsA('ONSHoverBike') && (Vehicle(B.Enemy) == None) && (VSize(B.Enemy.Location - B.Pawn.Location) < 1500)) ) return true; return (B.LastUnderFire > Level.TimeSeconds - 1); } if (Level.TimeSeconds - HealingTime < 1 && LastHealedBy != None && LastHealedBy.Pawn != None && LastHealedBy.Pawn.Health > 0) { //attack enemy healing me if ( B.Squad.SetEnemy(B,LastHealedBy.Pawn) && (B.Enemy == LastHealedBy.Pawn) ) return true; } return false; } function bool NearObjective(Pawn P) { if (P.CanAttack(GetShootTarget())) return true; return (VSize(Location - P.Location) < BaseRadius && P.LineOfSightTo(self)); } function CheckTouching() { local Pawn P; foreach BasedActors(class'Pawn', P) { Bump(P); return; } } state NeutralCore { function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { } function Bump(Actor Other) { if ( (Pawn(Other) == None) || !Pawn(Other).IsPlayerPawn() || Vehicle(Other) != None ) return; if (PoweredBy(Pawn(Other).GetTeamNum())) { NetUpdateTime = Level.TimeSeconds - 1; DefenderTeamIndex = Pawn(Other).GetTeamNum(); Constructor = Pawn(Other).Controller; GotoState('Reconstruction'); // Update Links NotifyUpdateLinks(); } else Pawn(Other).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 6); } function UsedBy(Pawn User) {} event BeginState() { CheckTouching(); } Begin: UpdateLinkState(Self); } state DestroyedCore { Begin: sleep(2.0); if (bFinalCore) SetStaticMesh(DeadStaticMesh); else { CoreStage = 4; PowerCoreNeutral(); GotoState('NeutralCore'); } UpdateLinkState(Self); } event Timer() { if (!bSevered || CoreStage == 4) { UnSever(); return; } TakeDamage(SeveredDamagePerSecond, None, vect(0,0,0), vect(0,0,0), None); } state Reconstruction { event Timer() { if (bSevered) { Global.Timer(); return; } if (Level.TimeSeconds < LastAttackTime + 1.0) return; NetUpdateTime = Level.TimeSeconds - 1; ConstructionTimeElapsed += 1.0; Health += (1.0 / ConstructionTime) * DamageCapacity; if (Health > DamageCapacity) { SetTimer(0.0, False); Health = DamageCapacity; CoreStage = 0; if (DefenderTeamIndex == 1) TriggerEvent(BlueActivationEventName, self, None); else TriggerEvent(RedActivationEventName, self, None); PowerCoreActive(); if (DefenderTeamIndex == 0) BroadcastLocalizedMessage( class'ONSOnslaughtMessage', 2); else BroadcastLocalizedMessage( class'ONSOnslaughtMessage', 3); if (Constructor != None && Constructor.PlayerReplicationInfo != None) { Constructor.AwardAdrenaline(Score); Level.Game.ScoreObjective(Constructor.PlayerReplicationInfo, float(Score) / 2.0); Level.Game.ScoreEvent(Constructor.PlayerReplicationInfo, float(Score) / 2.0, ConstructedEvent[DefenderTeamIndex]); } UnrealMPGameInfo(Level.Game).FindNewObjectives(self); GotoState(''); } } function BeginState() { Scorers.length = 0; PlaySound(StartConstructionSound, SLOT_Misc, 5.0); CoreStage = 5; PowerCoreReconstitution(); } function Bump(Actor Other) {} function UsedBy(Pawn User) {} function UnSever() {} Begin: sleep(2.0); CoreStage = 2; PowerCoreConstructing(); ConstructionTimeElapsed = 0.0; SetTimer(1.0, True); } state DisabledCore { event BeginState() { NetUpdateTime = Level.TimeSeconds - 1; SetCollision(false, false); bDisabled = true; SetTimer(0, false); NetUpdateFrequency = 0.1; } event EndState() { NetUpdateTime = Level.TimeSeconds - 1; SetCollision(default.bCollideActors, default.bBlockActors); bDisabled = false; NetUpdateFrequency = default.NetUpdateFrequency; UnrealMPGameInfo(Level.Game).FindNewObjectives(self); } Begin: UpdateLinkState(Self); } simulated function bool HasHealthBar() { return CoreStage == 0 || CoreStage == 2 || CoreStage == 5; } simulated singular function UpdateHUDLocation( float ScreenX, float ScreenY, float RadarWidth, float Range, vector Center ) { local vector ScreenLocation; local float Dist; ScreenLocation = Location - Center; ScreenLocation.Z = 0; Dist = VSize(ScreenLocation); HUDLocation.X = ScreenX + ScreenLocation.X * (RadarWidth/Range); HUDLocation.Y = ScreenY + ScreenLocation.Y * (RadarWidth/Range); if ( NextCore != None ) NextCore.UpdateHUDLocation(ScreenX, ScreenY, RadarWidth, Range, Center); } function SetTeam(byte TeamIndex) { Super.SetTeam(TeamIndex); if (CoreStage == 0) PowerCoreActive(); } @>hclass ONSPlayerReplicationInfo extends xPlayerReplicationInfo config(user); var ONSPowerCore StartCore; //always try to spawn player here. None means auto-select, value ignored if TemporaryStartCore != None var ONSPowerCore TemporaryStartCore; //next time player respawns try to put him here (then this value is cleared) enum EMapPreference { MAP_Never, MAP_WhenBodyStill, MAP_Immediately }; var globalconfig EMapPreference ShowMapOnDeath; var bool bPendingMapDisplay; var globalconfig string LinkDesignerClass; //class of Link Designer menu var Material TransMaterials[2]; var float PendingHealBonus; //node healing score bonus that hasn't yet been added to Score replication { reliable if (bNetDirty && Role == ROLE_Authority) StartCore; reliable if (Role < ROLE_Authority) SetStartCore, ServerSendPowerLinks, ServerReceivePowerLink, ServerRemovePowerLink, ServerClearPowerLinks, ServerSendSetupNames, ServerSetPowerLinkSetup, ServerSavePowerLinkSetup, ServerDeletePowerLinkSetup, RequestLinkDesigner, TeleportTo; reliable if (Role == ROLE_Authority) ClientPrepareToReceivePowerLinks, ClientReceivePowerLink, ClientRemovePowerLink, ClientReceiveSetupName, ClientReceiveCurrentSetup, ClientShowMap; } //these are set by the link designer delegate OnReceiveLink( ONSPowerCore A, ONSPowerCore B ); delegate OnRemoveLink( ONSPowerCore A, ONSPowerCore B ); delegate ResetLinks(); delegate ProcessSetupName(string SetupName); delegate RemoveSetupName(string SetupName); delegate SetCurrentSetup(string SetupName); delegate UpdateGUIMapLists(); //listen/standalone servers only function SetStartCore(ONSPowerCore Core, bool bTemporary) { if ( Core == None || ONSOnslaughtGame(Level.Game).ValidSpawnPoint(Core, Team.TeamIndex)) { if (bTemporary) TemporaryStartCore = Core; else StartCore = Core; } } // returns the powecore/node the player is currently standing on or in the node teleport trigger radius of, // if that core/node is currently constructed for the same team as the player simulated function ONSPowerCore GetCurrentNode() { local ONSPowerCore Core; local ONSPCTeleportTrigger T; if (Controller(Owner).Pawn != None) { if (Controller(Owner).Pawn.Base != None) { Core = ONSPowerCore(Controller(Owner).Pawn.Base); if (Core == None) Core = ONSPowerCore(Controller(Owner).Pawn.Base.Owner); } if (Core == None) foreach Controller(Owner).Pawn.TouchingActors(class'ONSPCTeleportTrigger', T) { Core = ONSPowerCore(T.Owner); if (Core != None) break; } } if (Core != None && Core.CoreStage == 0 && Core.DefenderTeamIndex == Team.TeamIndex) return Core; return None; } function TeleportTo(ONSPowerCore Core) { local ONSPowerCore OldStartCore; local ONSPowerCore OwnerBase; OwnerBase = GetCurrentNode(); if (OwnerBase != None && ONSOnslaughtGame(Level.Game).ValidSpawnPoint(Core, Team.TeamIndex)) { OldStartCore = StartCore; StartCore = Core; if (!DoTeleport() && !DoTeleport()) //two tries { //FIXME error localmessage here! } StartCore = OldStartCore; } } function bool DoTeleport() { local NavigationPoint NewStart; local vector PrevLocation; PrevLocation = Controller(Owner).Pawn.Location; NewStart = Level.Game.FindPlayerStart(Controller(Owner)); if (NewStart != None && Controller(Owner).Pawn.SetLocation(NewStart.Location)) { Controller(Owner).ClientSetRotation(NewStart.Rotation); if (xPawn(Controller(Owner).Pawn) != None) xPawn(Controller(Owner).Pawn).DoTranslocateOut(PrevLocation); Controller(Owner).Pawn.SetOverlayMaterial(TransMaterials[Team.TeamIndex], 1.0, false); Controller(Owner).Pawn.PlayTeleportEffect(false, false); return true; } return false; } function OwnerDied() { if (PlayerController(Owner) != None ) ClientShowMap(); } simulated function ClientShowMap() { if (ShowMapOnDeath > MAP_Never) { bPendingMapDisplay = true; SetTimer(0.75, true); } } simulated event Timer() { local PlayerController PC; if (bPendingMapDisplay) { PC = Level.GetLocalPlayerController(); if (PC != None && !PC.bDemoOwner && PC.Player != None && GUIController(PC.Player.GUIController) != None && !GUIController(PC.Player.GUIController).bActive) { if (PC.Pawn != None && PC.Pawn.Health > 0) //never automatically pop up map while player is playing! { bPendingMapDisplay = false; SetTimer(0, false); } else if (ShowMapOnDeath == MAP_Immediately || PC.ViewTarget == None || PC.ViewTarget == PC || VSize(PC.ViewTarget.Velocity) < 100) { PC.bMenuBeforeRespawn = false; bPendingMapDisplay = false; SetTimer(0, false); PC.ShowMidGameMenu(false); } else PC.bMenuBeforeRespawn = true; } else { bPendingMapDisplay = False; SetTimer(0, false); } } Super.Timer(); } simulated function ClientPrepareToReceivePowerLinks() { ResetLinks(); } function ServerSendPowerLinks() { local int i; local ONSOnslaughtGame Game; Game = ONSOnslaughtGame(Level.Game); for ( i = 0; i < Game.PowerLinks.Length; i++ ) ClientReceivePowerLink(Game.PowerLinks[i].Nodes[0].Node, Game.PowerLinks[i].Nodes[1].Node); } simulated function ClientReceivePowerLink(ONSPowerCore From, ONSPowerCore To) { // log(Name@"ClientReceivePowerLink A:"$From.Name@"B:"$To.Name); OnReceiveLink(From,To); } simulated function ClientRemovePowerLink(ONSPowerCore From, ONSPowerCore To) { OnRemoveLink(From,To); } function ServerReceivePowerLink(ONSPowerCore From, ONSPowerCore To) { local int i; local GameReplicationInfo GRI; if (PlayerController(Owner) == None || (Owner != Level.GetLocalPlayerController() && !bAdmin) || From == To) return; if ( ONSOnslaughtGame(Level.Game).AddLink(From,To) ) { ONSOnslaughtGame(Level.Game).UpdateLinks(); GRI = Level.Game.GameReplicationInfo; for ( i = 0; i < GRI.PRIArray.Length; i++ ) { if ( PlayerController(GRI.PRIArray[i].Owner) == None || ONSPlayerReplicationInfo(GRI.PRIArray[i]) == None ) continue; ONSPlayerReplicationInfo(GRI.PRIArray[i]).ClientReceivePowerLink(From,To); } } } function ServerRemovePowerLink(ONSPowerCore From, ONSPowerCore To) { local int i; local GameReplicationInfo GRI; if (PlayerController(Owner) == None || (Owner != Level.GetLocalPlayerController() && !bAdmin) || From == To) return; if ( ONSOnslaughtGame(Level.Game).RemoveLink(From,To) ) { ONSOnslaughtGame(Level.Game).UpdateLinks(); GRI = Level.Game.GameReplicationInfo; for ( i = 0; i < GRI.PRIArray.Length; i++ ) { if ( PlayerController(GRI.PRIArray[i].Owner) == None || ONSPlayerReplicationInfo(GRI.PRIArray[i]) == None ) continue; ONSPlayerReplicationInfo(GRI.PRIArray[i]).ClientRemovePowerLink(From,To); } } } function ServerClearPowerLinks() { local int i; local ONSOnslaughtGame Game; Game = ONSOnslaughtGame(Level.Game); while (Game.PowerLinks.length > 0) ServerRemovePowerLink(Game.PowerLinks[i].Nodes[0].Node, Game.PowerLinks[i].Nodes[1].Node); } function ServerSendSetupNames() { local int x; for (x = 0; x < ONSOnslaughtGame(Level.Game).OfficialPowerLinkSetups.length && x < 1000; x++) ClientReceiveSetupName(ONSOnslaughtGame(Level.Game).OfficialPowerLinkSetups[x].SetupName); for (x = 0; x < ONSOnslaughtGame(Level.Game).CustomPowerLinkSetups.length && x < 1000; x++) ClientReceiveSetupName(string(ONSOnslaughtGame(Level.Game).CustomPowerLinkSetups[x].Name)); ClientReceiveSetupName(""); //Indicate end of setup names ClientReceiveCurrentSetup(ONSOnslaughtGame(Level.Game).CurrentSetupName); } simulated function ClientReceiveSetupName(string SetupName) { ProcessSetupName(SetupName); } simulated function ClientReceiveCurrentSetup(string SetupName) { SetCurrentSetup(SetupName); } function ServerSetPowerLinkSetup(string SetupName) { if (PlayerController(Owner) == None || (Owner != Level.GetLocalPlayerController() && !bAdmin)) return; ONSOnslaughtGame(Level.Game).SetPowerLinkSetup(SetupName, PlayerController(Owner)); } function ServerSavePowerLinkSetup(string SetupName) { local array Traveled; if (PlayerController(Owner) == None || (Owner != Level.GetLocalPlayerController() && !bAdmin)) return; if ( !ONSOnslaughtGame(Level.Game).ExistsLinkPathTo( ONSOnslaughtGame(Level.Game).PowerCores[ONSOnslaughtGame(Level.Game).FinalCore[0]], ONSOnslaughtGame(Level.Game).PowerCores[ONSOnslaughtGame(Level.Game).FinalCore[1]], Traveled ) ) { PlayerController(Owner).ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 7); return; } if (ONSOnslaughtGame(Level.Game).SavePowerLinkSetup(SetupName, PlayerController(Owner))) { ClientReceiveSetupName(SetupName); UpdateGUIMapLists(); } } function ServerDeletePowerLinkSetup(string SetupName) { if (PlayerController(Owner) == None || (Owner != Level.GetLocalPlayerController() && !bAdmin)) return; if (ONSOnslaughtGame(Level.Game).DeletePowerLinkSetup(SetupName, PlayerController(Owner))) { ClientRemoveSetupName(SetupName); UpdateGUIMapLists(); } } simulated function ClientRemoveSetupName(string SetupName) { RemoveSetupName(SetupName); } function RequestLinkDesigner() { if (PlayerController(Owner) != None && (Owner == Level.GetLocalPlayerController() || bAdmin)) PlayerController(Owner).ClientOpenMenu(LinkDesignerClass); } //scoring bonus for healing powernodes //we wait until the healing bonus >= 1 point before adding to score to minimize ScoreEvent() calls function AddHealBonus(float Bonus) { PendingHealBonus += Bonus; if (PendingHealBonus >= 1.f) { Level.Game.ScoreObjective(self, PendingHealBonus); Level.Game.ScoreEvent(self, PendingHealBonus, "heal_powernode"); PendingHealBonus = 0; } } function Reset() { HasFlag = None; NumLives = 0; bOutOfLives = false; } @>v //----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlasmaProjectile extends Projectile abstract; var() class HitEffectClass; var() class PlasmaEffectClass; var() float AccelerationMagnitude; var Emitter Plasma; simulated function PostBeginPlay() { Super.PostBeginPlay(); Velocity = Speed * Vector(Rotation); if (Level.NetMode != NM_DedicatedServer) { Plasma = spawn(PlasmaEffectClass, self,, Location, Rotation); Plasma.SetBase(self); } } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); Acceleration = AccelerationMagnitude * Normal(Velocity); } simulated function Landed( vector HitNormal ) { Explode(Location,HitNormal); } simulated function ProcessTouch( actor Other, vector HitLocation ) { if (Other != Instigator && (Vehicle(Instigator) == None || Vehicle(Instigator).Driver != Other)) Explode(HitLocation, Normal(HitLocation-Other.Location)); } simulated function Explode(vector HitLocation, vector HitNormal) { if ( Role == ROLE_Authority ) HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); if ( EffectIsRelevant(Location,false) ) Spawn(HitEffectClass,,, HitLocation + HitNormal*5, rotator(-HitNormal)); PlaySound(Sound'WeaponSounds.BioRifle.BioRifleGoo2'); Destroy(); } simulated function Destroyed() { if ( Plasma != None ) Plasma.Destroy(); Super.Destroyed(); } simulated static function float GetRange() { local float AccelTime; if (default.LifeSpan == 0.0) return 15000; else if (default.AccelerationMagnitude == 0.0) return (default.Speed * default.LifeSpan); AccelTime = (default.MaxSpeed - default.Speed) / default.AccelerationMagnitude; return ((0.5 * default.AccelerationMagnitude * AccelTime * AccelTime) + (default.Speed * AccelTime) + (default.MaxSpeed * (default.LifeSpan - AccelTime))); } @>~//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlasmaHitRed extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; local float MaxDist; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (Instigator == None) || (PC.Pawn != Instigator) ) MaxDist = 2000; else MaxDist = 3000; if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > MaxDist) ) Emitters[2].Disabled = true; } @>@ //----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlasmaHitGreen extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; local float MaxDist; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (Instigator == None) || (PC.Pawn != Instigator) ) MaxDist = 2000; else MaxDist = 3000; if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > MaxDist) ) Emitters[2].Disabled = true; } @>//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlasmaHitBlue extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; local float MaxDist; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (Instigator == None) || (PC.Pawn != Instigator) ) MaxDist = 2000; else MaxDist = 3000; if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > MaxDist) ) Emitters[2].Disabled = true; } @>V`//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlaneCraft extends ONSVehicle abstract native nativereplication; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // Flying Parameters var() InterpCurve LiftCoefficientCurve; var() InterpCurve DragCoefficientCurve; var() float AirFactor; // Technically this should be air density * wingspan area var() float MaxThrust; var() float ThrustAcceleration; // Hovering Parameters var() bool bHoverOnGround; var() float COMHeight; var() InterpCurve HoverForceCurve; // Camera Parameters var() float CameraSwingRatio; var() float CameraDistance; // Hover Stuff var array ThrusterOffsets; var() float HoverSoftness; var() float HoverPenScale; var() float HoverCheckDist; // Internal var float OutputThrust; var float OutputStrafe; var float OutputRise; var float CurrentThrust; var float AccumulatedTime; var float LastCamTime; var rotator LastCamRot; ////////////////////////////////////////////////// // Physics var() float PitchTorque; var() float BankTorque; ////////////////////////////////////////////////// // Replicated struct native PlaneStateStruct { var KRBVec ChassisPosition; var Quat ChassisQuaternion; var KRBVec ChassisLinVel; var KRBVec ChassisAngVel; var float ServerThrust; var float ServerStrafe; var float ServerRise; var int ServerViewPitch; var int ServerViewYaw; }; var PlaneStateStruct PlaneState, OldPlaneState; var KRigidBodyState ChassisState; var bool bNewPlaneState; replication { reliable if (Role == ROLE_Authority) PlaneState; } simulated function PostNetBeginPlay() { local vector RotX, RotY, RotZ; local KarmaParams kp; local KRepulsor rep; local int i; GetAxes(Rotation,RotX,RotY,RotZ); // Spawn and assign 'repulsors' to hold bike off the ground kp = KarmaParams(KParams); kp.Repulsors.Length = ThrusterOffsets.Length; for(i=0;i 32768) comp -= 65536; return comp; } simulated function SpecialCalcBehindView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector CamLookAt, HitLocation, HitNormal; local float LerpAmount; local float CurTime; ViewActor = self; CurTime = Level.TimeSeconds; LerpAmount = 1.0 - ( CameraSwingRatio ** (CurTime - LastCamTime) ); LastCamTime = CurTime; /* if(bRearView) { CamLookAt = Location; CameraRotation.Yaw = LastCamRot.Yaw + GetRotDiff(Rotation.Yaw + 32768, LastCamRot.Yaw) * LerpAmount; CameraRotation.Roll = 0; CameraRotation.Pitch = -4000; } else {*/ CamLookAt = Location; CameraRotation.Roll = 0; CameraRotation.Yaw = LastCamRot.Yaw + GetRotDiff(Rotation.Yaw, LastCamRot.Yaw) * LerpAmount; CameraRotation.Pitch = -4000; //} CameraLocation = CamLookAt + (CameraDistance * vect(-1, 0, 0) >> CameraRotation); if( Trace( HitLocation, HitNormal, CameraLocation, CamLookAt, false, vect(10, 10, 10) ) != None ) { CameraLocation = HitLocation; } LastCamRot = CameraRotation; } simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector CamLookAt, HitLocation, HitNormal; local float LerpAmount; local float CurTime; ViewActor = self; CurTime = Level.TimeSeconds; LerpAmount = 1.0 - ( CameraSwingRatio ** (CurTime - LastCamTime) ); LastCamTime = CurTime; /* if(bRearView) { CamLookAt = Location; CameraRotation.Yaw = LastCamRot.Yaw + GetRotDiff(Rotation.Yaw + 32768, LastCamRot.Yaw) * LerpAmount; CameraRotation.Roll = 0; CameraRotation.Pitch = -4000; } else {*/ CamLookAt = Location; CameraRotation.Roll = 0; CameraRotation.Yaw = 16384 + LastCamRot.Yaw + GetRotDiff(Rotation.Yaw, LastCamRot.Yaw) * LerpAmount; CameraRotation.Pitch = -4000; //} CameraLocation = CamLookAt + (CameraDistance * vect(0, 1, 0) >> CameraRotation); if( Trace( HitLocation, HitNormal, CameraLocation, CamLookAt, false, vect(10, 10, 10) ) != None ) { CameraLocation = HitLocation; } LastCamRot = CameraRotation; } @>Tx//----------------------------------------------------------- // //----------------------------------------------------------- class ONSOnslaughtMessage extends CriticalEventPlus; var(Message) localized string RedTeamDominatesString; var(Message) localized string BlueTeamDominatesString; var(Message) localized string RedTeamPowerCoreString; var(Message) localized string BlueTeamPowerCoreString; var(Message) localized string VehicleLockedString; var(Message) localized string InvincibleCoreString; var(Message) localized string UnattainableNodeString; var(Message) localized string RedPowerCoreAttackedString; var(Message) localized string BluePowerCoreAttackedString; var(Message) localized string RedPowerNodeAttackedString; var(Message) localized string BluePowerNodeAttackedString; var(Message) localized string InWayOfVehicleSpawnString; var(Message) localized string MissileLockOnString; var(Message) localized string UnpoweredString; var(Message) localized string RedPowerCoreDestroyedString; var(Message) localized string BluePowerCoreDestroyedString; var(Message) localized string RedPowerNodeDestroyedString; var(Message) localized string BluePowerNodeDestroyedString; var(Message) localized string RedPowerCoreCriticalString; var(Message) localized string BluePowerCoreCriticalString; var(Message) localized string PressUseToTeleportString; var(Message) localized string RedPowerCoreVulnerableString; var(Message) localized string BluePowerCoreVulnerableString; var(Message) localized string RedPowerNodeUnderConstructionString; var(Message) localized string BluePowerNodeUnderConstructionString; var(Message) localized string RedPowerCoreDamagedString; var(Message) localized string BluePowerCoreDamagedString; var(Message) localized string RedPowerNodeSeveredString; var(Message) localized string BluePowerNodeSeveredString; var(Message) localized string PowerCoresAreDrainingString; var(Message) localized string UnhealablePowerCoreString; var(Message) localized string AvrilLockOnString; var(Message) localized string CameraDeploy; var(Message) localized string MoveReticle; var(Message) localized string SPMAAcquiredString; var name MessageAnnouncements[35]; var Sound VictorySound; var color RedColor; var color YellowColor; static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { //yet another tutorial hack if (P.bViewingMatineeCinematic) return; Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); //only play "under attack" announcer messages every 10 seconds if (ONSPowerCore(OptionalObject) != None) { if (P.Level.TimeSeconds < ONSPowerCore(OptionalObject).LastAttackAnnouncementTime + 10) return; else ONSPowerCore(OptionalObject).LastAttackAnnouncementTime = P.Level.TimeSeconds; } if ( default.MessageAnnouncements[Switch] != '' ) P.PlayStatusAnnouncement(default.MessageAnnouncements[Switch], 2, true); if (P.PlayerReplicationInfo != None && P.PlayerReplicationInfo.Team != None && P.PlayerReplicationInfo.Team.TeamIndex == Switch) P.ClientPlaySound(default.VictorySound); } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch (Switch) { case 0: return Default.RedTeamDominatesString; break; case 1: return Default.BlueTeamDominatesString; break; case 2: return Default.RedTeamPowerCoreString; break; case 3: return Default.BlueTeamPowerCoreString; break; case 4: return Default.VehicleLockedString; break; case 5: return Default.InvincibleCoreString; break; case 6: return Default.UnattainableNodeString; break; case 7: return Default.RedPowerCoreAttackedString; break; case 8: return Default.BluePowerCoreAttackedString; break; case 9: return Default.RedPowerNodeAttackedString; break; case 10: return Default.BluePowerNodeAttackedString; break; case 11: return Default.InWayOfVehicleSpawnString; break; case 12: return Default.MissileLockOnString; break; case 13: return Default.UnpoweredString; break; case 14: return Default.RedPowerCoreDestroyedString; break; case 15: return Default.BluePowerCoreDestroyedString; break; case 16: return Default.RedPowerNodeDestroyedString; break; case 17: return Default.BluePowerNodeDestroyedString; break; case 18: return Default.RedPowerCoreCriticalString; break; case 19: return Default.BluePowerCoreCriticalString; break; case 20: return Default.RedPowerCoreVulnerableString; break; case 21: return Default.BluePowerCoreVulnerableString; break; case 22: return Default.PressUseToTeleportString; break; case 23: return Default.RedPowerNodeUnderConstructionString; break; case 24: return Default.BluePowerNodeUnderConstructionString; break; case 25: return Default.RedPowerCoreDamagedString; break; case 26: return Default.BluePowerCoreDamagedString; break; case 27: return Default.RedPowerNodeSeveredString; break; case 28: return Default.BluePowerNodeSeveredString; break; case 29: return Default.PowerCoresAreDrainingString; break; case 30: return Default.UnhealablePowerCoreString; break; case 31: return default.AvrilLockOnString; break; case 32: return default.SPMAAcquiredString; break; case 33: return default.MoveReticle; break; case 34: return default.CameraDeploy; break; } return ""; } static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { if ((Switch > 6 && Switch < 11) || Switch == 12 || (Switch > 17 && Switch < 22) || Switch > 24) return Default.RedColor; else if (Switch == 11) return Default.YellowColor; else return Default.DrawColor; } static function GetPos(int Switch, out EDrawPivot OutDrawPivot, out EStackMode OutStackMode, out float OutPosX, out float OutPosY) { Super.GetPos(Switch, OutDrawPivot, OutStackMode, OutPosX, OutPosY); if (Switch == 12 || switch == 31 || switch == 32) OutPosY = 0.75; else if (Switch == 29) OutPosY = 0.90; else if (Switch == 30) OutPosY = 0.30; } static function float GetLifeTime(int Switch) { if (Switch == 29) return 4.0; return default.LifeTime; } static function bool IsConsoleMessage(int Switch) { if (Switch < 5 || (Switch > 12 && Switch < 18) || (Switch > 19 && Switch < 24 && Switch != 22) || Switch > 25) return true; return false; } @>C//----------------------------------------------------------- // //----------------------------------------------------------- class ONSOnslaughtGame extends xTeamGame; var array PowerCores; var int FinalCore[2]; // GameUMenuType - This menu is displayed to players when they die - it should contain the map for choosing where to respawn at struct PowerLinkSetup { var name BaseNode; var array LinkedNodes; }; var array OfficialPowerLinkSetups; var array CustomPowerLinkSetups; var array PowerLinks; var config int OvertimeCoreDrainPerSec; var config bool bRandSetupAfterReset; //choose a random link setup to play after a reset var config bool bSwapSidesAfterReset; var bool bSidesAreSwitched; var bool bCurrentSetupIsOfficial; var string CurrentSetupName; // localized PlayInfo descriptions & extra info const ONSPROPNUM = 3; var localized string ONSPropsDisplayText[ONSPROPNUM]; var localized string ONSPropDescText[ONSPROPNUM]; var(LoadingHints) private localized array ONSHints; function bool AllowTransloc() { return false; } static function bool NeverAllowTransloc() { return true; } static function bool AllowMutator( string MutatorClassName ) { if ( MutatorClassName == "" ) return false; if ( MutatorClassName ~= "xGame.MutInstagib" ) return false; if ( MutatorClassName ~= "xGame.MutZoomInstagib" ) return false; return super.AllowMutator(MutatorClassName); } event SetGrammar() { LoadSRGrammar("ONS"); } function bool ApplyOrder( PlayerController Sender, int RecipientID, int OrderID ) { local controller P; if ( OrderID == 299 ) { for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).GetOutOfVehicle(); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } return Super.ApplyOrder(Sender,RecipientID,OrderID); } function int ParseOrder(string OrderString) { if ( OrderString == "GET OUT" ) return 299; return Super.ParseOrder(OrderString); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( !bRewardSounds ) { V.PrecacheSound('Red_powernode_destroyed'); V.PrecacheSound('Blue_powernode_destroyed'); V.PrecacheSound('Red_Powercore_under_attack'); V.PrecacheSound('Blue_Powercore_under_attack'); V.PrecacheSound('NewRoundIn'); V.PrecacheSound('Red_Powercore_destroyed'); V.PrecacheSound('Blue_Powercore_destroyed'); V.PrecacheSound('Red_Powercore_critical'); V.PrecacheSound('Blue_Powercore_critical'); V.PrecacheSound('Red_Powercore_vulnerable'); V.PrecacheSound('Blue_Powercore_vulnerable'); V.PrecacheSound('Red_Powernode_under_construction'); V.PrecacheSound('Blue_Powernode_under_construction'); V.PrecacheSound('Red_powercore_damaged'); V.PrecacheSound('Blue_powercore_damaged'); V.PrecacheSound('Red_powernode_isolated'); V.PrecacheSound('Blue_powernode_isolated'); } } function SetInitialState() { Super.SetInitialState(); SetCoreDistance(PowerCores[FinalCore[0]], 0, 0); SetCoreDistance(PowerCores[FinalCore[1]], 1, 0); UpdateLinks(); } event InitGame(string Options, out string Error) { local string InOpt, MapName; local ONSPowerLinkOfficialSetup P; local int x; local NavigationPoint N; local array CustomPowerLinkSetupNames; Super.InitGame(Options, Error); x = 0; for(N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint) { // Reset all PlayerStarts so that the PowerCores can determine their team and Pre-Rate them if (N.IsA('PlayerStart')) PlayerStart(N).bEnabled = False; // Register all the PowerCores if (N.IsA('ONSPowerCore')) { PowerCores[x] = ONSPowerCore(N); PowerCores[x].NotifyUpdateLinks = UpdateLinks; PowerCores[x].OnCoreDestroyed = MainCoreDestroyed; if (PowerCores[x].bFinalCore) FinalCore[PowerCores[x].DefenderTeamIndex] = x; x++; } } if (PowerCores.Length == 0) { log("Onslaught: Level doesn't have any PowerCores!",'Error'); return; } MapName = Left(string(Level), InStr(string(Level), ".")); OfficialPowerLinkSetups.length = 0; foreach AllActors(class'ONSPowerLinkOfficialSetup', P) OfficialPowerLinkSetups[OfficialPowerLinkSetups.length] = P; //For PerObjectConfig objects, the Outer overrides the default config file name. //This means by giving the Level as the Outer, the .ini name will be the same as the map name, //which is really cool because it makes it easy to trade custom setups - just copy that map's .ini CustomPowerLinkSetupNames = class'ONSPowerLinkCustomSetup'.static.GetPerObjectNames(MapName); for (x = 0; x < CustomPowerLinkSetupNames.length; x++) CustomPowerLinkSetups[CustomPowerLinkSetups.length] = new(Level, CustomPowerLinkSetupNames[x]) class'ONSPowerLinkCustomSetup'; InOpt = ParseOption(Options, "bRandSetupAfterReset"); if (InOpt != "") bRandSetupAfterReset = bool(InOpt); InOpt = ParseOption(Options, "LinkSetup"); if (InOpt ~= "Random") { FindLinkSetup(); return; } if (InOpt == "" || !SetPowerLinkSetup(InOpt, None)) { if (!SetPowerLinkSetup("Default", None)) FindLinkSetup(); } // Big hack.. you shouldn't break scope this way :) InOpt = ParseOption(Options,"BonusVehicles"); if ( bool(InOpt) ) { AddMutator("OnslaughtBP.MutBonusVehicles"); } } event PostBeginPlay() { SetupLinks(); Super.PostBeginPlay(); } function bool SetupExists(string SetupName) { local int x; for (x = 0; x < OfficialPowerLinkSetups.length; x++) if (OfficialPowerLinkSetups[x].SetupName ~= SetupName) return true; for (x = 0; x < CustomPowerLinkSetups.length; x++) if (string(CustomPowerLinkSetups[x].Name) ~= SetupName) return true; return false; } function bool SetPowerLinkSetup(string SetupName, PlayerController Caller) { local int x, y, z, i; local array Traveled; SetupName = Repl(SetupName, " ", "_"); for (x = 0; x < OfficialPowerLinkSetups.length; x++) if (OfficialPowerLinkSetups[x].SetupName ~= SetupName) { //activate this setup for (y = 0; y < OfficialPowerLinkSetups[x].LinkSetups.length; y++) for (z = 0; z < PowerCores.length; z++) if (PowerCores[z].Name == OfficialPowerLinkSetups[x].LinkSetups[y].BaseNode) PowerCores[z].LinkedNodes = OfficialPowerLinkSetups[x].LinkSetups[y].LinkedNodes; ResetPowerLinks(); Log("Using Official Link Setup: "$SetupName); CurrentSetupName = SetupName; bCurrentSetupIsOfficial = true; if (Caller != None) Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 2); return true; } for (x = 0; x < CustomPowerLinkSetups.length; x++) if (string(CustomPowerLinkSetups[x].Name) ~= SetupName) { //activate this setup for (y = 0; y < CustomPowerLinkSetups[x].LinkSetups.length; y++) for (z = 0; z < PowerCores.length; z++) if (PowerCores[z].Name == CustomPowerLinkSetups[x].LinkSetups[y].BaseNode) PowerCores[z].LinkedNodes = CustomPowerLinkSetups[x].LinkSetups[y].LinkedNodes; ResetPowerLinks(); if (PowerLinks.length > 0 && !ExistsLinkPathTo(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]], Traveled)) { //trying to load an invalid setup, revert to previous one CustomPowerLinkSetups.Remove(x, 1); if (Caller != None) Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 8); else Log("Failed to load Custom Link Setup"@SetupName$": There is not a complete path between the PowerCores."); if (CurrentSetupName != "" && CurrentSetupName != SetupName && SetPowerLinkSetup(CurrentSetupName, None)) return true; if (OfficialPowerLinkSetups.Length > 0) { FindLinkSetup(); return true; } Log("Can't find a better link setup to load, so using"@SetupName@" anyway and forcing a connection between the PowerCores."); AddLink(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]]); UpdateLinks(); for (i = 0; i < GameReplicationInfo.PRIArray.Length; i++) if (PlayerController(GameReplicationInfo.PRIArray[i].Owner) != None && ONSPlayerReplicationInfo(GameReplicationInfo.PRIArray[i]) != None) ONSPlayerReplicationInfo(GameReplicationInfo.PRIArray[i]).ClientReceivePowerLink(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]]); return true; } Log("Using Custom Link Setup: "$SetupName); CurrentSetupName = SetupName; bCurrentSetupIsOfficial = false; if (Caller != None) Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 2); return true; } if (Caller != None) Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 3); return false; } function ClearLinks() { local int i; for ( i = 0; i < PowerLinks.Length; i++ ) if ( PowerLinks[i] != None ) PowerLinks[i].Destroy(); PowerLinks.Remove(0, PowerLinks.Length); } function ResetPowerLinks() { local int x; local ONSPlayerReplicationInfo PRI; if ( PowerLinks.Length == 0 ) return; ClearLinks(); for ( x = 0; x < PowerCores.Length; x++ ) PowerCores[x].ResetLinks(); SetupLinks(); if (GameReplicationInfo != None) { for (x = 0; x < GameReplicationInfo.PRIArray.length; x++) { PRI = ONSPlayerReplicationInfo(GameReplicationInfo.PRIArray[x]); if ( PRI == None || PlayerController(PRI.Owner) == None ) continue; PRI.ClientPrepareToReceivePowerLinks(); } } } //Save a powercore link setup. Returns true if it successfully created a NEW setup and neither failed nor overwrote an old setup function bool SavePowerLinkSetup(string SetupName, PlayerController Caller) { local int x, y, z; local PowerLinkSetup BlankSetup; local string MapName; MapName = Left(string(Level), InStr(string(Level), ".")); SetupName = Repl(SetupName, " ", "_"); for (x = 0; x < OfficialPowerLinkSetups.length; x++) if (OfficialPowerLinkSetups[x].SetupName ~= SetupName) { Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 1); return false; } for (x = 0; x < CustomPowerLinkSetups.length; x++) if (string(CustomPowerLinkSetups[x].Name) ~= SetupName) { //overwrite CustomPowerLinkSetups[x].LinkSetups.length = 0; for (y = 0; y < PowerCores.length; y++) { CustomPowerLinkSetups[x].LinkSetups[y] = BlankSetup; CustomPowerLinkSetups[x].LinkSetups[y].BaseNode = PowerCores[y].Name; for (z = 0; z < PowerCores[y].PowerLinks.length; z++) CustomPowerLinkSetups[x].LinkSetups[y].LinkedNodes[z] = PowerCores[y].PowerLinks[z].Name; } CustomPowerLinkSetups[x].SaveConfig(); Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 0); return false; } //save new x = CustomPowerLinkSetups.length; CustomPowerLinkSetups.length = CustomPowerLinkSetups.length + 1; CustomPowerLinkSetups[x] = new(Level, SetupName) class'ONSPowerLinkCustomSetup'; CustomPowerLinkSetups[x].LinkSetups.length = 0; for (y = 0; y < PowerCores.length; y++) { CustomPowerLinkSetups[x].LinkSetups[y] = BlankSetup; CustomPowerLinkSetups[x].LinkSetups[y].BaseNode = PowerCores[y].Name; for (z = 0; z < PowerCores[y].PowerLinks.length; z++) CustomPowerLinkSetups[x].LinkSetups[y].LinkedNodes[z] = PowerCores[y].PowerLinks[z].Name; } CustomPowerLinkSetups[x].SaveConfig(); Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 0); return true; } //Deletes a powercore link setup. Returns true if successful, false if not function bool DeletePowerLinkSetup(string SetupName, PlayerController Caller) { local int x; local string MapName; MapName = Left(string(Level), InStr(string(Level), ".")); SetupName = Repl(SetupName, " ", "_"); for (x = 0; x < OfficialPowerLinkSetups.length; x++) if (OfficialPowerLinkSetups[x].SetupName ~= SetupName) { Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 5); return false; } for (x = 0; x < CustomPowerLinkSetups.length; x++) if (string(CustomPowerLinkSetups[x].Name) ~= SetupName) { CustomPowerLinkSetups[x].ClearConfig(); CustomPowerLinkSetups.Remove(x, 1); Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 4); return true; } Caller.ReceiveLocalizedMessage(class'ONSLinkDesignMessage', 6); return false; } function FindLinkSetup(optional string IgnoredSetup) { local int i, Sanity, TotalNumSetups; local string NewSetupName; TotalNumSetups = OfficialPowerLinkSetups.length + CustomPowerLinkSetups.length; if (TotalNumSetups == 0) Log("Using default Link Setup"); else if (TotalNumSetups == 1 && CurrentSetupName != "") SetPowerLinkSetup(CurrentSetupName, None); else { do { i = Rand(TotalNumSetups); if (i < OfficialPowerLinkSetups.length) NewSetupName = OfficialPowerLinkSetups[i].SetupName; else NewSetupName = string(CustomPowerLinkSetups[i-OfficialPowerLinkSetups.length].Name); Sanity++; } until (NewSetupName != IgnoredSetup || Sanity > 1000) SetPowerLinkSetup(NewSetupName, None); } } static simulated function bool ExistsLinkPathTo(ONSPowerCore Start, ONSPowerCore Destination, out array Traveled) { local int i, j; local bool bSkip; if (Start == None || Destination == None) return false; Traveled[Traveled.length] = Start; for (i = 0; i < Start.PowerLinks.Length; i++) { if (Start.PowerLinks[i] == Destination) return true; bSkip = false; for (j = 0; j < Traveled.length; j++) { if (Traveled[j] == Start.PowerLinks[i]) { bSkip = true; break; } } if (!bSkip && ExistsLinkPathTo(Start.PowerLinks[i], Destination, Traveled)) return true; } return false; } function SetCoreDistance(ONSPowerCore PC, byte T, byte Distance) { local int i; PC.FinalCoreDistance[T] = Distance; for (i=0; i Distance + 1) SetCoreDistance(PC.PowerLinks[i], T, Distance + 1); } } function UpdateLinks() { local int i, j; local bool bRedCoreWasVulnerable, bBlueCoreWasVulnerable; if (!bScriptInitialized) //PowerCores haven't done PostBeginPlay() yet return; // log(Name@"UpdateLinks"); bRedCoreWasVulnerable = PowerCores[FinalCore[0]].bPoweredByBlue; bBlueCoreWasVulnerable = PowerCores[FinalCore[1]].bPoweredByRed; UpdateSeveredLinks(); for (i=0; i WasSevered; for (i = 0; i < PowerCores.Length; i++) { WasSevered[i] = byte(PowerCores[i].bSevered); PowerCores[i].bSevered = True; } Sever(PowerCores[FinalCore[0]], 0); Sever(PowerCores[FinalCore[1]], 1); for (i = 0; i < PowerCores.Length; i++) if (!PowerCores[i].bDisabled && PowerCores[i].CoreStage != 4) { if (PowerCores[i].bSevered && WasSevered[i] == 0) PowerCores[i].Sever(); else if (!PowerCores[i].bSevered && WasSevered[i] == 1) PowerCores[i].UnSever(); } } function Sever(ONSPowerCore PC, int TeamIndex) { local int i; PC.bSevered = False; if (PC.CoreStage != 0) return; for (i = 0; i < PC.PowerLinks.Length; i++) if (PC.PowerLinks[i].bSevered && PC.PowerLinks[i].DefenderTeamIndex == TeamIndex) Sever(PC.PowerLinks[i], TeamIndex); } function Reset() { bOverTime = false; bOverTimeBroadcast = false; } function StartMatch() { local array Traveled; local int i; //check if the link setup is valid (in case host/admin edited it before game start) if (Level.NetMode != NM_Standalone && !ExistsLinkPathTo(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]], Traveled)) { //trying to load an invalid setup, revert to previous one Log("Current link setup is invalid: There is not a complete path between the PowerCores."); if (CurrentSetupName == "" || !SetPowerLinkSetup(CurrentSetupName, None)) { if (OfficialPowerLinkSetups.length > 0) FindLinkSetup(); else { Log("Can't find a better link setup to load, so forcing a connection between the PowerCores."); AddLink(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]]); UpdateLinks(); for (i = 0; i < GameReplicationInfo.PRIArray.Length; i++) if (PlayerController(GameReplicationInfo.PRIArray[i].Owner) != None && ONSPlayerReplicationInfo(GameReplicationInfo.PRIArray[i]) != None) ONSPlayerReplicationInfo(GameReplicationInfo.PRIArray[i]).ClientReceivePowerLink(PowerCores[FinalCore[0]], PowerCores[FinalCore[1]]); } } } Super.StartMatch(); } State MatchInProgress { event Timer() { local Controller C; local int i, TeamNodes[2], TotalNodes; local Actor A; local bool bOldUnderAttack; for(i=0;i PowerCores[i].LastAttackExpirationTime ) { bOldUnderAttack = PowerCores[i].bUnderAttack; PowerCores[i].bUnderAttack = (Level.TimeSeconds - PowerCores[i].LastAttackTime < PowerCores[i].LastAttackExpirationTime); if (bOldUnderAttack != PowerCores[i].bUnderAttack) PowerCores[i].UnderAttackChange(); } if (!PowerCores[i].bFinalCore && PowerCores[i].CoreStage != 255) { if (PowerCores[i].CoreStage == 0 && PowerCores[i].DefenderTeamIndex < 2) TeamNodes[PowerCores[i].DefenderTeamIndex]++; TotalNodes++; } } if (bOverTime) { PowerCores[FinalCore[0]].TakeDamage(OvertimeCoreDrainPerSec - OvertimeCoreDrainPerSec * (float(TeamNodes[0]) / TotalNodes), None, vect(0,0,0), vect(0,0,0), None); PowerCores[FinalCore[1]].TakeDamage(OvertimeCoreDrainPerSec - OvertimeCoreDrainPerSec * (float(TeamNodes[1]) / TotalNodes), None, vect(0,0,0), vect(0,0,0), None); } Super.Timer(); // Need this!!! if (ResetCountDown > 0) { ResetCountDown--; if ( ResetCountDown < 3 ) { // blow up all redeemer guided warheads for ( C=Level.ControllerList; C!=None; C=C.NextController ) if ( (C.Pawn != None) && C.Pawn.IsA('RedeemerWarhead') ) C.Pawn.Fire(1); } if ( ResetCountDown == 8 ) { for ( C = Level.ControllerList; C != None; C = C.NextController ) if ( PlayerController(C) != None ) PlayerController(C).PlayStatusAnnouncement('NewRoundIn',1,true); } else if ( (ResetCountDown > 1) && (ResetCountDown < 7) ) BroadcastLocalizedMessage(class'TimerMessage', ResetCountDown-1); else if (ResetCountDown == 1) { Log("Reset Onslaught."); for (C = Level.ControllerList; C != None; C = C.NextController) { if (PlayerController(C) != None) PlayerController(C).ClientReset(); C.Reset(); } foreach AllActors(class'Actor', A) if (!A.IsA('Controller') && !A.IsA('ONSPowerCore') && !A.IsA('TeamInfo')) A.Reset(); //we reset powercores after everything else because their reset might cause //vehiclefactories, etc to activate and spawn new actors that we don't want to affect for (i = 0; i < PowerCores.length; i++) { if (bSwapSidesAfterReset && PowerCores[i].bFinalCore) { if (bSidesAreSwitched) PowerCores[i].DefenderTeamIndex = PowerCores[i].default.DefenderTeamIndex; else PowerCores[i].DefenderTeamIndex = abs(PowerCores[i].default.DefenderTeamIndex - 1); FinalCore[PowerCores[i].DefenderTeamIndex] = i; } else PowerCores[i].DefenderTeamIndex = PowerCores[i].default.DefenderTeamIndex; PowerCores[i].FinalCoreDistance[0] = 255; PowerCores[i].FinalCoreDistance[1] = 255; PowerCores[i].Reset(); } if (bSwapSidesAfterReset) { SetCoreDistance(PowerCores[FinalCore[0]], 0, 0); SetCoreDistance(PowerCores[FinalCore[1]], 1, 0); bSidesAreSwitched = !bSidesAreSwitched; } //possibly choose a new link setup if (bRandSetupAfterReset && (OfficialPowerLinkSetups.length + CustomPowerLinkSetups.length) > 1) FindLinkSetup(CurrentSetupName); else UpdateLinks(); FindNewObjectives(None); //update AI //now respawn all the players for (C = Level.ControllerList; C != None; C = C.nextController) if (C.PlayerReplicationInfo != None && !C.PlayerReplicationInfo.bOnlySpectator) RestartPlayer(C); //reset timelimit RemainingTime = 60 * TimeLimit; GameReplicationInfo.RemainingMinute = RemainingTime; ResetCountDown = 0; } } } } function MainCoreDestroyed(byte T) { local Controller C; local PlayerController PC; local int Score; if (bOverTime) Score = 1; else Score = 2; if (T == 1) { BroadcastLocalizedMessage( class'ONSOnslaughtMessage', 0); TeamScoreEvent(0, Score, "enemy_core_destroyed"); Teams[0].Score += Score; Teams[0].NetUpdateTime = Level.TimeSeconds - 1; CheckScore(PowerCores[FinalCore[1]].LastDamagedBy); } else { BroadcastLocalizedMessage( class'ONSOnslaughtMessage', 1); TeamScoreEvent(1, Score, "enemy_core_destroyed"); Teams[1].Score += Score; Teams[1].NetUpdateTime = Level.TimeSeconds - 1; CheckScore(PowerCores[FinalCore[0]].LastDamagedBy); } //round has ended for (C = Level.ControllerList; C != None; C = C.NextController) { PC = PlayerController(C); if (PC != None) { PC.ClientSetBehindView(true); PC.ClientSetViewTarget(PowerCores[FinalCore[T]]); PC.SetViewTarget(PowerCores[FinalCore[T]]); if (!bGameEnded) PC.ClientRoundEnded(); } if (!bGameEnded) C.RoundHasEnded(); } ResetCountDown = ResetTimeDelay; } function CheckScore(PlayerReplicationInfo Scorer) { if (CheckMaxLives(Scorer)) return; if (GameRulesModifiers != None && GameRulesModifiers.CheckScore(Scorer)) return; if (GoalScore != 0 && (Teams[0].Score >= GoalScore || Teams[1].Score >= GoalScore)) EndGame(Scorer,"teamscorelimit"); } function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason) { if (Reason ~= "TimeLimit") { if ( !bOverTimeBroadcast ) { StartupStage = 7; PlayStartupMessage(); bOverTimeBroadcast = true; } return false; } return Super.CheckEndGame(Winner, Reason); } function SetEndGameFocus(PlayerReplicationInfo Winner) { local Controller P; local PlayerController player; if ( Winner != None ) { if (Winner.Team.TeamIndex == 0) EndGameFocus = PowerCores[FinalCore[1]]; else EndGameFocus = PowerCores[FinalCore[0]]; } if ( EndGameFocus != None ) EndGameFocus.bAlwaysRelevant = true; for ( P=Level.ControllerList; P!=None; P=P.nextController ) { player = PlayerController(P); if ( Player != None ) { if ( !Player.PlayerReplicationInfo.bOnlySpectator ) PlayWinMessage(Player, (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner)); Player.ClientSetBehindView(true); Player.CameraDist = 10; if ( EndGameFocus != None ) { Player.ClientSetViewTarget(EndGameFocus); Player.SetViewTarget(EndGameFocus); } Player.ClientGameEnded(); if ( CurrentGameProfile != None ) CurrentGameProfile.bWonMatch = (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner); } P.GameHasEnded(); } } function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class damageType) { if (PlayerController(Killed) != None && ONSPlayerReplicationInfo(Killed.PlayerReplicationInfo) != None) ONSPlayerReplicationInfo(Killed.PlayerReplicationInfo).OwnerDied(); Super.Killed(Killer, Killed, KilledPawn, damageType); } function bool CriticalPlayer(Controller Other) { local int x; if (Other.Pawn == None || Other.PlayerReplicationInfo == None) return Super.CriticalPlayer(Other); for (x = 0; x < PowerCores.length; x++) if ( (PowerCores[x].CoreStage == 0 || PowerCores[x].CoreStage == 2) && PowerCores[x].DefenderTeamIndex != Other.GetTeamNum() && ((PowerCores[x].bUnderAttack && Other.PlayerReplicationInfo == PowerCores[x].LastDamagedBy) || VSize(Other.Pawn.Location - PowerCores[x].Location) < 2000) ) return true; return Super.CriticalPlayer(Other); } function bool ValidSpawnPoint(ONSPowerCore PC, int TeamIndex) { return (PC != None && PC.DefenderTeamIndex == TeamIndex && !PC.IsInState('NeutralCore') && !PC.IsInState('Reconstruction') && (!PC.bUnderAttack || PC.bFinalCore)); } function NavigationPoint FindPlayerStart( Controller Player, optional byte InTeam, optional string incomingName ) { local NavigationPoint N, BestStart; local Teleporter Tel; local float BestRating, NewRating; local byte Team, EnemyTeam; local ONSPowerCore SelectedPC; local float CoreDistA, CoreDistB; local int i; local Bot B; if ( GameRulesModifiers != None ) { N = GameRulesModifiers.FindPlayerStart(Player,InTeam,incomingName); if ( N != None ) return N; } // if incoming start is specified, then just use it if( incomingName!="" ) foreach AllActors( class 'Teleporter', Tel ) if( string(Tel.Tag)~=incomingName ) return Tel; // use InTeam if player doesn't have a team yet if ( (Player != None) && (Player.PlayerReplicationInfo != None) ) { if ( Player.PlayerReplicationInfo.Team != None ) Team = Player.PlayerReplicationInfo.Team.TeamIndex; else Team = InTeam; //Use the powercore the player selected (if it's valid) if ( ONSPlayerReplicationInfo(Player.PlayerReplicationInfo) != None ) { SelectedPC = ONSPlayerReplicationInfo(Player.PlayerReplicationInfo).TemporaryStartCore; ONSPlayerReplicationInfo(Player.PlayerReplicationInfo).TemporaryStartCore = None; if (SelectedPC != None && !ValidSpawnPoint(SelectedPC, Team)) SelectedPC = None; if (SelectedPC == None) { SelectedPC = ONSPlayerReplicationInfo(Player.PlayerReplicationInfo).StartCore; if (!ValidSpawnPoint(SelectedPC, Team)) SelectedPC = None; } } if ( SelectedPC == None ) { //Bots always want to go to their SquadObjective B = Bot(Player); if (B != None && B.Squad != None && ONSPowerCore(B.Squad.SquadObjective) != None && ValidSpawnPoint(ONSPowerCore(B.Squad.SquadObjective), Team)) SelectedPC = ONSPowerCore(B.Squad.SquadObjective); } } else Team = InTeam; if (SelectedPC == None) { if (PowerCores[FinalCore[Team]].PoweredBy(1 - Team)) SelectedPC = PowerCores[FinalCore[Team]]; if (SelectedPC == None) { // Find the Closest Controlled Node(s) to Enemy PowerCore. EnemyTeam = abs(Team - 1); BestRating = 255; for (i = 0; i < PowerCores.Length; i++) { if (ValidSpawnPoint(PowerCores[i], Team)) { NewRating = PowerCores[i].FinalCoreDistance[EnemyTeam]; if ( NewRating < BestRating ) { BestRating = NewRating; SelectedPC = PowerCores[i]; } else if ( NewRating == BestRating ) // If we have two nodes at equal link distance, we check geometric distance { CoreDistA = VSize(PowerCores[FinalCore[EnemyTeam]].Location - PowerCores[i].Location); CoreDistB = VSize(PowerCores[FinalCore[EnemyTeam]].Location - SelectedPC.Location); if (CoreDistA < CoreDistB) SelectedPC = PowerCores[i]; } } } // If no valid power node found, set to power core. if (SelectedPC == None) SelectedPC = PowerCores[FinalCore[Team]]; } } for (i = 0; i < SelectedPC.CloseActors.length; i++) if (NavigationPoint(SelectedPC.CloseActors[i]) != None) { NewRating = RatePlayerStart(NavigationPoint(SelectedPC.CloseActors[i]),Team,Player); if ( NewRating > BestRating ) { BestRating = NewRating; BestStart = NavigationPoint(SelectedPC.CloseActors[i]); } } if (PlayerStart(BestStart) == None && SelectedPC != PowerCores[FinalCore[Team]]) { //couldn't find a start at the requested node, so try powercore SelectedPC = PowerCores[FinalCore[Team]]; for (i = 0; i < SelectedPC.CloseActors.length; i++) if (NavigationPoint(SelectedPC.CloseActors[i]) != None) { NewRating = RatePlayerStart(NavigationPoint(SelectedPC.CloseActors[i]),Team,Player); if ( NewRating > BestRating ) { BestRating = NewRating; BestStart = NavigationPoint(SelectedPC.CloseActors[i]); } } } if (PlayerStart(BestStart) == None) { log("Warning - PATHS NOT DEFINED or NO PLAYERSTART with positive rating"); BestRating = -100000000; ForEach AllActors( class 'NavigationPoint', N ) { NewRating = RatePlayerStart(N,0,Player); if ( InventorySpot(N) != None ) NewRating -= 50; NewRating += 20 * FRand(); if ( NewRating > BestRating ) { BestRating = NewRating; BestStart = N; } } } return BestStart; } function ShowPathTo(PlayerController P, int TeamNum) { local int x; local ONSPowerCore Best; local float BestDist; local class WWclass; for (x = 0; x < PowerCores.Length; x++) if ( (PowerCores[x].CoreStage != 0 || PowerCores[x].DefenderTeamIndex != TeamNum) && PowerCores[x].PoweredBy(TeamNum) && (Best == None || VSize(P.Pawn.Location - PowerCores[x].Location) < BestDist) ) { Best = PowerCores[x]; BestDist = VSize(P.Pawn.Location - PowerCores[x].Location); } if (Best != None && P.FindPathToward(Best, false) != None) { WWclass = class(DynamicLoadObject(PathWhisps[TeamNum], class'Class')); Spawn(WWclass, P,, P.Pawn.Location); } } function GetServerInfo(out ServerResponseLine ServerState) { Super.GetServerInfo(ServerState); if (!bCurrentSetupIsOfficial) ServerState.MapName $= "*"; } function GetServerDetails(out ServerResponseLine ServerState) { Super.GetServerDetails(ServerState); AddServerDetail( ServerState, "LinkSetup", CurrentSetupName ); } function bool ChangeTeam(Controller Other, int num, bool bNewTeam) { local int i; local ONSPlayerReplicationInfo PRI; if (Super.ChangeTeam(Other, num, bNewTeam)) { if (Other == Level.GetLocalPlayerController()) { //Update client side effects on powercores to reflect which ones the player can go after changing teams for (i = 0; i < PowerCores.length; i++) PowerCores[i].CheckShield(); } PRI = ONSPlayerReplicationInfo(Other.PlayerReplicationInfo); if (PRI != None) { PRI.StartCore = None; PRI.TemporaryStartCore = None; } return true; } return false; } function PlayStartupMessage() { Super.PlayStartupMessage(); if (StartupStage == 7 && OvertimeCoreDrainPerSec > 0) BroadcastLocalizedMessage(class'ONSOnslaughtMessage', 29); } function ScoreObjective(PlayerReplicationInfo Scorer, float Score) { if (Scorer != None) Scorer.Score += Score; if (GameRulesModifiers != None) GameRulesModifiers.ScoreObjective(Scorer,Score); } static event bool AcceptPlayInfoProperty(string PropertyName) { if ( InStr(PropertyName, "bAllowTrans") != -1 ) return false; return Super.AcceptPlayInfoProperty(PropertyName); } static function FillPlayInfo(PlayInfo PlayInfo) { local int i; Super.FillPlayInfo(PlayInfo); // Always begin with calling parent PlayInfo.AddSetting(default.GameGroup, "OvertimeCoreDrainPerSec", default.ONSPropsDisplayText[i++], 40, 1, "Text", "2;0:99"); PlayInfo.AddSetting(default.GameGroup, "bRandSetupAfterReset", default.ONSPropsDisplayText[i++], 0, 1, "Check", ,, , true); PlayInfo.AddSetting(default.GameGroup, "bSwapSidesAfterReset", default.ONSPropsDisplayText[i++], 0, 1, "Check", ,, , true); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "OvertimeCoreDrainPerSec": return default.ONSPropDescText[0]; case "bRandSetupAfterReset": return default.ONSPropDescText[1]; case "bSwapSidesAfterReset": return default.ONSPropDescText[2]; } return Super.GetDescriptionText(PropName); } static function array GetAllLoadHints(optional bool bThisClassOnly) { local int i; local array Hints; if ( !bThisClassOnly || default.ONSHints.Length == 0 ) Hints = Super.GetAllLoadHints(); for ( i = 0; i < default.ONSHints.Length; i++ ) Hints[Hints.Length] = default.ONSHints[i]; return Hints; } event Destroyed() { CustomPowerLinkSetups.length = 0; Super.Destroyed(); } function SetupLinks() { local ONSPowerCore Core; local int i; if ( PowerCores.Length == 0 ) return; Core = PowerCores[0]; do { for ( i = 0; i < Core.PowerLinks.Length; i++ ) AddLink(Core, Core.PowerLinks[i]); Core = Core.NextCore; } until ( Core == None || Core == PowerCores[0] ); } function bool AddLink( ONSPowerCore A, ONSPowerCore B ) { local PowerLink Link; if ( HasLink(A,B) ) return false; Link = Spawn(class'PowerLink'); Link.SetNodes(A,B); // log(Name@"AddLink Link:"$Link.Name@"A:"$A.Name@"B:"$B.Name); PowerLinks[PowerLinks.Length] = Link; // A.AddPowerLink(B); // A.PowerCoreReset(); // B.PowerCoreReset(); return True; } function bool RemoveLink( ONSPowerCore A, ONSPowerCore B ) { local int i; for ( i = PowerLinks.Length - 1; i >= 0; i-- ) { if ( PowerLinks[i] == None ) { PowerLinks.Remove(i,1); continue; } if ( PowerLinks[i].HasNodes(A,B) ) { // A.RemovePowerLink(B); // A.PowerCoreReset(); // B.PowerCoreReset(); PowerLinks[i].Destroy(); PowerLinks.Remove(i,1); return True; } } return False; } function bool HasLink( ONSPowerCore A, ONSPowerCore B ) { local int i; for ( i = PowerLinks.Length - 1; i >= 0; i-- ) { if ( PowerLinks[i] == None ) { PowerLinks.Remove(i,1); continue; } if ( PowerLinks[i].HasNodes(A,B) ) return True; } return False; } event PostLogin(PlayerController NewPlayer) { Super.PostLogin(NewPlayer); if ( ONSPlayerReplicationInfo(NewPlayer.PlayerReplicationInfo) != None ) ONSPlayerReplicationInfo(NewPlayer.PlayerReplicationInfo).ClientPrepareToReceivePowerLinks(); } function DeadUse(PlayerController PC) { Super.DeadUse(PC); PC.ShowMenu(); } @>|//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineThrowFire extends BioFire; var class RedMineClass; var class BlueMineClass; function projectile SpawnProjectile(Vector Start, Rotator Dir) { local Projectile p; local int x; if (Weapon.Instigator.GetTeamNum() == 0) ProjectileClass = RedMineClass; if (Weapon.Instigator.GetTeamNum() == 1) ProjectileClass = BlueMineClass; if( ProjectileClass != None ) p = Weapon.Spawn(ProjectileClass, Weapon,, Start, Dir); if( p == None ) return None; p.Damage *= DamageAtten; if (ONSMineLayer(Weapon) != None) { if (ONSMineLayer(Weapon).CurrentMines >= ONSMineLayer(Weapon).MaxMines) { for (x = 0; x < ONSMineLayer(Weapon).Mines.length; x++) { if (ONSMineLayer(Weapon).Mines[x] == None) { ONSMineLayer(Weapon).Mines.Remove(x, 1); x--; } else { ONSMineLayer(Weapon).Mines[x].Destroy(); ONSMineLayer(Weapon).Mines.Remove(x, 1); break; } } } ONSMineLayer(Weapon).Mines[ONSMineLayer(Weapon).Mines.length] = p; ONSMineLayer(Weapon).CurrentMines++; } return p; } function PlayFiring() { Super.PlayFiring(); ONSMineLayer(Weapon).PlayFiring(true); } @>|//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineProjectileRED extends ONSMineProjectile; @>}//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineProjectileBLUE extends ONSMineProjectile; @>{#exec OBJ LOAD FILE=..\Sounds\MenuSounds.uax class ONSMineProjectile extends Projectile; var() float DetectionTimer; // check target every this many seconds var() Sound ExplodeSound; var() float ScurrySpeed, ScurryAnimRate; var() float HeightOffset; var Pawn TargetPawn; var int TeamNum; var bool bClosedDown; var bool bGoToTargetLoc; var vector TargetLoc; var int TargetLocFuzz; replication { reliable if (bNetDirty && Role == ROLE_Authority) bGoToTargetLoc; reliable if (bNetDirty && Role == ROLE_Authority && bGoToTargetLoc) TargetLoc; reliable if (bNetDirty && Role == ROLE_Authority && !bGoToTargetLoc) TargetPawn; } simulated function PostBeginPlay() { Super.PostBeginPlay(); if (Role == ROLE_Authority) { Velocity = Instigator.Velocity + (vector(Rotation) * Speed); Velocity.Z += TossZ; SetRotation(Rotation + rot(16384,0,0)); } PlayAnim('Startup', 0.5); } simulated function PostNetBeginPlay() { if (Role < ROLE_Authority && Physics == PHYS_None) { bProjTarget = true; GotoState('OnGround'); } } simulated function Destroyed() { if ( !bNoFX && EffectIsRelevant(Location,false) ) Spawn(class'ONSGrenadeExplosionEffect'); if (Role == ROLE_Authority && ONSMineLayer(Owner) != None) ONSMineLayer(Owner).CurrentMines--; Super.Destroyed(); } simulated function ProcessTouch(Actor Other, vector HitLocation) { if (ONSMineProjectile(Other) != None) { if (Other.Owner == None || Other.Owner != Owner) BlowUp(Location); else if (Physics == PHYS_Falling) Velocity = vect(0,0,250) + 100 * VRand(); } else if (Pawn(Other) != None) { if (Other != Instigator && Pawn(Other).GetTeamNum() != TeamNum) BlowUp(Location); } else if (Other.bCanBeDamaged && Other.Base != self) BlowUp(Location); } simulated function AdjustSpeed() { ScurrySpeed = default.ScurrySpeed / (Attached.length + 1); ScurryAnimRate = default.ScurryAnimRate / (Attached.length + 1); } simulated function Attach(Actor Other) { AdjustSpeed(); } simulated function Detach(Actor Other) { AdjustSpeed(); } function AcquireTarget() { local Pawn A; local float Dist, BestDist; TargetPawn = None; foreach VisibleCollidingActors(class'Pawn', A, 750.0) { if ( A != Instigator && A.Health > 0 && A.GetTeamNum() != TeamNum && (Vehicle(A) == None || Vehicle(A).Driver != None || Vehicle(A).bTeamLocked) && (ONSStationaryWeaponPawn(A) == None || ONSStationaryWeaponPawn(A).bPowered) ) { Dist = VSize(A.Location - Location); if (TargetPawn == None || Dist < BestDist) { TargetPawn = A; BestDist = Dist; } } } } function WarnTarget() { if (TargetPawn != None && TargetPawn.Controller != None) { TargetPawn.Controller.ReceiveProjectileWarning(self); if (AIController(TargetPawn.Controller) != None && AIController(TargetPawn.Controller).Skill >= 5.0 && !TargetPawn.IsFiring()) { TargetPawn.Controller.Focus = self; TargetPawn.Controller.FireWeaponAt(self); } } } function TakeDamage(int Damage, Pawn InstigatedBy, vector HitLocation, vector Momentum, class DamageType) { if ( Damage > 0 && InstigatedBy != None && (Instigator != InstigatedBy || DamageType != MyDamageType) && (Instigator == None || Instigator == InstigatedBy || InstigatedBy.GetTeamNum() != Instigator.GetTeamNum()) ) BlowUp(Location); } function PhysicsVolumeChange(PhysicsVolume NewVolume) { if (NewVolume.bPainCausing) BlowUp(Location); } auto state Flying { simulated function Landed( vector HitNormal ) { local rotator NewRot; if ( Level.NetMode != NM_DedicatedServer ) PlaySound(ImpactSound, SLOT_Misc); bProjTarget = True; NewRot = rotator(HitNormal); NewRot.Pitch -= 16384; SetRotation(NewRot); GotoState('OnGround'); } simulated function HitWall( vector HitNormal, Actor Wall ) { if (bBounce) { if (Wall != None && Instigator != None && Pawn(Wall) != None) { if (Pawn(Wall).GetTeamNum() == Instigator.GetTeamNum()) bUseCollisionStaticMesh = True; else BlowUp(Location); } bBounce = False; } else BlowUp(Location); } simulated function BeginState() { SetPhysics(PHYS_Falling); } } simulated state OnGround { simulated function Timer() { if (Role < ROLE_Authority) { if (TargetPawn != None) GotoState('Scurrying'); else if (bGoToTargetLoc) GotoState('ScurryToTargetLoc'); return; } if (Instigator == None) BlowUp(Location); AcquireTarget(); if (TargetPawn != None) GotoState('Scurrying'); } simulated function BeginState() { SetPhysics(PHYS_None); Velocity = vect(0,0,0); SetTimer(DetectionTimer, True); Timer(); } simulated function EndState() { SetTimer(0, False); } Begin: bRotateToDesired = False; sleep(0.4); PlayAnim('CloseDown'); bClosedDown = true; } simulated state Scurrying { simulated function Timer() { local vector NewLoc; local rotator TargetDirection; local float TargetDist; if (TargetPawn == None) GotoState('Flying'); if (Physics != PHYS_Walking) return; NewLoc = TargetPawn.Location - Location; TargetDist = VSize(NewLoc); // // If we are on a vehicle jump off // if (bUseCollisionStaticMesh) // { // log("Jumping off"); // GotoState('Flying'); // Velocity = 1.2 * (Normal(NewLoc) * ScurrySpeed); // Velocity.Z = 350; // } if (TargetDist < 1000.0) { NewLoc.Z = 0; Velocity = Normal(NewLoc) * ScurrySpeed; if (TargetDist < 225.0) { GotoState('Flying'); Velocity *= 1.2; Velocity.Z = 350; WarnTarget(); } else { TargetDirection = Rotator(NewLoc); TargetDirection.Yaw -= 16384; TargetDirection.Roll = 0; SetRotation(TargetDirection); LoopAnim('Scurry', ScurryAnimRate); } } else GotoState('Flying'); } simulated event BaseChange() { Super.BaseChange(); if (Base != None && Vehicle(Base) == None) bUseCollisionStaticMesh = False; } simulated function Landed(vector HitNormal) { SetPhysics(PHYS_Walking); } function BeginState() { WarnTarget(); } simulated function EndState() { StopAnimating(); SetTimer(0.0, False); } Begin: SetPhysics(PHYS_Walking); if (bClosedDown) { PlayAnim('StartUp'); bClosedDown = false; sleep(0.25); } SetTimer(DetectionTimer / 2, true); } simulated function BlowUp(Vector HitLocation) { local int i; if (Role == ROLE_Authority) HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); //make sure anything attached gets blown up too for (i = 0; i < Attached.length; i++) Attached[i].TakeDamage(Damage, Instigator, Attached[i].Location, vect(0,0,0), MyDamageType); PlaySound(ExplodeSound, SLOT_Misc); Destroy(); } function SetScurryTarget(vector NewTargetLoc) { if (TargetPawn == None) { TargetLoc = NewTargetLoc + VRand() * Rand(TargetLocFuzz); bGoToTargetLoc = true; GotoState('ScurryToTargetLoc'); } } simulated state ScurryToTargetLoc extends Scurrying { function SetScurryTarget(vector NewTargetLoc) { TargetLoc = NewTargetLoc + VRand() * Rand(TargetLocFuzz); } simulated function Landed(vector HitNormal) { SetPhysics(PHYS_Walking); } simulated function Timer() { local vector NewLoc; local rotator TargetDirection; if (Physics != PHYS_Walking) return; NewLoc = TargetLoc - Location; NewLoc.Z = 0; if (VSize(NewLoc) < 250) { AcquireTarget(); if (TargetPawn != None) GotoState('Scurrying'); else GotoState('Flying'); return; } Velocity = Normal(NewLoc) * ScurrySpeed; TargetDirection = Rotator(NewLoc); TargetDirection.Yaw -= 16384; TargetDirection.Roll = 0; SetRotation(TargetDirection); LoopAnim('Scurry', ScurryAnimRate); } simulated function EndState() { SetTimer(0.0, False); bGoToTargetLoc = false; } } @>S//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineLayerPickup extends UTWeaponPickup; #exec OBJ LOAD FILE=VMWeaponsSM.usx static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'); L.AddPrecacheMaterial(Shader'VMWeaponsTX.PlayerWeaponsGroup.ParasiteMineImplantTEXshad'); L.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'); L.AddPrecacheMaterial(Texture'XGameShaders.WeaponShaders.bio_flash'); L.AddPrecacheMaterial(Texture'AW-2004Particles.Weapons.BeamFragment'); L.AddPrecacheStaticMesh(default.StaticMesh); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineTEX'); Level.AddPrecacheMaterial(Shader'VMWeaponsTX.PlayerWeaponsGroup.ParasiteMineImplantTEXshad'); Level.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.SpiderMineBLUETEX'); Level.AddPrecacheMaterial(Texture'XGameShaders.WeaponShaders.bio_flash'); Level.AddPrecacheMaterial(Texture'AW-2004Particles.Weapons.BeamFragment'); super.UpdatePrecacheMaterials(); } @>E//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineLayerAttachment extends xWeaponAttachment; var xEmitter MuzFlash3rd; simulated function Destroyed() { if (MuzFlash3rd != None) MuzFlash3rd.Destroy(); Super.Destroyed(); } simulated event ThirdPersonEffects() { // local Rotator R; // // if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) // { // if (MuzFlash3rd == None) // { // MuzFlash3rd = Spawn(class'XEffects.BioMuzFlash1st'); // MuzFlash3rd.bHidden = false; // AttachToBone(MuzFlash3rd, 'tip'); // } // if (MuzFlash3rd != None) // { // R.Roll = Rand(65536); // SetBoneRotation('Bone_Flash', R, 0, 1.0); // MuzFlash3rd.mStartParticles++; // } // } Super.ThirdPersonEffects(); } @>@@>@>lBJCp 9?9Do n FPPR &v#%v#r-g8 w*.-'w*?V" G@>HX8/-\ q!gq!JFG" G@>IFA.9:9:$ wO * rW*WaO W tB!@>Wa*WBW h,#?+wL * rQ*QaL  5pB!@>Qa*QBQ h,#? G@>cX//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineLayer extends Weapon config(User); #exec OBJ LOAD FILE=HudContent.utx const NUM_BARRELS = 4; const BARREL_ROTATION_RATE = 2.0; var() float ReloadDelay; var float BarrelRotation; var float FinalRotation; var bool bRotateBarrel; var array Mines; var int CurrentMines, MaxMines; var color FadedColor; replication { reliable if (bNetOwner && bNetDirty && Role == ROLE_Authority) CurrentMines; } simulated function DrawWeaponInfo(Canvas Canvas) { NewDrawWeaponInfo(Canvas, 0.705*Canvas.ClipY); } simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos) { local int i, Half; local float ScaleFactor; ScaleFactor = 99 * Canvas.ClipX/3200; Half = (MaxMines + 1) / 2; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.DrawColor = class'HUD'.Default.WhiteColor; for (i = 0; i < Half; i++) { if (i >= CurrentMines) Canvas.DrawColor = FadedColor; Canvas.SetPos(Canvas.ClipX - (i+1) * ScaleFactor * 1.25, YPos); Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 391, 383, 44, 49); } for (i = Half; i < MaxMines; i++) { if (i >= CurrentMines) Canvas.DrawColor = FadedColor; Canvas.SetPos(Canvas.ClipX - (i-Half+1) * ScaleFactor * 1.25, YPos - ScaleFactor); Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 391, 383, 44, 49); } } simulated function bool HasAmmo() { if (CurrentMines > 0) return true; return (FireMode[0] != None && AmmoAmount(0) >= FireMode[0].AmmoPerFire); } simulated function bool CanThrow() { if ( AmmoAmount(0) <= 0 ) return false; return Super.CanThrow(); } simulated function Destroyed() { local int x; if (Role == ROLE_Authority) for (x = 0; x < Mines.Length; x++) if (Mines[x] != None) Mines[x].Explode(Mines[x].Location, vect(0,0,1)); Super.Destroyed(); } // AI Interface function float GetAIRating() { local Bot B; local float EnemyDist; local vector EnemyDir; if ( AmmoAmount(0) <= 0 ) return 0; B = Bot(Instigator.Controller); if (B == None) return AIRating; if (B.Enemy == None) { if (B.Formation() && B.Squad.SquadObjective != None && B.Squad.SquadObjective.BotNearObjective(B)) { if ( DestroyableObjective(B.Squad.SquadObjective) != None && B.Squad.SquadObjective.TeamLink(B.Squad.Team.TeamIndex) && DestroyableObjective(B.Squad.SquadObjective).Health < DestroyableObjective(B.Squad.SquadObjective).DamageCapacity ) return 1.1; //hackish - don't want higher priority than anything that can heal objective return 1.5; } return AIRating; } // if retreating, favor this weapon EnemyDir = B.Enemy.Location - Instigator.Location; EnemyDist = VSize(EnemyDir); if ( EnemyDist > 1500 ) return 0.1; if ( B.IsRetreating() ) return (AIRating + 0.4); if ( -1 * EnemyDir.Z > EnemyDist ) return AIRating + 0.1; if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon ) return (AIRating + 0.3); if ( EnemyDist > 1000 ) return 0.35; return AIRating; } /* BestMode() choose between regular or alt-fire */ function byte BestMode() { local AIController C; C = AIController(Instigator.Controller); if (C == None || C.Enemy == None) return 0; if (CurrentMines < 2 || VSize(C.Enemy.Location - Instigator.Location) < 2500 || FRand() < 0.5) return 0; return 1; } function float SuggestAttackStyle() { local Bot B; local float EnemyDist; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0.4; EnemyDist = VSize(B.Enemy.Location - Instigator.Location); if ( EnemyDist > 1500 ) return 1.0; if ( EnemyDist > 1000 ) return 0.4; return -0.4; } function float SuggestDefenseStyle() { local Bot B; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0; if ( VSize(B.Enemy.Location - Instigator.Location) < 1600 ) return -0.6; return 0; } function bool ShouldFireWithoutTarget() { local ONSPowerCore OPC; if ( ShootTarget(Instigator.Controller.Target) != None ) { OPC = ONSPowerCore(Instigator.Controller.Target.Owner); if ( (OPC != None) && !OPC.Shield.bHidden ) { Instigator.Controller.Target = OPC.PathList[Rand(OPC.PathList.Length)].End; return ( Instigator.Controller.Target != None ); } } if (CurrentMines < MaxMines) return true; return false; } // End AI Interface simulated function PlayFiring(bool plunge) { GotoState('AnimateLoad', 'Begin'); } simulated function RotateBarrel() { FinalRotation -= 65535.0 / NUM_BARRELS; if (FinalRotation <= 0.0) { FinalRotation += 65535.0; BarrelRotation += 65535.0; } bRotateBarrel = True; } simulated function UpdateBarrel(float dt) { local Rotator R; BarrelRotation -= dt * 65535.0 * BARREL_ROTATION_RATE / NUM_BARRELS; if (BarrelRotation < FinalRotation) { BarrelRotation = FinalRotation; bRotateBarrel = False; GotoState(''); } R.Roll = BarrelRotation; SetBoneRotation('drum', R, 0, 1); } simulated state AnimateLoad { simulated function Tick(float dt) { if (bRotateBarrel) UpdateBarrel(dt); } Begin: sleep(ReloadDelay); RotateBarrel(); PlaySound(sound'PickupSounds.FlakAmmoPickup', SLOT_Misc); ClientPlayForceFeedback("FlakAmmoPickup"); } @>M@>@>N@>@>@>@>t//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineAmmoPickup extends UTAmmoPickup; @>RiO"a r* i.^wi*i$\)w x { BDF G@>l//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMineAmmo extends Ammunition; @>z//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMapListOnslaught extends MapList config; @>Y2mkb,9:9:$-l8(o9?%fK-a%pW"-evr19?%p9P99pr1{9?b?-eoPPmoR kmp1oo1'( GSu 6UmcH lpEGKF@>@>@>@>F//----------------------------------------------------------- // //----------------------------------------------------------- class ONSManualGunPlasmaProjectile extends ONSPlasmaProjectile; @>@>@>@>@>@>@>p//----------------------------------------------------------- // //----------------------------------------------------------- class ONSManualGunPawn extends ONSStationaryWeaponPawn; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx simulated function ActivateOverlay(bool bActive) { if (Controller==None) return; Super.ActivateOverlay(bActive); if (Gun != None) { if (bActive) Gun.SetBoneScale(4, 0.0, 'TurretCockpit'); else Gun.SetBoneScale(4, 1.0, 'TurretCockpit'); } } @>k?//----------------------------------------------------------- // //----------------------------------------------------------- class ONSManualGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx #exec OBJ LOAD FILE=..\Textures\TurretParticles.utx var class BeamEffectClass[2]; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'TurretParticles.Beams.TurretBeam5'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaMuzzleBlue'); L.AddPrecacheMaterial(Material'EpicParticles.Flares.SoftFlare'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); L.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); L.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_b'); L.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_mark_heat'); L.AddPrecacheMaterial(Material'XEffectMat.shock_core'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'TurretParticles.Beams.TurretBeam5'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaMuzzleBlue'); Level.AddPrecacheMaterial(Material'EpicParticles.Flares.SoftFlare'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); Level.AddPrecacheMaterial(Material'XEffectMat.shock_flare_a'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock_ring_b'); Level.AddPrecacheMaterial(Material'XEffectMat.Shock.shock_mark_heat'); Level.AddPrecacheMaterial(Material'XEffectMat.shock_core'); Super.UpdatePrecacheMaterials(); } function TraceFire(Vector Start, Rotator Dir) { local Vector X, End, HitLocation, HitNormal; local Actor Other; local int Damage; X = Vector(Dir); End = Start + TraceRange * X; //skip past vehicle driver if (ONSVehicle(Instigator) != None && ONSVehicle(Instigator).Driver != None) { ONSVehicle(Instigator).Driver.bBlockZeroExtentTraces = False; Other = Trace(HitLocation, HitNormal, End, Start, True); ONSVehicle(Instigator).Driver.bBlockZeroExtentTraces = true; } else Other = Trace(HitLocation, HitNormal, End, Start, True); if (Other != None) { if (!Other.bWorldGeometry) { Damage = (DamageMin + Rand(DamageMax - DamageMin)); if (ONSPowerCore(Other) == None && ONSPowerNodeEnergySphere(Other) == None) // Sweet Hackaliciousness Other.TakeDamage(Damage, Instigator, HitLocation, Momentum*X, DamageType); HitNormal = vect(0,0,0); } } else { HitLocation = End; HitNormal = Vect(0,0,0); } HitCount++; LastHitLocation = HitLocation; SpawnHitEffects(Other, HitLocation, HitNormal); } state InstantFireMode { simulated function SpawnHitEffects(actor HitActor, vector HitLocation, vector HitNormal) { local ONSTurretBeamEffect Beam; if (Level.NetMode != NM_DedicatedServer) { if (Role < ROLE_Authority) { CalcWeaponFire(); DualFireOffset *= -1; } if (!Level.bDropDetail && Level.DetailMode != DM_Low) { if (DualFireOffset < 0) PlayAnim('RightFire'); else PlayAnim('LeftFire'); } Beam = Spawn(BeamEffectClass[Team],,, WeaponFireLocation, rotator(HitLocation - WeaponFireLocation)); BeamEmitter(Beam.Emitters[0]).BeamDistanceRange.Min = VSize(WeaponFireLocation - HitLocation); BeamEmitter(Beam.Emitters[0]).BeamDistanceRange.Max = VSize(WeaponFireLocation - HitLocation); BeamEmitter(Beam.Emitters[1]).BeamDistanceRange.Min = VSize(WeaponFireLocation - HitLocation); BeamEmitter(Beam.Emitters[1]).BeamDistanceRange.Max = VSize(WeaponFireLocation - HitLocation); Beam.SpawnEffects(HitLocation, HitNormal); } } } @>R~AwAy9:9:$ C9?,5^G aAH ^C^C(kG ^H  G @>Q// Onslaught Link Designer and link setup related messages class ONSLinkDesignMessage extends LocalMessage; var(String) localized string SetupString, SaveSetupString, LoadSetupString, SaveFailedString, LoadFailedString, DeleteSetupString, DeleteOfficialFailedString, DeleteNothingString, NoPathToPowerCoreString, LoadFailedNoPathToCoreString; static function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if (Switch == 7) P.ClientOpenMenu("GUI2K4.UT2K4GenericMessageBox",,, default.NoPathToPowerCoreString); else if (Switch == 8) P.ClientOpenMenu("GUI2K4.UT2K4GenericMessageBox",,, default.LoadFailedNoPathToCoreString); else Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } static function color GetConsoleColor(PlayerReplicationInfo RelatedPRI_1) { return class'HUD'.Default.WhiteColor; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch (Switch) { case 0: return Default.SaveSetupString; case 1: return Default.SaveFailedString; case 2: return Default.LoadSetupString; case 3: return Default.LoadFailedString; case 4: return Default.DeleteSetupString; case 5: return Default.DeleteOfficialFailedString; case 6: return Default.DeleteNothingString; } } @>c//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHUDOnslaught extends HudCTeamDeathMatch config(user); var config float RadarScale, RadarTrans, IconScale, RadarPosX, RadarPosY; var float RadarMaxRange, RadarRange; var ONSPowerCore FinalCore[2]; var ONSPowerCore Node; var ONSPlayerReplicationInfo OwnerPRI; var protected array PowerLinks; //var array PowerLinks; var bool bMapDisabled; var bool bReceivedLinks; var vector MapCenter; var float ColorPercent; var() Material HealthBarBackMat; var() Material HealthBarMat; var() float HealthBarWidth; var() float HealthBarHeight, HealthBarPosition; var() float HealthBarViewDist; var() Material BorderMat; var() color NeutralColor; var() color AttackColorA; var() color AttackColorB; var() color SeveredColorA; var() color SeveredColorB; var() color LinkColor[3]; var() SpriteWidget SymbolGB[2]; var() SpriteWidget CoreWidgets[2]; var() NumericWidget CoreHealthWidgets[2]; var() NumericWidget NodeLabelWidget; #EXEC OBJ LOAD FILE=InterfaceContent.utx #EXEC OBJ LOAD FILE=ONSInterface-TX.utx simulated event PostBeginPlay() { local ONSPowerCore Core; local TerrainInfo T, PrimaryTerrain; local int i; Super.PostBeginPlay(); foreach AllActors( class'ONSPowerCore', Core ) if ( Core.bFinalCore ) FinalCore[Core.DefenderTeamIndex] = Core; Node = FinalCore[0]; // Setup links right away, even though these will be overwritten when the new link setup is received from the server if ( Level.NetMode == NM_Client ) SetupLinks(); // Assign PowerNode numbers Core = Node; do { if (ONSPowerNode(Core) != None) { Core.NodeNum = ++i; Core.UpdateLocationName(); } Core = Core.NextCore; } until ( Core == None || Core == Node ); // Determine primary terrain foreach AllActors(class'TerrainInfo', T) { PrimaryTerrain = T; if (T.Tag == 'PrimaryTerrain') Break; } // Set RadarMaxRange to size of primary terrain if (Level.bUseTerrainForRadarRange && PrimaryTerrain != None) RadarRange = abs(PrimaryTerrain.TerrainScale.X * PrimaryTerrain.TerrainMap.USize) / 2.0; else if (Level.CustomRadarRange > 0) RadarRange = Clamp(Level.CustomRadarRange, 500.0, default.RadarMaxRange); SetTimer(1.0, true); Timer(); } simulated function SetupLinks() { local ONSPowerCore Core; local int i; if ( Node == None ) return; // log(Name@"SetupLinks"); Core = Node; do { for ( i = 0; i < Core.PowerLinks.Length; i++ ) AddLink(Core, Core.PowerLinks[i]); Core = Core.NextCore; } until ( Core == None || Core == Node ); } simulated function ReceiveLink( ONSPowerCore A, ONSPowerCore B ) { bReceivedLinks = True; // log(Name@"ReceiveLink A:"$A.Name@"B:"$B.Name); AddLink(A,B); // A.AddPowerLink(B); } simulated function AddLink( ONSPowerCore A, ONSPowerCore B ) { local PowerLink Link; if ( HasLink(A,B) ) return; Link = Spawn(class'PowerLink'); Link.SetNodes(A,B); PowerLinks[PowerLinks.Length] = Link; } simulated function RemoveLink( ONSPowerCore A, ONSPowerCore B ) { local int i; // log(Name@"Remove link from A:"$A.Name@"to"@B.Name); for ( i = PowerLinks.Length - 1; i >= 0; i-- ) { if ( PowerLinks[i] == None ) { PowerLinks.Remove(i,1); continue; } if ( PowerLinks[i].HasNodes(A,B) ) { // log(Name@"found powerlink containing those nodes:"$PowerLinks[i].Name); PowerLinks[i].Destroy(); PowerLinks.Remove(i,1); } } } simulated function ResetLinks() { // log(Name@"ResetLinks"); ClearLinks(); RequestPowerLinks(); /* if ( Level.NetMode == NM_Client ) { Core = Node; do { Core.PowerCoreReset(); Core = Core.NextCore; } until ( Core == None || Core == Node ); } */ } simulated function bool HasLink( ONSPowerCore A, ONSPowerCore B ) { local int i; for ( i = PowerLinks.Length - 1; i >= 0; i-- ) { if ( PowerLinks[i] == None ) { PowerLinks.Remove(i,1); continue; } if ( PowerLinks[i].HasNodes(A,B) ) return True; } return False; } simulated function ClearLinks() { local int i; bReceivedLinks = False; // log(Name@"ClearLinks"@PowerLinks.Length); for ( i = 0; i < PowerLinks.Length; i++ ) if ( PowerLinks[i] != None ) PowerLinks[i].Destroy(); PowerLinks.Remove(0, PowerLinks.Length); } // Finds a PowerCore within 2500 units of PosX/PosY on the RadarMap (assumes a map centered at 0,0,0) simulated function ONSPowerCore LocatePowerCore(float PosX, float PosY, float RadarWidth) { local float WorldToMapScaleFactor, Distance, LowestDistance; local vector WorldLocation, DistanceVector; local ONSPowerCore BestCore, Core; if (Node == None) return None; WorldToMapScaleFactor = RadarRange/RadarWidth; WorldLocation.X = PosX * WorldToMapScaleFactor; WorldLocation.Y = PosY * WorldToMapScaleFactor; LowestDistance = 2500.0; Core = Node; do { DistanceVector = Core.Location - WorldLocation; DistanceVector.Z = 0; Distance = VSize(DistanceVector); if (Distance < LowestDistance) { BestCore = Core; LowestDistance = Distance; } Core = Core.NextCore; } until ( Core == None || Core == Node ); return BestCore; } simulated function DrawRadarMap(Canvas C, float CenterPosX, float CenterPosY, float RadarWidth, bool bShowDisabledNodes) { local float PawnIconSize, PlayerIconSize, CoreIconSize, MapScale, MapRadarWidth; local vector HUDLocation; local FinalBlend PlayerIcon; local Actor A; local ONSPowerCore CurCore; local int i; local plane SavedModulation; SavedModulation = C.ColorModulate; C.ColorModulate.X = 1; C.ColorModulate.Y = 1; C.ColorModulate.Z = 1; C.ColorModulate.W = 1; // Make sure that the canvas style is alpha C.Style = ERenderStyle.STY_Alpha; MapRadarWidth = RadarWidth; if (PawnOwner != None) { // MapCenter.X = FClamp(PawnOwner.Location.X, -RadarMaxRange + RadarRange, RadarMaxRange - RadarRange); // MapCenter.Y = FClamp(PawnOwner.Location.Y, -RadarMaxRange + RadarRange, RadarMaxRange - RadarRange); MapCenter.X = 0.0; MapCenter.Y = 0.0; } else MapCenter = vect(0,0,0); HUDLocation.X = RadarWidth; HUDLocation.Y = RadarRange; HUDLocation.Z = RadarTrans; DrawMapImage( C, Level.RadarMapImage, CenterPosX, CenterPosY, MapCenter.X, MapCenter.Y, HUDLocation ); if (Node == None) return; CurCore = Node; do { if ( CurCore.HasHealthBar() ) DrawHealthBar(C, CurCore, CurCore.Health, CurCore.DamageCapacity, HealthBarPosition); CurCore = CurCore.NextCore; } until ( CurCore == None || CurCore == Node ); CoreIconSize = IconScale * 16 * C.ClipX * HUDScale/1600; PawnIconSize = CoreIconSize * 0.5; PlayerIconSize = CoreIconSize * 1.5; MapScale = MapRadarWidth/RadarRange; C.Font = GetConsoleFont(C); Node.UpdateHUDLocation( CenterPosX, CenterPosY, RadarWidth, RadarRange, MapCenter ); for ( i = 0; i < PowerLinks.Length; i++ ) PowerLinks[i].Render(C, ColorPercent, bShowDisabledNodes); CurCore = Node; do { if (!bShowDisabledNodes && (CurCore.CoreStage == 255 || CurCore.PowerLinks.Length == 0)) //hide unused powernodes { if (PlayerOwner==none || !PlayerOwner.bDemoOwner) { CurCore = CurCore.NextCore; continue; } } C.DrawColor = LinkColor[CurCore.DefenderTeamIndex]; // Draw appropriate icon to represent the current state of this node if (CurCore.bUnderAttack || (CurCore.CoreStage == 0 && CurCore.bSevered)) DrawAttackIcon( C, CurCore, CurCore.HUDLocation, IconScale, HUDScale, ColorPercent ); if (CurCore.bFinalCore) DrawCoreIcon( C, CurCore.HUDLocation, PowerCoreAttackable(CurCore), IconScale, HUDScale, ColorPercent ); else { DrawNodeIcon( C, CurCore.HUDLocation, PowerCoreAttackable(CurCore), CurCore.CoreStage, IconScale, HUDScale, ColorPercent ); DrawNodeLabel(C, CurCore.HUDLocation, IconScale, HUDScale, C.DrawColor, CurCore.NodeNum); } CurCore = CurCore.NextCore; } until ( CurCore == None || CurCore == Node ); // Draw PlayerIcon if (PawnOwner != None) A = PawnOwner; else if (PlayerOwner.IsInState('Spectating')) A = PlayerOwner; else if (PlayerOwner.Pawn != None) A = PlayerOwner.Pawn; if (A != None) { PlayerIcon = FinalBlend'CurrentPlayerIconFinal'; TexRotator(PlayerIcon.Material).Rotation.Yaw = -A.Rotation.Yaw - 16384; HUDLocation = A.Location - MapCenter; HUDLocation.Z = 0; if (HUDLocation.X < (RadarRange * 0.95) && HUDLocation.Y < (RadarRange * 0.95)) { C.SetPos( CenterPosX + HUDLocation.X * MapScale - PlayerIconSize * 0.5, CenterPosY + HUDLocation.Y * MapScale - PlayerIconSize * 0.5 ); C.DrawColor = C.MakeColor(40,255,40); C.DrawTile(PlayerIcon, PlayerIconSize, PlayerIconSize, 0, 0, 64, 64); } } // // VERY SLOW DEBUGGING CODE for showing all the dynamic actors that exist in the level in real-time // ForEach DynamicActors(class'Actor', A) // { // if (A.IsA('Projectile')) //(A.IsA('Projector') || A.IsA('Emitter') || A.IsA('xEmitter')) // { // HUDLocation = A.Location - MapCenter; // HUDLocation.Z = 0; // C.SetPos(CenterPosX + HUDLocation.X * MapScale - PlayerIconSize * 0.5 * 0.25, CenterPosY + HUDLocation.Y * MapScale - PlayerIconSize * 0.5 * 0.25); // C.DrawColor = C.MakeColor(255,255,0); // C.DrawTile(Material'NewHUDIcons', PlayerIconSize * 0.25, PlayerIconSize * 0.25, 0, 0, 32, 32); // } // if (A.IsA('Pawn')) // { // if (Pawn(A).PlayerReplicationInfo != None && Pawn(A).PlayerReplicationInfo.Team != None) // { // if (Pawn(A).PlayerReplicationInfo.Team.TeamIndex == 0) // C.DrawColor = C.MakeColor(255,0,0); // else if (Pawn(A).PlayerReplicationInfo.Team.TeamIndex == 1) // C.DrawColor = C.MakeColor(0,0,255); // else // C.DrawColor = C.MakeColor(255,0,255); // } // else // C.DrawColor = C.MakeColor(255,255,255); // // HUDLocation = A.Location - MapCenter; // HUDLocation.Z = 0; // // if (A.IsA('Vehicle')) // { // C.SetPos(CenterPosX + HUDLocation.X * MapScale - PlayerIconSize * 0.5 * 0.5, CenterPosY + HUDLocation.Y * MapScale - PlayerIconSize * 0.5 * 0.5); // C.DrawTile(Material'NewHUDIcons', PlayerIconSize * 0.5, PlayerIconSize * 0.5, 0, 0, 32, 32); // } // else // { // C.SetPos(CenterPosX + HUDLocation.X * MapScale - PlayerIconSize * 0.5 * 0.25, CenterPosY + HUDLocation.Y * MapScale - PlayerIconSize * 0.5 * 0.25); // C.DrawTile(Material'NewHUDIcons', PlayerIconSize * 0.25, PlayerIconSize * 0.25, 0, 0, 32, 32); // } // } // } // Draw Border C.DrawColor = C.MakeColor(200,200,200); C.SetPos(CenterPosX - RadarWidth, CenterPosY - RadarWidth); C.DrawTile(BorderMat, RadarWidth * 2.0, RadarWidth * 2.0, 0, 0, 256, 256); C.ColorModulate = SavedModulation; } function bool PowerCoreAttackable(ONSPowerCore PC) { if (PawnOwnerPRI != None && PawnOwnerPRI.Team != None) { if (PC.DefenderTeamIndex != PawnOwnerPRI.Team.TeamIndex) return (PC.PoweredBy(PawnOwnerPRI.Team.TeamIndex)); else { if (PawnOwnerPRI.Team.TeamIndex == 0) return (PC.PoweredBy(1)); else return (PC.PoweredBy(0)); } } return False; } simulated function ShowTeamScorePassA(Canvas C) { local int x; Super.ShowTeamScorePassA(C); if (bShowPoints) for (x = 0; x < 2; x++) { DrawSpriteWidget (C, SymbolGB[x]); if (FinalCore[x] != None && FinalCore[x].CoreStage == 0) { DrawSpriteWidget (C, CoreWidgets[x]); if (FinalCore[x].bUnderAttack) { CoreHealthWidgets[x].Tints[TeamIndex].G = 255 * ColorPercent; CoreHealthWidgets[x].Tints[TeamIndex].B = 255 * ColorPercent; } else CoreHealthWidgets[x].Tints[TeamIndex] = WhiteColor; CoreHealthWidgets[x].Value = round((float(FinalCore[x].Health) / FinalCore[x].DamageCapacity) * 100); DrawNumericWidget(C, CoreHealthWidgets[x], DigitsBig); //C.DrawColor = HudColorHighLight; //Draw2DLocationDot(C, FinalCore[x].Location,0.5 + tmpPosX[x]*HUDScale, tmpPosY*HUDScale, tmpScaleX*HUDScale, tmpScaleY*HUDScale); } } } simulated function ShowTeamScorePassC(Canvas C) { local float RadarWidth, CenterRadarPosX, CenterRadarPosY; if (Level.bShowRadarMap && !bMapDisabled) { RadarWidth = 0.5 * RadarScale * HUDScale * C.ClipX; CenterRadarPosX = (RadarPosX * C.ClipX) - RadarWidth; CenterRadarPosY = (RadarPosY * C.ClipY) + RadarWidth; DrawRadarMap(C, CenterRadarPosX, CenterRadarPosY, RadarWidth, false); } } simulated function DrawNodeLabel(Canvas C, vector HUDLocation, float IconScaling, float HUDScaling, Color LabelColor, int Num) { local float LabelIconSize; local int TensPlace,row,col; local float x,y; if ( C == None || Num >= 100) return; LabelIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; C.DrawColor = WhiteColor; if (Num > 9) { TensPlace = Num / 10; Num = Num - (TensPlace * 10); X = HUDLocation.X - (1.5 * LabelIconSize * 1.5); Y = HUDLocation.Y - LabelIconSize * 1.5; C.SetDrawColor(0,0,0,255); for (Row=-1;Row<2;Row++) { for (Col=-1;Col<2;Col++) { C.SetPos(X+Col,Y+Row ); C.DrawTile(DigitsBig.DigitTexture, LabelIconSize, LabelIconSize, DigitsBig.TextureCoords[TensPlace].X1, DigitsBig.TextureCoords[TensPlace].Y1, DigitsBig.TextureCoords[0].X2, DigitsBig.TextureCoords[0].Y2); } } C.SetDrawColor(255,255,0,255); C.SetPos(X,Y); C.DrawTile(DigitsBig.DigitTexture, LabelIconSize, LabelIconSize, DigitsBig.TextureCoords[TensPlace].X1, DigitsBig.TextureCoords[TensPlace].Y1, DigitsBig.TextureCoords[0].X2, DigitsBig.TextureCoords[0].Y2); } X = HUDLocation.X - LabelIconSize * 1.5; Y = HUDLocation.Y - LabelIconSize * 1.5; C.SetDrawColor(0,0,0,255); for (Row=-1;Row<2;Row++) { for (Col=-1;Col<2;Col++) { C.SetPos(x+Col,y+Row); C.DrawTile(DigitsBig.DigitTexture, LabelIconSize, LabelIconSize, DigitsBig.TextureCoords[Num].X1, DigitsBig.TextureCoords[Num].Y1, DigitsBig.TextureCoords[0].X2, DigitsBig.TextureCoords[0].Y2); } } C.SetDrawColor(255,255,0,255); C.SetPos(x,y); C.DrawTile(DigitsBig.DigitTexture, LabelIconSize, LabelIconSize, DigitsBig.TextureCoords[Num].X1, DigitsBig.TextureCoords[Num].Y1, DigitsBig.TextureCoords[0].X2, DigitsBig.TextureCoords[0].Y2); } simulated function DrawHealthBar(Canvas C, Actor A, int Health, int MaxHealth, float Height) { local vector CameraLocation, CamDir, TargetLocation, HBScreenPos; local rotator CameraRotation; local float Dist, HealthPct; local color OldDrawColor; // rjp -- don't draw the health bar if menus are open if ( PlayerOwner.Player.GUIController.bActive ) return; OldDrawColor = C.DrawColor; C.GetCameraLocation( CameraLocation, CameraRotation ); TargetLocation = A.Location + vect(0,0,1) * Height; Dist = VSize(TargetLocation - CameraLocation); // Check Distance Threshold if (Dist > HealthBarViewDist) return; CamDir = vector(CameraRotation); // Target is located behind camera HBScreenPos = C.WorldToScreen(TargetLocation); if ((TargetLocation - CameraLocation) dot CamDir < 0 || HBScreenPos.X <= 0 || HBScreenPos.X >= C.SizeX || HBScreenPos.Y <= 0 || HBScreenPos.Y >= C.SizeY) { TargetLocation = A.Location + vect(0,0,1) * A.CollisionHeight; if ((TargetLocation - CameraLocation) dot CamDir < 0) return; HBScreenPos = C.WorldToScreen(TargetLocation); if (HBScreenPos.X <= 0 || HBScreenPos.X >= C.ClipX || HBScreenPos.Y <= 0 || HBScreenPos.Y >= C.ClipY) return; } if (FastTrace(TargetLocation, CameraLocation)) { C.DrawColor = WhiteColor; C.SetPos(HBScreenPos.X - HealthBarWidth * 0.5, HBScreenPos.Y); C.DrawTileStretched(HealthBarBackMat, HealthBarWidth, HealthBarHeight); HealthPct = 1.0f * Health / MaxHealth; if (HealthPct < 0.35) C.DrawColor = RedColor; else if (HealthPct < 0.70) C.DrawColor = GoldColor; else C.DrawColor = GreenColor; C.SetPos(HBScreenPos.X - HealthBarWidth * 0.5, HBScreenPos.Y); C.DrawTileStretched(HealthBarMat, HealthBarWidth * HealthPct, HealthBarHeight); } C.DrawColor = OldDrawColor; } simulated function Timer() { local ONSPowerCore C; if (PlayerOwner.Pawn != None && OwnerPRI != None && OwnerPRI.Team != None) { C = OwnerPRI.GetCurrentNode(); if (C != None) PlayerOwner.ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 22); } } simulated function Tick(float deltaTime) { local ONSPowerCore Core; Super.Tick(deltaTime); if ( OwnerPRI == None && PawnOwnerPRI != None ) OwnerPRI = ONSPlayerReplicationInfo(PawnOwnerPRI); if (FinalCore[0].DefenderTeamIndex != 0) { foreach AllActors( class'ONSPowerCore', Core ) if ( Core.bFinalCore && (Core.DefenderTeamIndex < 2) ) FinalCore[Core.DefenderTeamIndex] = Core; } if ( !bReceivedLinks && OwnerPRI != None ) { ClearLinks(); RequestPowerLinks(); } ColorPercent = 0.5f + Cos((Level.TimeSeconds * 4.0) * 3.14159 * 0.5f) * 0.5f; } simulated function RequestPowerLinks() { if ( OwnerPRI != None ) { OwnerPRI.OnReceiveLink = ReceiveLink; OwnerPRI.OnRemoveLink = RemoveLink; OwnerPRI.ResetLinks = ResetLinks; OwnerPRI.ServerSendPowerLinks(); bReceivedLinks = true; } } exec function ToggleRadarMap() { bMapDisabled = !bMapDisabled; } //exec function ZoomInRadarMap() //{ // RadarRange = Max(RadarRange - (RadarMaxRange * 0.1), 3000.0); //} // //exec function ZoomOutRadarMap() //{ // RadarRange = Min(RadarRange + (RadarMaxRange * 0.1), RadarMaxRange); //} exec function LinkDesigner() { if (OwnerPRI != None) OwnerPRI.RequestLinkDesigner(); } exec function CopyLinkSetup() { local ONSPowerLinkOfficialSetup S; local ONSOnslaughtGame.PowerLinkSetup BlankSetup; local ONSPowerCore O; local int x, y; S = spawn(class'ONSPowerLinkOfficialSetup'); foreach DynamicActors(class'ONSPowerCore', O) { S.LinkSetups[x] = BlankSetup; S.LinkSetups[x].BaseNode = O.Name; for (y = 0; y < O.PowerLinks.length; y++) S.LinkSetups[x].LinkedNodes[y] = O.PowerLinks[y].Name; x++; } CopyObjectToClipboard(S); S.Destroy(); PlayerOwner.ClientMessage("Link setup copied to clipboard"); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'HudContent.Generic.NoEntry'); Level.AddPrecacheMaterial(Material'HudContent.Generic.HUD'); Level.AddPrecacheMaterial(Material'InterfaceContent.BorderBoxD'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.HealthBar'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.MapBorderTex'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.NewHUDicons'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.CurrentPlayerIcon'); Super.UpdatePrecacheMaterials(); } simulated static function bool CoreWorldToScreen( ONSPowerCore Core, out vector ScreenPos, float ScreenX, float ScreenY, float RadarWidth, float Range, vector Center, optional bool bIgnoreRange ) { local vector ScreenLocation; local float Dist; if ( Core == None ) return false; ScreenLocation = Core.Location - Center; ScreenLocation.Z = 0; Dist = VSize(ScreenLocation); if ( bIgnoreRange || (Dist < (Range * 0.95)) ) { ScreenPos.X = ScreenX + ScreenLocation.X * (RadarWidth/Range); ScreenPos.Y = ScreenY + ScreenLocation.Y * (RadarWidth/Range); ScreenPos.Z = 0; return true; } return false; } simulated static function DrawMapImage( Canvas C, Material Image, float MapX, float MapY, float PlayerX, float PlayerY, vector Dimensions ) { local float MapScale, MapSize; local byte SavedAlpha; /* Dimensions.X = Width Dimensions.Y = Range Dimensions.Z = Alpha */ if ( Image == None || C == None ) return; MapSize = Image.MaterialUSize(); MapScale = MapSize / (Dimensions.Y * 2); SavedAlpha = C.DrawColor.A; C.DrawColor = default.WhiteColor; C.DrawColor.A = Dimensions.Z; C.SetPos( MapX - Dimensions.X, MapY - Dimensions.X ); C.DrawTile( Image, Dimensions.X * 2.0, Dimensions.X * 2.0, (PlayerX - Dimensions.Y) * MapScale + MapSize / 2.0, (PlayerY - Dimensions.Y) * MapScale + MapSize / 2.0, Dimensions.Y * 2 * MapScale, Dimensions.Y * 2 * MapScale ); C.DrawColor.A = SavedAlpha; } simulated static function DrawAttackIcon( Canvas C, ONSPowerCore CurCore, vector HUDLocation, float IconScaling, float HUDScaling, float ColorPercentage ) { local float AttackIconSize, CoreIconSize; local color HoldColor; if ( C == None ) return; if (CurCore.bFinalCore) CoreIconSize = 2.0 * IconScaling * 16 * C.ClipX * HUDScaling/1600; else CoreIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; AttackIconSize = CoreIconSize * (2.5 + 1.5 * ColorPercentage); HoldColor = C.DrawColor; if (CurCore.bSevered && CurCore.CoreStage == 0) C.DrawColor = default.SeveredColorA * ColorPercentage + default.SeveredColorB * (1.0 - ColorPercentage); else C.DrawColor = default.AttackColorA * ColorPercentage + default.AttackColorB * (1.0 - ColorPercentage); C.SetPos(HUDLocation.X - AttackIconSize * 0.5, HUDLocation.Y - AttackIconSize * 0.5); C.DrawTile(Material'NewHUDIcons', AttackIconSize, AttackIconSize, 0, 64, 64, 64); C.DrawColor = HoldColor; } simulated static function DrawCoreIcon( Canvas C, vector HUDLocation, bool bAttackable, float IconScaling, float HUDScaling, float ColorPercentage ) { local float CoreIconSize; // local color HoldColor; if ( C == None ) return; CoreIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; C.SetPos(HUDLocation.X - CoreIconSize * 3.0 * 0.5, HUDLocation.Y - CoreIconSize * 3.0 * 0.5); // HoldColor = C.DrawColor; if (bAttackable) C.DrawColor = C.DrawColor * ColorPercentage + (C.DrawColor * 0.5) * (1.0 - ColorPercentage); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 3.0, CoreIconSize * 3.0, 64, 0, 64, 64); // C.DrawColor = HoldColor; } simulated static function DrawNodeIcon( Canvas C, vector HUDLocation, bool bAttackable, byte Stage, float IconScaling, float HUDScaling, float ColorPercentage ) { local float CoreIconSize; if ( C == None ) return; CoreIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; if (Stage == 4 || Stage == 1) { if (bAttackable) { C.SetPos(HUDLocation.X - CoreIconSize * 0.75 * 0.5, HUDLocation.Y - CoreIconSize * 0.75 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 0.75, CoreIconSize * 0.75, 0, 0, 32, 32); } else { C.SetPos(HUDLocation.X - CoreIconSize * 1.75 * 0.5, HUDLocation.Y - CoreIconSize * 1.75 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 1.75, CoreIconSize * 1.75, 0, 32, 32, 32); } } else { if ( Stage != 0 ) C.DrawColor = C.DrawColor * ColorPercentage + default.LinkColor[2] * (1.0 - ColorPercentage); if (bAttackable) { C.SetPos(HUDLocation.X - CoreIconSize * 2.0 * 0.5, HUDLocation.Y - CoreIconSize * 2.0 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 2.0, CoreIconSize * 2.0, 32, 0, 32, 32); } else { C.SetPos(HUDLocation.X - CoreIconSize * 1.75 * 0.5, HUDLocation.Y - CoreIconSize * 1.75 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 1.75, CoreIconSize * 1.75, 0, 32, 32, 32); } } } simulated static function DrawSpawnIcon( Canvas C, vector HUDLocation, bool bFinalCore, float IconScaling, float HUDScaling ) { local float CoreIconSize; if ( C == None ) return; CoreIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; C.DrawColor.B = 0; C.DrawColor.G = 200; C.DrawColor.R = 0; C.DrawColor.A = 255; if (bFinalCore) { C.SetPos(HUDLocation.X - CoreIconSize * 5.5 * 0.5, HUDLocation.Y - CoreIconSize * 5.5 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 5.5, CoreIconSize * 5.5, 64, 64, 64, 64); } else { C.SetPos(HUDLocation.X - CoreIconSize * 4.5 * 0.5, HUDLocation.Y - CoreIconSize * 4.5 * 0.5); C.DrawTile(Material'NewHUDIcons', CoreIconSize * 4.5, CoreIconSize * 4.5, 64, 64, 64, 64); } } simulated static function DrawSelectionIcon( Canvas C, vector HUDLocation, color IconColor, float IconScaling, float HUDScaling ) { local float CoreIconSize; if ( C == None ) return; CoreIconSize = IconScaling * 16 * C.ClipX * HUDScaling/1600; C.DrawColor = IconColor; C.SetPos( HUDLocation.X - CoreIconSize * 1.5, HUDLocation.Y - CoreIconSize * 1.5); C.DrawTile( Material'NewHUDIcons', CoreIconSize * 3, CoreIconSize * 3, 32, 32, 32, 32 ); } fV?f>Qg%/\4ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽG /ٔҽҽҽG /G /ٔҽҽҽҽҽ|;ҽҽҽҽҽҽG /ن3}3}3}3}3}3}3}PxPxG /G /PxG /G /Pxϑ uORORORORORG /G /G /G /ن3} uOROR u uu*F#{ҽҽʁ)ҽҽҽʁ)ʁ)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ3}ҽҽҽG /G /G /G /٨zVGBG /٨zVGBJG /٨zVGBJzVGBJG /G /ٔҽҽҽҽҽҽ3}G /G /G /G /ٔҽҽG /e#J8G /G /ّ uG /ٔҽG /G /G /G /G /G /G /G /G /G /ٔҽG /G /ّ u u u q| 8~`nʁ)ʁ)ҽҽҽҽҽҽҽҽҽG /G /e#J8e#J8e#J8e#J8e#J8G /G /G /G /G /ن3}G /G /G /Mz3}MzMzډ3}3} P 6~$L>\*$CV'$?}$?|$=z$$Hwvu$Bt$AY*$CA$zEBW**T** S**R**Z*ZZx&Zy!rw!b!v!Zpq"wr"s"t"9@>c!$?d!Y $?W$e!"a!"x!t!$?Y!*Y!@>x&y!rw!b!v!Zpq"wr"s"t"9@>c!$?d!Y $?W$e!" a!"x!t!$?Y!*Y!@>O%Zy!rw!b!v!Zpq"mr"s"t"9@>c!$>d!Y $?W$e!"a!"-x!t!$?Y!*ddY! @>O%y!rw!b!v!Zpq"mr"s"t"9@>c!$>d!Y $?W$e!"na!"-x!t!$?Y!*Y! @>P%Zq"Lb!r""c!$u>d!Y $?W$e!"ka!"XY!*Y!^""@>P%q"Lb!r""c!$u>d!Y $?W$e!"a!"XY!*Y!^""@>N*Zq"Lb!r""c!$u>d!Y $?W$e!"a!"Y!*Y!^""@>j&Zq"Lb!r""c!$q= ?d!Y $M>W$e!"a!" Y!*Y!^""@>j&q"Lb!r""c!$q= ?d!Y $?W$e!"Za!" Y!*Y!^""@>g&Zy!rw!b!v!Zpq"r"s"Nt"@>c!$?d!Y $M>W$e!"a!" x!t!$?Y!*Y!@>g&y!rw!b!v!Zpq"r"s"Nt"@>c!$?d!Y $?W$e!"2a!" x!t!$?Y!*Y!@>e&Zy!rw!b!v!Zpq"wr"s"t"9@>c!$?d!Y $M>W$e!"a!"x!t!$?Y!*Y!@>e&y!rw!b!v!Zpq"wr"s"t"9@>c!$?d!Y $?W$e!"#a!"x!t!$?Y!*Y!@>v$Zy!qw!b!v!Zpq"r"s"t"@>c!$=d!Y $M>W$e!"8a!"-x!t!$Y!*ddY! @>v$y!qw!b!v!Zpq"r"s"t"@>c!$=d!Y $?W$e!"a!"-x!t!$Y!*Y! @>@>@>g;//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverTankCannon extends ONSWeapon; var vector OldDir; var rotator OldRot; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx #exec OBJ LOAD FILE=..\Textures\BenTex01.utx static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex'); L.AddPrecacheMaterial(Material'XEffects.RocketFlare'); L.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); L.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1'); L.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02'); L.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw'); L.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01'); L.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'WeaponSkins.RocketShellTex'); Level.AddPrecacheMaterial(Material'XEffects.RocketFlare'); Level.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TankTrail'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1'); Level.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02'); Level.AddPrecacheMaterial(Material'EpicParticles.Smoke.SparkCloud_01aw'); Level.AddPrecacheMaterial(Material'BenTex01.Textures.SmokePuff01'); Level.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Part_explode2'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot'); Super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); Super.UpdatePrecacheStaticMeshes(); } function byte BestMode() { return 0; } simulated function PostBeginPlay() { Super.PostBeginPlay(); OldDir = Vector(CurrentAim); } function Tick(float Delta) { local int i; local xPawn P; local vector NewDir, PawnDir; local coords WeaponBoneCoords; Super.Tick(Delta); if ( (Role == ROLE_Authority) && (Base != None) ) { WeaponBoneCoords = GetBoneCoords(YawBone); NewDir = WeaponBoneCoords.XAxis; if ( (Vehicle(Base).Controller != None) && (NewDir.Z < 0.9) ) { for ( i=0; i OldDir.X)) || ((PawnDir.X >= NewDir.X) && (PawnDir.X < OldDir.X)) ) { if ( ((PawnDir.Y <= NewDir.Y) && (PawnDir.Y > OldDir.Y)) || ((PawnDir.Y >= NewDir.Y) && (PawnDir.X < OldDir.Y)) ) { P.SetPhysics(PHYS_Falling); P.Velocity = WeaponBoneCoords.YAxis; if ( ((NewDir - OldDir) Dot WeaponBoneCoords.YAxis) < 0 ) P.Velocity *= -1; P.Velocity = 500 * (P.Velocity + 0.3*NewDir); P.Velocity.Z = 200; } } } } } OldDir = NewDir; } } @>k//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverTank extends ONSTreadCraft; #exec OBJ LOAD FILE=..\Animations\ONSVehicles-A.ukx #exec OBJ LOAD FILE=..\Sounds\ONSVehicleSounds-S.uax #exec OBJ LOAD FILE=InterfaceContent.utx #exec OBJ LOAD FILE=..\textures\VMVehicles-TX.utx var() float MaxPitchSpeed; var VariableTexPanner LeftTreadPanner, RightTreadPanner; var float TreadVelocityScale; var float MaxGroundSpeed, MaxAirSpeed; simulated function PostBeginPlay() { super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) SetupTreads(); } simulated function Destroyed() { DestroyTreads(); super.Destroyed(); } function bool ImportantVehicle() { return true; } simulated function SetupTreads() { LeftTreadPanner = VariableTexPanner(Level.ObjectPool.AllocateObject(class'VariableTexPanner')); if ( LeftTreadPanner != None ) { LeftTreadPanner.Material = Skins[1]; LeftTreadPanner.PanDirection = rot(0, 16384, 0); LeftTreadPanner.PanRate = 0.0; Skins[1] = LeftTreadPanner; } RightTreadPanner = VariableTexPanner(Level.ObjectPool.AllocateObject(class'VariableTexPanner')); if ( RightTreadPanner != None ) { RightTreadPanner.Material = Skins[2]; RightTreadPanner.PanDirection = rot(0, 16384, 0); RightTreadPanner.PanRate = 0.0; Skins[2] = RightTreadPanner; } } simulated function DestroyTreads() { if ( LeftTreadPanner != None ) { Level.ObjectPool.FreeObject(LeftTreadPanner); LeftTreadPanner = None; } if ( RightTreadPanner != None ) { Level.ObjectPool.FreeObject(RightTreadPanner); RightTreadPanner = None; } } simulated event DrivingStatusChanged() { Super.DrivingStatusChanged(); if (!bDriving) { if ( LeftTreadPanner != None ) LeftTreadPanner.PanRate = 0.0; if ( RightTreadPanner != None ) RightTreadPanner.PanRate = 0.0; } } simulated function Tick(float DeltaTime) { local float EnginePitch; local float LinTurnSpeed; local KRigidBodyState BodyState; local KarmaParams KP; local bool bOnGround; local int i; KGetRigidBodyState(BodyState); KP = KarmaParams(KParams); // Increase max karma speed if falling bOnGround = false; for(i=0; i 0) LeftTreadPanner.PanRate = -1 * LeftTreadPanner.PanRate; LeftTreadPanner.PanRate += LinTurnSpeed; } if ( RightTreadPanner != None ) { RightTreadPanner.PanRate = VSize(Velocity) / TreadVelocityScale; if (Velocity Dot Vector(Rotation) > 0) RightTreadPanner.PanRate = -1 * RightTreadPanner.PanRate; RightTreadPanner.PanRate -= LinTurnSpeed; } } Super.Tick( DeltaTime ); } function KDriverEnter(Pawn p) { Super.KDriverEnter(p); SVehicleUpdateParams(); } function DriverLeft() { Super.DriverLeft(); SVehicleUpdateParams(); } function AltFire(optional float F) { local PlayerController PC; PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = true; PC.ToggleZoomWithMax(0.5); } function ClientVehicleCeaseFire(bool bWasAltFire) { local PlayerController PC; if (!bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); return; } PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = false; PC.StopZoom(); } simulated function ClientKDriverLeave(PlayerController PC) { Super.ClientKDriverLeave(PC); bWeaponIsAltFiring = false; PC.EndZoom(); } function bool RecommendLongRangedAttack() { return true; } function TakeDamage(int Damage, Pawn instigatedBy, Vector Hitlocation, Vector Momentum, class DamageType) { if (DamageType == class'DamTypeHoverBikePlasma') Damage *= 0.80; Super.TakeDamage(Damage, instigatedBy, Hitlocation, Momentum, damageType); } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.TANKexploded.TankTurret'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.SmokeReOrdered'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankColorRED'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankColorBLUE'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankNoColor'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.tankTreads'); L.AddPrecacheMaterial(Material'VMParticleTextures.EJECTA.Tex'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlur'); L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); L.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Fireball3'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.TANKexploded.TankTurret'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.SmokeReOrdered'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankColorRED'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankColorBLUE'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.TankNoColor'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverTankGroup.tankTreads'); Level.AddPrecacheMaterial(Material'VMParticleTextures.EJECTA.Tex'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlur'); Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); Level.AddPrecacheMaterial(Material'AW-2004Explosions.Fire.Fireball3'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); Super.UpdatePrecacheMaterials(); } function ShouldTargetMissile(Projectile P) { if ( (WeaponPawns.Length > 0) && (WeaponPawns[0].Controller == None) ) Super.ShouldTargetMissile(P); } @>|//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverCraftFactory extends ONSVehicleFactory; jE@kl])M R"b3P"H4_]) @>@>U?//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverCraft extends ONSVehicle abstract native nativereplication; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() array ThrusterOffsets; var() float HoverSoftness; var() float HoverPenScale; var() float HoverCheckDist; var() float UprightStiffness; var() float UprightDamping; var() float MaxThrustForce; var() float LongDamping; var() float MaxStrafeForce; var() float LatDamping; var() float MaxRiseForce; var() float UpDamping; var() float TurnTorqueFactor; var() float TurnTorqueMax; var() float TurnDamping; var() float MaxYawRate; var() float PitchTorqueFactor; var() float PitchTorqueMax; var() float PitchDamping; var() float RollTorqueTurnFactor; var() float RollTorqueStrafeFactor; var() float RollTorqueMax; var() float RollDamping; var() float StopThreshold; var() float MaxRandForce; var() float RandForceInterval; // Internal var float HoverMPH; var float TargetHeading; var float TargetPitch; var bool bHeadingInitialized; var float OutputThrust; var float OutputStrafe; var Pawn OldDriver; // Replicated struct native HoverCraftState { var vector ChassisPosition; var Quat ChassisQuaternion; var vector ChassisLinVel; var vector ChassisAngVel; var byte ServerThrust; var byte ServerStrafe; var int ServerViewPitch; var int ServerViewYaw; }; var HoverCraftState HoverState, OldHoverState; var KRigidBodyState ChassisState; var bool bNewHoverState; replication { reliable if ( Role == ROLE_Authority ) HoverState; } simulated event bool KUpdateState(out KRigidBodyState newState) { // This should never get called on the server - but just in case! if(Role == ROLE_Authority || !bNewHoverState) return false; newState = ChassisState; bNewHoverState = false; return true; //return false; } simulated function PostNetBeginPlay() { local vector RotX, RotY, RotZ; local KarmaParams kp; local KRepulsor rep; local int i; GetAxes(Rotation,RotX,RotY,RotZ); // Spawn and assign 'repulsors' to hold bike off the ground kp = KarmaParams(KParams); kp.Repulsors.Length = ThrusterOffsets.Length; for(i=0;i damageType, vector HitLocation) { local KarmaParams kp; local int i; // Destroy repulsors kp = KarmaParams(KParams); for(i=0;i> Rotation); } @>F//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikePlasmaProjectile extends ONSPlasmaProjectile; @>@>@>\ C XPM.H(rC *kX%ZC ' G@>x//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikePlasmaGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHead'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); L.AddPrecacheMaterial(Material'EpicParticles.Flares.FlashFlare1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadDesat'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHead'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); Level.AddPrecacheMaterial(Material'EpicParticles.Flares.FlashFlare1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadDesat'); Super.UpdatePrecacheMaterials(); } state ProjectileFireMode { function AltFire(Controller C) { } } @>R\ZZI{-A-g+\#??6g+\k'. wk'*wk'*k'Hm+e25599pk'?g+d'm+d'599p\̌?l?m+e25599p?g+d'm+d'599p\̌?d'5Ya\ d'prwY*-v Y  c:-T9-d1f)7f)$[C ^- (rQ-GZrZ$[C v& (Y G@>l//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBike extends ONSHoverCraft; #exec OBJ LOAD FILE=..\Animations\ONSVehicles-A.ukx #exec OBJ LOAD FILE=..\Sounds\ONSVehicleSounds-S.uax #exec OBJ LOAD FILE=..\textures\EpicParticles.utx #exec OBJ LOAD FILE=..\StaticMeshes\ONSWeapons-SM #exec OBJ LOAD FILE=..\textures\VMVehicles-TX.utx var() float MaxPitchSpeed; var() float JumpDuration; var() float JumpForceMag; var float JumpCountdown; var float JumpDelay, LastJumpTime; var() float DuckDuration; var() float DuckForceMag; var float DuckCountdown; var() array BikeDustOffset; var() float BikeDustTraceDistance; var() sound JumpSound; var() sound DuckSound; // Force Feedback var() string JumpForce; var array BikeDust; var array BikeDustLastNormal; var bool DoBikeJump; var bool OldDoBikeJump; var bool DoBikeDuck; var bool OldDoBikeDuck; var bool bHoldingDuck; var bool bOverWater; replication { reliable if (bNetDirty && Role == ROLE_Authority) DoBikeJump; } // AI hint function bool FastVehicle() { return true; } function ShouldTargetMissile(Projectile P) { if ( (Bot(Controller) != None) && (Level.Game.GameDifficulty > 4 + 4*FRand()) && (VSize(P.Location - Location) < VSize(P.Velocity)) ) { KDriverLeave(false); TeamUseTime = Level.TimeSeconds + 4; return; } Super.ShouldTargetMissile(P); } function bool TooCloseToAttack(Actor Other) { if ( xPawn(Other) != None ) return false; return super.TooCloseToAttack(Other); } function Pawn CheckForHeadShot(Vector loc, Vector ray, float AdditionalScale) { local vector X, Y, Z, newray; GetAxes(Rotation,X,Y,Z); if (Driver != None) { // Remove the Z component of the ray newray = ray; newray.Z = 0; if (abs(newray dot X) < 0.7 && Driver.IsHeadShot(loc, ray, AdditionalScale)) return Driver; } return None; } simulated function Destroyed() { local int i; if (Level.NetMode != NM_DedicatedServer) { for (i = 0; i < BikeDust.Length; i++) BikeDust[i].Destroy(); BikeDust.Length = 0; } Super.Destroyed(); } simulated function DestroyAppearance() { local int i; if (Level.NetMode != NM_DedicatedServer) { for (i = 0; i < BikeDust.Length; i++) BikeDust[i].Destroy(); BikeDust.Length = 0; } Super.DestroyAppearance(); } function bool Dodge(eDoubleClickDir DoubleClickMove) { Rise = 1; return true; } function ChooseFireAt(Actor A) { if (Pawn(A) != None && Vehicle(A) == None && VSize(A.Location - Location) < 1500 && Controller.LineOfSightTo(A)) { if (!bWeaponIsAltFiring) AltFire(0); } else if (bWeaponIsAltFiring) VehicleCeaseFire(true); Fire(0); } simulated event DrivingStatusChanged() { local int i; Super.DrivingStatusChanged(); if (bDriving && Level.NetMode != NM_DedicatedServer && BikeDust.Length == 0 && !bDropDetail) { BikeDust.Length = BikeDustOffset.Length; BikeDustLastNormal.Length = BikeDustOffset.Length; for(i=0; i> Rotation) ); BikeDust[i].SetDustColor( Level.DustColor ); BikeDustLastNormal[i] = vect(0,0,1); } } else { if (Level.NetMode != NM_DedicatedServer) { for(i=0; i> Rotation); TraceEnd = TraceStart - ( BikeDustTraceDistance * vect(0,0,1) ); HitActor = Trace(HitLocation, HitNormal, TraceEnd, TraceStart, true); if(HitActor == None) { BikeDust[i].UpdateHoverDust(false, 0); } else { if ( bOverWater || ((PhysicsVolume(HitActor) != None) && PhysicsVolume(HitActor).bWaterVolume) ) BikeDust[i].SetDustColor(Level.WaterDustColor); else BikeDust[i].SetDustColor(Level.DustColor); HitDist = VSize(HitLocation - TraceStart); BikeDust[i].SetLocation( HitLocation + 10*HitNormal); BikeDustLastNormal[i] = Normal( 3*BikeDustLastNormal[i] + HitNormal ); BikeDust[i].SetRotation( Rotator(BikeDustLastNormal[i]) ); BikeDust[i].UpdateHoverDust(true, HitDist/BikeDustTraceDistance); // If dust is just turning on, set OldLocation to current Location to avoid spawn interpolation. if(!BikeDust[i].bDustActive) BikeDust[i].OldLocation = BikeDust[i].Location; BikeDust[i].bDustActive = true; } } } } } function VehicleCeaseFire(bool bWasAltFire) { Super.VehicleCeaseFire(bWasAltFire); if (bWasAltFire) bHoldingDuck = False; } simulated function float ChargeBar() { // Clamp to 0.999 so charge bar doesn't blink when maxed if (Level.TimeSeconds - JumpDelay < LastJumpTime) return (FMin((Level.TimeSeconds - LastJumpTime) / JumpDelay, 0.999)); else return 0.999; } simulated function CheckJumpDuck() { local KarmaParams KP; local Emitter JumpEffect, DuckEffect; local bool bOnGround; local int i; KP = KarmaParams(KParams); // Can only start a jump when in contact with the ground. bOnGround = false; for(i=0; i 0 && bOnGround && !bHoldingDuck && Level.TimeSeconds - JumpDelay >= LastJumpTime) { PlaySound(JumpSound,,1.0); if (Role == ROLE_Authority) DoBikeJump = !DoBikeJump; if(Level.NetMode != NM_DedicatedServer) { JumpEffect = Spawn(class'ONSHoverBikeJumpEffect'); JumpEffect.SetBase(Self); ClientPlayForceFeedback(JumpForce); } if ( AIController(Controller) != None ) Rise = 0; LastJumpTime = Level.TimeSeconds; } else if (DuckCountdown <= 0.0 && (Rise < 0 || bWeaponIsAltFiring)) { if (!bHoldingDuck) { bHoldingDuck = True; PlaySound(DuckSound,,1.0); if(Level.NetMode != NM_DedicatedServer) { DuckEffect = Spawn(class'ONSHoverBikeDuckEffect'); DuckEffect.SetBase(Self); } if ( AIController(Controller) != None ) Rise = 0; JumpCountdown = 0.0; // Stops any jumping that was going on. } } else bHoldingDuck = False; } simulated function KApplyForce(out vector Force, out vector Torque) { Super.KApplyForce(Force, Torque); if (bDriving && JumpCountdown > 0.0) { Force += vect(0,0,1) * JumpForceMag; } if (bDriving && bHoldingDuck) { Force += vect(0,0,-1) * DuckForceMag; } } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HoverExploded.HoverWing'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HoverExploded.HoverChair'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheStaticMesh(StaticMesh'ONSWeapons-SM.PC_MantaJumpBlast'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); L.AddPrecacheMaterial(Material'WeaponSkins.Skins.RocketTex0'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.JumpDuck'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hovercraftFANSblurTEX'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hoverCraftRED'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hoverCraftBLUE'); L.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.NewHoverCraftNOcolor'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.AirBlast'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HoverExploded.HoverWing'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.HoverExploded.HoverChair'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Level.AddPrecacheStaticMesh(StaticMesh'ONSWeapons-SM.PC_MantaJumpBlast'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hovercraftFANSblurTEX'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.MuchSmoke1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); Level.AddPrecacheMaterial(Material'WeaponSkins.Skins.RocketTex0'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.JumpDuck'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hoverCraftRED'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.hoverCraftBLUE'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.HoverBikeGroup.NewHoverCraftNOcolor'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.AirBlast'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); Super.UpdatePrecacheMaterials(); } @>Y@>@>OO#exec OBJ LOAD FILE=..\Sounds\MenuSounds.uax class ONSGrenadeProjectile extends Projectile; var bool bCanHitOwner; var xEmitter Trail; var() float DampenFactor, DampenFactorParallel; var class HitEffectClass; var float LastSparkTime; var Actor IgnoreActor; //don't stick to this actor var byte Team; var Emitter Beacon; replication { reliable if (bNetDirty && Role == ROLE_Authority) IgnoreActor, Team; } simulated function Destroyed() { if ( Trail != None ) Trail.mRegen = false; // stop the emitter from regenerating //explosion if ( !bNoFX ) { if ( EffectIsRelevant(Location,false) ) { Spawn(class'ONSGrenadeExplosionEffect',,, Location, rotator(vect(0,0,1))); Spawn(ExplosionDecal,self,, Location, rotator(vect(0,0,-1))); } PlaySound(sound'WeaponSounds.BExplosion3',,2.5*TransientSoundVolume); } if ( ONSGrenadeLauncher(Owner) != None) ONSGrenadeLauncher(Owner).CurrentGrenades--; if ( Beacon != None ) Beacon.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { local PlayerController PC; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5500 ) Trail = Spawn(class'GrenadeSmokeTrail', self,, Location, Rotation); } Velocity = Speed * Vector(Rotation); RandSpin(25000); if (PhysicsVolume.bWaterVolume) Velocity = 0.6*Velocity; if (Role == ROLE_Authority && Instigator != None) Team = Instigator.GetTeamNum(); } simulated function PostNetBeginPlay() { if ( Level.NetMode != NM_DedicatedServer ) { if (Team == 1) Beacon = spawn(class'ONSGrenadeBeaconBlue', self); else Beacon = spawn(class'ONSGrenadeBeaconRed', self); if (Beacon != None) Beacon.SetBase(self); } Super.PostNetBeginPlay(); } simulated function Landed( vector HitNormal ) { HitWall( HitNormal, None ); } simulated function ProcessTouch( actor Other, vector HitLocation ) { if (!bPendingDelete && Base == None && Other != IgnoreActor && (!Other.bWorldGeometry && Other.Class != Class && (Other != Instigator || bCanHitOwner))) Stick(Other, HitLocation); } simulated function HitWall( vector HitNormal, actor Wall ) { local Vector VNorm; local PlayerController PC; if (Vehicle(Wall) != None) { Touch(Wall); return; } // Reflect off Wall w/damping VNorm = (Velocity dot HitNormal) * HitNormal; Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel; RandSpin(100000); Speed = VSize(Velocity); if ( Speed < 40 ) { bBounce = False; SetPhysics(PHYS_None); if ( Trail != None ) Trail.mRegen = false; // stop the emitter from regenerating } else { if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 250) ) PlaySound(ImpactSound, SLOT_Misc ); if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 2000 ) Spawn(HitEffectClass,,, Location, Rotator(HitNormal)); LastSparkTime = Level.TimeSeconds; } } } simulated function Explode(vector HitLocation, vector HitNormal) { LastTouched = Base; BlowUp(HitLocation); Destroy(); } simulated function TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { local Actor A; if (Damage > 0) { if (Base != None && DamageType != MyDamageType) { if (EventInstigator == None || EventInstigator != Instigator) { UnStick(); return; } } else if (IgnoreActor != None) //just got knocked off something I was stuck to, so don't explode foreach VisibleCollidingActors(IgnoreActor.Class, A, DamageRadius) return; Explode(Location, vect(0,0,1)); } } simulated function Stick(actor HitActor, vector HitLocation) { if ( Trail != None ) Trail.mRegen = false; // stop the emitter from regenerating bBounce = False; LastTouched = HitActor; SetPhysics(PHYS_None); SetBase(HitActor); if (Base == None) { UnStick(); return; } bCollideWorld = False; bProjTarget = true; PlaySound(Sound'MenuSounds.Select3',,2.5*TransientSoundVolume); } simulated function UnStick() { Velocity = vect(0,0,0); IgnoreActor = Base; SetBase(None); SetPhysics(PHYS_Falling); bCollideWorld = true; bProjTarget = false; LastTouched = None; } simulated function BaseChange() { if (!bPendingDelete && Physics == PHYS_None && Base == None) UnStick(); } simulated function PawnBaseDied() { Explode(Location, vect(0,0,1)); } @>q[CKPIe$a$+wQ*QJ"(F-G-d1* G@>{//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadePickup extends UTWeaponPickup; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.GrenadeTex'); L.AddPrecacheMaterial(Texture'EpicParticles.Smoke.Smokepuff2'); L.AddPrecacheMaterial(Texture'AW-2004Particles.Fire.GrenadeTest'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.AirBlast'); L.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.PlayerWeaponsGroup.VMGrenade'); L.AddPrecacheStaticMesh(default.StaticMesh); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.GrenadeTex'); Level.AddPrecacheMaterial(Texture'EpicParticles.Smoke.Smokepuff2'); Level.AddPrecacheMaterial(Texture'AW-2004Particles.Fire.GrenadeTest'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.AirBlast'); super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { super.UpdatePrecacheStaticMeshes(); Level.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.PlayerWeaponsGroup.VMGrenade'); } @>eMc,R39:9:$e9?&9fYwW*W dwN * x(c aN  5p G @>s@//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeLauncher extends Weapon config(User); #exec OBJ LOAD FILE=HudContent.utx var array Grenades; var int CurrentGrenades; //should be sync'ed with Grenades.length var int MaxGrenades; var color FadedColor; replication { reliable if (bNetOwner && bNetDirty && ROLE == ROLE_Authority) CurrentGrenades; } simulated function DrawWeaponInfo(Canvas Canvas) { NewDrawWeaponInfo(Canvas, 0.705*Canvas.ClipY); } simulated function NewDrawWeaponInfo(Canvas Canvas, float YPos) { local int i, Half; local float ScaleFactor; ScaleFactor = 99 * Canvas.ClipX/3200; Half = (MaxGrenades + 1) / 2; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.DrawColor = class'HUD'.Default.WhiteColor; for (i = 0; i < Half; i++) { if (i >= CurrentGrenades) Canvas.DrawColor = FadedColor; Canvas.SetPos(Canvas.ClipX - (i+1) * ScaleFactor * 1.25, YPos); Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 324, 325, 54, 54); } for (i = Half; i < MaxGrenades; i++) { if (i >= CurrentGrenades) Canvas.DrawColor = FadedColor; Canvas.SetPos(Canvas.ClipX - (i-Half+1) * ScaleFactor * 1.25, YPos - ScaleFactor); Canvas.DrawTile(Material'HudContent.Generic.HUD', ScaleFactor, ScaleFactor, 324, 325, 54, 54); } } simulated function bool HasAmmo() { if (CurrentGrenades > 0) return true; return Super.HasAmmo(); } simulated function bool CanThrow() { if ( AmmoAmount(0) <= 0 ) return false; return Super.CanThrow(); } simulated function OutOfAmmo() { } simulated singular function ClientStopFire(int Mode) { if (Mode == 1 && !HasAmmo()) DoAutoSwitch(); Super.ClientStopFire(Mode); } simulated function Destroyed() { local int x; if (Role == ROLE_Authority) { for (x = 0; x < Grenades.Length; x++) if (Grenades[x] != None) Grenades[x].Explode(Grenades[x].Location, vect(0,0,1)); Grenades.Length = 0; } Super.Destroyed(); } // AI Interface function float GetAIRating() { local Bot B; local float EnemyDist; local vector EnemyDir; B = Bot(Instigator.Controller); if ( B == None ) return AIRating; if ( B.Enemy == None ) { if ( (B.Target != None) && VSize(B.Target.Location - B.Pawn.Location) > 1000 ) return 0.2; return AIRating; } // if retreating, favor this weapon EnemyDir = B.Enemy.Location - Instigator.Location; EnemyDist = VSize(EnemyDir); if ( EnemyDist > 1500 ) return 0.1; if ( B.IsRetreating() ) return (AIRating + 0.4); if ( -1 * EnemyDir.Z > EnemyDist ) return AIRating + 0.1; if ( (B.Enemy.Weapon != None) && B.Enemy.Weapon.bMeleeWeapon ) return (AIRating + 0.3); if ( EnemyDist > 1000 ) return 0.35; return AIRating; } /* BestMode() choose between regular or alt-fire */ function byte BestMode() { local int x; if (CurrentGrenades >= MaxGrenades || (AmmoAmount(0) <= 0 && FireMode[0].NextFireTime <= Level.TimeSeconds)) return 1; for (x = 0; x < Grenades.length; x++) if (Grenades[x] != None && Pawn(Grenades[x].Base) != None) return 1; return 0; } function float SuggestAttackStyle() { local Bot B; local float EnemyDist; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0.4; EnemyDist = VSize(B.Enemy.Location - Instigator.Location); if ( EnemyDist > 1500 ) return 1.0; if ( EnemyDist > 1000 ) return 0.4; return -0.4; } function float SuggestDefenseStyle() { local Bot B; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0; if ( VSize(B.Enemy.Location - Instigator.Location) < 1600 ) return -0.6; return 0; } // End AI Interface simulated function AnimEnd(int Channel) { local name anim; local float frame, rate; GetAnimParams(0, anim, frame, rate); if (anim == 'AltFire') LoopAnim('Hold', 1.0, 0.1); else Super.AnimEnd(Channel); } @>w?ST  G@>yT KTHwW*Wa.wc *c aEwQ*Qa G@>z //----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeFire extends BioFire; simulated function bool AllowFire() { if (ONSGrenadeLauncher(Weapon).CurrentGrenades >= ONSGrenadeLauncher(Weapon).MaxGrenades) return false; return Super.AllowFire(); } function Projectile SpawnProjectile(Vector Start, Rotator Dir) { local ONSGrenadeProjectile G; G = ONSGrenadeProjectile(Super.SpawnProjectile(Start, Dir)); if (G != None && ONSGrenadeLauncher(Weapon) != None) { G.SetOwner(Weapon); ONSGrenadeLauncher(Weapon).Grenades[ONSGrenadeLauncher(Weapon).Grenades.length] = G; ONSGrenadeLauncher(Weapon).CurrentGrenades++; } return G; } @>g//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeExplosionEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Explosions.utx" #exec OBJ LOAD FILE="..\Textures\EpicParticles.utx" @>C//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeAttachment extends xWeaponAttachment; var xEmitter MuzFlash3rd; simulated function Destroyed() { if (MuzFlash3rd != None) MuzFlash3rd.Destroy(); Super.Destroyed(); } simulated event ThirdPersonEffects() { // local Rotator R; // // if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) // { // if (MuzFlash3rd == None) // { // MuzFlash3rd = Spawn(class'XEffects.BioMuzFlash1st'); // MuzFlash3rd.bHidden = false; // AttachToBone(MuzFlash3rd, 'tip'); // } // if (MuzFlash3rd != None) // { // R.Roll = Rand(65536); // SetBoneRotation('Bone_Flash', R, 0, 1.0); // MuzFlash3rd.mStartParticles++; // } // } Super.ThirdPersonEffects(); } @>w//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeAmmoPickup extends UTAmmoPickup; @>o//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGrenadeAmmo extends Ammunition; @>{class ONSGrenadeAltFire extends WeaponFire; var ONSGrenadeLauncher Gun; function PostBeginPlay() { Super.PostBeginPlay(); Gun = ONSGrenadeLauncher(Weapon); } simulated function bool AllowFire() { return (Gun.CurrentGrenades > 0); } function DoFireEffect() { local int x; for (x = 0; x < Gun.Grenades.Length; x++) if (Gun.Grenades[x] != None) Gun.Grenades[x].Explode(Gun.Grenades[x].Location, vect(0,0,1)); Gun.Grenades.length = 0; Gun.CurrentGrenades = 0; } @>J//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGreenPlasmaSmallFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } B a9Q@C ˾C܆3} u uʁ)W= 8YR"S"T"5S@>@>E//----------------------------------------------------------- // //----------------------------------------------------------- class ONSGreenPlasmaFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } @>x//----------------------------------------------------------- // //----------------------------------------------------------- class ONSFreeRoamingEnergyEffect extends Emitter; @>j//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDirtSlipEffect extends Emitter; #exec OBJ LOAD FILE=..\Sounds\ONSVehicleSounds-S.uax var () int MaxSpritePPS; var () int MaxMeshPPS; var () sound DirtSlipSound; simulated function SetDirtColor(color DirtColor) { local color DirtColorZeroAlpha, DirtColorHalfAlpha; // Ignore if dust color if black. if(DirtColor.R == 0 && DirtColor.G == 0 && DirtColor.B == 0) return; DirtColor.A = 255; DirtColorZeroAlpha = DirtColor; DirtColorZeroAlpha.A = 0; DirtColorHalfAlpha = DirtColor; DirtColorHalfAlpha.A = 128; Emitters[0].ColorScale[0].Color = DirtColorZeroAlpha; Emitters[0].ColorScale[1].Color = DirtColorHalfAlpha; Emitters[0].ColorScale[2].Color = DirtColorHalfAlpha; Emitters[0].ColorScale[3].Color = DirtColorZeroAlpha; } simulated function UpdateDust(SVehicleWheel t, float DustSlipRate, float DustSlipThresh) { local float SpritePPS, MeshPPS; //Log("Material:"$t.GroundMaterial$" OnGround:"$t.bTireOnGround); // If wheel is on ground, and slipping above threshold.. if(t.bWheelOnGround && t.SlipVel > DustSlipThresh) { SpritePPS = FMin(DustSlipRate * (t.SlipVel - DustSlipThresh), MaxSpritePPS); Emitters[0].ParticlesPerSecond = SpritePPS; Emitters[0].InitialParticlesPerSecond = SpritePPS; Emitters[0].AllParticlesDead = false; MeshPPS = FMin(DustSlipRate * (t.SlipVel - DustSlipThresh), MaxMeshPPS); Emitters[1].ParticlesPerSecond = MeshPPS; Emitters[1].InitialParticlesPerSecond = MeshPPS; Emitters[1].AllParticlesDead = false; AmbientSound = DirtSlipSound; } else // ..otherwise, switch off. { Emitters[0].ParticlesPerSecond = 0; Emitters[0].InitialParticlesPerSecond = 0; Emitters[1].ParticlesPerSecond = 0; Emitters[1].InitialParticlesPerSecond = 0; AmbientSound = None; } } @>K @>@>L @>@>M @>@>N @>@>@>@>@o fpio Bk h,#?{#?p9Pa99e 56o ak p-^ p9PY 5 G@>rclass ONSDefaultMut extends DMMutator HideDropDown CacheExempt; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (Controller(Other) != None && MessagingSpectator(Other) == None) { Controller(Other).bAdrenalineEnabled = false; Controller(Other).PlayerReplicationInfoClass = class'ONSPlayerReplicationInfo'; } else if (Other.IsA('AdrenalinePickup')) return false; return true; } @>RrCtCJcr G@>C Nk:mRw.*9:.,t9:.g _t%g C N GU OY6X 32,e,eʁ) C lpEGKF@>@>Z1class ONSChopperCraft extends ONSVehicle abstract native nativereplication; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() float UprightStiffness; var() float UprightDamping; var() float MaxThrustForce; var() float LongDamping; var() float MaxStrafeForce; var() float LatDamping; var() float MaxRiseForce; var() float UpDamping; var() float TurnTorqueFactor; var() float TurnTorqueMax; var() float TurnDamping; var() float MaxYawRate; var() float PitchTorqueFactor; var() float PitchTorqueMax; var() float PitchDamping; var() float RollTorqueTurnFactor; var() float RollTorqueStrafeFactor; var() float RollTorqueMax; var() float RollDamping; var() float StopThreshold; var() float MaxRandForce; var() float RandForceInterval; // Internal var float CopterMPH; var float TargetHeading; var float TargetPitch; var bool bHeadingInitialized; var float OutputThrust; var float OutputStrafe; var float OutputRise; var vector RandForce; var vector RandTorque; var float AccumulatedTime; // Replicated struct native CopterState { var vector ChassisPosition; var Quat ChassisQuaternion; var vector ChassisLinVel; var vector ChassisAngVel; var byte ServerThrust; var byte ServerStrafe; var byte ServerRise; var int ServerViewPitch; var int ServerViewYaw; }; var CopterState CopState, OldCopState; var KRigidBodyState ChassisState; var bool bNewCopterState; var float PushForce; // for AI when landing; var float LastJumpOutCheck; replication { reliable if ( Role == ROLE_Authority ) CopState; } simulated event bool KUpdateState(out KRigidBodyState newState) { // This should never get called on the server - but just in case! if(Role == ROLE_Authority || !bNewCopterState) return false; newState = ChassisState; bNewCopterState = false; return true; //return false; } simulated event SVehicleUpdateParams() { Super.SVehicleUpdateParams(); KSetStayUprightParams( UprightStiffness, UprightDamping ); } simulated function SpecialCalcFirstPersonView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { ViewActor = self; CameraLocation = Location + (FPCamPos >> Rotation); } event JumpOutCheck() { local Bot B; B = Bot(Controller); if ( (B != None) && (ONSPowerCore(B.Movetarget) != None) && (ONSPowerCore(B.MoveTarget).CoreStage == 4) && ((B.Enemy == None) || !B.EnemyVisible()) ) { KDriverLeave(false); if ( Controller == None ) { KAddImpulse( PushForce*Vector(Rotation), Location ); if ( (B.Pawn.Physics == PHYS_Falling) && B.DoWaitForLanding() ) B.Pawn.Velocity.Z = 0; } } } @>pSDYV-_99Q`YE _w.*w.*.-(}aYs`Y'.-'}aYs`Y'ow}*l}-a `H `Yr.}*r.)}*}&Ha YD _J s#Y`s#a^Yk}Ys G@>Y Z d gmG@>G\kU` 9:9:$=9:9:$f{9?-9:9:${9?%a!b-a!`-za9:t1O 59PZ56.%z5Z6.%z5Z6.&z5Z6.&z5Zzo"Z]  G@>I//----------------------------------------------------------- // //----------------------------------------------------------- class ONSBluePlasmaSmallFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } @>D//----------------------------------------------------------- // //----------------------------------------------------------- class ONSBluePlasmaFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } @>q//----------------------------------------------------------- // //----------------------------------------------------------- class ONSBlueEnergyEffect extends Emitter; @>3class ONSAVRiLRocketExplosion extends Emitter; @>CWclass ONSAVRiLRocket extends Projectile; var Emitter SmokeTrail; var Effects Corona; var float AccelerationAddPerSec; var bool bLockedOn; var float LeadTargetDelay; //don't lead target until missle has been flying for this many seconds var float LeadTargetStartTime; var actor OverrideTarget; var Vehicle HomingTarget; replication { reliable if (bNetDirty && Role == ROLE_Authority) HomingTarget, OverrideTarget, bLockedOn; } simulated function Destroyed() { // Turn of smoke emitters. Emitter should then destroy itself when all particles fade out. if ( SmokeTrail != None ) SmokeTrail.Kill(); if ( Corona != None ) Corona.Destroy(); PlaySound(sound'WeaponSounds.BExplosion3',,2.5*TransientSoundVolume); if (!bNoFX && EffectIsRelevant(Location, false)) spawn(class'ONSAVRiLRocketExplosion',,, Location, rotator(vect(0,0,1))); if (Instigator != None && Instigator.IsLocallyControlled() && Instigator.Weapon != None && !Instigator.Weapon.HasAmmo()) Instigator.Weapon.DoAutoSwitch(); //hack for crappy weapon firing sound if (ONSAVRiL(Owner) != None) ONSAVRiL(Owner).PlaySound(sound'WeaponSounds.BExplosion3', SLOT_Interact, 0.01,, TransientSoundRadius); Super.Destroyed(); } simulated function PostBeginPlay() { local vector Dir; Dir = vector(Rotation); if ( Level.NetMode != NM_DedicatedServer) { SmokeTrail = Spawn(class'ONSAvrilSmokeTrail',,,Location - 15 * Dir); SmokeTrail.Setbase(self); Corona = Spawn(class'RocketCorona',self); } Velocity = speed * Dir; Acceleration = Dir; //really small accel just to give it a direction for use later if (PhysicsVolume.bWaterVolume) Velocity=0.6*Velocity; if ( Level.bDropDetail ) { bDynamicLight = false; LightType = LT_None; } SetTimer(0.1, true); LeadTargetStartTime = Level.TimeSeconds + LeadTargetDelay; Super.PostBeginPlay(); } simulated function Landed( vector HitNormal ) { Explode(Location,HitNormal); } simulated function Explode(vector HitLocation, vector HitNormal) { BlowUp(HitLocation); Destroy(); } simulated function Timer() { local vector Dir, ForceDir; local float VelMag, LowestDesiredZ; local array TargetPawns; local bool bLastLockedOn; local int i; local actor NewTarget; if (Role == ROLE_Authority) { if (OverrideTarget == none) { if (Instigator != None && Instigator.Controller != None && ONSAVRiL(Owner) != None) { bLastLockedOn = bLockedOn; bLockedOn = ONSAVRiL(Owner).bLockedOn; HomingTarget = ONSAVRiL(Owner).HomingTarget; if (!bLastLockedOn && bLockedOn) { if (HomingTarget != None && HomingTarget.Controller != None) HomingTarget.Controller.ReceiveProjectileWarning(self); } } else bLockedOn = false; } else bLockedOn = true; if (HomingTarget != None) { // Check to see if it's lock has changed if ( !HomingTarget.VerifyLock(self,NewTarget) ) OverrideTarget = NewTarget; else { OverrideTarget = None; HomingTarget.IncomingMissile(self); //bots with nothing else to shoot at may attempt to shoot down incoming missles TargetPawns = HomingTarget.GetTurrets(); TargetPawns[TargetPawns.length] = HomingTarget; for (i = 0; i < TargetPawns.length; i++) TargetPawns[i].ShouldTargetMissile(self); } } } if (bLockedOn && ( HomingTarget != none || OverrideTarget != none) ) { if (OverrideTarget != none) { if ( VSize(OverrideTarget.Location - Location ) < 256 ) { OverrideTarget.Destroy(); TakeDamage(20000,none, Location, Velocity, none); return; } NewTarget = OverrideTarget; } else NewTarget = HomingTarget; // Do normal guidance to target. if ( Pawn(NewTarget) != None ) Dir = Pawn(NewTarget).GetTargetLocation() - Location; else Dir = NewTarget.Location - Location; VelMag = VSize(Velocity); if (Level.TimeSeconds >= LeadTargetStartTime) { ForceDir = Dir + NewTarget.Velocity * VSize(Dir) / (VelMag * 2); if (Instigator != None) LowestDesiredZ = FMin(Instigator.Location.Z, NewTarget.Location.Z); //missle should avoid going any lower than this else LowestDesiredZ = NewTarget.Location.Z; if (ForceDir.Z + Location.Z < LowestDesiredZ) ForceDir.Z += LowestDesiredZ - (ForceDir.Z + Location.Z); ForceDir = Normal(ForceDir); } else ForceDir = Dir; ForceDir = Normal(ForceDir * 0.8 * VelMag + Velocity); Velocity = VelMag * ForceDir; Acceleration += 5 * ForceDir; // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); } } simulated function Tick(float deltaTime) { if (VSize(Velocity) >= MaxSpeed) { Acceleration = vect(0,0,0); disable('Tick'); } else Acceleration += Normal(Velocity) * (AccelerationAddPerSec * deltaTime); } function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { if (Damage > 0) Explode(HitLocation, vect(0,0,0)); } simulated event PostRender2D(Canvas C, float ScreenLocX, float ScreenLocY) { local PlayerController PC; if (bLockedOn) { PC = Level.GetLocalPlayerController(); if (PC!=none && PC.Pawn != none && ONSWeaponPawn(PC.Pawn)!=none) ONSWeaponPawn(PC.Pawn).ProjectilePostRender2D(self, C, ScreenLocX, ScreenLocY); } } @>e//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAVRiLPickup extends UTWeaponPickup; #exec OBJ LOAD FILE=VMWeaponsSM.usx static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.AVRiLtex'); L.AddPrecacheMaterial(Texture'AW-2004Particles.Weapons.DustSmoke'); L.AddPrecacheMaterial(Texture'ONSInterface-TX.avrilRETICLE'); L.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.LGRreticleRed'); L.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.AVRiLGroup.AVRiLprojectileSM'); L.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.AVRiLsm'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.AVRiLtex'); Level.AddPrecacheMaterial(Texture'VMParticleTextures.VehicleExplosions.VMExp2_framesANIM'); Level.AddPrecacheMaterial(Texture'AW-2004Particles.Weapons.DustSmoke'); Level.AddPrecacheMaterial(Texture'ONSInterface-TX.avrilRETICLE'); Level.AddPrecacheMaterial(Texture'VMWeaponsTX.PlayerWeaponsGroup.LGRreticleRed'); super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { super.UpdatePrecacheStaticMeshes(); Level.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.AVRiLGroup.AVRiLprojectileSM'); Level.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.AVRiLsm'); } @>Uclass ONSAVRiLFire extends ProjectileFire; var vector KickMomentum; var float ReloadAnimDelay; function PlayFiring() { Super.PlayFiring(); if (Weapon.HasAnim(ReloadAnim)) SetTimer(ReloadAnimDelay, false); } function Projectile SpawnProjectile(vector Start, rotator Dir) { local Projectile P; P = Super.SpawnProjectile(Start, Dir); if (P != None) P.SetOwner(Weapon); return P; } function Timer() { if (Weapon.ClientState == WS_ReadyToFire) { Weapon.PlayAnim(ReloadAnim, ReloadAnimRate, TweenTime); Weapon.PlaySound(ReloadSound,SLOT_None,,,512.0,,false); ClientPlayForceFeedback(ReloadForce); } } function ShakeView() { Super.ShakeView(); if (Instigator != None) Instigator.AddVelocity(KickMomentum >> Instigator.Rotation); } function float MaxRange() { return 15000; } function StartBerserk() { if (Level.GRI != None && Level.GRI.WeaponBerserk > 1.0) return; Super.StartBerserk(); ReloadAnimDelay = default.ReloadAnimDelay * 0.75; } function StopBerserk() { if (Level.GRI != None && Level.GRI.WeaponBerserk > 1.0) return; Super.StopBerserk(); ReloadAnimDelay = default.ReloadAnimDelay; } function StartSuperBerserk() { Super.StartSuperBerserk(); ReloadAnimDelay = default.ReloadAnimDelay / Level.GRI.WeaponBerserk; } @>8class ONSAVRiLAttachment extends xWeaponAttachment; @>@|Dy]GJ F|ah y{|*|Q}E G@>u//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAVRiLAmmoPickup extends UTAmmoPickup; @>+class ONSAVRiLAmmo extends Ammunition; @>i*// AVRiL alternate fire. Slight zoom and auto-tracking of target class ONSAVRiLAltFire extends WeaponFire; var ONSAVRiL Gun; var float ZoomLevel; var bool bWaitingForRelease; var bool bLosingLock; var float LostLockTime; function PostBeginPlay() { Super.PostBeginPlay(); Gun = ONSAVRiL(Weapon); } simulated function bool AllowFire() { //return (Gun != None && Gun.bLockedOn && PlayerController(Instigator.Controller) != None); if (bWaitingForRelease || Gun == None || !Gun.bLockedOn || PlayerController(Instigator.Controller) == None) { bWaitingForRelease = true; return false; } else return true; } function StopFiring() { if (PlayerController(Instigator.Controller) != None) { ZoomLevel = 0.0; PlayerController(Instigator.Controller).DesiredFOV = PlayerController(Instigator.Controller).DefaultFOV; bLosingLock = false; } } function PlayFiring() {} function ModeTick(float deltaTime) { local vector LockTrace; local Actor AlternateTarget; //Hack - force player to actually press button to start fire (so can't hold down button and sweep crosshair in the vicinity of targets) if (bWaitingForRelease && PlayerController(Instigator.Controller).bAltFire == 0) bWaitingForRelease = false; if (!bIsFiring) return; if (!Gun.bLockedOn || Gun.HomingTarget == None) { if (!bLosingLock) { bLosingLock = true; LostLockTime = Level.TimeSeconds; if (Instigator.IsLocallyControlled()) Instigator.PlaySound(Sound'WeaponSounds.BSeekLost1'); } else if (Level.TimeSeconds > LostLockTime + 1.5) { Gun.StopFire(1); return; } } else if (bLosingLock) bLosingLock = false; //Custom zooming because we don't want quite as much as normal sniper zoom does ZoomLevel += deltaTime; if (ZoomLevel > 0.60) ZoomLevel = 0.60; PlayerController(Instigator.Controller).DesiredFOV = FClamp(90.0 - (ZoomLevel * 88.0), 1, 170); if (!bLosingLock && Instigator.IsLocallyControlled()) { // Are we aimed at the HomingTarget or an AlternateTarget... AlternateTarget = Gun.HomingTarget.AlternateTarget(); if (AlternateTarget != None) { LockTrace = AlternateTarget.Location - (Instigator.Location + Instigator.EyePosition()); if ((Normal(LockTrace) dot Vector(Instigator.GetViewRotation())) > Gun.LockAim && VSize(LockTrace) < Gun.MaxLockRange) { Instigator.Controller.SetRotation(rotator(AlternateTarget.Location - Instigator.Location)); return; } } Instigator.Controller.SetRotation(rotator(Gun.HomingTarget.Location - Instigator.Location)); } } @>r_// AVRiL - Player held anti-aircraft weapon class ONSAVRiL extends Weapon config(User); #exec OBJ LOAD FILE="..\Textures\VMWeaponsTX" var Material BaseMaterial; var Material ReticleOFFMaterial; var Material ReticleONMaterial; var bool bLockedOn; var Vehicle HomingTarget; var float LockCheckFreq, LockCheckTime; var float MaxLockRange, LockAim; var Color CrosshairColor; var float CrosshairX, CrosshairY; var Texture CrosshairTexture; replication { reliable if (bNetDirty && bNetOwner && Role == ROLE_Authority) bLockedOn, HomingTarget; } simulated function PostBeginPlay() { Super.PostBeginPlay(); Skins[0] = ReticleOFFMaterial; Skins[1] = BaseMaterial; } simulated function OutOfAmmo() { } simulated function ActivateReticle(bool bActivate) { if(bActivate) Skins[0] = ReticleONMaterial; else Skins[0] = ReticleOFFMaterial; } simulated function WeaponTick(float deltaTime) { local vector StartTrace, LockTrace; local rotator Aim; local float BestAim, BestDist; local bool bLastLockedOn, bBotLock; local Vehicle LastHomingTarget; local Vehicle AIFocus; local Vehicle V; local Actor AlternateTarget; if (Role < ROLE_Authority) { ActivateReticle(bLockedOn); return; } if (Instigator == None || Instigator.Controller == None) { LoseLock(); ActivateReticle(false); return; } if (Level.TimeSeconds < LockCheckTime) return; LockCheckTime = Level.TimeSeconds + LockCheckFreq; bLastLockedOn = bLockedOn; LastHomingTarget = HomingTarget; bBotLock = true; if (AIController(Instigator.Controller) != None) { AIFocus = Vehicle(AIController(Instigator.Controller).Focus); if ( CanLockOnTo(AIFocus) && ((AIFocus.Controller != None) || (AIFocus != Instigator.Controller.MoveTarget) || AIFocus.HasOccupiedTurret()) && FastTrace(AIFocus.Location, Instigator.Location + Instigator.EyeHeight * vect(0,0,1)) ) { HomingTarget = AIFocus; bLockedOn = true; } else { bLockedOn = false; bBotLock = false; } } else if ( HomingTarget == None || Normal(HomingTarget.Location - Instigator.Location) Dot vector(Instigator.Controller.Rotation) < LockAim || VSize(HomingTarget.Location - Instigator.Location) > MaxLockRange || !FastTrace(HomingTarget.Location, Instigator.Location + Instigator.EyeHeight * vect(0,0,1)) ) { StartTrace = Instigator.Location + Instigator.EyePosition(); Aim = Instigator.GetViewRotation(); BestAim = LockAim; HomingTarget = Vehicle(Instigator.Controller.PickTarget(BestAim, BestDist, Vector(Aim), StartTrace, MaxLockRange)); } // If no homing target, check for alternate targets if (HomingTarget == None) { StartTrace = Instigator.Location + Instigator.EyePosition(); Aim = Instigator.GetViewRotation(); for (V = Level.Game.VehicleList; V != None; V = V.NextVehicle) { AlternateTarget = V.AlternateTarget(); if (AlternateTarget != None) { LockTrace = AlternateTarget.Location - StartTrace; if ( (Normal(LockTrace) dot Vector(Aim)) > LockAim && VSize(LockTrace) < MaxLockRange && FastTrace(AlternateTarget.Location,StartTrace) ) { HomingTarget = V; if ( AIController(Instigator.Controller) != none) AIController(Instigator.Controller).Focus = V; break; } } } } bLockedOn = CanLockOnTo(HomingTarget); ActivateReticle(bLockedOn); if (!bLastLockedOn && bLockedOn) { if ( bBotLock && (HomingTarget != None) ) HomingTarget.NotifyEnemyLockedOn(); if ( PlayerController(Instigator.Controller) != None ) PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.LockOn'); } else if (bLastLockedOn && !bLockedOn && LastHomingTarget != None) LastHomingTarget.NotifyEnemyLostLock(); } function bool CanLockOnTo(Actor Other) { local Vehicle V; V = Vehicle(Other); if (V == None || V == Instigator) return false; if (!Level.Game.bTeamGame) return true; return (V.Team != Instigator.PlayerReplicationInfo.Team.TeamIndex); } function LoseLock() { if (bLockedOn && HomingTarget != None) HomingTarget.NotifyEnemyLostLock(); bLockedOn = false; } simulated function Destroyed() { LoseLock(); super.Destroyed(); } simulated function DetachFromPawn(Pawn P) { LoseLock(); Super.DetachFromPawn(P); } simulated event RenderOverlays(Canvas Canvas) { if (!FireMode[1].bIsFiring || ONSAVRiLAltFire(FireMode[1]) == None) { if (bLockedOn) { Canvas.DrawColor = CrosshairColor; Canvas.DrawColor.A = 255; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(Canvas.SizeX*0.5-CrosshairX, Canvas.SizeY*0.5-CrosshairY); Canvas.DrawTile(CrosshairTexture, CrosshairX*2.0, CrosshairY*2.0, 0.0, 0.0, CrosshairTexture.USize, CrosshairTexture.VSize); } Super.RenderOverlays(Canvas); } } // AI Interface function float SuggestAttackStyle() { return -0.4; } function float SuggestDefenseStyle() { return 0.5; } function byte BestMode() { return 0; } function float GetAIRating() { local Bot B; local float ZDiff, dist, Result; B = Bot(Instigator.Controller); if ( (B.Target != None) && B.Target.IsA('ONSMortarCamera') ) return 2; if ( (B == None) || (B.Enemy == None) ) return AIRating; if (Vehicle(B.Enemy) == None) return 0; result = AIRating; ZDiff = Instigator.Location.Z - B.Enemy.Location.Z; if ( ZDiff < -200 ) result += 0.1; dist = VSize(B.Enemy.Location - Instigator.Location); if ( dist > 2000 ) return ( FMin(2.0,result + (dist - 2000) * 0.0002) ); return result; } function bool RecommendRangedAttack() { local Bot B; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return true; return ( VSize(B.Enemy.Location - Instigator.Location) > 2000 * (1 + FRand()) ); } // end AI Interface @>|@>@>n GtN" s:r.*r* {G{"[. G@>qLu AW NKw.*w*_.-' G@>Y w | gG@>~@Ez Pn LOc'wQ*QJ"'>-GZ_f)$s8C ^- (]-J5d%% d%7H$rd%H$*AH$d%&d%e-d%H$ 599pe-]-O-d%H$]-e-d%q9wO-*V59PO- 5IV5p G@>e-@>@>vy } kKH.-Zt(HwH*w.*tH G@>H@>@>K//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftPlasmaProjectileRed extends ONSPlasmaProjectile; @>L//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftPlasmaProjectileBlue extends ONSPlasmaProjectile; @>n.class ONSAttackCraftMissle extends Projectile; var Emitter TrailEmitter; var class TrailClass; var float AccelRate; var Vehicle HomingTarget; var vector InitialDir; replication { reliable if (bNetInitial && Role==ROLE_Authority) HomingTarget; } simulated function Destroyed() { if ( TrailEmitter != None ) TrailEmitter.Destroy(); if (Role == ROLE_Authority && HomingTarget != None) HomingTarget.NotifyEnemyLostLock(); Super.Destroyed(); } simulated function PostBeginPlay() { super.PostBeginPlay(); InitialDir = vector(Rotation); Velocity = InitialDir * Speed; if ( PhysicsVolume.bWaterVolume ) Velocity = 0.6 * Velocity; if (Level.NetMode != NM_DedicatedServer) { TrailEmitter = Spawn(TrailClass, self,, Location - 15 * InitialDir); TrailEmitter.SetBase(self); } SetTimer(0.1, true); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); Acceleration = Normal(Velocity) * AccelRate; } function SetHomingTarget(Vehicle NewTarget) { if (HomingTarget != None) HomingTarget.NotifyEnemyLostLock(); HomingTarget = NewTarget; if (HomingTarget != None) HomingTarget.NotifyEnemyLockedOn(); } simulated function Timer() { local float VelMag; local vector ForceDir; if (HomingTarget == None) return; ForceDir = Normal(HomingTarget.Location - Location); if (ForceDir dot InitialDir > 0) { // Do normal guidance to target. VelMag = VSize(Velocity); ForceDir = Normal(ForceDir * 0.7 * VelMag + Velocity); Velocity = VelMag * ForceDir; Acceleration = Normal(Velocity) * AccelRate; // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); } } simulated function Landed( vector HitNormal ) { Explode(Location,HitNormal); } simulated function ProcessTouch (Actor Other, Vector HitLocation) { if ( (Other != instigator) && (!Other.IsA('Projectile') || Other.bProjTarget) ) Explode(HitLocation,Vect(0,0,1)); } simulated function Explode(vector HitLocation, vector HitNormal) { local PlayerController PC; PlaySound(sound'WeaponSounds.BExplosion3',, 2.5*TransientSoundVolume); if ( TrailEmitter != None ) { TrailEmitter.Kill(); TrailEmitter = None; } if ( EffectIsRelevant(Location,false) ) { Spawn(class'NewExplosionA',,,HitLocation + HitNormal*16,rotator(HitNormal)); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 5000 ) Spawn(class'ExplosionCrap',,, HitLocation, rotator(HitNormal)); if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); } BlowUp(HitLocation+HitNormal*2.f); Destroy(); } function BlowUp(vector HitLocation) { HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, Location ); MakeNoise(1.0); } @>x5//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx var class TeamProjectileClasses[2]; var float MinAim; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStarRed'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadRed'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadBlue'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); L.AddPrecacheMaterial(Material'EpicParticles.Flares.FlashFlare1'); L.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStarRed'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadRed'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaHeadBlue'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels1'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaStar2'); Level.AddPrecacheMaterial(Material'EpicParticles.Flares.FlashFlare1'); Level.AddPrecacheMaterial(Material'EmitterTextures.MultiFrame.rockchunks02'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); Super.UpdatePrecacheMaterials(); } function byte BestMode() { local bot B; B = Bot(Instigator.Controller); if ( B == None ) return 0; if ( (Vehicle(B.Enemy) != None) && (B.Enemy.bCanFly || B.Enemy.IsA('ONSHoverCraft')) && (FRand() < 0.3 + 0.1 * B.Skill) ) return 1; else return 0; } state ProjectileFireMode { function Fire(Controller C) { if (Vehicle(Owner) != None && Vehicle(Owner).Team < 2) ProjectileClass = TeamProjectileClasses[Vehicle(Owner).Team]; else ProjectileClass = TeamProjectileClasses[0]; Super.Fire(C); } function AltFire(Controller C) { local ONSAttackCraftMissle M; local Vehicle V, Best; local float CurAim, BestAim; M = ONSAttackCraftMissle(SpawnProjectile(AltFireProjectileClass, True)); if (M != None) { if (AIController(Instigator.Controller) != None) { V = Vehicle(Instigator.Controller.Enemy); if (V != None && (V.bCanFly || V.IsA('ONSHoverCraft')) && Instigator.FastTrace(V.Location, Instigator.Location)) M.SetHomingTarget(V); } else { BestAim = MinAim; for (V = Level.Game.VehicleList; V != None; V = V.NextVehicle) if ((V.bCanFly || V.IsA('ONSHoverCraft')) && V != Instigator && Instigator.GetTeamNum() != V.GetTeamNum()) { CurAim = Normal(V.Location - WeaponFireLocation) dot vector(WeaponFireRotation); if (CurAim > BestAim && Instigator.FastTrace(V.Location, Instigator.Location)) { Best = V; BestAim = CurAim; } } if (Best != None) M.SetHomingTarget(Best); } } } } @>}//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftFactory extends ONSVehicleFactory; I!y@K!mI)M R"y5P"G6_p) @>@>X//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraft extends ONSChopperCraft placeable; #exec OBJ LOAD FILE=..\textures\VMVehicles-TX.utx var() float MaxPitchSpeed; var() array TrailEffectPositions; var class TrailEffectClass; var array TrailEffects; var() array StreamerEffectOffset; var class StreamerEffectClass; var array StreamerEffect; var() range StreamerOpacityRamp; var() float StreamerOpacityChangeRate; var() float StreamerOpacityMax; var float StreamerCurrentOpacity; var bool StreamerActive; // AI hint function bool FastVehicle() { return true; } function bool Dodge(eDoubleClickDir DoubleClickMove) { if ( FRand() < 0.7 ) { VehicleMovingTime = Level.TimeSeconds + 1; Rise = 1; } return false; } simulated function SpecialCalcBehindView(PlayerController PC, out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { local vector CamLookAt, HitLocation, HitNormal, OffsetVector; local Actor HitActor; local vector x, y, z; if (DesiredTPCamDistance < TPCamDistance) TPCamDistance = FMax(DesiredTPCamDistance, TPCamDistance - CameraSpeed * (Level.TimeSeconds - LastCameraCalcTime)); else if (DesiredTPCamDistance > TPCamDistance) TPCamDistance = FMin(DesiredTPCamDistance, TPCamDistance + CameraSpeed * (Level.TimeSeconds - LastCameraCalcTime)); GetAxes(PC.Rotation, x, y, z); ViewActor = self; CamLookAt = GetCameraLocationStart() + (TPCamLookat >> Rotation) + TPCamWorldOffset; OffsetVector = vect(0, 0, 0); OffsetVector.X = -1.0 * TPCamDistance; CameraLocation = CamLookAt + (OffsetVector >> PC.Rotation); HitActor = Trace(HitLocation, HitNormal, CameraLocation, Location, true, vect(40, 40, 40)); if ( HitActor != None && (HitActor.bWorldGeometry || HitActor == GetVehicleBase() || Trace(HitLocation, HitNormal, CameraLocation, Location, false, vect(40, 40, 40)) != None) ) CameraLocation = HitLocation; CameraRotation = Normalize(PC.Rotation + PC.ShakeRot); CameraLocation = CameraLocation + PC.ShakeOffset.X * x + PC.ShakeOffset.Y * y + PC.ShakeOffset.Z * z; } function Died(Controller Killer, class damageType, vector HitLocation) { local int i; if(Level.NetMode != NM_DedicatedServer) { for(i=0;i> Rotation) ); TrailEffects[i].SetBase(self); TrailEffects[i].SetRelativeRotation( rot(0,32768,0) ); } } if (StreamerEffect.Length == 0) { StreamerEffect.Length = StreamerEffectOffset.Length; for(i=0; i> Rotation) ); StreamerEffect[i].SetBase(self); } } } else { if (Level.NetMode != NM_DedicatedServer) { for(i=0;i 0) Multiplier = 1-(ImpactInfo.ImpactNorm Dot Z); else Multiplier = 1.0; return Super.ImpactDamageModifier() * Multiplier; } function bool RecommendLongRangedAttack() { return true; } //FIXME Fix to not be specific to this class after demo function bool PlaceExitingDriver() { local int i; local vector tryPlace, Extent, HitLocation, HitNormal, ZOffset; Extent = Driver.default.CollisionRadius * vect(1,1,0); Extent.Z = Driver.default.CollisionHeight; Extent *= 2; ZOffset = Driver.default.CollisionHeight * vect(0,0,1); if (Trace(HitLocation, HitNormal, Location + (ZOffset * 5), Location, false, Extent) != None) return false; //avoid running driver over by placing in direction perpendicular to velocity if ( VSize(Velocity) > 100 ) { tryPlace = Normal(Velocity cross vect(0,0,1)) * (CollisionRadius + Driver.default.CollisionRadius ) * 1.25 ; if ( FRand() < 0.5 ) tryPlace *= -1; //randomly prefer other side if ( (Trace(HitLocation, HitNormal, Location + tryPlace + ZOffset, Location + ZOffset, false, Extent) == None && Driver.SetLocation(Location + tryPlace + ZOffset)) || (Trace(HitLocation, HitNormal, Location - tryPlace + ZOffset, Location + ZOffset, false, Extent) == None && Driver.SetLocation(Location - tryPlace + ZOffset)) ) return true; } for( i=0; i> Rotation) + ZOffset; else tryPlace = ExitPositions[i]; // First, do a line check (stops us passing through things on exit). if ( bRelativeExitPos && Trace(HitLocation, HitNormal, tryPlace, Location + ZOffset, false, Extent) != None ) continue; // Then see if we can place the player there. if ( !Driver.SetLocation(tryPlace) ) continue; return true; } return false; } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorWing'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorTailWing'); L.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorGun'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); L.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); L.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorRed'); L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorBlue'); L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.AttackCraftNoColor'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlura'); L.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); L.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.raptorCOLORtest'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorWing'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorTailWing'); Level.AddPrecacheStaticMesh(StaticMesh'ONSDeadVehicles-SM.RAPTORexploded.RaptorGun'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris2'); Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Debris.Veh_Debris1'); Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp1_frames'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.we1_frames'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SmokePanels2'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'EpicParticles.Fire.SprayFire1'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorRed'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.RaptorColorBlue'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.AttackCraftNoColor'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TrailBlura'); Level.AddPrecacheMaterial(Material'Engine.GRADIENT_Fade'); Level.AddPrecacheMaterial(Material'VMVehicles-TX.AttackCraftGroup.raptorCOLORtest'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); Super.UpdatePrecacheMaterials(); } @>@@>~@>VT//Mutator to use Onslaught weapons in other gametypes class MutOnslaughtWeapons extends Mutator config; var() config string ReplacedWeaponClassNames0; //not an array because playinfo doesn't like it var() config string ReplacedWeaponClassNames1, ReplacedWeaponClassNames2; var() config bool bConfigUseOnslaughtWeapon0, bConfigUseOnslaughtWeapon1, bConfigUseOnslaughtWeapon2; var() byte bUseOnslaughtWeapon[3]; var class ReplacedWeaponClasses[3]; var class ReplacedWeaponPickupClasses[3]; var class ReplacedAmmoPickupClasses[3]; var class OnslaughtWeaponClasses[3]; var string OnslaughtWeaponPickupClassNames[3]; var string OnslaughtAmmoPickupClassNames[3]; var localized string ONSWeaponDisplayText[6], ONSWeaponDescText[6]; function PostBeginPlay() { local int FireMode, x; local string ReplacedWeaponPickupClassName; for (x = 0; x < 3; x++) { bUseOnslaughtWeapon[x] = byte(bool(GetPropertyText("bConfigUseOnslaughtWeapon"$x))); ReplacedWeaponClasses[x] = class(DynamicLoadObject(GetPropertyText("ReplacedWeaponClassNames"$x),class'Class')); ReplacedWeaponPickupClassName = string(ReplacedWeaponClasses[x].default.PickupClass); for(FireMode = 0; FireMode<2; FireMode++) { if( (ReplacedWeaponClasses[x].default.FireModeClass[FireMode] != None) && (ReplacedWeaponClasses[x].default.FireModeClass[FireMode].default.AmmoClass != None) && (ReplacedWeaponClasses[x].default.FireModeClass[FireMode].default.AmmoClass.default.PickupClass != None) ) { ReplacedAmmoPickupClasses[x] = class(ReplacedWeaponClasses[x].default.FireModeClass[FireMode].default.AmmoClass.default.PickupClass); break; } } OnslaughtWeaponPickupClassNames[x] = string(OnslaughtWeaponClasses[x].default.PickupClass); } Super.PostBeginPlay(); } function bool CheckReplacement( Actor Other, out byte bSuperRelevant ) { local int x, i; local WeaponLocker L; bSuperRelevant = 0; if (xWeaponBase(Other) != None) { for (x = 0; x < 3; x++) if (bUseOnslaughtWeapon[x] == 1 && xWeaponBase(Other).WeaponType == ReplacedWeaponClasses[x]) xWeaponBase(Other).WeaponType = OnslaughtWeaponClasses[x]; } else if (Weapon(Other) != None) { if ( Other.IsA('BallLauncher') ) return true; for (x = 0; x < 3; x++) if (bUseOnslaughtWeapon[x] == 1 && Other.Class == ReplacedWeaponClasses[x]) return false; } else if (WeaponPickup(Other) != None) { for (x = 0; x < 3; x++) if (bUseOnslaughtWeapon[x] == 1 && Other.Class == ReplacedWeaponPickupClasses[x]) { ReplaceWith(Other, OnslaughtWeaponPickupClassNames[x]); return false; } } else if (Ammo(Other) != None) { for (x = 0; x < 3; x++) if (bUseOnslaughtWeapon[x] == 1 && Other.Class == ReplacedAmmoPickupClasses[x]) { ReplaceWith(Other, OnslaughtAmmoPickupClassNames[x]); return false; } } else if (WeaponLocker(Other) != None) { L = WeaponLocker(Other); for (x = 0; x < 3; x++) if (bUseOnslaughtWeapon[x] == 1) for (i = 0; i < L.Weapons.Length; i++) if (L.Weapons[i].WeaponClass == ReplacedWeaponClasses[x]) L.Weapons[i].WeaponClass = OnslaughtWeaponClasses[x]; } return true; } function string GetInventoryClassOverride(string InventoryClassName) { local int x; for (x = 0; x < 3; x++) if (InventoryClassName ~= string(ReplacedWeaponClasses[x])) return string(OnslaughtWeaponClasses[x]); return Super.GetInventoryClassOverride(InventoryClassName); } static function FillPlayInfo(PlayInfo PlayInfo) { local array Recs; local string WeaponOptions; local int i; Super.FillPlayInfo(PlayInfo); class'CacheManager'.static.GetWeaponList(Recs); for (i = 0; i < Recs.Length; i++) { if (WeaponOptions != "") WeaponOptions $= ";"; WeaponOptions $= Recs[i].ClassName $ ";" $ Recs[i].FriendlyName; } PlayInfo.AddSetting(default.RulesGroup, "bConfigUseOnslaughtWeapon0", default.ONSWeaponDisplayText[0], 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "ReplacedWeaponClassNames0", default.ONSWeaponDisplayText[1], 0, 1, "Select", WeaponOptions); PlayInfo.AddSetting(default.RulesGroup, "bConfigUseOnslaughtWeapon1", default.ONSWeaponDisplayText[2], 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "ReplacedWeaponClassNames1", default.ONSWeaponDisplayText[3], 0, 1, "Select", WeaponOptions); PlayInfo.AddSetting(default.RulesGroup, "bConfigUseOnslaughtWeapon2", default.ONSWeaponDisplayText[4], 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "ReplacedWeaponClassNames2", default.ONSWeaponDisplayText[5], 0, 1, "Select", WeaponOptions); } static event string GetDescriptionText(string PropName) { if (PropName == "bConfigUseOnslaughtWeapon0") return default.ONSWeaponDescText[0]; if (PropName == "ReplacedWeaponClassNames0") return default.ONSWeaponDescText[1]; if (PropName == "bConfigUseOnslaughtWeapon1") return default.ONSWeaponDescText[2]; if (PropName == "ReplacedWeaponClassNames1") return default.ONSWeaponDescText[3]; if (PropName == "bConfigUseOnslaughtWeapon2") return default.ONSWeaponDescText[4]; if (PropName == "ReplacedWeaponClassNames2") return default.ONSWeaponDescText[5]; return Super.GetDescriptionText(PropName); } Q!iS6)R! jWвввввв;;ʁ)ʁ)ʁ)ʁ)|R|R|RߖqYԖqYԖqYԖKiqYԖKi\"qYԖKi\"qY lpEGKFg ]XWeapons.RocketLauncherf ]XWeapons.BioRiflee ]XWeapons.FlakCannonc a Z ZZX]Onslaught.ONSAVRiLAmmoPickupXOnslaught.ONSMineAmmoPickupX Onslaught.ONSGrenadeAmmoPickupo]Include AVRiLoReplace this with AVRiLoInclude Mine LayeroReplace this with Mine LayeroInclude Grenade Launchero$#Replace this with Grenade Launcheru]/.Choose if the AVRiL will be added to the gameu$#Replace this weapon with the AVRiLu43Choose if the Mine Layer will be added to the gameu)(Replace this weapon with the Mine Layeru:9Choose if the Grenade Launcher will be added to the gameu/.Replace this weapon with the Grenade LauncherX$]Arenab]Onslaught Weapons`]/.Add the Onslaught weapons to other gametypes.@>@>{ class MutLightweightVehicles extends Mutator; var config float VehicleMomentumMult; var localized string DisplayText, DescText; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (Vehicle(Other) != None) Vehicle(Other).MomentumMult *= VehicleMomentumMult; return true; } static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.RulesGroup, "VehicleMomentumMult", default.DisplayText, 0, 1, "Text", "4;2:10"); } static event string GetDescriptionText(string PropName) { if (PropName == "VehicleMomentumMult") return default.DescText; return Super.GetDescriptionText(PropName); } S!}6T!$HXjWв}L lpEGKFj $@@i ]Momentum Multiplierh ];:Vehicles get this many times as much momentum from damageb]Lightweight Vehicles`])(Vehicles fly farther when you hit them.@>@>@>@>@>@>@>@>Bclass DamTypeTurretBeam extends VehicleDamageType abstract; @>@>@>UFJ# +3.&!v#p G@>WFyH1`63w3*3Hyq@Dv G@>?class DamTypeSkyMine extends VehicleDamageType abstract; @>Zclass DamTypeRoadkill extends VehicleDamageType abstract; var int MessageSwitchBase, NumMessages; static function string DeathMessage(PlayerReplicationInfo Killer, PlayerReplicationInfo Victim) { if (default.VehicleClass != None) return Default.DeathString @ default.VehicleClass.default.VehiclePositionString $ "."; else return Default.DeathString $ "."; } static function ScoreKill(Controller Killer, Controller Killed) { local TeamPlayerReplicationInfo TPRI; if (Killer == Killed) return; TPRI = TeamPlayerReplicationInfo(Killer.PlayerReplicationInfo); if (TPRI != None) { TPRI.ranovercount++; if (TPRI.ranovercount == 10 && UnrealPlayer(Killer) != None) { UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('RoadRampage', 15); return; } } if (PlayerController(Killer) != None) PlayerController(Killer).ReceiveLocalizedMessage(Default.MessageClass, Rand(Default.NumMessages) + Default.MessageSwitchBase); } @>@class DamTypePRVLaser extends VehicleDamageType abstract; @>@class DamTypePRVCombo extends VehicleDamageType abstract; @> ]!Nh 8%w3*3 h N G@>=class DamTypePancake extends DamTypeRoadkill abstract; @>@>@>c!tL@ w3*9:3 ,6p9Dq9?t6p6p !e p%\` w\*w\*J9Pa\ a"J9?6m6J !vm% G @>@//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSVehicle extends DamageType abstract; @>u//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSMine extends WeaponDamageType; @>x//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSGrenade extends WeaponDamageType; @>z//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSChainGun extends VehicleDamageType; @>|//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSAVRiLRocket extends WeaponDamageType; @>bclass DamTypeAttackCraftMissle extends VehicleDamageType abstract; static function ScoreKill(Controller Killer, Controller Killed) { if (Killed != None && Killer != Killed && Vehicle(Killed.Pawn) != None && Vehicle(Killed.Pawn).bCanFly) { //Maybe add to game stats? if (PlayerController(Killer) != None) PlayerController(Killer).ReceiveLocalizedMessage(class'ONSVehicleKillMessage', 6); } } @>@@>~D$?D@@D@@k: ̾N$L=M$L=LGJSISHv"k"w$?P$/D@>UzOF R#K: @J$A!c,M#@>UzOG R#K: J$A!n,M#@>UqOD R#K: @J$A!l,M#@>UqO} R#K: J$A!a,M#@>D$?D@@D`@k: N$L=M$L=LGJSISHv"k"w$?P$C@>UzOO K: pJ$B!k,@>UzOQ K: pAJ$B!b,@>UqOP K: pJ$B!d,@>UqOL K: pAJ$B!j,@>D$ff?D@D@N$M$La;$HDJSISHLMv"k"w$?@>D$ff?D@D@N$>M$LJSISHLMv"k"w$?P$/D@>D$?D@@D`@k: N$M$LGm$JSISHLMv"k"w$?P$C@>4$SYx%i j SMYL $*@> $=*@> $>*@> $L?*@> $?*@>2"VZ8Z$$@>Z$$@>Z$$C@>@>-hZ8Z$$G@>Z$F$F@>Z$B$B@>@>ZZ8Z$$@>Z$$@>Z$?$?@>@>Y&YI $X": ???@> $?X": ???@> $?X": @>!YU $$?@> $L>$?@> $>$L?@> $?$?@> $L?$@@@> $?$L?@>Z8Z$@$ A@>Z$B$B@>Z$B$B@>@>k : #<??$PCGZ$?$?@>MZ$A$A@>SEYa $Z: @> $>Z: ???@> $L?Z: AA@> $?Z: L>L>L>@>@>4$Y. $*@> $L?*@> $?*@>2"#: C.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>@>4SY $* @> $?*@>2"#: HBZ8Z$$@>Z$HB$HB@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: C&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$A$ B@>Z$B$B@>Z$B$B@>@>""Z$?$?@>Z8Z$z$z@>Z$$@>Z$$@>@>R$?O$@@>4$Y. $*@> $L?*@> $?*@>2"#: B.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ B$HB@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>R$@O$@@>4SY $*@> $?*@>2"#: HBZ8Z$$@>Z$A$A@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>R$?O$@@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: B&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HA$A@>Z$B$B@>Z$B$B@>@>""Z$>$>@>Z8Z$$@>Z$$@>Z$$@>@>R$?O$@@>$S"SSB: pAY= $*Zn@> $=*",B@> $fff?*$1@@> $?*2P@>"dVZ8Z$$@>Z$$A@>Z$$@>@>%&Z8Z$$<@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$>@> $?$?@> $fff?$@@>Z8Z$HB$HB@>Z$HB$HB@>Z$HB$HB@>@>9T$Z$?$̌?@>@>+SS('B: ,$?"VZ8Z$ $ A@>Z$ $ A@>Z$ $ A@>@>%&Z8Z$?$@@>Z$$@>Z$$@>@>Z8Z$@$A@>Z$B$B@>Z$B$B@>@>9""T$Z$ff&?$ff&?@>Z8Z$$z@>Z$$B@>Z$HB$zC@>@>@>4$"SY= $*@> $L>*@> $L?*@> $?*@>2"&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@> $?$?@>Z$@$@@>R$L?O$?@>4$Y"Si j MY[ $*@> $=*@> $>*@> $?*@> $L?*@> $?*@>2",-hZ8Z$$G@>Z$F$F@>Z$B$B@>@>ZZ8Z$$@>Z$$@>Z$$?@>@>!YU $$?@> $L>$?@> $>$L?@> $?$?@> $L?$@@@> $?$L?@>Z8Z$@$@@>Z$B$B@>Z$B$B@>@>k : #<??Z$ff?$ff?@>Z8Z$$@>Z$$@>Z$B$zC@>@>MZ$@$@>SEYI $Z: ???@> $?Z: ???@> $?Z: @>@>4$Y. $*@> $L?*@> $?*@>2"#: C.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>@>4S2"#: HBZ8Z$$@>Z$HB$\B@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: C&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$A$ B@>Z$B$B@>Z$B$B@>@>""Z$?$?@>Z8Z$z$z@>Z$$@>Z$$@>@>R$?O$@@>4$Y. $*dd@> $L?*dd@> $?*dd@>2"#: B.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ B$HB@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>R$@O$@@>4SY $* @> $?*@>2"#: HBZ8Z$$@>Z$A$A@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>R$@O$@@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: B&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HA$A@>Z$B$B@>Z$B$B@>@>""Z$>$>@>Z8Z$$@>Z$$@>Z$$@>@>R$?O$@@>$S"SS'B: AY= $*@> $=*@> $?*@> $?*@>"n-=Z$?$?@>&Z8Z$$ ף<@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$C9""Z$?$?@>MZ$ $@>SEYa $Z: ???@> $=Z: ===@> $?Z: L=L=L=@> $?Z: @>@>4R: ?$S"SS'Y= $*@> $>*`@> $@?*`@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$pB$B@>Z$B$B@>Z$B$B@>@>$C""Z$L>$L>@>@>4R: ?$S"SSY. $*@> $L?*@> $?*@>P$L?"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$HC$zC@>Z$B$B@>Z$B$B@>@>$CZ$L>$L>@>@>$SSB: Y. $*@> $?*@> $?*@>"-n-hZ8Z$$@>Z$$G@>Z$A$A@>@>%V:]@&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$@$pA@>Z$B$B@>Z$B$B@>@>$@EZ$?$?@>Z8Z$$@>Z$HB$C@>Z$$@>@>MZ$$H@>S@>4$SSY. $*@> $333?*@@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$@EZ$>$>@>@>4R: ?$S"SS'Y= $*@> $>*@> $?*@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$pB$B@>Z$B$B@>Z$B$B@>@>$C""Z$L>$L>@>@>4R: ?$S"SSY. $*@@> $L?*@@> $?*@>P$L?"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$HC$zC@>Z$B$B@>Z$B$B@>@>$CZ$L>$L>@>@>$SSB: zY. $*@> $L?*@> $?*@>"-n-hZ8Z$$@>Z$$G@>Z$A$B@>@>%V:]@&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$@$pA@>Z$B$B@>Z$B$B@>@>$@EZ$>$@?@>Z8Z$$@>Z$HB$C@>Z$$@>@>MZ$$@>S@>4$SSY. $*@> $333?*@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$@EZ$>$>@>@>4R: ?$S"SS'Y= $*@> $>*@@@> $?*@@@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$pB$B@>Z$B$B@>Z$B$B@>@>$C""Z$L>$L>@>@>4R: ?$S"SSY. $*@@@> $L?*@@@> $?*@>P$L?"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$HC$zC@>Z$B$B@>Z$B$B@>@>$CZ$L>$L>@>@>$SSB: zY= $*@> $L>*`@> $L?*@> $?*@>B $@"n-hZ8Z$$@>Z$$G@>Z$A$B@>@>%V:]@&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$@$pA@>Z$B$B@>Z$B$B@>@>$@EZ$>$@?@>Z8Z$$@>Z$A$C@>Z$$@>@>MZ$$@>S@>4$SSY. $*@> $333?* @> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$@EZ$>$>@>@>+A"SS(',$?>$>"(#: HBB!Y $@$@@>Z8Z$ B$ B@>Z$B$B@>Z$B$B@>@>$ A9 ""Z$@$@@>|Z$@$@@>Z8Z$p$pA@>Z$p$pA@>Z$4C$fC@>@>@>4$Y. $*``@> $L?*``@> $?*``@>2"#: C.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>@>4SY $* @> $?*@>2"#: HBZ8Z$$@>Z$HB$HB@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: C&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$A$ B@>Z$B$B@>Z$B$B@>@>""Z$?$?@>Z8Z$z$z@>Z$$@>Z$$@>@>R$?O$@@>4$Y. $*``@> $L?*``@> $?*``@>2"#: B.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ B$HB@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>R$@O$@@>4SY $* @> $?*@>2"#: HBZ8Z$$@>Z$A$A@>Z$B$B@>@>$CZ$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>R$@O$@@>$"S(Y= $*@> $=*@> $?*@> $?*@>2"n#: B&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HA$A@>Z$B$B@>Z$B$B@>@>""Z$>$>@>Z8Z$$@>Z$$@>Z$$@>@>R$?O$?@>7LSW SB: Z8Z$?$?@>Z$?$?@>Z$?$?@>@>"#: AX : %&Z8Z$=$?@>Z$=$?@>Z$=$?@>@>Z8Z$L=$L=@>Z$L=$L=@>Z$L=$L=@>@>Z$?$?@>Z8Z$$C@>Z$z$z@>Z$HB$C@>@>MZ$z$zC@>@>S"SS('2"#: A-%&Z8Z$@$0A@>Z$$@>Z$$@>@>!Y $>$@?@> $?$=@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@> ""Z$L=$L=@>R$HBO$@@>$S"SSY $*@> $?*@>"#: BVZ8Z$$ A@>Z$$@>Z$$@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$@EZ$L>$L>@>Z8Z$pB$B@>Z$$@>Z$$@>@>@>$S"SSY $*@> $?*@>"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$A$ B@>Z$B$B@>Z$B$B@>@>$@EZ$=$L>@>Z8Z$A$A@>Z$$@>Z$$@>@>@>$S"SSY $*@> $?*@>"#: BVZ8Z$$ A@>Z$$@>Z$$@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$ A$ A@>Z$B$B@>Z$B$B@>@>$@EZ$=$L>@>Z8Z$A$A@>Z$$@>Z$$@>@>@>$S"SSY $*@> $?*@>"#: BVZ8Z$$@@>Z$$@>Z$$@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$@$@@>Z$B$B@>Z$B$B@>@>$@EZ$=$L>@>Z8Z$A$A@>Z$$@>Z$$@>@>@>$S"SS'MY $*@> $?*@>P$?VZ8Z$$ A@>Z$$@>Z$$@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$?@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$@E9""Z$@$@@>Z8Z$B$C@>Z$$@>Z$$@>@>EY1 $Z: ???@> $?Z: @>@>$S"SS'MY $*@> $?*@>P$?VZ8Z$$ A@>Z$$@>Z$$@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$?@>Z8Z$A$HB@>Z$B$B@>Z$B$B@>@>$@E9""Z$?$?@>Z8Z$C$C@>Z$$@>Z$$@>@>EYI $Z: ???@> $?Z: L>L>L>@> $?Z: @>@>4+AS"SO,S'Y $*@> $?*@>,$=>$="Pnn"!Y $$?@> $?$@A@>Z8Z$@$A@>Z$B$B@>Z$B$B@>@>k : >>>$C9 Z$@@$?@>|Z$>$>@>3Z8Z$fff?$fff?@>Z$fff?$fff?@>Z$fff?$fff?@>@>}"N&Z8Z$=$=@>Z$=$=@>Z$=$=@>@>@>+S"SS'B: ,$`@"Kn%&Z8Z$$@@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$@$A@>Z$B$B@>Z$B$B@>@>$zD9""Z8Z$$C@>Z$$C@>Z$B$D@>@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*22@> $L?*dd@> $?*@>"%!Y $$?@> $?$?@>Z8Z$B$B@>Z$A$A@>Z$B$B@>@>$@EZ$>$>@>Z8Z$C$C@>Z$$@>Z$$@>@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@> $L?*@> $?*@>P$L?"%!Y $$?@> $?$@>Z8Z$C$C@>Z$A$A@>Z$B$B@>@>$@EZ$?$?@>Z8Z$C$C@>Z$$@>Z$$@>@>@>4R: ?$S"SSY $*@> $?*@@@@>"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$C$HC@>Z$B$B@>Z$B$B@>@>$D Z$L>$L>@>@>$S"SS('B: AY= $*@> $L>*S7@> $ff&?*@> $?*@>"#: @VZ8Z$$B@>Z$$@>Z$$A@>@>%!Y $$?@> $?$?@>Z8Z$A$HB@>Z$B$B@>Z$B$B@>@>$D""Z$?$?@>Z8Z$$@>Z$$@>Z$$pA@>@>R$?O$L>@>$S"SS('Y= $*@> $=*@> $L?*@> $?*@>"#: AVZ8Z$$A@>Z$$@>Z$$@>@>%!Y $$=@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$D""Z$L>$L>@>@>S"SS(P$?VZ8Z$$@>Z$$@>Z$$pA@>@>-hZ8Z$$G@>Z$F$F@>Z$B$C@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$?@>$HB""Z$333?$333?@>|Z$>$>@>@>SS"Z8Z$$@>Z$B$B@>Z$B$B@>@>$CZ$?$?@>Z8Z$H$HC@>Z$H$HC@>Z$C$C@>@>@>$S"SSY. $*@> $?*@> $?*@>"VZ8Z$$A@>Z$$A@>Z$ A$ A@>@>n".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@?@> $?$?@>$ A9""Z$L?$L?@>@>S"S("VZ8Z$$A@>Z$$A@>Z$ $ A@>@>n".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$ A""Z$?$?@>}"N&Z8Z$L>$L>@>Z$L>$L>@>Z$L>$L>@>@>@>@>ZK @>@>hC@>@>@0@>s6@>u#@>@> @>@>\)@@>@>E+@>@>e1@>@>t@@>BC@>`L@>@>@>@>~'@@>g<@>n%@>@>J-@>@>@>@>@>@>`(@>a$JEb@\!)-9:9:$G" b#(a$a$a$a$b#(b#(b#(3} H)$HBE)$@C)$HB{($@y($Ew($@Ds($@r(Zf?eY9$$@>$@$@>$@$?@>$$tI$?@>@>q(p(o(m(Y]l($Ck($ Ej(: AB i($fff?@>eDp9I-@c#2V܆3} 8YJGKGLGY5S[m@>@>@>XDv@D)2e#J8׿e]u)G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G /G / lpEGKFA&Za#&p@%@>A&a#&p@%@>Z*ZZ@>@>j0@>C$@>Y)@@>~?@>^.@@>A<@>@>@>@>@>z%@>@>@>@>m0@>@>T%@>@>K2@>@>g$@>@>@>@>M-@>@>|%@>E$EF|Am+t#k(K> h+$ AeoW X$r$Bc(^-:l'g'R S^S5Ss%A m/$>y Y#z@>@>jC@>@>_$@>x8@>@>@>a#@@>u=@>@>@>{#@>@>v1@>@>C,@>@>_*@>@>w?@>@>|'S"@>@>@>o-@>@>N&@@>\7t#OF~AG,C$ vt#k K'$HBr$B/$>@>E^9e+@D$]qn͓ܕW=W=W=W=W=W=W=3}W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W= 8YEHFH`!$E5Sz@>DFr+`E$OUצ9 O+S+U+"(W+"X+C,Y+G-N,T,Z+`!$DB-R Ss%/$ff&?z@>@>N$@>@>@>@>w @@>[B@>@>@>@>@>@@>^@@>q+@>@>r$ @>b#@>a@>@>@>@>@>@>`2@>@>a(@>b#@>h%@>@>c-@>@>\@>@>i @@>TFg,@W$ FZ 8YmG`!$E5Sz@>@>i,@>@>H)@>[DL8j*@Z$,Ɠ @>@>@>@>@>@>@>@>@>{@>G@>@>Y1@>LED@}!!+-9:9:$G"!a$ȵb#(3}b#(3}3}ʁ)ʁ)b#(}Lʁ)ʁ)b#(3}ʁ)h3}Zs}L3}}Lʁ)b#(b#(b#(3}b#(b#(b#(܆3} o%d4U)"Q)"P)$@@O)N)aK)]J)$?\$DU$Ba$Cz$@FtJ7:[SC y'$ A@>@>L%@>@>u1@>@>@>@>E-@>@>@>@>P0@>@>K%@>@>@>@>@>@>t+@>VFn9E-@ l$$>#ܕW=W=W=W=W=W=W=W=W=W=W= 8YkGlGY`!$;F5SXz@>@>X;@>@> @>@>@>@>v>\%s9:9:$\%%\%7g#\%g#a**\%g#a a\%Y)\%g#a*%\%g#C'\%g# |. \%&Yws#*s#a**s#a ay.s#a*s# w.s#|%s# v.wx%*x%a**x%a aO6x%a*x% h#h2 G @>Q4@>@>k? @>@>J0@>@>L)@>@>[0R%X0h5m%%@m%7k6Vm%k XR%m%m%%m%7g6Fm%g XR%m%GwX(*R% QX(wC'*R% wC'w|%*R% w|%R%w6  R% w R% w R% w  G @>u$RH(%wX(* QX( G@>v$QPwC'* wC'>w|%* w|% w  w  w w6   G@>A&@>@>g&@>@>@>mEv*{$ ʁ) :7]"gmY#Sh Sg S@>@>sK@>@>H.@>tDn8h)@ ~$܆3} u u uʁ)W=W=W= u 8Y PIQIRISITIY5S@>@>x'b@>}1@>@>q)@>@>})@>@>F(@>@>@>@>nF@>Z'@>@>@>KC@>@>@>@>^6@>@>@<@>@>Y$@>@>fC@>@>g*@>@>I.@>@>\'@>@>V*@>@>@>@>m%@>@>@>@>L$@@>UA@>@>@>@>@>[)@>@>Y4@>@>t(@>@>X'@>@>@>@>@>@>@>@>K,@>@>@>@>r,@>@>o1@>@>y)@>@>@>@>O-@>@>S&@>@>@>@>@>@>x.@>@>MA@>@>@>@>z@>@>z)@>@>@>@>_.@>@>@>KFq9[,@7p%ŅȓܕW=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W= 8YGGHGIGY5Sz@>@>J)@>@>A2mCXql G @>@>@>V&@>@>@>@>@>@>I6@>p%@>@>@>j'@>@>\B@>@>y.d@>v%@>@>@>@>_(@>@>@>@>M)@>@>F.@>@>j)@>@>s7@@>F:@>Z*@>@>E&@>@>a*@>@>m-@>@>@>@>H-@>@>v(@>@>b/@>@>_0@@>Z7@>@>@>T$@>@>F$@>@>W+T"@>N0@>@>@>@>`C@>@>`0@>@>}+@>@>b @>@>M%@>@>@B@>@>c3 @>cK@>{@>BD@>@>S*@>@>_)@>@>k2@>@>@>@>@>@>w+@>@>@>@>k#@>@>D7@>@>z$@>@>@>@>@>@>W@>@>{+@>@>n#@>@>F%@>@>@>@>u+@>@>@>@>M+@>@>S,Q,N"A _-Q,\w * k-Q,\-Q,- M"' G@>t&@>@>y%@>@>^@>@>z1*@>S(@>@>H*@>@>l6@>@>@>@>O,@>@>}&@>@>_6@>@>@>@>@>@>L(@>@>@>@>W)@>@>|.d@>@>NFe9F,-9:9:$G@E'ê܆3} u~(~(W=W=W=W=W=W=~(3} 8Y uGvGwGxGY5S[A m@>@>o$@>@>@>@>@>@>@>@>H'@>@>J'@>@>@>@>^)@>@>p,@>@>w4@>@>TL@>@>v-@>@> .Y%r!c*-- -  - 'Y9:9:$  Y%t(Z- D$Y%t(Z-& %w*[%[% \$Y%lY%[%t([%-W-.[%/wW-*aW-5m#-- w*%[%Z$[% P -H#*[%J$[%a~w*e- - - Cc&   >r!  ~w-H#~A(-(lY%.t(wY%*KY%Y%K*U/U/2V.S$U'%U'7--~-U'H#U'A(U'r!Y%t(Z-U'97%w*r *q!r  G@>y,@>@>C9@>@>W-@>@>@>@>@>@>U2@>@>U)@>sEX9G+-9:9:$G@Z'+t܉hhqYԉhqYԉhhhhhqY@hh~(~(3}~(~(~(~(3} k: pAA8YIHY5SG C A m@>@>@>@>X2@>@>@>@>B)@>@>\2@>@>Q>@>@>@>@>U#@>@>Q@>@>m+@>@>c.@>@>`.@>@>@>@>l&@>@>@>@>k&@>@>d'@> @>UC@>@>W?@>@>_+@>@>p#@>@>[.@>@>W.@> @>@>@>@>@>i&@>vD^Fc"u'ʁ)ʁ) h'Y i'Y :7R ]"N Sm/$@JLN@>@>h0 @>p'@>@>B$@>@>@>{$@>e0@>@>F+@>@>C3S"@>B+@>@>I+@@>f<@>@>{$@>j=f@>Z2HCf4 9=, G@>@>@>p0@mh<@>@>@>@>@>{*@>@>z+ @>@>k:@>@>@>@>|#@>c*@>M(@>@>J(@>@>g,@>@>@>@>@>@>@>@>|/@>@>d*@>@>]*@>@>@>@>g/@@>r@@>V1@>@>]1@>@>]6d @>_1@>@>@>@>@>@>S6@>@>e(@>@>X3@>@>o?@>@>@>@>@>a$@>@>@>V'@>@>f.@>@>w:@>@>@>@>@>@>@>]DlAL)2i(CFݑ u lpEGKFD"= Road Kill!D" Hit and Run!D" Road Rage!D"Vehicular Manslaughter!D"  Pancake!D" Eagle Eye!D"  Top Gun!D"Fender Bender!~!t~!y~!S(~!@~!x~!T&~!]&~!X&`n%Z *YW$w>n-"@>@>@>@>@>@>m.@>@>@>@>@>@>g @@>@>[-@>@>@>@>l(@>@>b)@>@>Z-@>@>dB@@>eB@>x(@> @>@>@>@>@>a-@*@>x$@>@>`-@>@>@>@>@>@>@>@>@>@>@>@>r @>@>|(@>@>@>@>D2@>@>A)@> @>{?@>@>n5@>@>@>@>@>@>n-@>@>@>@>g%@>@>p+@>@>h-@>@>j-@>@>}8@>@>@>@>@>@>@>@>@>@>l)@>@>@>@>~.@>@>@>@>C'@d}?@>r#@>g@>@2@>@>@> @>@>@>u-@>@>f-@>@>@>@>p.@>@>@>@>w-@>@>s(@>@>@@>@>s8*@>h)@>@>@>@>e)@>@>q(@>@>J2@>@>@>@>@>@>m)@>@>C&@>@>@>@>B5@>@>{-@>@>L&@>@>u)@>@>@@>LB@>D9@>@>@>@>@>@>@>@>@>@>pBA.V" V/R PR R A.PR SR R A.PPA. G@>V/@>@>j%@> oED<~* ~)W@>@>@>X/|,N"onyv-|,s9:Q#79:Q#k-|,s-|,-9:Q# M"' G@>vo@>V2@>@>@>@>Y6@>@>Q2@>@>Y(@>@>w)@>@>e/@>@>@>@>I>@>@>@>E'@>@>@>}%@>@>G$@>@>tBxBkd%[+-E- -e$l"a-+l"y(X9:9:$ wQ*QJ"( G@>S@>@>V(@>@>U(@>@>i3@>@>Q8F"@>wB@@>@>]'@>@>@>@>`K@>@>x@>@>@>@>r/@>@>B.@>@>u/@>@>a6@>@>l/@>@>t/ @>@>@>@>@>pE@+@c*Me % 8Y PHQHRHSHTHUH5SmX@>@>j*@>@>p3! `EO*`f*ͅDH B b*R$@/$@@>@>iK@>@>G*@>@>M$@>@>@>@>@@>C:@>!@>@>r*@>@>t7@>@>@>@>@+@>@>AA@>@>@>@>q*@>@>E*@>@>i<@>@>@>@>J.@>@>M.@>@>D(@>@>Zx@>~/@>@>w*@>@>@>@>@>@>@>@>[5@>@>@>@>@>@>|&@>@>n0@>@>]$@>@>@>@>T?@>@>t*@>@>d0 @>@>L,@>@>J@>@>T.@>@>N+@>@>i$@>@>U7@>@>@>@>@>@>S7@>@>B0@>@>d&@>@>V7@>@>@>@>X%@>@>@>@>@>@>@>@>@>@>@>@>Z4@>@>h$@>@>@>@>@>@>@>s-@>\4@>@>@>@>N7y#Q[ y#%;y#7Dwy#Dy#y#%vy#7Cwy#Cy#By#%y#7Bwy#By#}y#%y#7Awy#Ay# w  w  w  w  w  w  w  w  w  G@>@>@>@>@>@>@>[A@>@>j+@>@>l+@>vEu9F"@k+2ܕW=W=W=W=W=W=W=W=W=W=W=W=W= X-$CW-$>V-$HCT-$L=Q-Zf?eY9$$@>$C$@>$D$D@>$PG$D@>@>O-8YFG5STP@>@>@>@>e2@>@>@>@>@>@>P$@>@>r+@>@>s+@>@>o+@>@>K0@>@>}6@>@>`4@>@>@>@>H0@>@>@>@>F0 @>@>@>@>@>@>V4@>@>D+@>@>C @>_7@>@>q0@>@>@>@>i@>@>3@>@>@>@>I,@@>n6@>f7@>@>G(@>@>s6@@>m6@>G,@>@>{/@>@>n*@>@>{0@>@>J4@>@>m7@>@>x0@>@>@>@>o7@>@>m:h6P9VMh6J- w *w.* M"' G@>S%@>@>v3@>@>W,@>@>{@@>@>@>@>@>@>@>@>@>@>UL@>@>@>@>s/@>@>@K@>@>@>@>E8j@>k, @>@>@>e,*@>e *@>a,j @>k/@>@>{*@>@>@>s,@>@>l, @>S1 @>@>@>@>@>g1@>@>Q*@>@>@>@>T(@>@>c/@>GE~)@t,䢋 8YGIHIIIY5S@>@>@>@>c+@>@>@>@>W6@dl@@>F*@>@>k1@>@>o4@>@>@>@>c%@>@>@>@>@>@>@>@>G@>@>@>e#@>f1@>@>_&@>@>k @>@>w,@>@>@>@>@>@>@>@>L-@>@>k(@>@>n)@>@>F-@>@>x1@>@>@>@>wC@>@>@>@>A6@>@>@>@>r8@>@>@>@>[;@>@>[%@>@>y4@>@>@@>@>U'@>@>@>@>@@dk+@>d%@>@>dM*@>K&@>@>W%@>@>J @*@>~(@>@>d-@>@>@>@>]-@>@>p-@>@>4@>@>@>@>S)@>@>I)@>@>a)@>@>@>@>oK@>@>F2@>@>N3@>@>R$@>@>K)@>@>Y@@>gHhAP.2s-6 o>+,e,e}Lp/Oz}Lo>+ lpEGKF@>@>@@>cB@>@>@>u(@>@>@>@>r?@>@>@>@>dC@>@>@>@>@>@>@>@>@>e#@>@>@>S2@>@>@>@>@>@>k=@>@>@P+AC@>@>@>@>@>V$@>@>B&@>@>Z%@>@>i.@>@>@>@>N.@>@>O9@>@>@>@>@>@>R.@>@>@>@> @>@>]C@>@>@>@>Q9@>@>@>@>X+@>@>@>@>@>@>X?m'L&"RAW..m'wW.*X+.W.JrX+**drX+br**]#%]#7rX+]#r]#*]#r**]#k*r*n%m' an%]#%]#7n%m' ]# a]# n%]#]# *_.PG]#%g]#7n%m' ]# a]# ]n%]# n%_._.n%q']#]#wq'*.m' awq'*rq'*q']#%]#7 r]#*]#]#* G@>\. @>@>t2 @>@>@>@>K5p@>q'@>@>N5@>@>@>@>a.@>@>@>@>@>@>[?@>@>@> xDLp)B Y6 g.zZ 堅|,e|| u u u 6NA5B"SO$~#fS^: CcYHBHCBz!$C[$: AA\$CG: H": B{$A]in a Goliath turretD]Goliath Minigun Turret@>@>^5@>@>k.@>@>G5@pC<@>D@>@> s?q?` #f-Y*kcc9:Q#7X9:9:Q#f%kcP G@>@>@>~D@>@>d(@>@>r-@@>@>q#@>@>q.@@>@>v?J699Z9:9:$i*a`5 i*a*9:9:$wM$* r$7M$K$r$&7M$K$r$&r$M$K$- ' G@>F)@>@>ed@>v.d@>g-@>@>w.dQFK,@z.*vR 8YrGsGY5SA zTy$B@>@>k-@>@>s#d@>{.@>@>u5g@>E?w(a}a^9:Q#78-9:Q# kw((^-9:Q# kw('w(-w( l"j/w( G@>q5@>@>D/@@>@>@>@>\-dk+@>Y-@@>@>@>@>@>@>K;@>@>_I/HLtV4jL9?% wM/ QI$I/I/v4u4t4M/ G@>v4@>@>@>@>K6@>@>K-@>@>@>@>}(@>@>P/@>@>Q/@>@>R/@>@>S/@>@>T/@>@>b(@>@>e@@>@>L/@>@>@>@>C?q4Pgx\q4Y-9:Q#7w.*9:Q# M"' G@>[/@>@>f@@>@>@>@>\q_(%w * q! G@>@>@>@>@>[6d@>NL@>@>_/d@>l4@>@>`/@>@>aK@>@>f/@>@>i/@>@>X*@>@>OKX$_#c-I6'9:9:$X$%}X$7swX$*X$aX$@X$%X$7X$aX$7%7%39:9:$-'X$%X$7g#X$g#aX$7g#%3ws#*s#ai,.bwi,*i, o$ ($ X( 'o$ 7%@ G @>w&@>@>u@@d@>@>@>j,@>@>n/@>@>o/@>@>@>`FOCM-2p/OzjW}LjW}L}LjW}L}L}LzVGBzVGBzVGBzVGBs-6 3}Zs3}Zs3}Zso>+ lpEGKFX$] BigWheelsb] BigWheels`]76Vehicle wheel size depends on how well you are doing.@>@>^*@>@>D@@>`6@>R(@>@>~& @>@>@>@>p:@>@>@@>@>nH(ZVw*CI$Y%99H( ?(H(W9:r* ZH(HH((H( G@>K(@>@>y/@>@>z/@>@>C0@@>c6@>e4T"@>@>@>l:@>@>F,@>@>}#@>@>@>@>E0@@>p6@>o>@>@> @@>u6@>@>@>i+@>@>@>@>LA@>@>@>~)@>@>@>^4@>@>]:@>@>b+@>@>@>@>@>@>[+@>@>S0@>@>T0@>@>U0@>@>V0@>@>['@>@>o'@>@>W4@>@>[:@>OEI*@Z0_9 8)}H5Sy S@>@>l>q$r&x-Q4 -R-q$ Z!!xq$ Z!!tq$ Z!!@q$ Z!!yq$ Z!!}q$ Z!!zq$ Z!!vq$ Z!!T&q$ Z!!]&q$ Z!!b&-R-' G@>T4@>@>i@>PEJ*@^0^[39 8Y|H5Sy S@>@>@@>N7@>R+@>@>@>@>S+@>@>@>@>e<@>@>@>@>@>p/}Fk-2g0t G C _s[]%o was cut down.^]%o was cut down._]%o was cut down.G S@>@>f# @>^7@>@>g> @>i0@>@>Q:@>@>$@>@>].@>@>\#@m@>E4m@>@>~Fl-3r0GUG C _][]#"%k's Manta filled %o with plasma.^]-,%o fried herself with her own plasma blast._]-,%o fried himself with his own plasma blast.s"u!x : /D@>@>E,@>@>@>@>@>{@>N,@>@>u0@>@>l7@>@>X @>q7@@>@>@>@>}A@>@>U,@>@>k*@@>@>@>@>~0@>@>@>@>d@>@>SL@>@>F1@>@>|7j@>o3@>@>],@>@>m3! %@>@>@>k3! %@>b0@>@>@>@>@>@>f3@>@>b,@>@>c,@>@>@>@>H#@>@>[& @>@>@>@>@>@>@>m,@>@>S8F"@>B%@>@>@>@>Z1@>@>W(@>@>M*@>@>},@>@>@>@>@>@>b1@>@>@>@>CX#e"G^"-9:9:$ -7n7X#%X#7rX#n*e1X# X#na i 6e1a#X#X#na*X#nE& X#K-v'X#%X#,rX#f#*X#f#a C$ aX#h0X#f#a*X#f#"%X#f#j0X#)|q9:9:$X#% X#7nX#naX#7n%q-v'X#%qX#,gwX#f#*X#f#aX#8+ G @>v *@>@>@>^J@>@>D-@>@>IB@>@>h1@>@>T&@>@>x)@>@>h@>@>W3@>@>@>@>p1*@>Y @>DGJ@>u&@>@>PB@@>@>w  @>%@>t$@>@>cJ@>@>m(@>@>@>~Eb+@y1,Ni 8YGHHHY`!$@E5So z@>@>f)*@>@@> @>@@> @>R3@>@>@> xE]+1|ʁ) :^m@>@>~1@>@>qLkCA"Al G@>F'@>@>@>@>@>@>@>@>jJ@>@>P)@>@>@>@>H2@>@>i)@>@>@>@>@>@>oB@@>@>~-@>@>N2@>@>E2S"@>\$@>@>@>@>T2@>@>n=@>@>s)@>@>rB@>@>B*@>@>@>@>}BP#>h)--E-"-e$^!a--^!y(O9:9:$Z-e$oPeoR p1oo1cwQ*QJ"'-G-e$af)$[C ^- (aZ$[C v& ( G @>T[2W"/%'r*r*p7-[2l#&r-6l#_$6l#_$ -[26l#_$C 6l#_$t6l#_$6~8l#v#6l#_$G"-6l#_$-6y8l#v#-6l#_$-6z8l#v#-6l#_$-6{8l#v#-6l#_$-6G2l#v#-6l#_$'\2 _'( l#_$59D6}8l#v#_'  _'\2p"6_'s!6_'_' G@>CC@>@>l#@>@>P. @>@>GC@@>@>Q$@>@>b2@>@>P9@>@>T+@>@>X.@>@>c2@>@>g+@>@>@>@>@>@>O6d@>YC@>@>}2f@>d2@>@>V9@@>@>j2f@>@>@>m2f@>l2 @>o2f@>p2 @>q2f@>r2 @>] f@>w2@>@>x2@>@>_=@>rEg$@y2%Xij 8YJHKHLH5SX@>@>{2@>@>|2@>@>@>@>2f @>H+@>@>@(f qEh$@@3, ړ 8YMHNHOH5SX@>@>#@>@>I3@>@>D3S"@>P2S"@>F3@>@>G3@>@>@>tEzFT+H3ؽ%KiqYԉhhhqYԧqYԧqYԉhqYZ'+tRqbRqbRqbRqbRqbk5fqYZ'+tqYZ'+t k: pAAz$@FJ W%h!h$?Go W $?M $=@>@>@>1uE[+J3\1| )@>nE`9{*@K3/܆3} u u uʁ)W= 8Y VHWHXHYHY5S@>@>o(@@>@>P3@>@>^'@>{$lEq*O3-l{$  FY@>@>w%@>{$kEo*Q30y{$  FY@>@>V#@>@>T3@>@>~=@>c#jEh*@U3Bc#2V 8YYGZG[G@>c#iEf*@V3Uc#2V 8Y\G]G^G@>@>@>@>m1@>@Ff+@Y3I 8YCHDHY`!$@E5So z@>hEe*@Z35 8Y eHfHu8hHiHjHY5S[mX@>@>@>gE`*@\3E 8Y kHlHmHnHoHpHqHrHsHtHuH5S@>@>K1@>@>@>fE]*@_3 8YvH5S@>@>o,@>@>`' c#BFi+@b3WGc#2V 8YVGWGXG@>@>a3 aEf9V*@d3P܆3} u uʁ)W= 8YwHxHyH5S@>@>O1@@>@>g3@>@>h3@>@>M1@>@>n3@>@>R>! %@>j3@>@>@>@>J1@>@>T>@>@>\,@>@>S>@>@>e*! @>q3 @>@>@>B1@>@>`J@>@>z3@>@>x3@>@>y3@>@>m*@>@>v0@>@>y0! H@>}3m@>tm@>{3! H@>c>! H@>A4m@>C(@>@>D,@>@>B4@>@>C4@>@>F4m@>o0m@>D4@>c#CFk+@H4/]c#2V 8YSGTGUG@>@>G4@>@>K4@>@>f>@>@>s3@>@>Q @>t  c#VEM*@O4׏oc#2V 8Y_G`GaG@>c#REL*@P4fc#2V 8YbGcGdG@>@>@>@>\0@>@>@>@>`<@>@>]0@>@>[4@>@>X4@>@>|+@>@>S4@>@>U4@>@>b4@>@>@>NE]ET"]4`|Re73}b#(hb#(b#(,eb#(b#(b#(b#(a$a$3}3}3}3}3}3}3}3}3}3}3}3} R'$ A\'$@@]'$@p%$@_'e'}Z ~woa-y#~"q$?_ _4cy$Culha$j!Zg!+l!Sk!Sm!i!Sh!e$DM $?f!$ff&?@>`!$`E)T@>@>kYMEG*@_4d 8Y~H5S@>@>@>@> n>e%q#QOi9:Q#7w9:Q#*9:Q#-iL9:Q#-a%e%k56e%9=,e%$e%B9?e%?s.9?e%?q.e%Tar-s.@9?&q.@9?&9?r-9?r-S&.GwS&*S&- w*D b+S& RS&\4N0b+a N0a b+a+b+e%;a(( S&S& ?*CNN$( G@>c4@>@>C%@>KEE*@d4H 8Y H@IAIBI5Sz@>@>R&T"FFn+@f4ЀzY 8Y|G}G~Gb$Z$@$@@>z%`!$@E5S@>@>^,@>@>m/@>@>}/T"@>i4T"@>@>@>p4@>@>]A?A"3*9:Q#79:Q#A" G@>^/@>@>@>@>s4@>@>@>@>@>@>N/@>@>M/@>@>t4@>@>u4@>@>)@>c#FE})@x4c#2V 8YeGfGgG@>@>@>c#EE|)@z4*c#2V 8YhGiGjG@>HFp+@{4 8YyGzG{Gb$Z$@$@@>z%`!$@E5S@>@>@>@>|4@>DEw)@~4jqO 8YNIOIY5So z^ @>@>@5@>@>r.@>}DAFS"!A5@Re73}3}3}3}܉hܕW=ܕW=ܕW=ܕW=ܕW=ܕW=ܕW=ܕW=ܕW=܆3}܆3}3}3}3} A*L,$u=z)$CR-$`jF}{-~~#M"0L"lo~#Q$Bs$@r$@"`~"xc'}&$ #`!$E)@>@>H5@>@>N(@>@>B@>l$@>@>@>@>@>h#@>W$@>I5@>@>Q%@>@>@>@>L5p@>e'p@>@>@>Q5@>JFxAD,2O5ϺpFݑ u{R~f u{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f lpEGKFT(]Daredevil! Level U(-, V(]mW(]Spin: X(]Flip: Y(]Roll: Z(-, [(] secsB=]\(]("n%Z" Z *YW$333?@>oDd)@P55 8Y'UIVIWIXIYIZI[I\I]I^I_I`IaIbIcIdIu8eIfIY5S@>@>V5@>@>@>@>T5@>@>U5@>@>s%@>@>E(@>@>G'@>@>Y5@>@>Z5@>@>_#@>@>i5@>@>@>nD])@]56 8Y gIhIiIjIkIlImInIoIY5S@>@>c?@>@>\5@>@>i*@>iD[)@a5 ؓ 8YpIqIrIsItIuIvIwIY5S@>hDY)@b57[ 8YxIyIzI{I|I}I~II@JAJBJCJDJEJY5S@>@>d5}!@>e5}!@>f5}!@>g5}!@>h5}!@>}!@>j5@>@>D'@>@>s.@@>@>K*@>@>RF@>@>@>fDV)@o5Q 8YFJGJHJIJJJKJLJMJNJOJPJQJRJSJTJY5S@>@>gD@>@>p5@>@>}5@@>YF@>t5@>@>@>@>A/@@>@>A@@>@>9d@>w5dc#XFF-@y5c#2V 8YPGQGRG@>@>x5d@>z5d@>{5d@>@@>[F@>N;U;v g]59:&pp9: Zpp9:  G@>|5d@>@>@>C@@>@>P;@>@>M;@>@>E6\!@>J@\!@>L6 @>c#ZFJ-@G6ݹ c#2V 8YMGNGOG@>@>[@ @>#@>H6 @>#@>I;@>@>J6@>@>K$@>@>@>@>@>@>a@d@>}:@>@>@>@>U/@>@>R6@>@>\(@>@>k@ @>#@>U6d@>V6d@>d/@>@>x&@>@>O&@>@>x,d@>m@d@>\6d@>M6@>@>I%@>@>u~(|(z(@>F&@>@>&@>@>`6WD@&!E G@>w/@>@>@>@>@>@>e6@>@>@>aFVw $@FU$ff?@>@>k6@>@>@>@>I(@>@>n6GA|%( G@>S#HA~% G@>t6@>@>c6UDB&" GCcFY-3q6KTC< C _M@>@>C+@>E'@>W#a#@>eF@>@>p6O"# G@>f:y"* a( G@> i:x+DGO6=H0x+x+:9:H09:x+q G@>B RDI&% G@>~6@@>x6@> w6o&r!T07U--  ZD$o&u+}6& %w*F%F% \$o&lo&F%u+F%-m&.F%wm&*am&m#n-- w*%F%Z$F% P d-H#*wm&* w*m&  m& ]F%J$F%alo&.u+%wo&*Ko&2K*OV.S$a GOdFZ-3{6 IesOV! C _M@>@>x6PDK&& G@>m&@>@>z @@>|6CfF_-36EmC< C _s@>OmFd-3@7TеOV! C _s@>@>@>@>@>CoFe-3C74xC< C _V @>@>y+@>OpFf-3E7.OV! C _V @>@>h+@>@>@>@>\ F$s7a ~) G@>]A@>qFi-2J7nJG C _s[]%o was tied up by %k.^]%o came to a sticky end._]%o came to a sticky end.G Ss"u!@>@>@>@>^+@>@>JQ7{#M74rO*z+Q79?F0-G('q!# G@>Z7Z:I%US  G@>@@>|FY@>@>@>@>@@>DD@>@>@> Y:P+M aJ|yw*- (P+%YP+7OrP+ P+7 G@>Q+@>@>J+@>@>@>@>c0@>@>@>@>\7K"T  G@>@>@>nJU:n!S  G@>[7@>@>]7@>@>A,@>@>qA@>@>@>@>p@>@>a7@@>@>@>@>d7@>@>e7@>@>@>@>@[@>h7@[@>w0@>OFq-3k7OV! C _]@>@>j7@>@>T,@>@>@@>@>@>C@Gr-3p7݊C< C _][]%k clipped off %o's headI y+Z,E S@>@>@'@@>@>yA@>@>S @> @>^8@>@>@>@>@>@>@>@>H8@>@>@>@>y7@>@>VL@@>@>Ij@>{7@@>@>}7@@>@>E1j@>~7@@>@>@8@@>@>7j@>A8@@>@>B8j@>D8j@>C8@@>@>F8@@>@>@>@>@>@>BB@>@>@>@>w9J"u G @>lL@I@>M8@I@>@>@>N8@I@>X1F"@>P8@I@>T8F"@>U8@F"@>n,F"@>R8@I@>V8@I@>\1@>@>W8@I@>Y8@I@>Z8@I@>[8@IAGs-3]8Wp []#"A vehicle %k destroyed crushed %o^].-%o couldn't avoid the vehicle she destroyed._]-,%o couldn't avoid the vehicle he destroyed.I SF E A Sy $@P $?@>@>^1@>@>\8@I@>_8@IBGt-3a8ZG C _L []('%o was incinerated by %k's twin beams.^]43%o somehow managed to shoot herself with a turret._]43%o somehow managed to shoot himself with a turret.@>@>`8@I@>b@I@>e8@>@>I&@>CCGu-3f8\C< C _p@>@>j8@>@>EB@>@>h8@>@>l8 @>%@>@>@>[  @>%@>GB@>@>S'o" SF*9Py,Y(`}Y(u"S'-_1'a  S'F*a  S'y,9?,F*rY(**Y( 9?,-',-',-'P-_1Y(u"S'zEa  S'F*a  S'9Py, G@>m8@>@>NB@>@>TB@>@>q8@>@>^-*OEGK.3t8;)OV! C _p@>7 zy$SD "SSY. $*@> $333?*Ȗ@> $?*@>"n.Z8Z$$@>Z$>$>@>Z$$@>@>!Y $$@> $?$ @@>$@EZ$?$?@>|Z$L>$L>@>@>@>nC@>@>@>@>My8g!@>z8@>@>{8@>@>G2@>@>L'@@>`B@>~8@>@>`)@>@>k)@@>@>A9@>@>B9@>@>kB@>@>@@>jB@>L2@>@>@>$S"SSY= $*@> $>*j@> $?*@> $?*@>"nVZ8Z$$@>Z$$@>Z$$pA@>@>-hZ8Z$$G@>Z$F$F@>Z$B$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$C9""Z$?$?@>@>@>W*@@>S"SS(M"nVZ8Z$$@>Z$$@>Z$$pA@>@>-hZ8Z$$G@>Z$F$F@>Z$B$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$A""Z$333?$333?@>MZ$$@>SEYa $Z: ???@> $?Z: ???@> $@?Z: @> $?Z: @>@>@>b*@@>@>L.@>@>EC@>@>@@>@>L9@@>@>M9@@>@>S.@>@>@>@>@>@>ICSCG"<-\ w*w6 *6 -E 6 EE E E u&E wt*u&t~&u&@Fu& G@>RC@>@>s@>@>@>@>@@>@>`&@>@>Y9W9L--]2b#v!L %r* }'`%k2d2c2r*`& `&  F)6P.k2ի6P.d26P.c2iw.*w. *`&.  ]-`&  #?99Aa `&a+9PR.`&X.R.`&6.%X.6.%X. G@>[9S":49:9:$.%-(7a G@>L+X L+`Nr*wL+T.DYT.;ErL+*(L+ T.,-' G@>\9b#~t-]2'-'.%-'6.%?6.%?a?( G@>]2V)&9:9:$v!L G@>\*X \*`Nr*w\*B.DYB.;Er\**(\* B.,-' G@>_9J9`#-7N.?L.a-J9%%&-' %B%B%-(&-9:9:$6% "īN.9?6% 6% 9?,d66%  AL.9?,66% 66% 66&AL.9?,(66&66&9?,&  @N.L? G@>-P%D& a9:6P%%9:6P%%9:6P%%6P%$6P%$d6P%$@6P%9=,V*P%6V*$6]'$6]'$6]'$6]'$6%%V*6&%P%6,%P%6,%V*6%&]'6&&P%6,&P%6,&]' G@>r)X r)`Nr*wr){-DY{-;Err)*(r) {-,-' G@>}-X t}-`qr}-**}- 9?,-' G@>|-X t|-`qr|-**|- 9?,-' G@>N)X N)`Nr*wN)h-DYh-;ErN)*(N) h-,-' G@>QY'E&<9:6Y'%9:6Y'%9:6Y'% 6Y'9=,U)Y'6U)$l)Y'6l)$6%%U)6&%l)6,%l)6,%U) G@>g9O)o"BpqI)9Pj-a  O)I)a  O)I)a  O)9Pj-a  O)j-9?,I) G@>U-X tU-`qrU-**U- 9?,-' G@>i9P&]#$gd-`Ywd-*d-u"n$o"n$n$666P&6n$666P&6n$666P&6n$666P&6n$666P&6n$666P&6n$c-n$T$%T$,6.T$c-6.T$c-66T$66T$66T$66T$6T$6T$%.T$P&T$. G@>S-X tS-`qrS-**S- 9?,-' G@>k9X9:9:$]# G@>Q-X tQ-`qrQ-**Q- 9?,-' G@>n$J-*9:9:$? G@>,X t,`qr,**, 9?,-' G@>~,X t~,`qr~,**~, 9?,-' G@>o9k8\#[2-k8%-(&-(X%-'&-' G@>Z(H&,66%̽Z(>66%LZ(L?66&CZ(9?,66&66&&AZ(9?,F&AZ(9?,F G@>J-*9:9:$? G@>s9d8^%5-d8&&&&&-(,,,,,-(&&,,I&? ?e89?9?I&I&ff>?%@I&%@I&6%@I&6%@I& G @>n8N'o" SQ*9Pp,V(`}V(u"N'-V1'a  N'Q*a  N'p,9?,Q*rV(**V( 9?,-',-',-'P-V1V(u"N'zEa  N'Q*a  N'9Pp, G@>t9w#h#6%%w#6%%6&%w#6&%6%&w#6%&6&&w#6&&6,&w#6,&66&w#66&66&w#66&66&w#66&66&w#66&66,w#66,66,w#66,66,w#66,66,w#66,66,w#66,66,w#66,66,w#66,66,w#66, G@>q,J Dq,.Awq,*h#q,h2^%( G@>T*X8H*]1\1M*T8]1mM*o:}%a\16}%k-n,-n,'W(S8X8%M*%M*%-(66%W(66%W(66%W(66%W(v%Q8}%v%X1v%v%X166%6}%6v%T*66%6}%6v%T*66%6}%6v%T*66%6}%6v%T*U8-n,(%%* G @>L8O8J"[%- -9:9:$4` 9?@-O8%A%A%-(&A&A&-(X%%&& G@>@>@>}y9Q1a#^%}Q1-(Q1W# G@>r&{9P1N"PP-P1r&-P1 c,.6rc,* -(c,x" G@>`,@>@>S,z9P7`,.r`,* -'`,g# G@>}}9I1a&%}I1-(I1W# G@>r&9G1N"P-G1r&-G1 ],.6r],* -(],x" G@>[,@>@>S,~9P 7[,.r[,* -'[,g# G@> A1N$ )i r*  -A1fw *K-A1 ,!Bf ,?!B G@>H:QY w  w  w  w  G@>D:Z,K?-(-(-- - -a----- - 9Da(- r* w *Z,a wZ,*Z,P  G@>@>@>E:S q!@> G@>bG:u7Dq!@>8Du7 G@>@>u'@>f.t*9:9:$ac0a*-'-'-( -'a((-(- (aX7( G@>I:B:d&wG@>T7J:M G@> K:q&5E--B-9:9:$ac0a* G @>z6L:{&r!u+--  ZD${&O,m7& %w*S%S% \${&l{&S%O,gS%-T,.S%wT,*aT,m#T- w*%S%Z$S% P *dS%J$sS%a w*-- Cc&   >r!   A(;l{&.O,cw{&*K{&pK*V.S$q!d& G@>M:p!n G@>}N:t0af0%}t0-(t0W# G@>r&P:s0N"V"P-s0r&-s0 E,.6rE,* -(E,x" G@>B,@>@>S,fO:PJT7B,.rB,* -'B,g# G@>@>@>x/T:l0Z$3-Px/l00l0 N 0, ( G@>@>@>rV:S:_ ' G@>@>@>W:w*mjw*? w * V" G@>PJY-$*w * -j8' G@>WKW7X LG XW7 G @> \:t%q#XFi w * -a%t%u56t%9=,t%$t%B9?t%?A/9?t%?D/t%TaY-A/@9?&D/@9?&9?Y-9?Y-V&.wV&*V&- w* R+V& RV&S7`0R+a `0a R+a+R+t%;a(( V&V& ?*CN$( G@>@>@>@>@>_:Y0h (E<-w* -B' h Y0Y0 G@>@>@>d+Rv(wf,* Qf, G@>b:M0s!vDJ$r* r *M0 s!M0  G@>H7X7RU" G @>@>@> c:a:lD w*l G@>e:y$E#?~r* r* 9:y$&-r*w.*g&w.*z$A'A' Zg&~g&wz$* ~z$wz$*Zz$ y$9=,{9:y$7Or9:y$*(w.9:y$*g&w.9:y$*z$9:y$9:y$A'A'e9:y$ Zg&~g&ewz$*9:y$ ~z${wz$*Zz$ G @>fb&O"fA%7b&m#1V$b&ib&b&b&m#rb&* rb&V G@> XA7[&~>w*E#A7 G@>d:C|%-a?'b9:%H 0,||9:&H 0, G@>@>@>nY+q$M^!IY+%;Y+71Y+-l Y+ G@>Dg:A"=5$w * A" G@>h:/V$XF"S r/*(o*%No*7k*D/o*k*'o*( G@>@>@>o*@>@>mf6k1@f6=w *w.* M"( G@>qv/W$k#Vrv/*O(%MO(7CrO(v/O(O( G@>@>@>O(@>@> r:o:o$H>w* w *60 E  G@>fD*RH*e/f/i/Y6S(aH*~.!@> w *u/ 0~.x&6u/aS(- w&a#?]*S(w&x&]*w&Cx&o$aS(C- w&a#?]*S(w&x&]*w&H*a<H*D* x&x&6D* e/6D* f/6D* i/ G@>@>@>A](g*m4b9: , 9: & % ](% re(*h e(W(l*?a|7$@(](9D9?](]( w.e(*.e(h&9?](9?9?9?&l*L(e(rJ(*J(a c* #CJ(E1u!L' G@> ~:s:O& UPw *9--W)-6P)&  v#P-6P)%  v#( G@>@>@>x:@>@>@>@>t:z:L 88@=l*?6wJ(*J(av!L G @>@>@>}P6]$ 9h(%h(7y9:h(9:P6:9:h( ,9:h( ,'h(( G@>v:@>@>h(@>@> C;|:Q&T "w * -a% G@>@H.[@ U" G@>:Y$`L@KHw|#*w,|#*,|#--v G@>@;A'U"i5Ay$w|#*|#--~09: %!|#a/!h$ 9:&!|#a/!g$ 9:%|#a1W9=9:$9:C-'Ca(.9:9:$-~0 9: % r|#* 9:%|#a @3.|#a y29: % 9: ,C-'Ca(w|#*|#aC-(Ca'C q!w|#*|#a9:9:$ 9: , A'`prA'*rA'*:A'- rA'* W9=A'Wri*ia K #A9?wi*iB i* G@>@>@> G;B;f# -w *---W) G@>w p!8_T G@>RK/l$DdJj).K/o)%o)7!C&.o)! wC&*wC&J$*C&J$- C&J$ s#K/rj)*q(q(C&J$ q(q(j)}#C&J$j)o)q(9?9:9D?9<K6w9:J6= G@>@>@> J;F;f! WNw *8--W)6`)&  v#N6`)%  v# G@>@>@>o)@>@> L;H;`rd W-W)kTTw *I9: f%kTP G@>n(@>@> O;G/G$g3 2r *!G/ 9? ( fn(69PG/   5n(n(s!n(n( G@>@>@>E;B6n$fb).B6d)%d)7!s(.d)!ws(*ws(J$*s(J$->rb)*1b)}#s(J$b)9?%'d)( G@> R;C6\]% w * \C6( G@>d)@>@>@>@>T;Q;g-V-w* G@>@>@> ];S;{"Q w * G@>@@>@>Om$d'`jv`-l -v9?9?>[w.m$*.m$_ .m$z$(wm$*wm$*'m$\m$m$>vm$a/!mr.m$*<m$ m$ 9?'m$9?&[l*9?& wL(*wL(*L(%[m$F=m$L(rm$L('( G@>@>@>@>@>V;V-e(xyQV- \O''V- V-{' G@>W;@>@>@>@>Y;F/Q$|z#/a2 F/JF/0 10 G@>_;Z;C*Jw* G@> _~%J{?r.~%*.~%Ww.~%* W9=.~%W9?&9=.~%W@'.~%q!mCN&K".~% N 0, G@> @E/G%B0"w* G%E/- E/ G@>gf ~ Q$ G@>lfʅ(7%aD8$@ $r G@> a;c;Jk G@>@>@>v6oy" G@>qf;p$!b.9: % 9: , 9: , G@>@>@>e;}.T$)\d(p.6d(f.d(6$}.6d(k-a)6${.6d(k-a)wm#*m#T$}.{.k-a)p. G"@>w$i;Q`,! w  w  w  w  w  w  w  w  w  w  w  w  w  w w$ G@>v$j;RT* Q  Q  Q  Q  Q  Q v$ G@>u$l;i#X9,$u$i#i# Q i# Q i# Q i# Q i# Q i# Q i# w i# w i# w i# w i# w i# w i# w i# w i# w i# w i# w i# w i# w i# w  G @>z(@>@> n;k;C A&#??6A&A&9?,P$#?waM)p+P$9?,(A&*(9?,dx$#???x$9?raM)p+x$P$P$(A&* a x$P$ZraM)p+x$P$P$(A&* a x$P$'z(%z(7 6%9?%P$#?6%.P$#@h-x$az(P$P$yx$z(-(waM)p+x$P$(A&*a x$'z(( G@>@>@> Gm;\' G@>IX5e"o -9:9:$ -X5Y5Z57B%7B7^_#%_#7Br_#B*_#BaD5 a_#^_#Ba*_#B"_#m7h#%7h#7j._#%_#7h#r_#h#*_#h#aG5 a_#j._#h#a*_#9:9:$_#%_#7B_#Ba_#7B%_#%_#7h#_#h#a_#7h#% G @>g;R5q!6!R59: %s G@>R'wLS5r!J 9:9:$s%%Ls%7Bs%Bas% 7B%s%%s%7h#s%h#as%[7h#%R'S5T5U5 G@>@>@>z'R  zw'*'a G@>r;@>@>zy'R  zwy'*y'a G@>H7wF$] G@>A}sw 3A0w#*#-'#a(( G@>};J%|' Gw.J%*.J%^<b<J%O.# 6O.6J% O.J% 9?,2J%pMove away from 9VJ%J%b J%%J%@J%C$'# J% 9?J%pMove closer to 9VJ%M=J%('J%C$'(J% G@> oMw;U$!50333?9?&?( G@>O.@>@>@>W$@> F5^"w* ^F5 G@>@>@> B<C5dxyN(.C5vwN(*w.N(*rN(N( G@>a@>W@>@>@>q-Z"wK)* wq-K)w.K)*.K)-w.q-*.q- N i(, G @>F<@>@>H<@>@>i-Z"wS)* wi-S)w.S)*.S)-w.i-*.i- N i(, G @>I<@>@>K<@>@>w$N<Q +! w  w  w  w  w  w  w  w  w  w  w  w  w  w w$ G@>v$P<R( Q  Q  Q  Q  Q  w v$ G@>MO'Z"rO'w4 ).O'w)*) ) , w. O'*. O' z'!v$ w.O'*.O'N|4}4 G @>u$Q<d#Xds"u$d#d# Q d# Q d# Q d# Q d# Q d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w d# w  G @>R<X-lUk!wX-y4E- tX-#?}3t--P'X-#@4 G@>U<|)w&a.|).-K-(k(%k(7|)}wk(|)*k(|)- -K-'k(|t 9?%-K- -P'mu*aE4 ? 9:9:$-I+-I+J9:9:$V/a y1V/a*^!o0ew.*u*+#A49?%- -P'-P''aF4 ?9:9:$L/a Y3L/a*w.*t+-P'( G@>{,m%D%{, (o4%&{, AAL?&{,  G @>@>@>m4W<TS<v,Z"wc+* wv,c+w.c+*.c+-w.v,*.v, N i(, G @>`O]/nd `-]/-]/-P'( G@>Z<[$e"r b-9:9:$ 7\#% -7\#7C(7~'7C([$%[$7C(r[$\#*[$\#a D$ a[$C([$\#D& [$~'#?[$f_T9:9:$[$%L[$7\#[$\#a[$ 7\#%t G @>v+m%D%v+ (`4%&v+ AAL?&v+  G @>l.]<f+`C vw.f+*r.f+*!f+ 9?bf+s-P-n'k G@>@>@>[<@>@> ^<\h/_<e+_#q ]T9:9:$e+%Le+7\#e+\#ae+ 7\#%h/ G@>]a<\+?b) ]T9:9:$\+%L\+7\#\+\#a\+ 7\#%] G@>X0@>@> NMR4k%PX0W4X4}w*|+\06|+}|+X0333?\&R4\0T4* G@>P'@>@>d J639:9:$ X G @>c<Q? w  w  X G@>b<@>@>@>@>@>D$@>@>@>@4m@>R'[w3r! ~m*.r*%Ur*7m*r*m*ar*7m*%R'w3x3y3 G@>tJP(j$ hP(6P(%6P(%Ki%]0aZ4 P(e]0aU4 P( G@>R@>H@>@>@>m<@>@>jp<^)8 9:9:$n-1 Nr*r*D#n( hB1 B1t3-\,-1_,.-UL'w.*@K..W@KIw@K*w@K@Kz$?b$@K   #?.@K-1'-1(-UL(r.*C.  99 ` (.  dAb$.   #?C1  ND1 UF1` ..bF1o399D1C1d=r.*C1  ND1 UlK =wlK*~KlKk<&w~K*SL~K C1&SL99D1` SLdb$~K C1.lK#w.*.lK=lKlK O-1W.n-1-\,-1-UL w.*.p w.*. u -\, -1 w_,*_,_ G@>C1@>@>n<@>@>q<@>@>w@>m@>@>@>t<@>@>w$z<QG] w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w w$ G@>tD#0%-1 w.*._-1( G@>w<?dD# G@> x<l3z*D# l3 G@>v${<RY Q  Q  Q  Q v$ G@>u$}<j#XDu$j#j# Q j# Q j# Q j# Q j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w j# w  G @>=T1}$ #F#T1z4?T1 G@>H/rN1Hw=rM1 r0N1L?H/N1f3g3h3M1 G@>|<`$F#j%B`$9? })u &,`$$`$ B%%B%})B%p`$L1`$3`$9?B%&j%?Y1`$&a j%j%CCXBXBB%kB%})B%u OB%p`$L1`$A`$9?B%})&j%?Y1j%`$&a j%j%CCXBXBB% G@>.@=U1af%.U1-(U1W# G@>@*B=W1N"XP-W1@*-W1 m,.6rm,* -(m,x" G@>u,@>@>X/uA=P<u,.ru,* -'u, ^+? G@>H=e"GRO-0wz#*z#Ow{#*{# G @> ~<E=t4 p%'  G@>@>@>D=G=G&<Ix%%( G@>@>@>J=_&9a/wz#* i#z#z#*^w{#* i#{#{#* G@>f n1}$#F#n1z4?n1 G@>YM^&%Qz#. z# wz#*z# &z#  "@z#&z#{#. z# w{#*{# ,{#  "@{#,{# G@>I=c$F#%<g%Bc$9? L)` &,c$$c$ t$%t$L)t$Uc$l1c$3c$9?t$&g%?u1c$&a g%g%CC0BDBt$kt$L)t$` Ot$Uc$l1c$Ac$9?t$L)&g%?u1g%c$&a g%g%CC0BDBt$ G@>CM=?_&C G@>KJD(%9:9:$^& G@>y @>p @>@>@>O=@>@>DR=G&Cx%%( G@>@>@>Q=W'?M_x9:9:$W'%xW'7XnwW'X*W'X'@W'X #?W' G@>P=@>@>T=@>@>|W=f,w.*}K.w}K*}KC-7}K}K w*U` '( G@>}K@>@>e<@>w$Z=Qj] w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w w$ G@>v$[=Rtm Q  Q  Q  Q  Q v$ G@>u$\=`#Xu$`#`# Q `# Q `# Q `# Q `# Q `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w `# w  G @>^=E3p"Lap2$@ (E3F3I9:9:$aG3 G@>@>e#@>g `=~2Ll= g ~29:9:$- -w'H+!_,t*!\,\$aE*Q26t*6H+w\$*\$-\$a/!t \$a/!Y.\$!HE*9?,d g0-w''-[.'p",!r% ^0X9:9:$-[.-w''-[.(p",!r% ^0h9:9:$- -p'H+!],t*!^,\$aE*Q26t*6H+hw\$*\$-F\$a/!t \$a/!Y.\$!HE*9?,d g0h-p''-\.'p",!t% Z09:9:$-\.-p''-\.(p",!t% Z0 G@>z2@>@> b=v2k%^ Oz2{2|2Jw*\&v2w2x2* G@>s2f@>`c=f2nLHaR-f2a!h,O-w' -p'ar2$@ (-(^!V9^`-f2 G@> d=g2J%<aR-g2a!`,O-w' -p'at2$@ (-'^!l2^ -g2 G@>@*e=G-N"4'-G--G-$@*-G- G@>X/f=n2P.n2 G@>l.w'A+` Zvw.A+*r.A+*!A+ 9?bA+s-P-n'k G@>w$h=Q%q w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w  w w$ G@>v$i=R"m Q  Q  Q  Q  Q v$ G@>u$m=[#Xu$[#[# Q [# Q [# Q [# Q [# Q [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w [# w  G @>f@>y*@>@>ll%d"`  rF$* l%F$z)%az)7l%@"l%z)l%z)l%l%m#rl%* rl%F$ G@>Z.p=C.L&6, ]<AZ.C.y*.C.ry** 7% |"bwy**$y* &a/!L%Z.C.D(7&'D(%rD(*D(D(Z.C. G@>O%@>@>l=B3Z%p" -K+'@"B3I3 G@>s=@.i$W ]<Aa/!L%@.S2T2\'.@.\' &w\'*\' &a/!L%@.S2T2O%\'wO%*r.O%*lrO%rO%*@O% \'r$O%X2O%O%X2,@.S2T2 G@>@>@>o=O2@"{ QK#O2N2 ~-a e#~-d#O2N27aa~- G@> t=q=J% [%% G@>Pw=?KA8w@%*@% * i#@%P G @>@@>@>r=M3X#w%7a&w%%:rw%a*Aaw%&zzw%af"M3P3w%aaAaw%&w% G@>c1x=x#e"F - w@%*V#}V#,V#V#[(V#V#](V#V#((V#V#)(V#V#{(V#V#}(V#V#<(V#V#>(}V#,a#%a#}V#a#x#V#a#&a#a#7x#&a#%`(a#x#n`(,A `(,ZAx#a#&~7x#,a#*J7x#,a#7x#&Ja#%`(a#x#`( ,AAx#a#&0 ,EAx#a#&0 ,IAx#a#&0 ,OAx#a#&0 -,UAx#a#&0 @7x#,Ja#V#a#%a#7x#aBV#a#x#a#YV#V#,@%c1 G @>y=A$[*',26|($d6|($d6|($d6|(9=,6B)$6B)$6B)$6B)9=,6^'$6^'$6^'$6^'$-A$V#\)o-N3A$d 9?A$9?A$9?A$9?A$R3^'A$= 9D9?A$o-?&,(&V#\)|(A$7 9D9?A$o-?,(V#\)B)/A$d 9?A$9?A$9?A$9?A$}1^' G @>iJ@%JiJ9:9:$@%. z# @% ,@%}1@% ,@%\). 2k4Fonts.Verdana28  G@>v=O"`"x# G@>z=S3K#ma'7a&ha'%:ra'a*Aaa'&^^a'af"S3T3'a'( G@>}=p(t(8p(.wp(*d9:9:$p(Ny0%**p(Ny0&**9:9:$[-.p(w[-*[-D, G @> =w1m"7` w1-p3 m(%]m(7m(w1m( m( G @>a'@>@>A>n(6.^!e3+wO1*aO1  @ G @>{=f(`"\-K+(f(%Lf(7aBwf(a*f(aaf(Aa%7a G@>a4B>^#q#Y/ha4^#m).u-e* & rm)*rm)*m)- ^#$^#0b,^#k,^#^#^# $$$$^#Fa l,^#S1^#{CSCB0B^#$n)?S19?,[&J-m3H1?^#c3^#>b,[&^#k,[&^#^#wa`'l,9?,[&^#J-n)^#9?`'9?`'J-L-k3J1?^#a3^#Kb,[&^#k,9?,[&n)^#^#wa`'l,9?,[&^#L-n)^#9?`'9?`'L- G@>]B^(m-]^(X3m1W3w.{^(*.{^(-w.*&.{^(WWm1^39999^( 9?%. N i(, G @>[0Ta1r&>*-b1 -R-a1 Z!!X&[0a1-b1 G@>}J*|#/w*w*y9:J*J*W9=%J*W$J*W$( G@>^3 @>@>@>G>N*u'1}N*z-G$%zG$,o&N*G$}2pwG$Q&*9:G$Q& %o&N*G$2G$Q&-v6 6 G$@(9C9?,X&6 6 G$@(9C9?,X&  6 G$@(6G$@(9Da9?G$Q&9?G$Q&9?,dC(N*G$@(G$ G@>H> @>K> @>L> @>M> @>V^&]%6[r^&* Y&,d M%i39?,^&n39?@^&xY&, g*Y&, Y&Y&g*, tK6S*?M%?rK6S*M%?^&$$$9=,iKiK,jKjK,^&"tK9?jKrK9?iK^&ka6M%M%9?6g*69?6g*69?6%69?6%6jKiK^&9=,9=,$9=,^&tKrK^&ka6M%M%9?6g*69?6g*69?6%69?6%6tK6S*M%?rK6S*M%?^&$$$9=,iKiK,jKjK,^&"tK9?jKrK9?iK^&ka6M%M%9?6Y&69?6Y&69?6%69?6%6jKiK^&9=,9=,$9=,^&tKrK^&ka6M%M%9?6Y&69?6Y&69?6%69?6%6 G@>N> @>P>@>@>e3@>@>H1@>@>Y&@>@>r3@>@>l @>` @>@>@>W>@>@>ru3LVFFu33rN$* w*N$.9:%Q&%/a0 `J`J-l9:`J,9:`JQ&`J10-K+ wN$*`"x#X&?@I@?? G@>X>@>@>Y>x#mHa^wN$*EN$|/DZ%EN$C0DX#EN$E0DO"N$K -K+' G@>lQjM w  w  w  w  w  w  w  G@>\>}0v)~P r}0*(z'}0 J46z'e0z'-K4e0N,33s?6U,v36z'v0N,6U,z36z'v0N,6U,'( G!@>Z>@>@>^>@>@>_>@>@>`>@>@>~3! H@>b>! H@>I4@>@>d>@>@>z'@>@>e>@>@>K @>]>W&d%FSr}+* rW&* {*9?}+}-F({*6C%9?,~/6W&W&6W&9C6C%W&(V46C%[46C%W&a}+6C%@6C%@b46C%F({*@c46C%F({*@6C%9?,F(6C%9?,F(6W&~/ G!@>@>@>@@>j>@>m>k>x$  G@> a4R0D. R0S0T0U0V0['%['7['-B'w['*['!j+S0T09DR0U0V0['& G@>p>G0[%+G0*G0%r.* i+%oi+7eri+*j+oi+1j+%/a8 l+w.l+*r.l+*.l+`'!X'j+j+%10 G@>@>@>p$D0s!EC9:Q#7D09:Q#s!D0 G@>@>@>q>@>@>r>@>@>i>^%e%nV r^%* ZK,-lg,@z/9?,^%y/9?@g,z/9?,^%y/9?@M(g, @?K(k/^%K,-g9:K, %^%b'b(o2K(b(m2?K(R^%b'b(s2K(b(q2?K(^%66{/M(?6{/M(?^%&a M(M(BBB^%k/ G!@>R'}Js>r! G@>{>u>B%!a>~; h@>G@>@>@>w>@>@>x>@>@>R'zJy>r!ה G@>|>z>r ܔA_#E$#??aA~; h@>G0@>}>g4S&N9:9:$R(`wR(*wR(*d*R( d*\( @d*\(j*?j*\( @d*\(R(2O5j*|5{5z5j*x5w5?7x,%s/7x,as/x,$W6 V6-g4{9:9:$^,a\6 -'q!B%9:9:$^,a]6^,a* G @>h/h4E$.?dT6\(R6S6-H6U6Q9:9:$S&(n/իm/6a/6a/h4o/իm/6_/6_/9?&n/#o/ G@>t>M&i%nZ! rM&* }(p49?,M&s49?@M&D6b/}(@@?6b/}(@@?-l4M&b'b(M&N/b(b(M&??N/M&4a }(@@}(@@BBB G!@>@?`%E# A r* `%9=,>9:`%7=r9:`%*w.9:`%*r,w.9:`%*T(9:`%9:`%A'A'(9:`% Zr,~r,%wT(*9:`% ~T(>>wT(*ZT( GH@> Zk4[&E#k4 G@>@>@>@*n4t)}z ^/9Dn4aH^/6W 9# Qj7V%a7V&V  @%Z/[6E$6m9?Z/w*w.* G@>D?r4k_wOr4L9:Q#7w.*9:Q# M"( G@> H/O/e$VWv O/P/Q/R/S/T/b(%b(7b(-b($e$O/P/Q/R/S/T/b(+ G@>H?])Cr`P])1])-]) ^!j/M-])a+ G@>~>S$j%] rS$* q#49?,S$@59?@~9:g-, 9:g-&-x.S$D6h%q#@??6h%q#@??S$4a q#@?q#@?BB{S$D6h%q#??6h%q#??S$4a q#?q#?BBB9:g-%S$b'b(S$r.b(,j2?r.`-x.S$D6h%q#@?6h%q#@?S$4a q#@q#@BBBS$D6h%q#??6h%q#??S$4a q#?q#?BBB G!@>T)@>@>J?G?z$i_BT)%=T)73wT)*'T)( G@>R)@>@>L?I?|"[&_O w*(R)%JR)7@wR)*(R)' G@>(@>@>N?K?x+MC^Y w*(%T(7Jw(*(( G@>C)@>@>Q?M?l*Cg]_C)%ZC)7Pw.C)*.C)C)* G@>F?A%f)@b rA%* Q%H59?,A%I59?@6A%$6A%$6A%$6A%9=,.-B5A%D6q)Q%@?6q)Q%@?A%4a Q%@Q%@BBBBA%D6q)Q%@?6q)Q%@?A%4a Q%@Q%@BBBB G!@>c)@>@>R?P?d*6\]w*w-&c)%Tc)7Jwc)*w-c)w- G@>xg(s'FYF'-|"r!*  N|"F)9?,  /aA g(@E wg(* wg(g(WWLb$g( g(#?#?F)9?, 0 10@w*r S*a G@>XE5Z*Tz9:Q#-i(Q#9=E59:Q#-i' 9:Q#d, 9:Q#e, G@>~*@>@>Z.G+ZqI9?%(5I$Y%99G+ ?(-G+W9:~*%~*7w~**HG+(~*dG+ G@>O?f'e)Ye rf'* E(Q59?,f'V59?@f'N5f'66`.E(?6`.E(?f'2a E(9?,E(9?,BBBB G!@>]#@>@>Y?`+K% @<9`+7w`+*A$`+`+ GH@>_b.A$ ?-rb.*K%a.*a.b. G;@>\?d._*/# s#d.~#.d. G@>Q.@>@>`Me.s#h,k r~#*(Er~#*w.~#*~#*(w~#w~# ~#~#~#*(~# c e.(Q..e.rQ.*'7%wQ.~#f ]<Af~# e. (' G@>@>@>bM]?N'P5*l'r~#*r~#*?cr~#~#~#> G@> |XbD I.AwI*7IH$IH$ G@>_?v" wG'*G'a G@> `??( wG'*G'a  G@>I}$Sx= wI*F.q}$% }$7IH$r}$IH$*r}$IH$AIH$}$&}$}$IH$ F.B&}$IH$F.}$IH$ }$wB&*H.au 9PB& H.*H.+QB& B& B&,H&B& # a G@>@>@>f?h.X%:'`W^5-9:Q#7!-6G2%9:Q# v#h.9?,h. G@>@>@> i?e?O&-&lg9:Q#7H--Y*-6P)&9:Q# v#g-6P)%9:Q# v#( G@>@>@>g?@>@> m?h?Q&(?&19:Q#79:Q#-a% G@>@>@>l?@>@>%@>@> p?j?f##%49:Q#7---Y* G@>@>@>c5}!@> l.n?f!$ne9:Q#7G--Y*6`)&9:Q# v#e6`)%9:Q# v# G@>@>@>r(@>@> cMx-G$>!#%x- 9? ({">7%(l(%l(7wl(*-m.'l( G$x-(l(E-m.('9:Q#fr(69Px- 9:Q# 5r(r(s!r(r( G@>@>@> [t?{"9:Q#7 G@>`5?(uwi**i*al9:9:$ x(ae5 9P_(af5  @ G@>k5@>@> t.MSqnwM$* r$P7M$K$r$&7M$K$r$&r$M$K$- ( G @>x?G){a, BrG)-w.*rG). G)a/!oG)-9:9:$M$^#%G)a9:9:$ w%*a%g5w..%*( 9?,9?,.% 9?, .%A(_(n5G) q!k# G@>~#@>@>z?@>@> y?s5B{ S3t5-19:9:$M$^# %t5_(s5q!k# G@>@>@>@>t#@>|?v5@ Qv5a G@>g#d@>@>@>?@6Q u9?&Kw%*a%g5h5d@6b? G@>mJ@>@>B@F@k#G@>f7wM$*M$@'?9?&o$ad5  @vw%*%a*%a((- (9:9:$ac5( G@>E@S@IwM$*M$^#-@_(9?& G@>D6\!@>R-d@>H@d@>K@\!@>L@\!@>M@\!@>N@\!@>O@\!@>P@@\!@>Q@\!@>R@\!@>S@\!@>T@\!@>U@\!@>W@@\!V@@>@>@>X@\!@>Y@\!@>Z@\!@>F6\!@>I@@>@>Jd@>\@d@>@>a$@>t.G@J0t.L6 G@>_@@&^#;@&&o@&7K$ew@&K$*@&K$.@@&K$ @&K$ _(@&@  _( G@>]@d@>`@@'G D6E6 G@>^X1W  G@>c@Q6[#8BwV*V_VQ6?wV*Vp  G@>h2dp%@>jL@>@>Z/@>@>sXA* G@>|j@~&E`jF44A*[( A*?A*[([([( [( G!@>[(@>@>g@@>@>@>@>a/d@>X(@>@>n@d@>o@d@>p@d@>@>@>q@d@>s@d@>t@@d@>w@q/|&" b5rq/*r6W#%S#*r6W#&S#* p-a69:6]$%S#,9:6]$&S#, F&9:6E+%S#@0E&9:6E+&S#@09:6]$%S#,9:6]$&S#%Z*E&9:6]$&S#,9:6]$%S#%Z*F&r9:6]$%S#,9:6]$%S#,F&b(F&^*E&b(E&?^*9:6]$&S#,9:6]$%S#,F&b(F&?^*E&b(E&^*Z*b'F&E& xq/66W#%S# $66W#%S# $66W#&S# $66W#&S# $Z* G@>x@G&w%j, rG&* <rG&6W#%S#a*%CF,~%G&mkrG&6W#&S#a*&CI,|%G&m 6E+a*S#9=9:G&,6]$a*S#G&  G@>y@b6e#Z4~-b6&%&&{w6W#&S#*6W#&S#TE6W#&S#B$D@>6W#&S#* G@>}@?J#qEF,D@>EI,D@>6W#%S#w6W#&S#6W#&S#w6W#%S#e#'e#( G @>}XCh_9:9:$89:t/&~&a {4G~&a f4_w~&*~&a* G@>@>@>Pd6Hd6%Nw* wj6Krw/* ww/S# ||w`**/a8`*k6{0 10@#? G@>~@V,f"CjyrV,* rW,*(rV,6W#%S#rW,6W#&S#,rV,6W#&S#rW,6W#%S# G@>BAg6}(='g66W#%S#e66W#&S# G@>@A@>@>j6@>@>@>@>FAs*d#-irs** rq**(c#s*'c#q*(s* iq*s*Tq*T' G@>SS#eA#`*a**o$- '-(* G@> CAD030-9:9:$ r*S# G@>DAI.@#? G@>m6y&c#}'-l6I(%EF,y&B$BI(&EI,y&B$Ey&B$Dw%6W#I(S#y&6E+I(S#y&6]$I(S#y&  G@>@>@>@>@>s&@>@>uLIA_$m,d(-sKt&q<(-sKt&s&Cws&*y%.s&,wy%*G9:y% ,9:y% ,9:y% ,!9:y% y%W9=0rt&*#9:t&9:y%t&s&s&s&3[rt&*t&_"*t& G@>_i%{? |w.ki%*Lri%*wi%Qyy9:9:$#zC9?,dw.i%*wi%.i%Wd Qi%-wi%Q G@>f%@>@>@>@>KAj#Q3D D 9?7&z*z*9?7& G@>NAPAm,W~ j# G@>@>@>OARAD-\ j# G@>@>@>QAk$r#d% !O*/a8 k$;Dwk$k$%k$Wd Br.k$*w.k$*.k$-'r.k$*.k$-Pt+k$ rO* t+K0Ok$K0t+10 G@>xI0M+G#f%Swf%*rf%*wf%f%P'I0f%.i f%-z,'f% E'I0'( G@>@>@>h'@>@>SAP$xT wO*wO*Ou&w.O*$.O@Of#OOZ& G@>WAF7H3 F7% wh+*wh+ wG7?r* rh+!h+WWQ G@>VA@>@>_AYA_"*h'wh'*n#.h'wn#*n#-99:n#9:n# % n#W9=9:n#-9:n# %9:n# ,L$%L$7n#9:L$n# ,$9:L$n# ,-r+(q+%q+7T%rq+T%L$n#-r+'q+-r+7T%T%L$n#L$ -o+Z#n#r*;-o+.-s+#9:9:n#D9:9:n#-s+-o+ ?n#-s+-o+h'h'w* Z#L$%L$7T%Z#L$T%qrl&*)9:l&9:L$T%79:l&9:L$T% ?l&L$T%L$wl&*l& G@>\A@>@>G7@>@>i'@>@>XAK7\+f K7-Q G@>@I7Z#\Li'Gwi'*0ri'I7'i'i' ( G@>dfAo$ G@> zDL. +w*r.*-( G @>~f'Y P$ G@>dAW0w"L)p#wp#*nrp#W0-P0'nwo'*p# w"o'g$p#nwg$*Wrg$*rg$o'w.g$*g$-Jb$o' o'#?g$ .g$A(g$F%$Cg$g$ip#p# -P0p#wp#*op#~ !Op#-br.p#*G.p#-v#9:.p# ,p# p#W0'mwo'*p# w"o' p#p# G@> eAh&s+% r* Dr|$* r.r |$*  .|$W9=7.r |$W9=S-6|$.r |$-'-(h&_"-6|$.r |$-(-'h&S-(-(h&_$wh&*wh& p#h&' G@> WMt't' t'wt'*i&.t'wi&*i&-l9:i& %!9:i&|$i&t't'r|$*Couldn't find PowerCore! G@>yM7nA##G @>M7Y7{#Y z+Y79?F0 G@>f0O+Z" qwO+*wO+*Q+.O+qwQ+*Q+#m"f0B#Q+w * Z"O+U7 G@>~gAjAn^7!o$ G@>@>@>ziA{'Sf!9:9:$ {'z+6{'h{'9?,r#_wO*q!Ofq!S  {'D F+9P{'6F+@6F+%a+F+a!` z* G@>rAk0SCCk0i0^7]7[7k0C&i0,a7$' G!@>@@>@>IkAK#a(-G(( G@>mA@>@>oA@>@>pA@>@>c7`7} 5`7,c7 G @>@,?j:w@,*@,B 1wA,*A,a G@>sAJ79:9:$@,a ~4A,a q099q0--_7'?--($ G@>tAg7n/@g7 G@>SJ,S 1DG,,J,,`GUI2K4.UT2K4GenericMessageBox i7G,,J,,`GUI2K4.UT2K4GenericMessageBox h7J,G,f7e7d7 G @>uAR,{4_VSwR,(R,a/!oR,-@o7#? G@>AP,SE P,x0l7j7w0}x0%P,C&!b&$'u0.{w0}u0D,y7P, u z7 G!@>\&@@>@>wAv7Q:*dv7b? G@>r7@>@>w7@$c5"9:w7%9=,$2$$ G@>{A@>@>x7i&~a,x7 #<-'9=,$0^VH8%-'9=,9=,^-( G@>G8|0}w\&.{r7V|0%ppppG89S\&D,F89U\&B4C8|0&\&I4\&3cKppA89U\&I4VL\&G4\&c>{cKcKpcK}7cKpppcK@89U\&G4VLz\&D4\&b>O{cKcKpcK}7cKpppcK~79U\&D4VL\&C4\&~3{cKcKpcK}7cKppcK9U\&C4{7cK G @>@>@>CBZ&S,zgbZ&,Z&,  Z&,&Z&, Z&, Z&, Z&,'( G @>@>@>TJ8E+J8,@9? G @>i@>@>p&@>@>HBi8K#mp&7Y#&hp&%:rp&Y#*AY#p&&^^p&Y#f"i8h8'p&( G@>o%@>@>JBo8X#͏o%7Y#&o%%:ro%Y#*AY#o%&||o%Y#f"o8m8o%Y#aAY#o%&'o%( G@>B-@>@>KBi1@"~VSK#i1h1(B-a e#B-d#i1h17Y#Y#B-' G@>db%d"m7% b%%y)%dy)7b%@"b%y)b%y)"b%b%m#rb%*rb%% G@>@@>@>@@>@>t)@@>MB@> ip8K*Xg%-p8 7D.%u) t)%^t)7D.7u)u)t)D.t),u) G @>@>@> RBs1H,6/ ~s1bAllowTrans( s1 G(@>SBN-b"-CI wN-*N- x1Fw*b"N-9Dx1 G@> UB%a1 .9: , t%H 0, G@>g)@>@> VBT-o- M T-r8-q8hrT-`g)%hg)7g)U"g)9h).T-wh)*h)u*h)[**'( G@> XB{1@)`) {1D({1LinkSetupV$ G@>y(*@> YB|1P,* |1'-G.aB6|1* G@>m{(W'I|W%%W%79:W% %9:W%`-W% W9=`-Dr[)*7{( W% @2[)W%@2{( W% W%yw[)*w{( b[)(*~1 `- a~1{( {(  G@>@>@>_%@>@> r{%X,EpgO6r{%*r{%* {%_%%@_%769:_% %9:_% ,(9:_%{%W|_%-v%r{%_%p9{% _% 9?'_%= {% G@>wB2u(9bQwB2*>B2%&GQ%Gmw*-'F'wF'*o$.F'wo$*o$- ~o$ro$ o$y 'o$ AMw*o$ ]o$  o$j w * -ro$ F'n F'F' G@>xl-z_V+l- 6w* zl-  %8%9? &9? m-l-teamscorelimit G@>@>@> bB|8u)9C 9:9:$(a"%G&G|8Current link setup is invalid: There is not a complete path between the PowerCores.zV$xV$*7%Q"Can't find a better link setup to load, so forcing a connection between the PowerCores.@"%G&GFL'%L'7w.L'*w.L'*.L' [%G&GL'X  G@>}p!/B-(- ( G@>@>@>M'@>@>@>@>hBQ'a"5 rQ'* rv-*(7u(u(Q'M'%M'7Q'lrM'Q'v-'-u-(^)%^)7u(r^)u(M'Q'-u-'^){-u-%a"M'Q'v-u('M'3( G!@>x8@9s!)@9)A9)B9 G@>G8Q"2i)77>i)%Using default Link Setupfi)& {V$xV$*k)i)k)7e)k)We)9Wk)7J2f{e)8 J2xe)* G@>Oj(`"*E$Tj(%Dj(7Y#:wj(Y#*j(Y#aj(AY#%7Y# G@>@>@>@>@>gBv)YXv)9=,9=,9=,v)3appbActive: 9T-ibCorrectAim: 9T-a%L2D9v)@L2v)apDebugInfo: G G@> ]Jd"  G@> qBo#B)` s o#-K2p-K2o# Z!!wo# Z!!~o# Z!!so# Z!!{o# Z!!Ao# Z!!vo# Z!!o# Z!!R&o# Z!!y%o# Z!!W&o# Z!!A%o# Z!!~$o# Z!!U&o# Z!!k&o# Z!!Q%o# Z!!u%o# Z!!s$ G @>@>@>JR2L'3 /,R2?V"R2 G@> sBM2o'Y$ (zM2GET OUT+ M2 G@>j$@>@> vBW2p'EB)V2+j$'wj$*w.j$*w.j$*wj$*1rj$W20B*B*j$ .j$m*B*j$ 'j$j$#' W2B*V2 G@>PuBM"2$N-e$-E9Ko9?%E-E-:-e$^!a-E^!y(P# G@>E9@>@>{BD+>Mf(ONS G@>@>@>yB@>@>@>@>O*G9^!#&\ r* W*.YwW**W*-W* ^!G9 G@> ~BU*q+1E_zU*(-|U*xGame.MutInstagib(P|U*xGame.MutZoomInstagib( U* G @>@>@>zBI9l"1(\ r* b*.Ywb**b*-b* l"I9 G@>@C|BQ+,' G @>@>@>_BR+'( G@>@@>@>@>e#@>_'@>@>^$@>@>DC@>@>N9K9k ^$.{K9w^$*^$-q3'^$-e*'^$-'^$H1N9^$J1M9^$j3L9^$-(^${3?^$~3?^$3@' G@>B(@@>@>@>@>\ G%\6#r*r*(_2 G% [_2G"(|bG%(wt*Q$Q$?tQ$Q$CQ$Q$G% BwC *Q$Q$?C Q$Q$CQ$Q$G% fT+5-\ d&a`2b2G% G%#L?T+'d&a`2b2T+Q$G% G%#L?T+'rd&* rd&G%r.d&*r.d&*.c .d&'( G@> o^2Q*b3 QB(%BB(,8|^29VB(J9VB(M B( ^2 G@>_2@>@>k@S@>LC@S@>MC@S@>PCa2B'6^;a2 m"?8w*B'a2P9 G@>TCU.U%.JU.m"B#U.Gw*U%U.Q9 G@>s'@>@>QC@>@>@>@>VCS9k$Ys'.S9Tws'*ws'*s'm"B#s'' G@>Y.@>@>WCl'B#rl'*?Ll' 9?&Y.>l' 9?&Y.>l' 9?&l' 9?&Y.?@@ G@>a+Jba+a s-a+f0ar*a+ W,a+ G@>ZCU9J'UCHEwU9U99?& G@>@>@>_Ci2_) gAwi2*w.*g.-v$r.pi2'ri2.r |$CL'( G@>@>@>zV.q!CUut1V.@9:V.% ww *%w w rr9:V.& wu *%u u  G@>@>@>\CN%I'oWa-A-v(. wv(*wv(*v(CZ%X'N%N%99I.v(?N%Z%:Z%X'N%N%99I.?N%Z%U299I.s)N%E U2x(.wx(*wx(*x(-(L&aZ%X's)N%'x(-'L&aZ%X's)N%'@wL&* wL&2L&-w.L&*r.L&*^Z%X'#=^Z%^Z%s)X'# G@>aCx*X%>wM.*w.*$r.pM..-vrM..r |$CLx*9?,-O9x*?{S. M. 9?S.a/!Y"S.-49?.9?.?x*9?,x*?x* G@>K.@>@> cCU&G) :MwU&*6rU&.r |$CLU&H=U& z<U&Need weapon or ammoU&C$'(1.r -sKr19:.s+-K. U&C-K. !MrU&*w.*.W9=U&pDisable Objective 9V ]U&CCU&bU&pHarass enemy at 9VfU&-K. G@>E.@>@>eCbCC#8bYx)/a9 E.XWwE.*x)x)E.10x) G@>c(@>@>gCz-@* 6'.r  j<z-(> &z-c(.rc(*9:c( ,"c(W9=z-V'wV'*wV'rV'c(z-V'V'( G@>y-@>@> jMb$}#f1{!Oqr*3 L% 9? b$L%9?%9?b$b$>wL%*L%E"y-b$i$y-9?%9b$-w.*b$-wL%*-r.pL%Sb$L% L%#?b$ w. Eb$9w.b$*.b$-Pub$ s#L%y-b$r<L%y- b$L% G@>H&@>@> lCR#A)w.R#*GR#R#9?,.R#-.R#f<{.R#m<iw*!9:w.*. e<R#R# \R# a<R#Artillery Attack Objective'wR#*'R#\R#R#a<R#R#Artillery Attack Enemy'kK%kK,wkK*wkKR#$R#\kKR#a<kKR#Artillery Attack Squad Enemy'kKq%wq%*oK.q%woK* oKW9=!9:oKoK e<R#R# \oKR# a<oKR#Artillery Attack Other Node'q%q%eK weK*weK*eK-$eK^<eKf< eK c R#R# \eKR# a<eKR#Artillery Attack important vehicle'eKeK xR#  .R# R# \.R#s<R#f#wR#*'R#\R#R#R#R#Z&R#w*i~ !}fw.*+.W9=9:$;r.R#* .R#-jJR#o;fwjJ*R#bQw.R#*R#  R# .R#A( ]R#w.R#*~ !O .R#-3R#  9?@ .R#-urR#*%R#9?,6.R#^<R#E"R#  R# .R#A((w r.R#*w.* 9:. % ~ !OQrR#*;R#E"%R#9?,2R#  C#)..wR#*'R# p&FwR# *'R# p&( 9:. , rR#*R#E"2R#  C#(w 9:. ,9:. &2R#  C#(  R#'d w.R#*&wR#*R#E"k19?,r.*r.R#*. n$R#)R#R#9?,(R#  9?R#bw.R#*.r.R#U#R#F29D?9?.R#wq%Hwq%*1wq%R#6.b.q%J).q% l$R#9=F21J)n-J)n- ?m-.q%n-J)q%q%W xwm-*.R# H m-k1(H&.ER#7rH&*9:H& %!9:H&3H& R# 9?(R#R# bH&(wR#*R#H&R#pNode teleport from 9VR#R#C$'( G@>@)@>@>@>@> pCT#fZfBT#-(bru#*u#bru#*T#No SquadObjective(w.&u#*C9:.&u# %&9:.u#T#*w.T#*;6T# 6u# 9?HT# u# .T#T#bu#.T#-(@).T#T# u# @) .T#A(r.T#*vw.a@)*@)9.a@)dL99@) @) 9:T#9:$T#p*6T# 'T#bu#!w.T#*.T#-(w.T#*;6T# 6u# 9?T# u# T# .T#A(T# k*u#u#dT#(<w@)*@)9?,T#u#%T#@*T#palmost at 9Vu#T#u#T#C$'w@)*@)^T# T#u#'=w.T#* .T#-(rT#*T#E"T#{"$.T#?.T#-'.T# 9?,T# u# T# .T#A(( G@>@>@>@>@>r%g V%X `V% w V% w V% w V% w V% w V% w V% w V% w V% w  G @>vCv8r$N.N#~ !} r*;E;Ev8   G@>oCQH w  w  w  w  w  w  w  w  w  G@>A(qCsCf+vvK.'rvK*$w.vK*8vK-vKa/!0!>=vK$$ G@>vK@>@>oW uCPH Z).gZC 'wZ)*w.*r#.wr#*&r#-r#a/!0)b$r#  Z) [#r#w,w8r# wr#*r#-r#a/!0 wr#!Wr#WF-r# 599pF-w,)b$r#  M-r#w,F-r#r# wM-*Z) [#M- G@>Z)@>@> xCb-u*A~(.~r~(*R9:~(-9:~( ,9:~( % b- wb-*b-R) G@>]%@>@>TP-t*%j~ !O]%.gw]%*!9:]%]%-v$!}]%.w]%*]%-lwP-*]% %P-$P- ]% 9?$$ G@> z,p!  -z,( G@>|Cp![*'*%-( G@>r%n&X {n& w n& w n& w n& w n& w n& w  G @>VI8h&P9&uQ(I8rQ(? b"Q(M%Q(heal_powernodeQ( G@>{CQ w  w  w  w  w  w  G@>R}CCJ#rG@>o@DP"o G@>@>@>Wn7f&C$Cy6I&n7 G@>@>@>r%]&f$Xtf$ w f$ w f$ w f$ w f$ w f$ w f$ w f$ w f$ w f$ w f$ w f$ w  G @>@>@>CDQ w  w  w  w  w  w  w  w  w  w  w  w  G@>EDR0  Q  G@>A(FDHDf6 $ G@>@>@>HGDJ; H]&99e  G@>IDL7LH L79:9:$ w*H)MK%6H)w.*6K%fff?^+%^+7h$.^+wh$*9:h$9:$wh$.Y$h$ 6H)6Y$Y$Y$6Y$6K%6Y$6]&26Y$6K%6Y$6]&6Y$6K%6Y$6]&26Y$6K%6Y$6]&h$o$h$ 6H)kK%]&6H)9?%h$ 9?h$ 9?h$ >K%6h$ HC^+]&K% G@>[O7a& C~6K&O7 G%@>bQ0r'm[+.7[+Y#%~ 6W#%Q0[+Y#S#6W#&Q0[+Y#S# G@>|V&n$!9:r/9:$-D'a@?' G%@>s$@>@>PNDU#;Kw.*w.*s$..rs$*s$..rs$*/. a3 ~)J0s$.J0ws$*10Fws$*9:s$ %!9:s$s$* G@>@@>@>r%OD%X D% w D% w D% w D% w D% w D% w D% w D% w D% w  G @>@@>@>QDQ3 w  w  w  w  w  w  w  w  w  G@>@>@>TD@>@>@>@>VD@>@>P7//============================================================================== // Created on: 01/30/2004 // Link between two power nodes // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PowerLink extends Info; struct LinkInfo { var ONSPowerCore Node; var byte Team, Stage; }; var LinkInfo Nodes[2]; var color LinkColor[3]; delegate UpdateNode0(ONSPowerCore Node); delegate UpdateNode1(ONSPowerCore Node); private function SetNode( ONSPowerCore Node, bool bZero ) { local int i; if ( bZero ) { i = 0; UpdateNode0 = Node.UpdateLinkState; } else { i = 1; UpdateNode1 = Node.UpdateLinkState; } Node.UpdateLinkState = UpdateNode; Nodes[i].Node = Node; Nodes[i].Team = Node.DefenderTeamIndex; Nodes[i].Stage = Node.CoreStage; } function bool SetNodes( ONSPowerCore A, ONSPowerCore B ) { if ( A == None || B == None ) return False; SetNode(A,true); SetNode(B,false); A.AddPowerLink(B); A.PowerCoreReset(); B.PowerCoreReset(); // log(Name@"Nodes are now "$A.Name@"and"@B.Name); return True; } function GetNodes( out ONSPowerCore A, out ONSPowerCore B ) { A = Nodes[0].Node; B = Nodes[1].Node; } function bool HasNodes( ONSPowerCore A, ONSPowerCore B ) { if ( A == None || B == None ) return false; return (A == Nodes[0].Node && B == Nodes[1].Node) || (A == Nodes[1].Node && B == Nodes[0].Node); } simulated event Destroyed() { Super.Destroyed(); UpdateNode0 = None; UpdateNode1 = None; Nodes[0].Node.RemovePowerLink(Nodes[1].Node); Nodes[1].Node.RemovePowerLink(Nodes[0].Node); ClearNode(true); ClearNode(false); } private function ClearNode( bool bZero ) { local int i; if ( bZero ) i = 0; else i = 1; if ( Nodes[i].Node != None ) { Nodes[i].Node.PowerCoreReset(); Nodes[i].Node.UpdateLinkState = None; Nodes[i].Node = None; } } function UpdateNode( ONSPowerCore Node ) { local int i; if ( Node == None ) return; // log(Name@"UpdateNode:"@Node.Name@"Team:"$Node.DefenderTeamIndex@"Stage:"$Node.CoreStage); if ( Node == Nodes[0].Node ) { i = 0; UpdateNode0(Node); } else if ( Node == Nodes[1].Node ) { i = 1; UpdateNode1(Node); } else return; Nodes[i].Team = Min(Node.DefenderTeamIndex,2); Nodes[i].Stage = Node.CoreStage; } function Render( Canvas C, float ColorPercent, bool bShowDisabledNodes ) { local color Color0, Color1, DrawColor; if ( C == None || Nodes[0].Node == None || Nodes[1].Node == None ) return; if ( !bShowDisabledNodes && Nodes[0].Stage == 255 || Nodes[1].Stage == 255 ) return; Color0 = LinkColor[Nodes[0].Team]; Color1 = LinkColor[Nodes[1].Team]; if ( Nodes[0].Stage == 4 && Nodes[1].Stage == 0 ) DrawColor = Color1; else if ( Nodes[1].Stage == 4 && Nodes[0].Stage == 0 ) DrawColor = Color0; else { if ( Nodes[0].Stage == 2 || Nodes[0].Stage == 5 ) { Color0 = Color0 * ColorPercent; Color1 = Color1 * (1.0 - ColorPercent); } else if ( Nodes[1].Stage == 2 || Nodes[0].Stage == 5 ) { Color0 = Color0 * (1.0 - ColorPercent); Color1 = Color1 * ColorPercent; } DrawColor = Color0 + Color1; } class'HUD'.static.StaticDrawCanvasLine(C, Nodes[0].Node.HUDLocation.X, Nodes[0].Node.HUDLocation.Y, Nodes[1].Node.HUDLocation.X, Nodes[1].Node.HUDLocation.Y, DrawColor); } @>P//----------------------------------------------------------- // //----------------------------------------------------------- class ONSWheeledVehicleExplosionEffect extends ONSVehicleExplosionEffect; #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" RYDI)@ZDapRL= 8YN#O#P#F9H9L#WJ@>@>yclass ONSWeaponAmbientEmitter extends Emitter abstract native; simulated event SetEmitterStatus(bool bEnabled); @>r%r6H%XH% w H% w H% w H% w H% w H% w H% w H% w H% w  G @>[ class ONSVehicleKillMessage extends LocalMessage; var localized string KillString[8]; var name KillSound[8]; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return Default.KillString[Min(Switch,7)]; } static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); P.PlayRewardAnnouncement(Default.KillSound[Min(Switch,7)],1,true); } @>\DQ w  w  w  w  w  w  w  w  w  G@>{)^DJ/V"- {)J/|&|&J/ G@>h//----------------------------------------------------------- // //----------------------------------------------------------- class ONSVehicleIonExplosionEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" @>A2_DbDA"4790-I%C+|&|&6 G@>@>@>@aD@/]>F l5%@/5K*ar6 @/q5K* }&K* n$p59:9:$K*]# G`DS)@dDQٓ 8Y XJYJZJ[J\J]JY5SX@>@>n//----------------------------------------------------------- // //----------------------------------------------------------- class ONSVehicleBuildEffect extends Emitter; function PostBeginPlay() { Super.PostBeginPlay(); if (Level.NetMode == NM_DedicatedServer) LifeSpan = 0.5; } @>]class ONSVehDeathRV extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" @>l5@>@>^class ONSVehDeathPRV extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" @>dclass ONSVehDeathHoverTank extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" @>JcDFK] )J&wW*W d G@>Y jDuDgG@>Y2P#U VS9:9:$ -I%-I%'C+SwW*Wp! G@>O*lD_5k` O*_5-\5/o9?%^!y(O9:9:$-I%(o9?%k-e$oPvoR c-e$aZ$[C v& ( G@>dclass ONSVehDeathHoverBike extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" @>fclass ONSVehDeathAttackCraft extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\StaticMeshes\ONSDeadVehicles-SM.usx" @>vmDqDk}<gd-I%C+-I%'AwW*Wp!--^6a|&( G@>@>@>pDSh-I%M6 G@>urDM5K -I% ^!y(*f;-a%pW"(}&C+|&_6?`9D9?`}&H 9D9?H }&D D }&z1@}&vM5oR -I%( G@>Kclass ONSTurretBeamEffect extends Emitter; simulated function SpawnEffects(vector HitLocation, vector HitNormal) { local rotator HitRotation; local PlayerController PC; local bool bFogDist; HitRotation = rotator(HitNormal); PC = Level.GetLocalPlayerController(); if ( !PC.BeyondViewDistance(HitLocation, 0) ) { bFogDist = true; Spawn(class'ShockImpactFlareB',,, HitLocation, HitRotation); Spawn(class'ShockExplosionCoreB',,, HitLocation+HitNormal*8, HitRotation); } if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 4000) ) { Emitters[2].Disabled = true; Emitters[3].Disabled = true; Emitters[4].Disabled = true; } if ( bFogDist && !PC.BeyondViewDistance(HitLocation, 4000) ) { Spawn(class'ShockImpactRingB',,, HitLocation, HitRotation); Spawn(class'ShockImpactScorch',,, HitLocation, rotator(-HitNormal)); } } @> sDq&(@=w*i wW*Wp! G@>e//for node teleporting class ONSTeleportPad extends Actor placeable; var array RedSkins, BlueSkins; function UsedBy(Pawn user) { if (Owner != None) Owner.UsedBy(user); } simulated function SetTeam(byte Team) { if (Team == 0) Skins = RedSkins; else if (Team == 1) Skins = BlueSkins; else Skins.length = 0; } @>r%hd$Xud$ w d$ w d$ w d$ w d$ w d$ w d$ w d$ w d$ w d$ w d$ w  G @>zclass ONSTankSecondaryTurretPawn extends ONSWeaponPawn; function AltFire(optional float F) { local PlayerController PC; PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = true; PC.ToggleZoom(); } function ClientVehicleCeaseFire(bool bWasAltFire) { local PlayerController PC; if (!bWasAltFire) { Super.ClientVehicleCeaseFire(bWasAltFire); return; } PC = PlayerController(Controller); if (PC == None) return; bWeaponIsAltFiring = false; PC.StopZoom(); } simulated function ClientKDriverLeave(PlayerController PC) { Super.ClientKDriverLeave(PC); bWeaponIsAltFiring = false; PC.EndZoom(); } function ShouldTargetMissile(Projectile P) { if ( Bot(Controller) != None && Bot(Controller).Skill >= 5.0 ) { if ( (Controller.Enemy != None) && Bot(Controller).EnemyVisible() && (Bot(Controller).Skill < 5) ) return; ShootMissile(P); } } @>wDQ w  w  w  w  w  w  w  w  w  w  w  G@>A(yD{Df0w{*.-pK.rpK*rpK*wpKpKpKE"$$$ G@>pK@>@>Z2zDn.W"=& >.-n. w{*9P{ 5Z2-n. G@>S(class ONSTankSecondaryTurret extends ONSWeapon; var class mTracerClass; var() editinline Emitter mTracer; var() float mTracerInterval; var() float mTracerPullback; var() float mTracerMinDistance; var() float mTracerSpeed; var float mLastTracerTime; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'VMparticleTextures.TankFiringP.CloudParticleOrangeBMPtex'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.TracerShot'); Super.UpdatePrecacheMaterials(); } function byte BestMode() { return 0; } simulated function Destroyed() { if (mTracer != None) mTracer.Destroy(); Super.Destroyed(); } simulated function UpdateTracer() { local vector SpawnDir, SpawnVel; local float hitDist; if (Level.NetMode == NM_DedicatedServer) return; if (mTracer == None) { mTracer = Spawn(mTracerClass); } if (Level.bDropDetail || Level.DetailMode == DM_Low) mTracerInterval = 2 * Default.mTracerInterval; else mTracerInterval = Default.mTracerInterval; if (mTracer != None && Level.TimeSeconds > mLastTracerTime + mTracerInterval) { mTracer.SetLocation(WeaponFireLocation); hitDist = VSize(LastHitLocation - WeaponFireLocation) - mTracerPullback; if (Instigator != None && Instigator.IsLocallyControlled()) SpawnDir = vector(WeaponFireRotation); else SpawnDir = Normal(LastHitLocation - WeaponFireLocation); if(hitDist > mTracerMinDistance) { SpawnVel = SpawnDir * mTracerSpeed; mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X; mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X; mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y; mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y; mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z; mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z; mTracer.Emitters[0].LifetimeRange.Min = hitDist / mTracerSpeed; mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min; mTracer.SpawnParticle(1); } mLastTracerTime = Level.TimeSeconds; } } simulated function FlashMuzzleFlash() { Super.FlashMuzzleFlash(); if (Role < ROLE_Authority) DualFireOffset *= -1; UpdateTracer(); } @>@>@>cwb  G@>GDAEkfE  G@>BE@>@>CE@>@>@>@>X//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankFireTrailEffect extends Emitter; #exec OBJ LOAD FILE=AS_FX_TX.utx @>A//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankBuildEffectRed extends ONSVehicleBuildEffect; @>B//----------------------------------------------------------- // //----------------------------------------------------------- class ONSTankBuildEffectBlue extends ONSVehicleBuildEffect; @>j//----------------------------------------------------------- // //----------------------------------------------------------- class ONSSmallVehicleExplosionEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" @>,class ONSSkyMineEffect extends Emitter; HE)@IE ޓ 8Y CIDIEIFI5S/$ #@>B)class ONSRVWebProjectileLeader extends ONSRVWebProjectile native nativereplication; var() float SpringLength; var() float SpringStiffness; var() float StuckSpringStiffness; //when a projectile in this web gets stuck, SpringStiffness is set to this var() float SpringDamping; var() float SpringMaxForce; var() float SpringExplodeLength; // Max stretch length before web explodes. var() float ProjVelDamping; // var() float ProjStuckNeighbourVelDamping; // Extra damping applied when a neighbour is attached to something. var() InterpCurve ProjGravityScale; // Function of time since launched. // To make the web stuff particularly effective against Mantas, it is sucked into the top of the fans. var() bool bEnableSuckTargetForce; var() bool bSymmetricSuckTarget; // Suck to SuckTargetOffset mirrored across Y as well (eg. for manta fans) var() bool bSuckFriendlyActor; // Don't get sucked towards actors on own team. var() bool bNoSuckFromBelow; // If the projectile is 'below' the suck target (ie. negative local Z) it won't get sucked. var() bool bOnlySuckToDriven; // Only suck to an actor if bDriving is true. var() array< class > SuckTargetClasses; // Class of actors that projectile should get sucked towards. var() float SuckTargetRange; // Distance from SuckTarget before projectile starts getting sucked. var() float SuckTargetForce; // Force applied to suck projectile towards target. var() vector SuckTargetOffset; // Location in target ref frame that projectile will be sucked too var() float SuckReduceVelFactor; // Once a particle is getting sucked, how much to kill velocity that is not in the suck direction. var byte ProjTeam; var float FireTime; var array Projectiles; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) replication { reliable if (bNetInitial && Role == ROLE_Authority) ProjTeam; } simulated function PostBeginPlay() { Super.PostBeginPlay(); FireTime = Level.TimeSeconds; } // Walk over entire web, detonating projectiles. Only called on server. event DetonateWeb() { local int i; // We want to destroy ourself last! for(i=1; igclass ONSRVWebProjectileEffect extends Emitter; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx #exec OBJ LOAD FILE=..\Textures\EpicParticles.utx @>PGclass ONSRVWebProjectile extends Projectile native nativereplication; var class ProjectileEffectClass; // Assumes Emitter 0 is the beam to next projectile. var Emitter ProjectileEffect; var ONSRVWebProjectileLeader Leader; var int ProjNumber; var float LastTickTime; var bool bBeingSucked; var Actor StuckActor; var vector StuckNormal; var() int BeamSubEmitterIndex; // Emitter index of BeamEmitter than connects projectiles. var() float ExplodeDelay; var() sound StuckSound; var() class ExplodeEffect; var() sound ExplodeSound; var() class ExtraDamageClass; // If we stick to this class, do more damage. var() float ExtraDamageMultiplier; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) replication { reliable if (bNetInitial && Role == ROLE_Authority) Leader, ProjNumber; } simulated function Destroyed() { if (ProjectileEffect != None) ProjectileEffect.Destroy(); if ( Level.NetMode != NM_DedicatedServer && EffectIsRelevant(Location, false) ) { Spawn(ExplodeEffect,,, Location, rotator(StuckNormal)); PlaySound(ExplodeSound,,2.5*TransientSoundVolume); } Super.Destroyed(); } simulated function PostBeginPlay() { Super.PostBeginPlay(); Velocity = Speed * Vector(Rotation); if (Level.NetMode != NM_DedicatedServer) { ProjectileEffect = spawn(ProjectileEffectClass, self,, Location, Rotation); ProjectileEffect.SetBase(self); } // On client - add this projectile in next free slot leaders list of projectiles. if( Role < ROLE_Authority ) { if(Leader != None && ProjNumber != -1) { if(Leader.Projectiles.Length < ProjNumber + 1) Leader.Projectiles.Length = ProjNumber + 1; Leader.Projectiles[ ProjNumber ] = self; } else { bNetNotify = true; // We'll need the PostNetReceive to add this projectile to its leader. } } } simulated event PostNetReceive() { if( Leader != None && ProjNumber != -1 ) { if(Leader.Projectiles.Length < ProjNumber + 1) Leader.Projectiles.Length = ProjNumber + 1; Leader.Projectiles[ ProjNumber ] = self; bNetNotify = false; // Don't need PostNetReceive any more. } } simulated function ProcessTouch(actor Other, vector HitLocation) { //Don't hit the player that fired me if (Other == Instigator || (Vehicle(Instigator) != None && Other == Vehicle(Instigator).Driver)) return; // If we hit some stuff - just blow up straight away. if( Other.IsA('Projectile') || Other.bBlockProjectiles ) { if(Role == ROLE_Authority) Leader.DetonateWeb(); } else { StuckActor = Other; if ( (Level.NetMode != NM_Client) && (StuckActor != None) && ClassIsChildOf(StuckActor.Class, ExtraDamageClass) && (Bot(Pawn(StuckActor).Controller) != None) && (Level.Game.GameDifficulty > 4 + 2 * FRand()) ) { //about to blow up, so bot will bail Vehicle(StuckActor).VehicleLostTime = Level.TimeSeconds + 10; Vehicle(StuckActor).KDriverLeave(false); } StuckNormal = normal(HitLocation - Other.Location); GotoState('Stuck'); } } simulated function HitWall(vector HitNormal, Actor Wall) { if (Wall.bBlockProjectiles) { if (Role == ROLE_Authority) Leader.DetonateWeb(); return; } StuckActor = Wall; StuckNormal = HitNormal; GoToState('Stuck'); } // Server-side only function Explode(vector HitLocation, vector HitNormal) { BlowUp(HitLocation); Destroy(); } function BlowUp(vector HitLocation) { NetUpdateTime = Level.TimeSeconds - 1; if (StuckActor != None && ClassIsChildOf(StuckActor.Class, ExtraDamageClass)) Damage *= ExtraDamageMultiplier; HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation); MakeNoise(1.0); } state Stuck { simulated function BeginState() { if (Leader != None) Leader.NotifyStuck(); NetPriority = 1.5; NetUpdateTime = Level.TimeSeconds - 1; SetPhysics(PHYS_None); PlaySound(StuckSound,,2.5*TransientSoundVolume); if (StuckActor != None) { LastTouched = StuckActor; SetBase(StuckActor); } SetCollision(false, false); bCollideWorld = false; if (Role == ROLE_Authority) SetTimer(ExplodeDelay, false); } function Timer() { // Should only happen on Authority, where Leader should always be valid. if ( Leader != None ) Leader.DetonateWeb(); else Explode(Location,StuckNormal); NetUpdateTime = Level.TimeSeconds - 1; } } @>7class ONSRVWebLauncherMuzzleFlash extends Emitter; @>bP//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVWebLauncher extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSWeapons-A.ukx var() float SpreadAngle; // Angle between initial shots, in radians. var() float InheritVelocityScale; // Amount of vehicles velocity var() float MinProjectiles, MaxProjectiles, MaxHoldTime; var float StartHoldTime; var bool bHoldingFire; var sound ChargeUpSound, ChargeLoop; static function StaticPrecache(LevelInfo L) { L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.PowerBolt'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanels'); L.AddPrecacheMaterial(Material'EpicParticles.Beams.HotBolt03aw'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot'); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.PowerBolt'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanels'); Level.AddPrecacheMaterial(Material'EpicParticles.Beams.HotBolt03aw'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.HardSpot'); Super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'AW-2004Particles.Weapons.ONSMuzzleFlash'); Super.UpdatePrecacheStaticMeshes(); } simulated function SetFireRateModifier(float Modifier) { Super.SetFireRateModifier(Modifier); MaxHoldTime = default.MaxHoldTime / Modifier; } function byte BestMode() { return 0; } simulated function float MaxRange() { AimTraceRange = 6000; return AimTraceRange; } simulated function float ChargeBar() { if (bHoldingFire) return (FMin(Level.TimeSeconds - StartHoldTime, MaxHoldTime) / MaxHoldTime); else return 0; } state ProjectileFireMode { simulated function OwnerEffects() { if (Role < ROLE_Authority && !bHoldingFire && !bIsAltFire) { bHoldingFire = true; StartHoldTime = Level.TimeSeconds; } } simulated function ClientStopFire(Controller C, bool bWasAltFire) { Super.ClientStopFire(C, bWasAltFire); if (FireCountdown <= 0) { ClientPlayForceFeedback("BioRifleFire"); ShakeView(); } if (Role < ROLE_Authority) { bHoldingFire = false; if (FireCountdown <= 0) { //FIXME make sounds clientside as well! if (bIsAltFire) FireCountdown = AltFireInterval; else FireCountdown = FireInterval; FlashMuzzleFlash(); if (!bIsAltFire) PlaySound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius,, false); } } } function Fire(Controller C) { if (!bHoldingFire) { StartHoldTime = Level.TimeSeconds; bHoldingFire = true; AmbientSound = ChargeUpSound; SetTimer(MaxHoldTime, False); } } function Timer() { if (bHoldingFire) AmbientSound = ChargeLoop; } function CeaseFire(Controller C) { local vector GunDir, RightDir, FireDir; local int i, NumProjectiles; local float SpreadAngleRad, FireAngleRad; // Radians local ONSRVWebProjectileLeader Leader; local ONSRVWebProjectile P; if (!bHoldingFire) return; ClientPlayForceFeedback("BioRifleFire"); AmbientSound = None; CalcWeaponFire(); if (bCorrectAim) WeaponFireRotation = AdjustAim(false); // Defines plane in which projectiles will start travelling in. GunDir = vector(WeaponFireRotation); RightDir = normal( GunDir Cross vect(0,0,1) ); NumProjectiles = MinProjectiles + (MaxProjectiles - MinProjectiles) * (FMin(Level.TimeSeconds - StartHoldTime, MaxHoldTime) / MaxHoldTime); bHoldingFire = false; SpreadAngleRad = SpreadAngle * (Pi/180.0); // Spawn all the projectiles for(i=0; i{//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVRightBladeBreakOffEffect extends Emitter; @>z//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVLeftBladeBreakOffEffect extends Emitter; @>r%j4V+X7SV+ w V+ w V+ w V+ w  G @>//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVBuildEffectRed extends ONSVehicleBuildEffect; @>QEQY w  w  w  w  G@>SER#! Q  G@>{)TEa0V") {)a0R&R&a0 G@>@//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRVBuildEffectBlue extends ONSVehicleBuildEffect; @>A(UEXEf0V$ G@>@>@>R9WEZEG"5u&Eu& G@>@>@>A2YE\EA"<90-X%W+R&R&6 G@>@>@>R[EeEJG@>Y2P#FIF9:9:$ -X% -e$-X%'W+ G@>O*^EL4kOO*L4-s38o9?%^!BioRifleFireO9:9:$-X%(o9?%t-e$oPoR c-e$aZ$[C v& ( G@>m//----------------------------------------------------------- // //----------------------------------------------------------- class ONSRocketScorch extends XScorch; @>O//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPurplePlasmaSmallFireEffect extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 5000) ) Emitters[2].Disabled = true; } @>C _EcEkl >;-X%W+-X%'Y4aR&( G@>@>@>bESw -X%S4 G@>udE`3K  -X% ^!BioRifleFire*fD-a%pW"(o,99pg1o,#?_)9D}/e4}/W+R&R&-X%(f-j4I@4C_&%_&_)p-f-9?_)&9?_&f-D-ռp-o,ջp-g1_&%R$a b# 59PD-wR$*R$ i4 7R$K$_)R$F69=`3W%R$K$R$R$r$%R$M$R$ua(a a$ 59PD-uwa(* wR$*_&R$K$a(a(r$_&a(M$R$_&Oc-GZZ$[C v& (oR  G@>4class ONSPRVSideGunMuzzleFlash extends Emitter; @>/class ONSPRVRearGunCharge extends Emitter; @>-class ONSPRVComboEffect extends Emitter; @>@//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVBuildEffectRed extends ONSVehicleBuildEffect; @>A//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPRVBuildEffectBlue extends ONSVehicleBuildEffect; @>~//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreEnergyRed extends ONSPowerCoreEnergy; @>//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreEnergyBlue extends ONSPowerCoreEnergy; @>|//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPowerCoreEnergy extends Actor abstract; @>//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPlasmaHitPurple extends Emitter; simulated function PostNetBeginPlay() { local PlayerController PC; local float MaxDist; Super.PostNetBeginPlay(); PC = Level.GetLocalPlayerController(); if ( (Instigator == None) || (PC.Pawn != Instigator) ) MaxDist = 2000; else MaxDist = 3000; if ( (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > MaxDist) ) Emitters[2].Disabled = true; } @>J//----------------------------------------------------------- // //----------------------------------------------------------- class ONSPCTeleportTrigger extends Triggers; function UsedBy(Pawn user) { if (Owner != None) Owner.UsedBy(user); } function Touch(Actor Other) { local Pawn P; //hack so bots realize they're close enough for node teleporting P = Pawn(Other); if (P != None && AIController(P.Controller) != None && P.Controller.RouteGoal == Owner) P.Controller.MoveTimer = -1; } @>o//----------------------------------------------------------- // //----------------------------------------------------------- class ONSNodeHealEffect extends Emitter; @>j//----------------------------------------------------------- // //----------------------------------------------------------- class ONSNodeBeamRedEffect extends Emitter; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx @>s//----------------------------------------------------------- // //----------------------------------------------------------- class ONSNodeBeamBlueEffect extends Emitter; @>bclass ONSMineLayerTargetBeamEffect extends Emitter; var bool bCancel; var vector EffectOffset; var vector EndEffect; replication { reliable if (bNetDirty && Role == ROLE_Authority) bCancel, EndEffect; } function SetInitialState() { Super.SetInitialState(); if (Level.NetMode == NM_DedicatedServer) disable('Tick'); } simulated function Cancel() { bCancel = true; bTearOff = true; BeamEmitter(Emitters[0]).FadeOut = true; BeamEmitter(Emitters[0]).LifeTimeRange.Min = 1.25; BeamEmitter(Emitters[0]).LifeTimeRange.Max = 1.25; SetTimer(0.5, false); } //delayed to make sure the fading beam is spawned before we turn it off simulated function Timer() { if (Level.NetMode != NM_DedicatedServer) BeamEmitter(Emitters[0]).RespawnDeadParticles = false; else Destroy(); } simulated function Tick(float deltaTime) { local vector StartTrace, X, Y, Z; local float Dist; if (bCancel) { Cancel(); disable('Tick'); return; } if (Instigator == None) return; if (Instigator.IsFirstPerson()) { Instigator.Weapon.GetViewAxes(X, Y, Z); if (Instigator.Weapon.WeaponCentered()) StartTrace = Instigator.Location; else StartTrace = Instigator.Location + Instigator.CalcDrawOffset(Instigator.Weapon) + EffectOffset.X * X + Instigator.Weapon.Hand * EffectOffset.Y * Y + EffectOffset.Z * Z; } else if (xPawn(Instigator) != None && xPawn(Instigator).WeaponAttachment != None) StartTrace = xPawn(Instigator).WeaponAttachment.GetTipLocation(); else StartTrace = Instigator.Location + Instigator.EyeHeight * Vect(0,0,1) + Normal(vector(Rotation)) * 25.0; SetLocation(StartTrace); SetRotation(rotator(EndEffect - StartTrace)); Dist = VSize(EndEffect - StartTrace); BeamEmitter(Emitters[0]).BeamDistanceRange.Min = Dist; BeamEmitter(Emitters[0]).BeamDistanceRange.Max = Dist; } @>Sclass ONSMineLayerAltFire extends WeaponFire; var ONSMineLayerTargetBeamEffect Beam; var vector EffectOffset; var ONSMineLayer Gun; var float TraceRange; var bool bDoHit; function PostBeginPlay() { Super.PostBeginPlay(); Gun = ONSMineLayer(Weapon); } function DestroyEffects() { if (Beam != None) Beam.Destroy(); Super.DestroyEffects(); } simulated function bool AllowFire() { return true; } function ModeHoldFire() { if (Weapon.Role == ROLE_Authority) { SetTimer(0.5, true); bDoHit = true; } } function PlayFiring() {} function StopFiring() { if (Weapon.Role == ROLE_Authority) { if (Beam != None) Beam.Cancel(); SetTimer(0, false); } } function Timer() { bDoHit = true; } simulated function ModeTick(float deltaTime) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X, Y, Z; local rotator Aim; local Actor Other; local int i; if (!bIsFiring) return; Weapon.GetViewAxes(X,Y,Z); // the to-hit trace always starts right in front of the eye StartTrace = Instigator.Location + Instigator.EyePosition() + X*Instigator.CollisionRadius; Aim = AdjustAim(StartTrace, AimError); X = Vector(Aim); EndTrace = StartTrace + TraceRange * X; Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, false); if (Other == None || Other == Instigator) HitLocation = EndTrace; if (Beam == None) { if (Weapon.Role == ROLE_Authority) Beam = Weapon.spawn(class'ONSMineLayerTargetBeamEffect',,, Instigator.Location); else foreach Weapon.DynamicActors(class'ONSMineLayerTargetBeamEffect', Beam) break; } if (Beam != None) Beam.EndEffect = HitLocation; if (bDoHit) for (i = 0; i < Gun.Mines.Length; i++) { if (Gun.Mines[i] == None) { Gun.Mines.Remove(i, 1); i--; } else if (ONSMineProjectile(Gun.Mines[i]) != None) ONSMineProjectile(Gun.Mines[i]).SetScurryTarget(HitLocation); } } @>w//----------------------------------------------------------- // //----------------------------------------------------------- class ONSManualGunOverlay extends ONSHUDOverlay; @>k$class ONSImpactSparks extends Emitter native; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx #exec OBJ LOAD FILE=..\Sounds\ONSVehicleSounds-S.uax var() float HorizontalVelocityRange; var() float AdditionalVelocityScale; var() float MaxAdditionalVelocity; var() float SparkRadiusScale; var() interpcurve SparkRate; // function of sliding velocity magnitude. var() sound ScrapeSound; var bool bSparksActive; simulated event UpdateSparks(float SparkRadius, vector VehicleVelocity) { local float UseRadius, VelMag, ParticleRate; local vector LocalVehVel, AddVel; // Use function to figure out how many particles we should be spewing. VelMag = VSize(VehicleVelocity); ParticleRate = InterpCurveEval(SparkRate, VelMag); if(ParticleRate > 0.001) { // Transform velocity into particle system space and project into contact plane. LocalVehVel = (VehicleVelocity << Rotation); LocalVehVel.X = 0; // If sparks are just turning on, set OldLocation to current Location to avoid spawn interpolation. if(!bSparksActive) OldLocation = Location; bSparksActive = true; UseRadius = SparkRadiusScale * SparkRadius; Emitters[0].ParticlesPerSecond = ParticleRate; Emitters[0].InitialParticlesPerSecond = ParticleRate; Emitters[0].AllParticlesDead = false; Emitters[0].StartLocationRange.Y.Min = -UseRadius; Emitters[0].StartLocationRange.Y.Max = UseRadius; Emitters[0].StartLocationRange.Z.Min = -UseRadius; Emitters[0].StartLocationRange.Z.Max = UseRadius; // Add velocity of vehicle to sparks. AddVel = AdditionalVelocityScale * LocalVehVel; if( VSize(AddVel) > MaxAdditionalVelocity ) { AddVel = normal(AddVel) * MaxAdditionalVelocity; } Emitters[0].StartVelocityRange.Y.Min = (LocalVehVel.Y + AddVel.Y) - HorizontalVelocityRange; Emitters[0].StartVelocityRange.Y.Max = (LocalVehVel.Y + AddVel.Y) + HorizontalVelocityRange; Emitters[0].StartVelocityRange.Z.Min = (LocalVehVel.Z + AddVel.Z) - HorizontalVelocityRange; Emitters[0].StartVelocityRange.Z.Max = (LocalVehVel.Z + AddVel.Z) + HorizontalVelocityRange; AmbientSound = ScrapeSound; } else { bSparksActive = false; Emitters[0].ParticlesPerSecond = 0; Emitters[0].InitialParticlesPerSecond = 0; AmbientSound = None; } } @>r%A3C2X a+C2 w C2 w  G @>w//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHUDOverlay extends Actor abstract; @>wEQB1 w  w  G@>A(yE{Ef<$ G@>@>@>yzE? p w#*#ay G@>|E_-P&+9:9:$ 4r#*#aA3v-9:9:$|'@|'|'|'w#*E2|'#a 5H-^5C3w*i_-99p_-^5H-D3K&_-P266%#6K&66%#6K&66%#6K&66%#6K&66%#6K&66%#6K&6%#H-P26%#6%##T)&E2 G@>t//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikeJumpEffect extends Emitter; @>Vclass ONSHoverBikeHoverDust extends Emitter; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx var bool bDustActive; simulated function SetDustColor(color DustColor) { local color DustColorZeroAlpha, BlackColor; // Ignore if dust color if black. if(DustColor.R == 0 && DustColor.G == 0 && DustColor.B == 0) { DustColor.R=128; DustColor.G=100; DustColor.B=64; } // return; DustColor.A = 255; DustColorZeroAlpha = DustColor; DustColorZeroAlpha.A = 0; BlackColor.R = 0; BlackColor.G = 0; BlackColor.B = 0; BlackColor.A = 0; Emitters[0].ColorScale[0].Color = DustColorZeroAlpha; Emitters[0].ColorScale[1].Color = DustColor; Emitters[0].ColorScale[2].Color = DustColor; Emitters[0].ColorScale[3].Color = DustColorZeroAlpha; Emitters[1].ColorScale[0].Color = BlackColor; Emitters[1].ColorScale[1].Color = DustColor; Emitters[1].ColorScale[2].Color = DustColor; Emitters[1].ColorScale[3].Color = BlackColor; } simulated function UpdateHoverDust(bool bActive, float HoverHeight) { local float Force; Force = 1 - HoverHeight; if(!bActive) { Emitters[0].ParticlesPerSecond = 0; Emitters[0].InitialParticlesPerSecond = 0; Emitters[1].Disabled = true; return; } else { Emitters[0].ParticlesPerSecond = 100; Emitters[0].InitialParticlesPerSecond = 100; Emitters[0].AllParticlesDead = false; Emitters[1].Disabled = (Level.DetailMode == DM_Low); } // Dust Emitters[0].StartVelocityRadialRange.Min = -650 + (Force * -100); Emitters[0].StartVelocityRadialRange.Max = Emitters[0].StartVelocityRadialRange.Min - 100; Emitters[0].StartLocationPolarRange.Z.Min = 10 + (HoverHeight * 30); Emitters[0].StartLocationPolarRange.Z.Max = Emitters[0].StartLocationPolarRange.Z.Min; // Rings Emitters[1].StartSizeRange.X.Min = 30 + (HoverHeight * 40); Emitters[1].StartSizeRange.X.Max = Emitters[1].StartSizeRange.X.Min + 20; Emitters[1].Opacity = FClamp(2.5 * Force, 0, 0.8); } @>t//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikeDuckEffect extends Emitter; @>w}EcZ -w$9:9:${9?P& G@>F//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikeBuildEffectRed extends ONSVehicleBuildEffect; @>G//----------------------------------------------------------- // //----------------------------------------------------------- class ONSHoverBikeBuildEffectBlue extends ONSVehicleBuildEffect; @>bclass ONSHeadlightCorona extends Light native; simulated function ChangeTeamTint(byte T) { if(T == 0) { LightHue = 255; LightSaturation=240; } else { LightHue = 128; LightSaturation=175; } } @>/class ONSGrenadeBeaconRed extends Emitter; @>]3B/q!@b09?,=9:B/,%9:B/]3 G@>0class ONSGrenadeBeaconBlue extends Emitter; @>GFp*H5p*% r@+*9:@+9:$ Hp*@+[5i5j5D'.@+ wD'*b0D' u K1 wD'B0S+p*B0D'S+p* S+,D' u K1S+, G@>r)class ONSDaredevilMessage extends LocalMessage; #exec OBJ LOAD FILE="..\Sounds\announcermale2k4.uax" #exec OBJ LOAD FILE="..\Sounds\ONSVehicleSounds-S.uax" var localized String StuntInfoString1; var localized String StuntInfoString2; var localized String StuntInfoString3; var localized String StuntInfoString4; var localized String StuntInfoString5; var localized String StuntInfoString6; var localized String StuntInfoString7; var localized String StuntInfoString8; var localized String StuntDegrees; var sound CheerSound; var int CheerPointThresh; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local ONSWheeledCraft Car; local string ResultString; Car = ONSWheeledCraft(OptionalObject); if(SwitchNum == 0) return Default.StuntInfoString1$Car.DaredevilPoints$Default.StuntInfoString2$Car.InAirDistance$Default.StuntInfoString3; else if(SwitchNum == 1) { if ( Car.InAirSpin >= Car.DaredevilThreshInAirSpin ) ResultString = Default.StuntInfoString4$Car.InAirSpin$Default.StuntDegrees; if ( Car.InAirPitch >= Car.DaredevilThreshInAirPitch ) { if ( ResultString != "" ) ResultString = ResultString$Default.StuntInfoString7; ResultString = ResultString$Default.StuntInfoString5$Car.InAirPitch$Default.StuntDegrees; } if ( Car.InAirRoll >= Car.DaredevilThreshInAirRoll ) { if ( ResultString != "" ) ResultString = ResultString$Default.StuntInfoString7; ResultString = ResultString$Default.StuntInfoString6$Car.InAirRoll$Default.StuntDegrees; } if ( Car.InAirTime >= Car.DaredevilThreshInAirTime ) { if ( ResultString != "" ) ResultString = ResultString$Default.StuntInfoString7; ResultString = ResultString$Car.InAirTime$Default.StuntInfoString8; } return ResultString; } } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local ONSWheeledCraft Car; Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); if(SwitchNum == 0) { P.PlayRewardAnnouncement('DareDevil', 1, true); // If we got enough points - add a cheer as well! Car = ONSWheeledCraft(OptionalObject); if(Car.DaredevilPoints >= Default.CheerPointThresh) P.ClientPlaySound(Default.CheerSound); } } @>s2class ONSDamagedEffect extends Emitter native; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx #exec OBJ LOAD FILE=..\Textures\EpicParticles.utx simulated function PostBeginPlay() { local ONSVehicle V; Super.PostBeginPlay(); V = ONSVehicle(Owner); if (V != None) { SetEffectScale(V.DamagedEffectScale); UpdateDamagedEffect(false, 0); } } simulated function SetEffectScale(float Scaling) { Emitters[0].SizeScale[0].RelativeSize = Scaling * default.Emitters[0].SizeScale[0].RelativeSize; Emitters[0].SizeScale[1].RelativeSize = Scaling * default.Emitters[0].SizeScale[1].RelativeSize; Emitters[1].SizeScale[0].RelativeSize = Scaling * default.Emitters[1].SizeScale[0].RelativeSize; Emitters[1].SizeScale[1].RelativeSize = Scaling * default.Emitters[1].SizeScale[1].RelativeSize; Emitters[1].SizeScale[2].RelativeSize = Scaling * default.Emitters[1].SizeScale[2].RelativeSize; Emitters[1].StartLocationRange.X.Min = Scaling * default.Emitters[1].StartLocationRange.X.Min; Emitters[1].StartLocationRange.X.Max = Scaling * default.Emitters[1].StartLocationRange.X.Max; Emitters[1].StartLocationRange.Y.Min = Scaling * default.Emitters[1].StartLocationRange.Y.Min; Emitters[1].StartLocationRange.Y.Max = Scaling * default.Emitters[1].StartLocationRange.Y.Max; Emitters[2].StartSizeRange.X.Min = Scaling * default.Emitters[2].StartSizeRange.X.Min; Emitters[2].StartSizeRange.X.Max = Scaling * default.Emitters[2].StartSizeRange.X.Max; Emitters[2].StartSizeRange.Y.Min = Scaling * default.Emitters[2].StartSizeRange.Y.Min; Emitters[2].StartSizeRange.Y.Max = Scaling * default.Emitters[2].StartSizeRange.Y.Max; Emitters[2].StartLocationRange.X.Min = Scaling * default.Emitters[2].StartLocationRange.X.Min; Emitters[2].StartLocationRange.X.Max = Scaling * default.Emitters[2].StartLocationRange.X.Max; Emitters[2].StartLocationRange.Y.Min = Scaling * default.Emitters[2].StartLocationRange.Y.Min; Emitters[2].StartLocationRange.Y.Max = Scaling * default.Emitters[2].StartLocationRange.Y.Max; } //Called from ONSVehicle native code when significant changes in vehicle's health or velocity occur simulated event UpdateDamagedEffect(bool bFlame, float VelMag) { local float SmokeLifeScale; if(bFlame) { Emitters[1].ParticlesPerSecond = default.Emitters[1].ParticlesPerSecond; Emitters[1].InitialParticlesPerSecond = default.Emitters[1].InitialParticlesPerSecond; Emitters[1].AllParticlesDead = false; Emitters[2].ParticlesPerSecond = default.Emitters[2].ParticlesPerSecond; Emitters[2].InitialParticlesPerSecond = default.Emitters[2].InitialParticlesPerSecond; Emitters[2].AllParticlesDead = false; } else { Emitters[1].ParticlesPerSecond = 0; Emitters[1].InitialParticlesPerSecond = 0; Emitters[2].ParticlesPerSecond = 0; Emitters[2].InitialParticlesPerSecond = 0; } SmokeLifeScale = 1.0 - ( 0.55 * ((VelMag-500)/2000) ); SmokeLifeScale = FClamp(SmokeLifeScale, 0.45, 1.0); Emitters[0].InitialParticlesPerSecond = 7.5/SmokeLifeScale; Emitters[0].ParticlesPerSecond = 7.5/SmokeLifeScale; Emitters[0].LifetimeRange.Min = 2.0 * SmokeLifeScale; Emitters[0].LifetimeRange.Max = 2.0 * SmokeLifeScale; } @>/class ONSCrosshairs extends CrosshairPack; LFE,2MFe QO Y,YCb= Circle (3)I@>b= Circle (4)I@>b= Circle (5)I@>@>@>lclass ONSChargeBeamEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" var vector HitLocation; replication { reliable if (bNetInitial && Role == ROLE_Authority) HitLocation; } function PostBeginPlay() { Super.PostBeginPlay(); if (Level.NetMode == NM_DedicatedServer) LifeSpan = 1.0; } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if (Role < ROLE_Authority) SetupBeam(); } simulated function SetupBeam() { local BeamEmitter.ParticleBeamEndPoint End; local int x; local float Dist; local PlayerController PC; PC = Level.GetLocalPlayerController(); if ( (PC != None) && !PC.BeyondViewDistance(HitLocation, 0) ) SpawnEffects(HitLocation, Normal(HitLocation - Location)); End.Offset.X.Min = HitLocation.X; End.Offset.X.Max = HitLocation.X; End.Offset.Y.Min = HitLocation.Y; End.Offset.Y.Max = HitLocation.Y; End.Offset.Z.Min = HitLocation.Z; End.Offset.Z.Max = HitLocation.Z; Dist = VSize(HitLocation - Location); for (x = 0; x < 4; x++) { BeamEmitter(Emitters[x]).BeamDistanceRange.Min = Dist; BeamEmitter(Emitters[x]).BeamDistanceRange.Max = Dist; Emitters[x].StartSizeRange.X.Min *= DrawScale; Emitters[x].StartSizeRange.Y.Min *= DrawScale; Emitters[x].StartSizeRange.X.Max *= DrawScale; Emitters[x].StartSizeRange.Y.Max *= DrawScale; Emitters[x].LifetimeRange.Min *= DrawScale; Emitters[x].LifetimeRange.Max *= DrawScale; BeamEmitter(Emitters[x]).BeamEndPoints[0] = End; } } simulated function SpawnEffects(vector HitLocation, vector HitNormal) { local rotator HitRotation; HitRotation = rotator(HitNormal); Spawn(class'ShockImpactFlareB',,, HitLocation, HitRotation); Spawn(class'ShockImpactRingB',,, HitLocation, HitRotation); Spawn(class'ShockImpactScorch',,, HitLocation, rotator(-HitNormal)); Spawn(class'ShockExplosionCoreB',,, HitLocation+HitNormal*8, HitRotation); } @>^class ONSBrakelightCorona extends ONSHeadlightCorona; simulated function UpdateBrakelightState(float Brake, int Gear) { if(Brake > 0.01f) { bCorona = true; LightHue = 255; LightSaturation = 48; } else if(Gear == 0) { bCorona = true; LightHue = 255; LightSaturation = 255; } else { bCorona = false; } } @> IFm5h 6C% w* h m5( G@>p//-------------------------------------------------------------- // //-------------------------------------------------------------- class ONSAvrilSmokeTrail extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" @>@>@> PFa&d>w.a&*H&a&a& #.a&.a&$@a& a&  G@>jclass ONSAttackCraftStreamer extends Emitter; #exec OBJ LOAD FILE=..\Textures\AW-2004Particles.utx @>q@$Q'@$%;@$7uw@$u@$@$%v@$7vw@$v@$B@$%@$7ww@$w@$}@$%@$7xw@$x@$ G@>V//============================================================================= // ONSAttackCraftExhaust. //============================================================================= // Placement offsets are: // X=147.695313,Y=-25.922363,Z=51.000000 // and // X=147.612320,Y=27.779526,Z=51.000000 //============================================================================= class ONSAttackCraftExhaust extends Emitter placeable; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" simulated function SetThrust(float Amount) { Emitters[0].StartSizeRange.X.Min = -0.1 - (Amount * 0.3); Emitters[0].StartSizeRange.X.Max = -0.2 - (Amount * 0.8); Emitters[1].StartVelocityRange.X.Min = 150 + (Amount * 250); Emitters[1].StartVelocityRange.X.Max = Emitters[1].StartVelocityRange.X.Min; Emitters[1].ParticlesPerSecond = 30 + (Amount * 70); Emitters[1].InitialParticlesPerSecond = 30 + (Amount * 70); } simulated function SetThrustEnabled(bool bDoThrust) { if(bDoThrust) { Emitters[0].Disabled = false; Emitters[1].Disabled = false; } else { Emitters[0].Disabled = true; Emitters[1].Disabled = true; } } @>\!V))&9:9:$v!L G@>H//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftBuildEffectRed extends ONSVehicleBuildEffect; @>@>@>I//----------------------------------------------------------- // //----------------------------------------------------------- class ONSAttackCraftBuildEffectBlue extends ONSVehicleBuildEffect; @>@>@> r5N6^ "w* ^N6 G@>s class MutWheeledVehicleStunts extends Mutator; var config float MaxForce; var config float MaxSpin; var config float JumpChargeTime; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local ONSWheeledCraft V; V = ONSWheeledCraft(Other); if (V != None) { V.bAllowAirControl = true; V.bAllowChargingJump = true; V.bSpecialHUD = true; // V.bScriptedRise = true; V.MaxJumpForce = MaxForce; V.MaxJumpSpin = MaxSpin; V.JumpChargeTime = JumpChargeTime; V.bHasHandbrake = false; //easier to get big jumps so make it harder to get an award for it V.DaredevilThreshInAirDistance *= 1.5; V.DaredevilThreshInAirTime *= 1.5; V.DaredevilThreshInAirSpin *= 2.0; } return true; } @>\FW/q!A9:W/%r5>69:W/&}5>7% G]FFCL-6 _F=zjW{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f{R~f lpEGKF~$PCHD'$BC'$?X$]VehicleStuntsbMStunt Vehicles`]_Players can make the wheeled vehicles jump. Hold down the crouch key to charge up and then release to jump. They can also control wheeled vehicles in mid-air.@>@>Cclass MutBigWheels extends Mutator; function PostBeginPlay() { local BigWheelsRules G; Super.PostBeginPlay(); G = spawn(class'BigWheelsRules'); G.BigWheelsMutator = self; if ( Level.Game.GameRulesModifiers == None ) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); } function float GetWheelsScaleFor(PlayerReplicationInfo P) { local float NewScale; if(P == None) return 1.0; if ( abs(P.Deaths) < 1 ) NewScale = 0.4 * (P.Score + 1); else NewScale = 0.4 * ((P.Score+1)/(P.Deaths+1)); return FClamp(NewScale, 1.0, 3.0); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local Vehicle V; V = Vehicle(Other); if(V != None && V.Driver != None) V.SetWheelsScale( GetWheelsScaleFor(V.PlayerReplicationInfo) ); return true; } function DriverEnteredVehicle(Vehicle V, Pawn P) { V.SetWheelsScale( GetWheelsScaleFor(V.PlayerReplicationInfo) ); if ( NextMutator != None ) NextMutator.DriverEnteredVehicle(V, P); } function DriverLeftVehicle(Vehicle V, Pawn P) { V.SetWheelsScale(1.0); if ( NextMutator != None ) NextMutator.DriverLeftVehicle(V, P); } @>r class DamTypeTankShell extends VehicleDamageType abstract; static function GetHitEffects(out class HitEffects[4], int VictimHealth ) { HitEffects[0] = class'HitSmoke'; if( VictimHealth <= 0 ) HitEffects[1] = class'HitFlameBig'; else if ( FRand() < 0.8 ) HitEffects[1] = class'HitFlame'; } static function ScoreKill(Controller Killer, Controller Killed) { if (Killed != None && Killer != Killed && Vehicle(Killed.Pawn) != None && Vehicle(Killed.Pawn).bCanFly) { //Maybe add to game stats? if (PlayerController(Killer) != None) PlayerController(Killer).ReceiveLocalizedMessage(class'ONSVehicleKillMessage', 5); } } @>ho6ZG;n+o6t62wn+*n+an+ G@>Dclass DamTypeTankRoadkill extends DamTypeRoadkill abstract; @>@class DamTypeTankPancake extends DamTypePancake abstract; @>n+@>@>Bclass DamTypeRVRoadkill extends DamTypeRoadkill abstract; @> iO$9 6w*x'aZ6  G@>gFiFG",Q `jF G@>@>@> hFg)1T9w*?  O&O&@? G@> jFC+;7M9w*?  O&O& G@> kFG.E- O&O& G@>>class DamTypeRVPancake extends DamTypePancake abstract; @>f&@>@>Cclass DamTypePRVRoadkill extends DamTypeRoadkill abstract; @>?class DamTypePRVPancake extends DamTypePancake abstract; @>3class DamTypeONSWeb extends VehicleDamageType; @>E%J f&. G@> rFT / wE%*E%a  G@>sFuFC' G@>@>@>tFG'0-9:9:$K$?'-y+' G@>vFp&A G@> wFh *aB?9:9:$3wE%*E%b#K$( G@> xFS5 -y+' G@> yF{Fn?2 -  `%n*t7^8J+  Nn*^1W"J+n*99^1L,J+D7n*},aU+V7L,J+(r},* r},U+L,]rE%*?9:9:$E%a Z'  ]/ a9 Z'E%\\10|wE%*E% R.U+/-y+c%%/c%7f&Xrc%f&X*Af&Xc%&c%%%w.kc%f&X*.kc%f&X {#U+c% G@>U+@>@>[class DamTypeONSVehicleExplosion extends DamageType abstract; static function GetHitEffects(out class HitEffects[4], int VictimHealth) { HitEffects[0] = class'HitSmoke'; if( VictimHealth <= 0 ) HitEffects[1] = class'HitFlameBig'; else if ( FRand() < 0.8 ) HitEffects[1] = class'HitFlame'; } @>y//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSRVBlade extends VehicleDamageType; @>Gclass DamTypeHoverBikePlasma extends VehicleDamageType abstract; @>Eclass DamTypeHoverBikePancake extends DamTypePancake abstract; @>Gclass DamTypeHoverBikeHeadshot extends DamTypeRoadKill abstract; @>Iclass DamTypeDestroyedVehicleRoadKill extends DamageType abstract; @>Dclass DamTypeChargingBeam extends VehicleDamageType abstract; @>Iclass DamTypeAttackCraftRoadkill extends DamTypeRoadkill abstract; @>bclass DamTypeAttackCraftPlasma extends VehicleDamageType abstract; static function ScoreKill(Controller Killer, Controller Killed) { if (Killed != None && Killer != Killed && Vehicle(Killed.Pawn) != None && Vehicle(Killed.Pawn).bCanFly) { //Maybe add to game stats? if (PlayerController(Killer) != None) PlayerController(Killer).ReceiveLocalizedMessage(class'ONSVehicleKillMessage', 6); } } @>Gclass DamTypeAttackCraftPancake extends DamTypePancake abstract; 4$S"SO,SB: Z8Z$?$?@>Z$?$?@>Z$=$=@>@>Y. $*@> $?*1@> $?*(f@>"VZ8Z$ $ A@>Z$$@>Z$$@>@>%!Y9 $$@> $L=$@> $=$@@> $?$@@>Z8Z$@$@@>Z$@$@@>Z$B$B@>@>k : #$?@>Z8Z$C$C@>Z$H$HB@>Z$H$HB@>@>m: zDzDzD3Z8Z$?$@@>Z$?$@@>Z$?$@@>@>@>$"SS'MB: /CY= $*@> $=*@> $L?*@> $?*@>"2VZ8Z$$@>Z$$@>Z$$A@>@>!Y $$?@> $?$?@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$A$A9""Z$ @$?@>Z8Z$$B@>Z$$B@>Z$HC$HC@>@>EYI $Z: ?@> $?Z: L>L>L>@> $?Z: ??L>@>@>$S"SSB: HBY= $*@> $?*"@> $?*@@> $?*@>P$?2"VZ8Z$ $ A@>Z$ $ A@>Z$$@>@>-&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $?$?@> $?$?@>Z8Z$ A$A@>Z$B$B@>Z$B$B@>@>$A$AZ$?$?@>Z8Z$$@>Z$$@>Z$@$@@>@>@>$"SSY= $*@> $L>* @> $>* z@> $?*@>VZ8Z$ $ A@>Z$ $ A@>Z$$@>@>&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@?@> $?$?@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$A$AZ$>$>@>Z8Z$$@>Z$$@>Z$ C$4C@>@>@>4$+ASSSY $*@> $?*@>,$=>$L=" VZ8Z$H$HB@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ $ @>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$HC$HC@>Z$4C$4C@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$C$C@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+A~SSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$\B$\B@>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$C$C@>Z$zC$zC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+A~SSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$\B$\B@>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$C$C@>Z$zC$zC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ B$ B@>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$zC$zC@>Z$zC$zC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ B$ B@>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$zC$zC@>Z$zC$zC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+A~SSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$C@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ $ @>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$C$C@>Z$fC$fC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$D$D@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+A~SSSY $*@> $?*@>,$=>$L=" VZ8Z$$B@>Z$$C@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ $ @>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$C$C@>Z$fC$fC@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$D$D@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L=" VZ8Z$H$HB@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ $ @>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$HC$HC@>Z$4C$4C@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$C$C@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L=" VZ8Z$H$HB@>Z$$B@>Z$$@>@>Z8Z$C$HC@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$ $ @>Z$$@>Z$H$H@>@>%!Y $?$@?@>Z8Z$HC$HC@>Z$4C$4C@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$C$C@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L="2VZ8Z$R$RC@>Z$$B@>Z$$@>@>Z8Z$HB$B@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$$@>Z$ $ @>Z$$@>@>%!Y $?$@?@>Z8Z$C$C@>Z$C$C@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$333?$333?@>Z$333?$333?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>4$+ASSSY $*@> $?*@>,$=>$L="2VZ8Z$R$RC@>Z$$B@>Z$$@>@>Z8Z$HB$B@>Z$C$HC@>Z$B$B@>@>k : = ף;?o!$@E$pBZ$>$>@>|Z$@$@@>Z8Z$$@>Z$$@>Z$D$@E@>@>@>4$+AS"SSY $*@> $?*@>,$>>$=2"##: HVZ8Z$$@>Z$ $ @>Z$$@>@>%!Y $?$@?@>Z8Z$C$C@>Z$C$C@>Z$B$B@>@>$pAZ$>$>@>Z8Z$$@>Z$$@>Z$HD$HD@>@>@>7zy$+ASSY $*@> $?*@>,$?>$=2"#: VZ8Z$$@>Z$$@>Z$$@>@>%.Z8Z$ȶ>$rH?@>Z$$@>Z$$@>@>Z8Z$333?$333?@>Z$333?$333?@>Z$?$?@>@>$pBZ$?$?@>|Z$@$@@>@>7[!Sy$Y= $*@> $>* p@> $(?* p@> $?*@>2".Z8Z$$@>Z$$@>Z$$?@>@>Z8Z$$@@>Z$?$?@>Z$?$?@>@>Z$=$L>@>@>$"S'Y= $*@> $>*@> $>*p@> $?*@>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$>@>Z8Z$ A$ A@>Z$B$B@>Z$B$B@>@>$B$B""Z$L>$L>@>Z8Z$C$C@>Z$$@>Z$$@>@>@>}%f$C%"dy&$HBl&$?|SSY $*@@@@> $?*@@@@>"!Y $$?@> $?$@>Z8Z$@$@@>Z$ A$ A@>Z$B$B@>@>$@E9 T$Z$HB$HB@>@>$S"SS'Y. $*@@@@> $?* @> $?*@>"n"-!Y $$?@> $?$?@>$@E9""Z$?$?@>@>S"SS(_!Z8Z$?$?@>Z$?$L?@>Z$?$?@>@>P$L?"-=Z$B$B@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@?@> $?$@@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$D""Z$>$>@>@>$S"SSY $*@> $?*@>P$?"&Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$@E Z$>$>@>@>4$SSB: Y. $*@> $333?*<@> $?*@>"-=Z$B$B@>Z8Z$@$@@>Z$@A$@A@>Z$B$B@>@>$@EZ$?$?@>MZ$$@>S@>$S"SSY= $*ҝU@> $L>*@> $>*@> $?*@>"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$ A$ A@>Z$B$B@>Z$B$B@>@>$B$BZ$>$>@>@>$So#"SS'B: AY. $*@> $?*xxx@> $?*ddd@>"-=Z$$A@>&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$ ?$ff>@>Z$$@>Z$$@>@>!Y+ $$?@> $>$@@> $?$@@@>Z8Z$ A$pA@>Z$B$B@>Z$B$B@>@>$C$C9""Z$@$ @@>Z8Z$$@>Z$$@>Z$$@>@>@>4$SSY= $*@> $L>*@> $fff?*@> $?*@>2"&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$HBZ$?$?@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@> $L?*@> $?*@>"#: @%!Y $$@?@> $?$>@>Z8Z$pB$pB@>Z$pB$pB@>Z$B$B@>@>$@EZ$ff>$ff>@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@@@@> $L?*@> $?*@>P$>"#: @%!Y $$?@> $?$@>Z8Z$HC$HC@>Z$pB$pB@>Z$B$B@>@>$@EZ$?$?@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@> $L?*@> $?*@>"#: @A%!Y $$@?@> $?$>@>Z8Z$pB$pB@>Z$pB$pB@>Z$B$B@>@>$@EZ$ff>$ff>@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@@@@> $L?*@> $?*@>P$>"#: @A%!Y $$?@> $?$@>Z8Z$HC$HC@>Z$pB$pB@>Z$B$B@>@>$@EZ$?$?@>@>$AS"SSY $*@> $?*@>>$>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$@$@@>Z$B$B@>Z$B$B@>@>$@Z$?$?@>|Z$>$>@>@>$S"SSY. $*@> $@?*@> $?*@>P$>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$@Z$?$?@>|Z$?$?@>@>7[!Sy$S"SSY. $*@> $?*@> $?*@>2"!Y+ $$?@> $?$?@> $?$?@>Z8Z$=$=@>Z$=$=@>Z$=$=@>@>uY[U HZ$A$A@>]Z$ff>$ff?@>D"YZ$?$?@>EZ$?$?@>@>I"L"Z$?$?@>$@EZ$?$?@>|Z$?$?@>@>$AS"SSY $*@> $?*@>>$>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$@$@@>Z$B$B@>Z$B$B@>@>$@Z$?$?@>|Z$>$>@>@>$S"SSY. $*@> $@?*@> $?*@>P$>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$@Z$?$?@>|Z$?$?@>@>7[!Sy$S"SSY. $*@> $?*@> $?*@>2"!Y+ $$?@> $?$?@> $?$?@>Z8Z$=$=@>Z$=$=@>Z$=$=@>@>uY[U HZ$A$A@>]Z$ff>$ff?@>D"YZ$?$?@>EZ$?$?@>@>I"L"Z$?$?@>$@EZ$?$?@>|Z$?$?@>@>$S"SSB: AY= $*@> $L>*@> $>*@> $?*@>"n"&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>$C9 Z$?$?@>@>$S"SS'MB: HBY= $*@> $=*@> $?*@> $?*@>"-=Z$?$?@>&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$C9""Z$?$?@>MZ$H$@>SEYa $Z: ???@> $=Z: ===@> $?Z: L=L=L=@> $?Z: @>@>$S"SS'Y. $*@> $ff&?*@> $?*@>"-=Z$$A@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$>@> $?$?@>$C""Z$33>$33>@>|Z$L=$L=@>@>$S"SSY. $*@> $>*@@> $?*@>P$?"n-=Z$$A@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$>@> $?$?@>Z8Z$C$C@>Z$B$B@>Z$B$B@>@>$CZ$>$>@>@>7[!Sz$S"SSB: HBY. $*@> $>*@> $?*@>P$?2"#: AB&Z8Z$@?$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$333?$fff?@>Z$333?$fff?@>Z$$@@>@>$HB9Z$?$@?@>@>7[!Sz$S"SSB: HBY. $*@> $>*@> $?*@>P$?2"#: A&Z8Z$@?$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$333?$fff?@>Z$333?$fff?@>Z$$@@>@>$HB9Z$?$@?@>@>$S"SS('MB: CY= $*`@> $L>*`@> $?*@d@> $?*Dh}@>,$?>$33>"2-hZ8Z$F$F@>Z$$G@>Z$A$A@>@>%!Y $$>@> $?$?@>Z8Z$HB$B@>Z$$@>Z$$@>@>$HB$HB9""Z$?$L?@>Z8Z$B$B@>Z$$@>Z$$@>@>MZ$$H@>SEYa $Z: ???@> $L>Z: 33>33>33>@> $?Z: ===@> $?Z: @>@>4R: ?$"SY= $*@> $ff>*@d@> $ ?*@d@> $?*@>P$@?2"#: @.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$ @@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>Z$>$>@>@>7[!Sz$S"SSB: HY. $*@> $>*@> $?*@>P$?2"#: AB&Z8Z$@?$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$L?$?@>Z$L?$?@>Z$?$?@>@>$HB9Z$?$@?@>@>7[!Sz$S"SSB: HY. $*@> $>*@> $?*@>P$?2"#: A&Z8Z$@?$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$L?$?@>Z$L?$?@>Z$?$?@>@>$HB9Z$?$@?@>@>yZ$@F$@F@>|J&$A}"~""SY. $*@> $?*@@@> $?*@>_!Z8Z$?$?@>Z$$@>Z$$@>@>"%Z8Z$ A$ A@>Z$ A$ A@>Z$B$B@>@>$@E Z$ ף<$ ף<@>Z8Z$?$?@>Z$$@>Z$$@>@>@>yZ$@F$@F@>|}"S"#: CZ8Z$B$B@>Z$B$B@>Z$B$B@>@>$PCG9Z$=$=@>Z8Z$$@>Z$$@>Z$?$?@>@>@>yZ$@F$@F@>|}"S_!Z8Z$L>$L>@>Z$L>$L>@>Z$?$?@>@>"#: CZ8Z$HC$HC@>Z$B$B@>Z$B$B@>@>$PCGZ$=$=@>Z8Z$$@>Z$$@>Z$?$?@>@>@>7yD o#S_!Z8Z$>$>@>Z$>$>@>Z$?$?@>@>"#: CZ8Z$@@$@@@>Z$@@$@@@>Z$?$?@>@>$PCG@>yZ$@F$@F@>|}"S"#: CZ8Z$B$B@>Z$B$B@>Z$B$B@>@>$PCG9Z$=$=@>Z8Z$$@>Z$$@>Z$?$?@>@>@>yZ$@F$@F@>|}"S_!Z8Z$?$?@>Z$=$=@>Z$=$=@>@>"#: CZ8Z$HC$HC@>Z$B$B@>Z$B$B@>@>$PCGZ$=$=@>Z8Z$$@>Z$$@>Z$?$?@>@>@>7yD o#S_!Z8Z$?$?@>Z$>$>@>Z$>$>@>@>P$@"#: CZ8Z$@@$@@@>Z$@@$@@@>Z$?$?@>@>$PCG@>$"SY= $*@> $L>*@> $L?*@> $?*@>_!Z8Z$?$?@>Z$L?$L?@>Z$$@>@>P$L>2".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@> $?$?@>Z$>$>@>@>Y_!Z8Z$?$?@>Z$L?$L?@>Z$$@>@>P$>2"(-=Z$B$B@>hZ8Z$$G@>Z$F$F@>Z$B$B@>@>ZZ8Z$L$L>@>Z$L$L>@>Z$L$L>@>@>&Z8Z$$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ A$ A@>Z$A$A@>Z$B$B@>@>Z$?$?@>@>$"S'Y. $*@> $?*@> $?*@>_!Z8Z$?$?@>Z$L?$L?@>Z$>$>@>@>P$?"y*Z$?$?@>&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@@> $?$?@>Z8Z$A$HB@>Z$B$B@>Z$B$B@>@>""Z$>$>@>@>_!Z8Z$?$?@>Z$L?$L?@>Z$L>$L>@>@>".Z8Z$$?@>Z$$@>Z$$@>@>Z$=$=@>@>7y_!Z8Z$$@>Z$?$?@>Z$$@>@>P$?"VZ8Z$$@>Z$$@>Z$$@>@>Z$L>$L>@>@>4$"SY= $*@> $L>*@> $L?*@> $?*@>_!Z8Z$?$?@>Z$L?$L?@>Z$L>$L>@>@>P$?"VZ8Z$$@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$>@>Z$>$>@>@>4R: ?$S"SS'Y= $*@> $>*@> $>*@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$pB$B@>Z$B$B@>Z$B$B@>@>$C""Z$L>$L>@>@>4R: ?$S"SSY. $*@> $L?*@> $?*@>P$L?"#: %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$HC$zC@>Z$B$B@>Z$B$B@>@>$CZ$L>$L>@>@>$SSB: Y. $*U@> $?*U@> $?*@>"-n-hZ8Z$$@>Z$$G@>Z$A$A@>@>%V:]@&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$@$pA@>Z$B$B@>Z$B$B@>@>$@EZ$?$?@>Z8Z$$@>Z$HB$C@>Z$$@>@>MZ$$H@>S@>4$SSY. $*U@> $333?*@> $?*@>"#: %.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$@EZ$>$>@>@>+S|S"SS('P$@,$?"#: A-=Z$4C$4C@>%&Z8Z$L=$=@>Z$$@>Z$$@>@>@Z8Z$@$@@>Z$@$@@>Z$@$@@>@>!Y $@$@@>Z8Z$C$4C@>Z$$@>Z$$@>@>uY[U HZ$D$D@>]Z$?$?@>D"YZ$?$@@>EZ$?$?@>@>I"L"Z$>$>@>$ D ""T$Z$@@$@@@>|Z$@?$@?@>Z8Z$@$@E@>Z$@$@E@>Z$@$@E@>@>3Z8Z$A$A@>Z$A$A@>Z$@$@@>@>EY $?Z: L>L>L>@>@>7y+ASW |S"SS,$?>$?2"X : %!Y $@$@@>Z8Z$@$@@>Z$@$@@>Z$@$@@>@>$?T$Z$?$?@>@>7y+S"SS,$?2"%!Y $@$A@>Z8Z$@$@@>Z$@$@@>Z$@$@@>@>$?Z$@$@@>@>+S|S"SS,$?>$L>"%!Y $@$B@>Z8Z$pB$pB@>Z$$@>Z$$@>@>$?Z$@$@@>@>7zy+S|S"SS,$?2"%!Y $@$A@>Z8Z$@$@@>Z$@$@@>Z$@$@@>@>$?Z$@$@@>@>7zy+S"SS2"%!Y $@$@A@>Z8Z$@$@@>Z$@$@@>Z$@$@@>@>uY[U HZ$D$D@>]Z$?$?@>D"YZ$?$@@>EZ$?$?@>@>I"L"Z$?$?@>$?9T$Z$?$?@>@>S"SS("PVZ8Z$z$zC@>Z$z$zC@>Z$z$zC@>@>.Z8Z$Dl>$5^Z?@>Z$$@>Z$$@>@>Z8Z$C$C@>Z$B$B@>Z$B$B@>@>uiU HZ$D$D@>]Z$?$?@>D"YZ$?$@@>EZ$?$?@>@>UHZ$D$D@>]Z$?$?@>D"YZ$?$@@>EZ$?$?@>@>UHZ$D$D@>]Z$?$?@>D"YZ$?$@@>EZ$?$?@>@>I"L"Z$>$>@>$pA""Z$?$?@>|Z$@$@@>@>+A"SS('P$?,$@>$=".Z8Z$?$?@>Z$$@>Z$$@>@>!Y $@$A@>Z8Z$B$B@>Z$A$A@>Z$A$A@>@>$@9""|Z$@$@@>Z8Z$$A@>Z$$A@>Z$\C$\C@>@>@>7zSS"#: .Z8Z$ff>$@?@>Z$$@>Z$$@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>uY[U HZ$D$D@>]Z$?$?@>D"YZ$?$?@>EZ$?$?@>@>I"L"Z$L>$L>@>$@9Z$>$ff&?@>|Z$@$ A@>@>7zS".Z8Z$ȶ>$-=?@>Z$$@>Z$$@>@>Z8Z$ff&?$?@>Z$ff&?$?@>Z$?$?@>@>uY[U HZ$D$D@>]Z$?$?@>D"YZ$?$?@>EZ$?$?@>@>I"L"Z$L>$L>@>Z$>$ff&?@>|Z$@$A@>@>+A"S(',$P@>$>"(#: VZ8Z$C$C@>Z$C$C@>Z$$@>@>!Y $@@$@@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>9""|Z$@$@@>Z8Z$p$pA@>Z$p$pA@>Z$HC$zC@>@>@>7 zy$SD "SSY. $* @> $333?*Ȗ@> $?*@>"n.Z8Z$$?@>Z$$?@>Z$$?@>@>!Y $$@> $?$ @@>$@EZ$?$?@>|Z$L>$L>@>@>7 zy$SD "SSY. $*@> $333?*Ȗ@> $?*@>"n.Z8Z$$@>Z$>$>@>Z$>$>@>@>!Y $$@> $?$ @@>$@EZ$?$?@>|Z$L>$L>@>@>@>Uclass BigWheelsRules extends GameRules; var MutBigWheels BigWheelsMutator; function ScoreKill(Controller Killer, Controller Killed) { local Vehicle V; // If the killer is a vehicle, then scale its wheels based on drivers performance. if ( (Killer != None) && (Killer.Pawn != None) ) { V = Vehicle(Killer.Pawn); if ( V != None ) { V.SetWheelsScale( BigWheelsMutator.GetWheelsScaleFor( V.PlayerReplicationInfo ) ); } } if ( NextGameRules != None ) NextGameRules.ScoreKill(Killer,Killed); } $S"SSY= $*@> $=*ͫr@> $L?*T@> $?*@>".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$@@@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$ AZ$?$?@>@>$S"SSY= $*@> $=*ʮu@> $L?*TQ@> $?*@>".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$@@@>Z8Z$B$4C@>Z$B$B@>Z$B$B@>@>$ AZ$>$>@>@>4$Sj SMY= $*@> $=*@> $L?*@> $?*@>"dn-=Z$A$A@>Z8Z$@$@@>Z$B$B@>Z$B$B@>@>k : <??$PCGZ$?$?@>MZ$$H@>SEYI $Z: ???@> $>Z: ???@> $?Z: @@@@>@>$S"SSYL $*222@> $>*@> $?*@> $Y?*@> $?*@>2"#: @A-&Z8Z$$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $?$?@> $?$?@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$C9Z$@@$@@@>@>$S"SSY= $*@> $?*@> $L?*@> $?*@>2"#: @A&Z8Z$$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$AZ$?$?@>@>4$SSY= $*@> $?*@> $L?*@> $?*@>_!Z8Z$>$>@>Z$>$>@>Z$?$?@>@>2"d-hZ8Z$$F@>Z$F$F@>Z$B$B@>@>Z8Z$@@$@@@>Z$@$@@>Z$B$B@>@>$BZ$L?$L?@>MZ$$@>S@>$SY. $*@> $L>*@> $?*@>2"#: @A.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$?@> $?$?@>Z8Z$pA$A@>Z$B$B@>Z$B$B@>@>$D9Z$L=$L=@>|Z$?$?@>@>$SY. $*@> $L>*@> $?*@>2"#: @A.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$?@> $?$?@>Z8Z$ A$ A@>Z$B$B@>Z$B$B@>@>$D9Z$L>$L>@>|Z$?$?@>@>yZ$pB$pB@>|G#Z8Z$$@@>Z$$@@>Z$$@@>@>t#Z8Z$$@@>Z$$@@>Z$$@@>@>$Y= $*@> $L>*@> $L?*@> $?*@>2"#: @A-=Z$@$@@>%Z8Z$@$@@>Z$B$B@>Z$B$B@>@>Z$=$=@>|Z$?$?@>Z8Z$$@>Z$$@>Z$L=$L=@>@>@>$S"SSYL $*222@> $>*@> $?*@> $Y?*@> $?*@>2"#: @-&Z8Z$$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $?$?@> $?$?@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$C9Z$@@$@@@>@>$S"SSY= $*@> $?*@> $L?*@> $?*@>2"#: @&Z8Z$$?@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$AZ$?$?@>@>$SY. $*@> $L>*@> $?*@>2"#: @.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$?@> $?$?@>Z8Z$pA$A@>Z$B$B@>Z$B$B@>@>$D9Z$=$=@>|Z$?$?@>@>$SY. $*@> $L>*@> $?*@>2"#: @.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$?@> $?$?@>Z8Z$ A$ A@>Z$B$B@>Z$B$B@>@>$D9Z$=$=@>|Z$?$?@>@>yZ$pB$pB@>|G#Z8Z$$@@>Z$$@@>Z$$@@>@>t#Z8Z$$@@>Z$$@@>Z$$@@>@>$Y= $*@> $L>*@> $L?*@> $?*@>2"#: @-=Z$@$@@>%Z8Z$@$@@>Z$B$B@>Z$B$B@>@>Z$=$=@>|Z$?$?@>Z8Z$$@>Z$$@>Z$L=$L=@>@>@>7 z$S"SSn&SD%Y= $*@> $>*@@> $?*@@> $?*@>2"%&Z8Z$$@>Z$$@>Z$?$?@>@>.Z8Z$$@>Z$$@>Z$$?@>@>!Y $$@> $?$?@>Z8Z$$@>Z$?$?@>Z$?$?@>@>$C9Z$=$=@>@>4$Y $*뀹@> $?*뀹@>2"#: B.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ B$HB@>Z$B$B@>Z$B$B@>@>$EZ$L>$L>@>R$@O$@@>4$SY $*뀹@> $?*뀹@>2"#: HBZ8Z$$@>Z$A$A@>Z$B$B@>@>$C Z$L>$L>@>Z8Z$$ A@>Z$$@>Z$$@>@>3Z8Z$?$?@>Z$$@>Z$$@>@>R$?O$@@>$"S(Y= $*@> $=*@> $?*9@> $?*@>2"n#: B&Z8Z$$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HA$A@>Z$B$B@>Z$B$B@>@>""Z$>$>@>Z8Z$$@>Z$$@>Z$$@>@>R$?O$@@>4$SSY= $*@> $L>*@> $fff?*@> $?*@>2"&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$HBZ$?$?@>@>4$SYx%i j SMYL $*@> $=*@> $>*@> $?*@> $?*@>2"VZ8Z$$@>Z$$@>Z$$C@>@>-hZ8Z$$G@>Z$F$F@>Z$B$B@>@>ZZ8Z$$@>Z$$@>Z$?$?@>@>Y&YI $X": ???@> $?X": ???@> $?X": @>!YU $$?@> $L>$?@> $>$L?@> $?$?@> $L?$@@@> $?$L?@>Z8Z$@$ A@>Z$B$B@>Z$B$B@>@>k : #<??$PCGZ$?$?@>MZ$A$A@>SEYa $Z: @> $>Z: ???@> $L?Z: AA@> $?Z: L>L>L>@>@>7SSB: "#: A%{!: ??&Z8Z$?$@@>Z$$@>Z$$?@>@>.Z8Z$>$>@>Z$$@>Z$>$>@>@>$CZ$?$?@>Z8Z$$@>Z$$H@>Z$C$HC@>@>@>7SSB: "#: BA%{!: ?&Z8Z$?$@@>Z$$@>Z$$?@>@>.Z8Z$$@>Z$$@>Z$$@>@>$CZ$?$?@>Z8Z$$@>Z$B$HC@>Z$C$HC@>@>@>7 z$S"SSn&SD%Y= $*@> $>*@@@> $?*@@@> $?*@>2"%&Z8Z$$@>Z$$@>Z$?$?@>@>.Z8Z$$@>Z$$@>Z$$?@>@>!Y $$@> $?$?@>Z8Z$$@>Z$?$?@>Z$?$?@>@>$C9Z$=$=@>@>yZ$B$B@>|G#Z8Z$$@@>Z$$@@>Z$$@@>@>t#Z8Z$333$333?@>Z$333$333?@>Z$333$333?@>@>"@Z$?$?@>T.Z$?$@@@>{Z$?$?@>d($Y= $*@> $L>*@> $L?*@> $?*@>_!Z8Z$L>$L>@>Z$?$?@>Z$L>$L>@>@>2"-=Z$=$=@>Z8Z$ A$A@>Z$B$B@>Z$B$B@>@>Z$L>$L>@>MZ$?$?@>S@>S'_!Z8Z$L>$L>@>Z$?$?@>Z$L>$L>@>@>2".Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$C""Z$=$=@>@>w'YLq'Y'GZ8Z$$@>Z$$@>Z$$@>@>D$?@>|J&$@G#Z8Z$$@@>Z$$@@>Z$ $ A@>@>~"D _!Z8Z$L>$L>@>Z$?$?@>Z$L>$L>@>@>"Z8Z$@$ A@>Z$B$B@>Z$B$B@>@> Z$ #<$ #<@>@>S_!Z8Z$L>$L>@>Z$?$?@>Z$L>$L>@>@>P$L>2".Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$AZ$=$=@>@>4$SY= $*@> $L>*@> $L?*@> $?*@>2"Z8Z$A$HB@>Z$A$A@>Z$B$B@>@>Z$L>$L>@>@>$"SY= $*@> $L>*@@> $L?*@@> $?*@>2"&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>Z$?$?@>@>$Y= $*@> $L>*@@@> $L?*@@@> $?*@>P$?2".Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>Z$ ף<$ ף<@>R$?O$?@>$"SY= $*@> $>*P((@> $?*P((@> $?*@>2"&Z8Z$$ ף<@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>Z8Z$ B$ B@>Z$B$B@>Z$B$B@>@>Z$?$?@>R$?O$?@>$S"SS(B: BY= $*@> $L>*@> $L?*`@> $?*@>n"-hZ8Z$$G@>Z$F$F@>Z$@$@@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$C9""Z$333?$333?@>MZ$$@>3Z8Z$@$@@>Z$@$@@>Z$@@$@@@>@>}"S@>S"SS("-=Z$A$A@>hZ8Z$$G@>Z$F$F@>Z$@$@@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $?$?@> $?$?@>$C""Z$?$?@>MZ$$@>3Z8Z$@$@@>Z$@$@@>Z$@$@@>@>S@>S"SS(VZ8Z$$@>Z$$@>Z$$HB@>@>-=Z$A$@B@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$@E""Z$?$?@>|Z$=$=@>@>$S"SS('Y $*@> $?*@>P$333?n-=Z$A$B@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@?@> $?$?@>Z8Z$B$zC@>Z$B$B@>Z$B$B@>@>$@E""Z$>$33>@>@>7[!Szy$S"SSY $*@> $?*@>2"#: %.Z8Z$$@>Z$$@>Z$$?@>@>!Y $$?@> $?$@@>Z8Z$$@>Z$?$?@>Z$?$?@>@>$CZ$L>$L>@>@>$S"SS'MY $*@> $?*@>"#: `%&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$PCG9""Z$ @$ @@>Z8Z$$D@>Z$C$D@>Z$$D@>@>EYI $Z: ???@> $>Z: L>L>L>@> $?Z: @>@>$S"SS'MY $*@> $?*@>"#: `%&Z8Z$$L=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$PCG9""Z$ @$ @@>Z8Z$$D@>Z$$@>Z$$D@>@>EYI $Z: ???@> $>Z: L>L>L>@> $?Z: @>@>}%f$C%"y&$BU*l&$L?$"SSY $*d@> $?*d@>P$?"!Y $$?@> $?$@@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$D T$Z$C$C@>@>R: ?$S_!Z8Z$?$?@>Z$L?$L?@>Z$$@>@>2"#: {!: &Z8Z$L=$L>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y9 $$=@> $=$?@> $>$?@> $?$@?@>Z8Z$A$A@>Z$B$B@>Z$B$B@>@>$HBT$Z$=$=@>|Z$L=$L=@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $* @> $L?*@> $?*@>"%!Y $$?@> $?$?@>Z8Z$ B$ B@>Z$A$A@>Z$B$B@>@>$@EZ$>$>@>Z8Z$C$C@>Z$$@>Z$$@>@>@>yZ$D$D@>|}"~""@Z$$?@>{Z$$@@>$S|S"SSY. $*@@@> $L?*@> $?*@>P$L?"%!Y $$?@> $?$@>Z8Z$B$B@>Z$A$A@>Z$B$B@>@>$@EZ$?$?@>Z8Z$C$C@>Z$$@>Z$$@>@>@>4R: ?$S"SSY $*@> $?*@@@>"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@>Z8Z$C$HC@>Z$B$B@>Z$B$B@>@>$AZ$L>$L>@>@>$S"SS('B: AY. $*@> $ff&?*@> $?*@>"#: AVZ8Z$$B@>Z$$@>Z$$@@>@>%.Z8Z$$<@>Z$$@>Z$$@>@>!Y $$>@> $?$?@>Z8Z$A$HB@>Z$B$B@>Z$B$B@>@>$aD""Z$?$?@>Z8Z$$@>Z$$@>Z$$pA@>@>R$?O$L>@>$S"SS('Y= $* @> $=* @> $L?*@@@> $?*@>"#: AVZ8Z$$A@>Z$$@>Z$$@>@>%!Y $$=@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$;E""Z$L>$L>@>@>$S"SSB: HBY. $*@> $>*@> $?*@>P$?"nVZ8Z$$@>Z$$@>Z$$@>@>-=Z$B$B@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@?@> $?$ @@>$`jG9""Z$?$?@>@>S"SS("VZ8Z$$@>Z$$@>Z$$@>@>-=Z$B$B@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>$zE""Z$>$?@>@>S"SS("VZ8Z$HB$H@>Z$H$HB@>Z$H$A@>@>=Z$B$B@>%&Z8Z$$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>$@E""Z$?$L?@>|Z$L>$L>@>@>$S"S'Y. $*@> $Y?*@> $?*@>P$?"nn"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L?@> $?$?@>9""Z$?$?@>|Z$L>$L>@>@>$S"SS(Y. $*@> $?*@> $?*@>" nVZ8Z$$@@>Z$$@@>Z$$@@>@>n"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$@> $L>$L?@> $?$?@>$`A""Z$?$?@>|Z$L>$L>@>@>7[!Sy$SSB: HY. $*@> $Y?*@> $?*@>"n#: pBB%&Z8Z$$?@>Z$$?@>Z$$@@>@>$@E9Z$?$?@>|Z$L>$L>@>MZ$$H@>S@>$S"SS(Y $*@> $?*@>" nVZ8Z$$@@>Z$$@@>Z$$@@>@>n"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$L?@> $?$?@>$`A""Z$?$?@>|Z$L>$L>@>@>$S"S'Y. $*@> $Y?*@> $?*@>P$?"nn"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L?@> $?$?@>9""Z$?$?@>|Z$L>$L>@>@>7[!Sy$SSB: HY. $*@> $Y?*@> $?*@>"n#: pB%&Z8Z$$?@>Z$$?@>Z$$@@>@>Z8Z$?$?@>Z$$@>Z$?$?@>@>$@E9Z$?$?@>|Z$L>$L>@>MZ$$H@>S@>$S"S'Y. $*@> $Y?*@> $?*@>P$?"nn" %.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L?@> $?$?@>9""Z$?$?@>|Z$L>$L>@>@>$S"SS(Y. $*@> $?*@> $?*@>" nVZ8Z$$@@>Z$$@@>Z$$@@>@>n" %.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$@> $L>$L?@> $?$?@>$`A""Z$?$?@>|Z$L>$L>@>@>7[!Sy$SSB: HY. $*@> $Y?*@> $?*@>"n#:  BpB%&Z8Z$$?@>Z$$?@>Z$$@@>@>Z8Z$?$?@>Z$$@>Z$?$?@>@>$@E9Z$?$?@>|Z$L>$L>@>Z8Z$C$C@>Z$C$C@>Z$$@>@>MZ$$H@>S@>$S"S'Y. $*@> $Y?*@> $?*@>P$?"nn"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>9""Z$?$?@>|Z$L>$L>@>@>$S"SS(Y $*@> $?*@>" nVZ8Z$$@@>Z$$@@>Z$$@@>@>n"%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $>$L?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$`A""Z$?$?@>|Z$L>$L>@>@>7[!Sy$S|SSB: HY. $*@> $Y?*@> $?*@>,$?"n#:  pB%&Z8Z$$?@>Z$$?@>Z$$@@>@>$@E9Z$?$?@>|Z$L>$L>@>MZ$H$@>S@>SS("nn"-=Z$$@@>%.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$HB@>Z$B$B@>Z$B$B@>@>$B""Z$>$?@>|Z$L>$L>@>@>7y$SSB: Y. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>|Z$>$>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>7zy$SSB: HY. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>|Z$>$>@>Z8Z$$@>Z$$@>Z$B$C@>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>$S"SS'Y $*@@@@> $?*@>"nVZ8Z$H$HB@>Z$$B@>Z$$@>@>-=Z$A$B@>%&Z8Z$$>@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$?@> $?$?@> $?$?@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>$@E9""Z$?$?@>@>S"SS("nVZ8Z$H$HB@>Z$$B@>Z$$@>@>-=Z$A$B@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$@E""Z$>$333?@>@>S"SS("VZ8Z$H$HB@>Z$$B@>Z$$@>@>-=Z$A$B@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$?@>$@E""Z$>$333?@>|Z$L>$L>@>@>7[!SyL$SSB: HZ8Z$>$>@>Z$>$>@>Z$?$?@>@>Y. $*@> $Y?*@> $?*@>"n#: %{!: ???&Z8Z$?$?@>Z$$@>Z$$@>@>$@E9Z$?$?@>Z8Z$$B@>Z$z$@>Z$$@>@>3Z8Z$?$?@>Z$?$?@>Z$$@>@>@>7[!SyL$SSB: HZ8Z$>$>@>Z$>$>@>Z$?$?@>@>Y. $*@> $Y?*@> $?*@>"n#: B%{!: ???&Z8Z$$@>Z$$@>Z$$@>@>$@E9Z$?$?@>Z8Z$$B@>Z$zD$D@>Z$$@>@>3Z8Z$?$?@>Z$?$?@>Z$$@>@>@>S("nn"%.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ B$ B@>Z$B$B@>Z$B$B@>@>""Z$?$?@>@>7 [!Sy$SSB: aY. $*@> $Y?*@> $?*@>"n%&Z8Z$$@>Z$?$?@>Z$$@>@>$C9Z$?$?@>Z8Z$$B@>Z$$B@>Z$/D$HD@>@>@>7y$SSB: Y. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>7zy$SSB: HY. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>Z8Z$$@>Z$$@>Z$B$C@>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>SS'B: "VZ8Z$$A@>Z$$A@>Z$$@>@>%Z8Z$$@>Z$B$B@>Z$B$B@>@>$A""Z$?$?@>Z8Z$$C@>Z$$C@>Z$C$C@>@>@>$S"S'Y $*@> $?*@>nn".Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>9""Z$?$?@>@>Snn".Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$B$B@>Z$B$B@>Z$B$B@>@>""Z$>$?@>}"N&Z8Z$L>$L>@>Z$L>$L>@>Z$L>$L>@>@>@>S"SS("nn".Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$L?@> $?$?@>$A""Z$?$?@>@>S"S("VZ8Z$H$HC@>Z$$B@>Z$$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$L?@> $?$@@>""Z$>$?@>MZ$$@>S@>7 SSB: H"n#: B%{!: ??&Z8Z$$@>Z$?$?@>Z$$@>@>$@EZ$?$@@>Z8Z$H$HC@>Z$H$HC@>Z$D$D@>@>@>7y$SSB: Y. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>|Z$>$>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>7zy$SSB: HY. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>Z8Z$$@>Z$$@>Z$B$C@>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>$S"SS'B: AY= $*@> $L>*`@> $?*`@> $?*@>nn"-hZ8Z$$G@>Z$F$F@>Z$HB$C@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>$@E9""Z$@$@@>@>S"SS("-hZ8Z$$G@>Z$F$F@>Z$HB$B@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$ @@>$HB""Z$?$?@>MZ$H$H@>S@>SS("n-hZ8Z$$G@>Z$F$F@>Z$B$C@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$B$C@>Z$B$B@>Z$B$B@>@>$C""Z$>$?@>MZ$H$@>S@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: BB%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$HC$HC@>Z$C$C@>Z$B$B@>@>@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: B%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$C$HC@>Z$$@>Z$B$B@>@>@>7L$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: B%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$$H@>Z$C$C@>Z$HB$B@>@>@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: %&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$$H@>Z$$@>Z$B$B@>@>@>S"SS("nn"-=Z$$A@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$PA""Z$?$?@>@>7LSSB: HZ8Z$?$?@>Z$?$?@>Z$?$?@>@>"n#: BA%&Z8Z$?$@@>Z$$?@>Z$?$@@>@>Z8Z$?$?@>Z$$@>Z$?$?@>@>$CZ$?$?@>Z8Z$$C@>Z$C$HD@>Z$HB$B@>@>@>S"SS("nn" -=Z$$A@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$PA""Z$?$?@>@>7LSSB: HZ8Z$>$>@>Z$>$>@>Z$>$>@>@>"n#: A%&Z8Z$?$@@>Z$$?@>Z$?$@@>@>Z8Z$?$?@>Z$$@>Z$?$?@>@>$CZ$?$?@>Z8Z$$C@>Z$$H@>Z$HB$B@>@>@>7 [!SyL$SSB: aY. $*@> $Y?*@> $?*@>"n#: 4B%&Z8Z$?$@@>Z$$@@>Z$L>$?@>@>.Z8Z$?$?@>Z$$@>Z$$@>@>$C9Z$?$?@>Z8Z$$@>Z$$C@>Z$/D$HD@>@>@>7y$SSB: Y. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>7zy$SSB: HY. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>Z8Z$$@>Z$$@>Z$B$C@>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>$S"SS'Y. $*@> $>*@> $?*@>"nVZ8Z$$B@>Z$H$HB@>Z$$B@>@>n"-%!Y $$?@> $?$?@>$C9""Z$?$L?@>|Z$=$=@>}"@>S"SS("VZ8Z$$B@>Z$H$HB@>Z$$B@>@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$L>@> $?$?@>$B""Z$>$?@>MZ$H$@>S@>7 SSB: "n#: @B%{!: ??&Z8Z$$@>Z$?$@@>Z$$@>@>$@EZ$?$@@>Z8Z$$H@>Z$$@>Z$C$HD@>@>@>7SSB: "n#: A%{!: ???&Z8Z$$@>Z$$=@>Z$?$@@>@>$@EZ$?$?@>Z8Z$$@>Z$$@>Z$C$C@>@>@>7SSB: "n#: AA%{!: ??&Z8Z$$@>Z$$=@>Z$?$@@>@>Z8Z$$@>Z$?$?@>Z$?$?@>@>$@EZ$?$?@>Z8Z$$@>Z$C$C@>Z$HC$C@>@>@>S"SS(Y $*@> $?*@>"nn"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$@""Z$?$?@>@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: BB%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$C$C@>Z$C$C@>Z$B$B@>@>@>S"SS("nn"-=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$@""Z$?$?@>@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: B%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$HC$C@>Z$$@>Z$B$B@>@>@>S"SS("nn" -=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$@""Z$?$?@>@>7L$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: B%&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$$@>Z$C$C@>Z$HB$B@>@>@>S"SS("nn" -=Z$$A@>%.Z8Z$$?@>Z$$@>Z$$@>@>!Y+ $$L>@> $L>$?@> $?$?@>Z8Z$ B$pB@>Z$B$B@>Z$B$B@>@>$@""Z$?$?@>@>7[!SyL$S]SB: |!: ???Z8Z$>$>@>Z$>$>@>Z$>$>@>@>Y. $*@> $Y?*@> $?*@>"n#: %&Z8Z$$>@>Z$$>@>Z$$>@>@>.Z8Z$$?@>Z$$@>Z$$@>@>$C9Z$@$@@>Z8Z$H$@>Z$$@>Z$B$B@>@>@>7y$SSB: Y. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>7zy$SSB: HY. $*@> $Y?*@> $?*@>"n-=Z$A$A@>&Z8Z$$L>@>Z$$L>@>Z$$L>@>@>.Z8Z$$?@>Z$$?@>Z$$?@>@>Z8Z$?$?@>Z$?$?@>Z$?$?@>@>$@E9Z$?$@@>Z8Z$$@>Z$$@>Z$B$C@>@>MZ$C$HD@>3Z8Z$?$?@>Z$?$?@>Z$?$?@>@>S@>@>3class ActionMessage_ONS extends ActionMessage; UJU.2VJBM % X lpEGKF]!] Welcome to Onslaught Training.]!#"There are many types of vehicles.]!+*The 'USE' key gets in or out of vehicles.]!$#Some vehicles can hold passengers.]!)(Each team in Onslaught has a PowerCore.]!<;PowerCores are connected to each other through PowerNodes.]!<;You can see the network of PowerNodes in the overhead map.]!98The objective is to destroy the other team's PowerCore.]!^\You may only attack Nodes and Cores which are linked to a Node or Core you already control.]!D BTo take a PowerNode, destroy it if it is controlled by the enemy.]!C ATouch a neutral PowerAccessPoint to create a friendly PowerNode.]!4 3Vehicles appear near friendly Nodes and your Core.]!: 9Until moved, vehicles are locked against the enemy team.]!+ *The Link Gun can heal vehicles and Nodes.]!'&Damaged PowerCores can NOT be healed.]!<;Build a network of Nodes to gain access to the enemy Core,]!then destroy it.]!32This concludes the Onslaught Tutorial. Good luck.@>7L$S|S]"SSB: |!: ???Z8Z$?$?@>Z$?$?@>Z$L>$L>@>@>Y $*@> $?*@>,$@"n"&Z8Z$$?@>Z$?$@>Z$$?@>@>.Z8Z$$@>Z$$@>Z$>$>@>@>!Y9 $$?@> $fff?$?@> $Qx?$?@> $?$@>Z8Z$333?$333?@>Z$333?$333?@>Z$333?$333?@>@>$zD9Z$@$@@>}"@>SS'2"XVZ8Z$H$HC@>Z$$B@>Z$$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$A$pB@>Z$B$B@>Z$B$B@>@>$C""Z$=$=@>@>SS'2",VZ8Z$H$HC@>Z$$B@>Z$$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$C""Z$=$=@>|Z$?$?@>@>4$S"SSY. $*@> $>*@> $?*@>2VZ8Z$$@>Z$$@>Z$ $@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@> $?$?@>$ AZ$?$?@>|Z$?$?@>@>S"SS(VZ8Z$H$HC@>Z$$B@>Z$$A@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$C$HC@>Z$B$B@>Z$B$B@>@>$zD""Z$?$?@>|Z$?$?@>@>S"SS("#: BVZ8Z$$B@>Z$$B@>Z$$B@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@>$zD""Z$?$?@>|Z$?$?@>@>$S"SSY. $*@> $Y?*@> $?*@>2"!Y+ $$@> $@?$@@> $?$@@>$@EZ$?$?@>|Z$?$?@>@>@>aJ@>@>@>@>@>@>_J@>@>eJ@>@>vJ@@>@>@>@>A;z;U"A;9: %twy'*Fy'a/!o* 9:&!y'a/!q* 9:%y'ary'*9:%y'a Q3y'a O3wy'*y'a G@>A;u;U"A;9: %tw'*F'a/!o* 9:&!'a/!q* 9:%'ar'*9:%'a Q3'a O3w'*'a G@>EK@>@>` J1(d>e> G@>kK@>@>]+@>@>sJ@>@>hJ@>@>oJk;@>pJk;@>Fk;@>@>@>uJ@>@>qJ@>@>GlJp;ws /aA qJlJ0(10' G@>lM@>@>G.@>@>@>@>{J@>@>p>|=xJs!:+-q3 -xJp>xJ G@>~;~ba G@>@>@> AwJ; wJwJ@< G@>~;a G@>x%@>@>~Jd@>lK@>@> @>@>CK@>@>^K@>@>YKd@>DKd@>@>@>@>@>MKg@>@>@>NK@>@>LK@>@>JK@>@> g@>@>@>WIKM<H-IKaEK9:Q# p9:Q# 5aDK9:Q# p9:Q# 5 G\K_KN<$--9:9:$GPKK7Re7Re7h3}Re7 @>@>RK@>@>SK@>@>TK@>@>F@>@> `GKO<" GK? G@>rJ@>@>T7FKM<}KwA-FK*aHK  p  5t*aMK  p  5 G@>VK@>@>XK@>@>Y*@>@>TAKBKk9:9:$-l8(o9?%fK-a%pW"-CKvr19?%p9P99pr1{9?b?-CKoPPBKoR kBKp1oo1wAK*AKkBK-CK'( G@>V//----------------------------------------------------------- // Works just like ONSWeapon only allows for child weapons // that aim at the same target as the parent. //----------------------------------------------------------- class ONSLinkableWeapon extends ONSWeapon native abstract; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var ONSWeapon ChildWeapon; // Child weapons automatically inherit the aim location and firing events of the parent replication { reliable if (bNetDirty && bNetOwner && Role == ROLE_Authority) ChildWeapon; } event bool AttemptFire(Controller C, bool bAltFire) { if(Role != ROLE_Authority || bForceCenterAim) return False; if (FireCountdown <= 0) { CalcWeaponFire(); if (bCorrectAim) WeaponFireRotation = AdjustAim(bAltFire); if (Spread > 0) WeaponFireRotation = rotator(vector(WeaponFireRotation) + VRand()*FRand()*Spread); DualFireOffset *= -1; Instigator.MakeNoise(1.0); if (bAltFire) { FireCountdown = AltFireInterval; AltFire(C); } else { FireCountdown = FireInterval; Fire(C); } AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; if (ChildWeapon != None) ChildWeapon.AttemptFire(C, bAltFire); return True; } return False; } simulated function Destroyed() { if (ChildWeapon != None) ChildWeapon.Destroy(); Super.Destroyed(); } @> w$KKg*cLS:F) AF) A KKLKJK G@>@>@>y[K?=| wAK*AKay G@>@>@>t @>@>LM@>@>@@>@>PL@>@>@>@>xK@>@>RM@>@>@>@>jK@>@>tK@>@>eK@>@>~K@>@>mL@>@>OL@>@>q%@>@>@>@>oL@>@>@>@>@>@>rK@>@>RL@>@>@>@>@>@>EL@>@>\L@>@>@>@>fK@>@>@L@>@>@>@>@>@>BM@>@>yK@>@>KM@>@>eL@>@>m#@>@>@>@>IL@>@>@>@>DL@>@>BL@>@>@>@>YL@>@>LL@>@>FL@>@>aM@>@>@>@>@>@>wK@>@>@>@>@>@>D1@>@>@>@>_,@>@>z7@@>@>@>@>mM@>@>HL@>@>JL@>@>_L@>@>KL@>@>A@>@>m4]M`<)( G@>@>@>]L@>@>_M@>@>IM@>@>EM@>@>DM@>@>[L@>@>tL@>@>@>@>fL@>@>a%*@>T6@>@>OM@>@>pL@I@>qK@>@>@>@>ZL@>@>rL@I@>P A~l G@>sL@I@>R1@I@>zK@>@>HMvLq<L(8w*d<.|Kw|K*@L.|KFLo<@LFLLLLLFLyK*KL@Li<ryK* KL\LyK@L\LKLLLFL|K|KCryK*-sK'yK G@>|K@>@> ;mK^/7B    mK eL[L_LmLZLo$aHL#6HLqKZLaHLmK BLaJLYLqK'# B B BwBL*OBL-rBLF)waJLYLqK(# B B B*qKJLoLa<mK mK qKqK6mK eL6mK [L6mK _L G@>X:yLp<#'M G@>zL@>@>nM@>@>@>@>@>@> ~L_H>-w.* f P  G@>@>@>x9gL_<,w.*.@|w*.E".9?, G=gL G@>PhKu< hK. whK*w.hK*#9:.hK ,(rhK*hKE"A( r*dL99 9:hK9:$hKp*6hK  G@>J -9:9:$;9:9:$ w`4` 9?p%- (%@@ G@>@>@>DcLe<@>@>@>@>GGMi<!HTnK%nK7!w.nK!*OL.nK!.nK!.nK!?OL?nKOL G@>nK@>@>MMKo<4&d<KDKW9=9:$?rK]$9=9:$@7Kk*&@@@ G@>@>@> bKc<j>9:bK 9:,(w.bK*.bK^<PLbK PL.bKbKbOw.bK*.bK-bK\.bKt<'9:bK;wbK*%bK9?,'7.bK%wK%wK7.bKdK.wK.bKwdK*wK.bK9?,wK.bKA('wKdKbKwdK*wdK*;r.dK* .dK^<1dK PL9?rdK'dKdK( G@>@>@>dK@>@>SMALd</%mwAL*9:AL ,DALW9= AL]$9= G@>s?QMbLG$G!w.bL*(s?bL G@>@>@>JMgKb<,+q}gK 9?,gK 7&gKpMove away from 9VRL7&gKRL uKgKlwuK*UwuK*CuK gK gKgKRL& luKuKgKC$'( G@>UMQL_<9w.*( 9?,9?,*QL QL A(9?, QL G@>uK@>@>TAkLj<'`%( -sK(%rkL' G@>@>@>^LlTM`<4x' G@>v<nL_< 2/7%r%*nL G@> |$p! -sK( G@>@>@>L=XM^< ' G@>Y=WL_<!,w.*( 9?,9?,*WL WL A(9?, G@>@>@>^L[Mm<]( G@>@>@>NhLJ=-vzK`wzK*wzK*w. zK*. zKp<hLfLtL G @>@>@>^?aLr<ZF+r~#aL? ]<A w~#*w~#*:~# aL N' G@>@>@>d?ML@=B( ]<A w~#*w~#MLr~#w~#*:~# ML '~#.ML(( G@>hMs<  G@>uM*@>ufMn<Q G@>gM@>@>@>@>ot<  G@>5@>@> iC{KI=X+ {K ]<Ar.{K* .{K`<rr* 9:9:$r` .- fKswfK*w.fK*.fK`< \rxK*xKfKwxK*EL{K  EL$tI\\wfK*ILfK  \ILELxKfKELILfKfK?N={KxK G@>SFXLL=G50rXLrXL.(' G@>iM@>@>@>@>|L@>@>^Ll{L`<T' GL}<+SS'B: HZ8Z$?$?@>Z$?$?@>Z$?$?@>@>E=Z$@$@@>Y $*@> $?*@>,$`@"%&Z8Z$$@@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>Z8Z$ A$A@>Z$B$B@>Z$B$B@>@>$zD9""Z$@$@@>Z8Z$z$zD@>Z$z$zD@>Z$HC$D@>@>@>$+AS"SSY $*@> $?*@>,$?>$=2"VZ8Z$H$HC@>Z$H$HC@>Z$$@>@>-hZ8Z$$C@>Z$$C@>Z$$@>@>g<"&Z8Z$̽$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$@@> $?$@@>Z8Z$HB$B@>Z$B$B@>Z$B$B@>@>$zD9Z$?$@@>|Z$$=@>Z8Z$$D@>Z$$D@>Z$$HB@>@>MZ$B$HC@>3Z8Z$?$@@@>Z$?$@@@>Z$$@>@>h<S@>$+AS"SSB: Y $*@> $?*@>,$?>$=2"VZ8Z$$@>Z$$@>Z$$C@>@>g<"&Z8Z$̽$=@>Z$$@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@A@>Z8Z$A$pB@>Z$B$B@>Z$B$B@>@>$C9Z$?$@@>Z8Z$$B@>Z$$B@>Z$HB$D@>@>3Z8Z$?$@@>Z$?$@@>Z$?$@@>@>h<@>$+S"SS(Y $*@> $?*@>,$=2"VZ8Z$$B@>Z$$B@>Z$$@>@>.Z8Z$$?@>Z$$@>Z$$@>@>!Y $$?@> $?$@@@>Z8Z$B$C@>Z$B$B@>Z$B$B@>@>$zD""Z$>$?@>@>4$+ASj SB: Y $*@> $?*a@>,$?>$="n%Z8Z$@$ A@>Z$B$B@>Z$B$B@>@>k : ;??$zDZ$@?$?@>Z8Z$$D@>Z$$D@>Z$C$D@>@>@>@>WB@> f f jO fC jF jq jH jf jt jY jA jh f ] P j` j_ jC _ u js jE jv jj ji jd js j_ f^ jA f t jA ` 8 f _ f A jo jn j^ f| ju jm jc f b u b j[ ja h ^ u ^ f L P  P ] jY jh _ f f{ ju f T fv fi _ I u v P  f \ fs5 fl5 f g ja j[ f[ jo fP ji j` fF; jB P  h  h  fm s p h  j@ fc jw jb f c ju h  fk _ Z j[ fW f L8 j] h  j^ f m fB f p jQ5 H X fU ` F fk i ~ fi4 jU H } jb/ ` l ~/ fU0 j~ jt s I jk5 jQ; fT3 j~ H Q fj jv jq fW fi j] j\: jt s I _  i D f A f p jI j^3 i ^ u ^ ` fz: f _ f P jj ` s fs8 frP1 fQ h E h a/ fi f U H ? _  fY ju _ {W; u p jd P C h  jK qb P C5 h ; _ V f p h  fp] jf f } J0 ` z fu _ fP f T8 s X i Z V _  s X _ `v! f] h \ P p fmj u V f w8 H J f i j d Q H J fk0 y9 s ] 7J: 7v9 f m f @9 je v7 f X h m jX ^ | _  jD fr0 h j h g9 s } P e s hW wj: we: jc f a P P P I9 _ ( `  H R u n _  f ] f| 7Im H S fR! Y; m5 f c g jU8 H | f\ z2 fu j jP j\ f c _: h [" f0 fo0 h C jK js i e/ h o f^ f_9 ` c ` ! h  P w5 jW f ^ f|. fg. f| [8 f y B; _ d@ d a a _ fk fd a s hV i V8 i h f@; H | fy fk fD _  jI P f f V i o fH u o h y' h V3 a t f G d K f c u t u T f U G0 fX iu i j9 jJ f U H S i p- H f H L f] u m _ y jX jv H e" i _ h U u Q H V a j f c/ i ] n i I H J h q f ] i f fl P g/ _ Z f [ h \ 7P fZ fv0 ^ bo. fV h / ` [9 f o f z H m i @ jw H L _ B jN jR; i  fb f w fJ H n f t f U4 jB H J fX h w# i x. J2 H @ 7Az0 H p 72u0 fu H { H J i Z| @3 f V: ` _= . js= jS fm| h x; m/ h a s Y f I/ H _< i t& h U 7d. i g P q" D/ _ G R2 f|/ _ Y2 fw H ? jU4 jw i N f x f j Z9 R4 H R8 jO Y. jM h D _ R1 i C s i i W6 E0 jC i L H @ _ k= P K az i o i J f`^ fy f b H V9 h R [d fZK ff f F H H jY ff fk: Vg i T m9 H N" C0 H P i J f M h z H tk a e i Y i W H Z h ^ H n H C 7v UTQ f l H } UQ X6 s Jt h |7 i r i l' jg7 LI0 c e iw i D< s Js h v= H i$ i f/ fS9 H Q H R [f H Z s Jr f O1 H ~ a h a H A 7x0 H C H a f tt6 b J8 _ O s Jq H H jF3 f m= H N h z! H k _ A# u W f `T; H n ^ W fF fh7 L5 fy H i d u o f S4 i H2 H @* 72s0 H G& u t H q H Y h. H K a } a @ ` x7 s A s B 7 q0 h P P d ^9 H O i d O! H s! fb jr i C: f B ^ q fN! jL H x6 7 p0 ^= jD h i fc= H bu i D H bS i A f f j H Z" q9 7A{0 [W il jk fs jt7 f`= i u8 7y jt5 fx 7w H o m s ~ f 7 i :~ h y8 ^ ^ jQ P E8 f s4 u= H C2 _ y6 d _ i ~8 d O5 jz N5 jQ3 u c f h O i K i g i d H I u/ z9 L: i h 7w0 x/ 7{9 7A|0 7x9 H t V/ H I8 H o H f H e H c H b fI H E H K 7L ~[= ~\5 f~ H D fy0 s p H X [ f \ 72t0 H ^ _ Y! a p9 H N H J% H r! j~ UO h b ^ bn. i Y5 h i [S i J gib iK9 H X, gLf H H P i@ H B I @ ix2 UC3 P A3 i r H }# jL9 h y= s Z h l h M h [ i 6W f { fk f `& i q5 j` _ J5 UR jj giW9 h P a G s M _ h s L f P jM5 h { gLc jh _ M i u f H H { q: ff: f L9 h I fx f ot ` | h _ a ^ H N; f 7 H G; i _6 a OC _ f9 fu6 P ~: d O UL}7 fw1 i f H D. jX H U$ EI H l H X Ew H [& a X u p EX f v2 U^c6 H X h h H q# Ex H Q& H O& H f# H f! H G$ H \ H F i K- H  H \ H ` a } H {" H ? Ux: Ut/ _ m4 h i= h U= d { f M4 U#r9 fw9 f`7 H H jC f k3 f|9 jD H S f L1 H T ji H O H h H g) H C+ H G. H n fpZ H N if7 h N1 T5 I w h a; F5 LW: jD0 jf H e. h8 [. _ P- h }5 Q: i L j7 f ] fW/ ]2 h `( P m& h i8 G6 fr {: }8 iP: L]9 jh4 O: s O fo7 H tQ* x8 H ; H q+ s f. H P, H ? f t }. f z \; H p! X5 jG9 ~2 `9 H f H u* i T2 Q2 H I= H A) h K' ic9 H G) h9 _ t$ u p s c2 H ? H  H l H o$ LD2 H u) r5 H  H ^ H S a3 uj S2 H J H O< H o' H p' H B) H ~ h2 H K H S H @) H o- Q4 H G% H S H u H H, H o H K* f t h/ C4 H m" H O s [2 H N$ h O8 H C f y EVc s f. j3 H p! H s+ d3 H t' f4 H k% EV\ UN H g* fpb9 d9 H h H e$ H _ P y! j5 f` H R H k H f H p H J H z* fb H d fx UJ H _ H q& ju7 H M H w4 H J H D 7 j0 V5 K; iC; H J [: H {Q H j H F# i 'A6 H }$ 7b6 7Al0 H {J H L a 'h H u' i t H h G f2 H A" i E< H [% j| gb.  W. U5 it iv i ' _ e8 z6 i r= f T: H X h n h S8  A/ i A0 [a9 d/ f e2 g[b i Q1 H X H s fh: 7Vf1 H l is9 H c H ? f 9b* _ q8 f A d ` f z8 [O i B ^ [ u e i y jR T4 ju H Q H q! jZ; H ^8 s J H m% h 8 H k s T H J H B4 H e< H ] H r H |' J1 u x jZ: jZ3 a _ j~7 ji h ^; jZ n _ dM9 jJ6 H P I n jY: I o jP6 P c fG: "E: jo/ jZ gr gN9 gt gM2 jq jp jo jI5 jl H %f H 'f f Z0 jk jj jE6 h Y6 jB6 j@6 h H: jx5 H \ jo9 H g* H H T9 H p! H e( H d' f Y= h e d L H M H v H S h U2 i j2 P2 7D; f@0 i: UK i9 UTI1 UTS: UT`8 UT_0 fb U/X; UT`5 UTb: C8 UTa: UTP9 UTm. UTE2 UTw7 U/V0 UTi0 U/k2 UTn4 U/K1 fR fy/ z/ {/ [ Uv H M+ [w [`: [| H _$ fS \T H _" H T H S H d H w" Ug fh fi H z H u( H W' H D+ ^ j4 H b" H M H R+ H Q+ H p! UC/ UZ2 i g= H r$ H ~ H J' H X% H t* H _) i R f N s X. jU jY= jX= jy; _ F0 _ ,w H G" jB< H G' H d h a h e s Z f Z) h K h x h |8 i mx H @ f Q3 S1 i J _ L f` U] _ M h F: h N h O h P h Q h x h Z j j~ j{ h Y h |2 h [ h M h J h V _ df H M; f G h H H P; h J s U; f V; H J ` w' H S H yH0 H v h , H \ i  H L i + i b= i q; H J= H ~& h p H A2 i n5 i V6 _ W _ Y _ { s c4 H f, H ^) H ` h ]8 u |4 i D4 H O h T i C9 a ` fM jde7 u v t; e0 ]; i v8 H d il s U H q h _ I6 i u! i Zg8 u : 7I@7 7Il 7IC7 i A< 7B7 7o 7[3 7_; 7Y9 H ^< 7I6 7I]/ 7n H w* H x$ gs H z$ H |" gr H l* H x+  ^.  `. H d* H C* fX H _ H r H _* ] H s# H @= ;}: H r< uE; H N' H h H D H \ H L& a c a d ^ A h V h Z8 fe6 U'B/ _ H" Ut: UX/ Uo: Up: UJ/ UM1 UF9 U_2 U^2 Un9 U} _ G UF UG UH UI UJ UK UE UL fr/ US3 UY/ _ [$ UD7 Un: Uu: UC fy: Um2 _ i UX: Uf6 Us: Un/ Ug2 U~0 _ ^ Ut9 Ug1 fl9 UK: UI7 UD6 UD: Um: UM: UV1 h K2 UR0 h r6 UUl: UUk9 UUX3 UUY8 h p6 i y# U|q: U|I: U|a8 U|w: U|g: U|N4 Uv: i * i m$ U^N: fM UN i  U[ U[@ U[A Uo5 U{7 i x UPv6 UB2 fR UD9 UUr: UH/ UE/ UPw6 H F H I H D H W" Ez H X% H p! gW H g- h i6 i N H Z" H S, H E+ g_ H Q H R gZ _ Z G [ s Z _ p= i ~. i \/ i `/ f i h G8 i t8 H tB' H tU% s Y s F ^ ( i B* i r ^ A ^ b ^ U _ Q gh gg f P iA9 b/ib5 H p! X9 gi i K ^ R5 7V! s Q8 7T! 7U! 7c. 7S! f @8 f x s b2 EVV EVP EVw/ EVv/ EVT EVY H L= EVU EVX EVN EVL EVM EV` EVK EV^ H I. H H. g[a H Y H L' i N6 i M6 H r& 7p 7n 7}0 7o 7r 7n0 H [* H D- H m, H \+ H m H Y0 H X8 H F H C H B H x i 'i! i 'm! i 'k! i 'l! h 'G" h 'M a 'G 7m0  _. a U, i J7 i a. _ .F2 h  i c i z i v _ z i n8 g[g i { h `! jk7 H p H k8 G W G y f_ fSz URa _ dS5 h #T jV jC< jd7 jG fd= EJz fK! fH` 7GL! ^ e, f"}/ iDa7 f"h: 7Bb7jI:D lM dz9^ *CX s[ @> etil P` gjo =\Y Qh =Pz UJ h B\ s^ @>|o oI@ mI c ][ Jrx rj \z mI YeZ  b CN =SQ a vz o @>lTi E} _\N &c\ =Ml z a LI P d U \y pyH A @>YPP u y` uY {k l Kz pE @>)VU @>D e u \D R va @>r =OA nP @>@>La \q @>zH@ gwP @>xH` np `~ $VN }] @>@>zm @{ v J \Z W h Ly @>I @>X og wVw yG oKW @>@>?hb @>XJ J T \c @>r @>@>BA ~Q @>Gb v s xb C je ~ c t nNW pe E t SD YqT Ed @>ns ]\E =HS =Gb @>pq kA eQ ^b @>GVr zMB Q ph_ `p d E~ "DC "`S xMc Ur -bA RcQ b @>@>#Dp @>#`@ @>@>@>R\P @>@>t^ rm D~ $`O T_ To @>N  eQ @>Nb rt \C n\Q |b @>\t HUB yR \c @>mq Q@ FP @>\^ ]Sl `| RoK {Z kj Vz {J RuZ \h zv 'zD \T Lb @>@>@>Tr @>HxB @>@>>qQ lx` >@p V@ \N Si] t\F T @>kqb =Qt "aB }R @>wb tq G@ #aP @>`` cp @>@>m@ @>^O Y_ g\n n| @>YSK [[ @>Sj @>wrx @>Rbj @>lz wH @>oX Di Dz ^J ZjZ @>@>@>:Jj @>$[z \J \jX \h @>@>@>tGv oF @>GT =Ld \r @><xA @>=LP @>x_ Eo @>.\~ Y L @>t[ Ej Dz @>guK `k] @>@>} x m @>@>HNe pY t sE QT { vc ,CY Hwj @>uy @>eH VY c h Sw yF GU Pd {{t YtE )x U ]d ls { dB X f \u PC \T @>tb @>uq p@ \O ^ ] jav {D @>TT ud \u @>eD xU @>Af Vw :tF TV qe eu @>BF @>@>*`T *Dd Vs (`C (DS Tb kq @>@>fkA @>TQ w\a Ho f VPP Gu` Ho { @>G\N a(] @>@>@>@>@>_\E ~S wb Ylq lA EP h` {p Zt lN On^ &{L d\  `j J YsX g lHu ~DE @> LITY@>TiExxH@>\V@>cd@>@>*{s5_BUR@>@>@> ^aRqT @ AQ@>waMq@>N@@>ZPO_oD@>@>Z[O!}]ZAle |GL=V\t^ma|@>ZlL:z\6jIy\[I\AW\lgdw@FU_f|v@>@>{G.[XGh@>Fv@>@>EEGTqd@>}us@>@>PD@>GT@>@>1Dd1RtsD1CSQ ub1NW@>1BfzulE@>@>@>@>,PS@>@>,\d@>Gr@>FB|Q~` Io}@>kO]^@>Fm]|LK@>}[Dk@>G|'uK\'pk@>P|NLG\slizGJ'\Yj'vy@>@>KZIGcRs sBgQ@>{bfy pF@GOy^k hmLUDe`seC@> kRsbysrBoRca{oy} X]KPNhbv0LE ~sQ1eD [idxVcG`j@>`y^IpXygxwUBFfz H@>\W`emu@>ADfSRra]uqIIBkK]UZBi@>@>@>@>@>!`x@>@>GGkVHe@>Y tknC@qWBzRjvaBWCfBuVDtSgYb[q@>k@AOgj^@>dqmZ^smJc|$^_bYoR H\JVUdDrFBHR@>bbkMp^ A] P@>k _@>`nc~j N=p_`MoU|fKOc[]|~@>szzLst@>@>-OgZZv@>Z`E ^@U\ZU\`d@>] k,t^`t`p`@cP^_DoFHORg_RZnXqME]^ n[ RePqb@>}rHBORg2buTn}cPZrkWL@> xc ita CnDRma_ pD@>@> hO@>@> g^YXmL|YOLt o[bJ@>@>@>BYbhp$sgxa_DoFYROdx^YjmH}jMm e\bkAFPG^dl\ |zK \ZYAjIzLIuYykBz@>MK_ [@>tkqy@>k]GtV\e@>M uL E@>yWxe@>@>@>@>ZGsVLC@>kc RC a@>{LAp Qq@>Z$@ [@{x[ujPy@>@>AgHtW\ MfHys{BA@>K}PK `{@p@>wP O<N_@>c#muP=Ka@>E $p@>=ITcN t@>YwC@>YDSacct{HD{ER`w``DpJ`@R YP@>1Li1Wx{mG1Y U~$Y @d{}d{|rtV@BOA`{wo_ R}{bOviwz` AKp L{r[|k}z{qIp s;W{pJ@>{vZ{xkkyLG~U{dd Sr@>{o@@>{nN e\ Sm@>E I|{mESS!^b@>trK Y@YiL myk^ftuYVCYIS]Qb O nq@>@> T a_]O@U P P]H`]LpYr@@>YQOka^@>{[ V$odEgShakol}`KD\ MYLf@>@t@>@>U C@>f AS|Tscdqc@IPp_`m`h}@>@>{ Ki hej hM@>@>{ueD[ RU avp@>o AeO@>@>@>@>@>X `kn iol Xko pgm W@>@>p hekMH]q {lVg `vk$EkiLxw#Hs zk@>Tj eTi tTh CkQ@>gk_l@o A @^PnA_@>nuqd@gOh^ zmv|@> yKn [k jZw y S xPIO YW snSB@>LQ@>X aRd{bM] kr^vPaa@>RXr@>kA@>\ P%O@>Pt`ClS&vaveo&u@g OOkI`Ba iSeJjVojT~cM| hN]Fk]VE\m[@>J2kF]lm\^{CKZGK\PgHvZmOHO_e n_mD@>Z^C@>@>@>@>@>@>IlS@>dgMh[kilw@>@>KsEVQ x-SIM{XNtS-TG-ZV}UhP@w@>RYwRTP}]d}`t}\ DuT@>]$fH} J@>tG1{V@>.{fsvT E^_@>@>@>mm nP}ZL@>D]vmmo ~@>eM@>mq ^mr mms |mt Kmu Z$ci`Yy@>S RT aV r@>cmCZpsBggQen b'ZPmblr@>HBV Qfp`goPs`N!k^!ll`zUIPX[hhGw.w~i@N.DNO^.`nV~^L0{ [zk{{|L].^nD~5xM0w \@m@>@>@>0x |@>x KA[Cj@>0y y0z H@>0| W!Mf@>u@\ Q`a]qUA@>ZsRP0} b!vq0~ BZtRQec@>@>u]t@>mQlaxz qpHk0@ z@>@>apHI)jQ0B `0C o0D ~)M)|^){o)z@VP0F _Fn0H mGN|ZJ[Y]`hxH@>]\ X0I h0K w NF0L V@>0M eJbt{V{ecc uCLCD0N GMsVNI^HPkW^B`QA`'_n@>P}^MX^\}zNJuZZAkp|@>ZlK@>q\ Z Llsx F(G NWo ?MF h%SLx D$G nCkhn Yi|se _ 's AnZ@>sH@> C] Wst@> J C CRR Cd a`s DS \ac E D FM DN^ kl It| jps@hpaoOpLR ~]p?UP@>@>heY ujD{S!R:cp$!s2]sO!nN]!_k@> Nh~@> Hxf@>@>Wr^WqnWp~WoO@>@>!R_w6DMn!f{!eK\/q1[ H;L![G@>!ZV@>!Ce!_t!CCJoR!YA!XP@>@>@>@>@>!R _!Q m![{sI!lXDf!kvC|D!jTB{b!irAz@!hP!g^!Tl!fz!eH!cV!bd!Xr!Y@!aN!`\![j!ZxLJ F!EPj_{nR:~p$sgx@>Vu_ N)T@>@>E_}_X`\s|sLnNZah@>@>@>@>RY{@>vkTrqO@>in_pMo^@nwU~ZSCbr3q_d1ssCA\IPYY^hR wQ E`S\ c[sWRAlS=saMNosM}kJjXrHfinh|\RJg\TjfxeFcTbbXpTH~YFaTi[b`}[KZYDg@>@>Z{vRqF\{w ^jGsqjIA^H$H_Ul_S{_`K_\ [_uk@>js| ^^%Kg6pSoCRnmb@IkStb@>@> k^%Vo6{LIJqfQSqKadp$s]EvsbnNp\ &JI~~5&v ZGxsaq &`Tou &]yCw &sM|z&RxI@>]?fA@>@>_XSgWz@>?:MO(G^o?:~O(x]`@>EoqO~rMS^sn@>q|pMP ^^o|c JMi Wsfn3tfFgo3mf?`d _RnQ}[LZ[CjDyV HS YR hK w J:F f $@ n@dPd@>@>I sx BfSsd \'r@> WAYxO,ZsF@~0U@> J ELDD c+Hss b+Asl f(zsb epqsa]?fp_XSVsinNw ` EsDES@>=nf@>@> f $v kDZpr^?Enpqs ekCsnpp}poND^ f\msICY cdhsLB[Yj bHxs@XO RX]WuVCUQ@>kbl j|u{CzQT_dmr{| JeX ePfsvBEfSia fZosI cdYs}PLDZ bHisq@>@>@>s@h{aoOp${sN~ tQLs]p,kuWv Zery sx{nNFseT L2y@> .Xxk]{?Wc.Qiz.RBc Xxe_{XU]Q\rR5N XxC{w{QiN@>@>@>@>@>@>@>sw@> rH qX ph oy{KI{WW{Ie{Hs@>JuA{Gv{FG{EV{DeEPt{CD{AS{mb1sq{lA{kP{_{nn.{}{VM{U[snk{gY{Tg{Su{NC{FQ{[_{Em{C{{JI{GW{Fe{Es{DA{CO{v]{Gk{q {{AK{Y{~g{vu{tC@>WsQO]_ l:|N{v_h q DvY _OO p ^^mo|hskq_yndX@> H4|dspAd@>gscr qsG.d@>@>K7RLrIos{oLI \HYT amqSx@e x:@dH|la{xsKTc[zs~ScN@>-Jbq -HPS@>kcdgssZQh-\ZxPRObm}jrs\@> -w3kL}^V[@>@>@>@>@>OimR0ym_i 0NOxsGPVOf0QGvs}QKP[g?]k@>gJUH@>gSS]Op0}R@0SWR ?,i@>gn.UsCg{gQ uVx ScNg@Kqs|M[MgQ?h`gsvbJD lhNZJbvZn.XsFZ{fT K^zb wXZ@uO StD @3xZ?:kCnea eSFdxB^\ oRz'?AL'JRM'n._sM'@/\` lKsw'Sb E_ L gF|s'L]osL'HBZxm\SIsY\ huxS FI@>@>@>zO@>@>@>@> ~Z ]VLwv CsLr[@jlx@>@>@>sG@>RujUGx@>RSkOsz@>RkaH@>RJji@>@>@>@>@>@>Re SRf bRg qs@n?}NnJdKnn-oTuN\@>TScjsMF[TkCk@>@>@>@>n{Kn@>@> nBuysnF|krLn@6~st^Cn^~R)~ DP`TN Zcz y}{ nv| idkpMv/\} kKkJuvkXLkk?hwkS 2_ nfQ~ Rw@ RI BF[$^a$\q@>M 2@@>[2rkQ[d@>K L@>@>@>@>@>@>@>+SoK\+z+fDe+K-ikOmV9SdC S~gH 1eAsV9n*e>^O@>^v^@>@>@>@>@>@>@>9K1TkQ\EH Da@>@>@>@>J ke@>@>@>@>@>tPCH^WsfZGt@>{i4f{Ysa@>@> i4zqZski4D^i4v>b `sX!i4qh!i4kY!p6D&@>/p@z& /Skz&i4 e&@>i4ed'i4cAI'i4Dl'HJ1p)HCha)psI) Hh iW)Hp$@) Hn`d)i4R D)#i4uV)J1K)C3|)xso)d d})|i4Ba)a xc)@>i4QT[)Xel*@>@>U `Q*)i4kq*L)\,r >E,-i4}9C,aX@,@>SlX,d%D,Li,]y,}H,i4@V, qV,i4XG,~_,@>3i4Tm,:i4cA.i4Td.F Yx.@i4OQ.Ci4|`.Ii4D\.'i4pJ`.@>J P/Li4x `/Ni4nJX/i4AF/V qG/@>@>@>Vi4Ax/O y1rI1]i4GX1@>@>i4B_1&^ ra1)i4q$S1@>@>&i4D@D1i4pH1i4Yx2i4vQ2i4cG2e ]j2ei4xG2i4d2g ac2i4D2i4uC6Zi4B!x8qi4J z8ri4L D8i4K P8i4b`[80i4`x}9i4P]:i4Hm?i4Hu?i4I}?ki4HF?i4_N@i4Qm@[~@JxL@XDD@FIH@i4oXQ@c@A`PA^`Ai4@oAOboAi4xQA@>i4FIAk[OAu ljA@>sVAi4RdA@>PvA@>PEA@>@>PTA!i4|cA@>i4w?_ARwxVBmi4]NB@>i4pkBfX:[Ei4s;sEi4xfFi4H^GEqfGi4a?WGi4RxHPJH\ P@YHi4DYHZm]Hi4yJHsCIni4[OSIKZnJi4GHJcJOJi4@YJ?+XKT \CK@>i4F _Kxi4seKi4OXKi4CgKti4{jKi4GeKi4VlKQYBKi4Q[Ki4DlKi4vpK@>@>@>wfKDvK`FK^VKSfK@>fQtK@>@>@>@>i4~EKRkJ3CKC klvKYJbK!i4f1lKpVURL@>@>@>@>@>@>@>@>Y g3gLG#kIZLi4UcL^i4PxL#i4}HLYi4>EL'i4OWCL.i4qRM/i4aCM@>8i4CdM@']SgM:i4AzMLi46{MHi4u*qM i4~_fM.SdN@>'tpsN@>qL'AVcNY 'g3yN~8PNlN9PzN@>v8kUJN<P_N@>@>@>@>_i4WoNci4XFNgi4z.^N@>@>ki4D6XO@>Ki4I\O@>yqeO@>@>@>pi4eVOjv {QRi4bTKQSfmQTi4G SR}fZRu@R@>v|PR@>w{`R{i4NpRxz~R)J?NR)HFMR}i4JSRi4f]R@>7i4LCRi4LOR )h =[Ri4HXRcs`R)LenRi4LSRi4A_Ri4D`R,i4FdR$i4HjR@>@>i4nrROv `R3HapR3Q3QR3R3DR3S3wR3T3jRVHa]RVQ+~RVR+iRVS+TRVT+RHUjR@>HURpHpTR@>@>@>@>@>@>#W!@ DR^{ kDR^XRoR^YpAR| yqR} `jR~ pJRW!ozStSiS V|SX_ RS@!kqSA!p\SB!pLShy|S]`uSUpUS@>@>xoDESW!EISpnNSoS|SWqOSr@!E@Sr{ nESrA!SsSrB!qFSqZEwSqC!n|SqD!ijSqE!qSS@>eW!DDS@>@>@>@hkHT@]RsT@UpETH!yuTI!`nTJ!pNTme~Tt@cT@>@>@>@>@>@>#W!~cT#traT#o~ST#S~QT#Q{OT#pSJT@>@>o]TtF\TM!UbTP!\wTtISTW!M\TosiT@>@>@>@>@>@>Wr\T@>teNTW!YsTofLUnrUTDUA&TUTeU=_3uUVH1DU &SUc \cUsrUD5CUi]SUp.bU sUPBU\RU[]`Uw\oUa$\!h~UI-AfU]gUD)evU{@2[Ui5lUpG/}U]NU;]]U lU e|Ui1JUZ ZUujUcx{UMKUuYUO3iUm+~zUHxUj!HUsx4YUwW8gU \xUq/FUl/WUd1hU\xUL3GUA W1WU\gUxj5uUn1FUt#G,uWUe+_LUr+okU&ZUjUc:xU;{IUd2XUc:gUZ\wU! _8FUF8YUw2iUp/xUlGUe_8VUPgUgwU, FUy5VUg,reU \WU L6fUj*_vU\UU^ScU @%rUuAUR9QU>EbU}!|rUunUKE~U7]NUa5]U]lUcB8{U kKUp/\UkkUSVzUE-`JUTjU `zUBKUsdZU u~U! U)OU `UK\pUXAUR>@UQK~UqIUp8YU`iUv*}xUnuUEUh)ETUSYUVo,iUPzU>\JUt3YU]iU [xU PIULXU]hUNQ6wUTFU b8VUTfUg3vUwEUpTUU_J5eUMuU5 ]CUPSUZ^4bUPsU]BUQU Q6`U }oU`U POU0 \^U lUP{UKUp8YUa'iU xU\HU9VU! EeUTHuUKI;DUSRUKLbU>I;rUdP@Ul PU5 \`U RnU\}U[,Q KUH\UX$lU\PUE^U@>uQ0nUv\}Uw3KUJ \ULkUL{UV%KUuP0\ULlU! K4{U \KUp5YUhiUp8yU\1IU6e9ZU6V4jU7&zUg6JUqT0ZU@>}n6hULxUPHUp1XU/m'iUgHwUnHU p%XU! {gU1 wUTFU{VUPfUWvUj7EUsTU{+cUt4qUf8BUPRUe\bUXg qULAU PUP_UcoUB8~U UNU@^UdHnUe }U#\LU\[UZa4jU {zU]JU }YU\iUp5wU N"dGUJHkUJM{Ug5KU['ZUc8hUlxUF&HUTXU}gUNp%wUNp2FUnu9UU8\dUa1rU{BV y-QVJ#`V{qVF,A@VkAV-F4QVi `V\nV{|VPLV\\V\jVr`yV}IVv.YVwhV r!s xV.`kV\{V JVxYVShV^vVd[0FVG+AVV\WVpPeV_[;uVxL2DV ~5TV{B,dV{\uV=VCV"\SVQ9bVpK/rVPAV&eQVZHaV_xqVH@VC6PVk`V kpV-\@Vc]OV3B1_V E3nVJ\~VuLVeH[Vc"gkV{^$RV3C1`Vl1oVX2~VW2NVkJ^VA L,nV\}Vq.LVX2]VP%mVf+~ViVN.wVm\HVMVVOdVk{4sV kDVF\TVc1bVx3sVb1BVNRVkaV\pV+z ~Vs7MV{\Vd8lV`|Vq4KVr{\VuN0lVh"{V.{LVon2\V)l4jVj)xVn2GVLVV! L4fVwD1vVekDV\TV bVW2rV{2BV\RVk`V\oVL)Y}V\VV\dV\rV}\AVJ3OVV']V|{lVE9|VJ3JVp8YV uiVo6{VC6LV {\VF6kVU zV\HVkWVxE1gVMvV DV\SVc7aVF6pVxF1@V\PVV^VC6nVN3~VLMV j ]VeT/mV@|VlKVKt2ZV`iVc{yVe`IV8h!YV\\hV\vV lDV\SVd\0aV[\qV B"VPNVz"^VB8oVM@VVG1PV{`V`oVe\6~V8f!MV[VTjV\yV\HVc5WVz&eV\uVo8DVf5SVTbV\rVd]0AV{PVS;_V\nVo8}VSLV`{\VHlV\|VU:KVE[V{kV)h6zV\HVl\VVV"]dVGAV>t2QV ~*h`VCHVN"uXVZl#MVs6\V5o8kV{zV^`JV.T/ZVS/jVjyVZIV{WV#[gVDwVuO0FVPUVkgeVDLVrT/\Vp4lVS{V X-KVm8ZV_`0iV{yV\HVB"WV6Z fVz7uV]{EV~4UV6WdV^5sVnr4CV7\UV{cV@+yrVRkV{k1zVO*tJVh3~VR/MV! F4\Vt!lV@zVZ1JV*GXVhV\xVUFVBTUV*\eVBVsV^g0CVi.TVXcVN/qVj8@VmTOVkA(_Vu3nVM/}V lLV[VliV]xVfVHV]WVNO6gVMvV pFVktVVkeV^0uVr.FVg WVB3gVZ{vV`FV^VVh}fV \vVhuDVjSVa6cVN8rV`BVQ]RV O6aV D3pV\V{MV \ \V\kVa2yV \HV-\ WVv1fVttV! jDVlTVQFcV\iVVwVp5FVXSUV\eVl2tVF"GCVkJV`YVkiVZ[4xV^FVZ`VVZ]4eVZ\4tVSRCV uRVd:dVMvV PEV r8UVkX0cVb4uV!o2CVJ9RVHcV{esV:E5AV:\QV{bVh0qV{X.AV{PVY4_VvspVkz4VX4NVvk_V_3oVW3VkOW_WunWxk@W hPWwL^W PXnW{FWy4VW=VfW=TvW {FW{UWA8dW{sW/lBW}{QWt `W/mpW{{@WF+OW{{+`Wy{nWM}WLKW@-YWMjWQyW GGW`VW{|+fW{}+tW@{BW K0QWeZ6_Wr^oWtuW@NW^^W~)onWB{]W}lW\|Wa)JW.^[W)k6kWd:zW hLWLZWm{jWl{yW{HW~"WW4fWj/vWeB9EWc'UWK6dWdhsW}t1AW{OWU1^Wz.mWT1|WMKWl7[W9S6kWTzWj{JWB0YWh{hWLwWf{GWkVW {fWFvW IFW `VW|o8fWP3vW9\GWS'VW}h1dWc tW{&CWTQWgRaWg{pW9K6We]6NW@%]Wc{8mW }{We^KWL[Wl7jWMyWpIWxBXWe^6gW}vWIFWP.eWWP5|WR6LWY3ZWj7jWLxWE9HWTVW`{8fWb{tWa{CWr4RW ^0bWpxpW{ j@W]{8NWmk\WT'lWp8|WILW|5ZW[iWDzWO/JW{.YW^b0gW}9vW^FFW\2TW kcWTsW J;BWTSWZ{8cWuqWPAW TPWXR`WH6nWL&S |W3A1OW3@1`W\8qWp@.W H3OWS^Wv1nWT|WpL/LWPZWPiWRyW p)WGWj8^WP/mWpB.|WPMW `t^WI3RW<v`W@>9oWgWx3NWh]W! JHlWA-tWR%EWS%TW|3dWT%sWK,ACWu5DWI#SWv5bW O$qWaM@W#wMW h]WplWD*{W gMWv4\WkkWLzWH`JW UjWjyWN2GWy.WW ugWx3xW@:GWaVW]eWuuW\ GW`VWm)fWw.xWpHWPcWWZ/zW}3IW[/XW q=fWhcWUqW\"Ww.OWj"_WSoWcW'o4OW^WnWl~W_#ZMWgWg"wWz3FW2UWu2eWs2tWr2DWM-~SW6PQWx(aWM8rWnpAW^/SW&cW<]sW ZXCWf3[We3jWSyWr7IW \'ZWv3iW&xWZHWt1XWIgWq7vW]GWp7VWk@(gWK8uW GDWTTSWPcWSIsWn*AW]PW! l_WKH;oWcd4~W \LWU[WSjW`zWuJW\ \Wce4lW!|Wc LWI*k[Wr&IFW!i7OW^:_WJ*koWs1ZWljWUjzW`6HWjWWs.gWRvWs f4DWk-mTW{V#AWlsPW{a$_WlkoWkWt+OWI_W~nWM.}W:DLWl-H[WhcW{rWxt4AWLQWxQ`WxG5pW{g+WC"PXD8_XG5mX |XV,LXrP[XK5jXyyX i2GX/g VX/hfXv,vX/\GX}hVX{u+eX|{uX{w+DXb'TXE%eX=utX=UEX{{$TXyheXx{tX0UCX{~+RX<E`X?{oXrd0~X@hLX V-[X>cjXVc3yXVb3GXuM0VXuFfXhuX.d0EX=`3SXucXa0tX{e"EBX_5GXc Y1UXi/eXe[6vXTFXVVX1U3fX)j6vXE%EXOUXIEeXd5tXe5BXx-nQX}&XI2NXp]XKcoXh-~X}H6MXi \Xb+|jXZ'fXP4tXP4DXVp,TXO4eX]+ivXI_XA"$nXyRXw]bXK5qXA e1Xd6MX8i!]XW5lX]5zX/IXa0XXcfXq6tXrTCXrVSXA R-cX^^rXaBXppRXpA;aXqXR:AXk.PXpj7`XP#_nXW"QMX v^X 5mX ]:}Xm6NXR]X`lXu|X^LXX\XXlX^|XbhLXchZXN#hXnwXZGXXWX3~,gXR*vXep8FXS*TX3},dXT*uX3|,EXW*VX3{,fXY*wX`T6FX`i7VX`@5fXg$ouX`dX`tX`DXx&SX^SdXO%sXh$oDXA A*sXoVDXA z)TXA [1cX\k/rX\OAX\c0PXT+T`XoTtX1[+dCX{*hgX\*OXvV^XxAnX{$q*g}XvTdX{$o*gtXVq,[X{VlX{T|Xc#h*jLXc#f*jvXQ`XHoXf+|Xe*A{XX1|X`*{JXf'EX{J,VX]*gdXePKX{A,[Xc#i+jjX{@,TXV*YcX{z+|X=SKX=`[X=\ kXe3{X{C'JX{`1ZX9kiX{~xXf3GX/IVX{\%eX{m1tX{N%DX_hRX i*`XVoXv5~X*}MX*u]X*`oXu5X{|$NXS.^XR.mX{L$|X{M$LXO.\Xl.kX{x1zX{y1IX{z1XX{$gXL.xX{{1IXc#k+jXX{}1BX9QXV2aX_PpX{u$@X{$NXc#M*j\Xc#L*jFX a0pX!T6~X e'NX!@5^XP"mXp3~X!MX!]X _'mXR"~Xq3OX! m^XT"_mX`2LXG*g[XV.BX q#gPXr3wYs3FYE*qUY ]'FYn+IUYq2^Yy2mY U6}Y R'LYp8[Y|3jYA"IyYABYV.QYe3_Y p8nYp8|Yf3JY \ YY `iY SyYlIYc#})jYYRCYc#|)jRYp+I|Yw$EYs*SYw)ybYe3[Yf3jYS"r yYjkYLzYpC.JY\\Y6jYpA.yYe3KYf3ZY'A'iYp~-wYpz-FY3PUY@4dYD,btYd)OVYe3eYptY}CYuSY`eYf3uY-o%DYHUYFeYDuY`EY-hUY]){cYu4^Y-PnY! o%~Y[)yOYY)EHY! P)MY! O)\Y! N)mY! a~Y! K)OY! J)`Y\ nYu~YA PY#S`Yc oY`~YV)GMY#`TY#DdY h'tY^EY\UY A dY`tYm DYl RYc#F-jbYX LYo \YU kY i'{Yv dKY[ oY`Yl3NYN2]YLmYE)}YC)LYg4[Yc#J-jmYn3WYo3hYd6yYO2IYR3YYNM'hY6xYn"GYpWY$}4gYl)vYk)HYi)WYA4fYc)xYb)GY'_(VYmeY/k'uY`)EYi"TYjeYNv-vYNF'GYy7 VY6IbY8W4qY@&$@Y<UdY>TsYp8BY>VPY p8`YS-mnY<u[Y<VmYFW4|Y|%$KY~%$oYwSYB&$cYCY-gGYNZnYa#@YDYYO"#iYy",LY DMxYI&$EYn7iY r!IzYOZ-gCYK&$jY `NYm7^YC_-goYOd-gVYp8}YPZ.LYCe-gZY zAYOf-gPYXUwYXuFYF$.WY_HEYi-JUY^G2_Y koYk{#L~YI%$JY tnYj-W|Y A5SYo6bYmrY MyAYhlzY^JY]ZYp iYgA5xYK"#GYlQjYn!$yYlP]YlOmY:L;}YrsLY) ~![Yv+iY) D"yYvQHYvPWYvOgYu^wYmh(FYmg(TYxPcYOq-gsYxOZY`jYtzYw`HYCr-UWYL#lZQ{Z]1KZ\ZPlZz`{Z|PJZ~H5YZO ](hZO \(vZO [(GZu,VZO Z(gZO Y(vZw,EZO X(VZO W(eZ{%tZO V(EZy,TZz,eZO U(vZO T(EZ~kTZl6bZspZ0i,Z J"#NZ0Q(qZ0P(@Zv~OZ0O(]Z W-lZ0N({Z T-JZ Q-YZ O-jZ0M({Z0L(JZuL0YZ0K(hZ0J(wZ0I(FZ0H(UZs-HdZlZ0G(|Z0F(KZt-CZZ0E(]Z0~'lZqS0{ZqFJZCu-gYZy#@ZTOZV_ZZ5oZnW0@Z[5NZT_Z> o"aoZVPZl8`ZP8oZj7~ZU'MZOK.g[Z \3fBZkhZkA'xZg!FZ8l!`Z8k!oZ8m!~Zo6MZ8e^Z8M mZh5|Z]KZz5ZZ{5jZo6yZbIZvXZYafZH9GZSbVZH9xZ^yGZLVZC'fZD'tZ~CZ~9RZkaZkpZG"}ZL|ZvLZx[Z3,jZXVxZ LbGZ SNiZXdwZ b#w[Z V@RZrXdRZ `#uvZ D&PkZ Xd{ZXy_ZXyXZqXdQZE&QuZ o"tFZ XyzZ ]#IsZ@Xy|Z X9uZXynZ JDgZXykZ^XydZ, \#f]Z, H&fCZJCiZp ^%IlZn8o"bu[p h#T W[p JQk[ H*w|[L8J"ls[ ~_[} a?m[r& N"\l[{p8H[S, PHW[}La?_[r&LN"\^[p8z[S,LPHI[ !N$pQ[Q\A[Ky][ @V[S)d[bD1M[ \1~[f{N[d&2I[T7M${[ q&X_[z6r!uw[p!$l[}a?P[r&N"\O[p8k[S,PIz[sC[x/ZHQ[sY[r_ 'g[ &N[w*s][JBP[ X3R[ q#wE[ r1|[sK[ h NY[sg[R>u[ s!Us[X,H[st[ l:B[ E#d|[O"i`[ [&4I[C}[s|[q$VJ[ A">`[V$b^[ s@[sN[ kM][W$cj[sM[s\[ o$Vk[ ReA[sf[g*`t[ O&bT[sv[uD[sV[LTd[Sx[]$FF[k4L[s\[ Q&@>zR;Z\@>U9U\@>@>zR;f\@>H7&F$$a\A&sGE\&|'sL\ pU$M\sL\G/[\ ~ ^9k\ B.d\ ~ dzs\!@/m\Wq1~\Z"BL\Wu1N\W^]\q Z"Bm\W]o\WE\w$Q^O\v$Rvm\Z"qc\u$XDT\lCX\w&O[\ m%Wj\sA\m4A"]O\ Z"Cl\`n@>@>[0{r&PM^|#z]^{I,W^se^u'ts^{h%g^{f%u^{c%C^{b%Q^]%T _^{a%s^{^1A^{_1P^{j1_^i3n^{o+~^{o1M^ q1^^ u1l^Lk{^ sf^x#gv^QC]^v)y`^ OY^ Ni^ ty^ MI^{d+Y^{c+i^{~1y^{1H^sX^{}2g^{|*w^d%HE^sM^s\^x$(l^ D.\T^[%Up^sE^s!PS^`c^ur^}D^e%ST^R'r!%g_B%KL_`W_uf_}x_R'r!%H_r gm_S&oT_E$CC_i%LF_E#HR_ [&,Z_- sF_t)vT_kXJ_ e$Fb_C_h_j%J G_sQ_z$S`_ss_|"]B_s__x+bo_sQ_l*db_f)FF_sL_d*e[_s'^@_Z*w^_sU_Zjd_e)FN_ sT_K%Ld_A$Cp__*:s_sm_s#t|_sp_N'}~_ -XQ{_-v7L_ -?:C_-Sf}_sc_X%lq_s]_ O&sk_s^_k4l_ Q&G|_sC_! I4Q_! J4`_ f#Ko_sz_! Q)H_ f!uW_ VL_s[_ G$xj_sb_ {"0p_! ?y`_K3Y_ ! Mzh_! {Ab_P*c_M3r_ ! B`A_Y z"a_i5p_! @/@_F*o_^~_! QwM_{)D_! k#2S_f\E_SUa_H)v_y)E_x)T_{(c_y(r_w(A_Z4P_s(__r(n_q(_p(N__4]_`4l_o({_m(J_m([_l(k_k(z_j(I_i(Y_m3h_s)w_r)F` c:U`t.J4e`^#LY`q)e`@'*t`gX5^`g[#SS`n)f`{3x`~3G`ZX5V`Z~&PK`)s[`3j`8 a)z`Q#J`E4Y`X)h`W)w`G4G` q4V`H4e`q%u`T#D`|&qS`w%cD`e#{g`?ob`nXsQ`=sD`nHYR`f"~k`}( c:mas|a X,YKau(sdaz_Wa<o6va u)IEap!0Nat P5~asMa5 o6\aa"fkas!,QaQ"_}a`"a\aCo6}asLaYiZa J,Ca B)goasVaL'Gda o'Dkasoa p'U~aM"[SaPnaD+-~aska Pya hIa^!cWa q+wzasqal"caQ+'basIaR+'Wa T'~asLa s\aslaF{akKKasVa sea\zta RQ*_nasMaRa \aRc kaR_za B'OIa U%XXaspaFaRsOa kc]as@a B#_Oa JCna)J'RqasCa)_)UQaPfaq!zuasoaI'[}a)X%SXbskb )G)gzbsab)C#mpbs]b)@*slbs_b )}#SnbsAb )A)Y/Pbsib sxb )fkFbr ]qbs@br%kXcNb)r$^qbkQ]ObA(kfjlbsVboPafbPGb )u*]Wbstb)t*uDb )p!.ybp!4gbr%Xx[bh&zSbQvMbRJ3CboP$vbPZcf&-icH8Vcr%XMec o6rcQDAcR5EcA(f(zcsbcHJ1qcLkbca&/Mcr'@|cV&B|cs~cU#FNc tTcr%Xcbc tEcQ]Sc Tpc Vc TOc V^ci4\7nci4\JcRI)rfc i4EXcr%NXc]c) i4g @cNQ]gc{)NV"8Dc$i4t|cA2NA"Mpc!s}c@N]@KcS)yKci4zDco i4i~d#^gdb i4jwda i4padJNF?QdY Ng3PdY2+P#aCdO*+kadd] i4pEdP i4rudv+kmgd0PTd+S2cdu+K~Ud> i4WSd +q&Sjd i4q}dr%'Xnd i4Fmd'QwsdA('f_jd:sIdZ2'W"PYdA i4_(id<sHdc8w#WdG8k%zd@c_d@`od@^d> i4dNd: i4Mrd8 i4Nd4 i4vMdIi47Ce)wzei4N)qe$ i4se! i4\Gre i4BNe i4nPPe i4G~f i4FEfr% X]Kf i4Khf Q\sf R5Of{) V"8Df i4L|fA( f(HfWspfR9 G"2fYsqfA2 A"Mf[sLfR J3ZfY2]P#XMfO*]klef i4yQf i4[JfC ]kNefbPsf]S2Bfu]Kxtf i4?lf i4:kf i48ef i4L]f i4Mif i4Jvg i4K@g; i4HKg i4K Sg~ i4V^g i4{tg i4vog i4eg i4ndg i4_Rg i4Cqg i4w$tgr%A XAkh i4ClhA QBohA(A f(qhzsYhyA ?:hhA P&gbhy i4@Ih i4bIh i4@khwA cEkh i4Rph i4SBh i4GUhi4n\h& i4:Jhq!QDh; i4;UhHfPhO i4~)vhp i42thi4:si E,gmi i4xTi i4jLi h =vi i4|sisoi dA}i i4v~i)QQti, i4bEi)V@giy i4Tgir h'{i i4UKi} i'`j ^:pji4 jj q!TijL-q}j i4Onj i4~ }j/ZM{j i4PHj i4LXjsdj i4Ntj /OKBj/G"+Mjsxj /g)eFj /C+^kj /G.BIj i4IKj kTj i4Odj i4Jsj i4>}j J1{j T ;lj C'gjsNj G'H\j p$dj h VHj S*^j nHjVGj i4gVj' i4E}j2 i4SBj i4QUj i4Sfji4Uyj!i4PNj&i4U^jq i4nsj4i4Saj tLtjp tE@jp W!xEjp oD}kSGAkQGHkmJOk SKYk QGdk mJkky SKuky QG@ky mJGk SGQk QGXk mJ_k SGik QGpk mJwk SKAk QGLk mJSk SK]k QGhk mJok SGyk QG@k mJGk SGQl QGXl mJ_l8 SGil8 QGpl8 mJwl: SGAl: QGHl: mJOl, njYl, S]Cl \9P`lYWcplYpvSlY{ wIlY@!Y@l @![Yl { Jtl#tJ~l Q!hHl Topl O9h_l A:oGl; oSvl; S_Il; mbhl& QSJl& p_]m& nb|mxtk^mxQDImxW!}MmxSbJm {6olm |6o[m tLJm W!qVmy }6oGmy ~6ovm Q!Cem Q!Ohm A:Iwm U/i@m Q!Oim A:Ixm U/pAm QPqm poAm oXpm { ]Hm mcem XMHm W!EUm pnZm oSHn Wq[neUo LneA7}{ne_/QxneVWIne].Y`ne|1Ryne|:xKne[iCnemDlneU/ipnetfYn G!fn y3fens i4aKn WQln oQ}n @!DNn QBRn p_Tn oCsn @!ovn { oen TgTn tB{o W!_}o So\o WoKo Q!gzo nbao | jCo } cmo ~ pPoCA!J@oCB!@ Jo {6SJo E7S]o nbpo$ F7^Ro$ Ytpo$ G7zdo$ A!l^oIH7fJoItDpoIW!wtoIQRko4 pR}o4 QTOo4 o|co#o__p#mQ~p#XdOp#Vdsp> \9]Wp> Zitp> Q!U]p> T\rp> VINp> [zWp> \sQpP W!EDpP tvIpP UBpP SLApP oVMpP mxcpP pG[pP QLbpP U/tnpP { wbpP XAYpP npZpP YsJpP A!n}pP G!BkqP @!mmqP \3kZqP O;kEq] |:hpq] VzXq] [IRq] ~6W[q] A7Wrq] o|Iq] \3{Eq] O;X@q] ]3XXqa K7Dpqa L7Etqa M7tyqa N7zmqa  zgqa O7[aqa P7k|qa Q7Xgqb hqb W{~qb B!Uyqb O;[Nqb ]3[iqb R7SDrb S7[Wrb I!Krrb T7H}rb U7KErb V7HPrb W7JXrb \3Xbrb X7Xzro \ARro ]xSro _/[Kro ].[fro Y7WAro Q/pXro Z7[Hro [7Ncro \7[qro ]7NLro ^7SZro D!Nmro _7[{ro \3XVro O;Xnri4>Fs U.YDsmN]s$Swks$WJbs$pVls$tgBs$Q@is$okisGTs\ds rsz.As@>c;Psd;_sb;nsA;U"A|sA;U"A}sf;~s{J:Ms{;Gsz;WsHfss;usv;Dsw;Ss|;bskqsu;@ssOsp;9^sr;WsF<fs{us]Dsp>{s!CSs~;%Vss{s ;7Is~;%@sJ<esI<ts/V<CsT<SsPdsvtsS<CsQ<SsU<csPqs Q<@sU<Psu^sn2ps{2s S<Oss^sM<~lsN<`js R<Js P<Ys W<hs X<ws O<5GsW<|s M<rKsP<}sR<LsX<[sTkwksi4bbs g*]Dssasy?:os}4is'[<xsJTJsh=ZsJZ=hsuxsjZ=GsPTWs@TgsQ=vsw=Es\Ts/ucs7{ssF\Cs Rs:Tbs7lqsAsO=Os]sPZ=lsT|sJ\KsjMYs5Mis^{ysjTHs5HXsV\=hs/k<wsH Fs5\=VsM fs7cvsn=Fstk<VsjIes5R=tstT=Bs7o=Rsj\8bs7`ps5@@s5W=Osbk^sGnsFB}sJRKsQkZsPQis/T=wsj=Gs/t=UsO B=dsZksskLBs7^Rs7Abs7rs5pBs]=Qs`<&`s7FsS=Us`kdsNLtsCTDt!~<Tt7ct^P=st?kBt^PQtv<atx=otST~t0K=Nt7m]tVkmt7j|t0x<LtA#[t0C=~t0w<Mt^q=\tq<hkt5sSt p^{ct p<$^t8kBt8PRtosbt8q=pt I_R~t=sPt _<E^t!u<ictJCLtHsOte<i]t!a=FtCsTti<kbtFsMto<_\tNs{tc<F ItMsOtJs]td<wlts?G$;ctSs^tb<Glt_<TstPsGtj<AVtUsWt^L`<'et_<GLt p!.StYsAt^<'Ot3_<Wvt\sMtm<&[tsAt'J=DOt`sStr<fatbsGt@=|Uts<#Qtl=ttn<$DtePhtehxtt<#Fte=it )I={ytL=HttV=|tksKt8P=Yt^Lp`<'htW!HOtSr WtpXItXKatf=Klt~=wt