*@xt O{s0J>m*&UNoneRangeMinMaxColor RelativeTimeXYZ RangeVector RelativeSizeVectorAddPrecacheMaterialLifetimeRange ColorScaleUseColorScale MaxParticlesInitialParticlesPerSecondAutomaticInitialSpawningRespawnDeadParticles UniformSizeSpinParticlesStartSizeRangeTextureStartSpinRange SizeScale UseSizeScaleUseRegularSizeScale DrawStyleStartVelocityRangeSpinsPerSecondRangeEngineCore OnslaughtBPUseRotationFrom DetailModeSystemStartLocationOffset StaticMesh AccelerationTextureVSubdivisionsTextureUSubdivisionsUseParticleColorStartLocationRangeOpacityCoordinateSystemInitialDelayRangeFadeOutStartTimeOutValInValSphereRadiusRange EmittersBlendBetweenSubdivisions bNoDeleteStartLocationShapeFadeOutAddLocationFromOtherEmitterWarmupTicksPerSecondRelativeWarmupTime AutoDestroyStartVelocityRadialRangeGetVelocityDirectionFromGetLocalPlayerController SpinCCWorCWPostBeginPlay AmbientGlow OnslaughtbPoweredWheel BoneNameSupportBoneName BoneRollAxis BoneOffset WheelRadiusSupportBoneAxisX1TextureCoordsY2IntBoxX2Y1MeshUseRandomSubdivisionDampingFactorRangeValueTickAddPrecacheStaticMeshRotator AddAnimDataUseDirectionAsCalcWeaponFireExplode UseCollisionClearAnimDataTimer TakeDamage GearRatios CullDistance DrawTypeONSWeaponAIInfoAIInfo bInstantHit InterpCurve bLeadTarget DestroyedEffectIsRelevant aimerrorbFireOnRelease CenterDraw bTrySplashCollisionRadiusbTossedPoints SteerType RemoteRoleVelocityLossRange RefireRateWarnTargetPct VehicleClassAltFireDeactivateShieldProjectionNormalONSDualACRocketUpdateAnimData DrawScaleRedSkinTintsPostNetBeginPlayFlashMuzzleFlash AdjustAimbHandbrakeWheelCollisionHeight BreakApartKInertiaTensor MaterialbNetTemporary BlueSkin WeaponBone HurtRadius LifeSpan EnemyVisibleExitPositions BeginState DeathStringUpdatePrecacheMaterials EntryRadiusWeaponFireAttachmentBoneDeploy SpawnEffectsFadeInEndTimeVOffset MaxSpeedUser PitchBone PitchUpLimit UnrealGameYawBonePitchDownLimitActivateShieldFireHealthONSDualAttackCraftVehicleNameStringVehiclePositionStringStaticPrecacheUOffsetReceiveLocalizedMessageFadeIn bHardAttachDriverDamageMultDamageUseMeshBlendModeSpawnProjectile TPCamLookatProjectileClassSetWeaponChargeTPCamDistanceSpeed FPCamPos WeaponClassClientPlayForceFeedback BestModeShouldTargetMissileEntryPosition FireSingle FireIntervalFindInitialTargetUpdatePrecacheStaticMeshes ShotDown DamageRadius AmbientSoundFireSoundClass CalcZSpeedLandedAltFireIntervalAllowCameraLaunchDetermineEndPointByGatlingGunAttachWeaponCeaseFireONSShockTankCannon VerifyLock SoundRadius SameTeamAs StartTimer SpinCircles StartUpSoundShutDownSound TraceFire Collision ElectroGunSkinsHitWallDriverWeapons DrivePosDestroyedVehicleMeshSetEmitterStatus OwnerEffects bNetNotify AttemptFire CannonAttachDisintegrationEffectClassStartLocationPolarRangeDisintegrationHealthDestructionLinearMomentumPhysicsKarmaDestructionAngularMomentumForceSizeScaleRepeatsPostNetReceive UpdateEffectWorking bDirectional MovementSetMuzzleVelocitySpawnHitEffectsTPCamWorldOffsetAltFireProjectileClassIsLocallyControlled SoundVolume LightColorHoming Spiraling CanAttack Lighting DampRotationPredictTarget AlphaTestOffsetX TextureScale RenderStyleBackup_Disabled HealthMaxONSIncomingShellSoundShieldAgainstIncomingRelativeRevolutionBeamEffectClassAltFireSoundClass KDriverEnter ProcessTouchPosYPosX DrawPivotMomentumTransferSetBrightness Deployed ExplodeInAirIncomingMissileONSMortarCameraImportantVehicleClientPlaySound RotationSpawnHitEffectFireSoundVolumeOffsetYFemaleSuicideProximityExplodeIsVehicleEmptyBeamDistanceRangebInstantRotationRotatingSheetsLowFrequencyPointsHighFrequencyPointsRotationsPerSecondTexRotationType MaleSuicidebDetonatesGoop ShakeViewbThrowRagdollBlueBuildEffectClassRedBuildEffectClass IdleSound FireForce ShakeRotMagLockedTexture LockedEffect LockedMsg ServerAim KFrictionKImpactThresholdAnimFrameChangeResetAnimationWeightKLinearDampingKAngularDamping DrawBracketsKStartEnabled DrawMissilesbKNonSphericalInertiaMaterialVSizeMaterialUSizeBranchSpawnAmountRangeBranchProbabilitybHighDetailOnly bClientOnlybKDoubleTickRatebDestroyOnWorldPenetrate bDoSafetimeVehicle KCOMOffset GetLocalURLBroken Circ1DoneRenderTwoSided DamageMaxSetComboTargetDestroyTrailsSuperExplosionAquiredSpawnThrustersPointLifeTimeUseCrossedSheetsDistanceThresholdMaxPointsPerTrailTrailLocationTrailShadeType GroundSpeed DamageMinAnimate SpriteWidgetWidgetTexture SetTargetRadiusSetReticleStatus CheckRangeStopWeaponFiringRotateVelocityLossRange ScaleModeRecommendLongRangedAttackDrawSpriteWidgetMaxBrakeTorquePitchDrawHUD SteerSpeedbImperviusToPlayerIsHumanControlledONSMortarShellSoundVolumeONSArtilleryCannonHandbrakeThreshStopThreshold LimitPitchSecondsBeforeInactive TorqueCurve ForceScaleChangeTargetLock ForceRadiusSpawningSoundProbabilitySpawningSoundSoundsSpawnTargetBeam ForceTypeKParamsRotationDampingFactorRange RotationRate RemoveLockbOrientToVelocityBump AlphaRef DamageTypebFixedRotationDir bProjTargetWeaponPawnClassPassengerWeaponsbDrawDriverInTPbDrawMeshInFPSideGunAttachbCollideActors RL_RightbShowChargingBarbDriverHoldsFlag PrePivot GatlingGun DrawScale3DInstantFireMode StartUpForceDestructionEffectClassDamagedEffectOffsetImpactDamageMultWheelSoftnessWheelPenScaleWheelPenOffsetWheelRestitutionWheelLongFrictionFuncWheelLongSlipServerSetWeaponCharge XWeaponsNotifyDeployedTPCamDistRangeWheelLatSlipFunc MomentumMultWheelLongFrictionScale RotateSoundWheelLatFrictionScaleWheelHandbrakeSlipWheelHandbrakeFrictionWheelSuspensionTravelRanOverDamageTypeCrushedDamageTypeMaxDesireabilityObjectiveGetOutDist FlagBone FlagOffset FlagRotation HornSoundsWheelSuspensionOffsetWheelSuspensionMaxRenderTravelFTScale CeaseAltFireChassisTorqueScale ProbabilityRelativeVelocityMinBrakeFrictionMaxSteerAngleCurveProximityExplosionEffectWhenDestroyed TransRatioNotifyShieldHit DriverLeftBlowUpChangeUpPointExplosionDecalDriverRadiusDamageChangeDownPoint LSDFactor DisabledEngineBrakeFactorEngineBrakeRPMScale RespawnTime TurnDamping ChargeBarEngineInertiaIdleRPM MyDamageTypeEngineRPMSoundRange SetStatusSteerBoneAxisSteerBoneMaxAngleWheels VehicleMassRevMeterScaleBrakeLightOffsetGlobalOffsetRange Circ0DoneKillBeyondViewDistance ShakeRotTime ShakeRotRate FireWeaponAtEffectEmitterClass bInstantFirebAllowBigWheelsbAlwaysSeversAirPitchDampingScale GunClass Firepoint WheelInertiaGetHitEffectsbReticleActivatedGibPerterbation MinMoveSpeedMoveSpeedFactor ShellSound SoundLengthCurrentShieldHealthShieldRechargeRate MaxDelayTimeMaxShieldHealthBeginTrajectoryErrorFactor bFlamingbDelayedDamageCameraLaunchWaitSwitchToBestWeapon WeaponChargeTargetPredictionTimeStepShakeOffsetRatePassengerGunBaseShakeOffsetTimeBigGunSuspension_Right1 Fans_rightSuspension_Right2Suspension_Right3 FlipTorque IsArtillery ShootMissile fans_leftSuspensionLeft03 GetOrdersSuspensionRight01AlternateTargetSuspensionRight02SuspensionRight03SuspensionLeft01Suspension_Right4PassengerGunBarrel8WheelerWheel03VehicleCeaseFireRudderGetConsoleFont VehicleFire8WheelerWheel02 TurretAttach AttachDriverWheel_Right03 Wheel_Left01GatlingGunFirePointClientKDriverLeaveClientKDriverEnterSuspension_Left1FindEntryVehicle bDamageableWheel_Right02Suspension_Left2EnginesSuspensionLeft028WheelerWheel01 LeftRLAttachSpecialCalcBehindViewGetCameraLocationStart8WheelerWheel058WheelerWheel07 VehicleIcon bIsGreyScaleResetAfterChangeSizeYSizeX SVehicleIconUseRevolutionUseRevolutionScale8WheelerWheel048WheelerWheel068WheelerWheel08SideGunFirePointfWheel_Right01 8WheelerTop Wheel_Left02CenterSpringForceUseVelocityScaleFPCamViewOffset Wheel_Left03ColorMultiplierRangeSuspension_Left4Suspension_Left3 BoosterLeftbSeparateTurretFocusbHasHandbrake EffectAxisAutoResetTimeRangeBoosterBottom BigGunBaseGetTargetLocationRangedAttackTime BoosterRightRightRLAttach BoosterTopRevolutionsPerSecondRangeRevolutionScaleCannonFirePointRotationOffsetBodyTouch EndStateEncroachingOnRotationNormal EncroachedByBotDesireability RawInputGetVehicleBaseDodge MaxShotCountDied GetTeamNumbNeedsSingleShot NextWeapon PrevWeapon DescriptionGetViewRotation FlightSoundSpecialCalcView IsFiring IgniteSound KillRangeVelocityScaleDesiredDistanceDecayRateAmbientSoundScalingDesiredDistanceToAxisForwardForceMagbSpecialCalcViewInwardForceMagSpiralForceMag DecoyRangeDecoyLaunchSFXClassOverridePickupQuery AddGameRulesDecoyFlightSFXClassMortarCameraOffsetAirExplosionEffectClass SetLength SpinSquare MissileTick BracketsHudMissileDigitsHudMissileIconHudMissileCount FanYawRateFluidSurfaceInfoArtiLockOnClassStringTorlanReplacementsSeveranceReplacementsCheckReplacementRedPlanetReplacementsbAddToServerPackagesPrimevalReplacementsFrostbiteReplacementsDriaReplacementsDawnReplacementsCrossfireReplacementsAscendancyReplacementsAridoomReplacementsArcticStrongholdReplacementsTorlanFactoriesSeveranceFactoriesRedPlanetFactoriesPrimevalFactoriesFrostbiteFactories MaxHoldTimeDriaFactories FriendlyNameDawnFactoriesShakeOffsetMagFlashEmitterClassSpreadCrossfireFactoriesAscendancyFactoriesAridoomFactoriesArcticStrongholdFactories%SetDelayedDamageInstigatorControllerVehiclePickupRulesONSShockTankShockExplosionONSShockTankShieldHitEffectRedReset ONSShockTankShieldHitEffectBlueONSShockTankShieldHitEffectONSShockTankShieldEffectRedONSShockTankShieldEffectBlueONSShockTankShieldEffectONSShockTankShieldComboHitONSShockTankShieldONSShockTankProximityExplosionONSShockTankProjectileONSShockTankMuzzleFlashONSShockTankFactoryONSShockTankDeathExp ONSShockTank ONSShockBallONSMortarTargetBeamONSDualMissileSmokeTrailONSDualMissileIgniteONSDualMissileExplosionONSDualAttackCraftFactoryONSDualACSideGunONSDualACGatlingGunPawnONSDualACGatlingGunONSDualACDeathExpONSDecoyLaunchONSDecoyFlight ONSDecoyONSDecoEffectONSBellyTurretFire"ONSArtilleryTrajectoryBeamSegmentONSArtillerySideGunPawnONSArtillerySideGunONSArtilleryShellSplitONSArtilleryShellSmallONSArtilleryGroundExplosionONSArtilleryFactoryONSArtilleryDeathExpONSArtilleryCannonMuzzleFlashONSArtilleryCamThrusterRedONSArtilleryCamThrusterBlueONSArtilleryAirExplosion ONSArtilleryMutVehiclePickupsMutBonusVehicles fxSignBreakfxBarricadeBreakDECO_BreakablePostDECO_SmashableDECO_BarricadeDamTypeShockTankShockBall#DamTypeShockTankProximityExplosionDamTypeONSCicadaRocketDamTypeONSCicadaLaserDamTypeArtilleryShellCicadaLockBeamEffect AnimDataSteeringWheelMinAim Projectile AltFireForceAltFireSoundVolumeFireSoundPitchClientStopFirebShowAimCrosshairbDoOffsetTraceDrivingStatusChanged KDriverLeaveLockOnWarningDualFireOffsetWeaponFireOffsetGunnerAttachmentBoneYawEndConstraintYawStartConstraintProjectilePostRender2DLegitimateTargetOf CameraBoneTrailEffectPositions PushForceRollTorqueMaxRollTorqueStrafeFactorDoRangedAttackOnRollTorqueTurnFactor MaxRiseForceDefendMaxStrafeForce LongDampingMaxThrustForceAirRollDampingAirRollTorqueAirPitchTorqueAirTurnTorque bDoStuntInfoDaredevilThreshInAirTimeDaredevilThreshInAirSpinBrakeLightMaterialbMakeBrakeLightsSteerBoneNamedtbStaticbHidden bHighDetailbStasisbOrientOnSlope IsDeployedbIgnoreEncroachersHeadlightProjectorScaleHeadlightProjectorRotationHeadlightProjectorOffsetHeadlightProjectorMaterialHeadlightCoronaMaxSizeHeadlightCoronaMaterialbUpdateSimulatedPositionbHasFireImpulse FireImpulsebReplicateAnimationsDamagedEffectScalebNetInitialRotationNetUpdateFrequencyShutDownForcebUnlit bMovableFluidSurfaceShootStrengthModbForceSkelUpdate MinSpeedAimAt CustomAimbCollideWorld bBlockActorsbBlockProjectilesbUseCylinderCollision bBlockKarmaClientSpawnHitEffectsbBounceApplyFireImpulsebIgnoreTerminalVelocityDesiredRotationHeadlightCoronaOffsetbEdShouldSnap DigitsBigDrawNumericWidgetbPadWithZeroesMinDigitCountNumericWidget GroupName DigitTexture DigitSetGunSpawnBeamEffect TraceRange CancelledSetTargetStateMonitorComboMomentumTransfer ComboRadius ComboSoundExplosionEffectClassDoCombo RocketProjRocketShellTex WeaponSkins XWeapons_rc ShockBeamTex HUDContent Reticles rotDomRing StartEffect texturesWeaponStaticMesh MenuSoundsdenied1MapName InitialDirStartbLockedSpriteEmitter9SpriteEmitter10SpriteEmitter11SpriteEmitter12ShockBeamEffectPainterBeamEffect YawAccel PitchAccelPlayOwnedSound VictimHealth EndEffectfXTraceThisActor ComboTargetExtentGlowMeshEmitter17 ForceDirVelMagSpriteEmitter13 ComboDamageSpriteEmitter7SpriteEmitter18 tempStartLoc TraceStart TraceEndSpriteEmitter21BeamDir TargetState MarkSound MeshEmitter2 MomentumSpriteEmitter6 HitLocationSpriteEmitter5 ReflectNum MeshEmitter1SpriteEmitter3 HitNormalChargingSoundnewdest MeshEmitter3 MeshEmitter4 MeshEmitter5 MeshEmitter6 MeshEmitter7garbageHudBaseHudCDeathmatchEventInstigator NewValueMeshEmitter19 littlerock01locCliffsSetBoneRotation SetBoneScale AttachToBoneGetBoneCoordsSetRelativeLocationSetRelativeRotationArboreaLanscapeMeshEmitter18 MeshEmitter0 NewRotation BeamEmitter1 BeamEmitter0 HudColorRed HudColorBlue SetDrawTypeSetStaticMeshEDoubleClickDirSpriteEmitter4 bNetOwnerRotXRotYRotZ VehicleFX DustyCloud2SpriteEmitter2FireCountdownSpriteEmitter1 EnginePitch KParams0ONSInterface-TXtankBarrelAlignedHorn04 CurrentSpeedbRotateToDesiredVMParticleTextures TankFiringPTankDustKick1cloudParticleOrange TankDustKick tankHitRocks DirtPuffTEXDirtKICKGROUP dirtKICKTEX ProjectilesCannonTurretsHuds TurretHud2 VMWeaponsTXPlayerWeaponsGroup bomberBombSpriteEmitter35SpriteEmitter36TrailEmitter0SpriteEmitter15SpriteEmitter26 Dixie_HornHorns PRVFire02 PRVFire01VehicleCollision02ONSWheeledCraft ONSVehicleONSWeaponAmbientEmitterONSWeaponPawnONSLinkableWeapon ONSWeaponONSChopperCraftDamTypePRVLaserDamTypePRVPancakeDamTypePRVRoadkillDamTypeRVPancakeDamTypeRVRoadkillONSAttackCraftONSAttackCraftBuildEffectBlueONSAttackCraftBuildEffectRedONSAttackCraftExhaustONSVehicleFactory ONSHoverBike ONSHoverTankONSHUDOnslaughtONSOnslaughtMessageONSPRVBuildEffectBlueONSPRVBuildEffectRedONSPRVSideGunMuzzleFlashONSPRVSideGunPawnONSRocketScorch ONSSkyMineONSSmallVehicleExplosionEffectONSTankBuildEffectBlueONSTankBuildEffectRed ONSTeamAIONSTurretBeamEffectONSVehicleExplosionEffectbAllNodesTakenbBlockZeroExtentTracesCollisionSoundsPRVONSVehicleSounds-S WeaponPawns ActiveWeaponSpriteEmitter0TransientSoundVolume RocketFlareDirseexptSmokeAlphab_tRegion shock_flashZone PointRegion Instigator purple_lineNetUpdateTimeshock_Energy_green_faded painter_beamshock_core_lowIonshock_mark_heatbCustomAimingbAltFocalPointAltFocalPointshock_flare_a Shock_ring_a shock_coreShock XEffectMatBaseImpactAndExplosions BExplosion3 WeaponSounds GoldGlow RealLocationbWorldGeometry exp2_framesP we1_framesFramed exp1_framesBaseOwner exp2_framesPC DeltaTimeKeyCameraRotationCameraLocationWorldToScreenbActiveOtherResult GameRulesEffects LocalMessageDestTargetDynamicLoadObjectitS NormalizeV ExplosionTexRand ReturnValue Velocity SaDScorcht LocationShockAltDecalRocketSmokeRingPainterBeamSpot HitSmokeR HitFlameBig HitFlameGFlakShellTrail FlakGlow OutputThrust ServerThrust OutputStrafe OutputRise ComboDecalEndShockProjectile TargetDir TravelTime DamageAmount TargetLoc CopterState CopStateObjectiveTargetNextSquadMemberTrailEffectClass TrailEffectsCoords VehicleBase GoalStringGunnerAttachmentBoneCoordsGenericWCB VMWeaponsSMSmokeTrailEffectA PRVprojectorflr02arTime CurrentAimWeaponFireLocationWeaponFireRotation ScriptTextArboreaTerrain ElecPanelsP PlasmaSphere Ripples1P Ripples2P SmoothRingbForceCenterAim JumpDuckbAmbientFireSoundbAmbientAltFireSound bIsAltFirebIsRepeatingFF DustSmoke bCorrectAimFireIntervalAimLockAimLockReleaseTimeLastHitLocation ElecPanels xEmitterAmbientEffectEmitterKarmaParamsRBFull LevelInfoFireSoundRadius GrenadeTest GameInfoSmokeFragmentAltFireSoundRadius Decoration HardSpotVMVehicles-TX ZoneInfoHUDPickup AIController ProjClass ControllerPlayerController ChildWeapon NEWprvGroupCurAim BenTex01 SmokePuff01StartHoldTime bHoldingFire ChargedLoop BestMine MuzzleSpraySpriteEmitter8SpriteEmitter14SpriteEmitter16MeshEmitter11MeshEmitter13MeshEmitter15SpriteEmitter22SpriteEmitter23MeshEmitter16SpriteEmitter17SpriteEmitter19SpriteEmitter37SpriteEmitter39MeshEmitter12SpriteEmitter25SpriteEmitter20MeshEmitter45 MeshEmitter8 MeshEmitter9MeshEmitter20MeshEmitter21MeshEmitter22MeshEmitter23MeshEmitter24MeshEmitter25NewTagDebrisbp bDeployed bShotDownMeshEmitter38SVehicleFactory Veh_Debris1 Veh_Debris2 BoloBlob SparkHead TankTrail PlasmaStar2 PlasmaFlare SmokePanels2 NapalmSpot PlasmaHead SoftFadebas27gobas28goAbaddonArchitecture BlastMarkWeapons SmokePanels1PhysicsVolume PlasmaStarEclipseCircleEnergyAW-2004Particles DOMPLinesGpMutatorDOMpointLINESgXGameTexturesOBJ_HellBenderIcons AS_FX_TX FlickerFlare FlashFlare1SmokeFlares SoftFlareEpicParticles SuperPickups BeamEmitterVictims Viewport SquadMembersSquadObjectiveSquad bFreelance BrightnessWeaponDamageTypeVehicleDamageTypeUnrealTeamInfoCanvasDestroyableObjectiveGameObjectiveSquadAI ShootTarget damageScaleground UnrealPawnTagsdistYLXLSpotmatPTeamNum TeamIndexTeamUScaleVScaleData ReloadSoundItemcYcX SetDrawColorSetPosDrawTileStretchedClipXGameDifficultyGameRulesModifiersKiller ViewTarget instigatedBy bAllowPickupbSuperRelevantLDoubleClickMove MapFactoriesMapReplacementsONSBPTextures CicadaGreenArtilleryCamTextureFlair1 ExploTransMissile Flair1Alpha CicadaTan greenbeam Explo_Shroom SPMAGreenSPMATan PaladinGreen PaladinTanTargetAlpha_testTargetAlpha_test2TargetAlphaNoStartDrivingTimeLastAimbJustDeployed MortarCameraLastLocalMsgTimeStartLocation bHasCameraStartVelocityNewYawShieldHitLocationShieldHitNormal CicadaTex CicadaLockOn RocketIconONS_Cic_CircleONS_Cic_BracketsONS_Cic_MisslesONS_Cic_IncomingONS_Cic_Plate ONS_Cic_Info CicadaSndsMissileIgniteFlight CicadaIdleCicadaStartUpCicadaShutdownMissileFlight MissileEject BellyLaserBellyLaserFireDecoy DecoyLaunch TargetLock DecoyFlight MissileLoad bHeatSeeker LastThrust DesiredPitch CurrentPitch PitchTimeFanYawTailYawDistanceFogEndLastYaw DesiredYawYawTimeDecoysFontLevel TexPanner TimeSeconds bDropDetailNetModeOldLockedTargetLastHudRenderTimebLastLockType SpinScale SpinFadeSpinRot BracketScale BracketFade MissileFade TexRotatorGameControllerListLastMissileCntbFreelanceStart MeshEmitter bStretchedMoverEmitterPlayer NewDelay Projector SkeletalMeshSpriteEmitterPawn MissileCnt LockedTarget bIsLocked Adjusted GroundDistLockNumBeamIgnoredMissileWatchedMissileIsSoftwareRendering AW-2k4XPShockBallTrailShockTankMuzzleFlash ShockShieldShockTankEffectRingShockTankEffectCoreShockTankEffectCore2ShockTankEffectSwirlShockTankEffectCore2a ShockShield2Cicada LongSparkMissileTrail1aShockTankEffectCore2GaSignbreak_SFXElectricShockTexGElectricShockTexG2 ShockRingTexONSShockBallEffectSVehicleWheelDelay bExplodedFuse SmallShellParticleEmitterbLastDeployedbLastShotDown TargetBeamTargetUpdateTime Thruster DrawColorDeployedLocationMessageUpdateTimeLastRealLocation DeployRand MaxHeightTargetZAnnounceTargetTime TrailEmitterActorStylebStatusmyHUDUDecoyFlightSFXbCanPickupInventoryProtectedTargetYawAI bStationaryTrail Particles ScreenLocXInwardForceMagGrowthRateCurSpiralForceMagCurInwardForceMagCurForwardForceMagbSpiralClockwise AxisOriginAxisDir RepAxisDir SecondTarget ScreenLocY bFinalTargetSwitchTargetTimeF ViewActorRollParallelComponentPerpendicularComponent!NormalizedPerpendicularComponent SpiralForce InwardForce ForwardForceInwardForceScale NewTarget HitActorLengthRoleTag ONS-BPJW1BonusParticles RoadSignMeshBarricadeMeshMeshesLargeShell_half Mini_Shell LargeShell TargetNoUrbanParticles Broken_Saw1 Broken_Saw2 Sawhorse_LegSawhorse_Light WoodShard BentSignpost BentSignfaceClass bSkipFire bFiresRightLoadedShotCountWall RelockTime bDumpingLoad FireControl LockPositionPackageaBaseXaBaseY bDontSkipWFRUpRotaBaseZaMouseXONSBPAnimationsaMouseY aForwardaTurnaStrafeaUpaLookUp bDrivingbWeaponisAltFiring SteeringFactory TextBufferObjectEnum Function ThrottleRise DriveRotDesiredTPCamDistanceLastCameraCalcTime CameraSpeedDriverLockOnClassStringLastLockWarningTimeLockWarningInterval Objective HitCount CamLookAt OffsetVectorDam mSizeRange mSpawnVecAmRegen bForceLeave HurtWallInstigatorController ExploWallOut bWasAltFirebNoFXTargetLocationBotH LockOnClass AggressorbAlt EffectOffsetChargeSkillAimRot bResettingSetViewTarget Incoming ShakeRotGravity ShakeOffsetMortarCameraMeshDualAttackCraftSideGunMeshShockTankCannonMeshShockTankMeshDualAttackCraftGatlingGunMeshArtillerySideGunMeshArtilleryCannonMeshArtilleryMeshDualAttackCraftMeshONSBP_DestroyedVehiclesSPMAPaladin Paladin_TirePaladin_ShieldGunPaladin_MainGunPaladin_BigTurretDestroyedSPMADestroyedCicadaCicada_TailRudderCicada_FanHousingCicada_FanBladeCicada_BellyTurretSPMA_GunpieceSPMA_GunStrutpieceSPMA_TurretpieceSPMA_WheelpieceDestroyedPaladin ONSBPSounds ArtilleryArtilleryFireCameraAmbientCameraShotDown CannonRotate EngineCruiseEngineRampDown EngineRampUp ShellAmbientShellBrakingExplodeShellFragmentExplodeShellIncoming1 SPMAHorn ShockTank PaladinHornShieldActivate ShieldOffShockBallAmbientShockBallExplosionShockBallFireTurretHorizontal DistantBooms DistantSPMA MortarShellLastMortarShellLastWeaponCharge MortarSpeedbCanHitTargetClientUpdateTime bBehindViewPredictedTargetLocationPredicatedTimeToImpactLastCameraLaunch bWaterVolume LastBeepTimeInLatentExecutionCameraAttemptsStatebestAim FlightSizeFlightZ FlightTimeStruct StartXYPct FlightDir StartVelMid1Mid2Mid3ZSpeedXYPctbFailedShellSoundMarkerName XInterface XEffectsLevelCameraPositionLevelCameraDistance StrPropertyCurrentPosition LastPositionCurrentVelocityErrorCorrectionXYSpeed RouteGoalEnemyLastShieldHitTimeFocusCurrentDelayTimeCurrentRechargeTimebShieldActivebLastShieldActive bPutShieldUpShieldHitCountLastShieldHitCountStructPropertyArrayPropertyClassProperty NamePropertyObjectProperty ComboHitFloatProperty FocalPoint MoveTarget TimeToImpactArtilleryLocationnextController bAltFire HitEffects BoolPropertyMoveDir MoveDistShockShieldEffectShockShieldHitEffect IntProperty BytePropertyNewTimeRWheel1LWheel1RWheel2LWheel2RWheel3LWheel3RWheel4LWheel4 CicCircle0 CicCircle1 IncCircle0 IncCircle1 IncSquareMeshEmitter10MeshEmitter26MeshEmitter46SpriteEmitter24TrailEmitter4SpriteEmitter43Wj k ?9:9:$G8ΊK7B_B_,eB_,eB_,eB_B_,eB_,eʁ)ʁ)ʁ)ΊB_Ze3}3}B_}LB_ȵB_ȵȵȵB_3}ΊϹϹϹΊΊ3}}LB_B_}L}LB_B_}L!B $P "[D_ $@^ $@EXDY"PF\"PQ\Z$Q=VA$>~P$B@S $BmlcZb*nSlfdSjSi$Dt$?s$p}?cb*nSlfSdSjSi$Dt$L>s$p}?`$EP ATf"&&-9:9:$9:9:$GQZaF>ZM>r B_bQ >r >r Ze>r >r >r >r >r >r >r >r 3},>r B_B_IJB_IJ3},eIJ,eB_B_,eB_,eB_,eB_B_,eB_,eʁ)>r B_,eB_,eȵȵʁ)ʁ)ȵB_ȵȵȵȵ>r ȵȵ\Ē\ĒȵȵB_&2lȵ&2l_ȵ3}\ĒB_3}>r B_B_3}IJ3}3}B_B_,ebQ bQ bQ bQ 3}>r 3}>r bQ B_||B_|ʁ)|||||B_B_3}\Ē3}ʁ)B_,eʁ)B_|>r ʁ)>r >r 3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}!B $H $?R $DV$zEp$>o$>m$@j$C[|Xi Y".\"QD \ $HCZ$Q8>EV SN $u<|Gx$@A$@UQ~P$D@\ c] Explosion05m&ld: zCS: @ER$@L : Aq: HCs$ AcZb*nlfdSjSi$Dt$?s$p}?cb*nlfdSjSi$Dt$?s$p}?P &MH KS9:9:$G+B>r &2l_܈B_B_B_,eB_ZaF\Ē3}B_B_3}3}IJB_IJB_IJ3}B_B_,eʁ)3}B_3}3},e|B_||B_||||||||B_|,eB_3}3}3}ZaF__B_B__B_ZaF3}3}3}>B_B_,e! $j : Bb a F }J$P {$?QYAm$BB$BXxSv:V:::m VN `B Y6G:+\L3}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}G茹fIJ堅IJ3}ΊΊΊΊB_堅|\fF|||||||7-:)3}$>#$>#3}$>#,e,e3}>ZM堅>ZMK7ΊΊΊ3}3}ΊIJΊIJΊҽҽҽҽҽ%/%/%/%/Ί%/Ίҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ8~`n8~`n8~`n8~`n8~`n8~`n8~`n8~`n|;|;ҽҽҽ3}3}IJIJʁ)IJIJIJIJIJ>ZM||\fF|\fF'!B Ws $hGefg] Locked r ZRpSyKZMJ"O"nN"L"x$?ED$?C$?w"Q"ZZ$?}*}q ZRpSyKZMJ"O"N" L"@x$?ED$?C$?w"Q"ZZ$?}*}p Ze Kyd "x$H>ED$j\?C$?w"Q"}*}c "a jh g KZMJ"O"N"&L"&KMJ"'O"N"ML"&KMJ"NO"N"tL"&KMJ"uO"N"L"&KMJ"O"N"L"&KMJ"O"N"L"&KMJ"O"N"L"&KMJ"O"N"7L"&KMJ"8O"N"^L"&KM J"_O"N"L"&KM J"O"N"L"&KvKwo n c YzC AzCA Am $Bl $>k $Bi $HCh $;Df $Be $Bd $PCHSYrH@ rH[9~GHD|Gb L M U [}]$^Z $$tH$PHaZ $B$CLY%BCBBv: P$Ck: Cb] in a Cicadaa]Cicada{$C_"PnH$Cm$pCG| @ 9:9:$9:9:$GB Y6\Ē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}3}3}3}3}3}B_,e>ZM>ZM,eʁ)>ZM>ZM>ZM>r >r ʁ)ʁ)ʁ)B_ʁ)B_3}ʁ)B_IJZaFZaFZaFZaF>ZM,e,eʁ),e>r ,e,eʁ),e E>r ZaF>ZM>ZM>r ZaF>ZM>ZMIJIJZaFZaF3}3}>ZMZaF>ZM>r >r >ZM>r B_>r >ZMB_>r B_,e,eʁ)>ZM\fF3}ZaF3}ZaFZaF!B Wu ]Onslaught.ONSOnslaughtMessageO$u=P$?Q$ #`$Ai$ j$Ak$_ff&?_Y?_̌?t$G=x$D{$zD|$?~$8$=]$A`$BA$ Bh$Bg$HCC$L>D$CF$@FHI$BL$zEv M: 8BZMʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)}L}LB_B_B_B_,eB_3}OΣ3},OΣOΣOΣOΣ,eʁ)B_B_3}ȵȵ3}>ȵ3}B_,eB_,eB_,e3}B_,eB_,eB_,eB_||3}|B_3}|||\fF|B_|\fFq|B_|\fFq|B_|\fFq|B_|B_||||}L|B_|B_,eB_|B_!B $h$Dg$@f$Ce$HD[mXLY"PF\"Q\Z$Q8>E|Gx$ff@UM~ \ mNcZb*nSlfdSjSi$Dt$@?s$L?cb*nSlSfSdjSi$Dt$s$p}?P {$L?Q XV@8_  Gd d B Y6: JR~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}3}!$!$!$OΣ!$!$ _!$!B WO$=P$?Q$ #p$@qZe:oY51$0$ B1$C0$ B1$ D0$0A1$(knN0$0AkZe:oY51$0$A1$HC0$A1$D0$B1$/E0$_$_>_ff&?_Y?_̌?t$A`P $ AnH$CCS|v:VP^ :V sn$Bl$@DL`Rx@|YToV%@| B wPU@{ LO c+&2lȵB_B_B_,eB_3}3}IJIJʁ)3}ʁ)ʁ)Bʁ)3}Q[bQ 3}3}IJIJʁ)! $r k p$zEV$zEi$zC|$%DF$a IEk ya&`$@FFS_} J$A{$ @AdnH$B}] xsn$pBl$@$K@[ X l@8N n w@8~\J_W q * 7-:)ȵ:+:+:+:+܃ʁ)3}! $i Ef e $Ep$zDV$Di$HB|$zCF$@F_} J$@[ `eN RgM@8L\ Wb @c c :G yR_{@h@X vn@8@  |e^  OΣʁ)܅3}܅3}ʁ)3}ʁ)!$ʁ)ʁ)! $a&z qI: @@@@@m$"DB$CW }iwKfI c eahCh}IPf _ʁ)! $b$@a$zE_a&qI: B B@AAN DB}U ]^TW@W _fhR@80EKL>qI @8FzHh e @ }̘4܅3}3}3}IJIJʁ)W=W=W=W=! $3YWXYZ[\]^5SjydiW X Zs l B Y6PG茹f堅 _:+:+:+B_>ZM>ZMB_B_B_B_>ZM>ZMB_B_>ZM>ZM3}IJҽҽ%/ҽҽҽҽҽҽҽҽҽ3}ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ|;|;ҽҽҽ|3}>ȵ7-:)>ZM>ZM>ZM>ZM!B Wefg= INCOMING KxKym z[|b D@ST: LY1k%C%Bv: HP$ Cq: BpAo$l: @HXZ $$h$b]in a Cicada turreta]Cicada Laser Turret;zMOBHx @u@8Xx@@U E [H\deYa7v \ZwFi flVSB} @s>N8! $3YPQRNZ 4Z $$Z $$Z $ $ 5SC~ @tf D! $3YMNONZ 4Z $$Z $$Z $ $ 5Sv@86@8v Qm F Bxb?4Afʁ)ʁ)Afʁ)ʁ)Afʁ)ʁ)ʁ)3}3}3}3}! $@$AaU`$Ey S| S} SK qL $?O SCU V X Y X|` x5xfJ CI^f \C~mSMFO A _Z[Y@ ^ OH|_ʁ)! $d$@@c aqJ$ACdabcu`Pg|kQn FpJTtUiIU K @]WKx yQl&{x +Q[&2l! $&F{$@UpX!tZjYO]gf\b[bQgiLUKIr``Yq#cuyMlCHo ]4AJU d@q{Np=OsQtTrq`osq a]Da''9:9:$za Bh(f>wf**f 9? a A  $aI$C'DG99 }-caC}aRb$cO}Ufff?Cc-c'ss}UU}fff?q!qCuq!pq!q G]^`t}vsj@-9:9:$i>wi**i 9?psa qa j6ja+j GX g:M-mI-ws*s- (Dwq*qa GaQj_V qSQa $@h(X>wX**X 9? a` qS9?,a` qS9?,a  qS9?,9PSw*9:9:$a q9PS GScs T 2lvC2o>+B_}L#}L! $hOso`bsRnmq uvG Q@qpO L Zks --m'IL a G~[t Q N EW ZWI 2FޱG!Z $u N]#"%o got too close to %k's Paladin.X]_HN-go s @KEk"!B $3Y {|}~ VWrMuZ O@]  DRNYj[ W\ ] f eP^ kji@a Er ^p PFt uFSi i @xvj܅3}3}IJIJʁ)W=! $3YQR;`$E5S'y[Nm |]>ZMB_G茹fȵȵȵ7-:):+:+7-:)3}~(~(~(~(B_B_ʁ)ʁ)!B $KK[HXHY"\"PQP[ $pAVVx$L>A$?P$4DT $@c] Laser01{b P"C"k $@Fl7`$`jFP \n @}9|E! $3Y)}~@ABCDEFGHIJKLMNOP;5Sz]j o @_9! $3Y|;5SkRh @A3 ! $3YST;`$;E5SQg @BŇ\T! $3YUV;5S_ gg{ ^^p @Eq! $3Yz{5SJ$@FJKBc @L]m! $3Y-_`abcdefghijklmnopqrst;5Sg a @ MG+܅3}3}3}IJIJʁ)W=W=W=! $3Y uvwx5SA~Z ` #N$3}!$!$ʁ)ʁ)B_ʁ)ʁ)}L}L3}צ93}IJצ9B_IJצ9!$}̘4}̘4}̘43}}̘4!V $q p $Co $~eHp$ FV$ Fi$C|$zCa} {$@@Qm$B$O}f _ @ T&$r܅3}3}3}3}IJIJʁ)W=W=! $3Y yz{|};5SFqgo([z] @XlZ! $3Y ~@A;5SFqgGu[ @[m! $3YC5SAtZ @\_:! $3YD5SAgD O`abcGgX @e! $3YF;5SAtL u B Y6f4堅>ZM>ZM!B W[iT: LY1%CB%B%C%v: BHBP$*Cq: Ao$Cl: HBh$>b]in a SPMA side turreta]SPMA Side Turret+gukv .iZ&>ZMB_,ƗȵȵB_B_}LB_B_,e+fB_|88+f}LB_||||3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}!B $P $l?[rXEY"@\"$Qk] BVVW |Gx$>A$@?M ~@c] PRVSideFireR MPRVSideAltFire{P"C"md: pBAS: zDzDR$@cZb*nSlSfdSjSi$Dt$L>s$?cb*nSlSfSdjSi$Dt$s$`$;EP {$L?hjkww @mv5! $3Ystu;5S{ QYeV @nUt! $3YG;5SAfTde U @q׶7܅3}3}3}3}IJIJʁ)W=W=W=W=W=! $3YHIJKLMNO;5SFqAorA@bs^xv z|}|l y @ δϺ܅3}3}3}IJIJʁ)W=W=W=! $3Ylmnopqr;5S C@_J@]Er WGL@YzP@W{ @M 8m! $3Y^_`abcdefghijk;5SS@V@m | @ Q~qF܅3}3}3}IJIJʁ)W=W=W=W=! $3Y STUVWXYZ[\];5Sas M BRgυ3}Ί}=H3}!V $U@ULZ@SX|z |[@R_@Q|`a@P{c@ODf@Nhn@MMC @g٧D! $3YGH;`$;E5SgFyiyOn D @kZxߘ܅3}W=W=! $3Y@ABCDEF;`$;E5Sg~ylyo@Kw@JS`X`a md_|@Fmy@D`@ @AA @@B @ @~ m &D T ZTN Lw M VH 2M .XG!Z $u N]0/%o couldn't avoid the blast from %k's Paladin.X]_JL P ^} P %orA*rA* r*r*)AII GAXfS V r Y L \ YJ 3[ q?G!Z $uN]%k's blew %o to bits.R]%o blew herself up good.\]%o blew himself up good.U ^ Ua h @[K 3b ]`G!Z $uN]%k's blaster stung %o.R]! %o used her blaster on herself.\]! %o used his blaster on himself.Zp q ]m]\d L 3k ~G!Z $uN]%k rained on %o's parade.R]'&%o was killed by an artillery strike.\]'&%o was killed by an artillery strike.]l_k`$>o h s w u to z x Y Z3-" -s oa] Uoa#HCr ' G{ n V| # wH*H G-n  G~ l TvJ "wH*H Gl  Gc{7;$w.*.Ba $?o$ GO | j ^j %or]*r]* r*r*)]I-E'{ G H` D#^ Ho$-' "a!R?w*mbHa _ "dH q .Wa@-(D iGD HG&9:9:$ m9:T%%a s&a s,a s,a s%a t&a t,a t,a t%!&!v,!A ,!{ GA B d} Ag`wH*HaA%WA,MwA*AaAd GF R>4Ug9?&9?,-"' q!H GiC bS Q-EibeNNh(a  be9?,9Pe GG d't+-"-Bq!H-B-"O-E-G{-G-EqDWa DWD Gc"@JcGw*w*T9=R  G{E T Z*-E{T S '-m'a GI J {Ir -m'a $@89:9:$atI#Z##a GS I Rf @I  GA@99 GP ~x)h(aN u9:9:$ wA*JaAuwJ*Ja* GQ F W$s"F  z Gik@` #SkZk GR mg+wp*m%m7pB~wmpB*rmpBApBm& mwJ*Ja G dcBFgdwcca/!cSb9?Zbbc  GU {@@{a GY h]++a 59:9:$a m h%h,ga Q wg*g Ch<a GczJ# az( G[ KFjv I M a q9:9:$ h(KaNp#B(wK*a  N9P#a$? HDEa G^ S` /a$? HD.ra G\ _ ] Z[d F G` HR6Ew*w.*r;.Sf9:9:$^;- ;-r*r*; S ;*^9DS9?%w.;*.;%.;$z;b?Z HHw*9:9:$9?%g>gQa 9PHw*rg,g Q@a 9PHa 9PH* G"a EB,XEw*w.*rE.SUEd Gb E&Fw]*]a Gc gz;2w]*#- ]a2]P G]@ ];9:9:$]a }]a*99 G ~^D%~ (]%&~ AAL?&~  G D@"&9:9:$L> D>KrD*a -9:9:$rD**D 9?p%-',-',-',-',-' G~@&9:9:$L> ~>Kr~*a -9:9:$r~**~ 9?p,-',-' G|@q|>%r|*a -9:9:$r|**| 9?&-',-',-' Gr@ r>%rr*a -9:9:$rr**r 9?p%-'&-',-',-' Gj@ j>+rj*a -rj**j 9?%-' G~a $@ GPl C6.%P6.%P Gd@ d>%rd*a -9:9:$rd**d 9?@%-',-',-' Gl@ l>%rl*a -9:9:$rl**l 9?@,-',-',-', -' G@ C@-,-(,-( GH~ :HL?>a $@ C?( Gyg.G#wz*zP Gp V~8(V>>aV( Gt DGe-(w*GDE*' Gu Bu=:w.*.@{B Gz JM>  r* ...J- '@0 Ja  Ja*Jo$Jo$JJ  J   Gl[y q@GM' 6Fy@mAl-C?UACUr9:9:$WABw*w*a/!} AAA*w*-?aJ' G[x e] @iJeUAAaUe\ava~YFA\tի@v\uAA-CYYtu~jJ~~a+9P_-cUJ\U9?%-c'UCcM Cuq!p  G{ {Y WK-l-{A-lT-(-l G| yA3y0--' G} wRE)w,!D G uQ)u,?!D G@ ~ ` i ZR>"rR* U.RHrU* 9=,$@$@9=, U IaSonn9?,k%Mxqff&?ff&?k&Mxq9=,9=,$@9=,kWxq9=,$@$@9=,k xqxq9?,:a o9?,0BCB9=,9=,$9=,*x9?,q9?, aS' GC _J$ 69=,69=,69=,6$2<a 9?9?CC$69=,69=,69=,69=,<a 9?9?D@D Gw E pG[{]$v#v#{C{v9?%z{{?zz{9?,{a+9P GD Fk>G9?WuQGaK9?WtMKbF*_Q9?,`M9?,-cF&aWQMGKFWQM GI -H;eCgjeee%Cgj G ` fZ E-`L$-`($L$ f u.uwu*uef9:Lw%*u.%wu*uef9:L  Gge _ u+D G \ tyN+w.t*.t- Hw. t*-F t 9?Ct t  GE b HI ZR+w.H*.H-(CH H ( G l c ~_CgE.%^E%L=9?E`EE? G d K dP+w.*.- C   GY k @q GMpz aA( Gj {]w :/a6 {?/a@(0 10q!f Gr h [C' Gi d =:- w* h(a  GpT9:9:$ epw9:9:$M BaGpBzCBG B9:9:$q!G9:9:$q!l  Gzn q e#6w*w.*. a Xa+9PX w*a X A GXv }Tu)A#z.}Urz* Tw%*}5z w5*w5zr5 55-r5r.5*%55 r} Gp t GBGsT8`V9:9:$esGzC%%s BA]v!T GVw vGeH@VV%QV7BGVB Wvt VB(V' Gx ~X @2<W -9:9:$ - ~zy7%77'%'7r'*'a a''a*'"'mTT9:9:$'%L'7'a' 7% G y gT_2gTu!Tow.* 9?%69?%69?0̽hai@#D(wh*k66ik9?6Y??oo9?%ob$#C6?|9:9:$9:f9:69:6,Q 9:6,Q FQ_?f6xiQiQig__gx_9?% Qi_Qi6e9D}g6f9Di!Xf!|e!vek6[k`Xk% `%k% `%B`kYMYa?mY%a?`kY6b6b9D9?Y6bgaaga9?%Y6ba6bYTb86T6Tl`6T6Tl6T%!HT Gz v`1&-( G| ~0/9:9:$;w%*%a7,w.%*.%&w.&*.&-o'w.%*.%-l' Gs} _d'&.%-- `QQ-h.%--e.re* \.er\* -.%---h-OlQ `e W VROY.% NNSYa $@SYY[[-V>  YW9? 9?@ $@9=,$@9CS%Mk %666S%=WS%=W $@9=,$@9CS&Mk &666S&=WS&=W $9=,$9CSup 66Wr 66W-O-h%6p\&6p\\\ p\\ r6X.%\b Xq G~ ?r=#P.%$P,,v$%rx$\vWvC>=TV9?, (9?$(uL9?,3(tL9?,(?uT?Aa{B(9?$(B9?$B9?$?tT?Aa{B(9?$(BB9?$9?$?9=,9=,9=,9CSv?uT?=a{B(A(B9?$BA?tT?=a{B(A(BB9?$Ax$ G rp,!>yE9?,G9?,GrSRxZ9?,Gryxr4aJAGBGAAAByE9?,GrSRryxr4aJAGpBGBAAB GC l\%=\&=\%M\&M\%n\&n%6$&6$\R\uW%=@ff&?@?W%M?C?W%nG@G@?!OW&=@ff?@?>W&M?HC?>W&MCC>W&nF@?>!AWR=33>?Wu?C>?x% G oDY 9:9:$-(=-]w.D*.9?%/b$ #C ..?-- %m:-s 9?%.`a b?:ED'ow.*.% 9?%wD('( GwG B QS>%>,z>=wz>Mwz>nw9:>69:$6>6 9DS>n>zRwzuwzvw GA mIpw--'Y.--'Ny. NNC@r GE IrV gIa RI I NI #Im $ GJ }k@}!O%6$6%6 ]}}}!A&6$6&6 @ GF Jw^ -o-qY2-@(9?b?s-yvJ^J-o-o w*w.*.wJ-y-q GK ySP36ey76y6ey6yM76y&6y GM ,W+76,&76,++&6,l76),++&6),k76K,++&6K,j76h,++&6h,h76W,++&6W,g GH pk2w.*.RBC9?,Kw--6Ks -ls99K#9?s99K#?9? -T6sB9?,6sHCap RK s-T--w.*b$N M6M.b$ 9? 99M 6M>. CyM@. Cyg-T.~B.uE--.-c(. cN.U?.-c'ww*?-T-<$C  (wV-w$C  ( GN 1\A61%761A6)1%76)1A6K1%76K1A6h1%76h1A6W1%76W16e1% GP z36e 76   9?6e 9D 6h 9?%9D 6K 9?%19D 6 9D 6) 9D 6 9D 6) 9D 6 V9D 6K .9D 6 9D 6) 9D 6 9D 6) 9D 6 9D 6) 9D 6 V9D 6K 9D 6 9D 6) 9D 6 9D 6) 9D 6K Vk9D 6W 6e 09D 6h V GQ nk}^9?KuO^|]9?KtS]zn*~O9?,}S9?,-xn&aKOS^]nKOS GR S\aI 7BS \]^KW]a  o#6ozWaoS IarYz'# B B BwI*OI-rIN )warYz(# B B B*zrF a<S S  zz6S \6S ]6S ^ GT NAUON&-'-Mw.*w.*.- 7..  - G8S LP  -M GL bU K?9:9:$ +-D%b-D GV ]U%wJ'R%wv!]a(-s( GY eE:7-h7%-s'Jeu!]a=' GZ W C+9:9:$-@` G ] Zym_Z6 99sgabv_Z'dwg*bj_ Gp@_ b` 7e O_s                                                 Gh zZ  G^ w#!--(.--( Gf kr-^O%>Nk 9?,dkk'k Gn c<                                                  G g k t56r*r*$w.*).- 1r$$ G& o l }7i#? Gp H ^(#:7%.%-/w.%*V# p wX* aX aX H.%,E D pp9?V rX F wT* rT H TpVX Gu pG{N-pK-pw.9:*.9:l Gr os  w t O .%}( GO{ J u6SL.PwL*L@.% }J  Gy Iz L ' G} O,                                             G~ z|b+Y U  U  U  U  G@ c[$ U  U  U  U                                              G B  uW# G D A [R#' GC .c,.  .  .  .  .  .  .  .  .  .  .   G I R \ C!w.*w*9:Y9: 9P 9: 69: '69: 69?-R  GC O;t                       GE zL@  U  GF BU1 %X%[C GG @r^ #r*r*(kw.*).N9?&()r*&[C!@ 9?:fr@!@ 9?.K'?-"'CaY W @  (wC*a'( GK v; D;w * '^&*##  GCM g35 D;w * '^&*##  G DR FGu5w *b$F X  (wF*wF* w.F*_  Da .F eD, ' GH O t}q9.=r9*r9*$r*9 9 9?$r999K$9b9$$ G9N QFXGZ Q%G9?%Q\ G?6 G G S P @   GT T w *w9:*w.9:*.9:/n.9:< GV U 9w *w9:*w.9:*.9:/n.9:<w? GGY qTzPq%w.*-'9: w*669P rw *-'w* -"w. *F.F.wF*Fa . a.9:B9:9:-( a.9:B9:9:"-(M w *-'6666mbw.*w. .   69DB9? q_w9:*w.9:*.9:;n.9:Cqw?--p.Iܵ< rIh6r-p(BCM-(Mmw9:*9:  GQ ViCc VR6C6CFC:Z:0DFR:?)DD00:L=:0DFRw-L'iCf-L :9?%@iD#?PV>FV@ի?6 #?# BbZb$PP?FV@ի?6 #?# Bab$PP@?FV@ի?6 #?# Bdb$PPFV@ի?6 #?-Lb$PZ-Lvadcab(#AAAKrv*vadcda(#AAAKrv*vadcbV(#AAA-Lwv*c-L:ZX%[w*a-L(c:=:0DFRcDD00X%[[w*a-L(iD#? Gd *i 9:7*w.9:*w.9:****  ** ** **9:i* GCZ \_^ _ ` a b  e c M spw.*(\9?%B?@\9?%BX_9?%C?p_9?%C Gf g h =6g 6666 G g i vm -mw *i ~w *~9:9:$ -" R9: -p'-m-( Gi YJC\M-Yw *q -"Cw.*  R9: w.*-Y( a MMw.*w*Z 6Z[9: 6[%MZ99[fff? -Y Grj aL 6Hr.a/r~!j af q  Gl e A."e N GBo k ~ $sB.9:;wB*wB*'nB[BC'( GW d @!A&r.*-d   G Bm z' Gn AY"9:9:$-(9?%YK-@-v9?%9P999?b?-vAdNw*r.*uN-OLw.A*@?.A M @(^A'( G @g  ^Y@a/!}.@-U G .@V $'( Gq NkQ(\jewj*Nw.j*.jM '?jjw.*r*w*Z Z  'Z -Hr*-EKZ9?/bN-H'-ZN#??6ZNU?wG 99?ZRwR99Ň?RaN Rw*r.* 99Na/!K iRZ>.k6Zr iRZ?9P .-'. R a/!Kw*Xr.*w0ooo0.&  w.&J@@ @ha _ |#Ch J~@-H-$C  (P/-P$C  (w.*X%[.w.*. C .&SSw.*-fr.*-fX-fX&S-fX%[Sw*a GEv  z K x W1E.K ,wE*E- '' GM@ #zMa lQr*Mw h M G@tW@&y?UxU/xUpGetLocalURL: pMapName: UU ONS-ArcticStronghold!t%aC ONS-Aridoom!A%cC ONS-Ascendancy!C%fC !ONS-Crossfire!J%nC GONS-Dawn!L%oC mONS-Dria!P%wC ONS-Frostbite!S%|C ONS-Primeval!U%C ONS-RedPlanet!Z%@ C ONS-Severance![%A C @ONS-Torlan!_%B C /a0 WQ%Q7!z9WW Q!W Q%QZ10 Gu W+8--"-s-s^A9:9:$~- w*-" -O -w*V'A-#- r*a$C  (Aa$C  (- w*-"-Ow.*%w. . *. M G B~n=)~&9:9:$U GCxU?>x GEHB>#?? GGkW?ek 6k6LkLTE@F? GIhuEA`r*-"m sw.* YZZw0ooo0HQ |99wHh%Mh,2| IZ|I8wa4\Z(*MZh?$4CD T4|4~9?hI-O4 ЄF6b$4#B &b$4#HCB &b$4#HB &b$4#HCB &b$4#HB  V-O4ms G@@@@LIVIa!^`@ G @@@T3c3  3  3  3  3  3  3  3  3  3  3   G @XO                       GZ\t1(wL*.-|.r|*r|*w|||K$$$ G|@[_@>S >.-_ wL*9PL -_ G@ ^vj Hw FNaT vsN*NS ro G@G//----------------------------------------------------------- // //----------------------------------------------------------- class VehiclePickupRules extends GameRules; function bool OverridePickupQuery(Pawn Other, Pickup item, out byte bAllowPickup) { if (Other.IsA('Vehicle') && Vehicle(Other).bDriving) { item.Touch(Vehicle(Other).Driver); bAllowPickup = 0; return True; } return False; } K//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShockExplosion extends Emitter; #exec OBJ LOAD FILE="..\Textures\ExplosionTex.utx" #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" simulated function PostBeginPlay() { local PlayerController PC; if (Level.NetMode == NM_DedicatedServer) { LifeSpan = 0.2; return; } PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 6000) ) { Emitters[0].Disabled = true; Emitters[2].Disabled = true; Emitters[3].Disabled = true; Emitters[4].Disabled = true; Emitters[6].Disabled = true; } } f//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldHitEffectRed extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" Ng//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldHitEffectBlue extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" adDOO s:r.*r* LdL"n . Gc//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldHitEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" hs X NKw.*w*X.-' GjwJfGZ c  Glnjgr  Gopmrvo 5^'w*V'$C  (OI%I7rI*AI&IBI 99B{IBIZ"w{*N9P{ 2N GBiY @s!N! $3YE;5SAc//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldEffectRed extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" d//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldEffectBlue extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" `//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShieldEffect extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" qx^Ky.k(Hwy*w.*Dy Gyv\ @y)G! $3YB5SAgd//============================================================================= // ONSShockTankShieldComboHit //============================================================================= // Created by Alan Willard (C) 2004 Epic Games //============================================================================= class ONSShockTankShieldComboHit extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" YvNo99Unvow.*w.*.-(daf^nv'.-'daf^nv'Mwd*Jd-]d&^]fo^#kfn^#fjdf^ Gj$//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankShield extends Actor; #exec OBJ LOAD FILE=..\StaticMeshes\ONS-BPJW1.usx var Emitter ShockShieldEffect, ShockShieldHitEffect; function Bump( actor Other ) { if ( Projectile(Other) != None ) { Other.HitWall(-1*Normal(Other.Velocity),self); } } function TakeDamage(int Dam, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { if (ONSShockTankCannon(Owner) != None) ONSShockTankCannon(Owner).NotifyShieldHit(Dam, instigatedBy); } simulated function SpawnHitEffect(byte TeamNum) { if (Level.NetMode != NM_DedicatedServer) { if (ShockShieldEffect != None) { if (TeamNum == 1) ShockShieldHitEffect = spawn(class'ONSShockTankShieldHitEffectBlue', self); else ShockShieldHitEffect = spawn(class'ONSShockTankShieldHitEffectRed', self); } if (ShockShieldHitEffect != None && Owner != None && ONSShockTankCannon(Owner) != None) Owner.AttachToBone(ShockShieldEffect, 'ElectroGun'); } } simulated function ActivateShield(byte TeamNum) { SetCollision(True, False, False); if (Level.NetMode != NM_DedicatedServer) { if (ShockShieldEffect == None) { if (TeamNum == 1) ShockShieldEffect = spawn(class'ONSShockTankShieldEffectBlue', self); else ShockShieldEffect = spawn(class'ONSShockTankShieldEffectRed', self); PlaySound(sound'ONSBPSounds.ShockTank.ShieldActivate', SLOT_None, 2.0); } if (ShockShieldEffect != None && Owner != None && ONSShockTankCannon(Owner) != None) Owner.AttachToBone(ShockShieldEffect, 'ElectroGun'); } } simulated function DeactivateShield() { SetCollision(False, False, False); if (Level.NetMode != NM_DedicatedServer) PlaySound(sound'ONSBPSounds.ShockTank.ShieldOff', SLOT_None, 2.0); if (ShockShieldEffect != None) ShockShieldEffect.Destroy(); } simulated function Destroyed() { if (ShockShieldEffect != None) ShockShieldEffect.Destroy(); Super.Destroyed(); } K//============================================================================= // ONSShockTankProximityExplosion //============================================================================= // Created by Alan Willard (C) 2004 Epic Games //============================================================================= // Should be offset from Paladin origin by 70 units along Z axis. //============================================================================= class ONSShockTankProximityExplosion extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" function PostBeginPlay() { local PlayerController PC; if (Level.NetMode == NM_DedicatedServer) { LifeSpan = 0.2; return; } PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 6000) ) { Emitters[3].Disabled = true; Emitters[4].Disabled = true; } } {9//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankProjectile extends ShockProjectile; var ONSShockBall ONSShockBallEffect; simulated function PostBeginPlay() { Super(Projectile).PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { ONSShockBallEffect = Spawn(class'ONSShockBall', self); ONSShockBallEffect.SetBase(self); } Velocity = Speed * Vector(Rotation); // starts off slower so combo can be done closer tempStartLoc = Location; } simulated function Destroyed() { if (ONSShockBallEffect != None) { if ( bNoFX ) ONSShockBallEffect.Destroy(); else ONSShockBallEffect.Kill(); } Super.Destroyed(); } simulated function DestroyTrails() { if (ONSShockBallEffect != None) ONSShockBallEffect.Destroy(); } simulated function ProcessTouch (Actor Other, vector HitLocation) { if (Owner != None && ONSShockTankCannon(Owner) != None && Other == ONSShockTankCannon(Owner).ShockShield) ProximityExplode(); else Super.ProcessTouch(Other, HitLocation); } simulated singular function HitWall(vector HitNormal, actor Wall) { local PlayerController PC; if (Owner != None && ONSShockTankCannon(Owner) != None && Wall == ONSShockTankCannon(Owner).ShockShield) ProximityExplode(); else { if ( Role == ROLE_Authority ) { if ( !Wall.bStatic && !Wall.bWorldGeometry ) { if ( Instigator == None || Instigator.Controller == None ) Wall.SetDelayedDamageInstigatorController( InstigatorController ); Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType); if (DamageRadius > 0 && Vehicle(Wall) != None && Vehicle(Wall).Health > 0) Vehicle(Wall).DriverRadiusDamage(Damage, DamageRadius, InstigatorController, MyDamageType, MomentumTransfer, Location); HurtWall = Wall; } MakeNoise(1.0); } Explode(Location + ExploWallOut * HitNormal, HitNormal); if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) { if ( ExplosionDecal.Default.CullDistance != 0 ) { PC = Level.GetLocalPlayerController(); if ( !PC.BeyondViewDistance(Location, ExplosionDecal.Default.CullDistance) ) Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); else if ( (Instigator != None) && (PC == Instigator.Controller) && !PC.BeyondViewDistance(Location, 2*ExplosionDecal.Default.CullDistance) ) Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); } else Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal)); } HurtWall = None; } } simulated function Explode(vector HitLocation,vector HitNormal) { SuperExplosion(); } function ProximityExplode() { PlaySound(ComboSound, SLOT_None,1.0,,800); ONSShockTankCannon(Owner).ProximityExplosion(); Destroy(); } function SuperExplosion() { local actor HitActor; local vector HitLocation, HitNormal; HurtRadius(ComboDamage, ComboRadius, class'DamTypeShockTankShockBall', ComboMomentumTransfer, Location ); Spawn(class'ONSShockTankShockExplosion'); 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(); Destroy(); } Gclass ONSShockTankMuzzleFlash extends Emitter; function PostBeginPlay() { local PlayerController PC; PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 4000) ) { Emitters[1].Disabled = true; Emitters[2].Disabled = true; Emitters[3].Disabled = true; } } {//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankFactory extends ONSVehicleFactory; @b @AE?&)M!B $a`u PS//------------------------------- // Paladin explosion effect //------------------------------- class ONSShockTankDeathExp extends Emitter; L//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTankCannon extends ONSWeapon; var() float MaxShieldHealth; var() float MaxDelayTime; var() float ShieldRechargeRate; var float LastShieldHitTime; var float CurrentShieldHealth; var float CurrentDelayTime; var float CurrentRechargeTime; var bool bShieldActive, bLastShieldActive; var bool bPutShieldUp; var byte ShieldHitCount, LastShieldHitCount; var ONSShockTankShield ShockShield; replication { reliable if (bNetOwner && Role == ROLE_Authority) CurrentShieldHealth; reliable if (Role == ROLE_Authority) bShieldActive, ShieldHitCount; } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); ShockShield = spawn(class'ONSShockTankShield', self); if (ShockShield != None) AttachToBone(ShockShield, 'ElectroGun'); } function byte BestMode() { local bot B; if ( CurrentShieldHealth <= 0 ) return 0; if ( Projectile(Instigator.Controller.Target) != None ) return 1; B = Bot(Instigator.Controller); if ( (B == None) || (B.Enemy == None) ) return 0; if ( bPutShieldUp || !B.EnemyVisible() ) { LastShieldHitTime = Level.TimeSeconds; bPutShieldUp = false; return 1; } if ( VSize(B.Enemy.Location - Location) < 900 ) { if ( bShieldActive ) return 0; else return 1; } if ( bShieldActive && (Level.TimeSeconds - LastShieldHitTime < 2) ) return 1; else if ( B.Enemy != B.Target ) return 0; else { // check if near friendly node, and between it and enemy if ( (B.Squad.SquadObjective != None) && (VSize(B.Pawn.Location - B.Squad.SquadObjective.Location) < 1000) && ((Normal(B.Enemy.Location - B.Squad.SquadObjective.Location) dot Normal(B.Pawn.Location - B.Squad.SquadObjective.Location)) > 0.7) ) return 1; // use shield if heavily damaged if ( B.Pawn.Health < 0.3 * B.Pawn.Default.Health ) return 1; // use shield against heavy vehicles if ( (B.Enemy == B.Target) && (Vehicle(B.Enemy) != None) && Vehicle(B.Enemy).ImportantVehicle() && (B.Enemy.Controller != None) && ((Vector(B.Enemy.Controller.Rotation) dot Normal(Instigator.Location - B.Enemy.Location)) > 0.9) ) return 1; return 0; } } function ShieldAgainstIncoming(optional Projectile P) { if ( P != None ) { if ( FireCountDown > (VSize(P.Location - Location) - 1100)/VSize(P.Velocity) ) return; // put shield up if pointed in right direction if ( Level.Game.GameDifficulty < 5 ) { CalcWeaponFire(); if ( (Normal(P.Location - WeaponFireLocation) dot vector(WeaponFireRotation)) < 0.7 ) return; } LastShieldHitTime = Level.TimeSeconds; bPutShieldUp = true; Instigator.Controller.FireWeaponAt(Instigator.Controller.Focus); } else if ( Instigator.Controller.Enemy != None ) { if ( (FireCountDown > 0.2) && (FRand() < 0.6) ) return; LastShieldHitTime = Level.TimeSeconds; bPutShieldUp = true; Instigator.Controller.FireWeaponAt(Instigator.Controller.Focus); } } event bool AttemptFire(Controller C, bool bAltFire) { if (Role != ROLE_Authority || bForceCenterAim) return False; if (bAltFire) { if ( ShockShield != None ) { CurrentDelayTime = 0; if (!bShieldActive && CurrentShieldHealth > 0) { ActivateShield(); } } } else if ( (AIController(C) != None) && bShieldActive && (VSize(C.Target.Location - Instigator.Location) > 900) ) { DeactivateShield(); } 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 = FireInterval; Fire(C); } AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; return True; } return False; } function CeaseAltFire() { if (ShockShield != None) DeactivateShield(); } simulated function Destroyed() { if (ShockShield != None) ShockShield.Destroy(); Super.Destroyed(); } simulated function ActivateShield() { bShieldActive = true; if (ShockShield != None) ShockShield.ActivateShield(Team); } simulated function DeactivateShield() { bShieldActive = false; if (ShockShield != None) ShockShield.DeactivateShield(); } // For when the shield is hit by our own shockball function ProximityExplosion() { local Emitter ComboHit; ComboHit = Spawn(class'ONSShockTankShieldComboHit', self); AttachToBone(ComboHit, 'BigGun'); ComboHit.SetRelativeLocation(vect(300,0,0)); SetTimer(0.5, false); } function Timer() { PlaySound(sound'ONSBPSounds.ShockTank.ShockBallExplosion', SLOT_None,1.0,,800); Spawn(class'ONSShockTankProximityExplosion', self,, Location + vect(0,0,-70)); HurtRadius(200, 900, class'DamTypeShockTankProximityExplosion', 150000, Location); } simulated function PostNetReceive() { Super.PostNetReceive(); if (bShieldActive != bLastShieldActive) { if (bShieldActive) ActivateShield(); else DeactivateShield(); bLastShieldActive = bShieldActive; } if (ShockShield != None && ShieldHitCount != LastShieldHitCount) { ShockShield.SpawnHitEffect(Team); LastShieldHitCount = ShieldHitCount; } } //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 = FireInterval; AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; if (!bIsAltFire) 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); } } } function NotifyShieldHit(int Dam, Pawn instigatedBy) { if (Pawn(Owner) != None && Pawn(Owner).Controller != None && ((InstigatedBy == None) || (InstigatedBy.Controller == None) || !InstigatedBy.Controller.SameTeamAs(Pawn(Owner).Controller))) { LastShieldHitTime = Level.TimeSeconds; CurrentShieldHealth -= Dam; ShieldHitCount++; ShockShield.SpawnHitEffect(Team); } } simulated function Tick(float DT) { Super.Tick(DT); if (ShockShield == None || Role < ROLE_Authority) return; if (CurrentShieldHealth <= 0) // Ran out of shield energy so deactivate DeactivateShield(); if (!bShieldActive && (CurrentShieldHealth < MaxShieldHealth)) // Shield is off and needs recharge { if (CurrentDelayTime < MaxDelayTime) // Shield is in delay CurrentDelayTime += DT; else // Shield is in recharge { CurrentShieldHealth += ShieldRechargeRate * DT; if (CurrentShieldHealth >= MaxShieldHealth) CurrentShieldHealth = MaxShieldHealth; } } } simulated function float ChargeBar() { return FClamp(CurrentShieldHealth/MaxShieldHealth, 0.0, 0.999); } simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) { local actor Victims; local float damageScale, dist; local vector dir; foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation ) { // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if( (Victims != self) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') ) { dir = Victims.Location - HitLocation; dist = FMax(1,VSize(dir)); dir = dir/dist; damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); Victims.TakeDamage ( damageScale * DamageAmount, Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType ); if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, Instigator.Controller, DamageType, Momentum, HitLocation); } } } {JJZK GFj7 LI9:9:$=9:9:$Y9?^a9:Y 9P`6.%^`6.%^`6.&^`6.&^`^S`D G`c[//----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockTank extends ONSWheeledCraft; function bool ImportantVehicle() { return true; } function ShouldTargetMissile(Projectile P) { local AIController C; C = AIController(Controller); if ( (C != None) && (C.Skill >= 2.0) ) ONSShockTankCannon(Weapons[0]).ShieldAgainstIncoming(P); } function bool Dodge(eDoubleClickDir DoubleClickMove) { ONSShockTankCannon(Weapons[0]).ShieldAgainstIncoming(); return false; } function VehicleCeaseFire(bool bWasAltFire) { Super.VehicleCeaseFire(bWasAltFire); if (bWasAltFire && ONSShockTankCannon(Weapons[ActiveWeapon]) != None) ONSShockTankCannon(Weapons[ActiveWeapon]).CeaseAltFire(); } event TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { local vector ShieldHitLocation, ShieldHitNormal; // don't take damage if should have been blocked by shield if ( (Weapons.Length > 0) && ONSShockTankCannon(Weapons[0]).bShieldActive && (ONSShockTankCannon(Weapons[0]).ShockShield != None) && (Momentum != vect(0,0,0)) && (HitLocation != Location) && (DamageType != None) && (ClassIsChildOf(DamageType,class'WeaponDamageType') || ClassIsChildOf(DamageType,class'VehicleDamageType')) && !ONSShockTankCannon(Weapons[0]).ShockShield.TraceThisActor(ShieldHitLocation,ShieldHitNormal,HitLocation,HitLocation - 2000*Normal(Momentum)) ) return; // Don't take self inflicated damage from proximity explosion if (DamageType == class'DamTypeShockTankProximityExplosion' && EventInstigator != None && EventInstigator == self) return; Super.TakeDamage(Damage, EventInstigator, HitLocation, Momentum, DamageType); } simulated function vector GetTargetLocation() { return Location + vect(0,0,1)*CollisionHeight; } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.PaladinGreen'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.PaladinTan'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanelsP'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanels'); L.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_framesP'); L.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectSwirl'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockBallTrail'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2a'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockRingTex'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore'); L.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SmoothRing'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.Ripples1P'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.Ripples2P'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.BoloBlob'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ElectricShockTexG'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ElectricShockTexG2'); L.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); L.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SoftFade'); L.AddPrecacheMaterial(Material'AbaddonArchitecture.Base.bas27go'); } simulated function UpdatePrecacheStaticMeshes() { Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.PaladinGreen'); Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.PaladinTan'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanelsP'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.ElecPanels'); Level.AddPrecacheMaterial(Material'ExplosionTex.Framed.exp2_framesP'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectSwirl'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockBallTrail'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2a'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockRingTex'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SmoothRing'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.Ripples1P'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.Ripples2P'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.BoloBlob'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ElectricShockTexG'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ElectricShockTexG2'); Level.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); Level.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.SoftFade'); Level.AddPrecacheMaterial(Material'AbaddonArchitecture.Base.bas27go'); Super.UpdatePrecacheMaterials(); } N //----------------------------------------------------------- // //----------------------------------------------------------- class ONSShockBall extends Emitter; #exec OBJ LOAD FILE="..\Textures\AW-2k4XP.utx" function PostBeginPlay() { local PlayerController PC; PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 6000) ) { Emitters[0].Disabled = true; Emitters[1].Disabled = true; Emitters[2].Disabled = true; Emitters[6].Disabled = true; } } {//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMortarTargetBeam extends Actor; var vector TargetLocation, ArtilleryLocation; var float MoveSpeedFactor, MinMoveSpeed; var bool bReticleActivated; simulated function SetStatus(bool bStatus) { if (bReticleActivated != bStatus) { bReticleActivated = bStatus; if (bReticleActivated) SetStaticMesh(StaticMesh'ONS-BPJW1.Target'); else SetStaticMesh(StaticMesh'ONS-BPJW1.TargetNo'); } } function Tick(float DeltaTime) { local vector MoveDir; local float MoveDist; local float CurrentSpeed; local Rotator NewRotation; MoveDir = (TargetLocation + vect(0,0,100)) - Location; MoveDist = VSize(MoveDir); CurrentSpeed = FMax(MoveDist * MoveSpeedFactor, MinMoveSpeed); if (MoveDist > 50.0) SetLocation(Location + (Normal(MoveDir) * CurrentSpeed * DeltaTime)); NewRotation = Rotator(Location - ArtilleryLocation); NewRotation.Pitch = 0; SetRotation(NewRotation); } EKvM. w*b.7k'a.wb* wa*@aB%&%aBbbpa Gbu;//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMortarShell extends Projectile; //#exec TEXTURE IMPORT NAME=NewFlakSkin FILE=textures\jflakslugel1.bmp GROUP="Skins" DXT=5 var xemitter trail; var actor Glow; var class ExplosionEffectClass; var class AirExplosionEffectClass; var bool bExploded; simulated function PostBeginPlay() { local Rotator R; local PlayerController PC; if ( !PhysicsVolume.bWaterVolume && (Level.NetMode != NM_DedicatedServer) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 6000 ) Trail = Spawn(class'FlakShellTrail',self); Glow = Spawn(class'FlakGlow', self); } Super.PostBeginPlay(); R = Rotation; R.Roll = 32768; SetRotation(R); } simulated function StartTimer(float Fuse) { SetTimer(Fuse, False); } simulated function Timer() { local int i; local ONSArtilleryShellSmall SmallShell; PlaySound(sound'ONSBPSounds.Artillery.ShellBrakingExplode'); if ( Level.NetMode != NM_DedicatedServer ) spawn(class'ONSArtilleryShellSplit', self, , Location, Rotation); for (i=0; i<5; i++) { SmallShell = spawn(class'ONSArtilleryShellSmall', self, , Location, Rotation); if ( SmallShell != None ) SmallShell.Velocity = Velocity + (VRand() * 500.0); } Destroy(); } simulated function Destroyed() { if ( !bExploded ) ExplodeInAir(); if ( Trail != None ) Trail.mRegen=False; if ( glow != None ) Glow.Destroy(); Super.Destroyed(); } simulated function ProcessTouch(Actor Other, Vector HitLocation) { if (Other != Instigator && !Other.IsA('ONSMortarShell')) { SpawnEffects(HitLocation, -1 * Normal(Velocity) ); Explode(HitLocation,Normal(HitLocation-Other.Location)); } } simulated function SpawnEffects( vector HitLocation, vector HitNormal ) { local PlayerController PC; PlaySound(sound'ONSBPSounds.Artillery.ShellFragmentExplode', SLOT_None, 2.0); if ( EffectIsRelevant(Location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 3000 ) spawn(ExplosionEffectClass,,,HitLocation + HitNormal*16 ); spawn(ExplosionEffectClass,,,HitLocation + HitNormal*16 ); spawn(class'RocketSmokeRing',,,HitLocation + HitNormal*16, rotator(HitNormal) ); if ( (ExplosionDecal != None) && (Level.NetMode != NM_DedicatedServer) ) Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal)); } } simulated function Landed( vector HitNormal ) { SpawnEffects( Location, HitNormal ); Explode(Location,HitNormal); } simulated function HitWall (vector HitNormal, actor Wall) { Landed(HitNormal); } simulated function Explode(vector HitLocation, vector HitNormal) { bExploded = true; HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation); Destroy(); } simulated function ExplodeInAir() { bExploded = true; PlaySound(sound'ONSBPSounds.Artillery.ShellFragmentExplode', SLOT_None, 2.0); if ( Level.NetMode != NM_DedicatedServer ) spawn(AirExplosionEffectClass); HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, vect(0,0,0)); Explode(vect(0,0,0),vect(0,0,0)); Destroy(); } event TakeDamage(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { if (Damage > 0 && (EventInstigator == None || EventInstigator.Controller == None || Instigator == None || Instigator.Controller == None || !EventInstigator.Controller.SameTeamAs(Instigator.Controller))) ExplodeInAir(); } Y}//----------------------------------------------------------- // //----------------------------------------------------------- class ONSMortarCamera extends ONSMortarShell; var bool bDeployed, bLastDeployed; var bool bShotDown, bLastShotDown; var ONSMortarTargetBeam TargetBeam; var float TargetUpdateTime; var Emitter Thruster[4]; var byte TeamNum; var vector MortarCameraOffset; var vector DeployedLocation; var float MessageUpdateTime; var vector RealLocation, LastRealLocation; // for AI use var float DeployRand; var float MaxHeight; var float TargetZ; var float AnnounceTargetTime; replication { reliable if (Role == ROLE_Authority) RealLocation, bDeployed, bShotDown, TeamNum; } simulated function PostBeginPlay() { Super.PostBeginPlay(); if (Instigator != None && Instigator.Controller != None) TeamNum = Instigator.Controller.GetTeamNum(); } simulated function PostNetReceive() { Super.PostNetReceive(); if (bDeployed != bLastDeployed) { GotoState('Deployed'); bLastDeployed = bDeployed; } if (bShotDown != bLastShotDown) { ShotDown(); bLastShotDown = bShotDown; } if ( RealLocation != LastRealLocation ) { SetLocation(RealLocation); LastRealLocation = RealLocation; } } function Deploy() { AnnounceTargetTime = Level.TimeSeconds + 1 + (7 - Level.Game.GameDifficulty); bDeployed = True; AmbientSound = sound'ONSBPSounds.Artillery.CameraAmbient'; GotoState('Deployed'); } simulated function SpawnThrusters() { if ( Level.NetMode == NM_DedicatedServer ) return; if (TeamNum == 0) { Thruster[0] = spawn(class'ONSArtilleryCamThrusterRed'); Thruster[1] = spawn(class'ONSArtilleryCamThrusterRed'); Thruster[2] = spawn(class'ONSArtilleryCamThrusterRed'); Thruster[3] = spawn(class'ONSArtilleryCamThrusterRed'); } else { Thruster[0] = spawn(class'ONSArtilleryCamThrusterBlue'); Thruster[1] = spawn(class'ONSArtilleryCamThrusterBlue'); Thruster[2] = spawn(class'ONSArtilleryCamThrusterBlue'); Thruster[3] = spawn(class'ONSArtilleryCamThrusterBlue'); } AttachToBone(Thruster[0], 'BoosterRight'); AttachToBone(Thruster[1], 'BoosterLeft'); AttachToBone(Thruster[2], 'BoosterTop'); AttachToBone(Thruster[3], 'BoosterBottom'); } simulated state Deployed { Begin: RealLocation = Location; Velocity = vect(0,0,0); DeployedLocation = Location; SpawnThrusters(); SetPhysics(PHYS_Projectile); bRotateToDesired = true; DesiredRotation = rot(-16384,0,0); PlayAnim('Deploy', 1.0, 0.0); if ( Instigator != None && Instigator.IsLocallyControlled() && Instigator.IsHumanControlled() ) { TargetBeam = spawn(class'ONSMortarTargetBeam', self,, Location, rot(0,0,100)); TargetBeam.ArtilleryLocation = Instigator.Location; ONSArtilleryCannon(Owner).NotifyDeployed(); } sleep(2.0); bRotateToDesired = false; RealLocation = Location; } simulated function SetTarget(vector loc) { if (TargetBeam != None) TargetBeam.TargetLocation = loc; } simulated function SetReticleStatus(bool bStatus) { if (TargetBeam != None) TargetBeam.SetStatus(bStatus); } simulated function bool SpecialCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation, bool bBehindView) { if (bDeployed && !bBehindView) CameraLocation = Location + (MortarCameraOffset >> Rotation); else CameraLocation = Location + (vect(-800,0,300) >> CameraRotation); return True; } simulated function Tick(float DT) { local actor HitActor; local vector HitNormal, HitLocation; local Controller C; local Bot B; Super.Tick(DT); if (Instigator == None || ONSArtillery(Instigator) == None || ONSArtillery(Instigator).Driver == None) { bShotDown = True; ShotDown(); } if ( Level.TimeSeconds - MessageUpdateTime > 2.0 ) { if ( (Instigator != None) && (Instigator.Controller != None) && (Instigator.Controller == Level.GetLocalPlayerController()) && (Level.GetLocalPlayerController().ViewTarget == self) ) { if (bDeployed) PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 33); else PlayerController(Instigator.Controller).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 34); } MessageUpdateTime = Level.TimeSeconds; } if (!bDeployed) { SetRotation(Rotator(Velocity)); if ( (Instigator != None) && (AIController(Instigator.Controller) != None) && (Velocity.Z <= 0) ) { if ( MaxHeight == 0 ) { MaxHeight = Location.Z; DeployRand = FRand(); if ( DeployRand < 0.5 ) DeployRand = 1; } if ( Location.Z - TargetZ > (0.2 + 0.8*DeployRand) * (MaxHeight - TargetZ) ) return; HitActor = Trace(HitLocation, HitNormal, Instigator.Controller.Target.Location, Location, false); if ( HitActor == None ) { Deploy(); } } } else if ( (Level.TimeSeconds - AnnounceTargetTime > 1.0) && (Role == ROLE_Authority) ) { if ( (Instigator == None) || (Instigator.Controller == None) || (ONSArtilleryCannon(Owner) == None) ) { Disable('Tick'); return; } AnnounceTargetTime = Level.TimeSeconds; if ( !bShotDown ) { For ( C=Level.ControllerList; C!=None; C=C.NextController ) { B = Bot(C); if ( (B != None) && !B.SameTeamAs(Instigator.Controller) && (B.Pawn != None) && !B.Pawn.IsFiring() && ((B.Enemy == None) || (B.Enemy == Instigator) || !B.EnemyVisible()) && B.LineOfSightTo(self) ) { // give B a chance to shoot at me B.GoalString = "Destroy Mortar Camera"; B.Target = self; B.SwitchToBestWeapon(); if ( B.Pawn.CanAttack(self) ) { B.DoRangedAttackOn(self); if ( FRand() < 0.5 ) break; } } } } } if ( (Instigator != None) && (Instigator.Controller == Level.GetLocalPlayerController()) && (ONSArtilleryCannon(Owner) != None) && (Level.TimeSeconds - TargetUpdateTime > 0.1) ) { // Target Prediction TargetUpdateTime = Level.TimeSeconds; ONSArtilleryCannon(Owner).PredictTarget(); } } simulated function ShotDown() { if ( ONSArtilleryCannon(Owner) != None ) ONSArtilleryCannon(Owner).AllowCameraLaunch(); PlaySound(sound'ONSBPSounds.Artillery.CameraShotDown', SLOT_None, 1.5); SetPhysics(PHYS_Falling); } function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { if ((Damage > 0) && ((InstigatedBy == None) || (InstigatedBy.Controller == None) || (Instigator == None) || (Instigator.Controller == None) || !InstigatedBy.Controller.SameTeamAs(Instigator.Controller))) { bShotDown = True; ShotDown(); } } simulated function Destroyed() { local int i; if (TargetBeam != None) TargetBeam.Destroy(); for(i=0; i<=3; i++) { if (Thruster[i] != None) Thruster[i].Destroy(); } Super.Destroyed(); } simulated function SpawnEffects( vector HitLocation, vector HitNormal ) { if ( bShotDown ) Super.SpawnEffects(HitLocation, HitNormal); else if ( EffectIsRelevant(Location,false) ) spawn(class'RocketSmokeRing',,,HitLocation + HitNormal*16, rotator(HitNormal) ); } simulated function Explode(vector HitLocation, vector HitNormal) { if ( bShotDown ) Super.Explode(HitLocation, HitNormal); else { bExploded = true; Destroy(); } } Dc@a -cr*\.GOw\*]9P\ \ \  76]%6]6]%]-c Gj//----------------------------------------------------------- // //----------------------------------------------------------- class ONSIncomingShellSound extends Actor; var() float SoundLength; var() sound ShellSound; function StartTimer(float TimeToImpact) { SetTimer(TimeToImpact - SoundLength, false); } function Timer() { PlaySound(ShellSound, SLOT_None, 2.0, false, 500.0); Destroy(); } ]x//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualMissileSmokeTrail extends Emitter; r//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualMissileIgnite extends Emitter; z//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualMissileExplosion extends Emitter; function PostBeginPlay() { local PlayerController PC; Super.PostBeginPlay(); PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (PC.ViewTarget == None) || (VSize(Location - PC.ViewTarget.Location) > 4000) ) Emitters[0].Disabled = true; } A//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualAttackCraftFactory extends ONSVehicleFactory; Tj @UMI)M!B $@$Aa`uPe//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualAttackCraft extends ONSAttackCraft; #exec OBJ LOAD FILE=ONSBPTextures.utx #exec OBJ LOAD FILE=CicadaTex.utx #exec OBJ LOAD FILE=CicadaSnds.uax var bool bHeatSeeker; var byte LastThrust; // The last throttle position var float DesiredPitch; var float CurrentPitch; var float PitchTime; var rotator FanYaw,TailYaw; var float FanYawRate; var int LastYaw, DesiredYaw; var float YawTime; var array Decoys; var Material LockedTexture; var Material LockedEffect; var localized string LockedMsg; var() HudBase.SpriteWidget HudMissileCount, HudMissileIcon; var() HudBase.NumericWidget HudMissileDigits; var() HudBase.DigitSet DigitsBig; var vector OldLockedTarget; // Hud Elements var float LastHudRenderTime; // Needed for animations var bool bLastLockType; // --- All this for a cool crosshair ;) // Animation Data. struct AnimData { var int key; // Current Key-Frame var array Value; // Value being worked with var array Dest; // Dest for this value to head towards var array Time; // How fast should it get there var array Delay; // Should there be a delay before this frame begins var array Tags; // Tag for the "event" when the frame is done }; // The 2 circles var AnimData SpinScale[2]; // Handles the Circle's scaling var AnimData SpinFade[2]; // Hanldes the Circle's Fading var AnimData SpinRot[2]; // Handles the Circle's Rotation // The Brackets var AnimData BracketScale; // Handles the Brackets Scaling var AnimData BracketFade; // Handles the Brackets Fading // The Missiles var AnimData MissileFade; // How bright is the missile count // Textures var TexRotator SpinCircles[2]; var texture Brackets; var texture MissileTick; var int LastMissileCnt; var bool bFreelanceStart; // AI hint function bool ImportantVehicle() { return !bFreelanceStart; } function KDriverEnter(Pawn P) { Super.KDriverEnter(P); Weapons[1].bActive = True; bFreelanceStart = ( (Bot(Controller) != None) && (Bot(Controller).Squad != None) && Bot(Controller).Squad.bFreelance && !ONSTeamAI(Bot(Controller).Squad.Team.AI).bAllNodesTaken ); } 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; } // - CenterDraw - Draws an images centered around a point. Optionally, it can stretch the image. simulated function CenterDraw(Canvas Canvas, Material Mat, float x, float y, float UScale, float VScale, optional bool bStretched) { local float u,v,w,h; u = Mat.MaterialUSize(); w = u * UScale; v = Mat.MaterialVSize(); h = v * VScale; Canvas.SetPos(x - (w/2), y - (h/2) ); if (!bStretched) Canvas.DrawTile(Mat,w,h,0,0,u,v); else Canvas.DrawTileStretched(Mat,w,h); } // - Update the data for a single animdata object. simulated function UpdateAnimData(out AnimData Data, float Deltatime) { local float key; if (Data.key >= Data.Value.Length) return; Key = Data.Key; if ( Data.Delay[Key] <= 0 ) // Make sure we aren't delaying this object { if ( Data.Time[Key] > 0 ) // Current keyframe { // Prefigure the constraint check for later on (ie: are we increasing or decreasing towards the Dest. // The constraint is critical for fades. if ( Data.Value[Key] < Data.Dest[Key] ) { // Interpolate Data.Value[Key] += (Data.Dest[Key] - Data.Value[Key]) * (DeltaTime / Data.Time[Key]); if (Data.Value[Key] > Data.Dest[Key]) Data.Value[Key] = Data.Dest[Key]; } else { // Interpolate Data.Value[Key] += (Data.Dest[Key] - Data.Value[Key]) * (DeltaTime / Data.Time[Key]); if (Data.Value[Key] < Data.Dest[Key]) Data.Value[Key] = Data.Dest[Key]; } Data.Time[Key] -= Deltatime; } else { // Trigger an event if the frame changes AnimFrameChange(Data.Tags[Key]); Data.Key++; } } else Data.Delay[Key]-= DeltaTime; // Count down the delay } // ClearAnimData - Scrubs the various arrays inside the struct simulated function ClearAnimData(out AnimData Data) { Data.Value.Remove(0,Data.Value.Length); Data.Dest.Remove(0,Data.Dest.Length); Data.Time.Remove(0,Data.Time.Length); Data.Delay.Remove(0,Data.Delay.Length); Data.Tags.Remove(0,Data.Tags.Length); Data.Key=0; } // AddAnimData - Adds data to the array. Have to do it here since object creation in defprops doesn't // support arrays within a struct simulated function AddAnimData(out AnimData Data, float NewValue, float NewDest, float NewTime, optional float NewDelay, optional name NewTag) { local int key; Key = Data.Value.Length + 1; Data.Value.Length = Key; Data.Value[Key-1] = NewValue; Data.Dest.Length = Key; Data.Dest[Key-1] = NewDest; Data.Time.Length = Key; Data.Time[Key-1] = NewTime; Data.Delay.Length = Key; Data.Delay[Key-1] = NewDelay; Data.Tags.Length = Key; Data.Tags[Key-1] = NewTag; } // Value - Returns the current value of the AnimStruct. If it's past the final key-frame, // it returns the final values. simulated function float Value(AnimData Data) { if (Data.Key0) { if (LastMissileCnt!=h) { ClearAnimData(MissileFade); AddAnimData(MissileFade,0,255,0.33,0.10); } y = (CY + (32*Scale) - (h*Scale) ); x1 = (CX - (51*Scale)); x2 = (CX + (18*Scale)); Canvas.SetPos(x1,y); Canvas.DrawTile(MissileTick,32*Scale,h*Scale,0,64-h,32,h); Canvas.SetPos(x2,y); Canvas.DrawTile(MissileTick,32*Scale,h*Scale,32,64-h,-32,h); Canvas.SetDrawColor(255,255,255,Value(MissileFade)); Canvas.SetPos(x1,y); Canvas.DrawTile(MissileTick,32*Scale,8*Scale,0,64-h,32,8); Canvas.SetPos(x2,y); Canvas.DrawTile(MissileTick,32*Scale,8*Scale,32,64-h,-32,8); } LastMissileCnt = h; } simulated function DrawHUD(Canvas Canvas) { local vector X,Y,Z, Dir, LockedTarget; local float Dist,scale; local PlayerController PC; local ONSHudOnslaught H; local bool bIsLocked; local float DeltaTime; if ( !ONSDualACSideGun(Weapons[0]).bLocked ) super.DrawHud(Canvas); DeltaTime = Level.TimeSeconds - LastHudRenderTime; LastHudRenderTime = Level.TimeSeconds; bIsLocked = ONSDualACSideGun(Weapons[0]).bLocked; PC = PlayerController(Owner); if (PC==None) return; H = ONSHudOnslaught(PC.MyHud); if (H==None) return; if ( ONSDualACSideGun(Weapons[0]).bLocked ) { if (bIsLocked != bLastLockType) // Initialize the Crosshair ResetAnimation(); Animate(Canvas,DeltaTime); GetAxes(PC.GetViewRotation(), X,Y,Z); LockedTarget = ONSDualACSideGun(Weapons[0]).LockedTarget; if (OldLockedTarget != LockedTarget) PlaySound(Sound'CicadaSnds.Hud.TargetLock', SLOT_None, 2.0); OldLockedTarget = LockedTarget; Dir = LockedTarget - Location; Dist = VSize(Dir); Dir = Dir/Dist; if ( (Dir dot X) > 0.4 ) { // Draw the Locked on Symbol Dir = Canvas.WorldToScreen( LockedTarget ); scale = float(Canvas.SizeX) / 1600; // new Stuff Canvas.SetDrawColor( 64,255,64,Value(SpinFade[0]) ); CenterDraw(Canvas, SpinCircles[0], Dir.X, Dir.Y, Value(SpinScale[0])*Scale, Value(SpinScale[0])*Scale ); Canvas.SetDrawColor(64,255,64,Value(SpinFade[1]) ); CenterDraw(Canvas, SpinCircles[1], Dir.X, Dir.Y, Value(SpinScale[1])*Scale, Value(SpinScale[1])*Scale ); Canvas.SetDrawColor(128,255,128,Value(BracketFade)); DrawBrackets(Canvas,Dir.X,Dir.Y,Scale); DrawMissiles(Canvas,Dir.X,Dir.Y,Scale); } } bLastLockType = bIsLocked; HudMissileCount.Tints[0] = H.HudColorRed; HudMissileCount.Tints[1] = H.HudColorBlue; H.DrawSpriteWidget( Canvas, HudMissileCount ); H.DrawSpriteWidget( Canvas, HudMissileIcon ); HudMissileDigits.Value = ONSDualACSideGun(Weapons[0]).LoadedShotCount; H.DrawNumericWidget(Canvas, HudMissileDigits, DigitsBig); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if (Role == ROLE_Authority) { if (WeaponPawns[0]!=None) WeaponPawns[0].Gun.SetOwner(self); if (Weapons.Length == 2 && ONSLinkableWeapon(Weapons[0]) != None) { ONSLinkableWeapon(Weapons[0]).ChildWeapon = Weapons[1]; if (ONSDualACSideGun(Weapons[1]) != None) ONSDualACSideGun(Weapons[1]).bSkipFire = True; if (ONSDualACSideGun(Weapons[0]) != None) ONSDualACSideGun(Weapons[0]).bFiresRight = true; } } } function DriverLeft() { Super.DriverLeft(); Weapons[1].bActive = False; } simulated function Tick(float DeltaTime) { local rotator Adjusted,EnginePitch; local int Yaw; local actor HitActor; local vector HitLocation, HitNormal; local float GroundDist; super.Tick(DeltaTime); if ( !IsVehicleEmpty() ) Enable('tick'); if ( (Bot(Controller) != None) && !Controller.InLatentExecution(Controller.LATENT_MOVETOWARD) ) { if ( Rise < 0 ) { if ( Velocity.Z < 0 ) { if ( Velocity.Z < -2000 ) Rise = -0.1; // FIX - use dist to adjust down as get closer HitActor = Trace(HitLocation, HitNormal, Location - vect(0,0,2000), Location, false); if ( HitActor != None ) { GroundDist = Location.Z - HitLocation.Z; if ( GroundDist/(-1*Velocity.Z) < 0.85 ) Rise = 1.0; } } } else if ( Rise == 0 ) { if ( !FastTrace(Location - vect(0,0,300),Location) ) Rise = FClamp((-1 * Velocity.Z)/MaxRiseForce,0.f,1.f); } } // Adjust the various effects if (Level.NetMode != NM_DedicatedServer) { if (LastThrust != CopState.ServerThrust) { if (CopState.ServerThrust<128) DesiredPitch = -10240; else if (CopState.ServerThrust>128) DesiredPitch = 10240; else DesiredPitch = 0; PitchTime = 1.0; LastThrust = CopState.ServerThrust; } if (CurrentPitch != DesiredPitch) { CurrentPitch += (DesiredPitch - CurrentPitch) * (DeltaTime / PitchTime); PitchTime -= DeltaTime; if (PitchTime<=0 || DesiredPitch == CurrentPitch) { PitchTime = 0.0; DesiredPitch = CurrentPitch; } } FanYaw.Yaw += FanYawRate * DeltaTime; EnginePitch.Pitch = CurrentPitch; SetBoneRotation('Engines', EnginePitch); SetBoneRotation('Fans_Left', FanYaw); SetBoneRotation('Fans_Right',FanYaw); Yaw = Rotation.Yaw; // Give some deadzone if (Yaw != LastYaw) { if ( (Yaw>0 && LastYaw>0) || (Yaw<0 && LastYaw<0) ) // Skip sign changes { if (LastYaw>Yaw) DesiredYaw=-6144; else DesiredYaw=6144; YawTime = 1.0; } } else { DesiredYaw=0; YawTime = 1.0; } LastYaw = Yaw; if (DesiredYaw != TailYaw.Yaw) { TailYaw.Yaw += (DesiredYaw-TailYaw.Yaw) * (DeltaTime/YawTime); YawTime-= DeltaTime; if (YawTime<=0 || DesiredYaw == TailYaw.Yaw) { YawTime = 0.0; TailYaw.Yaw = DesiredYaw; } } Adjusted = TailYaw; if (Adjusted.Yaw < -2048) Adjusted.Yaw += 2048; else if (Adjusted.Yaw > 2048) Adjusted.Yaw -= 2048; else Adjusted.Yaw = 0; SetBoneRotation('Rudder',Adjusted); } } simulated event DrivingStatusChanged() { local vector RotX, RotY, RotZ; local int i; super(ONSChopperCraft).DrivingStatusChanged(); if (bDriving && Level.NetMode != NM_DedicatedServer && !bDropDetail) { GetAxes(Rotation,RotX,RotY,RotZ); if (TrailEffects.Length == 0) { TrailEffects.Length = TrailEffectPositions.Length; for(i=0;i> Rotation) ); TrailEffects[i].SetBase(self); TrailEffects[i].SetRelativeRotation( rot(-16384,32768,0) ); } } } else { if (Level.NetMode != NM_DedicatedServer) { for(i=0;i 0 ) return (0.05 + (G.MaxShotCount - G.LoadedShotCount) * G.FireInterval); return 1; } function ShouldTargetMissile(Projectile P) { } // LockOnWarning() called every LockWarningInterval when bEnemyLockedOn is true (on server/standalone) event LockOnWarning() { local class LockOnClass; local PlayerController PC; local byte LockNum; if ( bHeatSeeker ) { LockNum = 31; bHeatSeeker = false; } else LockNum = 12; LockOnClass = class(DynamicLoadObject(LockOnClassString, class'class')); PC = PlayerController(Controller); if (PC!=None) PC.ReceiveLocalizedMessage(LockOnClass, LockNum); if (WeaponPawns[0]!=None) { PC = PlayerController(WeaponPawns[0].Controller); if (PC!=None) PC.ReceiveLocalizedMessage(LockOnClass, LockNum); } LastLockWarningTime = Level.TimeSeconds; } function IncomingMissile(Projectile P) { bHeatSeeker = true; if ( WeaponPawns.Length > 0 ) ONSDualACGatlingGunPawn(WeaponPawns[0]).IncomingMissile(P); } function Died(Controller Killer, class damageType, vector HitLocation) { bDriving = False; Super.Died(Killer, damageType, HitLocation); } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.PlayerWeaponsGroup.bomberBomb'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.CicadaGreen'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.CicadaTan'); L.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); L.AddPrecacheMaterial(Material'CicadaTex.HUD.RocketIcon'); L.AddPrecacheMaterial(Material'VMWeaponsTX.PlayerWeaponsGroup.bomberBomb'); L.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2Ga'); L.AddPrecacheMaterial(Material'AW-2k4XP.Cicada.MissileTrail1a'); L.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Circle'); L.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Brackets'); L.AddPrecacheMaterial(Material'XEffectMat.Ion.painter_beam'); L.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Missles'); L.AddPrecacheMaterial(Material'XGameTextures.SuperPickups.DOMpointLINESg'); L.AddPrecacheMaterial(Material'Turrets.Huds.TurretHud2'); L.AddPrecacheMaterial(Material'AW-2k4XP.Cicada.LongSpark'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'VMWeaponsSM.PlayerWeaponsGroup.bomberBomb'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.CicadaGreen'); Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.CicadaTan'); Level.AddPrecacheMaterial(Material'ONSInterface-TX.tankBarrelAligned'); Level.AddPrecacheMaterial(Material'CicadaTex.HUD.RocketIcon'); Level.AddPrecacheMaterial(Material'VMWeaponsTX.PlayerWeaponsGroup.bomberBomb'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Weapons.ShockTankEffectCore2Ga'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Cicada.MissileTrail1a'); Level.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Circle'); Level.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Brackets'); Level.AddPrecacheMaterial(Material'XEffectMat.Ion.painter_beam'); Level.AddPrecacheMaterial(Material'CicadaTex.HUD.ONS_Cic_Missles'); Level.AddPrecacheMaterial(Material'XGameTextures.SuperPickups.DOMpointLINESg'); Level.AddPrecacheMaterial(Material'Turrets.Huds.TurretHud2'); Level.AddPrecacheMaterial(Material'AW-2k4XP.Cicada.LongSpark'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.PlasmaFlare'); Super.UpdatePrecacheMaterials(); } _//----------------------------------------------------------- // ONSDaulACSideGun - (C) 2004, Epic Games // Joe Wilcox // // This is the primary weapon the Cicada. //----------------------------------------------------------- class ONSDualACSideGun extends ONSLinkableWeapon; var bool bSkipFire; // If true, it ignore this shot and pass it to it's linked weapon var bool bFiresRight; // If true, this weapon will eject shells to the right instead of the left var int LoadedShotCount, MaxShotCount; // LoadedShotCount = # of shots loaded, MaxShotCount = Max # to load var float RelockTime; // Time before we can reacquire a lock var sound ReloadSound; // Sound to play when loading a rocket var bool bDumpingLoad; // Are we dumping our load of rockets? var Controller FireControl; // Temp. Storage of who is doing the firing. var bool bLocked; // If true all shots are locked to the vector below var vector LockedTarget; // If bLocked, all missiles will home to this location var vector LockPosition; // position when locked on replication { reliable if (Role==ROLE_Authority) bLocked, LockedTarget; } event bool AttemptFire(Controller C, bool bAltFire) { if(Role != ROLE_Authority || bForceCenterAim ) return False; if (bAltFire) { if ( Bot(C) != None ) { if ( (Vehicle(Instigator).Rise <= 0) && FastTrace(Instigator.Location - vect(0,0,500),Instigator.Location) ) Vehicle(Instigator).Rise = -0.5; else Vehicle(Instigator).Rise = 1; } if (!bLocked && LoadedShotCount == 0) // Handle Alt Fire ChangeTargetLock(); if ( !bDumpingLoad && FireCountdown <= 0 ) { if ( LoadedShotCount < MaxShotCount) { LoadedShotCount++; PlaySound(sound'CicadaSnds.Missile.MissileLoad'); FireCountdown = AltFireInterval; Instigator.MakeNoise(1.0); } else WeaponCeaseFire(C, true); } } else { if ( Bot(Instigator.Controller) != None ) Vehicle(Instigator).Rise = 0; if (LoadedShotCount==0 && FireCountdown <= 0) FireSingle(C,false, true); } return False; } function ChangeTargetLock() { bLocked = true; CalcWeaponFire(); ONSDualACSideGun(ChildWeapon).bLocked = true; LockedTarget = FindInitialTarget(WeaponFireLocation, WeaponFireRotation); ONSDualACSideGun(ChildWeapon).LockedTarget = LockedTarget; RelockTime = Level.TimeSeconds + 2.00; SpawnTargetBeam(); } function SpawnTargetBeam() { local PainterBeamEffect BP; BP = Spawn(class'CicadaLockBeamEffect',self); BP.StartEffect = WeaponFireLocation; BP.EndEffect = LockedTarget; BP.EffectOffset = vect(0,0,-20); BP.SetTargetState(PTS_Aquired); } function FireSingle(Controller C, bool bAltFire, optional bool bDontSkip) { if (!bSkipFire || bDontSkip) { CalcWeaponFire(); if (bCorrectAim) WeaponFireRotation = AdjustAim(false); DualFireOffset *= -1; Instigator.MakeNoise(1.0); if (bAltFire) { FireCountdown = AltFireInterval; AltFire(C); } else { FireCountdown = FireInterval; Fire(C); } AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; } else { FireCountdown = FireInterval; } bSkipFire = !bSkipFire; if (ChildWeapon != none && ONSDualACSideGun(ChildWeapon) != None) ONSDualACSideGun(ChildWeapon).FireSingle(C, bAltFire, bDontSkip); } function Projectile SpawnProjectile(class ProjClass, bool bAltFire) { local Projectile P; local vector StartLocation, StartVelocity; local rotator WFR, UpRot; local float Rand; // We want projectiles to "eject" from this gun then take flight. Part is handled here, part in // the projectile. if ( Bot(Instigator.Controller) != None ) Vehicle(Instigator).Rise = 0; StartLocation = WeaponFireLocation; Rand = (400 * frand()) + 200; // This is our range for the ejection. // if we are going forward, apply the ships velocity to the projectile, // if we are going backwards, apply the 1/4 the inverse X/Y. WFR = WeaponFireRotation; if (bLocked) WFR.Pitch += 2048; StartVelocity = Instigator.Velocity; // Modify the start velocity so it ejects to the proper side. if (bFiresRight) StartVelocity += (Vector(WFR) cross vect(0,0,-1)) * 450; else StartVelocity += (Vector(WFR) cross vect(0,0,1)) * 450; // Always kick it up a little bit more if ( bAltFire ) StartVelocity.Z += (Rand * ( frand()*2)); else StartVelocity.Z = 200; P = spawn(ProjClass, self, , StartLocation, WFR); P.Velocity = StartVelocity; // Apply the velocity if ( bAltFire && bLocked && (Bot(Instigator.Controller) != None) && !FastTrace(LockedTarget,P.Location) ) { UpRot = WeaponFireRotation; UpRot.Pitch = 12000; if ( !FastTrace(P.Location + 3000*vector(UpRot),P.Location) ) UpRot.Pitch = 16000; ONSDualACRocket(P).Target = FindInitialTarget(WeaponFireLocation, UpRot); } else ONSDualACRocket(P).Target = FindInitialTarget(WeaponFireLocation, WeaponFireRotation); if (!bAltFire) ONSDualACRocket(P).DesiredDistanceToAxis = 64; else ONSDualACRocket(P).KillRange=4500; if (bLocked) { ONSDualACRocket(P).bFinalTarget = false; ONSDualACRocket(P).SecondTarget = LockedTarget; ONSDualACRocket(P).SwitchTargetTime = 0.5; } else ONSDualACRocket(P).bFinalTarget = true; // Play effects if (P != None) { 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; } simulated function ClientStopFire(Controller C, bool bWasAltFire) { if (Level.NetMode != NM_Client) return; if (bWasAltFire) LoadedShotCount=0; super.ClientStopFire(C,bWasAltFire); } function Timer() { if (LoadedShotCount>0) { FireSingle(FireControl,true); LoadedShotCount--; } if (LoadedShotCount<=0) { RemoveLock(); FireCountdown = FireInterval; Disable('Timer'); SetTimer(0,false); bDumpingLoad = false; } } function WeaponCeaseFire(Controller C, bool bWasAltFire) { if (bWasAltFire) { if (LoadedShotCount>0) { bDumpingLoad=true; FireControl = C; Enable('timer'); SetTimer(0.1,true); } } } simulated event OwnerEffects() { if (Level.NetMode == NM_Client && bIsAltFire) LoadedShotCount++; if (LoadedShotCount0) && (VSize(LockedTarget - Other.Location) < 100 + Other.CollisionRadius + Other.CollisionHeight) ) return true; return Super.CanAttack(Other); } //AI: return the best fire mode for the situation function byte BestMode() { if ( (Instigator.Controller == None) || (Instigator.Controller.Target == None) ) return 1; if ( (Pawn(Instigator.Controller.Target) != None) && !Pawn(Instigator.Controller.Target).bStationary && (Instigator.Controller.Focus == Instigator.Controller.Target) ) return 0; return 1; } Qg//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualACRocket extends Projectile; #exec OBJ LOAD FILE=..\Sounds\VMVehicleSounds-S.uax var() float SpiralForceMag; var() float InwardForceMag; var() float ForwardForceMag; var() float DesiredDistanceToAxis; var() float DesiredDistanceDecayRate; var() float InwardForceMagGrowthRate; var float CurSpiralForceMag; var float CurInwardForceMag; var float CurForwardForceMag; var float DT; var bool bSpiralClockwise; var vector AxisOrigin; var vector AxisDir; var vector RepAxisDir; var Emitter SmokeTrailEffect; var vector Target, SecondTarget, InitialDir; var float KillRange; var bool bFinalTarget; var float SwitchTargetTime; var sound IgniteSound; var sound FlightSound; replication { reliable if ( Role == ROLE_Authority ) RepAxisDir, AxisOrigin, bSpiralClockwise, Target, SecondTarget, SwitchTargetTime, bFinalTarget; } simulated function Destroyed() { if ( SmokeTrailEffect != None ) SmokeTrailEffect.Kill(); Super.Destroyed(); } simulated function PostNetBeginPlay() { local float t; super.PostNetBeginPlay(); t = (frand() * 0.15) + 0.15; SetTimer(t,false); } simulated function Timer() { local float dist,travelTime; local PlayerController PC; SetCollision(true,true); if (Level.NetMode != NM_DedicatedServer) { SmokeTrailEffect = Spawn(class'ONSDualMissileSmokeTrail',self); if ( EffectIsRelevant(location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && (VSize(PC.ViewTarget.Location - Location) < 3000) ) Spawn(class'ONSDualMissileIgnite',,,location,rotation); } SetDrawType(DT_None); PlaySound(IgniteSound, SLOT_Misc, 255, true, 512); AmbientSound = FlightSound; } Velocity = vector(Rotation) * MaxSpeed; if (!bFinalTarget) { Dist = vsize(Target - Location); TravelTime = Dist / vsize(Velocity); if ( FastTrace(SecondTarget, Location) ) { if ( TravelTime < (SwitchTargetTime*0.9) ) { Target = SecondTarget; bFinalTarget = true; } } else { if (TravelTime < SwitchTargetTime) SwitchTargetTime = TravelTime * 0.9; } GotoState('Spiraling'); } else { if ( Vsize(Location - Target) <= KillRange ) { GotoState('Homing'); } else { GotoState('Spiraling'); } } } state Spiraling { simulated function BeginState() { CurSpiralForceMag = SpiralForceMag; CurInwardForceMag = InwardForceMag; CurForwardForceMag = ForwardForceMag; bSpiralClockwise = (FRand() > 0.5); AxisOrigin = Location; AxisDir = Normal(Target - AxisOrigin); if (Role == ROLE_Authority) RepAxisDir = AxisDir * 100.0; if (Owner != None && Owner.Instigator != None && Owner.Instigator.IsA('Vehicle')) Velocity = FMax(Owner.Instigator.Velocity dot AxisDir, 0.0) * AxisDir; else Velocity = AxisDir * Speed; if (PhysicsVolume != None && PhysicsVolume.bWaterVolume) Velocity = 0.6 * Velocity; SetTimer(DT, true); } simulated function Timer() { local vector ParallelComponent, PerpendicularComponent, NormalizedPerpendicularComponent; local vector SpiralForce, InwardForce, ForwardForce; local float InwardForceScale; // Add code to switch directions // Update the inward force magnitude. CurInwardForceMag += InwardForceMagGrowthRate * DT; ParallelComponent = ((Location - AxisOrigin) dot AxisDir) * AxisDir; PerpendicularComponent = (Location - AxisOrigin) - ParallelComponent; NormalizedPerpendicularComponent = Normal(PerpendicularComponent); InwardForceScale = VSize(PerpendicularComponent) - DesiredDistanceToAxis; SpiralForce = CurSpiralForceMag * Normal(AxisDir cross NormalizedPerpendicularComponent); InwardForce = -CurInwardForceMag * InwardForceScale * NormalizedPerpendicularComponent; ForwardForce = CurForwardForceMag * AxisDir; if (bSpiralClockwise) SpiralForce *= -1.0; Acceleration = SpiralForce + InwardForce + ForwardForce; DesiredDistanceToAxis -= DesiredDistanceDecayRate * DT; DesiredDistanceToAxis = FMax(DesiredDistanceToAxis, 0.0); // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); // Check to see if we should switch to Home in Mode if (!bFinalTarget) { SwitchTargetTime -= DT; if ( SwitchTargetTime<=0 ) { bFinalTarget = true; SwitchTargetTime = 0; Target = SecondTarget; BeginState(); return; } } else { if ( Vsize(Location - Target) <= KillRange ) { GotoState('Homing'); return; } } } } state Homing { simulated function Timer() { local vector ForceDir; local float VelMag; if ( InitialDir == vect(0,0,0) ) InitialDir = Normal(Velocity); Acceleration = vect(0,0,0); Super.Timer(); // do normal guidance to target. ForceDir = Normal(Target - Location); if( (ForceDir Dot InitialDir) > 0 ) { VelMag = VSize(Velocity); // track vehicles better ForceDir = Normal(ForceDir * 0.5 * VelMag + Velocity); Velocity = VelMag * ForceDir; Acceleration += 5 * ForceDir; } // Update rocket so it faces in the direction its going. SetRotation(rotator(Velocity)); } simulated function BeginState() { SetTimer(0.1, true); } } 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) { local PlayerController PC; PlaySound(sound'WeaponSounds.BExplosion3',,2.5*TransientSoundVolume); if ( EffectIsRelevant(Location,false) ) { PC = Level.GetLocalPlayerController(); if ( (PC.ViewTarget != None) && (VSize(PC.ViewTarget.Location - Location) < 8000) ) Spawn(class'ONSDualMissileExplosion',,,HitLocation + HitNormal*20,rotator(HitNormal)); } BlowUp(HitLocation); Destroy(); } /QS//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualACGatlingGunPawn extends ONSWeaponPawn; var Material LockedTexture; var Material LockedEffect; var localized string LockedMsg; var Projectile Incoming; var TexRotator SpinCircles[2], SpinSquare; var Projectile IgnoredMissile, WatchedMissile; //Notify vehicle that an enemy has locked on to it function IncomingMissile(Projectile P) { if ( IgnoredMissile == P ) return; if ( WatchedMissile != P ) { if ( (Bot(Controller) == None) || (Bot(Controller).Skill < 2 + 3*FRand()) ) { if ( (Controller != None) || (Level.Game.GameDifficulty < 3 + 3*FRand()) || (Bot(VehicleBase.Controller) == None) ) { IgnoredMissile = P; return; } } WatchedMissile = P; } // FIRE CHAFF if missile nearby if ( VSize(VehicleBase.Location - P.Location) < 1000 + class'ONSDecoy'.Default.DecoyRange ) { if ( Controller == None ) { if ( Bot(VehicleBase.Controller) == None ) { IgnoredMissile = P; return; } VehicleBase.Weapons[0].WeaponCeaseFire(VehicleBase.Controller, true); VehicleBase.Weapons[1].WeaponCeaseFire(VehicleBase.Controller, true); } else if ( Bot(Controller) == None ) { IgnoredMissile = P; return; } Incoming = P; IgnoredMissile = P; Gun.CalcWeaponFire(); Gun.AltFire(VehicleBase.Controller); } } // - CenterDraw - Draws an images centered around a point. Optionally, it can stretch the image. simulated function CenterDraw(Canvas Canvas, Material Mat, float x, float y, float UScale, float VScale, optional bool bStretched) { local float u,v,w,h; u = Mat.MaterialUSize(); w = u * UScale; v = Mat.MaterialVSize(); h = v * VScale; Canvas.SetPos(x - (w/2), y - (h/2) ); if (!bStretched) Canvas.DrawTile(Mat,w,h,0,0,u,v); else Canvas.DrawTileStretched(Mat,w,h); } simulated function DrawHUD(Canvas Canvas) { Canvas.Style = 5; if ( !Level.IsSoftwareRendering() ) { Canvas.DrawColor.R = 255; Canvas.DrawColor.G = 255; Canvas.DrawColor.B = 255; Canvas.DrawColor.A = 50; Canvas.DrawTile( Material'DomPLinesGP', Canvas.SizeX, Canvas.SizeY, 0, 0, 256, 256); } Canvas.Style = 1; Canvas.DrawColor.R = 255; Canvas.DrawColor.G = 255; Canvas.DrawColor.B = 255; Canvas.DrawColor.A = 255; Canvas.SetPos(0,0); Canvas.DrawTile( Material'TurretHud2', Canvas.SizeX, Canvas.SizeY, 0, 0, 1024, 768); Canvas.SetPos(0,0); // Remove Me : for testing // ProjectilePostRender2D(None,Canvas,140,140); } simulated function ProjectilePostRender2D(Projectile P, Canvas C, float ScreenLocX, float ScreenLocY) { local float scale, xl,yl; local PlayerController PC; local ONSHudOnslaught H; PC = level.GetLocalPlayerController(); if (PC==None) return; H = ONSHudOnslaught(PC.MyHud); if (H==None) return; C.SetDrawColor(255,64,64,255); C.Font = H.GetConsoleFont(C); C.StrLen(LockedMsg,xl,yl); scale = YL / 18; CenterDraw(C,SpinCircles[0],ScreenLocX,ScreenLocY,0.65*Scale,0.65*Scale); CenterDraw(C,SpinCircles[1],ScreenLocX,ScreenLocY,Scale,Scale); C.SetDrawColor(255,255,64,255); CenterDraw(C,SpinSquare,ScreenLocX,ScreenLocY,Scale,Scale); C.SetDrawColor(255,64,64,255); CenterDraw(C,material'ONS_Cic_Info',ScreenLocX,ScreenLocY,Scale,Scale); C.SetPos(ScreenLocX, ScreenLocY - (16*Scale) ); C.DrawTile(material'ONS_Cic_Plate',XL+(48*Scale),32*Scale,0,0,128,32); C.SetDrawColor(255,255,0,255); C.SetPos(ScreenLocX+ (28*Scale), ScreenLocY - (6*Scale) ); C.DrawText(LockedMsg,true); } simulated function ClientKDriverLeave(PlayerController PC) { Super.ClientKDriverLeave(PC); Gun.SetBoneScale(4, 1.0, 'GatlingGunAttach'); } simulated function ClientKDriverEnter(PlayerController PC) { Super.ClientKDriverEnter(PC); Gun.SetBoneScale(4, 0.0, 'GatlingGunAttach'); } function KDriverEnter(Pawn P) { super.KDriverEnter(P); if (!VehicleBase.bDriving) VehicleBase.bDriving = true; } event bool KDriverLeave( bool bForceLeave ) { local bool b; b = super.KDriverLeave(bForceLeave); if (b && VehicleBase.IsVehicleEmpty() ) VehicleBase.bDriving = false; return b; } simulated function AttachDriver(Pawn P) { local coords GunnerAttachmentBoneCoords; if (Gun == None) return; ONSDualAttackCraft(VehicleBase).OutputThrust = 0; ONSDualAttackCraft(VehicleBase).OutputStrafe = 0; ONSDualAttackCraft(VehicleBase).OutputRise = 0; P.bHardAttach = True; GunnerAttachmentBoneCoords = Gun.GetBoneCoords(Gun.GunnerAttachmentBone); P.SetLocation(VehicleBase.Location); P.SetBase(VehicleBase); P.SetPhysics(PHYS_None); P.SetPhysics(PHYS_None); // Do it twice to handle the bug. Gun.AttachToBone(P, Gun.GunnerAttachmentBone); P.SetRelativeLocation(DrivePos); P.SetRelativeRotation( DriveRot ); } function ShouldTargetMissile(Projectile P) { if ( AIController(Controller) != None && AIController(Controller).Skill >= 5.0 ) ShootMissile(P); } event bool VerifyLock(actor Aggressor, out actor NewTarget) { if (VehicleBase!=None) return VehicleBase.VerifyLock(Aggressor,NewTarget); else return true; } A2//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDualACGatlingGun extends ONSWeapon; #exec OBJ LOAD FILE=..\Textures\TurretParticles.utx var class BeamEffectClass[2]; 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)); 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; } 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); } } function AltFire(Controller C) { local ONSDecoy P; local ONSDualAttackCraft V; if (AltFireProjectileClass != none) { P = ONSDecoy( SpawnProjectile(AltFireProjectileClass, True) ); V = ONSDualAttackCraft(Owner); if (P != none && V != none) { V.Decoys.Insert(0,1); V.Decoys[0] = P; P.ProtectedTarget = V; } } } } function rotator AdjustAim(bool bAltFire) { local Rotator Result; local Projectile Incoming; if ( bAltFire && (Instigator.Controller == None) ) { Incoming = ONSDualACGatlingGunPawn(Instigator).Incoming; if ( Incoming != None ) { Result = Rotator(Incoming.Location + Incoming.Velocity * (VSize(Incoming.Location - WeaponFireLocation)/class'ONSDecoy'.Default.Speed) - WeaponFireLocation); if ( (Result.Pitch > 0) && (Result.Pitch < 32768) ) Result.Pitch = 0; return Result; } } return Super.AdjustAim(bAltFire); } O//------------------------------- // Cicada explosion effect //------------------------------- class ONSDualACDeathExp extends Emitter; {//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDecoyLaunch extends Emitter; simulated function PostNetBeginPlay() { super.PostNetBeginPlay(); PlaySound(Sound'CicadaSnds.Decoy.DecoyLaunch', SLOT_None, 5.0); } l//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDecoyFlight extends Emitter; ~//----------------------------------------------------------- // When out in the world, this can be used to decoy an avril. //----------------------------------------------------------- class ONSDecoy extends Projectile; var class DecoyFlightSFXClass; // Class of the emitter to spawn for the effect var class DecoyLaunchSFXClass; // Class of the emitter to spawn when launched var emitter DecoyFlightSFX; // The actual effect var float DecoyRange; // Much much range before the decoy says look at me var ONSDualAttackCraft ProtectedTarget; // Protect this vehicle simulated function PostBeginPlay() { super.PostBeginPlay(); Velocity = Speed * Vector(Rotation); } simulated function PostNetBeginPlay() { super.PostNetBeginPlay(); if ( EffectIsRelevant(Location, false) ) Spawn(DecoyLaunchSFXClass,,,location,Rotation); if ( (Level.NetMode != NM_DedicatedServer) && (DecoyFlightSFXClass != None) ) { DecoyFlightSFX = spawn(DecoyFlightSFXClass); if (DecoyFlightSFX!=None) DecoyFlightSFX.SetBase(self); } } function bool CheckRange(actor Aggressor) { return vsize(Aggressor.Location - location) <= DecoyRange; } simulated event Destroyed() // Remove it from the Dual Attack craft's array { local int i; super.Destroyed(); if (ProtectedTarget!=None) { for (i=0;i9?$Krw.*.Lw*U99   fff?$$ Gk//----------------------------------------------------------- // //----------------------------------------------------------- class ONSDecoEffect extends Emitter; aP}[ swP*IP 9?LP  9?,YP 99333? P-E'Tppw*%L> ? P-E'T Gcr @e3mm! $3Ywxy5SdlYv y9:9:$-(_-|\w*\\-/ @9?%]w.l*-/3l  9?wt9?%Y-@-|9?%9P999?b?P-|^l'( GY//----------------------------------------------------------- // //----------------------------------------------------------- class ONSBellyTurretFire extends ONSTurretBeamEffect; simulated function PostNetBeginPlay() { local float pitch; super.PostNetBeginPlay(); pitch = 0.80 + (frand() * 0.4); PlaySound(Sound'CicadaSnds.BellyLaser.BellyLaserFire', SLOT_None, 5.0,, 300,1, false); } o//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryTrajectoryBeamSegment extends Emitter; simulated function SetLength(float Length) { BeamEmitter(Emitters[0]).BeamDistanceRange.Min = Length; BeamEmitter(Emitters[0]).BeamDistanceRange.Max = Length; } flcw*w Gjg w*a Gk]K*-/''w* ] Glw%-/("w*w Gm}rG}a X}!t}#Ca?( Ghk t @o~(~(! $3Yv5Sn]Ua $? HDa T #IHCaD F|H Gpd~<-/-n)-/]/w-n-/{w*9:^9:^ O^^ GqW--"-s-s^9:9:$Y--w*V'--a$C  (a$C  ( G r^uw.*w.*QrO*rO*.OI.P@9?^^ O G~//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtillerySideGunPawn extends ONSWeaponPawn; function bool StopWeaponFiring() { if ( bWeaponIsAltFiring && (Bot(Controller) != None) ) { Gun.CalcWeaponFire(); Gun.AltFire(Controller); } return Super.StopWeaponFiring(); } lI//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtillerySideGun extends ONSWeapon; #exec OBJ LOAD FILE=ONSBPTextures.utx #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 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); } } sPTP*r*9:9:$ =@9?%w-/ @iw\w\P@uP@i@i Gt//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryShellSplit extends Emitter; vyB0$@iw? G xrI9G /a8 #mtw#9:#9:$#a/!t l# ty?lllyw?y#m#m^9Dwr# ի?##lիwTlUw.#*.#%.#-zrmUTt10 G{//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryShellSmall extends ONSMortarShell; K //----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryGroundExplosion extends Emitter; function PostBeginPlay() { local PlayerController PC; PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 8000) ) { Emitters[0].Disabled = true; Emitters[3].Disabled = true; Emitters[4].Disabled = true; } } {//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryFactory extends ONSVehicleFactory; }z @~ʂ?)M!B $a`uPP//------------------------------- // SPMA explosion effect //------------------------------- class ONSArtilleryDeathExp extends Emitter; o //----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryCannonMuzzleFlash extends Emitter; function PostBeginPlay() { local PlayerController PC; PC = Level.GetLocalPlayerController(); if ( PC == None ) { Destroy(); return; } if ( Level.bDropDetail || (Level.DetailMode == DM_Low) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 8000) ) { Emitters[4].Disabled = true; Emitters[5].Disabled = true; Emitters[8].Disabled = true; Emitters[9].Disabled = true; } } R//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryCannon extends ONSWeapon; #exec OBJ LOAD FILE=..\Animations\ONSBPAnimations.ukx #exec OBJ LOAD FILE=VMParticleTextures.utx #exec OBJ LOAD FILE=ONSBPTextures.utx #exec OBJ LOAD FILE=ONSBPSounds.uax #exec OBJ LOAD FILE=DistantBooms.uax var ONSMortarShell MortarShell, LastMortarShell; var ONSMortarCamera MortarCamera; var Rotator LastAim; var float LastWeaponCharge; var float StartHoldTime; var float MaxHoldTime; //wait this long between shots for full damage var float MinSpeed, MaxSpeed; var float MortarSpeed; var bool bHoldingFire; var bool bCanHitTarget; var sound ChargingSound, ChargedLoop; var float TargetPredictionTimeStep; var float WeaponCharge; var vector PredictedTargetLocation; var float PredicatedTimeToImpact; var float LastCameraLaunch; var float CameraLaunchWait; var float LastBeepTime; var() float TrajectoryErrorFactor; var int CameraAttempts; replication { reliable if (bNetOwner && (Role == ROLE_Authority)) MortarCamera; reliable if (Role < ROLE_Authority) ServerSetWeaponCharge; } 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.cloudParticleOrange'); L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1'); L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick'); L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.tankHitRocks'); L.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.DirtPuffTEX'); } 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.cloudParticleOrange'); Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick1'); Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.TankDustKick'); Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.tankHitRocks'); Level.AddPrecacheMaterial(Material'VMParticleTextures.TankFiringP.DirtPuffTEX'); Super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'WeaponStaticMesh.RocketProj'); Super.UpdatePrecacheStaticMeshes(); } // ===================================================================== // AI Interface function AllowCameraLaunch() { CameraAttempts = 0; LastCameraLaunch = Level.TimeSeconds - CameraLaunchWait; } function bool CanAttack(Actor Other) { local actor HitActor; local vector HitNormal, HitLocation; if ( (Instigator == None) || (Instigator.Controller == None) ) return false; if ( (Bot(Instigator.Controller) != None) && (Level.TimeSeconds - ONSArtillery(Owner).StartDrivingTime < 1) ) return false; if ( MortarCamera == None ) { if ( ((Level.TimeSeconds - LastCameraLaunch > CameraLaunchWait) && (VSize(Other.Location - Location) < 15000)) || ((Other == Instigator.Controller.Enemy) && (VSize(Other.Location - Location) < 4000) && Bot(Instigator.Controller).EnemyVisible()) ) return true; } else { if ( !MortarCamera.bDeployed ) return true; HitActor = Trace(HitLocation, HitNormal, Other.Location, MortarCamera.Location, false); if ( HitActor != None ) { MortarCamera.Destroy(); FireCountDown = AltFireInterval; } return true; } return false; } function byte BestMode() { local bot B; B = Bot(Instigator.Controller); if ( (B == None) || (B.Target == None) ) return 0; if ( MortarCamera == None ) { if ( VSize(B.Pawn.Location - B.Target.Location) > 4000 ) return 1; if ( B.Target == B.Enemy ) { if ( !B.EnemyVisible() ) return 1; } else if ( !B.LineOfSightTo(B.Target) ) return 1; } return 0; } function float CalcZSpeed(float XYSpeed, float FlightSize, float FlightZ) { local float FlightTime; FlightTime = FlightSize/XYSpeed; if ( FlightTime == 0 ) return XYSpeed; return FlightZ/FlightTime - 0.5 * PhysicsVolume.Gravity.Z * FlightTime; } /* SetMuzzleVelocity() return adjustment to Z component of aiming vector to compensate for arc given the target distance */ function vector SetMuzzleVelocity(vector Start, vector End, float StartXYPct) { local vector Flight, FlightDir, TraceStart, TraceEnd, StartVel, HitLocation, HitNormal, Mid1, Mid2, Mid3; local float XYSpeed, ZSpeed, XYPct, FlightZ, FlightSize, FlightTime; local bool bFailed; local Actor HitActor; Flight = End - Start; FlightZ = Flight.Z; Flight.Z = 0; FlightSize = VSize(Flight); XYPct = StartXYPct; XYSpeed = XYPct*MaxSpeed; ZSpeed = CalcZSpeed(XYSpeed, FlightSize, FlightZ); while ( (XYPct < 1.0) && (ZSpeed*ZSpeed + XYSpeed * XYSpeed > MaxSpeed * MaxSpeed) ) { // pick an XYSpeed XYPct += 0.05; XYSpeed = XYPct*MaxSpeed; ZSpeed = CalcZSpeed(XYSpeed, FlightSize, FlightZ); } // trace check trajectory bFailed = true; FlightDir = Normal(Flight); while ( bFailed && (XYPct > 0) ) { StartVel = XYSpeed*FlightDir + ZSpeed*vect(0,0,1); TraceStart = Start; FlightTime = 0.25 * FlightSize/XYSpeed; TraceEnd = Start + StartVel*FlightTime + (0.5 * PhysicsVolume.Gravity.Z * FlightTime * FlightTime ) * vect(0,0,1) - vect(0,0,40); Mid1 = TraceEnd; if ( FastTrace(TraceEnd,TraceStart) ) { // next segment TraceStart = TraceEnd; FlightTime = 0.5 * FlightSize/XYSpeed; TraceEnd = Start + StartVel*FlightTime + (0.5 * PhysicsVolume.Gravity.Z * FlightTime * FlightTime ) * vect(0,0,1) - vect(0,0,40); Mid2 = TraceEnd; if ( FastTrace(TraceEnd,TraceStart) ) { // next segment TraceStart = TraceEnd; FlightTime = 0.75 * FlightSize/XYSpeed; TraceEnd = Start + StartVel*FlightTime + (0.5 * PhysicsVolume.Gravity.Z * FlightTime * FlightTime ) * vect(0,0,1) - vect(0,0,40); Mid3 = TraceEnd; if ( FastTrace(TraceEnd,TraceStart) ) { // next segment TraceStart = TraceEnd; FlightTime = FlightSize/XYSpeed; TraceEnd = Start + StartVel*FlightTime + (0.5 * PhysicsVolume.Gravity.Z * FlightTime * FlightTime ) * vect(0,0,1); bFailed = !FastTrace(TraceEnd,TraceStart); } } if ( !bFailed ) { // trace with extent check since projectile has extent HitActor = Trace(HitLocation, HitNormal, Mid2, Mid1, false, vect(20,20,20)); if ( HitActor == None ) { HitActor = Trace(HitLocation, HitNormal, Mid3, Mid2, false, vect(20,20,20)); if ( HitActor == None ) { HitActor = Trace(HitLocation, HitNormal, Mid1, Start, false, vect(20,20,20)); } } bFailed = ( HitActor != None ); } } if ( bFailed ) { // if failed and trajectory already lowered, destroy camera if ( XYPct > StartXYPct ) { CameraAttempts = 0; LastCameraLaunch = Level.TimeSeconds; if ( MortarCamera != None ) { MortarCamera.Destroy(); FireCountDown = AltFireInterval; } bFailed = false; } else { // else raise trajectory XYPct -= 0.1; XYSpeed = XYPct*MaxSpeed; ZSpeed = CalcZSpeed(XYSpeed, FlightSize, FlightZ); if ( ZSpeed*ZSpeed + XYSpeed * XYSpeed > MaxSpeed * MaxSpeed ) { CameraAttempts = 0; LastCameraLaunch = Level.TimeSeconds; if ( MortarCamera != None ) { MortarCamera.Destroy(); FireCountDown = AltFireInterval; } bFailed = false; } } } } return XYSpeed*FlightDir + ZSpeed*vect(0,0,1); } function rotator AdjustAim(bool bAltFire) { if ( AIController(Instigator.Controller) == None ) return Super.AdjustAim(bAltFire); return Instigator.Controller.Rotation; } // ===================================================================== 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 { if ( (MortarCamera != None) && (AIController(Instigator.Controller) == None) ) { PredictTarget(); if (!bCanHitTarget) { if (PlayerController(C) != None && Level.TimeSeconds - LastBeepTime > 1.0) { PlayerController(C).ClientPlaySound(sound'MenuSounds.Denied1'); LastBeepTime = Level.TimeSeconds; } return false; } } FireCountdown = FireInterval; Fire(C); } AimLockReleaseTime = Level.TimeSeconds + FireCountdown * FireIntervalAimLock; return true; } return false; } function Projectile SpawnProjectile(class ProjClass, bool bAltFire) { local Projectile P; local vector StartLocation, HitLocation, HitNormal, Extent, TargetLoc; local ONSIncomingShellSound ShellSoundMarker; local Controller C; local bool bFailed; for ( C=Level.ControllerList; C!=None; C=C.nextController ) if ( PlayerController(C)!=None ) PlayerController(C).ClientPlaySound(sound'DistantBooms.DistantSPMA',true,1); if ( AIController(Instigator.Controller) != None ) { if ( Instigator.Controller.Target == None ) { if ( Instigator.Controller.Enemy != None ) TargetLoc = Instigator.Controller.Enemy.Location; else TargetLoc = Instigator.Controller.FocalPoint; } else TargetLoc = Instigator.Controller.Target.Location; if ( !bAltFire && ((MortarCamera == None) || MortarCamera.bShotDown) && ((VSize(TargetLoc - WeaponFireLocation) > 4000) || !Instigator.Controller.LineOfSightTo(Instigator.Controller.Target)) ) { ProjClass = AltFireProjectileClass; bAltFire = true; } } if (bDoOffsetTrace) { Extent = ProjClass.default.CollisionRadius * vect(1,1,0); Extent.Z = ProjClass.default.CollisionHeight; 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 ( AIController(Instigator.Controller) == None ) { P.Velocity = Vector(WeaponFireRotation) * P.Speed; } else { if ( P.IsA('ONSMortarCamera') ) { P.Velocity = SetMuzzleVelocity(StartLocation, TargetLoc,0.25); ONSMortarCamera(P).TargetZ = TargetLoc.Z; } else P.Velocity = SetMuzzleVelocity(StartLocation, TargetLoc,0.5); WeaponFireRotation = Rotator(P.Velocity); ONSArtillery(Owner).bAltFocalPoint = true; ONSArtillery(Owner).AltFocalPoint = StartLocation + P.Velocity; } if ( !P.IsA('ONSMortarCamera') ) { if (MortarCamera != None) { if ( AIController(Instigator.Controller) == None ) { MortarSpeed = FClamp(WeaponCharge * (MaxSpeed - MinSpeed) + MinSpeed, MinSpeed, MaxSpeed); ONSMortarShell(P).Velocity = Normal(P.Velocity) * MortarSpeed; } ONSMortarShell(P).StartTimer(3.0 + (WeaponCharge * 2.5)); ShellSoundMarker = spawn(class'ONSIncomingShellSound',,, PredictedTargetLocation + vect(0,0,400)); ShellSoundMarker.StartTimer(PredicatedTimeToImpact); } else P.LifeSpan = 2.0; } 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); } if (ONSMortarCamera(P) != None) { CameraAttempts = 0; LastCameraLaunch = Level.TimeSeconds; MortarCamera = ONSMortarCamera(P); if (ONSArtillery(Owner) != None) ONSArtillery(Owner).MortarCamera = MortarCamera; } else MortarShell = ONSMortarShell(P); } else if ( AIController(Instigator.Controller) != None ) { bFailed = ONSMortarCamera(P) == None; if ( !bFailed ) { // allow 2 tries CameraAttempts++; bFailed = ( CameraAttempts > 1 ); } if ( bFailed ) { CameraAttempts = 0; LastCameraLaunch = Level.TimeSeconds; if ( MortarCamera != None ) { MortarCamera.Destroy(); } } } return P; } simulated event OwnerEffects() { if (!bIsRepeatingFF) { if (bIsAltFire) ClientPlayForceFeedback( AltFireForce ); else ClientPlayForceFeedback( FireForce ); } ShakeView(); if (Role < ROLE_Authority) { if (!bIsAltFire && (MortarCamera != None) && MortarCamera.bDeployed && !bCanHitTarget) return; 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) { if (MortarCamera == None) PlaySound(AltFireSoundClass, SLOT_None, FireSoundVolume/255.0,, AltFireSoundRadius,, false); } else PlaySound(FireSoundClass, SLOT_None, FireSoundVolume/255.0,, FireSoundRadius,, false); } } if ( !bIsAltFire && (MortarCamera != None) && MortarCamera.bDeployed && bCanHitTarget && (PlayerController(Instigator.Controller) != None) && (Viewport(PlayerController(Instigator.Controller).Player) != None) ) PlayerController(Instigator.Controller).ClientPlaySound(FireSoundClass); } simulated function SetWeaponCharge(float Charge) { WeaponCharge = Charge; if (Role < ROLE_Authority) ServerSetWeaponCharge(WeaponCharge); } function ServerSetWeaponCharge(float Charge) { WeaponCharge = Charge; } simulated function float ChargeBar() { return FClamp(1.0 - (FireCountDown / FireInterval), 0.0, 1.0); } simulated function NotifyDeployed() { local vector LevelCameraPosition; local float LevelCameraDistance; // Roughly estimate what the WeaponCharge should be so that the reticle is close by LevelCameraPosition = MortarCamera.Location; LevelCameraPosition.Z = Location.Z; LevelCameraDistance = VSize(LevelCameraPosition - Location); WeaponCharge = FClamp((LevelCameraDistance - 3400.0)/10000.0, 0.0, 1.0); } simulated function PredictTarget() { local int i; local vector CurrentPosition, LastPosition, HitLocation, HitNormal, CurrentVelocity; local float ErrorCorrection; if ( MortarCamera == None || !MortarCamera.bDeployed || (CurrentAim == LastAim && WeaponCharge == LastWeaponCharge) || (AIController(Instigator.Controller) != None) ) return; CalcWeaponFire(); CurrentPosition = WeaponFireLocation; LastPosition = CurrentPosition; MortarSpeed = FClamp(WeaponCharge * (MaxSpeed - MinSpeed) + MinSpeed, MinSpeed, MaxSpeed); // Estimation of the error accumulated from predicting the trajectory based on a smaller number of iterations than the actual shell will use ErrorCorrection = WeaponCharge * TrajectoryErrorFactor; CurrentVelocity = Vector(WeaponFireRotation) * (MortarSpeed + ErrorCorrection); for (i=0; i<=50; i++) { CurrentVelocity += PhysicsVolume.Gravity * TargetPredictionTimeStep; CurrentPosition += CurrentVelocity * TargetPredictionTimeStep; if (Trace(HitLocation, HitNormal, CurrentPosition, LastPosition, False) != None) break; LastPosition = CurrentPosition; } if (FireInterval - FireCountDown > 1.0 || VSize(LastHitLocation - HitLocation) > 500.0 + (WeaponCharge * 2000.0)) // Jitter Protection { MortarCamera.SetTarget(HitLocation); PredictedTargetLocation = HitLocation; PredicatedTimeToImpact = i * TargetPredictionTimeStep; bCanHitTarget = ( (VSize(HitLocation - MortarCamera.Location) < FMin(17000,Region.Zone.DistanceFogEnd)) && (FastTrace(HitLocation + vect(0,0,80), MortarCamera.Location) || FastTrace(HitLocation + vect(200,0,80), MortarCamera.Location) || FastTrace(HitLocation + vect(-200,0,80), MortarCamera.Location) || FastTrace(HitLocation + vect(0,200,80), MortarCamera.Location) || FastTrace(HitLocation + vect(0,-200,80), MortarCamera.Location)) ); MortarCamera.SetReticleStatus(bCanHitTarget); LastHitLocation = HitLocation; LastAim = CurrentAim; LastWeaponCharge = WeaponCharge; } } simulated event FlashMuzzleFlash() { Super.FlashMuzzleFlash(); PlayAnim('Fire', 3.5); } x//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryCamThrusterRed extends Emitter; y//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryCamThrusterBlue extends Emitter; v//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtilleryAirExplosion extends Emitter; D @EO! $3Y IJKL;5SFqVYJ aYV( G]//----------------------------------------------------------- // //----------------------------------------------------------- class ONSArtillery extends ONSWheeledCraft; #exec OBJ LOAD FILE=ONSBPTextures.utx var float YawAccel, PitchAccel; var float ClientUpdateTime; var float StartDrivingTime; // AI Hint var Rotator LastAim; var bool bJustDeployed; var ONSMortarCamera MortarCamera; var float LastLocalMsgTime; var string ArtiLockOnClassString; replication { reliable if (Role == ROLE_Authority) MortarCamera; reliable if (Role < ROLE_Authority) ServerAim; } function bool IsArtillery() { return true; } function bool IsDeployed() { local ONSArtilleryCannon Cannon; Cannon = ONSArtilleryCannon(Weapons[ActiveWeapon]); if ( (Cannon != None) && (Cannon.MortarCamera != None) ) return true; if ( Level.TimeSeconds - Cannon.LastCameraLaunch > Cannon.CameraLaunchWait ) return true; return false; } function KDriverEnter(Pawn P) { Super.KDriverEnter(P); StartDrivingTime = Level.TimeSeconds; } function float BotDesireability(Actor S, int TeamIndex, Actor Objective) { local SquadAI Squad; Squad = SquadAI(S); if ( Squad.GetOrders() == 'Defend' ) return 0; return super.BotDesireability(S,TeamIndex,Objective); } function VehicleFire(bool bWasAltFire) { local vector TargetDir; local rotator AimRot; if ( bWasAltFire ) { if ( MortarCamera != None ) { if ( !MortarCamera.bDeployed ) { if ( AIController(Instigator.Controller) != None ) { return; } MortarCamera.Deploy(); CustomAim = Weapons[ActiveWeapon].WeaponFireRotation; } else { if ( AIController(Instigator.Controller) != None ) bWasAltFire = false; else MortarCamera.Destroy(); } return; } else if ( (AIController(Instigator.Controller) != None) && (Controller.Target != None) ) { TargetDir = Controller.Target.Location - Location; TargetDir.Z = 0; AimRot = Weapons[ActiveWeapon].CurrentAim; AimRot.Pitch = 0; if ( (Normal(TargetDir) Dot Vector(AimRot)) < 0.9 ) { return; } } } Super.VehicleFire(bWasAltFire); } function AltFire( optional float F ) { local bool bHasCamera; bHasCamera = ( MortarCamera != None ); Super.AltFire(F); if ( MortarCamera != None ) { if ( Role < ROLE_Authority && !MortarCamera.bDeployed ) { MortarCamera.Deploy(); CustomAim = Weapons[ActiveWeapon].WeaponFireRotation; bJustDeployed = true; } } if ( bHasCamera ) bWeaponIsAltFiring = false; } function ServerAim(int NewYaw) { CustomAim.Yaw = NewYaw; CustomAim.Pitch = Default.CustomAim.Pitch; CustomAim.Roll = Default.CustomAim.Roll; } simulated function RawInput(float DeltaTime, float aBaseX, float aBaseY, float aBaseZ, float aMouseX, float aMouseY, float aForward, float aTurn, float aStrafe, float aUp, float aLookUp) { if (PlayerController(Controller) != None) { if (aStrafe > 0) YawAccel = 1.0; if (aStrafe < 0) YawAccel = -1.0; if (aForward > 0) PitchAccel = 1.0; if (aForward < 0) PitchAccel = -1.0; } } function int LimitPitch(int pitch) { if (ActiveWeapon >= Weapons.length) return Super.LimitPitch(pitch); if (ONSArtilleryCannon(Weapons[ActiveWeapon]) != None && ONSArtilleryCannon(Weapons[ActiveWeapon]).MortarCamera != None) { pitch = pitch & 65535; if (pitch > 2500 && pitch < 49153) { if (pitch - 2500 < 49153 - pitch) pitch = 2500; else pitch = 49153; } return pitch; } return Weapons[ActiveWeapon].LimitPitch(pitch, Rotation); } simulated function Tick(float DT) { local DestroyableObjective ObjectiveTarget; Super.Tick(DT); if ( AIController(Controller) != None ) { bCustomAiming = true; CustomAim = Weapons[ActiveWeapon].WeaponFireRotation; if ( Controller.Target != None ) CustomAim.Yaw = Rotator(Controller.Target.Location - Location).Yaw; LastAim = CustomAim; if ( MortarCamera != None ) { bAltFocalPoint = true; if ( Controller.Target != None ) { if ( MortarCamera.bDeployed ) { if ( ShootTarget(Controller.Target) != None ) ObjectiveTarget = DestroyableObjective(Controller.Target.Owner); else ObjectiveTarget = DestroyableObjective(Controller.Target); } if ( (ObjectiveTarget != None) && !ObjectiveTarget.LegitimateTargetOf(Bot(Controller)) ) { MortarCamera.Destroy(); ONSArtilleryCannon(Weapons[ActiveWeapon]).AllowCameraLaunch(); Weapons[ActiveWeapon].FireCountDown = Weapons[ActiveWeapon].AltFireInterval; } else { Throttle = 0.0; Steering = 0.0; } } else { bAltFocalPoint = false; MortarCamera.Destroy(); ONSArtilleryCannon(Weapons[ActiveWeapon]).AllowCameraLaunch(); Weapons[ActiveWeapon].FireCountDown = Weapons[ActiveWeapon].AltFireInterval; } } else bAltFocalPoint = false; } else if (MortarCamera != None) { bCustomAiming = True; CustomAim.Pitch = Default.CustomAim.Pitch; CustomAim.Roll = Default.CustomAim.Roll; if ( IsLocallyControlled() && IsHumanControlled() ) { if ( PlayerController(Controller) != None && PlayerController(Controller).ViewTarget != MortarCamera ) PlayerController(Controller).SetViewTarget(MortarCamera); CustomAim.Yaw += YawAccel * 8192 * DT; if (Weapons[ActiveWeapon] != None && ONSArtilleryCannon(Weapons[ActiveWeapon]) != None) ONSArtilleryCannon(Weapons[ActiveWeapon]).SetWeaponCharge(FClamp(ONSArtilleryCannon(Weapons[ActiveWeapon]).WeaponCharge + (PitchAccel * DT), 0.0, 0.999)); if (bCustomAiming && bJustDeployed || ((Level.TimeSeconds - ClientUpdateTime > 0.0222) && CustomAim != LastAim)) { ClientUpdateTime = Level.TimeSeconds; ServerAim(CustomAim.Yaw); LastAim = CustomAim; bJustDeployed = false; } YawAccel = 0.0; PitchAccel = 0.0; } Throttle = 0.0; Steering = 0.0; } else { bCustomAiming = False; if (IsLocallyControlled() && Weapons[ActiveWeapon] != None) CustomAim = Weapons[ActiveWeapon].WeaponFireRotation; } } simulated function PrevWeapon() { if (MortarCamera != None && Weapons[ActiveWeapon] != None && ONSArtilleryCannon(Weapons[ActiveWeapon]) != None) ONSArtilleryCannon(Weapons[ActiveWeapon]).SetWeaponCharge(FMin(ONSArtilleryCannon(Weapons[ActiveWeapon]).WeaponCharge + 0.025, 0.999)); else Super.PrevWeapon(); } simulated function NextWeapon() { if (MortarCamera != None && Weapons[ActiveWeapon] != None && ONSArtilleryCannon(Weapons[ActiveWeapon]) != None) ONSArtilleryCannon(Weapons[ActiveWeapon]).SetWeaponCharge(FMax(ONSArtilleryCannon(Weapons[ActiveWeapon]).WeaponCharge - 0.025, 0.0)); else Super.NextWeapon(); } simulated function actor AlternateTarget() { return MortarCamera; } event bool VerifyLock(actor Aggressor, out actor NewTarget) { local class LockOnClass; if (MortarCamera != None && !FastTrace(Location, Aggressor.Location)) { NewTarget = MortarCamera; return False; } // Lock has switched from the Camera to the SPMA, notify the Avril Controller if (Aggressor.Instigator!=None && Aggressor.Instigator.Controller !=None && PlayerController(Aggressor.Instigator.Controller) != none) { if (Level.TimeSeconds > LastLocalMsgTime + LockWarningInterval) { LockOnClass = class(DynamicLoadObject(ArtiLockOnClassString, class'class')); PlayerController(Aggressor.Instigator.Controller).ReceiveLocalizedMessage(LockOnClass, 32); } } return True; } simulated event Destroyed() { if (MortarCamera != None) MortarCamera.TakeDamage(1, None, vect(0,0,0), vect(0,0,0), class'DamageType'); Super.Destroyed(); } function DriverLeft() { if (MortarCamera != None) MortarCamera.TakeDamage(1, None, vect(0,0,0), vect(0,0,0), class'DamageType'); Super.DriverLeft(); } event ApplyFireImpulse(bool bAlt) { if ( AIController(Instigator.Controller) != None ) { if ( Controller.Target != None ) { Weapons[ActiveWeapon].CalcWeaponFire(); Weapons[ActiveWeapon].WeaponFireRotation = Rotator(Controller.Target.Location - Weapons[ActiveWeapon].WeaponFireLocation); Weapons[ActiveWeapon].WeaponFireRotation.Pitch = 10000; Weapons[ActiveWeapon].WeaponFireLocation.Z = Location.Z + 500; } } Super.ApplyFireImpulse(bAlt); } function bool RecommendLongRangedAttack() { return true; } function ShouldTargetMissile(Projectile P) { } static function StaticPrecache(LevelInfo L) { Super.StaticPrecache(L); L.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.LargeShell'); L.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.Target'); L.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.Mini_Shell'); L.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.TargetNo'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.SPMAGreen'); L.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.MuzzleSpray'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.SPMATan'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); L.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.Missile'); L.AddPrecacheMaterial(Material'ONSBPTextures.Smoke'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.ExploTrans'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.Flair1'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.Flair1Alpha'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.seexpt'); L.AddPrecacheMaterial(Material'ONSBPTextures.Skins.ArtilleryCamTexture'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlpha_test'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlpha_test2'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.Fire'); L.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); L.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); L.AddPrecacheMaterial(Material'BenTex01.textures.SmokePuff01'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.Explo_Shroom'); L.AddPrecacheMaterial(Material'ArboreaTerrain.ground.flr02ar'); L.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlphaNo'); L.AddPrecacheMaterial(Material'AbaddonArchitecture.Base.bas28go'); } simulated function UpdatePrecacheStaticMeshes() { Level.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.LargeShell'); Level.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.Target'); Level.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.Mini_Shell'); Level.AddPrecacheStaticMesh(StaticMesh'ONS-BPJW1.Meshes.TargetNo'); Super.UpdatePrecacheStaticMeshes(); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.SPMAGreen'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Weapons.MuzzleSpray'); Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.SPMATan'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.NapalmSpot'); Level.AddPrecacheMaterial(Material'AW-2004Particles.Fire.SmokeFragment'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.Missile'); Level.AddPrecacheMaterial(Material'ONSBPTextures.Smoke'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.ExploTrans'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.Flair1'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.Flair1Alpha'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.seexpt'); Level.AddPrecacheMaterial(Material'ONSBPTextures.Skins.ArtilleryCamTexture'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlpha_test'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlpha_test2'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.Fire'); Level.AddPrecacheMaterial(Material'VehicleFX.Particles.DustyCloud2'); Level.AddPrecacheMaterial(Material'VMParticleTextures.DirtKICKGROUP.dirtKICKTEX'); Level.AddPrecacheMaterial(Material'BenTex01.textures.SmokePuff01'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.Explo_Shroom'); Level.AddPrecacheMaterial(Material'ArboreaTerrain.ground.flr02ar'); Level.AddPrecacheMaterial(Material'ONSBPTextures.fX.TargetAlphaNo'); Level.AddPrecacheMaterial(Material'AbaddonArchitecture.Base.bas28go'); Super.UpdatePrecacheMaterials(); } F]aaX$@(Ca Gw //----------------------------------------------------------- // Vehicles will pickup items and give them to the driver //----------------------------------------------------------- class MutVehiclePickups extends Mutator; function PostBeginPlay() { local VehiclePickupRules G; Super.PostBeginPlay(); G = spawn(class'VehiclePickupRules'); if ( Level.Game.GameRulesModifiers == None ) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local Vehicle V; V = Vehicle(Other); if (V != None) V.bCanPickupInventory = True; return true; } Iy A 2 JRjW}L3}>3}>3}>o>+! $hOso`bf MVehiclePickupsJ ]Vehicle PickupsV ]87Vehicles will pickup items and give them to the driverHA//----------------------------------------------------------- // //----------------------------------------------------------- class MutBonusVehicles extends Mutator; var array ArcticStrongholdFactories; var array AridoomFactories; var array AscendancyFactories; var array CrossfireFactories; var array DawnFactories; var array DriaFactories; var array FrostbiteFactories; var array PrimevalFactories; var array RedPlanetFactories; var array SeveranceFactories; var array TorlanFactories; var array< class > ArcticStrongholdReplacements; var array< class > AridoomReplacements; var array< class > AscendancyReplacements; var array< class > CrossfireReplacements; var array< class > DawnReplacements; var array< class > DriaReplacements; var array< class > FrostbiteReplacements; var array< class > PrimevalReplacements; var array< class > RedPlanetReplacements; var array< class > SeveranceReplacements; var array< class > TorlanReplacements; function PostBeginPlay() { local ONSVehicleFactory Factory; local array MapFactories; local array< class > MapReplacements; local string MapName, Garbage; local int i; Divide(Level.GetLocalURL(), "?", MapName, Garbage); Divide(MapName, "/", Garbage, MapName); log("GetLocalURL: "$Level.GetLocalURL()); log("MapName: "$MapName); switch(MapName) { case "ONS-ArcticStronghold": MapFactories = ArcticStrongholdFactories; MapReplacements = ArcticStrongholdReplacements; break; case "ONS-Aridoom": MapFactories = AridoomFactories; MapReplacements = AridoomReplacements; break; case "ONS-Ascendancy": MapFactories = AscendancyFactories; MapReplacements = AscendancyReplacements; break; case "ONS-Crossfire": MapFactories = CrossfireFactories; MapReplacements = CrossfireReplacements; break; case "ONS-Dawn": MapFactories = DawnFactories; MapReplacements = DawnReplacements; break; case "ONS-Dria": MapFactories = DriaFactories; MapReplacements = DriaReplacements; break; case "ONS-Frostbite": MapFactories = FrostbiteFactories; MapReplacements = FrostbiteReplacements; break; case "ONS-Primeval": MapFactories = PrimevalFactories; MapReplacements = PrimevalReplacements; break; case "ONS-RedPlanet": MapFactories = RedPlanetFactories; MapReplacements = RedPlanetReplacements; break; case "ONS-Severance": MapFactories = SeveranceFactories; MapReplacements = SeveranceReplacements; break; case "ONS-Torlan": MapFactories = TorlanFactories; MapReplacements = TorlanReplacements; break; } foreach AllActors( class 'ONSVehicleFactory', Factory ) { for (i=0; i damageType) { if ( Instigator != None ) MakeNoise(1.0); if (bNeedsSingleShot) { if (Damage > Health) BreakApart(HitLocation, Momentum); } else { Health -= Damage; if ( Health < 0 ) BreakApart(HitLocation, Momentum); } } function Bump( actor Other ) { if ( Mover(Other) != None && Mover(Other).bResetting ) return; if ( UnrealPawn(Other)!=None && bImperviusToPlayer ) return; if ( VSize(Other.Velocity)>500 ) BreakApart(Other.Location, Other.Velocity); } function bool EncroachingOn(Actor Other) { if ( Mover(Other) != None && Mover(Other).bResetting ) return false; BreakApart(Other.Location, Other.Velocity); return false; } event EncroachedBy(Actor Other) { if ( Mover(Other) != None && Mover(Other).bResetting ) return; BreakApart(Other.Location, Other.Velocity); } } state Broken { function BeginState() { super.BeginState(); SetTimer(30,false); } event Timer() { local pawn p; super.Timer(); foreach RadiusActors(class'Pawn', P, CollisionRadius * 1.25) { SetTimer(5,false); return; } GotoState('Working'); } } simulated function PostNetReceive() { if ( bHidden && EffectWhenDestroyed != none && EffectIsRelevant(location,false) ) Spawn( EffectWhenDestroyed, Owner,, Location ); } //============================================================================= // defaultproperties //============================================================================= f//----------------------------------------------------------- // //----------------------------------------------------------- class DECO_BreakablePost extends DECO_Smashable; #exec OBJ LOAD FILE=..\StaticMeshes\ONS-BPJW1.usx //============================================================================= // defaultproperties //============================================================================= xRE BSٞxb! $S sg_"(a& G: BA0m$AB$Bb//----------------------------------------------------------- // //----------------------------------------------------------- class DECO_Barricade extends DECO_Smashable; #exec OBJ LOAD FILE=..\StaticMeshes\ONS-BPJW1.usx //============================================================================= // defaultproperties //============================================================================= xTG BUexb! $aSsk_"2a& G: BA0m$@BB$ BA//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeShockTankShockBall extends VehicleDamageType; J//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeShockTankProximityExplosion extends VehicleDamageType; 2wy <<9w.w*w R9?w  GI//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSCicadaRocket extends VehicleDamageType abstract; X` ^1.w.*.u` h  GH//----------------------------------------------------------- // //----------------------------------------------------------- class DamTypeONSCicadaLaser extends VehicleDamageType abstract; ^class DamTypeArtilleryShell 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'; } ^_Zm O9:9:$Rw2*C9:m &~a eR~a nw~* w*w.*2!P Gj//----------------------------------------------------------- // //----------------------------------------------------------- class CicadaLockBeamEffect extends PainterBeamEffect; simulated function Tick(float dt) { if (Level.NetMode == NM_DedicatedServer) { return; } UpdateEffect(dt); if (TargetState == PTS_Marked) { if (Brightness == 40.0) PlaySound(MarkSound); SetBrightness( FMax(FMin(Brightness+dt*100.0, 250.0), 100.0) ); } else SetBrightness( 40.0 ); if (TargetState == PTS_Aquired) GotoState('Aquired'); else if (TargetState == PTS_Cancelled) GotoState('Cancelled'); } simulated function UpdateEffect(float dt) { local Vector BeamDir; if (Owner!=None && ONSDualACSideGun(Owner)!=None) { StartEffect = ONSDualACSideGun(Owner).Location; } SetLocation(StartEffect); BeamDir = Normal(EndEffect - Location); SetRotation(Rotator(BeamDir)); mSpawnVecA = EndEffect; if (Spot != None) { Spot.SetLocation(EndEffect - BeamDir*10.0); } } state Aquired { simulated function Tick(float dt) { if (Level.NetMode != NM_DedicatedServer) { UpdateEffect(dt); SetBrightness( 250.0 ); mSizeRange[0] = FMin(mSizeRange[0]+dt*40.0, 16.0); } else disable('Tick'); } } `v ]+a'((9:9:$gr2*I9:v &2a [X2a \a $@w2* w*w.*2!P Gy u T u Qr*r.*r.*-E'{=U@)w*w* r>r>-". e ,!). e ,"UQ-"a+9PNw*w.*69?%m9?%m6NN?N?6kL>L?Nmk tao p  (Nrt*R__g?9:9:$r*r*r.*v!T g_-E_w*.Hw* Iw*Z Br*rKb Destroy Mortar CameranHrg H?_w* r>w.*R=R.u Gbw@Ha(((.9:9:$a $@Ew2*2a GdgK w2*2a GD$?D@@D`@~: ?n$L=o$L=qsxSySz{|i$?j$CCApDlFG: pH$,BEICApDOFG: pAH$,BECICADVFG: pH$,BEAICADnFG: pAH$,BEYICApDNFG: pH$,BEBICApDrFG: pAH$,BE}ID$?D@@D@@~: ̬n$L=o$L=qsxSySz{|i$?j$/DCpDZFG: @H$0BEuICDFFG: @H$0BEwICD^FG: @H$0BExICpD_FG: @H$0BEDICpDKFG: @H$0BESICDhFG: @H$0BEWICDiFG: @H$0BEuICpDjFG: @H$0BEtId$BU$BEd$BU$BE[N:VЊd$BU$BE[N:V0ud$BU$BE[N:V0ud$BU$BE UZ $D$DCW"X"Y"wZ $$?vZ $$@SvSSSY$*Y$?*(""Y$ $?$? $>Z 4Z $$Z $A$AZ $B$B$@E Z $>$>Z 4Z $C$CZ $$Z $$UZ $D$DCW"X"Y"wZ $$?vZ $$@SvSSSY+$*$L?*$?*,$>""Y$ $?$? $Z 4Z $A$AZ $A$AZ $B$B$@E Z $?$?Z 4Z $C$CZ $$Z $$Xx: ?SSSY$* $?*@`""Z 4Z $$?Z $$Z $$Y$ $?$? $Z 4Z $C$HCZ $B$BZ $B$B$D Z $L>$L>SSS4QY+$*$L?*$?*,$>"%: A+Z 4Z $$AZ $$Z $$"Y$ $=$? $?Z 4Z $pB$BZ $B$BZ $B$B$D Z $L>$L>& [SS': aRZ 4Z $?$?Z $?$?Z $>$>Y+$*$fff?*$?*/$@"%: AA"?: ???Z 4Z $L>$>Z $>$?Z $$L>uZ 4Z $>$>Z $>$>Z $$qYVdUZ $D$D^Z $?$?m"eZ $@$@nZ $?$?poZ $?$?$@E Z $?$?Z 4Z $\C$CZ $B$HCZ $C$C& [SS': aRZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"%: "?: Z 4Z $L>$>Z $L>$>Z $$$@E Z $@$@Z 4Z $$Z $p$ Z $C$C&[SS': aRZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"#%: 0B"?: ???Z 4Z $$>Z $>$@Z $$$@E Z $?$?Z 4Z $$BZ $$HZ $HC$C&[SS': aRZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"#%: A"Z 4Z $$?Z $$?Z $$Z 4Z $?$?Z $$Z $$$@E Z $@$@Z 4Z $$Z $C$CZ $fC$zC& [SS': HRZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"%: BA"Z 4Z $$?Z $$L>Z $$uZ 4Z $?$?Z $?$?Z $?$?$@E Z $@$@Z 4Z $ $ AZ $ $ AZ $HC$zC&[SSS': aRZ 4Z $>$>Z $>$>Z $L>$>Y+$*$L?*$?*"#%: pA+Z 4Z $$Z $$AZ $$A2Z $@$@"Z 4Z $$=Z $$=Z $$Z 4Z $$Z $L$L>Z $$Y($ $$= $@?$? $@?Z 4Z $?$@Z $?$@Z $?$?$HC Z $@$@Z 4Z $H$HCZ $$CZ $$B$>Z $>$>Z $L>$>Y+$*$L?*$?*"#%: pA+Z 4Z $$Z $$AZ $$A2Z $@$@"Z 4Z $$=Z $$=Z $$Z 4Z $$Z $L$L>Z $$Y($ $$= $@?$? $@?Z 4Z $?$@Z $?$@Z $?$?$HC Z $@$@Z 4Z $H$HCZ $$CZ $$B"#%: A+Z 4Z $$Z $$BZ $$2Z $@$@"Y$ $333?$? $?Z 4Z $B$BZ $B$BZ $B$B$C )"(" Z $@$@& *[SS': RZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"%: B?: ??Z 4Z $$?Z $>$?Z $$Z 4Z $?$?Z $?$?Z $?$?qYVd UZ $D$D^Z $?$?m"eZ $@$@nZ $?$?poZ $?$?$@E Z $ @$ @Z 4Z $HC$HCZ $$Z $D$aD& *[SS': RZ 4Z $?$?Z $?$?Z $>$>Y+$*$L?*$?*"%: ABZ 4Z $$?Z $$?Z $$?Z 4Z $=$=Z $=$=Z $=$=Z 4Z $?$?Z $?$?Z $?$?$@E Z $ @$ @Z 4Z $HC$CZ $H$HCZ $D$aD7fSS4Yc$*$+>>*888$?#?*MMM$`?*555$?*$?*$?*/${n?T$L>%: HC+Z 4Z $H$HCZ $H$HCZ $@@$HC2Z $4C$4CZ 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Z 4Z $B$CZ $B$CZ $B$C$HC)"(" Z $?$?.Z $$o=Z 4Z $$CZ $$CZ $C$C7SSS4YG$*$:h?*$?*$?*$?*/$&/?#%: HC+Z 4Z $$BZ $$BZ $$C2Z $4C$4CZ 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $$)\= $ff&?$? $@Z 4Z $4C$>CZ $4C$>CZ $4C$>C$B)"(" Z $?$fff?Z 4Z $$CZ $$CZ $@$D7SSS4Y$*$?*,$333?/$F="+Z 4Z $$Z $$Z $?$?Z 4Z $$?Z $$Z $$Y5$ $G?$ $@$> $@@$? $@Z 4Z $B$BZ $B$BZ $B$B$C)"(" Z $?$?7fSzSS': Y$*ͤ$?*ͪ/$p=?T$ ף=-"+Z 4Z $$Z $$Z $$Cz"Z 4Z $)\$)\=Z $$Z $$Z 4Z $$?Z $$Z $$Y5$ $?$ $?${> $QA$? $fffAZ 4Z $A$pBZ $B$BZ $B$B$HB Z $?$@.Z $q=$q=Z 4Z $$BZ $$BZ $C$HDrZ 4Z $?$@Z $?$@Z $?$@Y7SY+$*$?*$?*,$fff?/$ ף>"+Z 4Z $$Z $$Z $`$`Y($ $ ?$@? $?$? $(\?Z 4Z $ffVA$ffVAZ $A$AZ $ffVA$ffVA)"(" Z $?$@Z 4Z $$Z $$Z $8$89$?:$?7SY9$*$$$_>*",$?*$?*,$fff?/$>"Y$ $p?$? $?Z 4Z $}A$}AZ $}A$}AZ $}A$}A Z $(\?$(\?7SY+$* $?*9>$?*,$fff?/$?"+Z 4Z $$Z $$Z $B$BY$ $$? $@@c$@Z 4Z $ A$pAZ $ A$pAZ $ A$pA Z $@@$@@9$?:$?7SY+$*$?*$?*,$fff?/$ ף>"+Z 4Z $$Z $$Z $`$`Y($ $ ?$@? $?$? $(\?Z 4Z $ffVA$ffVAZ $A$AZ $ffVA$ffVA)"(" Z $?$@Z 4Z $$Z $$Z $8$89$?:$?7SY+$*$?*$?*,$fff?/$>"Y$ $p?$? $?Z 4Z $}A$}AZ $}A$}AZ $}A$}A Z $(\?$(\?7SY+$* $?*>9$?*,$fff?/$?"+Z 4Z $$Z $$Z $B$BY$ $$? $@@c$@Z 4Z $ A$pAZ $ A$pAZ $ A$pA Z $@@$@@9$?:$?7SSS4Yq$*$>*$s6?*$?*:$?*$?*$?*$?*,$Q8?/$?W[>""Z 4Z $$?Z $$Z $$Y5$ $${.> $?$R> $@$? $Z 4Z $B$BZ $B$BZ $B$B$B)"(" Z $>$F>.Z $L>$L>Z 4Z $1 E$1 EZ $$Z $$7SSSY+$*d$?*/$?*J,$L?/$;=""Y($ $@${.> $A$? $Z 4Z $HB$HBZ $HB$HBZ $HB$HB$HC Z $ˡE?$ˡE?.Z $L>$L>Z 4Z $/D$/DZ $$Z $$SSSYU$*$į=*$_|?*$?*$?*$?*/$333?""Z 4Z $$?Z $$Z $$Y($ $>$)\> $?$? $k@Z 4Z $rA$uBZ $rA$uBZ $rA$uB$B Z $?$?.Z $+=$9=Z 4Z $C$CZ $$Z $$9$333?:$333?SSS': YU$*$į=*$_|?*$?*$?*$?*/$333?"+Z 4Z $$Z $$Z $$"Z 4Z $?$?Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $333?$)\= $@@$? $ AZ 4Z $pA$pAZ $pA$pAZ $pA$pA$B Z $R?$R?.Z $d;_>$d;_>Z 4Z $$Z ${U${UZ $p$pBSSS4': YG$*$į=*$?C?*$?*$?*/$333?#8"Z 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $?$)\= $Ga@$? ${@Z 4Z $@$BZ $@$BZ $@$B$A)"(" Z $>$?.Z $ #>$ #>Z 4Z $$CZ $$Z $$C9$333?:$333?SSS': YU$*$į=*$_|?*$?*$?*$?*/$333?" #8"Z 4Z $$?Z $$Z $$Y($ $D;$ $?$? $@Z 4Z $33HB$uBZ $33HB$uBZ $33HB$uB$A Z $\?$\?.Z $`=$`=9$333?:$333?7SSSY9$*Y|$$_>*+$?*($?*J"Y($ $HB${.> $A$? $Z 4Z $@@$@@Z $@@$@@Z $@@$@@$C Z $?5^>$?5^>.Z $L>$L>Z 4Z $@0E$@0EZ $$Z $$SSS': DYU$*$į=*$_|?*$?*$?*$?*/$333?"+Z 4Z $$Z $B$BZ $$"Z 4Z $?$?Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $333?$)\= $@@$? $ AZ 4Z $pA$pAZ $pA$pAZ $pA$pA$B Z $R?$R?.Z $d;_>$d;_>Z 4Z $$Z ${UD${UDZ $p$pBSSS4': CYG$*$į=*$?C?*$?*$?*/$333?#8"Z 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $?$)\= $Ga@$? ${@Z 4Z $@$BZ $@$BZ $@$B$A)"(" Z $>$?.Z $ #>$ #>Z 4Z $$CZ $$Z $$C9$333?:$333?SSS': YU$*$į=*$_|?*$?*$?*$?*/$333?" #8"Z 4Z $$?Z $$Z $$Y($ $D;$ $?$? $@Z 4Z $33HB$uBZ $33HB$uBZ $33HB$uB$A Z $?$?.Z $`=$`=9$333?:$333?7SSS': BY$*$?*,$ףp?/$4?+Z 4Z $$BZ $H$HCZ $$B"Z 4Z $̽$=Z $$Z $$Z 4Z $$?Z $$Z $$Y5$ $$ $$)\= $?$? $( @Z 4Z $C$CZ $C$CZ $C$C$zD Z $?$?.Z $>$(>Z 4Z $ff C$CZ $G$GCZ $C$33]C&*SS': aY+$*$333?*$?*"%: AB"?: ???Z 4Z $$?Z $$Z $$?Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$BZ $C$DZ $C$C&*SS': aY+$*$333?*$?*"#%: B"?: ???Z 4Z $$?Z $$Z $$?Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $C$DZ $C$C&*SS': aY+$*$333?*$?*"#%: CB"?: ???Z 4Z $$?Z $$Z $$?Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$BZ $C$DZ $C$C&*SS': aY+$*$333?*$?*"%: A"?: ???Z 4Z $$?Z $$Z $$?Z 4Z $?$?Z $$Z $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$BZ $$Z $C$C&*SS': aY+$*$333?*$?*"#%: "?: ???Z 4Z $$?Z $$Z $$?Z 4Z $?$?Z $$Z $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $$Z $C$C&*SS': aY+$*$333?*$?*"#%: C"?: ???Z 4Z $$?Z $$Z $$?Z 4Z $?$?Z $$Z $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$BZ $$Z $C$C& *SS': aY+$*$333?*$?*"%: BB"?: ??Z 4Z $$Z $?$?Z $$Z 4Z $$Z $L$LZ $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$HZ $$Z $D$HD& *SS': aY+$*$333?*$?*"#%: B"?: ?Z 4Z $$Z $?$?Z $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $C$CZ $$Z $D$HD& *SS': HY+$*$333?*$?*"%: %CB"Z 4Z $?$?Z $$L>Z $$Z 4Z $fff?$fff?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $$Z $D$HD& *SS': aY+$*$333?*$?*#62Z $@$@"Z 4Z $$?Z $$?Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$CZ $$CZ $C$D $?$? $?Z 4Z $A$@AZ $B$BZ $B$B$C Z $333?$333?Z 4Z $$CZ $$CZ $$$? $?$C)"(" Z $?$?SSS4Y+$*$333?*$?*,$L?"#8"Z 4Z $$?Z $$Z $$Y($ $?$? $?$? $333?Z 4Z $pB$BZ $B$BZ $B$B$@A)"(" Z $>$?SSSY9$*$?*o$L?*D$?*#%: C\B+Z 4Z $H$HBZ $$Z $$"Z 4Z $$L=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $$? $?Z 4Z $B$BZ $B$BZ $B$B$@E Z $>$L?Z 4Z $$Z $$Z $$C7fSS4Yc$*$+>>*888$?#?*MMM$`?*555$?*$?*$?*/${n?T$L>#%: HC+Z 4Z $H$HCZ $H$HCZ $@@$HC2Z $4C$4CZ 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Z 4Z $B$CZ $B$CZ $B$C$HC)"(" Z $?$?.Z $$o=Z 4Z $$CZ $$CZ $C$CX7SSS4Y$*$?*,$>/$?"+Z 4Z $$Z $$Z $?$?Z 4Z $$?Z $$Z $$Y5$ $G?$ $@$> $@@$? $@Z 4Z $B$BZ $B$BZ $B$B$C)"(" Z $333?$333?Xx: ?SSS4Y9$*$Y?*$?*$?*"%: CE :V333333J : FFFY$ $?$? $@Z 4Z $C$CZ $C$CZ $C$C$B)"(" Z $$?$$?.Z $>$>Z 4Z $$Z $$Z $ C$ C7SSS4YG$*$:h?*$?*$?*$?*/$&/?#%: HC+Z 4Z $$BZ $$BZ $$C2Z $4C$4CZ 4Z $ ף$ ף<Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $$)\= $ff&?$? $@Z 4Z $4C$>CZ $4C$>CZ $4C$>C$B)"(" Z $?$fff?Z 4Z $$CZ $$CZ $@$D&7StS': mRZ 4Z $~>$z?Z $~>$z?Z $~>$z?Y$*$?*/$H*@#+Z 4Z $$BZ $$BZ $$Z 4Z $$?Z $$?Z $$?Z 4Z $$?Z $$?Z $$?Z 4Z $<$-=Z $<$-=Z $<$-=$HC Z $@@$@@Z 4Z $$DZ $$DZ $D$@5E7SSS4Y$*$?*,$333?/$F="+Z 4Z $$Z $$Z $?$?Z 4Z $$?Z $$Z $$Y5$ $G?$ $@$> $@@$? $@Z 4Z $B$BZ $B$BZ $B$B$C)"(" Z $?$?7fSzSS': Y$*ͤ$?*ͪ/$p=?T$ ף=-"+Z 4Z $$Z $$Z $$Cz"Z 4Z $)\$)\=Z $$Z $$Z 4Z $$?Z $$Z $$Y5$ $?$ $?${> $QA$? $fffAZ 4Z $A$pBZ $B$BZ $B$B$HB Z $?$@.Z $q=$q=Z 4Z $$BZ $$BZ $C$HDrZ 4Z $?$@Z $?$@Z $?$@Y&StS': )V RZ 4Z $ #>$ #>Z $ #>$ #>Z $ #>$ #>Y$*$?*"Z 4Z $Ǿ$ǾZ $7?$7?Z $$Z 4Z $$Z $$Z $>$>Z 4Z $ @$ @Z $ @$ @Z $ @$ @$HBZ 4Z $C$"DZ $T9$Z $FC$C&StS': )V RZ 4Z $ #>$ #>Z $ #>$ #>Z $ #>$ #>Y$*$?*"Z 4Z $>$>Z $7$7Z $$Z 4Z $>$>Z $$Z $>$>Z 4Z $ @$ @Z $ @$ @Z $ @$ @$HBZ 4Z $C$"DZ $#D$-!DZ $eC$C7SSS': Y+$*$>*B$?*/$7A?"Z 4Z $$@Z $$Z $$Z 4Z $$?Z $$Z $$YB$ $?${.> $@$? $?$R? $?$? $?c$AZ 4Z $@$@Z $@$@Z $@$@$zD Z $T%?$?Z 4Z $C$DZ $/$/DZ $ff`$3CCX"Y"Y$*|$?*,$)\>/$?-""Z 4Z $HC$HCZ $HC$HCZ $HC$HC$B Z $?$?Z 4Z $A$AZ $$Z $$9$?:$?XY+$*dd$L?*dd$?*dd-"%: BZ 4Z $$?Z $$Z $$Z 4Z $ B$HBZ $B$BZ $B$B$E Z $ff@$ff@9$@:$@XSY$* $?*-"%: HBZ 4Z $$Z $A$AZ $B$B$C Z $L>$L>Z 4Z $$ AZ $$Z $$rZ 4Z $?$?Z $$Z $$9$@:$@S4Y9$*$=*$?*$?*-"#%: BZ 4Z $$L>Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $?$? $Z 4Z $HA$AZ $B$BZ $B$B )"(" Z $>$>Z 4Z $$Z $$Z $$9$?:$@SY$*$?*-"Z 4Z $$?Z $$Z $$Z 4Z $HB$\BZ $B$BZ $B$B$@E Z $=$=fgSpY$*$?*("62Z $@$@B Z 4Z $$@Z $$@Z $$@C YF$~: ???$?~: ???$?~: Z 4Z $$?Z $$Z $$Z 4Z $$?Z $$Z $$Y($ $?$? $?$? $Z 4Z $ A$AZ $B$BZ $B$B Z $L>$?*q$?*$?*-"Z 4Z $$?Z $$Z $$Y$ $>$? $?$C Z $>$>SSS': HBY+$*$>*$?*,$?"#+Z 4Z $$Z $$Z $$62Z $B$B"Z 4Z $$?Z $$Z $$Y$ $@?$? $ @$`jG)"(" Z $?$?SSS4"%: HB+Z 4Z $H$BZ $$Z $$62Z $B$B"Z 4Z $$?Z $$Z $$Y$ $?$? $@$zE)"(" Z $>$?SSS4"%: HB+Z 4Z $HB$HZ $H$HBZ $H$A2Z $B$B"Z 4Z $$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $?$? $@$@E)"(" Z $?$L?.Z $L>$L>SSQY+$*$Y?*$?*,$?"#8"62Z $$A"Z 4Z $$?Z $$Z $$Y$ $L?$? $?)"(" Z $?$?.Z $L>$L>S}zSS4Y+$*$?*$?*" #+Z 4Z $$@Z $$@Z $$@8"62Z $$A"Z 4Z $$?Z $$Z $$Y($ $$L> $L?$? $?$`A)"(" Z $?$?.Z $L>$L>&jS*SS': HY+$*$Y?*$?*"#%: HB62Z $@A$A"Z 4Z $$?Z $$?Z $$@Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?.Z $L>$L>Z 4Z $H$HCZ $H$HCZ $$ $L?$? $?$`A)"(" Z $?$?.Z $L>$L>SSQY+$*$Y?*$?*,$?"#8"62Z $$A"Z 4Z $$?Z $$Z $$Y$ $>$? $?)"(" Z $?$?.Z $L>$L>& jS*SS': HY+$*$Y?*$?*"#%: HHB"?: ??Z 4Z $$Z $?$?Z $$Z 4Z $?$?Z $$Z $?$?$@E Z $?$?.Z $L>$L>Z 4Z $$zZ $$Z $C$HD$L>SSS4Y+$*$?*$?*" #+Z 4Z $$@Z $$@Z $$@8" "Z 4Z $$?Z $$Z $$Y($ $$L> $L?$? $?$`A)"(" Z $?$?.Z $L>$L>&jS*SS': HY+$*$Y?*$?*"#%: BHB"Z 4Z $$?Z $$?Z $$@Z 4Z $?$?Z $$Z $?$?$@E Z $?$?.Z $L>$L>Z 4Z $C$CZ $C$CZ $$$L>SSS4Y$*$?*" #+Z 4Z $$@Z $$@Z $$@8""Z 4Z $$?Z $$Z $$Y($ $?$> $L?$? $?Z 4Z $B$BZ $B$BZ $B$B$`A)"(" Z $?$?.Z $L>$L>&jS*SvSS': HY+$*$Y?*$?*/$?"#%: 4B"Z 4Z $?$@@Z $$Z $$Z 4Z $?$?Z $$Z $$Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?.Z $L>$L>Z 4Z $$Z $$Z $$=SS4"#%: B+Z 4Z $H$HCZ $$BZ $$2Z $$@"Z 4Z $$?Z $$Z $$Z 4Z $HB$HBZ $B$BZ $B$B$B)"(" Z $>$?.Z $L=$L=& B*[SS': Y+$*$333?*$?*"#Z 4Z $?$@Z $>$?Z $$Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$CZ $$CZ $$&*SS': Y+$*$Y?*$?*"#%: \B62Z $A$AZ 4Z $$L>Z $$L>Z $$L>Z 4Z $$?Z $$?Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$@.Z $>$>Z 4Z $$CZ $H$CZ $$HCZ $$L>Z $$L>Z 4Z $$?Z $$?Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$@.Z $>$>Z 4Z $$CZ $$zDZ $HB$HC$>SSS4Y+$*$>*$?*"#Z 4Z $$?Z $$Z $$Y$ $L>$? $`@Z 4Z $HB$BZ $B$BZ $B$B$C )"(" Z $>$>SSSY9$*$L>* $?* f$?*"62Z $@$ AZ 4Z $$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $L>$? $?$@E Z $>$>*3$?*/$?*-"Z 4Z $$?Z $$Z $$Y$ $>$? $?$C Z $>$>SSSY+$*<$?*$f$?*-"Z 4Z $$?Z $$Z $$Y$ $$? $?Z 4Z $B$BZ $B$BZ $B$B$C Z $>$>NML"K$AJI$@?SY$*"Z 4Z $B$BZ $B$BZ $B$B$Dj$ Z $#tI$#tIx: ?SSSY+$*@$@?*@$?*,$@?-"%: ?: Z 4Z $L=$L>Z $$Z $$Z 4Z $$?Z $$Z $$Y5$ $=$= $?$> $?$? $@?Z 4Z $B$HCZ $B$BZ $B$B$HB j$ Z $@$@.Z $L=$L=SY$*$?*-"#Z 4Z $C$CZ $B$BZ $B$B$C Z $ ף<$ ף<SSY9$*$=*$?*$?*,$?/$ ?-"#Z 4Z $$?Z $$Z $$Y$ $?$? $@@Z 4Z $pB$BZ $B$BZ $B$B$@ Z $?$?9$?:$?SSY9$*$L>*$?*$?*-"Z 4Z $$?Z $$Z $$Y$ $?$? $?Z 4Z $B$BZ $B$BZ $B$B$@ Z $?$?9$?:$?SY9$*$L>*$L?*O$?*-"Z 4Z $$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $?$? $?Z 4Z $HB$HBZ $B$BZ $B$B Z $?$?9$?:$?SY+$*$?*$?*-"zZ $L>$L>Z 4Z $?$?Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $?$? $?Z 4Z $B$BZ $B$BZ $B$B Z $@$@9$?:$?&*}-"Z 4Z $@?$@?Z $?$?Z $?$? Z $=$=9$?:$?QYG$*$L>*$?*$?*$?*-"#Z 4Z $$?Z $$?Z $$?Y$ $?$? $?Z 4Z $pB$BZ $B$BZ $B$B)"(" Z $>$>9$?:$?NML"K$AJI$?bS4Y$*x$?*"Z 4Z $$@Z $$@Z $$@Z 4Z $$?Z $$?Z $$?Z 4Z $pB$pBZ $B$BZ $B$B$ F Z $zD$zD&*SS': HY+$*$333?*$?*"#%: |A"Z 4Z $?$@Z $$Z $?$?Z 4Z $$Z $$?Z $$Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $$aZ $C$C&*SS': Y+$*$333?*$?*"%: TBA"Z 4Z $$?Z $$Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$BZ $$Z $C$C&*SS': TY+$*$333?*$?*"#%: 2A"Z 4Z $$?Z $$Z $$@Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $H$Z $C$C&*SS': TY+$*$333?*$?*"%: *CA"Z 4Z $$Z $$Z $$@Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $B$CZ $$Z $HC$C&*SS': aY+$*$333?*$?*"#%: TBBA"Z 4Z $$?Z $$?Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$HCZ $C$CZ $C$C&*SS': aY+$*$333?*$?*"%: )CBA"Z 4Z $$@Z $$Z $?$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $C$CZ $D$HDZ $HC$C&*SS': aY+$*$333?*$?*"#%: |BA"Z 4Z $$?Z $$Z $?$@Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $A$Z $C$DZ $C$C&*SS': zY+$*$333?*$?*"%: 1BA"Z 4Z $$?Z $$?Z $$?Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $H$Z $C$CZ $C$C& *SS': zY+$*$333?*$?*"%: BBC"?: ???Z 4Z $$Z $>$@?Z $$Z 4Z $?$?Z $?$?Z $?$?$F Z $?$?Z 4Z $HC$CZ $$Z $D$HD& *SS': HY+$*$333?*$?*"%: B<C"Z 4Z $$?Z $$?Z $$Z 4Z $?$?Z $?$?Z $?$?$RG Z $?$?Z 4Z $D$/DZ $$Z $B$C& *SS': HY+$*$333?*$?*"%: pp C"?: Z 4Z $$Z $?$?Z $$Z 4Z $?$?Z $?$?Z $?$?$@E Z $?$?Z 4Z $$Z $$Z $C$HDSSY+$*$333?*$?*,$?#8"Z 4Z $$?Z $$Z $$$A Z $?$?SS4Y+$*$333?*$?*#+Z 4Z $ $ AZ $ $ AZ $ $ A8"Z 4Z $$?Z $$Z $$Z 4Z $B$BZ $B$BZ $B$B$`A)"(" Z $L?$L?SSY+$*$333?*$?*,$?#8" $A Z $?$?SS4Y+$*$333?*$?*#8" Z 4Z $$?Z $$Z $$Y($ $@$> $?$? $?Z 4Z $B$BZ $B$BZ $B$B)"(" Z $L?$L?SSY+$*$333?*$?*,$?#8" $A Z $L?$L?SSQ"(#+Z 4Z $$Z $$AZ $H$HB8" Z 4Z $$?Z $$Z $$Z 4Z $B$BZ $B$BZ $B$B$HB)"(" Z $=$=S4Y+$*$>*$?*,$?#8" 62Z $$HBZ 4Z $$L>Z $$Z $$Z 4Z $$?Z $$Z $$)"(" Z $L?$L?SSS4"%: B+Z 4Z $H$HCZ $$BZ $$"Z 4Z $$?Z $$Z $$Y$ $?$? $@Z 4Z $B$BZ $B$BZ $B$B$@E)"(" Z $?$?$?Z $?$?"#%: pC62Z $A$ BZ 4Z $$?Z $$Z $$Y$ $?$? $?$ B)"(" Z $>$>*[$?*#%: B+Z 4Z $$HCZ $$BZ $$Z 4Z $$?Z $$Z $$$HB)"(" Z $L>$L>&*SS': HY$*$?*"#%: B+Z 4Z $H$HBZ $$AZ $$62Z $A$HB"Z 4Z $$?Z $$?Z $$?Z 4Z $$?Z $$?Z $$?Z 4Z $L>$@Z $L>$@Z $L>$@$C Z $?$?$>& *SSSY+$*Sq$?*J$?*,$?-"%: @AZ 4Z $$Z $>$>Z $$Y$ $?$? $@Z 4Z $?$?Z $?$?Z $L>$L>$@E Z $?$?Xx: ?SSSY$*@$?*-"%: @Z 4Z $$?Z $$Z $$Y$ $?$? $?$A Z $?$?SSSY+$*$L?*Q$?*"+Z 4Z $$BZ $$AZ $$A2Z $@$A"Z 4Z $$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $@?$? $@Z 4Z $A$ BZ $B$BZ $B$B$HC Z $?$L?$>SSSY+$*$L>*w$?*"62Z $B$B\Z 4Z $$GZ $F$FZ $B$BZ 4Z $$?Z $$Z $$Y$ $?$? $@@$@E Z $?$?*$?*"62Z $B$B\Z 4Z $$GZ $F$FZ $B$BZ 4Z $$?Z $$Z $$Y$ $?$? $@$@E)"(" Z $?$?*$?*"#62Z $B$B\Z 4Z $$GZ $F$FZ $B$BZ 4Z $$?Z $$Z $$Y$ $?$? $@@$@E Z $?$333?$L>Xx: ?SSSY9$*$L>*B$L?*B$?*-"yY$ $$? $?$B Z $?$?UZ $C$CCW"SSSY+$*B$L?*B$?*,$>-"Y($ $$? $?$? $?$@E Z $?$?Z 4Z $$Z $$Z $$SSSY9$*$L>*@$L?*@$?*-"62Z $$BZ 4Z $$?Z $$Z $$Y$ $L>$? $@$@E Z $?$L?SS4Y+$*$?*Q$?*-"Z 4Z $$?Z $$Z $$Z 4Z $HB$HBZ $B$BZ $B$B$B Z $?$?Z 4Z $;$HZ $$Z $$&*SY$*$?*-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $=$=&*SY$*@@$?*@@-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $=$=&*SY$*@@$?*@@-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $=$=&*SSY$*-$?*-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $L>$L>&*SSY$*PP$?*-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $L>$L>&*SSY$*FF$?*-"Z 4Z $@$@Z $@@$@@Z $@@$@@$@E Z $L>$L>SSSY+$*$?*$?*"Y$ $$? $pA$@E Z $333?$333?SSSY9$*$=*$?*$?*,$>/$ ?-"Z 4Z $$?Z $$Z $$Y$ $?$? $pAZ 4Z $pB$BZ $B$BZ $B$B$A Z $?$?9$?:$?SSSY+$*$?*$?*"Z 4Z $$?Z $$Z $$Y$ $$? $ A$@E Z $?$?SSSY9$*$L>*o$L?*U$?*,$?"Y$ $$? $@$C Z $?$?&*SSSY+$*l$333?*$?*"Y$ $$? $@$C Z $?$?SSSY+$*$?*$?*,$?"Z 4Z $$?Z $$Z $$Y$ $$? $A$@E Z $?$?SSSY+$*$333?*S$?*"Z 4Z $L=$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $$? $@$D Z $?$?SSSY9$*$=*J|$L?*l$?*-"62Z $B$BZ 4Z $$=Z $$Z $$Z 4Z $$?Z $$Z $$Y$ $?$? $@@$@E Z $?$@?x&V&`&lW {y &w&x ]Z&z L}&|&} pW&\&]&^&lX ~]&l[ ~D ~L&T&S&Uk e Df{i&KZ dI~`E&N@ n(S>q AFhNavID(q TJ ad omD \u[i8Sw`EycSM vq CWa PWK ]A j [wCEW^ So adnz|Z J#D WMd}srZ@COx ]}tjc}yW vZ B8TNY^ ] J j avD DCq Sh`V o a |O~Iq Wf dY rKq mM N zND SWT `Bm[ {~HW VMbepXtMU\WS l[xWI GZ Sx` o[|8JJWU YfTt^ nDW]  rk uKLHZVh]vWC EZ SF `r luvyB GxTocYqf Tf Ss aon\|OK8J Yf eI s8q@l OuC\L jd wW D@PR  ^7K j[ wMC MQO _HlWi zI GQ S a`LnV |D Je OW` f#C tWOAW Olh [W\hvi FMzSl iak  JY W7Id KrR @ LOuq]} ld y}W FARik ` n}A  zW G8US/{aTq]ZMB [Phk vm Dq Q[ ^[kZyH IHVuU dH pW }hJH X'OeH s&r @qL Z/f gif uH C} cP~ csBVC d| qF v~ tD An NH ][t jH wO DHOQqC_K  mL  zH Gj TVyaQK oO{iIx  WZdX sx @ LB Y[ fB sWJ @x M y YWfI vZB`  Qgt ^gskg yf F}nSka|yqP  jWQwWPEWk SWf ak  oy|B LU XWNeH sA @CM@ [OhvH DVx  PG]D kN xJ EC RO ` mYyW  G| Sy `r mO zH GsOTOv bv pm }CJy[ XMeH suy @p MCY[ g7CtziBYPn ^x  k&x lwHcE q/v ~xL/d Z}YhiH vdCuS Q} _cl[ zH GqTi bbof  }OJ|Xnf[H ttAW OcH \cfiZwD E| QM^klr z&T Jf X&Off  u\  BB OR ]G jV wFD__ R_^[lzz^ JT WU d ] qV}t LOXS f_vs` AF Mo Yih[ vH Bf N} \j h| t KA{Od  ]{jX zjFp Tk dC r]Y@Yg uy B&r O[V ^f k&@{y&g]taQj_G muVz&SpI\ yk  FT QSGdW rX 0t LJ Xu d{ qe~fLg Zuf f}s  ty A7e  N&Z@[@[l iA uqy BD O7i \v kHixMyFe UI Xbw z[ G~ TE as pne ^KkF yBFS TQa ay ng z\G} Wd~rf @k NWM \V idS vi Cl OdQ \I iiYuf Cy QWR ^i kWxf FiTf bd pW ~@ JfL Vi byLox  }_wIiGWx  e#iqfzMg[i iiQ RP_[ mm gzn OaOpo j~k hh rvg whC _k lp oza i[ uS  BlO{]f  mc Sza BM` qO @f  Mf  Zgk  u_ OBdQd _m k] {ytd C[ jPZ nzy hl u B O_ \` iJ vYCX mQu s~ W q N }v i J B s m  @ w  Mw xZV mRk  qMU p\f LdZ R hH wC DH RJ _[ l` yp F_ S ` my Gz@A Q O[ ^ P kzzhHKVX d^ r[ ~ O M_\ K j{ Cy[ |P  I I U| XdM E| G AP F `doY}cMv \ E h D wk FN  T_b ` C m_a | B ICX A ff  uCB @ PC v_t URa^ oD ^}a [c i  w ~ Fk  Ua bq rdB&k PI _k l } z} Id Us ck  o | |s  K} X { d y s w B v Qy_/P m/OzzHuk V/i dk q7[yOM{f [H ei7f N&^G]Oi djqD{ k  Kf XscfsouHk CMhQHf  _QI lJ }yQJ vj C|QJ _l lu  yK KEWqPny ^j[ ki] xeN EnQf^ _}i lL ry{z  k \ xzF E#f Q#k _ihmyK{y IhV#x  d"\ qy^ ~y_J Y fXV;~T:y{JsO ^M}H|JHOF}f U}d c}{qdgk@R\kiS]Gdrdc@TV{ZAjO{kOd zOf H&ILV{k  bB o&R+|7@4g7~z[7W8U&@6M^ C7g_O&Bmn7@.[&]UI&J*^FyHSDAk  Ef RZ(`RBHB]JE6ggO]@cl k^VO@}e@Qb@As}@Ot@QC~3Tl LG@AS@QT+@Qe~Tvg;J~CE^ HGDTuNXMwf^ ]q1jM@[[]v[Y ZQAHkRBsQBu[ w` HD_dLp1p[]sakGTJx[M,S@-flBf{ea^ p w?|XS{ZcNO[qz4Lcj@@ jQ 7wJGnW ,u@3aCpTf Dd  Rf1_MJPH DZ ^n^ Z xLnD[ Ru$_{C yIR^ [ I ]h ~nE^ s K [^ Z@1fM/W]PF[&VdL|TvH^~eILx  UTubG2WTlI^ uGaBX Yc Ty | v5u ~xj bb _j q rr[ pZM lJg F q YO~ MM Qn[ ^ I mlU rnA k@o w]o ^ L STX Wal k_ M \fl zhR ^ z kGG \}N A[K ^ f L*r U \ U Oh hq w KJ C ]]O ENl )T z S F WQR ync g Q f^ ^m e{ Bt J  OGW  z'^ w5E riz  cIc '^ l tjx *^ b .^ o z | };I  ^LD  GWP y g H  t 5^ A 5rM O 4\ z P  u]] l z {I ;^ X  L%d OoI z[x ceS @[ x u$E B^ i [&u cg[ \ zB Ok| z4g B8[ rFS vXY H^ q gX~ M^ V GMc tKp N^ { R^ H aU @'v T @] U @] Q^ ] TT j i@~ Y^ ~ iDJ dU N W^Z dT h dR u dP B dN O dM \ dI i dH v dI C M ~P hIN vIW JX` i^ x L UE A7Z l^ Q ~ t^ o^ R @N^ z&l n^ R Y_ s^ ^ lg fj q^ P kC\ y^ _ ypl u^ z x EG  @yL %tE !s S  @s_ Bv R Aw ` @y n ?{ | W@J n=J <| G U+U 7} @ B?N ^ M WfY /~  . M uI [ &@ d #A r !B @ C  N D  Z E  f F  r 2~ G  p I  |  K  H cgT  O  { OkG t]r ^O P  ] @Oi Q  x ^ D j RQ R  c lN4Ro N4VA N4qW h  H N4rU DoG N4nv s Ud J2y Z "k j$M iq f  k  M vzZ CT Y mb N4nO N4o} N4kl ^UW Cl \ nz N4oh NW ON4u$V N4VK N4F:a N4Rg N4Fy b t N4^s N4XQ J2ijJ[ie N4n[s}N4Y a_N4FzvB@CB&N4@