*3`} 7 iWչ?Gzc:           ! 9 : < E Q R S 6[ 6\ 6] 6^ 6_ >f >g >h >i >j W{ Z ^ ` b b b b  i 5 > ? D E &&++++333None OtherSound TauntSoundAddPrecacheMaterialCoreXGameSystemEngine TauntStringKarma LightColorForce Lighting Movement Collision UnrealGame OrderSound OtherString AckSoundPostBeginPlay GoalScoreEnemyTeamName GameType LevelNameNumBotsDifficultyModifier FFireSoundAddPrecacheStaticMesh DeathPhrasesTeamSymbolName TeamName StaticMesh RosterNamesMessage DrawScale SpecialEventTimerOtherMesgGroup DrawType NameSoundProjectileSpawner GetGibClassSoundskeysSkins SpawnGibletbStaticPlayAnnouncement GetSoundCollisionHeight MatureTaunt xBombFlagUpdateForTeamVector PainSoundsSetShaderStatusSoundFootsteps DeathSounds MaterialCollisionRadiusUser RemoteRoleCreateRosterEntryHumanOnlyTaunt bNetNotify PlayerRecord Description DoubleDomPrecacheGameStaticMeshesMutatorRecordSetWeaponOverlayAlreadyExistsEntryColor numTauntsPrecacheGameTexturesNumDeathPhrases FriendlyNamebCollideActors GetStringbStasisTextureSetGRISetOverlayMaterialShieldTauntAnimNames OtherAbbrev GroupNamespine DoDamageFX OrderStringPosYCTFGame SpeciesName xDOMMonitor xDoubleDom CameraTrack BeginStateTickMeshNameStringBroadcastLocalizedMessage UseLowGore StackMode KillSound KillString DrawColorDisplayOtherMessage ScoreEvent bIsUnique StartEffect StopEffect InitializeNoneCreateRosterEntryCharacterGib UpdateStatusRotatorMesh LightHueMaleSoundGroupFemaleSoundGroupSetupLoadResourcesTriggerInValOutValDroplthighrthigh bFadeMessagePrecacheRosterForbHiddenPowerUp SpawnHeight FemaleVoice AnimParamsxKickerObjectiveNamePostNetBeginPlay xDomPointClientReceive HasUDamage IsPlayerPawnheadDefaultEnemyRosterClassRaceNumReceivedDamageScaling MaleVoiceGetRagSkelNameDoComboScreenShotName RotationRate Destroyed URLStringLightBrightnessDeathMessageClass LightRadiusAcronym ResetPoint DecoTextNameDisableUDamagelfarmAimedAttachmentError TeamAITypePlayerControllerSetInvisibilityAwardAdrenalineAttractCameraComboAnnouncementHUDType EndState SendHomeLightSaturation LightEffectComboNameList BallLauncher GameplayTagFillCameraList SetPawnClassrfarmFindFloatingCam LineOfSight MapListTypebFixedRotationDir ExecMessage LightType WalkingPctPostNetReceiveMovementAnimsFire DodgeSpeedZ TakeDamage SwimAnimsxPawnSoundGroupLanded xIntroPawn bProjTarget CrouchAnimsxWeaponAttachment AckString PrePivotbCollideWorld xBombingRun AirControl WalkAnims AirAnims NetDamage xDOMLetterAvertedSounds xMonitor TakeoffAnimsRemoveFlamingEffectsPhysicsDeRes GameEvent ModifyPlayerWallDodgeAnimsReceiveLocalizedMessage xDomRing LandAnims RandSpin GroundSpeed AccelRate GibGroup DodgeAnimsDoubleJumpAnimsxPawnPickupClasses GetHitSoundbUnlit bBlockActorsUpdatePrecacheMaterialsNone BombingRunAssignInitialPose AttachEffect FFireString StopFiringbAlwaysRelevantBlueTeamShaderRedTeamShader bNoDelete CheckScorer CalcHitLocCanDoubleJumpbDynamicLight WildcardBaseScoreFemaleSkeletonTouchDodgeSpeedFactor MaleSkeletonflag DecoText MenuName bBlockKarma FindFixedCamModifyImpartedDamagexUtilOverrideInitialBots StartBerserk GameNameAllBotsSpawnedRiffs ScoreEffectClientSetUDamageTimeSpawnProjectile'DamageScalingcrowdEndGame FlagType ScoreBomb SoundRadius CheckReflectInit CrouchedPctSetAnimActionJumpZSetCharacterName PositionInCurrentCombo StartFiringTeamDefenderTeamIndexDestroyableTriggerTeamScoreEventRequiredEquipmentSpiralEmitter OrderAbbrevExplodeClientPlaySound ResetCount ClearControlDDomPropsDisplayText AlwaysKeep ScoreSoundsRecommendComboDefenseScriptTagsControlSounds TakenSound SetTeamBasesNewRoundSound MultiSetupDefaultWeaponNameInactiveShader ActiveShader DamageTypeAnimEnd Idle_RifleBotClientSwitchToBestWeaponNetUpdateFrequency BeaconName MapPrefixGetDeathSound WeaponString LoadClasses WeaponNamePlayDyingSoundOpenNextLadderAtRung xWeaponBase Duration DoDoubleJumpStyle xTeamBannerPlayTeleportEffectDying TauntAbbrev xRosterEntry xMutatorListClientReStart BlueShader AddVelocity PreBeginPlayPossess MaxLightsLocalizedMessage RedShaderxFieldPlayerStartNone TransEffects xDOMMonitorBNoneUdamage xDOMMonitorADiedTransOutEffect bPainCausing DamagePerSec bDirectionalPulseIsLocallyControlledViewFog bDestructiveSetPlayerDefaults bNoInventoryLogoutTickFXControllerClass PlayerMoveNeutralShaderxBot xBombSpawn TryJumpScoreTryThrowScorexBombDelivery DoHitEffect HomeDisabled ProcessHitFX SetThrow HideBone TeamShader xRealCTFBase StartDeRes TickDeResNone Bip01 Spine1GetAnimSequence MutRegenPlayDoubleJump lshoulderVampireGameRules PickNextBotModifyReceivedDamageSetWeaponAttachmentPlayDirectionalDeathHitWall ModifyPawnPlayerReplicationInfoClassServerDoComboRedeemerWarheadlfootrfootWeapon bNotBasedPlayDirectionalHitPlayVictoryAnimation Death_Spasm SetHolderSetTeamColorsFindNewObjectivesAddRandomPlayer LogTaken rshoulderPointsAddShieldStrengthGetRandomPlayerWeapon_Switch PlayAlarm bip01 Spine bip01 Spine2 PlayerLightParseKillMessage ADR_KillSendHomeDisabledMatchInProgressResetPhysicsBasedAnim InterpCurve OtherTeam EyeHeightBaseEyeHeightbScoreTeamKillsUpdateCharacter TriggerEventAnnounceScore ReturnSoundsDroppedSoundsBelongsOnTeam TakenSounds WaterSpeed LocationName PlayDyingNone InitShadow PointName ControlEvent DomCombiner DomShaderBetterObjectiveThan SetDisableGetBloodEmitClass PlayFootStep FontSize SpawnEffects AddGameRulesbSpawnInTeamArea LifetimebannerbIsConsoleMessagebBounceCNeutralState GetColor GetFontSizeDesiredRotation CBlueState CRedStateCDisableState SRedState SBlueState ControlSoundSNeutralStateSDisableState BlueColorKickedClasses RedColor PulseSpeed TransmogrifyPrecacheContent GetPortrait AirSpeed Jump_MidNone CTFMatchesKConvulseSpacing GetHumanNamebHighDetailOnlyKVelDropBelowThreshold CrouchHeight CrouchRadiusDoReflectEffectKAngularDampingDoDerezEffectHealthKLinearDampingKImpactThreshold MessageClass DeathMessageCrouchRGetNumTeammatesForMatch SetTwistLookGet4WayDirection JumpF_MidGameLadderNameLODBiasAdjustedStrength SetOrdersGlobal Crouch_TurnR DoComboNameEnableUDamage ViewPlayer BaseOffsetGetShieldStrengthMaxGetShieldStrengthTouchDownDifficulty Idle_Rest GiveHealthGetTeamDodgeShadowDarknessbActorShadows GetHitInfoKill Crouch_TurnLPlayFootStepRightPlayFootStepLeftGetTipLocationClientSetWeapon WeaponLightcurcamMinAdrenalineCost SendMessage L33TPhraseTogglePlayerAttractRunLCombo IsInVolumeChangeCharacterGetHitEffectsFluidFrictionSuicideMessage KBuoyancyNoneExtinguishTimeBombLauncherClassName ThrowSpeed ElasticityThrowerTouchDelayJumpL_Takeoff SeekIntervalKExtraAngularDampingKExtraLinearDampingTeamHueThrowgesture_cheerWalkRContinueSinglePlayerGameAddDefaultInventorybPathCollidingDiscardInventoryMutatorIsAllowedTurnOn AssSmackMassDoTranslocateOuthomePlacedCharacterName JumpB_MidRagImpactVolumeRagImpactSoundIntervalRagImpactSoundsRagDeathUpKick RagSpinScaleRagShootStrength RagDeathVel IncomingRagInvInertiaRagdollLifeSpanDeResLateralFrictionDeResLiftSoftness DeResLiftVelPThrust DeResMat1 DeResMat0 DeResTimeTeamBeaconTextureLinkBeaconTexture FS_Ready FS_Looping FS_PlayOnceFS_None FireRootBone bIsSpecialFireRifleRapidAnimFireHeavyBurstAnimFireHeavyRapidAnimIdleRifleAnimIdleHeavyAnimGetConsoleColorMultiJumpBoost MaxMultiJumpMultiJumpRemainingCriticalPlayerTeleportFXClassSoundGroupClassCrouch BeginPlayMinTimeBetweenPainSoundsGibCountUpperArmGibCountTorso GibCountHeadGibCountForearm GibCountCalfNoneNoneFootstepVolume GruntVolumeNoneNoneGetMessageIndexShieldHitMatTime SpineBone2 SpineBone1ActivateSound HeadBone RootBoneWasPlayerPawn TauntAnims IdleRestAnimIdleWeaponAnim IdleSwimAnimIdleCrouchAnimCrouchTurnLeftAnimCrouchTurnRightAnimTakeoffStillAnim AirStillAnimGetWeaponBoneForServerChangedWeapon JumpOffPawnGasp ShieldAbsorbGetKillerControllerSwimR AttractMode ShieldHitMatNone EffectOffsetNonePlayMoverHitSoundPlayHitTurnRightAnim TurnLeftAnimbLightingVisibilitybDoTorsoTwistShieldStrengthMaxNoneInvisMaterialbPhysicsAnimUpdate UDamageSoundUDamageWeaponMaterialReduceCylinder LandThump RestartLevel righthandEST_DoubleJump EST_DodgeEST_BreatheAgain EST_Drown RateWeapon EST_GaspEST_LandGrunt EST_JumpEST_HitUnderWaterEST_CorpseLanded EST_Land PlayerTickActiveTeamShaderCheckReplacementInactiveTeamShader LifeSpanShadowDirection ImpactSoundbShouldBaseAtStartupTransientSoundVolumedroppedAdrenalineEmpty PostTouchbUseCylinderCollisionActivationEffectClassAdrenalineCostHiddenConversionRatioUpdatePrecacheStaticMeshes ChildMessageKilledByTrailerYouWereKilledBy YouKilledPlayBeepSoundEnemyControlsBothPointsString Biggun_AimedYouControlBothPointsStringSomeoneString KilledStringHeadShotSoundDecapitationString JumpR_Land ThrowWeaponKilled PlayTakeHitPlayWeaponSwitch TimeDisabled TimeToScore VoiceType SpawnRateMinPlayerWaiting IsSpectatingScoreCountDownSetFall ClientDyingClientSetLocationResetTimeDelayGetTeamInfoSalaryForGetTeamSalaryFor SpawnRateMaxTeamInfoTacticsRatingTeamTacticsRatingTeamInfoAgilityRatingSuicideTeamAgilityRating SwitchWeaponTeamInfoAggressivenessRatingTeamAggressivenessRatinginjuredTeamInfoAccuracyRatingTeamAccuracyRatingAggressivenessRatingTacticsRatingAgilityRatingAccuracyRatingRatingModifierGetFavoriteWeaponFor PawnClassPawnClassName GetSalaryForTeamNumGetMutatorListFindPlayerRecordGetPlayerRecordGetPlayerListAggressivenessStringAccuracyStringTacticsStringAgilityString NoPreferenceSpeciesTeamSay BaseChange StopBerserk AmbientGlowbWorldGeometryUnTouchRegenPerSecondProjectileLifeSpanNone ladderrungbAllowTranslocator AmmoStringSay AmmoName ProcessTouchPlayerWalkingRunR MaxZoomDist MinZoomDist ViewAngle FillPlayInfo Idle_BiggunDoJumpxVictimMessage KRestitution KFriction xTeamGameFindPlayerStart PlayWaiting xRedFlagBase xRedFlagxPlayerReplicationInfoxPlayerGiveToxNightMaleSoundGroupxNightFemaleSoundGroup NetPriority xMonitorC xMonitorB xMonitorAxMercMaleSoundGroupxMercFemaleSoundGroupxKillerMessagePlus PawnDiedxJuggMaleSoundGroupxJuggGibGroupxJuggFemaleSoundGroup PrevWeaponxFallingVolumexEgyptMaleSoundGroupxEgyptFemaleSoundGroup NextWeaponAltFire xDomPointB xDomPointA IsRelevantMaleRagSkelNameNoneChangedWeaponSwimB xDomMessagexDomB xDomAlertAIxDomAxDeathMessage bObsolete xCTFGame xCTFBasexBotSoundGroup ProcessMove WallDodgeFKParams xBombMessage Buoyancy WallDodgeBxBombHUDMessageRunB bHardAttachPhysicsVolumeChangexBombDeliveryHoleSwimF xBombBase DoubleJumpBxBlueFlagBaseJumpB_Takeoff xBlueFlag Rifle_BurstxAlienMaleSoundGroup PlayerTeam DoubleJumpR SalaryCapWalkFxAlienFemaleSoundGroupCrouchBFemaleRagSkelNameConsoleCommandKStartEnabledUT2003LadderInfoUT2003GameProfile UDamageTimerUDamageCharger TeamWarCry TeamVenomTeamSupernovaTeamSunBlades DMMatches TDMMatches DOMMatches BRMatchesChampionshipMatches Jump_Takeoff MessagesTeamRedConfiguredTeamPainMachineTeamNightstalkersONMYWAYDrownedNoneTeamIronGuardTeamFirestormTeamDragonBreathBotNearObjectiveNoneTeamCrusadersNoneTesting CanMakeJumpTeamColdSteelHitFHitBTeamBoneCrushersTeamBlueConfiguredHitRHitL ValidHolderDeathBGetDifficultyDeathF MatchOver AdjustSkillDeathLFindHumanSquad GOTYOURBACKInitBot BotDodge FootSteppingHeld LogReturned LogDroppedTranslauncherIsHomeDeathRTeamBloodFistsTeamBlackLegionTeamApocalypseDamTypeFlakChunkSuperShieldChargerFillPlayerTeam GetNamedBot CalcSetHome ClearHolderMaxMin GOTOURFLAGrhandRangeSuperHealthChargerSPECIES_Night SPECIES_Merc SPECIES_JuggSPECIES_HumanIncrementGoalsScored NEEDBACKUPThirdPersonEffects SetHeadScale ReplaceMenuPlayerCalcView OpenMenuKVelDropBelowKSkelConvulse SpawnGibsGetPlacedRosterCheckTauntValid GameObjBoneKImpact INPOSITIONDestructionMessageObjectiveStringSuffixNoneEnemyHasFlagStringYouHaveFlagStringENEMYBALLCARRIERHEREHasRedHasBlue DroppedRed DroppedBlue CaptureRed CaptureBlue ReturnedRed ReturnedBlue ReturnRed ReturnBlueSPECIES_Egypt SPECIES_Bot InitGameSPECIES_AlienENEMYFLAGCARRIERHERE NEEDOURFLAG bAllowTransFellOutOfWorld BombTakenBylhandbHomeSpeciesGameRules gesture_haltSpecialKillMessageSpawnerProjectileShieldCharger RobotVoicegesture_beckon xEmitterNightMaleVoiceNightFemaleVoiceMutZoomInstagib xPickUpBase MutVampireMutSpeciesStats GOTENEMYFLAGMANDOWNMutSlomoDeath LevelInfo MutQuadJumpMutNoAdrenalinegesture_point MutInstaGibNoneMultiKillMessageMercMaleVoiceMercFemaleVoice LavaVolumeJuggMaleVoiceJuggFemaleVoice Intro_Malcom Intro_Lauren Intro_GorgeIntro_Fan_Gorge bAdjustSkillIntro_Fan_BrockPawn Intro_CrowdNewTeamtip Intro_BrockHealthChargerDMRosterTrainingDayDMRosterOceanicDMRosterLeviathan DMRosterGaelCrouchL Swim_Tread ShockAmmonumAcksSuperShockRifleZoomSuperShockRifle FFireAbbrev numFFires ThroatCutCrouchFPickupRunFWalkB Biggun_Burst Bip01 HeadBip01DodgeR DoubleJumpF WallDodgeL Specific_1 OtherDelayedSwimLDMRosterConfiguredDefendBlueFlagDefendRedFlagDMRosterBeatTeam JumpL_MidDodgeLbPlayerShadows CrowdTrigger ComboSpeedbTeamControlled ComboMessage JumpL_LandJumpR_Takeoff JumpR_Mid ComboInvisComboDefensive ComboBerserkDodgeF xTeamRosterDodgeBbControllableChampRosterSemiFinal xDMRosterChampRosterFinal xDeathMatchBossDM banner_red uTeamBanner banner_blueTurnRFavoriteWeaponAlienMaleVoice xVoicePackAlienFemaleVoice CachePlayersNoneTurnL JumpF_LandWalkL DoubleJumpL SpeciesType WallDodgeRAdrenalinePickup GibSound JumpB_LandRedDomination BloodJetJumpF_TakeoffGibGroupClass XEffectsFireRifleBurstAnim Rifle_Aimed AnimFlagLudicrousKill_FMonsterKill_F BallResetBerzerkBooster UDamageFireComboActivated DDAvertedDDAlarm CTFAlarmUT2K3Fanfare07UT2K3Fanfare03UT2K3Fanfare08 XGame_rc HolyShit_F MegaKill XGameShadersXGameTextures BRShadersBRBallDominationPointTex BombIconBS SuperPickupsWildcardChargerTex DOMBlueSDOMabBsBombgatePulseBC BombGate BlueScreenBS RedScreenSBombDeliveryTexBombSpawnMesh BallMeshBombEffectMesh SC_Volcano_TBanners FlagMesh FlagBaseMeshDominationPointMesh DomAMesh DomBMeshDomRingTeamBannerMeshWildcardChargerMeshHealthChargerMeshShieldChargerMeshAmmoChargerMesh FlagBaseTexB NewRoundInBombgatePulseRC RedScreenA DOMpointRED DOMpointGREY DOMpointBLUEDOMRedS DOMGreySDOMpointLINESbDOMpointLINESgDOMpointLINESr DOMPointABb DOMPointABg DOMPointABrDOMabRsDOMabGs BlackScreenS GreyScreenS BlueScreenS RedScreenBS RedScreenASBlackScreenBSBlackScreenAS GreyScreenBS GreyScreenAS BlueScreenAS UCGeneric SolidColoursShadersNoneNonePlayerShieldSh PlayerShieldMinigun_burstNoneTransPlayerCellNoneLEnergyPlayerShaders PulseBShaderDomPointBCombinerDomPointACombiner greygrid PulseAShaderredgrid bluegridRedBannerShaderBlueBannerShader DomBCombiner DomACombiner DomShadersWeaponShaders BombIconBLUE BombIconREDBombIconYELLOW BombIconRS BombIconYSTransPlayerCellRed LinkGunShellRedFlagShader_FBlueFlagShader_FNoneNoneSC_BannerBlue_FSC_BannerRed_FRed_Team_on_OffenceNone Double_KillBloodHitClassBloodGibClassBloodEmitClassLowGoreBloodHitClassLowGoreBloodGibClassLowGoreBloodEmitClass MultiKillNone BotSparksComboActivation DeResPartExplosionCrap WallSparksNone LavaDeathOffensiveEffectNone RegenCrossesNone SpeedTrailNoneNone TransEffectNoneNonexPawnGibGroup UltraKill HeadshotBlue_Pass_FumbledFlaresNoneEpicParticlesShockXGameShadersBNone shock_ring_b EmitSmoke_t SmokeTex TransTrailT RedMarker_t BlueMarker_t pcl_Spark WeaponSoundsMiscRexptGeneralAmbienceSmokeAlphab_tNoneComboshlhn XEffectMatrocketblastmark EGibTypegibTypeWeaponStaticMesh PlayerSoundsgoop Shield3rdFBShieldRip3rdFBNoneNone goop_green_a SlimeSkinInvisOverlayFB RedShell BlueShell BExplosion3BaseImpactAndExplosions BExplosion5ball_bounce_v3a ArmorHitNoneBreathAgainBotBreathAgainMercFemaleBreathAgainMercMaleBreathAgainNightFemaleBreathAgainNightMaleBreathAgainJuggFemaleBreathAgainJuggMaleBreathAgainEgyptMaleBreathAgainAlienFemaleBreathAgainAlienMaleGaspBotGaspMercFemale GaspMercMaleGaspNightFemaleGaspNightMaleGaspJuggFemale GaspJuggMaleGaspEgyptMaleGaspAlienFemaleGaspAlienMale DrownBotDrownMercFemaleDrownMercMaleDrownNightFemaleDrownNightMaleDrownJuggFemaleDrownJuggMaleDrownEgyptMaleDrownAlienFemaleDrownAlienMale LandGruntBotLandGruntMercFemaleLandGruntMercMaleLandGruntNightFemaleLandGruntNightMaleLandGruntJuggFemaleLandGruntJuggMaleLandGruntEgyptMaleLandGruntAlienFemaleLandGruntAlienMaleHitUnderWaterBotHitUnderWaterMercFemaleHitUnderWaterMercMaleHitUnderWaterNightFemaleHitUnderWaterNightMaleHitUnderWaterJuggFemaleHitUnderWaterJuggMaleHitUnderWaterEgyptMaleHitUnderWaterAlienFemaleHitUnderWaterAlienMale CorpseLandedFootstepGlassFootstepWater FootstepSnow FootstepIceFootstepFleshFootstepPlant FootstepWoodFootstepMetal FootstepDirt FootstepRockLandFootstepDefault BFootstepsFootstepWater2FootstepWater1 AlienJump1 AlienJump2 FemaleDodge FemaleJump1 FemaleJump3 MaleDodge MaleJump1 MaleJump2 AlienDodge JumpSounds texture19 WeaponSkinsNone ShieldTex0NoneNone GrenadeTex GrenadeMeshNoneNoneBallLauncherTex0NoneBallLauncherEnergyBallLauncherLine HealthPack ShieldPackSuperShieldPack UDamagePack XPickups ShieldAmountblue_team_dominatingTournamentPickUpSuperHealthPack E_Pickups BombBall FullBombBlue_Team_on_OffenceLast_Second_SaveNarrowly_AvertedRed_Pass_Fumbledred_team_dominatingNewGRIAssistsNone HolderPRIHolderTacticsStrafingAbility AccuracyNone tauntNum LastKillTimeMultiKillLevelControllingPawnControllingTeammyFlagRequesterTeamNumDesiredTeamNum MyBaseVolumebHasShootSpots bForceCheck JumpHeight CurrentDirbKeepTaunting PhraseNum Fanfares GameSounds numtouchppptheFlag ScoreSound ScoringTeambWinnerAdjustedDifficultybForceDefaultCharacter bNoCoronasBlue_Team_ScoresRed_Team_ScoresNone PassTargetNone EnemyBaseBomb SquadLeader bNoRecursion TeamBotsRoster DOMTeamAIDominationPoint DMRoster CTFMessageCTFHUDMessage GameObjectCTFFlagTeamAIBombingRunTeamAISquadAIBombingRunSquadAI ShootSpotTeamPlayerReplicationInfoNoneSquadADR_MinorBonusBaseAggressiveness ADR_GoalNoneAggressivenessNoneNone CombatStyleCTFBase UnrealPlayer TimerMessage UnrealPawn TeamGameUnrealTeamInfo JumpSpot DeathMatch RosterEntryGameObjectiveTeamVoicePackCriticalEventPlus ScaledSprite TriggerLightbKImportantRagdollKShotStrength KShotEnd KShotStartbKDoConvulsions KSkeleton KStartAngVel KStartLinVelv1botnameretval bReplacePlayerPositionsOwnerbTrailerSameRotation bTearOffLastRenderTime Instigator Touching AttachedRepSkin SurfaceType PendingTouch bAnimLoop AnimRateSimAnim bNetInitial bNetOwnerEDoubleClickDir eKillZTypeNone NewScaleDeltaRateAnimNewMesh BoneNameoffsetposOther impactVel impactNorm DeltaTimeEventInstigator HitNormal NewVolume KillTypeDamage HitLocation Momentum TraceEnd TraceStartStartDirNumHitLocEnd RelatedPRI_1 RelatedPRI_2OptionalObjectdistGRIframebOutbSoundmat bOverridePTimeOutGUIControllerDelay Material2 Material1 instigatedBy bGameEnded bOverTimeSelfIlluminationSpecularityMaskDiffuse BlobTexturexpGameRulesModifiers Specular DefaultNameCurrentGameProfile MeshName BodySkinName FaceSkinName Portrait TextNameVoiceClassNameSex RecordIndexCachedPlayerListNonemyLevelMPRIIndex mutClass LocalPlayerPlayerRecords StartSpotinClass charName InCharacterMutatorRecordsPCPRESalaryExiting newWeaponHashInvKiller KilledPawn KillerName VictimNameGP lineupsizePR numchars ViewTargetUTOriginalDamageCurrentSkeletalMeshActorScorer ComboName NextMutatorConfigMenuClassNamebSuperRelevantRecords CharacterslimitNoneNoneNoneRecbForceNoPlayerLights bNoTeamSkinsResetCountDown TeamIndexTeamSpawnCount HomeBase OldScoreTeams TeamSymbolsThrowingScore maxpointsmaxper xDomPointsFlagPosDisabledCountDown FlagStateHasFlagCharacterName bIsFemale bIsSpectatorBest TeamMate bDoubleJumpDoubleClickMove Aversion TeamBeaconT LinkBeaconT NewAccelVel TimeSeconds bDropDetailbLowSoundDetailNetModebNoConsoleDeathMessages myPickUpGameNavigationPointListYouKilledTrailerControllerListtmp TauntPackfj_affirmativeFJ_and_stay_downFJ_anyoneelsewantsomefj_area_secureFJ_attackalphaFJ_attackbravofj_attack_their_basefj_ball_carrier_is_herefj_base_is_undefended FJ_blowmeFJ_blueleaderFJ_boom FJ_burnbabyfj_cant_feel_my_legs fj_cover_meFJ_defend_point_alphaFJ_defend_point_bravofj_defend_the_basefj_defend_the_flag FJ_diebitch FJ_eatthatfj_enemy_flag_carrier_is_hereFJ_fightlikenaliFJ_gettheballfj_get_our_flag_back fj_got_itFJ_holdthispositionFJ_igottheflagfj_im_all_alone_herefj_im_going_in fj_im_hitfj_im_on_defense fj_im_on_itfj_im_on_offensefj_im_on_your_teamfj_im_on_your_team_idiot fj_incomingfj_in_positionFJ_isthatyourbestfj_ive_got_your_backfj_i_need_backup FJ_kissmyassfj_life_is_pain_get_over_it FJ_loser fj_man_down FJ_medic FJ_myhouse fj_negativeFJ_nextFJ_nice fj_nice_shot FJ_ohyeah FJ_ownagefj_point_alpha_securefj_point_bravo_secure FJ_redleaderfj_right_between_the_eyes fj_roger fj_same_teamFJ_searchanddestroy FJ_seeyafj_tag_em_and_bag_emfj_take_point_alphafj_take_point_bravoFJ_take_their_flagFJ_that_had_to_hurtfj_that_was_nastyfj_the_base_is_under_attackfj_under_heavy_attack FJ_uselessfj_were_being_overrun FJ_youbedeadFJ_youlikethat FJ_youwhore#fj_you_bleed_better_than_you_shootFJ_you_play_like_a_girl fj_you_suckfm_affirmativeFM_and_stay_downFM_anyoneelsewantsomefm_area_secureFM_attackalphaFM_attackbravofm_attack_their_basefm_ball_carrier_is_herefm_base_is_undefendedFM_blueleaderFM_boom FM_burnbaby fm_cover_mefm_defend_point_alphafm_defend_point_bravofm_defend_the_basefm_defend_the_flag FM_diebitchfm_duck_faster_next_time FM_eatthatfm_enemy_flag_carrier_is_hereFM_fightlikenaliFM_gettheballfm_get_our_flag_back fm_got_itFM_holdthispositionfm_hold_still_dammit fm_holy_shitFM_igottheflagfm_im_all_alone_herefm_im_going_in fm_im_hitfm_im_on_defense fm_im_on_itfm_im_on_offensefm_im_on_your_teamfm_im_on_your_team_idiot fm_incomingfm_in_positionFM_isthatyourbestfm_ive_got_your_backfm_i_need_backup)fm_just_hold_still_and_ill_make_it_quickfm_kill_em_all FM_kissmyass FM_loser fm_man_down FM_medic FM_myhousefm_nailed_him fm_negativeFM_nextFM_nice fm_not_badfm_not_even_close FM_ohyeah FM_ownagefm_point_alpha_securefm_point_bravo_secure FM_redleader fm_roger fm_same_teamFM_searchanddestroy FM_seeyafm_step_asidefm_suck_on_thisfm_take_point_alphafm_take_point_bravoFM_take_their_flagFM_that_had_to_hurtfm_the_base_is_under_attackfm_try_turning_the_safety_offfm_under_heavy_attack FM_uselessfm_were_being_overrun FM_youbedeadFM_youlikethat FM_youwhoreFM_you_play_like_a_girlfn_affirmativeFN_and_stay_downFN_anyoneelsewantsomefn_area_secureFN_attackalphaFN_attackbravofn_attack_their_basefn_ball_carrier_is_herefn_base_is_undefended FN_blowmeFN_blueleaderFN_boom FN_burnbaby FN_camper fn_cover_mefn_defend_point_alphafn_defend_point_bravofn_defend_the_basefn_defend_the_flag FN_diebitch FN_douchebag FN_eatthatfn_enemy_flag_carrier_is_hereFN_fightlikenalifn_fresh_meatFN_gettheballfn_get_our_flag_back fn_got_itFN_holdthispositionFN_igottheflagfn_ill_swallow_your_soulfn_im_all_alone_herefn_im_going_in fn_im_hitfn_im_on_defense fn_im_on_itfn_im_on_offensefn_im_on_your_teamfn_im_on_your_team_idiot fn_incomingfn_in_positionFN_isthatyourbestfn_ive_got_your_backfn_i_must_break_youfn_i_need_backup FN_kissmyass FN_loserfn_lost_is_your_soul fn_man_down FN_medicfn_meet_your_executioner FN_myhousefn_my_name_is_death fn_negativeFN_nextFN_nice1fn_no_tears_please_its_a_waste_of_good_suffering FN_ohyeah FN_ownagefn_pain_will_purify_youfn_point_alpha_securefn_point_bravo_secure FN_redleader fn_roger fn_same_teamFN_searchanddestroy FN_seeya FN_spammer FN_suckerfn_take_point_alphafn_take_point_bravoFN_take_their_flagFN_talktothehandFN_that_had_to_hurtfn_the_base_is_under_attackfn_under_heavy_attack FN_uselessfn_were_being_overrun FN_youbedead FN_youdickFN_youlikethat FN_youwhoreFN_you_play_like_a_girlmj_affirmativeMJ_and_stay_downMJ_anyoneelsewantsomemj_area_secureMJ_attackalphaMJ_attackbravomj_attack_their_basemj_ball_carrier_is_heremj_base_is_undefendedMJ_blueleaderMJ_boom MJ_burnbabymj_cant_feel_my_legs mj_cover_memj_defend_point_alphamj_defend_point_bravomj_defend_the_basemj_defend_the_flag MJ_diebitch MJ_eatthatmj_enemy_flag_carrier_is_hereMJ_fightlikenaliMJ_gettheballmj_get_our_flag_back mj_got_itMJ_holdthispositionMJ_Igottheflagmj_im_all_alone_heremj_im_going_in mj_im_hitmj_im_on_defense mj_im_on_itmj_im_on_offensemj_im_on_your_teammj_im_on_your_team_idiot mj_incomingmj_in_positionMJ_isthatyourbestmj_ive_got_your_backmj_i_need_backup MJ_kissmyassmj_life_is_pain_get_over_it MJ_Loser mj_man_down MJ_medic MJ_myhouse mj_negativeMJ_nextMJ_nice mj_nice_shot MJ_ohyeah MJ_ownagemj_point_alpha_securemj_point_bravo_secure MJ_redleadermj_right_between_the_eyes mj_roger mj_same_teamMJ_searchanddestroy MJ_seeyamj_tag_em_and_bag_emmj_take_point_alphamj_take_point_bravoMJ_take_their_flagMJ_that_had_to_hurtmj_that_was_nastymj_the_base_is_under_attackmj_under_heavy_attack MJ_uselessmj_were_being_overrun MJ_youbedeadMJ_youlikethat MJ_youwhore#mj_you_bleed_better_than_you_shootMJ_you_play_like_a_girl mj_you_suckmm_affirmativemm_and_stay_downMM_anyoneelsewantsomemm_area_secureMM_attackalphaMM_attackbravomm_attack_their_basemm_ball_carrier_is_heremm_base_is_undefendedMM_blueleaderMM_boom MM_burnbaby mm_cover_memm_defend_point_alphamm_defend_point_bravomm_defend_the_basemm_defend_the_flag MM_diebitchmm_duck_faster_next_time MM_eatthatmm_enemy_flag_carrier_is_hereMM_fightlikenaliMM_gettheballmm_get_our_flag_back mm_got_itMM_holdthispositionmm_hold_still_dammit mm_holy_shitMM_igottheflagmm_im_all_alone_heremm_im_going_in mm_im_hitmm_im_on_defense mm_im_on_itmm_im_on_offensemm_im_on_your_teammm_im_on_your_team_idiot mm_incomingmm_in_positionMM_isthatyourbestmm_ive_got_your_backmm_i_need_backup)mm_just_hold_still_and_ill_make_it_quickmm_kill_em_all MM_kissmyass MM_loser mm_man_down MM_medic MM_myhousemm_nailed_him mm_negativeMM_nextMM_nice mm_not_badmm_not_even_close MM_ohyeah MM_ownagemm_point_alpha_securemm_point_bravo_secure MM_redleader mm_roger mm_same_teamMM_searchanddestroy MM_seeyamm_step_asidemm_suck_on_thismm_take_point_alphamm_take_point_bravoMM_take_their_flagMM_that_had_to_hurtmm_the_base_is_under_attackmm_try_turning_the_safety_offmm_under_heavy_attack MM_uselessmm_were_being_overrun MM_youbedeadMM_youlikethat MM_youwhoremm_you_die_too_easilyMM_you_play_like_a_girlmn_affirmativeMN_and_stay_downMN_anyoneelsewantsomemn_area_secureMN_attackalphaMN_attackbravomn_attack_their_basemn_ball_carrier_is_heremn_base_is_undefended MN_blowmeMN_blueleaderMN_boom MN_burnbaby MN_camper mn_cover_memn_defend_point_alphamn_defend_point_bravomn_defend_the_basemn_defend_the_flag MN_diebitch MN_douchebag MN_eatthatmn_enemy_flag_carrier_is_hereMN_fightlikenalimn_fresh_meatMN_gettheballmn_get_our_flag_back mn_got_itMN_holdthispositionMN_igottheflagmn_ill_swallow_your_soulmn_im_all_alone_heremn_im_going_in mn_im_hitmn_im_on_defense mn_im_on_itmn_im_on_offensemn_im_on_your_teammn_im_on_your_team_idiot mn_incomingmn_in_positionMN_isthatyourbestmn_ive_got_your_backmn_i_must_break_youmn_i_need_backup MN_kissmyass MN_losermn_lost_is_your_soul mn_man_down MN_medicmn_meet_your_executioner MN_myhousemn_my_name_is_death mn_negativeMN_nextMN_nice1mn_no_tears_please_its_a_waste_of_good_suffering MN_ohyeah MN_ownagemn_pain_will_purify_youmn_point_alpha_securemn_point_bravo_secure MN_redleader mn_roger mn_same_teamMN_searchanddestroy MN_seeya MN_spammer MN_suckermn_take_point_alphamn_take_point_bravoMN_take_their_flagMN_talktothehandMN_that_had_to_hurtmn_the_base_is_under_attackmn_under_heavy_attack MN_uselessmn_were_being_overrun MN_youbedead MN_youdickMN_youlikethat MN_youwhoreMN_you_play_like_a_girlr_affirmativeR_and_stay_downR_anyoneelsewantsomer_area_secureR_attackalphaR_attackbravor_attack_their_baser_ball_carrier_is_herer_base_is_undefended R_blueleaderR_boom R_burnbaby r_cover_mer_defend_point_alphar_defend_point_bravor_defend_the_baser_defend_the_flag R_diebitch r_die_human R_eatthatr_enemy_flag_carrier_is_herer_faster_stronger_better r_fear_meR_fightlikenalir_flesh_is_a_design_flaw R_gettheballr_get_our_flag_back r_got_itR_holdthispositionR_igottheflagr_im_all_alone_herer_im_going_in r_im_hitr_im_on_defense r_im_on_itr_im_on_offenser_im_on_your_teamr_im_on_your_team_idiot r_incomingr_in_positionR_isthatyourbestr_ive_got_your_backr_i_need_backup R_kissmyassR_loser r_man_downR_medic R_myhouser_my_victory_your_death r_negativeR_nextR_nicer_not_unacceptable R_ohyeah R_ownager_point_alpha_securer_point_bravo_secure R_redleaderr_rerouting_critical_systemsr_rogerr_rogue_process_terminated r_same_teamR_searchanddestroyR_seeyar_take_point_alphar_take_point_bravoR_take_their_flagR_that_had_to_hurtr_the_base_is_under_attackr_under_heavy_attack R_uselessr_were_being_overrunr_witness_my_perfection R_youbedeadR_youlikethatr_your_programming_is_inferior R_youwhorer_you_adapt_wellr_you_die_too_easilyr_you_make_easy_preyR_you_play_like_a_girlmyHUD SoundNum numSounds RelatedPRI1 RelatedPRI2NextGameRules PhraseNameNewVel spinRateEffect LeftTrail RightTrail PawnShadow SpawnSound ShadowActorLightDirectionAvailableMeshesnextSeq nextRate nextTween nextOffsetLightDistanceAnimSeq AnimTweenAnimOffsetClamp RootMotion bBlobShadow ESoundTypeShadowTexture bIsWalkingbWantsToCrouch bIsCrouched bThumped FlashCountPendingWeapon RefNormal HeadVolume BreathTimeLastPainSound AnimActionTakeHitLocation soundType NewDeath FemaleJugg fj_death01 fj_death02 fj_death03 fj_death07 fj_death08 fj_hit02 fj_hit03 fj_hit04 fj_hit07 fj_hit09 fj_hit11 FemaleMerc fm_death01 fm_death03 fm_death04 fm_death05 fm_death06 fm_hit02 fm_hit03 fm_hit05 fm_hit06 fm_hit07 fm_hit10FemaleNightmare fn_death01 fn_death02 fn_death03 fn_death04 fn_death05 fn_hit01 fn_hit02 fn_hit03 fn_hit05 fn_hit07 fn_hit09 MaleJugg mj_hit15 mj_death01 mj_death05 mj_death07 mj_death08 mj_death11 mj_hit01 mj_hit02 mj_hit06 mj_hit07 mj_hit11 mj_hit13 MaleMerc mm_hit09 mm_death04 mm_death05 mm_death09 mm_death10 mm_death11 mm_hit01 mm_hit03 mm_hit04 mm_hit06 mm_hit07MaleNightmare mn_hit10 mn_death01 mn_death02 mn_death03 mn_death04 mn_death07 mn_hit02 mn_hit03 mn_hit04 mn_hit05 mn_hit06Robots r_thit05 r_death01 r_death03 r_death07 r_death08 r_thit01 r_thit02 r_thit03GeneralImpactsWet Breakbone_01 Breakbone_02 Breakbone_03NoneDeRezDeRezFinalHeadDeRezFinalBodyRepeaterDeathCount CurrentCombo bBerserkbInvis bOldInvisbGibbedHitDamageTypeTearOffMomentum UDamageTimeLastUDamageSoundTime bPlayedDeathbIsIdleNone bWaitForAnim IdleTimeNoneNoneShieldStrengthNoneNoneBoneNonedamtypebSeverrotDirSimHitFxTickerNoneNoneNoneNoneHitFx HitFxTickerFCameraLocationCameraRotationThirdPersonActorpick PickupClassHeadShotMessage WeaponClassComboClassNameAmountSkill PlayerShadow OldWeapon HitActorMenutries bUpdating HitRotationChunkPerterbation FiringMode NewActionEnabled bActivatedEFireAnimStateOldTeam S_Emitter Emitters DeltaRot FireState SkeletonMesh bSkeletizedbDeRes CameraSwivelDeResFXCameraDeltaRotationaStrafe aForwardbNoMatureLanguagenextNavigationPointDeResGravScalebFrozen bBehindViewpClass NeededJumpCalculatedGravityZaPawnnewRotRagConvulseMaterial BestDist mHitLocation AdrenalineRagLastSoundTimeNoneNoneNoneTargetOldController RealSkins VoiceClassEnemynextController PrevLocation Priority HitEffectsNone KDeathUpKickNoneNone KDeathVel EmitterClass bWaterVolume GibClassGibletDummyDamageOverlayTime boneCoordsDamageOverlayMaterialBoneScaleSlotbKUseOwnDeathVelhitRaybCauseConvulsionsDismemberProbability bExtraGib bSpecial skelParamsbAlwaysSeversbFastInstantHitNoneNone bSkeletizeHitBone HitBoneDistNone bShowEffects bCausesBloodGravitybHeavybRapid bIsPlayerNewAttshotDir hitLocRel deathAngVel shotStrengthmaxDim RagSkelNameseqPlayersRagdollLDbAdrenalineEnabled CameraDist FloorMat DesiredFOVSetViewTarget ComboClassBaseSpectating InvisibleNewUDam ViewActor override Acceleration VelocityZAttachmentBone bLoadNow HeadScale HealthMax SelfToHitSelfToInstigatorCrossPlaneNormalYawDir PushLinVel PushAngVelMaxCorpseYawRate NewLifeSpan VisibilitySeqName OffsetClampAnims MaxDelay KickVelocity GreenColorbKillVelocity bRandomize bWasFallingPushPMagbShadowActiveSpeed MaxSpeedMaxTraceDistance FireAnim bCanTeleportbRotateToDesiredNonemRegen DetailModeNoneRagdollTimeScalePhysicsDetailLevelAnimRep DomLetter NoPulseAlphaIconMaterialName NewControlBaseDifficultymat1mat2mat3 LocalMessage OldIndexfell SavePackagexbaseMyHoleExplosionCounter ExplodeNowLastExplodeNow FellLava GameRules touchdown MatchInfoPositionNumber bRapidFirebAltRapidFire mHitNormal mHitActor LitWeaponGameDifficulty bWeaponStay PlayerName MenuSoundsselectJcamlistnumcams Suicidedattracttargetattracttarget2camtime targettime gibwatchtime autozoom focuspointMinComboKeyTimeMaxComboKeyTime InputHistory LastKeyTimeOldKey SetDrawScaleSetStaticMesh ComboListPawnSetupRecord SetDrawType CurrentKeyDiffKey bFullBufferbMatch VoicePack deltayawdestyaw switchedbotsNewLocnewcamNoneSetRelativeRotationcamSetRelativeLocationbestc DamageRadiusv2 HurtRadiusconPlayOwnedSoundKIsRagdollAvailablelead viewwidthKMakeRagdollAvailable newCharacterKAddBoneLifterSpawner KSetSkelVelKSetActorGravScalePrevWeaponClassKSetBlockKarma KAddImpulse UpdateURL ThrowerTime InitialDirGetClosestBone SeekAccumGetAnimParams SetBoneScaleBombLauncherClass AttachToBoneGetBoneCoordsAnimBlendToAlphaNoneNoneDamageTypeNameAnimBlendParamsXGame_StaticMeshes GameObjects MonitorA MonitorB MonitorC DOMMonitor BombGateCol BoneRefreshbKill LinkMesh SetAnimFrameStopAnimating TweenTime GetMeshName bShadowCastbReplicateMovement FovAnglebActive GibModifierbAcceptsProjectorsDPoint PlayerLineup bSequential NumClasses WeaponType AimedOffset DownwardBiasProjectileSpeed SpectatingTrailExplosionEmitterProjectileMeshProjectileMeshScaleExplosionSound HitFXDataRandomStartDelayGravityAffectedproj MutatorList bLoadClassesGibPerterbation PlrProfilebLocationalHitprIdxxreShadowProjector LadderInfoSizeIconAddNMsg ItemName direction CurrentClassNoneSpiralWallBase SkelName NewBodySkin NewFaceSkinSide PackageName ScriptTextARowsBCDXjiYtZSWOriginGRAlpha Location Rotation Velocity ReturnValue RandRangeExpTimeDynamicLoadObjectCoordsNone KarmaParamsKarmaParamsSkel AmbientSound GameInfo Decoration Projectile PlayerStartHUDPlayerReplicationInfoGameReplicationInfo InventoryNone AIController ControllerPhysicsVolume TeamInfoWeaponAttachmentNavigationPoint JumpDest TriggersMutator GameProfile ProjectorsChannelBaseGUIControllerLevelShader CombinerConstantColor TexScaler FinalBlend ModifierEmitter PlayInfoPlayer ProjectorShadowBitmapMaterial SkeletalMeshInfoParticleEmitter TrailEmitter VertMesh KeypointActorCount ClassNameYawRollPitchOptions SoundGroupSoundBlueRedBlackWhiteRoleEventFinalClassPackageConstSwitch TextBufferObjectEnum FunctionStateStructName StrPropertyStructPropertyArrayPropertyClassProperty NamePropertyObjectPropertyNoneNoneFloatProperty BoolProperty IntProperty BytePropertyDM0DM1DM2DM3DM4DM5TDM1TDM2TDM3TDM4TDM5TDM6DOM1DOM2DOM3DOM4DOM5CTF1CTF2CTF3CTF4CTF5CTF6BR1BR2BR3BR4BR5CHAMP1CHAMP2NonebOnlySpectator ReactionTime bThrownBombScoreControllerNoneFluidSurfaceInfoRagdollRagdollOverrideNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneClientReceiveRule ProcessRuleGetServerDetailsServerRequestRules RezTest4 ResponseNoneValue KeyValuePair Skeleton ServerInfo__ProcessRule__DelegateDelegatePropertyNewRule DeRezSkinUnrealMPGameInfoNoneServerResponseLineNone FlakTrailTexLastRulesRequestTime customskelKeyNoneNone PawnKParamsNoneServerRequestPlayerInfo AdminMenuNoneGetPlayerNetworkAddressxPC CommandLineNoneGetPlayerIDHashNonePlayerRecordClassFillPlayerRecord ClearEnemiesFindUPLPlayerRecordIsHumanControlledClientReceiveComboAllPlayerListPRClass PlayerList NewComboNoneNoneNoneNoneFindSpecGoalForServerSpecViewGoalClientSetViewTarget SpecViewGoalDomNewGoalFlagsNoneNoneNoneNoneNone IsInPain ZoneInfoKillZZoneRegion PointRegionNoneNoneNoneNoneNoneAvailableRecordGetInventoryGroup xMutantGameGetHumanReadableNameShieldCharger0 GetGameClassInventoryGroup bIsTeamGame DMMutator bBrightSkins ServerState MenuString bTeamGamebShouldPreload GameClassTitleNoneServerSetClassicTrans PreventSever bNeverSeversbClassicTransNone CanMultiJumpNoneNoneNoneNonebCanWallDodgebCanDodgeDoubleJumpbCanDoubleJumpNone NumSkinsNoneNoneNoneNoneNoneNoneNone PriceMoney AltLevelsTeamDescription TeamLevel VoiceOverNoneTeamNameSoundNoneVoicePackName VoiceGenderNone enableLaddercompletedLadderNoneGetBotPositionGetTeamPositionGetUT2K4MatchInfo EntryFeeGetMaxTeamSizeNoneLengthOfLadderbDelayedSpawn LandMineGetLadderDescriptionNoneRostersServerRequestBanInfoNone GetMatchInfoGesture_Taunt02 GetBotPrice GetTeamNumGetMatchDescriptionNoneIdle_Character02PlayDyingAnimation Difficulty GetPRIArrayClientReceiveMapName PayTeamMatesGetPublicChannelCountGetCurrentMatchInfoMakeURLFoMatchInfoNoneGetDescriptionTextDMTeamNoneNeedNetNotify CanUseShieldInitializeVoiceChatNoneNoneProcessMapNameGetRandomLadderRandomIncreaseBotFeeprocPhantomMatchesGetRoleStringprocLastMatchDetailsUpdateAnnouncementsGetEnemyTeamNameInjureTeamMateAddPlayerFromListNone OrderToIndexNoneNoneRankTeamMatesDDomPropDescTextNone MakeURLForReceiveBanInfoUT2K4LadderInfoGesture_Taunt03 PerformDodgeGesture_Taunt01Idle_Character01Idle_Character03NoneUpdateLaddersFemRobotVoiceBotStatsRecordPhantomBloodReavers LoadDecoText RegisterGameTeamStatsRecordLadderProgressDeactivateSpawnProtectionBalance TeamHellionsPreInitializeTeamPercentage MatchBonus LoserFee FeeIncrease InjuryChance LastInjuredChallengeChanceNonePlayerMatchDetailsRecordNonePhantomNecrisBlackLegionNoneTeamNewSuperNova idle_chatUT2K4TeamRosterEasy FreeObjectbCanBeDamagedBoostDisplayTextTeamThundercrash AddToTeamAddBotPhantomDarkPhalanxAllocateObjectPayCheckRecord StartDrivingUT2K4TeamRosterStrong GetOrdersPhantomMatchRecord BodyEffect TeamGoliathPhantomRawSteelReleaseTeammateNoneGetPlayerControllerListSecondRepSkinTeamMateRankingRecordBallCarrierMessageTeamJuggernautsNone ChangeNameUT2K4RosterGroup MaleSuicide StopDrivingNoneCanBePickedUpByStartNewMatch TeamCorruptUT2K4TeamRosterMid IsTeammate TeamLeaderUT2K4MatchInfoopenChampionshipLadderbBallDrainsTransloc ReportCheatDefendNone SpawnTrail GetStatusUT2K4TeamRosterTeamNewBloodfistUT2K4DMRosterNoneGetOffhandBoneForUT2K4TeamRosterWeak BlowupSoundNoneNone AddTeammateTeamNewIronGuardTranslocDisplayTextDisableVoiceChat MaxTeamSizeTeamNewFirestorm BRDescTextNone bip01 l handUT2K4PhantomRosterFemaleSuicide ASMatchesCanBeThrownByLID_TDMLID_CTFLID_BRLID_DOMLID_AS LID_CHAMPChuckVelocitySpeciesSkaarjbWaitingForPRIBotList SectionName BRPropText2bOverrideTranslocator BRDescText2None GiveAmmoServerRequestMapList IdleChatAnimUT2K4GameProfilebWaitingForVRIResetClientMessageNone PhantomEpic BlowupEffectTeamNewBlacklegion BRPropText DeathStringFileExtensionTeamIronSkullNoneLadderNoneChampBorderObjectbForceTeamSkinsUT2004WeaponsNoneMatchIDtotal TeamFaceSkinURLbDesireSkinPreload exp2_frames bFrozenBody bAllowBoostThumbnailInActiveThumbnailActivebIncludeChampNone selmatch PropNameNoneGoliathBELID_DMbThrowRagdoll ColumnCountNone TeamFacen2NoneNonen1PhantomEnemiesNone MatchHistoryGames IronSkulltrbNoInstagibReplacemodVIronGuard_descriptionRGclassVehicle MagicString currentGameIronSkull_description increasefeeNone BloodFistNone FireStorm BlackLegionJakobM updateFeeHellions_description EnemyTeamIncreaseFeeOfCurrentMenuRungbAlreadySetupBotUseThunderCrash_description FeeModifierbDebuggingVoiceChatMoneyMeNoneNewURL TeamRating OldBalanceMIbRagdollBulletChallengeInfo bIsChallenge PhantomTeamsNonebKUseTearOffMomentumTeamMateRankingRankFramedPhantomMatches GameTime LadderId CacheManager CurrentLevelPath ScoreTeam2 ScoreTeam1NoneHighDetailOverlay ThunderCrashNoneTeam2 PRIArrayNoneNoneTeam1 PayCheck matcharrayPaymentBotIdNone lmdMyTeamMapListTempNone lmdTeamGamePlayerCharacter lmdGameTime MaxDropTimeNone IronGuardlmdInjuryTreatmentlmdInjuryHealth lmdInjuryNonelmdMap lmdGameType lmdEnemyTeam BotOrders bFlamingNone lmdWonMatchNone Jakob_BodyNoneNonelmdBalanceChangePlayerMatchDetailsNoneSpecialAwards lmdFreshInfo combocount headcount bCheater bCompletedLinkHitNone bSpawnDoneClientOverlayCounterGoliath_description TeamStatsOldShieldStrength bSpawnInWonDMSquad BotStats FreeAgent InvisTimePriceAltPath ActiveMapShouldBeHidden PlayerIDSquadObjectivebAddNewExplosionASpawnProtectionTimeOverlayMaterial HellionsWinsNoneCTF7CTF8DOM6BR6BR7BR8AS1AS2AS3AS4AS5AS6 StartHealthAssaultRifleTex0NonekcheatUDamagePickup PickupSoundsbTakenDrivenVehicle ObjectPoolTeamID bulletpock exp1_framesNoneNoneNone JumpinessJuggernaut_description we1_framesTeammateBoostNone SpawnTimeSmokeReOrdered FlagTarget ranovercountSenderBloodFist_descriptionNone ExplosionTexNoneTheCorrupt_description TheCorruptNoneCurrentLadder GameLadder PickedLadderpnCrossbInLadderGameNextMatchObjectColorModifier JuggernautsNone bWonMatchVoiceReplicationInfo WeaponShader NewWeapsCanvas AlphaBlendFireStorm_description SoundCountrungGoalsMatches StartTimeNewPawn GoalsScoredKillsNoneNone DDPROPNUMNoneNone Interval UseSpecularBoostDescTextBlackLegion_descriptionPartsOrderVoiceChatReplicationInforating UsedBots EVoiceGender PrimaryTeamEffectsNumberbVoiceChatEnabled MapRecordDeathsSuperNova_description DMSquadClassCArrLastMapListRequestTimeLandMineExplosionNewMap__ProcessMapName__DelegateVoiceTypeNameNoneRenderTwoSidedPiTranslocDescText BurnFlare1 flakcountNonebLeaveBodyEffectNone PrizeMoney TimeLimitPrecacheSoundPlayStatusAnnouncementForceLoadTextureMultiKillBonusAddHistoryRecordKillSoundNamemsgSpecialAwardFindCharIndex SpreeBonusIonCannonKillVolumeGetCustomLadder canChallengeComboAnnouncementNameGetAltTeamRosterPlayRewardAnnouncementGetChallengeGame GetAltLevel GetVoiceTypeAvertedSoundNames SetGrammarNewStaticMesh NewPrePivotNoBloodSetAltTeamRosterPlayGlobalSoundGetAllCharactersIsTeamGametype DebugMessage SetTeamSkinLoadSRGrammarAddServerDetail HasAltLevel NewDrawScaleRemoveCharacterIonCannonKillWarningHide ChatManagerAimAtGetDefaultCharacterPostRegisterGameGetSelectedLevelHandleSpecialEventNeverAllowTranslocSetCharacters AddCharacterStartChallengePreRegisterGameChallengeMenuChallengeDescription LoadingHintsChallengeNameFallingPickup InitDropGetThrowVector UpgradeGPbMustHaveMultiplePlayersControlSoundNamesClientReceiveBan DisabledUDamageRewardReturnSoundNamesGetNumTeammatesForMatchInfoScoreSoundNamesGetAllLoadHintsSetCustomLadderProgress ThrowUDamagePrecacheGameAnnouncementsTakenSoundNamesDroppedSoundNamesHandleRequirementsbDefaultTranslocatorgetMinimalTeamFee LadderNameGetCustomLadderProgresssae_headhunterRegisterCustomLadderMutUDamageRewardLoginMenuClassMoneyToString SinglePlayerTransientSoundRadiusResetSelectedLevel bSuperWeaponTeamArrayAgilityRating UDamageRulesAddGameModifierFightHistoryRecordCustomLadderInfoPriorityDebugStartUpMutFastWeapSwitchChallengeGamesGetPhysicsString PossessedBybAllowVehiclesScoreGameObjectCheckPriority LogPrefix RagGravScale sae_hattrickPawnEnteredVolumeRemovePowerups IsCheater VCTFHintsVehicle_Driving WeaponLocker LoadProfileNewHealthCharger CLOnslaughtAnnouncePickupGetSelectedMatchInfobNetTemporary EntryLabels Revision msgCreditsWarningStringUT2K4TeamRosterPhantomChalFeeMultiply BombTrailCountdownTimeChallengeGamebDetonatesGoop BloodRites TradeMenu ScoreKillDamTypeIonVolume UntradeMenuGetGameObjectCreateProfileLevelPathRecordStaticPrecacheNewWeaponBaseInjuryTreatmentTeamNewSunblade TriStringsae_flackmonkeymsgFormsgWeChallengedmsgGotChallenged TimerPopCountDownTrailerbDramaticLightingCheckForErrors TargetClass IsLockedMapChallengeCostGetViewRotationGetMapRotationAllowTranslocTrackNewPlayerxVehicleCTFGameCanChangeTeamNotifyTeamChangedBRHintsbIsPartiallyUnique RespawnTimeGetMutatorClassesSpeakingBeaconTextureTeamArrayTacticsRating MinBalance msgCreditIonEffectClassNewSuperHealthChargersae_combowhore ValidTouch NearGoalIsFirstPersonGetPosPlacedFemaleCharacterName ManoEManoSetSelectedLevel bShowDetailsTeamArrayAccuracyRatingCustomLadderRecordTeamRosterRecordmsgChampionship msgCheater bArmorStopsmsgLadderGame msgMatch HasFullTeamStoredPlayerIDPawnLeavingVolumemsgChallengeGameTeamArrayAggressivenessRatingsae_roadrampagebDestinationOnlySetProgressTimegetMinimalEntryFeeFor RequirementsmsgAdditionalLadderSetPawnFemale SetRespawnSetProgressMessageClearProgressMessagesGibOrganicForearmNewWeaponPickupsGibBotTypeBRface1 selectionintro_charactersNoBloodHitClasstossdir bGodMode OutStackModeLastManStandingbUpdateSimulatedPositionMonth bDrawCoronasoundBeacon_a01doPayTeamMatesTempbIsChallenge NewbHiddenMembers PlayerOwnersoundBeacon_a00redeemer_explosionsound DebugStringONS1ONS2ONS3ONS4ONS5ONS6 GPCHALINFO doCancelFeelmdbChallengeGameGameObjectName ForFeitFeeHourGibOrganicUpperarmAltTeamRoster MyRating LadderClassCustomLaddersLastCustomCladderbIgnoreHealthPrefixHints MyDeaths LocalRecordsPlayers MakeColorGibOrganicGreenHealthChargerMESH-DSTopbCanFlyGibBotForearmLbFound CubeMaps IsDemoBuild LevelRoute selectedGORewardbFastWeaponSwitching mColorRange BloodSplat3 TeamScore myEmitterNoBloodEmitClass MultiKillsNEWTranslocatorTEXMutClassNamesCP LMSLogoSmall PainTimer PlasmaStarDeathOverlayTime OutDrawPivot EDrawPivotbIgnoreVehicles BloodPuffADeathOverlayMaterialMinute lmdSpree TeamLayoutHitDirbMatchHasBegunLastSecondMessagebRewardSoundsWonGamebAllowPlayerLights SquareBoxA EffectLocMover PlayerIDHash MyAwards chalgamesTurnRotTeamBannerShader bDeleteMeSmallShieldStrengthRND BloodSplat2PCheaterJakob_NewHeadNewTransDeresBlueNewTransDeresRedNewTransEffectRaceAddToNavigationbOnlyReplicateHiddenResultRemainingChargeIncreaseLeadNameCharsAlienBloodJet EStackModeNewTransEffectBluebDebugNewTimeNEWtranslocatorGlassYearUnrealPlayerChatManager CTFShadersbAffectsFlyingPawnsGibOrganicRedbGotChallengedGibOrganicHeadIsSoftwareRenderingOutPosXBloodresGibOrganicTorso LoadedSkin DemoSkeletonLoadedFaceBlueParam1NoEntryIonCannonBlastNEWTranslocatorBLUE FadeTimesoundBeacon_a03 xbiosplat BloodPuffOil MatchData TotalTimeTimeRemaining TAGRifleGRDateWeapons VolumeTimerSunblade_descriptionbCanBoostDodge__ResetCount__DelegateGeneric BloodSplat1KActorGravScale GibBotTorso SunBlade LoadedFacebThisClassOnlyGibOrganicCalfbIgnoreEncroachers GibBotHand origpathFlickerFlare2BalanceChangeAdditionalLadders BloodSplat1PDemoPlayerSkins GibBotCalfFinalEnemyTeamShockHitShaderMyScore TeamSkinInterfaceContentChargerMeshesPauser pcl_ballAnnouncerFemale2K4PlayerChatManagerOutPosY SurfaceNum TakeLeadNameMaxDesireabilityArr bRecentHit BloodHitId BloodSplat2CaptureSoundNameMyKills xbiosplat2 minigunflashNetUpdateTimesoundBeacon_a02 GibBotHeadbHighBeaconTrajectoryWeaponUDamageShaderGRADIENT_FadeWeaponChargerMesh-DS bRubberyRosterOverride NewRoster BloodJetc GameRecordfees BloodSpurt BlastMarkXGameShaders2004 Progress BloodSplat3PSpreeBloodPuffGreenGibOrganicHandAW-2004ParticleslmdMultiKills RulesGroupIonBeamEffectNewTeamRosterNEWTranslocatorPUCK totalFee bMustShow BotSparkbSelectETISpeedTrailTexGibBotUpperArm GUIPagesLoadedSkinBlueGUIPagesae_untouchableDayChallengeVariablebLastSecondSavebOriglmdPrizeMoneyParam2lmdTotalBonusMoney TossTrailbLocked IonEffectredbolt ShieldSparkChallengeGameClassAnnouncerVoice FightHistory MatchExtra BonusMoney Viewport2k4ChargerMeshes DriveAnimBanInfoSuperHealthMaxUT2K4GameLadder HUDContentTargets AmmoPickups LastPainTimeTeamRosterNameAssaultPickupSM bDroppedNoneGetOffsetForSequencebForceRespawnTakeFallingDamageFindValidTaunt bDemoOwner bAutoDemoRec SequencebSkinsPreloadedNoneNoneCheckValidMaleDefaultCheckValidFemaleDefaultForceDefaultCharacterGetLocalPlayerControllerNoneNone RelativeTime RangeVector RelativeSize SizeScaleInitialParticlesPerSecond UniformSize ColorScaleRespawnDeadParticles MaxParticlesUseColorScaleAutomaticInitialSpawningStartSizeRangeLifetimeRangeStartSpinRangeSpinParticlesStartVelocityRange UseSizeScaleUseRegularSizeScaleTextureVSubdivisionsBlendBetweenSubdivisionsUseDirectionAsTextureUSubdivisions AutoDestroy bHighDetailStartLocationRangeFadeOutStartTimeSpinsPerSecondRangeScaleSizeByVelocityMultiplierFadeOutScaleSizeXByVelocity BulletSplashInitFor WaterRing WaterSplashVelocityLossRangeSpriteEmitter9EnergySpriteEmitter10NoneSpriteEmitter12SpriteEmitter29TraceThisActorSpriteEmitter31SpriteEmitter30NoneNoneDamInventoryAttachment SplashTimeSpriteEmitter11 RemainingbClearWeaponOffsets SparkHeadNoneZeroWeaponOffsetsSpriteEmitterNoneNonebAlphaTextureUSizeFormatVClampUBitsVSizeVBitsUClampMipZero InstagibCTF AllowMutatorInstagibMutator ZoomDescTextZoomDisplayTextIsVehicleMutator MutatorClassmDirDevAcceptPlayInfoProperty GravityZmPosDev xSplashBasexCausticRing2 MutLowGrav xWaterDrops2JumpZModifierOldBaseJumpPadXYDirbZoomInstagib bLowGrav PropertyName JumpVelocityDefaultGravityPVWater JumpTargetZDiffMutatorClassNameNoneNonebCanPickupInventoryNoneNoneNoneNone LocalPerform ShowAliasesCheatSkipMatchDelayedConsoleCommand ShowBindingsoutputConsolebCustomPreload SecurityNoneNonecheckNoneNoneNoneNone RemoveTargetNoneNone`tc39:9:$-9:9:$9:9:$GBY6I̼n u uՎՎpphp3}3}ppph̆hhh }2/$!/$!3}zVGBu3} u uzVGB uzVGB uzVGB/$/$zVGB}L/$}LzVGB uʁ)3}Zs3}qYԱqYԅ3}qYԱqYԱqYԱqYԱqYԱqYԱqYԱqYԱqY},3}3}3}3}[ ~jU3}3}3}3}3}WSF $ $ $ $ $8fbQ 3}3}3}ʁ)ʁ)ʁ)ʁ)|;3}3}3}3}bQ p }2ZsZsZs3} u3}3}!ՎpppppՎpՎՎՎՎՎppՎpՎՎՎՎՎppՎՎՎppՎ $pp3}pb#26&%b#26&%3}pppp3}3}pp@3}3}3}3}3}3}3}Zs!3}qYԅ3}3}3}hhhppphpZsZsיpיpיphיpיpphppp3}FoFoFoFoFoFo3}3}3}3}W=ՎFoppppZs3}3}Zs3}3}3}3}pbQ Zspp3}3}Zsʁ)ʁ)ʁ)ʁ)Fo@Fo@ʁ)FoFo3}3}3}- =1zVGBzVGBJ $,e[ ~jUzVGB}L}LzVGB,e,ezVGB,e}L}L,e,ezVGBzVGBJbQ }2 }23}3}u3}uzVGBzVGBJzVGBzVGBJ3}3}u3}3}ubQ 3}ʁ)ʁ)BFoW=}L}LzVGBzVGBJ,ezVGB75qYԱqYԱqYԱqYԱqYԱqY<G.K J H F $C| d $?j B` $Q8>_ $>t\ "[ "Z "Y "X "W $33>8888888888 8 T ^S VVQ "P "O "Yr Yv Y@YmM @ L vK {J s I B vwG [@ $@~|Zc7VY1{$|$>{$ @|$B>{$B|$B>>{Zc7VY1{$|$>>{$ @|$L=>{$B|$L=>>z$>y$PAx$@v$HCu$Et$ @s$CN7$?rYq$?p$ @\\n]JakobT8]Tamika`]XWeapons.AssaultRifle`XWeapons.ShieldGun@ ]xGame.MercMaleVoiceF.CS^$Co$\CW$CW$C{$>U$>f$Be$B_$A`$Ahy I E }y}x }N}{ C hB a{$?$RCA| Af ACAz FwFI FnFiMG MzMjMcNmNoNHNQSsS@ S\SP\i\p\O\y bb~ bkbE aUaWaIa~s Xr Z q sp Co U n om vl {M1y/i }h |f ze \ulY$C[$@@@y7to$ff?PI:5,YQ;$A1$0B@V:s Ns z>pcJ75p|||!''/$75757575/$75757575>[\J@a2SI՟T3}WSF3}hhh,ezVGB3}J3}WSFjHg~jjjjjHg~Hg~Hg~Hg~Hg~h,ezVGBJjjjjjHg~Hg~Hg~Hg~Hg~jjjjjHg~Hg~Hg~Hg~Hg~ʁ)xxHHJJpnpn3}H)UH)UhhhzVGB3}3}Zs MvIHDJwKLNOS$?~ :5pBXM]f zmulY$C[$@&.SBSvo="$?I:5B,Y R$C;$pB1$ BMg @>>C0>nV3p9:9:$GBe[X! X53}Zs- =13}Zs- =13}WSF,ezVGB,e,ezVGB,ezVGB3}WSF,eZehhh3}hB3}Zs- =1nzVGBJnzVGBJ3}Zs- =13}Zs- =1nzVGBJB3}Zs- =13}Zs- =1ؚؚB3}Zs- =13}Zs- =1,ezVGB,e,ezVGB3}WSF,ehB3}ZsnnnzVGBJ3}B3}B3}BnzVGBJnn3}WSFnBʁ)B3}hhqYԆhqYԅ3}h3}Zs- =13}Zs- =1hBBhzVGBJBBBBBBBB3}|,ezVGB',ezVGB'yFF3}Zs- =1,ehqYԌ,eh@q@q@qhqYԌ,ennzVGBnzVGB3}nnqYԼnnnnqYԼn,eBX]XWeapons.BallLauncherY$DZ$>a [$?]$L=uu`N0@cWzmu(Y$C[$@& .SvOSUy$BO $@@"$?I:5@?,YEfR$zC;$A1$AMJECxu $AV:s0uG:s0ugx >jyV2%aE/'753}Zs3}Zs'/$757575ʚʊ75ʚpʚʚp/$/$75/$75  >hI5C2/$@Eڛ''ʚʛ''ʚʛ''ʚʛ''ʚʛ''ʚʊqYԊG EjUi ]No Weapon Preferenceb]Favorite Weapon:h ] Agility:g ]Team Tactics:f ] Accuracy:e ] Aggression:>>5>>M(A eoO2 $׿e]hh,eh,ezVGBh,eh,eh,e  i $BC$Ag h >>@ >[SB }2@E*Y>>r>>f >pZPBj?4qpj ,Y @>Qh[BHg~?4qpj & .SOSU"$>,Y @xV:s>> >>}>DE(-9:9:$G@lʁ)z ώA $?K $?r $ AB=P_>>>>g>>D>cE7l3Z!@E̅3}̏zVGB̏zVGBJ}L}LzVGB}LzVGBJ̏zVGB̅3}̅3}̅3}̅3}̏zVGB̏zVGBJ}L}LzVGB}LzVGBJ̅3}̅3}- =1̅3}̅3}̏zVGB̅3}̏zVGB̏zVGB̏zVGB̅3}̅3}- =12̆hhhhhhhhhhhhhhhhhh3}u3}3}3}3}zVGB3}3}3}- =13}3}- =123}3}3}3}3}^ ] xGame.xPawn\]Humank Uk Gk Bk bk }k jk vk Ak \/k ]/T]PointTBeckonTHaltTCheerTPelvic ThrustT  Ass SmackT Throat CutTUniqueT Team TauntT Team IdleL$?^$?o$?W$?Q$?M$?_$?{$?U$?{$?$?>>.> iM]BƏ upW$?.SOS="$>Eb Sy k$>>B@A>>Y|d6 =+qJ;C  H] AffirmativeHGot ItH  I'm On ItHRogerq"m]I'm On Your Team!mI'm On Your Team, Idiot!m Same Team!tYour Team, Idiot!u"]And Stay DownAnyone Else Want Some?Boom!  BURN Baby  Die Bitch  Eat THATYou Fight Like NaliIs That Your Best?  Kiss My Ass Loser MY House Next! Oh YEAH! OwnageSeeyaThat HAD To Hurt UselessYou Play Like A Girl  You Be DeadYou Like That?  You WhoreI"222??Y]Defend the baseYHold this positionYAssault the baseY  Cover meYSearch and destroyY Take their flagY Defend the flagY Attack AlphaY Attack BravoY Get the ballb]DefendbAttack]Base is undefended!Somebody get our flag back!I've got the flagI've got your back  I'm hit!  Man down!I'm all alone here %l  Negative!I've got our flag I'm in position %l I'm going in! Area is secure Enemy flag carrier is %l I need some backup %l  Incoming!Enemy ball carrier is %lAlpha secure!Bravo secure! Attack Alpha Attack BravoThe base is under attack %lWe're being overrun %l!Under heavy attack %lDefend point AlphaDefend point Bravo Get The BallI'm on defenseI'm on offenseTake point AlphaTake point BravoMedicNiceUGet our flag!U Got the flagUGot your backU All alone!U Got our flagU In positionU Enemy flag carrierU Need backupUEnemy ball carrierUBase under attackUBeing overrunUUnder heavy attackB i i iiii%[%[%[%[% [%j%C%C%C%C%[%C%C%j%C%C>>H>>>>G>G>@J >{>>z>>X> G}Z2%1+ 8G} 75/$/$75/$757575/$75p  >BA DB Y6 &Ƞ nFoFoFoFoFoFoFo  ?Fo<` :5??@f$Be$BhD SQ;$A1$,B>>>>b@> >X>>> R|g-˰ K~ $B} $D| $DO>>[ >>`> >N>>F>>}>>Z>>T>IR\6x67'u3}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}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}Zs3}3}- =123}23}3}3}3}3}  O]XGame.xDMRosterZbF= DeathMatchU]UT2004Thumbnails.DMShots^]XGame.Deathmatch\-DM>>@KI>g >>>>_ >>i>KIJ 2 <B,8f/$/$!!J  >>W >>n >>_>>s >>>>T A>d>>`@>>">>^>>C'>>z>>C@>>y>>>>d>->>>q>>>>N>>W@> >>>A@>>i  >>f @^zEo9:9:$G@2 Vؚ3}3}ɢqYAɢhbQ h z$?g] GoalLf8zmul7Y$C[$@&.SBSvo o=y$ B"$L?,Y fR$Cc $?;$A1$AMgE@@f>>{ >>>>y>>F>>n>>] >>I@> >_>>k>>L@> >G@> >@@> >cF>O>>>>oq>x* >e>>M>>G#>>l >>U:>M >HKRB n?3t?43}3}Zs- =1Hx- =13}3}qp&.SrOSo ="$ @;$@B1$AMJgE@@>>;>nfT]B pnn?3tI՟I՟I՟J3}Hx- =1\ ^ f\"$?>>:>>a@> >e@>>d> >>>>>@ >>H>>~>>p>>>>^D[ A9OD O,O&9D9?O9?,9?, G!>~>>>>?>>>>@>>>>u>>Z>>>>f>>I>>Q@>>>>N>>>>[>]>>>>k>>>>Q>>m->>>>H>>W >>>>B>>>>K>>>>Y>>>lqE 6\YB67'67'3}3}3}3}3}3}3}3}  O]xGame.xTeamRosteri]XInterface.HudCTeamDeathMatchw]"!XInterface.MapListTeamDeathMatchZbF]Team DeathMatchU]UT2004Thumbnails.TDMShots^MXGame.TeamGame\]TDM>>>>v>>T>>\ > >y@>>Z>>p :>S @A>@> >>>b>>~/@>]>c>>B>>h>>>>w >>t>>>>n>>W>>>>>>h>>^>>>>a>>>EV3}͡!R]XGame.MercMaleVoiceE]XGame.MercFemaleVoice`]xEffects.xPawnGibGroupc ]Male2J ] Female2y]HumanFemaleA.Skeleton_Female|]HumanMaleA.SkeletonMalev]XGame.xEgyptMaleSoundGroupw]XGame.xEgyptFemaleSoundGroup>>[0@>Y>>>R>du3K6pApBвzVGB3},e,e,ezVGB,e,e''''3},e,e u,e3},e,e,eh,eh,e3},e u,e'y'y3},e,e,ezVGB,e,ezVGBJ,e,e,eɢ,e,eɢ,e,e,ě,e,e $,ě,e[ ~jU,ě,eh,eh,eh,e,eh,eɢ,eh,eɢ,eh,eh,eh@q@qqY@q,e,e,eɢ,eɢ,eȵ[X! - =1[X! ʁ)[X! 3},e,e,eh,eh,e,ezVGB,e,ehqYԌ,e[X! ,e,ezVGBJ,ezVGBJ,ezVGBJ3},ezVGBJ,ezVGB,e,ezVGBJ,ezVGBJ3},ezVGBJ,ezVGB,e,ezVGB3}[X! [X! [X! ,ezVGB,ezVGB[X! [X! [X! ,ezVGB,ezVGB[X! ,e[X! ,ezVGB,e,e,ezVGBJ,ezVGBJ',e,e[X! [X! X5hhzVGBhzVGB[X! h,ezVGB,ezVGB[X! [X! [X! VΛ'67'3}3}3}\Y3}3}3}3}3}3}3}3}3}3}_ ._ ._ ._ ._ ._ ._ .,eh,ezVGBJ'ؚ''[X!   `0V1]Delay ball contactG1]"!BallLauncher drains Translocatoru0]caIf checked, a player must wait a few seconds after throwing the ball before picking it up again.I1]\If checked, a player must wait a few seconds after throwing the ball before being able to translocate (or until someone else catches or picks up the ball).E8ivYou can use %BASEPATH 0% to see the path to the Red Team base and %BASEPATH 1% to see the path to the Blue Team base.Firing the translocator sends out your translocator beacon. Pressing %FIRE% again returns the beacon, while pressing %A:TFIRE% teleports you instantly to the beacon's location (if you fit).GWhile carrying the ball, you can target teammates by pressing %ALTFIRE%. Pressing %FIRE% will pass the ball to the targeted teammate.gPressing %SWITCHWEAPON 10% after tossing the Translocator allows you to view from its internal camera.NPressing %FIRE% while your %ALTFIRE% is still held down after teleporting with the translocator will switch you back to your previous weapon.gScc|r6c6SO]xGame.xTeamRoster_$@i]XInterface.HudCBombingRunw]XInterface.MapListBombingRun{-BRz-BRH " "Zb%jF] Bombing RunBmdbEach level has a ball that starts in the middle of the playing field. Your team scores by getting the ball through the enemy team's hoop. You score 7 points for jumping through the hoop while holding the ball, and 3 points for tossing the ball through the hoop. The ball can be passed to teammates, and is dropped if the player carrying it is killed.U]UT2004Thumbnails.BRShots^]XGame.BombingRun\-BR>>\>>>>Z>>M>>T>>P>>>>>>G>>i>>P>>B>>f>>>>H >>>>C>>w>>R>>>>>YxO 2[ ~jU׿e]hhh  >>>>>>>>S3>B>>H[l 6,b+_Fݕ u uzVGB u uh uu) uu) uIPÕ uIPÏzVGBzVGBzVGB u3}IPIPÕ uWݝҳIPIPÕ u3}IPÕ u uzVGBZspzVGBZspu)<  v ]was killed byu ] someoneH Sm ] h*H>>k$>>e>>>>K>>I>>~>>h>>>>k@> >y@>>z>>f">>N>>_>>~q>S @NX>@>>>>k >>V>>m >>>>>>>>| >>>>w \>l>>A>>>>V>>b>>o>>>>q>>>>s>>>>K>>J>Hwv@3 Ns6D3}3}3}Zs- =1q|Hx" - =1 w:5@m BSt"$?1$B@>>g>>O>>W>>sR>e>>S>>{>>> >p>>m>>`>>Y>>>>W>>]>>]>>_ >Df_B `.8?43}3}Zs- =1q|Hx" - =1.Sr=t>>q>>a>>>>>>o@>>Q} b2Qk%zk7B 777&B  pkk G>U>>g>>>>L>>B >>S >>O>>m>>O (To BpփC?4&.S="$>I:5m >>>>L>>E>>r>>@>>f`,9:9:$a!}L?]w*Q G>B >>[ >>>>~>>>>tq>J>>C@>>>>>>@>>u(>xq>>>ItW `L9D9?,I9?,9L6At9L6Ct?9?|6t%,d G!>MaX :9L6Da9?9D9?,79?,9L6Dac9L6Da9?%,K|6a9L6Da9?&9D9?,K9?,9L6Da?9?|6a,d9D9?,_9L6Da G!>n0#KH9:9:$a/!^-' G>p.>>>>N]Y a@@9L6Q$]Z9L6I]9?9Da9?,:9?,9L6I]a9?%9L6I]9?%9D9?,K?9?|6]9L6I]9?&9Da9?,K9?,9L6I]?9?|6],d9Da9?,\9L6I] G!>|`Z G9?,9L6S`9?9D9?,79?,@9L6S`v9?,9L6S`9?%,K|6`9?,9L6S`9?&9D9?,K9?,,9L6S`?9?|6`,d9D9?,_9?,9L6S` G!>>>u :>r%@>>|.^>g>>x>>c:>l:>V:>SY>W:>@Bf>>>>>\>>>>f>>H>>@>>>>@A>Q >>z>>h|m> G>JDl= G>y >>>>p>>_ >> ^E>O>>>>n>>>>l>>>>r>>t>>>>U >>w>>>>e>>>V>>>>>f>>S@>>f >>I@>>@> >D@>>>>>>>>QG>>>M >>@> >h.>>j>>>>>>b>>P>>Q>>  @NS>> >>>>>y >>|>>@k >R>>>&qxeB Y6\Sb,&Ƞ <b]intro_crowd.crowd_d1_a>>a>>u >>^>>>>_!>>I>>q >>>>t>>c>>e,S>w>>k>>l >>>>:>|>>o*>*>>>>>F@> >o (>rq>>>_3>A>p> g>c>WbG@},qY@q@q̅3}3}hhhqY̅3}̅3}h3}"$>>>|>>YC S$~C Female%K L  G >>>@>>R >>H  >>q>>j>>K >>J>>`>>J >>O3>q >>U>>| 3>G w >t>>V >>k G>>>{  3>B>Xi8K (_(9:9:$9:9:$9:9:$G 6ZWݝҳIPÆh?4⁀⁀⁀⁀or3}3}Zs uzVGB uzVGB u uL uzVGB u u uzVGB u uzVGB3}Zsʁ)ʁ)3},eWݝҳzVGBWݝҳWݝҳ,ezVGB,e/$zVGBzVGB!!zVGBJ3}u*Fh:zVGBzהzה̅3}zVGB̊/$zVGBhhh-˰-˰-˰-˰Wݝҳhhh3}Zs,e3},e,e,e,ehhhh-˰h-˰-˰hhh-˰-˰hhzVGBhhh,eh,ehh $h $̊ $h3}3}3}3} $ $̊ $ $3} $qYԃʁ)3}3}3}Zs3}3}Zs3}3}3}3}3}Zshh@q@qqY@q<I"J$Bn]XGame.ComboSpeednXGame.ComboBerserknXGame.ComboDefensivenXGame.ComboInvisD1O1A  B  I8 F<] @>> >>>G>>|0 >y >X!>>` >>O >>}>>T >>t@> >l>>>>s>>R>>j>>>>T >>xR>U>>P >>>>lR>q>>X>>v >>|@!pJDv9:9:$G*"z ώȵllllll3}lBllʁ)llʁ)lllllllBBBlll3}BBB&_ $A>>>>i @!>S>>^>> Qnsdv7+vQSv v%avQvAv2 G>\>>>>M>>g >>>>L>>L>>>>k>>>>>>o ^>A>>v->>h>>i>>v>>>>re} b2rQ%zQ7W777&W pQQ G>>>>>f>>>>U>>[P>\P>PHvV6]НjWʁ)qYԃʁ)ʁ)3}Zsʁ)ʁ)ʁ)ʁ)ʁ)ʁ)jWjW3}3}B3}u"&շ"&շ"&##вв  rx p}]xWeapons.SuperShockRiflev ]xWeapons.ShockAmmoq0]Allow Translocator}/]Allow Teammate boostingd5]0/Players get a Translocator in their inventory.K5]<;Teammates get a big boost when shot by the instagib rifle.q]xWeapons.SuperShockRifleV]ArenaL] InstaGibB]10Instant-kill combat with modified Shock Rifles.[7o=>>>>u>>X>>{>>@> >a>>k[>>>n[>o,@Dj >l>>[>>>>>@@>er~{ B(r,~?4h,ezVGB3}Aphh,ezVGBV[X! [X! [X! h[X! h[X! ̅3}ApVΆhhhȟ,e,ezVGBJVΌ,ehhhhhh&.SB=;$pB1$pBM>>$>>^>>>>z>>a >>P@ \>}>>\>>[ >|/>>>>| >T>>Q>>>> M!D n">dE7+ED SE E%aED EAE2 G>E>>>>S >Gw>o(>>>>>F V>R@V>>>L @V>P (>S !(>N>>K@>>T !(>U !(>z(>>>b >>~ 3>@@>F>u > >Z  > >K>>#>>^ >>>>H>>I>>c>>@@>A>>>g >>[S>h >>i S>>>k>>S>>r (>]@> >C>>S !(>o*_ ^ n9C'z6m*99?,99?,9L6Q$*99?,9L6S*9L6S*>99?,9L6S*>99?,F9L6D*9L6D*?99?,d9L6D*?99?,d9L6I*-9L6I*?99?,d9L6I*?99?,9L6A*99?,9L6C*9D9 G!>>z>B>>0>>z Z Y X W V U S R Q P >>>Q7>>[@Bl>u>>T@>>U>>} >>~ >>m> >a:r* {B .B -Ca !>CC-'C dC@CC^CsCe G>@D>E >>G >>L@>>>>>>P >>[>>@>>G>>I>KcX2O WF݊ u u u u  g] Double Kill!g  Multi Kill!g  Mega Kill!!g ULTRA KILL!!gM O N S T E R K I L L !!!gL U D I C R O U S !!!gH O L Y S H I T !q5lq5sq5Hq5Gq5zq5yq5Gk@h*HeZ$w>|">>>>>>@A>R @A>d@A>u>>>>>>] @>>>>p/>>P>>Z >>a @>>F@E>` >>]>>L @>>^>>j>>i@>>>\>h @>>i @>>j @>>n@>>>>w>>O >->YJ>@ >>s :>r >>H@>>P:>l%@>>l:>X>>M$>>v >>{ >>D>>r>>>>} >>w>>R>>>>>>v>]@>>>pNo3^6oE ѥBI՟zVGBWݝҳjWݝҳjвв,e,e,ezVGB,ezVGB,e,e,ehI՟,ehI՟3},e,e u,e3},e,e u,e,ezVGBJI՟I՟3},e uzVGB,ezVGB u,eI՟I՟I՟I՟I՟I՟3},e u,eI՟I՟I՟I՟I՟3},e,e uI՟J,e3},e,e uI՟J u@,eI՟JI՟J3}I՟JI՟I՟hI՟h,ezVGBI՟h,ezVGB3}I՟h,eI՟h,eI՟I՟hI՟h,ezVGBI՟h,ezVGB3}I՟h,eI՟h,eI՟I՟'3}ɢɢI՟ɢ67'3}3}3}|||\fF||\fF|\fFؚ|\fF'||\fF|\fFT_ ._ ._ ._ ._ ._ ._ .\Y3}3}3}3}3}3}3}3}3}3}3}3}   " ~ " D " d6`d6Vj6Ej6D~5^~5^~5]g]Time To ScoregTime DisabledU/]FDSpecifies how long domination points must be held to score a point.U/MKSpecifies how long domination points are disabled after a point is scored.gSc c c6SO]xGame.xTeamRoster_$@i]! XInterface.HudCDoubleDominationw]$#XInterface.MapListDoubleDomination{]DOMz]DOM"Zb%CF]Double DominationB]sYour team scores by capturing and holding both Control Points for ten seconds. Control Points are captured by touching them. After scoring, the Control Points reset to neutral.U]UT2004Thumbnails.DOMShots^]XGame.DoubleDom\]DOM2>>>>C@!>v >>i >>r >>|>>>>>>t@>>>>X>>[/>>> >>>R @>>T>>B>>G >>U >>[ >>\ >>>>>>p >>^ @!>_ @!>>>D>>>->>>f @!>w@!>d >eWA2 h 腸o>+o>+̊!̊!  >>j @!>k @!>l @!>` @!>@>>m @>>q >>r >>X/>~cf2s '/$F1]PublicX1]upl>>S>>It Be9D9?t o  G >w >>{>>K>CwU3y !R]XGame.JuggMaleVoiceE]XGame.JuggFemaleVoice`]xGame.xJuggGibGroupy]Jugg.SkeletonJugg|]Jugg.SkeletonJuggv]XGame.xJuggMaleSoundGroupw]XGame.xJuggFemaleSoundGroup\= JuggernautP"."k o.k t.TFlexTStompT Back scratchT Show buttT Head scratchL$333?Q$333?_$333?{$L?U$L?{$fff?$fff?>>">>q >>>>| >>} >>~ >> >>o >>A >>s>>B >>D >>>>H >>I >>r>>E >>g @>>K @>>^@>>>>Y>>Z>>F >>(>R (>N >>U !(>W >>X >>>>d>>>>V>>X]>\ ]>] ]>` @[ >>>^ ]>a ]>b ]>>>G4l9:R%,s,,lwx* 9:R,w9:Rx*.., 9:Rx GBR!2f a o>+o>+hhhhzVGBhzVGBhzVGBhhhh  k $?>>z>>>>j >>k >>l >>>>q>>m >>w$^bNA Bp 2$` ut"$fff?,Y>>>Z} Br M?4& .S"$?>>@>>>>u >>>bDt 2x 0 Ex@zVGBzVGBzVGBzVGBzVGB u u uJ uJ uJp  u]returns the ball!t]returns the ball!s]The ball was returned!r]The ball was returned!q]scored the goal!p]scored the goal!o]dropped the ball!n]dropped the ball!m]has the ball!l]has the ball!HHHh6{h6{p6_p6Io6jo6\eZ$=>Z|kBy [|̊/$zVGBp<F<>>]HPL1w.H*}..Hw.H*)w.H*}..Hy w}*w}H}*w}*} ~HH-](*z zHazzz*Hr* ~w~*a~z~~r~*aaz  kra*稨9Vcould not spawn a launcher for player9V a L H Gz G>\>>U3>L3>} 3>z@3>>>B @!>C @!>D !>!}k BE x4j& .SOSU"$>xV:s]>>z>>[@>>G @>rh BI bj& .SOSU"$>xV:s]>>D@>>k>>J @>>a>>>>N >>Q @!>@!>>>D>>m>>@>y@X V uZsZsu> pCW W , }2*Y 9Y 6Y >>Y @!>@!>>>Z >>[ >aOU 2]  kWFݏzVGBzVGB  p = You killedk@h*HeZ$=>>>>2>>>>z>>Y>>t >>C>>m>>@^>d >>R^>h ^>g G>j G>Q>>>l >>P>{OI Bp 'Yt$t"$fff?,Y>>L >>M>>t >>u >>q>>o>s>r>>>b >ctB 2z `FݏzVGBzVGB  o ]You were killed byn ]!k@@"h*HeZ$=>>_>>{ >>>>Y >>Ag>} >>g>|>>E>>B@>>s>>|%@>>K >>n>>U>>n J>K@J>]>>|>G>OG>PG>}>>Z N>L>>F>UF>VF>WF>>>XF>>>^ @E>o>>\E>x>]rN2 `XF݊ $ u $ $  k@h*HeZ$=>>>>bA>r>>eD>B D>>>o>w >>>j@>>\@>>M>>>>T>>l$>>n>>@>@>>>>>p>>@>>v>>w>>x>>>>y>>z @Bn>W>>{>>j@>>X>>@>d>x >>w ee7[[ G >g>>{>>Z@>>>>Q>w >R>>e >>A>>` @> >}>>V @> >>>p>>E @> >Q>>g>>>>KY>R>>~@> >>>`>>[>>X>>Y>>S>>v@> >M>>B>>o@> >E>>^@> >@>>T@> >>>r>>O>>n>>>>m>>Eq>n>>p>>Q@>\>_>>W>>V>>g *>Q@>>_ >>>>c@>N>a>>J@>>a!>>A>>B>>C>>D>>E>>q>>v F E D C >>>H>>>>o>>s>>x >O>>N >>M >k@>V>K V>X >C FI-J F,Fjf%fJ K777&K )pfFFK)qfFFf) F  G> TWX>  b2jG%KG7jP%9:6^"GjG~/P%G%G7jC%9:6^"GjC%~/G_C'Gk-6yC'jG6C'j(  >C'GC'G7j|k-6yGj9:6^"Gj%G6Gj(  >GGG% GC'k-6yGj9:6^"Gj%G6Gj(  >GGJJakob G>@> >j>>SZ\"VA\%8\7q\\q\S G>v#>>aYGBv#%=v#73v#-(v#' G>>>>>@> >[>>_>>c`Dq 7 G>[>>qbn :[%7[7[A[ G>|class DMRosterGael extends xDMRoster; /* * Roster for deathmatch levels. * Each level has its own roster. */ >@>> O!R Gc k%^k7Tw.k*!z.kR 'k-K"w.d*.d GR '( G>Lnvskrs*DMRosterBeatTeam::Initialized() failed. GameProfile == none. W%W7sp777&p pWsWrs s L G>r8G  G>hja',l  pl G>>>Y3mj  w$*$- G>>>lJlbr*r*%a%s J9PJa&s J9PJ G>k>>nk}Jw*9aa =Ga!T7 =Ya&%&?L>L>!z G>pWRUw#*#aLwJ*%J *JB G>quT]9:9:$ u%u7ua/!Hua/!r.u-(u" G>>>rjz &j-Tj G >s>>twp-`? G>>> t*IG-Y$4.-Y$'Rk .(r*r*%a%_ #@?a&_ #@?-Ilr*r*%a%_  #@?a&_  #@? -I-H G> fDmn ' G%Ol2zFW%1+  ]TeamSymbols_UT2003.Sym01 YRomulusAsp] Death Match>>x@ +R!age$ G>{@1! -j <-aafo$`@'C o -a0$$ @'C ag|$ @'C G> Mum^1 ' G>|w E#@9:9:$ 09?,a0$$=a0$$ G>~@y O$'w*"w$*$* G>>>q*B}f'w*Sw*w*w$*w$*$* G>>>E>>>>@>>W3}g)r%-\ -]|9V%,UT2004PlayerSkins.Xan,.UT2004PlayerSkins.XanMk3V2_abdomen b!7,,a!%a!b!a!Xa!a!Sa!A%7-(w#*#-(T-\-]b!7,,a!%a!b!a!a!Xa!T--w#*#-'-]-\- - -\9:9:$ - w*- w*- w*%   G>C Y Kn :{%7{7{A{ G>Z>>I>>{>>_*ol2S-j U!> R%R7GrR*hRUaoR R#Xao {aXUpppCouldn't attach 9Vo to 9WU!bXa R%<R72rRX<R X a G> X|GUF cZ%^Z7Tw.Z*!z.Z|'Z( G>@> >Aclass DMRosterLeviathan extends xDMRoster; /* * Roster for deathmatch levels. * Each level has its own roster. */ >HTDs77s G>z>%dm2R:tS%1+  ]TeamSymbols_UT2003.Sym01 Y Reinha] Death Match>>LyZ5  y , !N G >s>>S_- 6d!r_* d ua_ uVOru* u--\$ud0CG6V9D@CC6V9D@CC6V9D@CCVUUXu X9?,9?uu9?,9?& G%hk2VQ%1+  ]TeamSymbols_UT2003.Sym01 Y MemphisHyenaGorgeWraith] Death Match>>v@>> Q!wJL/H b2zc  ow >6bc G>@> >~>> SZX&, b2~E%KE7~[%9:6^"E~E[0[%E%E7~M%9:6^"E~M%[0E_"Ek-6y"~G6"~'  >"E"E7~|k-6yE~9:6^"E~%G6E~'  >EEE% E"k-6yE~9:6^"E~%G6E~'  >EEJJakob G>@> >U3r(%:B9:9:$-j rG H |H , r6*=-9?, J-3 6- -jlfz66366R} -S%S,rS}*lS}6636S d-6(-6O6-\$6-6 !~ !-)$636O-)$636Oo, !t r!`-)$636O-)$636OE~ !N-)$636Or !W !>-)$636Or-a':x%-)$636OwE%-)$636O:~%-)$636Ow-\$-9:9:$bO??O-)$636O-)$636O-)$636O-)$636O t69D9?&9?,M G>Lclass DMRosterConfigured extends xDMRoster; /* this class used for configured instant action or multiplayer games with bots */ var config array Characters; function Initialize(int TeamBots) { local int i; for ( i=0; i Chars) { default.Characters = Chars; } static function AddCharacter(string CharName) { local int i; i = FindCharIndex(CharName); if ( i == -1 ) default.Characters[default.Characters.Length] = CharName; } static function RemoveCharacter(int Index, int Count) { if ( Index < 0 || Index >= default.Characters.Length ) return; if ( Count < 0 ) Count = default.Characters.Length; default.Characters.Remove(Index, Min(Count, default.Characters.Length - Index)); } static function int FindCharIndex(string CharName) { local int i; for ( i = 0; i < default.Characters.Length; i++ ) if ( default.Characters[i] ~= CharName ) return i; return -1; } static function GetAllCharacters(out array Chars) { Chars = default.Characters; } >>>@> %^x4D6a%1+pp  >>]AtJA!~@%2A!@&LA!t@,fA!`@,A!N@,A!W@, @A G>@>`>bqtLnqpm G>PgGBk#%=k#73k#-(k#' G>k#>>class DMRosterOceanic extends xDMRoster; /* * Roster for deathmatch levels. * Each level has its own roster. */ >ffy"jAy%8y7Y yyY yf G>e1XM> N, %6ie%1 e!I1!~ {!J1! !P1!t !1!` !U !~1!W #i- N-6' 1!>1!W-L'e9?Ni9?,29?,xN%-6'1!W-L'eG9?9?NiC1 !~ ! !t !` !NG-6'e !>1!W b!W_G>-6'_ff&?-L'e i- d?w*)}-1Ni-6(-L(616M&9,&%-L>X!~iMX!iM33>X!~iM?X!iM G>|class DMRosterBeatTeam extends xDMRoster; /* * Roster for deathmatch levels. * Each level has its own roster. * This special roster subclass is used to populate an enemy team with the * player's selected teammates. */ // called immediately after spawning the roster class function Initialize(int TeamBots) { local GameProfile GP; local int i, j; GP = Level.Game.CurrentGameProfile; if ( GP == none ) { Log("DMRosterBeatTeam::Initialized() failed. GameProfile == none."); return; } // create roster entries for single player's teammates for ( i=0; i>F>>zII K4sK7IkF%L%jLKFs oLIL*F G!>jNwrY9:9:$ $$Ja  swJ*%J Ja*%N&O7,v-,v-7v-Nv-D9:9:$ ![N K L  !\N K L R (N.N- (  Ba(((A%7-(w#*#-(TR*'-h' G>B>>qjRM_R9-9:9:$O@?jO-h G>sxxT`-*@@9C~C@@ G>>>wRa^aS9:9:$ 1w*$gRP-hxR G>L5PJ 2oJP,iB%M%fMJBs oMPM&B G!>ykxbk--9:9:$#a !>##--# #??@@#C#^#s G>q8U7x YeM79?U7"9?%9DM7Rk i (a $@ C9?,dN79?,dN7M7M7%BM7N7ge,N7e,N7@?M7@?M7 e,e,9D>M7ge,M7N7O7>N7[O7M79DM7M7O7?M7?M7e,9DO7?M7M7e,9DM7O7 G%Dj2}.p%1+  ]TeamSymbols_UT2003.Sym01 YPrism] Death Match>>N7>>H>>@>>HVL %/T7VfPH%O%OTP?HIoOVO5P9?%H9D9?HPHIgH G!>C f On :L%7L7LAL G>Cclass DMRosterTrainingDay extends xDMRoster; /* * Roster for deathmatch levels. * Each level has its own roster. */ >F>Kk'iF32"&C D$4B@6A6:5 @L6$ff>& P"$?>>P5eM ~,^e,aTF%S%}S^T?FIoSeS1T9?%F9D9?FTFIeF G!>|EA k-|/?EM?_QE9?% z.-}9:9:$ @$wM*w.M* wz*-} \#;wM*\M #?M j?-t\WwW!>w?-?-W!NwM*BM L>#333@2B#?L>#333@?- d B6g,.afM g,.afM g,.afM 9PBwg,*g,--|/;_#g, _mwM*g, M g, 6g, ?!G % wM*!M 9?^XW9D9?,E?9PB=XW9DE?9PBw?* E9?%R??( G>U//============================================================================= // HealthCharger. //============================================================================= class HealthCharger extends xPickupBase; #exec OBJ LOAD FILE=2k4ChargerMeshes.usx function PostBeginPlay() { Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-4)); // adjust because reduced drawscale } >Y//============================================================================= // for tutorial //============================================================================= class DestroyableTrigger extends Actor; var() Name DamageTypeName; var() bool bActive; var int StartHealth; var() int Health; function PostBeginPlay() { Super.PostBeginPlay(); StartHealth = Health; } function SpawnEffects() { Spawn(class'NewExplosionA',,,Location+VRand()*Vect(50,50,50)); Spawn(class'NewExplosionA',,,Location+VRand()*Vect(50,50,50)); Spawn(class'WallSparks',,,Location+VRand()*Vect(50,50,50)); Spawn(class'WallSparks',,,Location+VRand()*Vect(50,50,50)); Spawn(class'WallSparks',,,Location+VRand()*Vect(50,50,50)); Spawn(class'WallSparks',,,Location+VRand()*Vect(50,50,50)); Spawn(class'ExplosionCrap',,, Location, Rotation); } function DoHitEffect() { Spawn(class'WallSparks',,,Location+VRand()*Vect(50,50,50)); } function TakeDamage( int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { if( !bActive || (DamageTypeName != 'None' && DamageTypeName != damageType.Name) ) return; if( Health <= 0 ) return; Health -= Damage; if ( (Health <= 0) ) { // Broadcast the Trigger message to all matching actors. TriggerEvent(Event, self, instigatedBy); SpawnEffects(); SetCollision(false,false); bProjTarget = false; } else { DoHitEffect(); } } /* Reset() reset actor to initial state - used when restarting level without reloading. */ function Reset() { SetCollision(true,true); bProjTarget = true; Health = StartHealth; } >D>Lb'^N۽5ʁ)pd"=y$@|/MJgE@@>>L>>CUDr77W G>VuN T)o7u^ZD%Y%YoZ?DMoYuY5Z9?%D9D9?DZDM`D G!>w>>W>>T5{P >&v{,\^w%]%}]v^?wMo]{]1^9?%w9D9?w^wM]w G!>JZSu2-w*SZYX/( G>>>W]t v !O  G>^>>>>]*VC#&wVz[ ~% ->0$$?6 G>>>_b{1x%@ TR@  G>@ >&m[hB Y6\cFp&Ƞ 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}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}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}3}<b]intro_brock.Brock>>PeGBz#%=z#73z#-(z#' G>z#>>aT}9&y=Tl/aT?=-'T G>v>>D7iVT{C@-iR!Y&?L>qai &@9:9:$1w*a!v  r*a =&L=@w*9:9:$"9:9:$69?%nbk9:9:$9:9:$&?L>qai =&$a9:9:$-'!>@-  -r.*a =&L=@@9:9:$9:9:$&?L>qai =&$ G >fdz"iAz%8z7f zzf zf G>hP[8ZLn >n aS$? /Dl9:9:$ -P-QtBtC-QtDtE&?L>q -Q9:9:$at &$!at &$ G>yA R "~7A Qhv%g%g~h?vHogA g5h9?%v9D9?vhvHUv G!>L// ==================================================================== // Class: XGame.Intro_Brock // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Brock extends xIntroPawn; simulated function UpdatePrecacheMaterials() { // Hacky McHack. Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CubeMaps.GdFace1", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CubeMaps.BRFace1", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CubeMaps.ChFace1", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CubeMaps.SkinFace1", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.brock.brock_head", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.brock.brock_body", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.malcom.malcom_head", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.malcom.malcom_body", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.lauren.lauren_head", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("Engine.GRADIENT_Fade", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a11", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a12", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a13", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a14", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a15", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a16", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a10", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a11", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a12", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a13", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a14", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a15", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale5Sprite.CrowdMale5_a16", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale1Sprite.CrowdMale1_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a11", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.NoiseLines_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.NoiseLines_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a12", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a13", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.ShotAsbestos", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a14", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a15", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a16", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a00", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a01", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a02", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a10", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a03", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale3Sprite.CrowdMale3_a10", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a10", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a11", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a04", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a11", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a12", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a05", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a12", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a13", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a06", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a13", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a14", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a07", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a14", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a15", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a08", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a15", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a16", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale2Sprite.CrowdMale2_a09", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale4Sprite.CrowdMale4_a16", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.ShotFace3", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.CrowdMale6Sprite.CrowdMale6_a17", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.shotPhobos2", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.ShotInferno", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.ShotSunTemple", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("MapThumbnails.shotscorchedearth", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.SC_BrockScreen_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.SC_LaurenScreen_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.SpotLights.SC_SpotlightGrad", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.SpotLights.SC_SpotlightNoise", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.SpotLights.SC_SpotlightOn_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.SpotLights.SC_SpotlightOnMsk_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.JM_AmbrosiaScreen_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.JM_NikolaiScreen_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.fans.fan_chick", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.gorge.gorge_head", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.gorge.gorge_body", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.jug_chick.Jug_chick_body", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.jug_chick.jug_chick_head", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.nikoli.nikoli_body", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.nikoli.nikoli", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.SC_ConcreteInside_T", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("intro_characters.fans.super_fan", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.KalendraIce", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("Engine.DefaultFont.Texture0", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.Kalendra5", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.Kalendra4", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.Kalendra3", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.Kalendra2", class'Material',true))); Level.AddPrecacheMaterial(Material(DynamicLoadObject("SC_Intro.Screens.Kalendra1", class'Material',true))); super.UpdatePrecacheMaterials(); } simulated function UpdatePrecacheStaticMeshes() { super.UpdatePrecacheStaticMeshes(); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.SpotLightCone", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipL", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipJ", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipK", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipI", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipH", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipG", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipM", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipD", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipE", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipF", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipC", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipB", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipA", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipN", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Column.ColumnBreakChipO", class'StaticMesh',true))); Level.AddPrecacheStaticMesh(StaticMesh(DynamicLoadObject("SC-Intro_Meshes.Lift", class'StaticMesh',true))); } >jns/9:9:$$ G>nI uI &79:9:$&=$u9:9:$a L>&$&=- I %N G>r>>or} CV!Y G>>>qM Nވ*M 7,V,M  G>sMB9^ M+^ -S@6A G>u_fw\*R\>' G>wq] a@'69Dq9?,q69Dq9?,q69Dq9?,q-'- ( G>^5Q S E Q ,Nnr%m%}mE n?rHomQ m1n9?%r9D9?rnrHOr G!>x=qÌ *-(-(-'- '>w0*0a=W w=*=-R=@'-j_9:9:$ wG*=-k$a b#wk$*k$F%=k$ E%W -[$'%e b HG'7%ae b 9:9:$#>-j'9:9:$ r= ca  # Awc*ca*a $?Tw=*R=='w=*9:9:$-R=@='&$F q!Hwk$* u.=W  G>bclass DecoText extends Object native; var() String TextName; var() array Rows; >p>>>>D\ U V 7\ Ktp%r%rV t?pNor\ r5t9?%p9D9?ptpNLp G!>~zgK> B d< B6 G >l>>>>ABea$ #< 7[[ G >Hc V ^` c ,IBl%%}` B?lNoc 1B9?%l9D9?lBlNJl G!>p// ==================================================================== // Class: XGame.CrowdTrigger // Parent: Engine.Triggers // // When triggered, tells a group of Crowd Pawns to play a given animation // ==================================================================== class CrowdTrigger extends Triggers; struct AnimParams { var() name SeqName; var() float Rate; var() float TweenTime; var() float OffsetClamp; }; var(Crowd) export editinline array Anims; // Info about what sequence to have the pawns play var(Crowd) export float MaxDelay; event Trigger( Actor Other, Pawn EventInstigator ) { local int i,max; local Intro_Crowd C; max = Anims.Length; if (max>0) { Foreach AllActors(class 'Intro_Crowd',c,event) { i = rand(max); C.MultiSetup(frand()*MaxDelay, Anims[i].SeqName, Anims[i].Rate, Anims[i].TweenTime, Anims[i].OffsetClamp); } } } >>>>>i,//============================================================================= // InstaGib - all hits are instant kill! old sk00l //============================================================================= class MutInstaGib extends Mutator config; var name WeaponName, AmmoName; var string WeaponString, AmmoString; var config bool bAllowTranslocator; var config bool bAllowBoost; var localized string TranslocDisplayText, BoostDisplayText, TranslocDescText, BoostDescText; static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.RulesGroup, "bAllowTranslocator", default.TranslocDisplayText, 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bAllowBoost", default.BoostDisplayText, 0, 1, "Check"); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "bAllowTranslocator": return default.TranslocDescText; case "bAllowBoost": return default.BoostDescText; } return Super.GetDescriptionText(PropName); } simulated function BeginPlay() { local xPickupBase P; local Pickup L; foreach AllActors(class'xPickupBase', P) { P.bHidden = true; if (P.myEmitter != None) P.myEmitter.Destroy(); } foreach AllActors(class'Pickup', L) if ( L.IsA('WeaponLocker') ) L.GotoState('Disabled'); Super.BeginPlay(); } function PostBeginPlay() { Super.PostBeginPlay(); if ( bAllowBoost && (TeamGame(Level.Game) != None) ) TeamGame(Level.Game).TeammateBoost = 1.0; if ( bAllowTranslocator ) DeathMatch(Level.Game).bOverrideTranslocator = true; } function string RecommendCombo(string ComboName) { if ( (ComboName != "xGame.ComboSpeed") && (ComboName != "xGame.ComboInvis") ) { if ( FRand() < 0.65 ) ComboName = "xGame.ComboInvis"; else ComboName = "xGame.ComboSpeed"; } return Super.RecommendCombo(ComboName); } function bool AlwaysKeep(Actor Other) { if ( Other.IsA(WeaponName) || Other.IsA(AmmoName) ) { if ( NextMutator != None ) NextMutator.AlwaysKeep(Other); return true; } if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if ( Other.IsA('Weapon') ) { if ( Weapon(Other).bNoInstagibReplace ) { bSuperRelevant = 0; return true; } if ( Other.IsA('TransLauncher') && bAllowTranslocator ) { bSuperRelevant = 0; return true; } if ( !Other.IsA(WeaponName) ) { Level.Game.bWeaponStay = false; return false; } } if ( Other.IsA('Pickup') ) { if ( Other.bStatic || Other.bNoDelete ) Other.GotoState('Disabled'); return false; } bSuperRelevant = 0; return true; } >a>>{)d`Cw-a'@rxE~,p dm B6af af  d -)$derr%-)$dex%-)$deGE%-)$det~%-)$deG GYpT2KԸjWʁ),e  V= AdrenalineL]No AdrenalineB].-Adrenaline pickups are removed from the map.>>>>JNF Ь G>O>>>>MG| 0MG, t   -Ea/!` a0$$?a0$$? age$@ HC G>>>E>>_F0"9:Fz G >PUdQqj7ynj%xPl jal y$Mx G>V>>W>>X>>j>>v//============================================================================= // NoAdrenaline - disables all the super cool combo moves //============================================================================= class MutNoAdrenaline extends Mutator; function bool IsRelevant(Actor Other, out byte bSuperRelevant) { if ( Other.IsA('AdrenalinePickup') ) { bSuperRelevant = 0; return false; } if ( Controller(Other) != None ) Controller(Other).bAdrenalineEnabled = false; return Super.IsRelevant(Other, bSuperRelevant); } >O>>TfC/acq C6f6a Af?{{a(#??{f{c333?{#a!s L>^{c333a!u L>^4{q 9?%a!x L>^Pa!Ca!C L>^a!u L> G>>>d@>>s p \ x[R{6mp d6mp Rwd*jdi G!>A\|7z z  G ckS2`&,7KjW  V] JumpingL] QuadJumpB]%$When double jump just isn't enough.>>[_MRR w* ^u B6_6[_?gqg_g^333?g#a!l = g^333a!m = gu 9?%a!p = a!q = G>9>>g //============================================================================= // QuadJump - Allows you to quad-jump instead of the normal double jump! //============================================================================= class MutQuadJump extends Mutator; function ModifyPlayer(Pawn Other) { local xPawn x; x = xPawn(Other); if(x != None) { // Increase the number of times a player can jump in mid air x.MaxMultiJump = 3; x.MultiJumpRemaining = 3; // Also increase a bit the amount they jump each time x.MultiJumpBoost = 50; } Super.ModifyPlayer(Other); } >@>m>>>>>ah} |kXe.%i%Pi7Fw.i*.i-w.i*?a $oa $oD-9:9:$9:9:$Bi0Q7T7#̌?a V7 Q7"@ if-- w*a/!R9: %e.9: :W#?y W#A~a|{y W( X:wX*e.9:Xae.v$o C G>e.>>A(a E=  G >D @> >bh z b  ow6Bb*gr*6Bbyb,6Bbyb G>>>ktXJth G>>>i}b L D b4}}{6D }F G pp}mod.} '}wF *D F G-6D }D  G!>@> >gE!{ G>qDh {& G>rtxϽ g G>>>svy  G>>>^)yW8c{$9D9?B/yQy,2e,HBQ9?,2HB9?{$ G>}$*1a ~ } .U9?%U G>{$>>w{Z^ w0* G>>>z| tbT | 4wT*TT_pWARNING - Couldn't create combo |  G>D{ pN u~ v} wUxE{ 9?%a{ (K$ G>Jsc > )s G3%>|@ T w@ * r0*0a@ .#p9V0}@ !Lm%@ !Tm&@ !Sm,@ !Rm,m,m.9=& G>@> >BL> G>>>ArJ>r G%>A S*!7S%7SS(A  G>Cqum>>qJ>WrK*Ka [Ka>9?,($-'FX>( G>mhb  o G >E_(X$-(>9?&JFX>( G>GC F@spw*RC E -G pw. *. RC E -G  G>FNV#H:r6R b*.PlayerPictures.cDefault 6R b G>mpd =} )p G2%>@>>He 'bb_w*9:9:$>-`E__-m  G>Lou 5P-\Ewo*ro Sl$oPl$@FqL-\F*'on-\FSl$'LFX>(-`E-m  G>>>lJ i \ Jl G >MH eND-\H 9:9:$-\hH $Ia/!m-p$FSH 'LFX>'F*' G>K@>>Pm| k<2Nիm6NN G>@>>N>>Q@>>R+~wW:--  9:9:$9:9:$(6B06B0^_k9:9:$-(9:+9:$j^9:+9:$j^9:+9:$j_9:+9:$j_M#?jjMjBw-ar0q0jM(#???rw-*$w--r.w-*(9:+9:$G#^t"_V9:+9:$G#9?^t"_V09:+9:$G#9?_t"^VV9:+9:$G#_t"^yw.*t"#[/+G#t" GEZK@Wzٰ؂u\Sb,MS>>^>>Z class ComboSpeed extends Combo; var xEmitter LeftTrail, RightTrail; function StartEffect(xPawn P) { LeftTrail = Spawn(class'SpeedTrail', P,, P.Location, P.Rotation); P.AttachToBone(LeftTrail, 'lfoot'); RightTrail = Spawn(class'SpeedTrail', P,, P.Location, P.Rotation); P.AttachToBone(RightTrail, 'rfoot'); P.AirControl *= 1.4; P.GroundSpeed *= 1.4; P.WaterSpeed *= 1.4; P.AirSpeed *= 1.4; P.JumpZ *= 1.5; } function StopEffect(xPawn P) { if (LeftTrail != None) LeftTrail.Destroy(); if (RightTrail != None) RightTrail.Destroy(); Level.Game.SetPlayerDefaults(P); } YL2Z= . $BB3}Zs  y]Speed!C$Ax5P'+"+++>>^l E6.SC-Intro_Meshes.SpotLightCone '@.SC-Intro_Meshes.Column.ColumnBreakChipL '@.SC-Intro_Meshes.Column.ColumnBreakChipJ '@.SC-Intro_Meshes.Column.ColumnBreakChipK '@.SC-Intro_Meshes.Column.ColumnBreakChipI '@.SC-Intro_Meshes.Column.ColumnBreakChipH '@.SC-Intro_Meshes.Column.ColumnBreakChipG '@.SC-Intro_Meshes.Column.ColumnBreakChipM '@.SC-Intro_Meshes.Column.ColumnBreakChipD '@.SC-Intro_Meshes.Column.ColumnBreakChipE '@.SC-Intro_Meshes.Column.ColumnBreakChipF '@.SC-Intro_Meshes.Column.ColumnBreakChipC '@.SC-Intro_Meshes.Column.ColumnBreakChipB '@.SC-Intro_Meshes.Column.ColumnBreakChipA '@.SC-Intro_Meshes.Column.ColumnBreakChipN '@.SC-Intro_Meshes.Column.ColumnBreakChipO '-.SC-Intro_Meshes.Lift ' G>U@>>M class ComboMessage extends LocalMessage; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return class(OptionalObject).default.ExecMessage; } static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if ( class(OptionalObject).default.ComboAnnouncementName != '' ) P.PlayRewardAnnouncement(class(OptionalObject).default.ComboAnnouncementName,1,true); } >h c1):.intro_characters.CubeMaps.GdFace1 ':.intro_characters.CubeMaps.BRFace1 ':.intro_characters.CubeMaps.ChFace1 '<.intro_characters.CubeMaps.SkinFace1 ':.intro_characters.brock.brock_head ':.intro_characters.brock.brock_body '<.intro_characters.malcom.malcom_head '<.intro_characters.malcom.malcom_body '<.intro_characters.lauren.lauren_head '-.Engine.GRADIENT_Fade 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a00 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a01 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a11 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a02 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a12 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a03 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a13 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a04 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a14 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a05 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a15 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a06 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a16 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a07 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a00 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a08 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a01 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a09 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a02 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a10 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a03 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a11 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a04 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a12 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a05 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a13 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a06 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a14 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a07 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a15 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a08 'I.intro_characters.CrowdMale5Sprite.CrowdMale5_a16 'I.intro_characters.CrowdMale1Sprite.CrowdMale1_a09 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a01 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a11 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a00 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a01 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a00 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a01 '8.SC_Intro.Screens.NoiseLines_a00 '8.SC_Intro.Screens.NoiseLines_a01 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a00 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a02 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a12 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a02 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a02 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a03 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a13 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a03 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a03 '3.MapThumbnails.ShotAsbestos 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a04 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a14 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a04 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a04 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a05 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a15 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a05 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a05 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a06 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a16 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a06 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a06 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a07 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a00 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a07 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a07 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a08 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a01 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a08 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a08 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a09 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a02 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a09 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a09 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a10 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a03 'I.intro_characters.CrowdMale3Sprite.CrowdMale3_a10 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a10 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a11 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a04 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a11 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a12 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a05 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a12 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a13 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a06 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a13 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a14 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a07 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a14 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a15 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a08 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a15 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a16 'I.intro_characters.CrowdMale2Sprite.CrowdMale2_a09 'I.intro_characters.CrowdMale4Sprite.CrowdMale4_a16 '0.MapThumbnails.ShotFace3 'I.intro_characters.CrowdMale6Sprite.CrowdMale6_a17 '2.MapThumbnails.shotPhobos2 '2.MapThumbnails.ShotInferno '4.MapThumbnails.ShotSunTemple '8.MapThumbnails.shotscorchedearth ':.SC_Intro.Screens.SC_BrockScreen_T ';.SC_Intro.Screens.SC_LaurenScreen_T '=.SC_Intro.SpotLights.SC_SpotlightGrad '>.SC_Intro.SpotLights.SC_SpotlightNoise '=.SC_Intro.SpotLights.SC_SpotlightOn_T '@.SC_Intro.SpotLights.SC_SpotlightOnMsk_T '=.SC_Intro.Screens.JM_AmbrosiaScreen_T '<.SC_Intro.Screens.JM_NikolaiScreen_T '8.intro_characters.fans.fan_chick ':.intro_characters.gorge.gorge_head ':.intro_characters.gorge.gorge_body 'B.intro_characters.jug_chick.Jug_chick_body 'B.intro_characters.jug_chick.jug_chick_head '<.intro_characters.nikoli.nikoli_body '7.intro_characters.nikoli.nikoli '5.SC_Intro.SC_ConcreteInside_T '8.intro_characters.fans.super_fan '5.SC_Intro.Screens.KalendraIce '4.Engine.DefaultFont.Texture0 '3.SC_Intro.Screens.Kalendra5 '3.SC_Intro.Screens.Kalendra4 '3.SC_Intro.Screens.Kalendra3 '3.SC_Intro.Screens.Kalendra2 '3.SC_Intro.Screens.Kalendra1 ' G>OfD 6 Df G >S)hD}- - Caw.*z&69?Z o$-h0$ $n B G>nW wC*Ca G>`cuUz%9:9:$ G>>>^!`A t-`u69?,da^w.*.-'D-`z&'-`-`0$$n B'( G>>>T3| J/B=x  oR6-(hw*x o-(w*w*x o-( G > gL w*$ G>R3lxq6r6Bl*B=l  oR6[6Bla6bl[ xll  oR6[ xl b G>i Cs >>>ibA- (-( G>lg0g 0g G>Ce G>>>mc):f )c G>h// ==================================================================== // Class: XGame.Intro_Crowd // Parent: XGame.xIntroPawn // // ==================================================================== class Intro_Crowd extends xIntroPawn; var(Crowd) export editinline array AvailableMeshes; // Available meshes to pick from var Name nextSeq; var float nextRate; var float nextTween; var float nextOffset; // Assign a random mesh to the pawn if any have been provided event PostBeginPlay() { if (AvailableMeshes.Length>0) { LinkMesh(AvailableMeshes[rand(AvailableMeshes.Length)],false); } Super.PostBeginPlay(); } function MultiSetup(float delay, name AnimSeq, float AnimRate, float AnimTween, float AnimOffsetClamp) { nextSeq = AnimSeq; nextRate = AnimRate; nextTween = AnimTween; nextOffset = AnimOffsetClamp; if (delay>0) SetTimer(delay,false); else Timer(); } event Timer() { LoopAnim(nextSeq, nextRate, nextTween); if (NextOffset>0) SetAnimFrame( frand()*NextOffset); } >>>pc ax G>sPHq G >vu L  G>>>uM }9:M 9:$-j:wG*G'7%-j'Ga  # AwG*Ga*a $? M  G>a%$ yr.*a pa%,a%./a $?. zD?a@?( ._a G>p@>>wM H&#9:9:$-'a0$ G>zn@V-[$-C/ w9:9:$<-h-C/ q-rNlXr#zC_ r#?9? l_  q-N#Npz ff&?)69?%l# B_ N#?9?6_ ?6_ ?6_ 9?, l_ lN lp9?%I9?,L> lN lpuwq*9:9:$-Rqq' q-{!O v ,a!O L>v SSn%wz*za/!c.z-`n9?,z xz _pwx#?U wpwU uu?N9?, Nx9?nzD6N6No$NN NN-'6%69DNuoI66oo6%-'- (ntp#` ]wz*tz pL>#333@7t#?L>#333@X` nq9Pt G}e|2|jW3},e,e,eh,eh,eh,eh,eh,e  q $@V]RegenL] RegenerationB] All players regenerate health.>>D //============================================================================= // MutRegen - regenerates players //============================================================================= class MutRegen extends Mutator; #exec OBJ LOAD File=MutatorArt.utx var() float RegenPerSecond; // Don't call Actor PreBeginPlay() for Mutator event PreBeginPlay() { SetTimer(1.0,true); } function Timer() { local Controller C; for (C = Level.ControllerList; C != None; C = C.NextController) { if (C.Pawn != None && C.Pawn.Health < C.Pawn.HealthMax ) { C.Pawn.Health = Min( C.Pawn.Health+RegenPerSecond, C.Pawn.HealthMax ); } } } B^Q2~7jW̅3}  V]CorpseTimeScaleL]Slow Motion CorpsesB]Death should not be rushed.>>gJamNw^*^a.w\*\a da G>d@A&xcB Y6A0&Ƞ <b]intro_brockfan.intro_brockfan>>z //============================================================================= // SlomoDeath - slows down the ragdoll simulation! //============================================================================= class MutSlomoDeath extends Mutator; function PostBeginPlay() { // Change the overall speed at which karma is evolved for in the level. Level.RagdollTimeScale = 0.3; } function ModifyPlayer(Pawn Other) { local xPawn x; x = xPawn(Other); if(x != None) { // Increase the amount of time that ragdolls hang around for as well... x.RagdollLifeSpan = 18; } Super.ModifyPlayer(Other); } DQN2 C?[jW̊!3}Zs3}Zs3}Zso>+  V] SpeciesL]Species StatisticsB])(Each race has unique combat statistics.>>_ //============================================================================= // MutSpeciesStats - species specific stats for players //============================================================================= class MutSpeciesStats extends Mutator; function PostBeginPlay() { local GameRules G; Super.PostBeginPlay(); G = spawn(class'SpeciesGameRules'); if ( Level.Game.GameRulesModifiers == None ) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); } function ModifyPlayer(Pawn Other) { local xPawn xp; Super.ModifyPlayer(Other); xp = xPawn(Other); if(xp == None) return; xp.Species.static.ModifyPawn(xp); } >>>I@E>B(@E>G@E>H@E>h^,lp^a , , , ,^!I\a , , , ,\!J,33?,33?,33?,33?,? G>cclass MultiKillMessage extends LocalMessage; var localized string KillString[7]; var sound KillSound[7]; // OBSOLETE var name KillSoundName[7]; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( class'PlayerController'.default.bNoMatureLanguage ) return Default.KillString[Min(Switch,6)-1]; else return Default.KillString[Min(Switch,7)-1]; } static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if ( class'PlayerController'.default.bNoMatureLanguage ) P.PlayRewardAnnouncement(Default.KillSoundName[Min(Switch-1,5)],1,true); else P.PlayRewardAnnouncement(Default.KillSoundName[Min(Switch-1,6)],1,true); } static function int GetFontSize( int Switch, PlayerReplicationInfo RelatedPRI1, PlayerReplicationInfo RelatedPRI2, PlayerReplicationInfo LocalPlayer ) { if ( Switch < 4 ) return 0; if ( Switch == 4 ) return 1; if ( Switch == 7 ) return 3; return 2; } >_ >> {`< r * G>Ms$D baI -h(s.w.$*r.$w..$*s-'I@a?( s-(wa?( G>q /}qa f Qr*qw ~qa G>Ny^i ;8-h(yI`@8yy G>Wc XQHc j.c (rj* j[ Ej G>gS[m [ e G>hYlIY epB G>>>gVTmwO*Oa G>Y$9:.9:$.|,9D. 9?.. .W, G>| ;z|a h Qr*|w ~| G>>Z>hO_le[I9:_9:$Oa _ _ _ afff?'$ G> s[z@7s@%/a0 \f t@f OpS6Xts6Wts6Vts6Uts10 G>\>>t>>_RX=}.R/w}*}F AR G> f> GuOM2 `Q<jW3}Zs3}Zs3}Zso>+  V] VampireL] VampireB]('Damaging your opponents will heal you.>>gjJ mnwF*Fa[J uw[*^[a/!K.[m [[+J -`( G>Hvzva/Q vv!>/a0 k k zvv10 G>fK$KwK*wK*39?KKK9D9?KN9DKKK G>NO { a?' G>dkf 0"-l 9:k9:$F-Pw9?k k6w6k -OVHwVHի?VwHka/!w-l .kv .kE ko$k w G>lclass ComboInvis extends Combo; function StartEffect(xPawn P) { P.SetInvisibility(60.0); } function StopEffect(xPawn P) { P.SetInvisibility(0.0); } >B4'/a9 _u.% _.& __-T&-J&10n G>hFMlcI9:M9:$Fa M M M uwM*MEM-`' G>MX J\].MNw]*][ ,]z,]Z ,2M G>r)AJ\  \ JAA  A  A  A  A  A  A  A  A  A   G >lcDm S 6 Dcc  c  c   G >>>gJaD,U.6rU*rU*a wU*$wU*J9?,UiJy UUa G> bb KXba/!nI$(Dw.b*.b-( bI G>> hRR2r$k/J $  y= Invisible!x5q&+"+++>>qhT' G>>>T//============================================================================= // MutVampire - steals health from other players //============================================================================= class MutVampire extends Mutator; function PostBeginPlay() { local GameRules G; Super.PostBeginPlay(); G = spawn(class'VampireGameRules'); if ( Level.Game.GameRulesModifiers == None ) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); Destroy(); } > xh] Yha/!K5.h-e$'^ha/!A-Ge$'ha/z -((ha/!xh-h-hq!f6(e$' G>>>}hhJpKha/z ha/DIw* hh'kw* hh( G>@>>V class ComboDefensive extends Combo; var xEmitter Effect; function StartEffect(xPawn P) { if (P.Role == ROLE_Authority) Effect = Spawn(class'RegenCrosses', P,, P.Location, P.Rotation); SetTimer(0.9, true); Timer(); } function Timer() { if (Pawn(Owner).Role == ROLE_Authority) { Pawn(Owner).GiveHealth(5, Pawn(Owner).SuperHealthMax); if ( Pawn(Owner).Health == Pawn(Owner).SuperHealthMax ) Pawn(Owner).AddShieldStrength(5); } } function StopEffect(xPawn P) { if ( Effect != None ) Effect.Destroy(); } zUS2 {Rb $Bhhhhhh  y] Booster!x5}+"+++>>>> `(aj=y{axGame.ComboSpeed{axGame.ComboInvisaff&?axGame.ComboInvisyaxGame.ComboSpeed a G>m{nyN8/a0 V{4{~{10 G>J@\+n L G>@>>pz0w-r.p*.pM t-$w.p.pr G>G@>>AFp BJGrF/a3 sFEsMsrF10 G>>>z3vfcUw.v*.v}#v G>Cx`Pn;x?@xx@@@xk@?xx@@@x G> EIg|nwI*wI*.I}?I  I G>>>FCa[y Cwc* l-|l||9?9D|| C6.c  9C`|| 6.c  H G>KGW2MG.JwG*mGJrG0G0* G>Qe ,a G>I{|r /-7%Uu &UA$`r*7%lP&lA9=,%7%Wp &W7%Vs &VA9=/a9 p{n {XA{410 G>w3Q_.'%.k OwO*wO*Oa/!HO ~OO;r*-[ 'w*$a/!ox.*WLe-[ @@9?&_@@ball_tossed9?,p An@j@ball_thrown_finalU@9?&_@ball_carried9?,pAn@j@ball_cap_final9?&kP%%P7.wP.*@rP.kk?PNpkQN?N?kNnNnP%_P7.UwP.*@rP.jP.Nball_score_assistP.9?9DNPr fc x %**j/-  %99?OteamscorelimitWW- Otimelimit &- .x. `9?  G>M@7(w%Y*.%Y @Pw&Y*.&Y } wc*lc} c}  G>d RR. rR*a Awb *ab $@vw\ *a\ R R R lR G>H//============================================================================= // Merc Male Voice. //============================================================================= class MercMaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax RY6S#b =+  [.''                      Duck Faster Next TimeHold Still Dammit  Holy Shit('Just Hold Still And I'll Make It Quick  Kill Em All Nailed HimNot Even Close Step Aside Suck On ThisTry Turning The Safety OffYou Die Too EasilyIJust Hold StillI" 2                  Not Bad   K"Z.MMale Mercenary>>P~ rN2d-r*M*/a3 c[Mcb*10~w* r* r*w*wrw ww* 9?&@ 9:rw*9=,+9=we-@ 9:.Rww*ZCp.er*-$7%Uu &Uw*-'w*-'-9=,C9=,$7%lP&lw*-(% \ \w*-(% n n%$$C$7%Wp &Ww*-(% Z Zw*-(% h h$$C$7%Vs &Vw*-(% [ [w*-(% k k/a9 ~ n .~ z10 G>~//============================================================================= // xWeaponBase //============================================================================= class xWeaponBase extends xPickUpBase placeable; #exec OBJ LOAD FILE=2k4ChargerMeshes.usx var() class WeaponType; function bool CheckForErrors() { if ( (WeaponType == None) || WeaponType.static.ShouldBeHidden() ) { log(self$" ILLEGAL WEAPONTYPE "$Weapontype); return true; } return Super.CheckForErrors(); } function byte GetInventoryGroup() { if (WeaponType != None) return WeaponType.Default.InventoryGroup; return 999; } simulated function PostBeginPlay() { if (WeaponType != None) { PowerUp = WeaponType.default.PickupClass; if ( WeaponType.Default.InventoryGroup == 0 ) bDelayedSpawn = true; } Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-2)); // adjust because reduced drawscale } UnB V;"&ՊqYԊqYԊqYԊqYa @6A6:5l@L6$?&P"$?,Y ;$pB1$@@>>^#class xWeaponAttachment extends WeaponAttachment; // player animation specification var() bool bHeavy; var() bool bRapidFire; var() bool bAltRapidFire; var vector mHitNormal; var actor mHitActor; var Weapon LitWeapon; simulated function GetHitInfo() { local vector HitLocation, Offset; // if standalone, already have valid HitActor and HitNormal if ( Level.NetMode == NM_Standalone ) return; Offset = 20 * Normal(Instigator.Location - mHitLocation); mHitActor = Trace(HitLocation,mHitNormal,mHitLocation-Offset,mHitLocation+Offset, false); NetUpdateTime = Level.TimeSeconds - 1; } simulated function Hide(bool NewbHidden) { bHidden = NewbHidden; } simulated event ThirdPersonEffects() { if (Level.NetMode != NM_DedicatedServer) { if ( xPawn(Instigator) == None ) return; if (FlashCount == 0) { xPawn(Instigator).StopFiring(); } else if (FiringMode == 0) { xPawn(Instigator).StartFiring(bHeavy, bRapidFire); } else { xPawn(Instigator).StartFiring(bHeavy, bAltRapidFire); } } } simulated function PostNetBeginPlay() { if ( Instigator != None && xPawn(Instigator) != None ) { xPawn(Instigator).SetWeaponAttachment(self); } } simulated function Vector GetTipLocation() { local Coords C; C = GetBoneCoords('tip'); return C.Origin; } simulated function WeaponLight() { if ( (FlashCount > 0) && !Level.bDropDetail && (Instigator != None) && ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != None)) ) { if ( Instigator.IsFirstPerson() ) { LitWeapon = Instigator.Weapon; LitWeapon.bDynamicLight = true; } else bDynamicLight = true; SetTimer(0.15, false); } else Timer(); } function InitFor(Inventory I) { Super.InitFor(I); if ( xPawn(I.Instigator) == None ) return; if ( xPawn(I.Instigator).bClearWeaponOffsets ) SetRelativeLocation(vect(0,0,0)); } simulated function Timer() { if ( LitWeapon != None ) { LitWeapon.bDynamicLight = false; LitWeapon = None; } bDynamicLight = false; } >TA ](!q4--A .R9?&--A **r G>Vclass xVoicePack extends TeamVoicePack; var EVoiceGender VoiceGender; static function byte GetMessageIndex(name PhraseName) { local float r; r = FRand(); if ( PhraseName == 'GOTENEMYFLAG' ) return 2; if ( PhraseName == 'INJURED' ) { if ( r < 0.3 ) return 6; else if ( r < 0.5 ) return 13; else return 4; } else if ( PhraseName == 'GOTOURFLAG' ) return 8; else if ( PhraseName == 'NEEDBACKUP' ) { if(r<0.5) return 13; else return 22; } else if ( PhraseName == 'NEEDOURFLAG' ) return 1; else if ( PhraseName == 'ENEMYFLAGCARRIERHERE' ) return 12; else if ( PhraseName == 'ENEMYBALLCARRIERHERE' ) return 15; else if ( PhraseName == 'INCOMING' ) { if(r < 0.33) return 20; else if(r < 0.66) return 21; else return 14; } else if ( PhraseName == 'GOTYOURBACK' ) return 3; else if ( PhraseName == 'MANDOWN' ) return 5; else if ( PhraseName == 'INPOSITION' ) return 9; else if ( PhraseName == 'ONMYWAY' ) return 10; } >XZ4"a@(K G>Z$:# * G>[| xA#'"r| *9:9:{ '( G>L//============================================================================= // Merc Female Voice. //============================================================================= class MercFemaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax >\ >>`>>>>J =}Ja9:9:$a E  Ka  K7%lP&l G>J =}Ja9:9:$a I  Ka  K7%lP&l G>]class xVictimMessage extends LocalMessage; var(Message) localized string YouWereKilledBy, KilledByTrailer; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if (RelatedPRI_1 == None) return ""; if (RelatedPRI_1.PlayerName != "") return Default.YouWereKilledBy@RelatedPRI_1.PlayerName$Default.KilledByTrailer; } >Oga]*G>y4 wy* 9:,w9:y*....%9:y G>ex Qyx 4 G>$ W%,w*w*a/!H ~?8,w*w.*.m5!i$'TJ& ,c &TT&%H-&H- w* w*-F 9=qw*a  a+ w*Yw.*w.0*.0aYw.K*.Ka._9Dda  a+  #G('z"wz"*z"a/!A.z" K1%*(z"z"k w*4G   /a9 C0=C0a10_k%wr_*/a9 _vv10w_* _Y  G>wclass xUtil extends Object native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() protected const string SectionName; var() protected const string FileExtension; struct native init PlayerRecord { var() String DefaultName; // Character's name, also used as selection tag var() class Species; // Species var() String MeshName; // Mesh type var() String BodySkinName; // Body texture name var() String FaceSkinName; // Face texture name var() Material Portrait; // Menu picture var() String TextName; // Decotext reference var() String VoiceClassName; // voice pack class name - overrides species default var string Sex; var string Accuracy; var string Aggressiveness; var string StrafingAbility; var string CombatStyle; var string Tactics; var string ReactionTime; var string Jumpiness; var string Race; var string FavoriteWeapon; var string Menu; // info for menu displaying characters var string Skeleton; // skeleton mesh, if it differs from the species default var() const int RecordIndex; var string Ragdoll; var byte BotUse; // weighting for use by bots var bool UseSpecular; var bool TeamFace; var bool ZeroWeaponOffsets; }; struct MutatorRecord { var() const class mutClass; var() const string ClassName; var() const string FriendlyName; var() const string Description; var() const string IconMaterialName; var() const string ConfigMenuClassName; var() const string GroupName; var() const int RecordIndex; var const byte bActivated; }; var() private const transient CachePlayers CachedPlayerList; var localized string NoPreference, FavoriteWeapon; var localized string AgilityString,TacticsString,AccuracyString,AggressivenessString; native(562) final simulated static function GetPlayerList(out array PlayerRecords); native(563) final simulated static function PlayerRecord GetPlayerRecord(int index); native(564) final simulated static function PlayerRecord FindUPLPlayerRecord(string charName); native final static function DecoText LoadDecoText(string PackageName, string DecoTextName, optional int ColumnCount); // Deprecated - use CacheManager.GetMutatorList instead. final static function GetMutatorList( array MutatorRecords ) { } final simulated static function PlayerRecord FindPlayerRecord(string charName) { local PlayerRecord PRE; local class PRClass; PRE = FindUPLPlayerRecord(charName); if ( PRE.DefaultName != charName ) { // try to dynamic load downloaded character class object PRClass = class(DynamicLoadObject(charname$"mod."$charName,class'Class',true)); if ( PRClass != None ) { PRE = PRClass.Static.FillPlayerRecord(); PRE.DefaultName = charname; } } return PRE; } final simulated static function int GetSalaryFor(PlayerRecord PRE) { local float Salary; Salary = 500; if ( PRE.FavoriteWeapon == "" ) Salary += 5; Salary += 30 * float(PRE.Jumpiness); Salary += 150 * float(PRE.Accuracy); if ( float(PRE.Accuracy) > 0.3 ) Salary += 250 * (float(PRE.Accuracy) - 0.3); Salary += 70 * float(PRE.Tactics); if ( float(PRE.Tactics) > 0.5 ) Salary += 100 * (float(PRE.Tactics) - 0.5); Salary += 100 * float(PRE.StrafingAbility); if ( float(PRE.StrafingAbility) > 0.5 ) Salary += 100 * (float(PRE.StrafingAbility) - 0.5); Salary -= 5 * Abs(float(PRE.Aggressiveness)); Salary -= 5 * Abs(float(PRE.CombatStyle)); return int(Salary); } // returns human-readable version of the favorite weapon, or 'no preference' final simulated static function string GetFavoriteWeaponFor(PlayerRecord PRE) { local class WeaponClass; if ( PRE.FavoriteWeapon != "" ) { WeaponClass = class(DynamicLoadObject(PRE.FavoriteWeapon, class'Class')); if (WeaponClass != None) return Default.FavoriteWeapon@WeaponClass.default.ItemName; } return Default.NoPreference; } final simulated static function int RatingModifier(string CharacterName) { local int Hash; Hash = Asc(CharacterName); if ( Hash == 2 ) Hash = 1; return ( Hash%5 - 2); } final simulated static function int AccuracyRating(PlayerRecord PRE) { if ( 2 * float(PRE.Accuracy) < -1 ) return ( 55 + 8 * FMax(-7,2 * float(PRE.Accuracy)) ); if ( 2 * float(PRE.Accuracy) == 0 ) return ( 75 - RatingModifier(PRE.DefaultName) ); if ( 2 * float(PRE.Accuracy) < 1 ) return ( 75 + 20 * 2 * float(PRE.Accuracy) - 0.5 * RatingModifier(PRE.DefaultName) ); return Min(100, 95 + 2 * float(PRE.Accuracy) ); } final simulated static function int AgilityRating(PlayerRecord PRE) { local float Add; Add = 3 * float(PRE.Jumpiness); if ( float(PRE.StrafingAbility) < -1 ) return ( Add + 58 + 8 * FMax(-7,float(PRE.StrafingAbility)) ); if ( (Add == 0) && (float(PRE.StrafingAbility) == 0) ) return ( 75 + 0.5 * RatingModifier(PRE.DefaultName) ); if ( float(PRE.StrafingAbility) < 1 ) return ( Add + 75 + 17 * float(PRE.StrafingAbility) - 0.5 * RatingModifier(PRE.DefaultName) ); return Min(100, Add + 92 + float(PRE.StrafingAbility) ); } final simulated static function int TacticsRating(PlayerRecord PRE) { if ( float(PRE.Tactics) < -1 ) return ( 55 + 8 * FMax(-7,float(PRE.Tactics)) ); if ( float(PRE.Tactics) == 0 ) return ( 75 + RatingModifier(PRE.DefaultName) ); if ( float(PRE.Tactics) < 1 ) return ( 75 + 20 * float(PRE.Tactics) + 0.5 * RatingModifier(PRE.DefaultName) ); return Min(100, 95 + float(PRE.Tactics) ); } final simulated static function int AggressivenessRating(PlayerRecord PRE) { return Clamp(73 + 25 * (float(PRE.Aggressiveness) + float(PRE.CombatStyle)) + 0.5 * RatingModifier(PRE.DefaultName),0,100); } ///////////////////// TEAM EVALUATION FUNCTIONS ///////////////////// // These functions used to provide average values for team, or just lineup // if optional bool is set final simulated static function int TeamAccuracyRating ( GameProfile GP, optional int lineupsize) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(GP.LINEUP_SIZE, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AccuracyRating(FindPlayerRecord(GP.PlayerTeam[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AccuracyRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamInfoAccuracyRating ( UnrealTeamInfo UT, optional int lineupsize) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(UT.RosterNames.Length, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AccuracyRating(FindPlayerRecord(UT.RosterNames[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AccuracyRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamArrayAccuracyRating ( array Players ) { local int retval; local float count; local int i; local PlayerRecord PR; count = 0; retval = 0; for ( i=0; i < Players.length; i++ ) { count+=1.0; retval += AccuracyRating(FindPlayerRecord(Players[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AccuracyRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamAggressivenessRating ( GameProfile GP, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(GP.LINEUP_SIZE, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AggressivenessRating(FindPlayerRecord(GP.PlayerTeam[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AggressivenessRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamInfoAggressivenessRating ( UnrealTeamInfo UT, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(UT.RosterNames.Length, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AggressivenessRating(FindPlayerRecord(UT.RosterNames[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AggressivenessRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamArrayAggressivenessRating ( array Players ) { local int retval; local float count; local int i; local PlayerRecord PR; count = 0; retval = 0; for ( i=0; i < Players.length; i++ ) { count+=1.0; retval += AggressivenessRating(FindPlayerRecord(Players[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AggressivenessRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamAgilityRating ( GameProfile GP, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(GP.LINEUP_SIZE, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AgilityRating(FindPlayerRecord(GP.PlayerTeam[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AgilityRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamInfoAgilityRating ( UnrealTeamInfo UT, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(UT.RosterNames.Length, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += AgilityRating(FindPlayerRecord(UT.RosterNames[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AgilityRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamArrayAgilityRating ( array Players ) { local int retval; local float count; local int i; local PlayerRecord PR; count = 0; retval = 0; for ( i=0; i < Players.length; i++ ) { count+=1.0; retval += AgilityRating(FindPlayerRecord(Players[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = AgilityRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamTacticsRating ( GameProfile GP, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(GP.LINEUP_SIZE, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += TacticsRating(FindPlayerRecord(GP.PlayerTeam[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = TacticsRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamInfoTacticsRating ( UnrealTeamInfo UT, optional int lineupsize ) { local int retval; local float count; local int i; local PlayerRecord PR; local int numchars; numchars = Max(UT.RosterNames.Length, lineupsize); count = 0; retval = 0; for ( i=0; i < numchars; i++ ) { count+=1.0; retval += TacticsRating(FindPlayerRecord(UT.RosterNames[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = TacticsRating(PR); // purposefully uninitialized } return retval; } final simulated static function int TeamArrayTacticsRating ( array Players ) { local int retval; local float count; local int i; local PlayerRecord PR; count = 0; retval = 0; for ( i=0; i < Players.length; i++ ) { count+=1.0; retval += TacticsRating(FindPlayerRecord(Players[i])); } if ( count > 0 ) { retval = retval / count; } else { retval = TacticsRating(PR); // purposefully uninitialized } return retval; } final simulated static function int GetTeamSalaryFor ( GameProfile GP, optional int lineupsize ) { local int retval; local int i; local int numchars; numchars = Max(GP.LINEUP_SIZE, lineupsize); retval = 0; for ( i=0; i < numchars; i++ ) { retval += GetSalaryFor(FindPlayerRecord(GP.PlayerTeam[i])); } return retval; } final simulated static function int GetTeamInfoSalaryFor ( UnrealTeamInfo UT, optional int lineupsize ) { local int retval; local int i; local int numchars; numchars = Max(UT.RosterNames.Length, lineupsize); retval = 0; for ( i=0; i < numchars; i++ ) { retval += GetSalaryFor(FindPlayerRecord(UT.RosterNames[i])); } return retval; } simulated static function array > GetMutatorClasses(optional array MutClassNames) { local int i, j; local array > Arr; local array LocalRecords; class'CacheManager'.static.GetMutatorList(LocalRecords); if (MutClassNames.Length == 0) Arr.Length = LocalRecords.Length; for (i = 0; i < LocalRecords.Length; i++) { if (MutClassNames.Length == 0) { Arr[i] = class(DynamicLoadObject(LocalRecords[i].ClassName, class'Class')); continue; } for (j = 0; j < MutClassNames.Length; j++) { if (MutClassNames[j] ~= LocalRecords[i].ClassName) { Arr[Arr.Length] = class(DynamicLoadObject(LocalRecords[i].ClassName, class'Class')); break; } } } return Arr; } >wD  _aw^9:9:$D a p B "%D   G>T2class xTeamRoster extends UnrealTeamInfo; function PostBeginPlay() { local array PlayerRecords; local int i,j; Super.PostBeginPlay(); // add RosterNames to roster class'xUtil'.static.GetPlayerList(PlayerRecords); for ( i=0; i PlayerRecords; local xUtil.PlayerRecord PR; class'xUtil'.static.GetPlayerList(PlayerRecords); PR = class'xUtil'.static.FindPlayerRecord(botName); return class'xRosterEntry'.Static.CreateRosterEntry(PR.RecordIndex); } function Initialize(int TeamBots) { local int i; for ( i=Roster.Length; i PlayerRecords; local int RND,i, num; local int max, total; class'xUtil'.static.GetPlayerList(PlayerRecords); for ( i=0; i= RND ) break; } num = i; if ( AvailableRecord(PlayerRecords[num].Menu) && !AlreadyExistsEntry(PlayerRecords[num].DefaultName,false) ) return class'xRosterEntry'.Static.CreateRosterEntry(num); for ( i=num; i 0) && !AlreadyExistsEntry(PlayerRecords[i].DefaultName,false) ) return class'xRosterEntry'.Static.CreateRosterEntry(i); for ( i=0; i 0) && !AlreadyExistsEntry(PlayerRecords[i].DefaultName,false) ) return class'xRosterEntry'.Static.CreateRosterEntry(i); return GetNamedBot("Jakob"); } function bool AvailableRecord(string MenuString) { return ( (MenuString ~= "DUP") || (MenuString ~= "SP") || (MenuString ~= "") || (MenuString ~= "UNLOCK") ); } function bool AlreadyExistsEntry(string CharacterName, bool bNoRecursion) { local int i; for ( i=0; i PawnClass) { return true; } >w EwB9:9:$a p B " G>E//============================================================================= // Copyright 2001 Digital Extremes - All Rights Reserved. // Confidential. //============================================================================= class xTeamGame extends TeamGame; #exec OBJ LOAD FILE=TeamSymbols.utx // needed right now for Link symbols, etc. static function PrecacheGameTextures(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameTextures(myLevel); myLevel.AddPrecacheMaterial(Material'TeamSymbols.TeamBeaconT'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.LinkBeaconT'); myLevel.AddPrecacheMaterial(Material'XEffectMat.RedShell'); myLevel.AddPrecacheMaterial(Material'XEffectMat.BlueShell'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.soundBeacon_a00'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.soundBeacon_a01'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.soundBeacon_a02'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.soundBeacon_a03'); } static function PrecacheGameStaticMeshes(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); } ]Z6m 4 =+  [.''      Duck Faster Next TimeHold Still Dammit  Holy Shit('Just Hold Still And I'll Make It Quick  Kill Em All Nailed HimNot Even Close Step Aside Suck On ThisTry Turning The Safety OffIJust Hold StillI"2                  Not Bad   K"Z.]Female Mercenary>>^//============================================================================= // xTeamBanner. //============================================================================= class xTeamBanner extends Decoration; // todo: the white texture used for dom2 neutral state needs to be a shader so it can be 2-sided!!! var() byte Team; var GameReplicationInfo GRI; simulated function PostBeginPlay() { LoopAnim('AnimFlag'); SetAnimFrame(FRand()); Super.PostBeginPlay(); } simulated function UpdateForTeam() { if (Team == 0) Skins[0] = Shader'XGameShaders.RedBannerShader'; else if ( Team > 1 ) Skins[0] = Default.Skins[0]; //Shader'XGameShaders.TeamBannerShadder'; else Skins[0] = Shader'XGameShaders.BlueBannerShader'; if ( (GRI != None) && (Team < 2) && (GRI.TeamSymbols[Team] != None) ) TexScaler(Combiner(Shader(Skins[0]).Diffuse).Material2).Material = GRI.TeamSymbols[Team]; } simulated function SetGRI(GameReplicationInfo NewGRI) { GRI = NewGRI; UpdateForTeam(); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); } simulated function Trigger( actor Other, pawn EventInstigator ) { local DominationPoint DPoint; DPoint = DominationPoint(Other); if ( DPoint != None ) { // is the point disabled? if (!DPoint.bControllable) Team = 254; else if (DPoint.ControllingTeam == None) Team = 255; else Team = DPoint.ControllingTeam.TeamIndex; UpdateForTeam(); } } nbFBooUK?4TTTJ3}3}Zs- =1Hx" - =1.SrOS=tqL"$?,Yf;$@B1$BMJ@>>g"class xRosterEntry extends RosterEntry dependsOn(xUtil) transient; // FIXME - xRosterEntry is transient as quick fix for save games. Really should change new(None) below to new(xLevel), // but no easy way to do that without breaking compatibility var() xUtil.PlayerRecord PlrProfile; static function xRosterEntry CreateRosterEntry(int prIdx) { local xRosterEntry xre; local xUtil.PlayerRecord pr; pr = class'xUtil'.static.GetPlayerRecord(prIdx); xre = new(None) class'xRosterEntry'; xre.PlayerName = pr.DefaultName; xre.PawnClassName = "xGame.xPawn"; xre.PlrProfile = pr; xre.Init(); return xre; } static function xRosterEntry CreateRosterEntryCharacter(string CharName) { local xRosterEntry xre; local xUtil.PlayerRecord pr; pr = class'xUtil'.static.FindPlayerRecord(CharName); xre = new(None) class'xRosterEntry'; xre.PlayerName = pr.DefaultName; xre.PawnClassName = "xGame.xPawn"; xre.PlrProfile = pr; xre.Init(); return xre; } function PrecacheRosterFor(UnrealTeamInfo T) { if ( PlrProfile.Species == None ) { warn("Could not load species "$PlrProfile.Species$" for "$PlrProfile.DefaultName); return; } PlrProfile.Species.static.LoadResources( PlrProfile, T.Level, None, T.TeamIndex ); } function InitBot(Bot B) { B.SetPawnClass(PawnClassName, PlayerName); // Set bot attributes based on the PlayerRecord CombatStyle = FClamp(class'Bot'.Default.CombatStyle + float(PlrProfile.CombatStyle),-1,1); Aggressiveness = FClamp(class'Bot'.Default.BaseAggressiveness +float(PlrProfile.Aggressiveness),0,1); Accuracy = FClamp(float(PlrProfile.Accuracy),-4,4); StrafingAbility = FClamp(float(PlrProfile.StrafingAbility),-4,4); Tactics = FClamp(float(PlrProfile.Tactics),-4,4); ReactionTime = FClamp(float(PlrProfile.ReactionTime),-4,4); if ( PlrProfile.FavoriteWeapon == "" ) FavoriteWeapon = None; else FavoriteWeapon = class(DynamicLoadObject(PlrProfile.FavoriteWeapon,class'Class')); Jumpiness = float(PlrProfile.Jumpiness); Super.InitBot(B); } >>>~suA' G>t>>>>rHj w-L K H!6  M'6M9?,H'HK r Mq -L  G]SsK6v-:]Н  s}]xWeapons.ZoomSuperShockRifleu q]xWeapons.ZoomSuperShockRifleL]Zoom InstaGibB]DBInstant-kill combat with modified Shock Rifles with sniper zooms.>>E//============================================================================= // xRedFlagBase. //============================================================================= class xRedFlagBase extends xRealCTFBase placeable; simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); } } >g// ==================================================================== // Class: XGame.Intro_Fan_Brock // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Fan_Brock extends xIntroPawn; NwkH @2yaNs63} Pp kFH] Red Flag,Y>>dPje:+AP&}%}&L}{P}m-Pm-P L}9?,m-Pm-P Q>wQ*'Qa/!d.Qm5m-$'QQ G>`//============================================================================= // xRedFlag. //============================================================================= class xRedFlag extends CTFFlag; #exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=XGameShaders2004.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } >>>u~t $ v  G>>>}W+S9:9:$9=~9?&w a r W wW*w.W*9:.W~-'WWjQ G>,class LavaVolume extends PhysicsVolume; >BIBpEEa a  a(#HBHBHBs&a>' G>>>A$LpJa a  a(#HBHBHBsGs,a( G>CQVm;#~%$& 8$&  G>D|d ^[H EH Ea a  a(#HBHBHBs&a>' G >ml>Z class ComboBerserk extends Combo; var xEmitter Effect; function StartEffect(xPawn P) { if (P.Role == ROLE_Authority) Effect = Spawn(class'OffensiveEffect', P,, P.Location, P.Rotation); if (P.Weapon != None) P.Weapon.StartBerserk(); P.bBerserk = true; } function StopEffect(xPawn P) { local Inventory Inv; if (Effect != None) Effect.Destroy(); for ( Inv=P.Inventory; Inv!=None; Inv=Inv.Inventory ) if (Inv.IsA('Weapon')) { Weapon(Inv).StopBerserk(); } P.bBerserk = false; } >E class xRealCTFBase extends CTFBase abstract; var GameReplicationInfo GRI; var() vector BaseOffset; simulated function UpdateForTeam() { if ( (GRI != None) && (DefenderTeamIndex < 2) && (GRI.TeamSymbols[DefenderTeamIndex] != None) ) TexScaler(Combiner(Shader(FinalBlend(Skins[0]).Material).Diffuse).Material2).Material = GRI.TeamSymbols[DefenderTeamIndex]; } simulated function SetGRI(GameReplicationInfo NewGRI) { GRI = NewGRI; UpdateForTeam(); } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) LoopAnim('flag',0.8); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); } >FV }'a/!K maM rm*pppp9V could not spawn flag of type '9VM ' at 9X ma r  #pB G>Ije #rm* rj*(]w*m-j P'mY j 9?jbmY G>gclass xPlayerReplicationInfo extends TeamPlayerReplicationInfo; var xUtil.PlayerRecord Rec; var bool bForceNoPlayerLights; // OBSOLETE var bool bNoTeamSkins; //OBSOLETE simulated function UpdatePrecacheMaterials() { if ( CharacterName == "" ) return; rec = class'xUtil'.static.FindPlayerRecord(CharacterName); if ( rec.Species != None ) { if ( Team == None ) rec.Species.static.LoadResources(rec, Level,self,255); else rec.Species.static.LoadResources(rec, Level,self,Team.TeamIndex); } } simulated function SetCharacterName(string S) { Super.SetCharacterName(S); UpdateCharacter(); } simulated event UpdateCharacter() { Rec = class'xUtil'.static.FindPlayerRecord(CharacterName); } simulated function material GetPortrait() { if ( Rec.Portrait == None ) return Material(DynamicLoadObject("PlayerPictures.cDefault", class'Material')); return Rec.Portrait; } >>>JNx.y0+m-9:l 9:n (' G>n >> m o OL>w*)Oo Pb@s t u Cw@b w@*@%w@*wb*Pr@*1w@b@9D9?@9?Pm @9D@P G>>>>>T>hclass MutZoomInstaGib extends MutInstaGib; function bool MutatorIsAllowed() { return true; } @[@` 2TwbQ ^$ BtS$@b:5?H>=]ce_$L?^$=p] in lava=>>H//============================================================================= // Jugg Male Voice. //============================================================================= class JuggMaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax U\6Vr =+  [.''      Life Is Pain, Get Over ItRight Between The EyesTag 'Em And Bag 'EmThat Was Nasty! You Bleed Better Than You Shoot  You SuckI"??                  !  I Can't Feel My Legs ! Nice Shot    K"Z.]Male Juggernaut>> e O>w*)Oe mhbZRQw.h*m.h[$AmhbZRQwbhw.b*m.b[$BmhbZRQm G>jclass xPlayer extends UnrealPlayer DependsOn(xUtil); #exec OBJ LOAD File="MenuSounds.uax" // attract mode var AttractCamera camlist[20]; var int numcams, curcam; var Pawn attracttarget, attracttarget2; var float camtime, targettime, gibwatchtime; var Vector focuspoint; // combos const MinComboKeyTime = 0.05; // keys pressed faster than this will be considered a double-press const MaxComboKeyTime = 0.35; // max time player has between button presses var transient int InputHistory[4]; var transient float LastKeyTime; var transient int OldKey; var float MinAdrenalineCost; var string ComboNameList[16]; var class ComboList[16]; var xUtil.PlayerRecord PawnSetupRecord; var float LastRulesRequestTime; var float LastMapListRequestTime; var bool autozoom; var globalconfig bool bClassicTrans; var bool bHighBeaconTrajectory; var bool bWaitingForPRI, bWaitingForVRI; var config bool bDebuggingVoiceChat; var config bool bAutoDemoRec; delegate ProcessRule(string NewRule); // Should be assigned elsewhere delegate ProcessMapName(string NewMap); replication { // client to server reliable if ( Role < ROLE_Authority ) ServerDoCombo, ServerRequestRules, ServerRequestMapList, AdminMenu, ServerRequestPlayerInfo, ServerSpecViewGoal, ServerSetClassicTrans; unreliable if( Role < ROLE_Authority ) L33tPhrase; reliable if ( Role == ROLE_Authority) ClientReceiveRule, ClientReceiveMapName, ClientReceiveCombo, ClientReceiveBan; } exec function CheckPriority() { local Inventory Inv; local int Count; if ( Pawn == None ) { DebugMessage("Pawn is none - returning"); return; } for( Inv = Pawn.Inventory; Inv != None && Count < 1000; Inv = Inv.Inventory ) { if ( Weapon(Inv) != None ) DebugMessage("Weapon:"$Inv.Name@"Priority:"$Weapon(Inv).Priority,'PriorityDebug'); Count++; } } simulated function DebugMessage(string DebugString, optional name Type) { ClientMessage(DebugString); log(DebugString,Type); } simulated function String GetRoleString() { local String T; T = "Role: "; Switch(Role) { case ROLE_None: T=T$"None"; break; case ROLE_DumbProxy: T=T$"DumbProxy"; break; case ROLE_SimulatedProxy: T=T$"SimulatedProxy"; break; case ROLE_AutonomousProxy: T=T$"AutonomousProxy"; break; case ROLE_Authority: T=T$"Authority"; break; } return T; } simulated function String GetPhysicsString() { Local String T; T = "Physics: "; Switch( Pawn.Physics ) { case PHYS_None: T=T$"None"; break; case PHYS_Walking: T=T$"Walking"; break; case PHYS_Falling: T=T$"Falling"; break; case PHYS_Swimming: T=T$"Swimming"; break; case PHYS_Flying: T=T$"Flying"; break; case PHYS_Rotating: T=T$"Rotating"; break; case PHYS_Projectile: T=T$"Projectile"; break; case PHYS_Interpolating: T=T$"Interpolating"; break; case PHYS_MovingBrush: T=T$"MovingBrush"; break; case PHYS_Spider: T=T$"Spider"; break; case PHYS_Trailer: T=T$"Trailer"; break; case PHYS_Ladder: T=T$"Ladder"; break; case PHYS_Karma: T=T$"Karma"; break; } return T; } // Voice chat debug function ServerRequestRules() { local GameInfo.ServerResponseLine Response; local int i; if ( Level.Pauser == None && Level.TimeSeconds - LastRulesRequestTime < 3.0) { log("ServerRequestRules Level.TimeSeconds:"$Level.TimeSeconds@"LastRequestTime:"$LastRulesRequestTime); return; } LastRulesRequestTime = Level.TimeSeconds; Level.Game.GetServerDetails(Response); ClientReceiveRule(""); for (i=0;i(DynamicLoadObject(ComboNameList[c],class'Class')); if ( ComboList[c] == None ) break; MinAdrenalineCost = FMin(MinAdrenalineCost,ComboList[c].Default.AdrenalineCost); } } FillCameraList(); LastKillTime = -5.0; } simulated event PostNetBeginPlay() { super.PostNetBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) ServerSetClassicTrans(bClassicTrans); } function ServerSetClassicTrans(bool B) { bHighBeaconTrajectory = B; } simulated function ClientReceiveCombo(string NewCombo) { local int i; for ( i=0; i<16; i++ ) { if ( ComboNameList[i] ~= NewCombo ) return; else if ( ComboNameList[i] == "" ) { ComboNameList[i] = NewCombo; ComboList[i] = class(DynamicLoadObject(ComboNameList[i],class'Class')); if ( ComboList[i] == None ) return; MinAdrenalineCost = FMin(MinAdrenalineCost,ComboList[i].Default.AdrenalineCost); return; } } } event PlayerTick( float DeltaTime ) { local int CurrentKey, DiffKey; local int c, i; local bool bFullBuffer,bMatch; Super.PlayerTick(DeltaTime); if ( (Pawn == None) || !bAdrenalineEnabled || (Adrenaline < MinAdrenalineCost) ) { InputHistory[0] = 0; return; } CurrentKey = 0; if (aForward > 0) CurrentKey = CurrentKey | 1; // CK_Up else if (aForward < 0) CurrentKey = CurrentKey | 2; // CK_Down if (aStrafe > 0) CurrentKey = CurrentKey | 4; // CK_Left else if (aStrafe < 0) CurrentKey = CurrentKey | 8; // CK_Right if ( CurrentKey != OldKey ) { DiffKey = CurrentKey & ~OldKey; // keys that are pressed now but were not last frame if (DiffKey != 0) { if (Level.TimeSeconds - LastKeyTime < MinComboKeyTime) // if the time was too short between the last keypress, consider it a double press { InputHistory[0] = InputHistory[0] | DiffKey; } else if (Level.TimeSeconds - LastKeyTime > MaxComboKeyTime) // wipe the buffer if too long since last keypress { InputHistory[0] = Diffkey; InputHistory[1] = 0; LastKeyTime = Level.TimeSeconds; } else { bFullBuffer = true; for ( i=3; i>0; i-- ) { InputHistory[i] = InputHistory[i - 1]; if ( InputHistory[i] == 0 ) bFullBuffer = false; } InputHistory[0] = DiffKey; LastKeyTime = Level.TimeSeconds; } // check for combo matches if ( bFullBuffer ) { for ( c=0; c<16; c++ ) { if ( ComboList[c] == None ) break; else if ( (ComboList[c].Default.species == None) || (ComboList[c].Default.species == xPawn(Pawn).Species) ) { bMatch = true; for ( i=0; i <4; i++) if ( InputHistory[i] != ComboList[c].Default.keys[i] ) { bMatch = false; break; } if ( bMatch ) { DoCombo(ComboList[c]); InputHistory[0] = 0; } } } } } OldKey = CurrentKey; } } function DoCombo( class ComboClass ) { if (Adrenaline >= ComboClass.default.AdrenalineCost && !Pawn.InCurrentCombo() ) { ServerDoCombo( ComboClass ); } } function ServerDoCombo( class ComboClass ) { if ( (ComboClass == None) || (xPawn(Pawn) == None) ) return; if (Adrenaline >= ComboClass.default.AdrenalineCost && !Pawn.InCurrentCombo() ) { if (ComboClass.default.ExecMessage != "") ReceiveLocalizedMessage( class'ComboMessage', , , , ComboClass ); xPawn(Pawn).DoCombo( ComboClass ); } } state AttractMode { ignores SwitchWeapon, RestartLevel, ClientRestart, Suicide, ThrowWeapon, NotifyPhysicsVolumeChange, NotifyHeadVolumeChange, Say, TeamSay; function bool IsSpectating() { return true; } function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot) { } function PlayerMove(float DeltaTime) { local float deltayaw, destyaw; local Rotator newrot; if ( attracttarget == None ) return; // updates camera yaw to smoothly rotate to the pawn facing if ( bBehindView ) { if ( (attracttarget.Controller == None) || (AttractTarget.Controller.Enemy == None) ) return; NewRot = Rotator(attracttarget.controller.Enemy.location - attracttarget.location); destyaw = NewRot.Yaw; deltayaw = (destyaw & 65535) - (rotation.yaw & 65535); if (deltayaw < -32768) deltayaw += 65536; else if (deltayaw > 32768) deltayaw -= 65536; newrot = rotation; newrot.yaw += deltayaw * DeltaTime; SetRotation(newrot); } else { newrot = CameraTrack(attracttarget, DeltaTime); SetRotation(newrot); } } exec function NextWeapon() { } exec function PrevWeapon() { } exec function Fire( optional float F ) { // start playing } exec function AltFire( optional float F ) { Fire(F); } function BeginState() { if ( Pawn != None ) { SetLocation(Pawn.Location); } bCollideWorld = true; if ( curcam == -1 ) { FillCameraList(); camtime = 0; targettime = 0; autozoom = true; curcam = -1; } Timer(); SetTimer(0.5, true); } function EndState() { PlayerReplicationInfo.bIsSpectator = false; bCollideWorld = false; curcam = -1; } function Timer() { local bool switchedbots; local Vector newloc; local int newcam; camtime += 0.5; targettime += 0.5; bFrozen = false; // keep watching a target for a few seconds after it dies if (gibwatchtime > 0) { gibwatchtime -= 0.5; if (gibwatchtime <= 0) attracttarget = None; else return; } else if ( attracttarget != None && attracttarget.Health <= 0 ) { gibwatchtime = 4; //Log("attract: watching gib"); } // switch targets // if (attracttarget == None || targettime > 30 ) { attracttarget = PickNextBot(attracttarget); switchedbots = true; targettime = 0; } if (attracttarget == None) return; // switch views // if ( switchedbots || camtime > 10 || bBehindView == false && (rotation.pitch < -10000 || !LineOfSight(curcam, attracttarget)) ) { camtime = 0; FovAngle = default.FovAngle; SetViewTarget(self); bBehindView = false; // look for a placed camera if (FindFixedCam(attracttarget, newcam)) { focuspoint = attracttarget.Location; curcam = newcam; SetLocation(camlist[curcam].Location); FovAngle = camlist[curcam].ViewAngle; SetRotation(CameraTrack(attracttarget, 0)); //Log("attract: camera "$camlist[curcam]); } // use a floating camera else if (FRand() < 0.5) { newloc = FindFloatingCam(attracttarget); focuspoint = attracttarget.Location; curcam = -1; SetLocation(newloc); SetRotation(CameraTrack(attracttarget, 0)); //Log("attract: free camera"); } // chase mode else { curcam = -1; SetViewTarget(attracttarget); bBehindView = true; SetRotation(attracttarget.rotation); CameraDeltaRotation.Pitch = -3000; CameraDist = 6; //Log("attract: chase camera"); } } } } state ViewPlayer extends PlayerWalking { function PlayerMove(float DeltaTime) { Super.PlayerMove(DeltaTime); CameraSwivel = CameraTrack(pawn, DeltaTime); } function PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { // not calling super CameraRotation = CameraSwivel; CameraLocation = location; //camlist[curcam].location; ViewActor = self; } function BeginState() { FillCameraList(); bBehindView = true; SetViewTarget(self); curcam = -2; autozoom = true; Timer(); SetTimer(0.5, true); } function EndState() { CameraSwivel = rot(0,0,0); bBehindView = false; FovAngle = default.FovAngle; DesiredFOV = FovAngle; SetViewTarget(pawn); } function Timer() { local Vector newloc; local int newcam; if (curcam == -2 || !LineOfSight(curcam, pawn)) { //Log("attract: switch camera"); camtime = 0; if (FindFixedCam(pawn, newcam)) { if (curcam != newcam) { focuspoint = pawn.Location; curcam = newcam; SetLocation(camlist[curcam].location); FovAngle = camlist[curcam].ViewAngle; //Log("attract: viewing from "$camlist[curcam]); } else { //Log("attract: zoinks! this shouldn't happen"); } } else { newloc = FindFloatingCam(pawn); SetLocation(newloc); curcam = -1; FovAngle = default.FovAngle; focuspoint = pawn.Location; //Log("attract: floating"); } CameraSwivel = CameraTrack(pawn, 0); } } exec function TogglePlayerAttract() { GotoState('PlayerWalking'); } } function FillCameraList() { local AttractCamera cam; numcams = 0; foreach AllActors(class'AttractCamera', cam) { camlist[numcams++] = cam; if (numcams == 20) break; } } function bool FindFixedCam(Pawn target, out int newcam) { local int c, bestc; local float dist, bestdist; bestc = -1; for (c = 0; c < numcams; c++) { dist = VSize(target.location - camlist[c].location); if ((bestc == -1 || dist < bestdist) && LineOfSight(c, target)) { bestc = c; bestdist = dist; } } if (bestc == -1) return false; newcam = bestc; return true; } function Vector FindFloatingCam(Pawn target) { local Vector v1, v2, d; local Rotator r; local Vector hitloc, hitnormal; local Actor hitactor; local int tries; while (tries++ < 10) { v1 = target.Location; r = target.Rotation; r.Pitch = FRand()*12000 - 2000; if (VSize(target.Velocity) < 100) r.Yaw += FRand()*24000; else r.Yaw += FRand()*12000; d = Vector(r); v2 = v1 + d*2000; v1 += d*50; hitactor = Trace(hitloc, hitnormal, v2, v1, false); if (hitactor != None && VSize(hitloc - v1) > 250) { return (hitloc - d*50); } } // no good spots found, return something reasonable if (hitactor != None) return (hitloc - d*50); else return v2; } function Pawn PickNextBot(Pawn current) { local Controller con; local int b; if (current != None) con = current.Controller; for (b=0; b= 0) { cam = camlist[c]; v1 = cam.location; } else { v1 = self.location; } v2 = target.location; v2.z += target.eyeheight; v2 += Normal(v1 - v2) * 100; return (Trace(hitloc, hitnormal, v1, v2, false) == None); } function Rotator CameraTrack(Pawn target, float DeltaTime) { local float dist; local Vector lead; local float minzoomdist, maxzoomdist, viewangle, viewwidth; // update focuspoint lead = target.location + Vect(0,0,2) * Target.CollisionHeight; // + target.Velocity*0.5; dist = VSize(lead - focuspoint); if (dist > 20) { focuspoint += Normal(lead - focuspoint) * dist * DeltaTime * 2.0; } // adjust zoom within bounds (FovAngle 30-100) if (autozoom) { dist = VSize(Location - target.Location); if (curcam >= 0) { minzoomdist = camlist[curcam].minzoomdist; maxzoomdist = camlist[curcam].maxzoomdist; viewangle = camlist[curcam].ViewAngle; } else { minzoomdist = 600; maxzoomdist = 1200; viewangle = default.FovAngle; } if (dist < minzoomdist) { FovAngle = viewangle; } else if (dist < maxzoomdist) { viewwidth = minzoomdist*Tan(viewangle*PI/180 / 2); FovAngle = Atan(viewwidth, dist) * 180/PI * 2; } DesiredFOV = FovAngle; } return Rotator(focuspoint - location); } function PawnDied(Pawn P) { if ( Pawn != P ) return; bBehindview = true; LastKillTime = -5.0; if (Pawn != None) { curcam = -1; SetLocation(FindFloatingCam(Pawn)); SetRotation(CameraTrack(Pawn, 0)); } Super.PawnDied(P); } function SetPawnClass(string inClass, string inCharacter) { local class pClass; if ( inClass != "" ) { pClass = class(DynamicLoadObject(inClass, class'Class')); if ( (pClass != None) && pClass.Default.bCanPickupInventory ) PawnClass = pClass; } PawnSetupRecord = class'xUtil'.static.FindPlayerRecord(inCharacter); PlayerReplicationInfo.SetCharacterName(inCharacter); } function SetPawnFemale() { if ( PawnSetupRecord.Species == None ) PlayerReplicationInfo.bIsFemale = true; } function Possess( Pawn aPawn ) { local xPawn xp; Super.Possess( aPawn ); xp = xPawn(aPawn); if(xp != None) xp.Setup(PawnSetupRecord, true); if ( Level.NetMode != NM_DedicatedServer ) ServerSetClassicTrans(bClassicTrans); } // for changing character on the fly (for next respawn) exec function ChangeCharacter(string newCharacter) { SetPawnClass(string(PawnClass), newCharacter); UpdateURL("Character", newCharacter, true); SaveConfig(); } simulated function bool NeedNetNotify() { return Super.NeedNetNotify() || bWaitingForPRI || (bVoiceChatEnabled && bWaitingForVRI); } simulated event PostNetReceive() { local xUtil.PlayerRecord rec; Super.PostNetReceive(); if ( PlayerReplicationInfo != None && bWaitingForPRI ) { bWaitingForPRI = False; rec = class'xUtil'.static.FindPlayerRecord(PlayerReplicationInfo.CharacterName); if ( rec.Species != None ) { if ( PlayerReplicationInfo.Team == None ) rec.Species.static.LoadResources(rec, Level, PlayerReplicationInfo, 255); else rec.Species.static.LoadResources(rec, Level, PlayerReplicationInfo, PlayerReplicationInfo.Team.TeamIndex); } // Handle auto Demo Recording if ( bAutoDemoRec && level.NetMode==NM_Client && !bDemoOwner ) Player.Console.DelayedConsoleCommand("demorec"); } if ( VoiceReplicationInfo != None && bWaitingForVRI ) { if ( PlayerReplicationInfo != None && !PlayerReplicationInfo.NeedNetNotify() ) { bWaitingForVRI = VoiceReplicationInfo.GetPublicChannelCount(true) == 0; if ( !bWaitingForVRI ) { VoiceReplicationInfo.SetOwner(Self); if ( bVoiceChatEnabled ) InitializeVoiceChat(); else DisableVoiceChat(); } } } bNetNotify = NeedNetNotify(); } exec function AdminMenu( string CommandLine ) { } function ServerRequestPlayerInfo() { local Controller C; local xPlayer xPC; for (C=Level.ControllerList;C!=None;C=C.NextController) { xPC = XPlayer(C); if (xPC!=None) ClientReceiveRule(xPC.PlayerReplicationInfo.PlayerName$chr(27)$xPC.GetPlayerIDHash()$chr(27)$xPC.GetPlayerNetworkAddress()); else ClientReceiveRule(C.PlayerReplicationInfo.PlayerName$chr(27)$"AI Controlled"$chr(27)$"BOT"); } ClientReceiveRule("Done"); } exec function SpecViewGoal() { ServerSpecViewGoal(); } function ServerSpecViewGoal() { local actor NewGoal; if ( PlayerReplicationInfo.bOnlySpectator && IsInState('Spectating') ) { NewGoal = Level.Game.FindSpecGoalFor(PlayerReplicationInfo,0); if (NewGoal!=None) { if ( Pawn(NewGoal)!=None ) { SetViewTarget(NewGoal); ClientSetViewTarget(NewGoal); bBehindView = true; //bChaseCam; } else { SetViewTarget(None); ClientSetViewTarget(None); bBehindView = false; SetLocation(NewGoal.Location); ClientSetLocation(NewGoal.Location,Rotation); } } } } // ===================================================================================================================== // ===================================================================================================================== // Chat Manager // ===================================================================================================================== // ===================================================================================================================== function ServerRequestBanInfo(int PlayerID) { local array CArr; local int i; //log(Name@"ServerRequestBanInfo:"$PlayerID,'ChatManager'); if ( Level != None && Level.Game != None ) { Level.Game.GetPlayerControllerList(CArr); for (i = 0; i < CArr.Length; i++) { // Don't send our own info if ( CArr[i] == Self ) continue; //log(Name@"ServerRequestBanInfo CArr["$i$"]:"$CArr[i]@"ID:"$CArr[i].PlayerReplicationInfo.PlayerID,'ChatManager'); if ( PlayerID == -1 || CArr[i].PlayerReplicationInfo.PlayerID == PlayerID ) { log(Name@"Sending BanInfo To Client PlayerID:"$CArr[i].PlayerReplicationInfo.PlayerID@"Hash:"$CArr[i].GetPlayerIDHash()@"Address:"$CArr[i].GetPlayerNetworkAddress(),'ChatManager'); ChatManager.TrackNewPlayer(CArr[i].PlayerReplicationInfo.PlayerID, CArr[i].GetPlayerIDHash(), CArr[i].GetPlayerNetworkAddress()); ClientReceiveBan(CArr[i].PlayerReplicationInfo.PlayerID$Chr(27)$CArr[i].GetPlayerIDHash()$chr(27)$CArr[i].GetPlayerNetworkAddress()); } } } } function ClientReceiveBan(string BanInfo) { if ( UnrealPlayerChatManager(ChatManager) != None ) UnrealPlayerChatManager(ChatManager).ReceiveBanInfo(BanInfo); } // ===================================================================================================================== // ===================================================================================================================== // Voice Chat // ===================================================================================================================== // ===================================================================================================================== simulated function InitializeVoiceChat() { Super.InitializeVoiceChat(); // Check player hashes for all players on the server ServerRequestBanInfo(-1); } simulated exec function ShowAliases() { local array Output; local Security S; local int i; S = Spawn(class'Engine.Security'); if (S!=None) { S.LocalPerform(100,"","",Output); Log("No of Aliases:"@Output.Length); for (i=0;i Output; local Security S; local int i; S = Spawn(class'Engine.Security'); if (S!=None) { S.LocalPerform(101,"","",Output); Log("No of Bindings:"@Output.Length); for (i=0;iSb Ap9:9:$ Y9?, d ab g YY(9?& G>n>>p class xPawnSoundGroup extends Object abstract; var() array Sounds; var() array DeathSounds; var() array PainSounds; Enum ESoundType { EST_Land, EST_CorpseLanded, EST_HitUnderWater, EST_Jump, EST_LandGrunt, EST_Gasp, EST_Drown, EST_BreatheAgain, EST_Dodge, EST_DoubleJump }; static function Sound GetHitSound() { return default.PainSounds[rand(default.PainSounds.length)]; } static function Sound GetDeathSound() { return default.DeathSounds[rand(default.DeathSounds.length)]; } static function Sound GetSound(ESoundType soundType) { return default.Sounds[int(soundType)]; } >N3Y9:9:$+r.* O9:%.n9:%.[-S-k .[-S-j  G >\I352w*w.*.B G>]_F<N  !g6N  G>N >>Wclass xPawn extends UnrealPawn config(User) dependsOn(xUtil) dependsOn(xPawnSoundGroup) dependsOn(xPawnGibGroup); #exec OBJ LOAD FILE=GameSounds.uax #exec OBJ LOAD FILE=PlayerSounds.uax #exec OBJ LOAD FILE=PlayerFootSteps.uax #exec OBJ LOAD FILE=DanFX.utx #exec OBJ LOAD FILE=GeneralAmbience.uax #exec OBJ LOAD FILE=GeneralImpacts.uax #exec OBJ LOAD FILE=DeRez.utx #exec OBJ LOAD FILE=WeaponSounds.uax var int RepeaterDeathCount; var Combo CurrentCombo; var bool bBerserk; var bool bInvis; var bool bOldInvis; var bool bGibbed; var bool bCanDodgeDoubleJump; var bool bCanBoostDodge; var bool bAlreadySetup; var bool bSpawnIn; var bool bSpawnDone; var bool bFrozenBody; var bool bFlaming; var bool bRubbery; var bool bClearWeaponOffsets; // for certain custom player models var(UDamage) Material UDamageWeaponMaterial; // Weapon overlay material var(UDamage) Sound UDamageSound; var UDamageTimer UDamageTimer; var float UDamageTime; var float LastUDamageSoundTime; var Material InvisMaterial; var(Shield) float ShieldStrengthMax; // max strength var float SmallShieldStrength; // for preventing shieldstacking var(Shield) Material ShieldHitMat; var(Shield) float ShieldHitMatTime; var class Species; var(Sounds) float GruntVolume; var(Sounds) float FootstepVolume; var transient int SimHitFxTicker; var(Gib) class GibGroupClass; var(Gib) int GibCountCalf; var(Gib) int GibCountForearm; var(Gib) int GibCountHead; var(Gib) int GibCountTorso; var(Gib) int GibCountUpperArm; var float MinTimeBetweenPainSounds; var localized string HeadShotMessage; // Common sounds var(Sounds) Sound SoundFootsteps[11]; // Indexed by ESurfaceTypes (sorry about the literal). var(Sounds) class SoundGroupClass; var class TeleportFXClass; var class TransEffects[2]; var xWeaponAttachment WeaponAttachment; var ShadowProjector PlayerShadow; var int MultiJumpRemaining; var int MaxMultiJump; var int MultiJumpBoost; // depends on the tolerance (100) var name WallDodgeAnims[4]; var name IdleHeavyAnim; var name IdleRifleAnim; var name FireHeavyRapidAnim; var name FireHeavyBurstAnim; var name FireRifleRapidAnim; var name FireRifleBurstAnim; var name FireRootBone; var enum EFireAnimState { FS_None, FS_PlayOnce, FS_Looping, FS_Ready } FireState; var Mesh SkeletonMesh; var bool bSkeletized; var bool bDeRes; var float DeResTime; var Emitter DeResFX; var Material DeResMat0, DeResMat1; var(DeRes) InterpCurve DeResLiftVel; // speed (over time) at which body rises var(DeRes) InterpCurve DeResLiftSoftness; // vertical 'sprinyness' (over time) of bone lifters var(DeRes) float DeResGravScale; // reduce gravity on corpse during de-res var(DeRes) float DeResLateralFriction; // sideways friction while lifting var(Karma) float RagdollLifeSpan; // MAXIMUM time the ragdoll will be around. De-res's early if it comes to rest. var(Karma) float RagInvInertia; // Use to work out how much 'spin' ragdoll gets on death. var(Karma) float RagDeathVel; // How fast ragdoll moves upon death var(Karma) float RagShootStrength; // How much effect shooting ragdolls has. Be careful! var(Karma) float RagSpinScale; // Increase propensity to spin around Z (up). var(Karma) float RagDeathUpKick; // Amount of upwards kick ragdolls get when they die var(Karma) float RagGravScale; var(Karma) material RagConvulseMaterial; // Ragdoll impact sounds. var(Karma) array RagImpactSounds; var(Karma) float RagImpactSoundInterval; var(Karma) float RagImpactVolume; var transient float RagLastSoundTime; var string RagdollOverride; // translocate effect var class TransOutEffect[2]; var Controller OldController; var Material RealSkins[4]; var class VoiceClass; var(AI) globalconfig string PlacedCharacterName; var globalconfig string PlacedFemaleCharacterName; var byte TeamSkin; // what team's skin is currently set replication { reliable if( Role==ROLE_Authority ) bInvis; reliable if( bNetOwner && (Role==ROLE_Authority) ) bBerserk, MaxMultiJump, MultiJumpBoost, bCanDodgeDoubleJump, bCanBoostDodge; reliable if( Role==ROLE_Authority ) ClientSetUDamageTime; } simulated function Fire( optional float F ) { if ( (Weapon != None) && (Weapon.bBerserk != bBerserk) ) { if ( bBerserk ) Weapon.StartBerserk(); else Weapon.StopBerserk(); } Super.Fire(F); } simulated function AltFire( optional float F ) { if ( (Weapon != None) && (Weapon.bBerserk != bBerserk) ) { if ( bBerserk ) Weapon.StartBerserk(); else Weapon.StopBerserk(); } Super.AltFire(F); } simulated function PlayWaiting() {} function RosterEntry GetPlacedRoster() { PlayerReplicationInfo.CharacterName = PlacedCharacterName; return class'xRosterEntry'.static.CreateRosterEntryCharacter(PlacedCharacterName); } function PossessedBy(Controller C) { Super.PossessedBy(C); if ( Controller != None ) OldController = Controller; } // return true if was controlled by a Player (AI or human) simulated function bool WasPlayerPawn() { return ( (OldController != None) && OldController.bIsPlayer ); } function DoTranslocateOut(Vector PrevLocation) { if ( (PlayerReplicationInfo == None) || (PlayerReplicationInfo.Team == None) || (PlayerReplicationInfo.Team.TeamIndex == 0) ) Spawn(TransOutEffect[0], self,, PrevLocation, rotator(Location - PrevLocation)); else Spawn(TransOutEffect[1], self,, PrevLocation, rotator(Location - PrevLocation)); } // Set up default blending parameters and pose. Ensures the mesh doesn't have only a T-pose whenever it first springs into view. simulated function AssignInitialPose() { if ( DrivenVehicle != None ) { if ( HasAnim(DrivenVehicle.DriveAnim) ) LoopAnim(DrivenVehicle.DriveAnim,, 0.1); else LoopAnim('Vehicle_Driving',, 0.1); } else TweenAnim(MovementAnims[0],0.0); AnimBlendParams(1, 1.0, 0.2, 0.2, 'Bip01 Spine1'); BoneRefresh(); } simulated function Destroyed() { if( PlayerShadow != None ) PlayerShadow.Destroy(); if( DeResFX != None ) { DeResFX.Emitters[0].SkeletalMeshActor = None; DeResFX.Kill(); } Super.Destroyed(); } simulated function RemoveFlamingEffects() { local int i; if( Level.NetMode == NM_DedicatedServer ) return; for( i=0; i EmitterClass, Name BoneName, Vector Location, Rotator Rotation ) { local Actor a; local int i; if( bSkeletized || (BoneName == 'None') ) return; for( i = 0; i < Attached.Length; i++ ) { if( Attached[i] == None ) continue; if( Attached[i].AttachmentBone != BoneName ) continue; if( ClassIsChildOf( EmitterClass, Attached[i].Class ) ) return; } a = Spawn( EmitterClass,,, Location, Rotation ); if( !AttachToBone( a, BoneName ) ) { log( "Couldn't attach "$EmitterClass$" to "$BoneName, 'Error' ); a.Destroy(); return; } for( i = 0; i < Attached.length; i++ ) { if( Attached[i] == a ) break; } a.SetRelativeRotation( Rotation ); } simulated event SetHeadScale(float NewScale) { HeadScale = NewScale; SetBoneScale(4,HeadScale,'head'); } simulated function SpawnGiblet( class GibClass, Vector Location, Rotator Rotation, float GibPerterbation ) { local Gib Giblet; local Vector Direction, Dummy; if( (GibClass == None) || class'GameInfo'.static.UseLowGore() ) return; Instigator = self; Giblet = Spawn( GibClass,,, Location, Rotation ); if( Giblet == None ) return; Giblet.bFlaming = bFlaming; Giblet.SpawnTrail(); GibPerterbation *= 32768.0; Rotation.Pitch += ( FRand() * 2.0 * GibPerterbation ) - GibPerterbation; Rotation.Yaw += ( FRand() * 2.0 * GibPerterbation ) - GibPerterbation; Rotation.Roll += ( FRand() * 2.0 * GibPerterbation ) - GibPerterbation; GetAxes( Rotation, Dummy, Dummy, Direction ); Giblet.Velocity = Velocity + Normal(Direction) * (250 + 260 * FRand()); Giblet.LifeSpan = Giblet.LifeSpan + 2 * FRand() - 1; } simulated function ProcessHitFX() { local Coords boneCoords; local class HitEffects[4]; local int i,j; local float GibPerterbation; if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh) ) { SimHitFxTicker = HitFxTicker; return; } for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) ) { j++; if ( j > 30 ) { SimHitFxTicker = HitFxTicker; return; } if( (HitFX[SimHitFxTicker].damtype == None) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) ) continue; boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone ); if ( !Level.bDropDetail && !bSkeletized ) { AttachEffect( GibGroupClass.static.GetBloodEmitClass(), HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health ); if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water { for( i = 0; i < ArrayCount(HitEffects); i++ ) { if( HitEffects[i] == None ) continue; AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir ); } } } if ( class'GameInfo'.static.UseLowGore() ) HitFX[SimHitFxTicker].bSever = false; if( HitFX[SimHitFxTicker].bSever ) { GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation; bFlaming = HitFX[SimHitFxTicker].DamType.Default.bFlaming; switch( HitFX[SimHitFxTicker].bone ) { case 'lthigh': case 'rthigh': SpawnGiblet( GetGibClass(EGT_Calf), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); SpawnGiblet( GetGibClass(EGT_Calf), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); GibCountCalf -= 2; break; case 'rfarm': case 'lfarm': SpawnGiblet( GetGibClass(EGT_UpperArm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); SpawnGiblet( GetGibClass(EGT_Forearm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); GibCountForearm--; GibCountUpperArm--; break; case 'head': SpawnGiblet( GetGibClass(EGT_Head), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); GibCountTorso--; break; case 'spine': case 'none': SpawnGiblet( GetGibClass(EGT_Torso), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); GibCountTorso--; bGibbed = true; while( GibCountHead-- > 0 ) SpawnGiblet( GetGibClass(EGT_Head), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); while( GibCountForearm-- > 0 ) SpawnGiblet( GetGibClass(EGT_UpperArm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); while( GibCountUpperArm-- > 0 ) SpawnGiblet( GetGibClass(EGT_Forearm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); if ( !bFlaming && !Level.bDropDetail && (Level.DetailMode != DM_Low) && PlayerCanSeeMe() ) { // extra gibs!!! GibPerterbation = FMin(1.0, 1.5 * GibPerterbation); SpawnGiblet( GetGibClass(EGT_Calf), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); SpawnGiblet( GetGibClass(EGT_Calf), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); SpawnGiblet( GetGibClass(EGT_UpperArm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); SpawnGiblet( GetGibClass(EGT_Forearm), boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation ); } break; } HideBone(HitFX[SimHitFxTicker].bone); } } } simulated function HideBone(name boneName) { local int BoneScaleSlot; if( boneName == 'lthigh' ) boneScaleSlot = 0; else if ( boneName == 'rthigh' ) boneScaleSlot = 1; else if( boneName == 'rfarm' ) boneScaleSlot = 2; else if ( boneName == 'lfarm' ) boneScaleSlot = 3; else if ( boneName == 'head' ) boneScaleSlot = 4; else if ( boneName == 'spine' ) boneScaleSlot = 5; SetBoneScale(BoneScaleSlot, 0.0, BoneName); } function CalcHitLoc( Vector hitLoc, Vector hitRay, out Name boneName, out float dist ) { boneName = GetClosestBone( hitLoc, hitRay, dist ); } function DoDamageFX( Name boneName, int Damage, class DamageType, Rotator r ) { local float DismemberProbability; local bool bExtraGib; if ( FRand() > 0.3f || Damage > 30 || Health <= 0 ) { HitFX[HitFxTicker].damtype = DamageType; if( Health <= 0 ) { switch( boneName ) { case 'lfoot': boneName = 'lthigh'; break; case 'rfoot': boneName = 'rthigh'; break; case 'rhand': boneName = 'rfarm'; break; case 'lhand': boneName = 'lfarm'; break; case 'rshoulder': case 'lshoulder': boneName = 'spine'; break; } if( DamageType.default.bAlwaysSevers || (Damage == 1000) ) { HitFX[HitFxTicker].bSever = true; if ( boneName == 'None' ) { boneName = 'spine'; bExtraGib = true; } } else if( (Damage*DamageType.Default.GibModifier > 50+120*FRand()) && (Damage + Health > 0) ) // total gib prob { HitFX[HitFxTicker].bSever = true; boneName = 'spine'; bExtraGib = true; } else { DismemberProbability = Abs( (Health - Damage*DamageType.Default.GibModifier) / 130.0f ); switch( boneName ) { case 'lthigh': case 'rthigh': case 'rfarm': case 'lfarm': case 'head': if( FRand() < DismemberProbability ) HitFX[HitFxTicker].bSever = true; break; case 'None': boneName = 'spine'; case 'spine': if( FRand() < DismemberProbability * 0.3 ) { HitFX[HitFxTicker].bSever = true; if ( FRand() < 0.65 ) bExtraGib = true; } break; } } } if ( DamageType.default.bNeverSevers || class'GameInfo'.static.UseLowGore() || (Level.Game != None && Level.Game.PreventSever(self, boneName, Damage, DamageType)) ) { HitFX[HitFxTicker].bSever = false; bExtraGib = false; } HitFX[HitFxTicker].bone = boneName; HitFX[HitFxTicker].rotDir = r; HitFxTicker = HitFxTicker + 1; if( HitFxTicker > ArrayCount(HitFX)-1 ) HitFxTicker = 0; if ( bExtraGib ) { if ( FRand() < 0.25 ) { DoDamageFX('lthigh',1000,DamageType,r); DoDamageFX('rthigh',1000,DamageType,r); } else if ( FRand() < 0.35 ) DoDamageFX('lthigh',1000,DamageType,r); else if ( FRand() < 0.5 ) DoDamageFX('rthigh',1000,DamageType,r); } } } simulated function StartDeRes() { local KarmaParamsSkel skelParams; local int i; if( Level.NetMode == NM_DedicatedServer ) return; AmbientGlow=254; MaxLights=0; DeResFX = Spawn(class'DeResPart', self, , Location); if ( DeResFX != None ) { DeResFX.Emitters[0].SkeletalMeshActor = self; DeResFX.SetBase(self); } Skins[0] = DeResMat0; Skins[1] = DeResMat1; if ( Skins.Length > 2 ) { for ( i=2; i 100 ) { Interval = ShieldStrength - 100; if ( Interval >= damage ) { ShieldStrength -= damage; return 0; } else { ShieldStrength = 100; damage -= Interval; } } if ( ShieldStrength > SmallShieldStrength ) { Interval = ShieldStrength - SmallShieldStrength; if ( Interval >= 0.75 * damage ) { ShieldStrength -= 0.75 * damage; if ( ShieldStrength < SmallShieldStrength ) SmallShieldStrength = ShieldStrength; return (0.25 * Damage); } else { ShieldStrength = SmallShieldStrength; damage -= Interval; Remaining = 0.33 * Interval; if ( Remaining <= damage ) return damage; damage -= Remaining; } } if ( ShieldStrength >= 0.5 * damage ) { ShieldStrength -= 0.5 * damage; SmallShieldStrength = ShieldStrength; return Remaining + (0.5 * damage); } else { damage -= ShieldStrength; ShieldStrength = 0; SmallShieldStrength = 0; } return damage + Remaining; } function PlayHit(float Damage, Pawn InstigatedBy, vector HitLocation, class damageType, vector Momentum) { local Vector HitNormal; local Vector HitRay; local Name HitBone; local float HitBoneDist; local PlayerController PC; local bool bShowEffects, bRecentHit; local BloodSpurt BloodHit; bRecentHit = Level.TimeSeconds - LastPainTime < 0.5; Super.PlayHit(Damage,InstigatedBy,HitLocation,DamageType,Momentum); if ( Damage <= 0 ) return; PC = PlayerController(Controller); bShowEffects = ( (Level.NetMode != NM_Standalone) || (Level.TimeSeconds - LastRenderTime < 2.5) || ((InstigatedBy != None) && (PlayerController(InstigatedBy.Controller) != None)) || (PC != None) ); if ( !bShowEffects ) return; HitRay = vect(0,0,0); if( InstigatedBy != None ) HitRay = Normal(HitLocation-(InstigatedBy.Location+(vect(0,0,1)*InstigatedBy.EyeHeight))); if( DamageType.default.bLocationalHit ) CalcHitLoc( HitLocation, HitRay, HitBone, HitBoneDist ); else { HitLocation = Location; HitBone = 'None'; HitBoneDist = 0.0f; } if( DamageType.default.bAlwaysSevers && DamageType.default.bSpecial ) HitBone = 'head'; if( InstigatedBy != None ) HitNormal = Normal( Normal(InstigatedBy.Location-HitLocation) + VRand() * 0.2 + vect(0,0,2.8) ); else HitNormal = Normal( Vect(0,0,1) + VRand() * 0.2 + vect(0,0,2.8) ); if ( DamageType.Default.bCausesBlood ) { if ( class'GameInfo'.static.UseLowGore() ) { if ( class'GameInfo'.static.NoBlood() ) BloodHit = BloodSpurt(Spawn( GibGroupClass.default.NoBloodHitClass,InstigatedBy,, HitLocation )); else BloodHit = BloodSpurt(Spawn( GibGroupClass.default.LowGoreBloodHitClass,InstigatedBy,, HitLocation )); } else BloodHit = BloodSpurt(Spawn(GibGroupClass.default.BloodHitClass,InstigatedBy,, HitLocation, Rotator(HitNormal))); if ( BloodHit != None ) { BloodHit.bMustShow = !bRecentHit; if ( Momentum != vect(0,0,0) ) BloodHit.HitDir = Momentum; else { if ( InstigatedBy != None ) BloodHit.HitDir = Location - InstigatedBy.Location; else BloodHit.HitDir = Location - HitLocation; BloodHit.HitDir.Z = 0; } } } // hack for flak cannon gibbing if ( (DamageType.name == 'DamTypeFlakChunk') && (Health < 0) && (InstigatedBy != None) && (VSize(InstigatedBy.Location - Location) < 350) ) DoDamageFX( HitBone, 8*Damage, DamageType, Rotator(HitNormal) ); else DoDamageFX( HitBone, Damage, DamageType, Rotator(HitNormal) ); if (DamageType.default.DamageOverlayMaterial != None && Damage > 0 ) // additional check in case shield absorbed SetOverlayMaterial( DamageType.default.DamageOverlayMaterial, DamageType.default.DamageOverlayTime, false ); } function bool CheckReflect( Vector HitLocation, out Vector RefNormal, int Damage ) { if (Weapon != None) return Weapon.CheckReflect( HitLocation, RefNormal, Damage ); else return false; } function name GetWeaponBoneFor(Inventory I) { return 'righthand'; } function name GetOffhandBoneFor(Inventory I) { return 'bip01 l hand'; } event Landed(vector HitNormal) { super.Landed( HitNormal ); MultiJumpRemaining = MaxMultiJump; if ( (Health > 0) && !bHidden && (Level.TimeSeconds - SplashTime > 0.25) ) PlayOwnedSound(GetSound(EST_Land), SLOT_Interact, FMin(1,-0.3 * Velocity.Z/JumpZ)); } // ----- animation ----- // simulated function name GetAnimSequence() { local name anim; local float frame, rate; GetAnimParams(0, anim, frame, rate); return anim; } simulated function PlayDoubleJump() { local name Anim; Anim = DoubleJumpAnims[Get4WayDirection()]; if ( PlayAnim(Anim, 1.0, 0.1) ) bWaitForAnim = true; AnimAction = Anim; } simulated function bool FindValidTaunt( out name Sequence ) { local int i,j; for( i=0; i= TauntAnims.Length) ) return false; Sequence = TauntAnims[j]; return (Sequence != '' ); } simulated event SetAnimAction(name NewAction) { if (!bWaitForAnim) { AnimAction = NewAction; if ( AnimAction == 'Weapon_Switch' ) { AnimBlendParams(1, 1.0, 0.0, 0.2, FireRootBone); PlayAnim(NewAction,, 0.0, 1); } else if ( ((Physics == PHYS_None)|| ((Level.Game != None) && Level.Game.IsInState('MatchOver'))) && (DrivenVehicle == None) ) { PlayAnim(AnimAction,,0.1); AnimBlendToAlpha(1,0.0,0.05); } else if ( (DrivenVehicle != None) || (Physics == PHYS_Falling) || ((Physics == PHYS_Walking) && (Velocity.Z != 0)) ) { if ( CheckTauntValid(AnimAction) ) { if (FireState == FS_None || FireState == FS_Ready) { AnimBlendParams(1, 1.0, 0.0, 0.2, FireRootBone); PlayAnim(NewAction,, 0.1, 1); FireState = FS_Ready; } } else if ( PlayAnim(AnimAction) ) { if ( Physics != PHYS_None ) bWaitForAnim = true; } else AnimAction = ''; } else if (bIsIdle && !bIsCrouched && (Bot(Controller) == None) ) // standing taunt { PlayAnim(AnimAction,,0.1); AnimBlendToAlpha(1,0.0,0.05); } else // running taunt { if (FireState == FS_None || FireState == FS_Ready) { AnimBlendParams(1, 1.0, 0.0, 0.2, FireRootBone); PlayAnim(NewAction,, 0.1, 1); FireState = FS_Ready; } } } } simulated function StartFiring(bool bHeavy, bool bRapid) { local name FireAnim; if ( HasUDamage() && (Level.TimeSeconds - LastUDamageSoundTime > 0.25) ) { LastUDamageSoundTime = Level.TimeSeconds; PlaySound(UDamageSound, SLOT_None, 1.5*TransientSoundVolume,,700); } if (Physics == PHYS_Swimming) return; if (bHeavy) { if (bRapid) FireAnim = FireHeavyRapidAnim; else FireAnim = FireHeavyBurstAnim; } else { if (bRapid) FireAnim = FireRifleRapidAnim; else FireAnim = FireRifleBurstAnim; } AnimBlendParams(1, 1.0, 0.0, 0.2, FireRootBone); if (bRapid) { if (FireState != FS_Looping) { LoopAnim(FireAnim,, 0.0, 1); FireState = FS_Looping; } } else { PlayAnim(FireAnim,, 0.0, 1); FireState = FS_PlayOnce; } IdleTime = Level.TimeSeconds; } simulated function StopFiring() { if (FireState == FS_Looping) { FireState = FS_PlayOnce; } IdleTime = Level.TimeSeconds; } simulated function AnimEnd(int Channel) { if (Channel == 1) { if (FireState == FS_Ready) { AnimBlendToAlpha(1, 0.0, 0.12); FireState = FS_None; } else if (FireState == FS_PlayOnce) { PlayAnim(IdleWeaponAnim,, 0.2, 1); FireState = FS_Ready; IdleTime = Level.TimeSeconds; } else AnimBlendToAlpha(1, 0.0, 0.12); } else if ( bKeepTaunting && (Channel == 0) ) PlayVictoryAnimation(); } function PlayWeaponSwitch(Weapon NewWeapon) { SetAnimAction('Weapon_Switch'); } function PlayVictoryAnimation() { local int tauntNum; // First 4 taunts are 'order' anims. Don't pick them. tauntNum = Rand(TauntAnims.Length - 3); SetAnimAction(TauntAnims[3 + tauntNum]); } simulated function SetWeaponAttachment(xWeaponAttachment NewAtt) { WeaponAttachment = NewAtt; if (WeaponAttachment.bHeavy) IdleWeaponAnim = IdleHeavyAnim; else IdleWeaponAnim = IdleRifleAnim; } // Event called whenever ragdoll convulses event KSkelConvulse() { if(RagConvulseMaterial != None) SetOverlayMaterial(RagConvulseMaterial, 0.4, true); } simulated final function RandSpin(float spinRate) { DesiredRotation = RotRand(true); RotationRate.Yaw = spinRate * 2 *FRand() - spinRate; RotationRate.Pitch = spinRate * 2 *FRand() - spinRate; RotationRate.Roll = spinRate * 2 *FRand() - spinRate; bFixedRotationDir = true; bRotateToDesired = false; } simulated function PlayDying(class DamageType, vector HitLoc) { local float frame, rate; local name seq; local LavaDeath LD; local BodyEffect BE; AmbientSound = None; bCanTeleport = false; // sjs - fix karma going crazy when corpses land on teleporters bReplicateMovement = false; bTearOff = true; bPlayedDeath = true; if (CurrentCombo != None) CurrentCombo.Destroy(); HitDamageType = DamageType; // these are replicated to other clients TakeHitLocation = HitLoc; if ( DamageType != None ) { if ( DamageType.default.bSkeletize ) { SetOverlayMaterial(DamageType.Default.DamageOverlayMaterial, 4.0, true); if (!bSkeletized) { if ( (Level.NetMode != NM_DedicatedServer) && (SkeletonMesh != None) ) { if ( DamageType.default.bLeaveBodyEffect ) { BE = spawn(class'BodyEffect',self); if ( BE != None ) { BE.DamageType = DamageType; BE.HitLoc = HitLoc; bFrozenBody = true; } } GetAnimParams( 0, seq, frame, rate ); LinkMesh(SkeletonMesh, true); Skins.Length = 0; PlayAnim(seq, 0, 0); SetAnimFrame(frame); } if (Physics == PHYS_Walking) Velocity = Vect(0,0,0); TearOffMomentum *= 0.25; bSkeletized = true; if ( (Level.NetMode != NM_DedicatedServer) && (DamageType == class'FellLava') ) { LD = spawn(class'LavaDeath', , , Location + vect(0, 0, 10), Rotation ); if ( LD != None ) LD.SetBase(self); PlaySound( sound'WeaponSounds.BExplosion5', SLOT_None, 1.5*TransientSoundVolume ); } } } else if ( DamageType.Default.DeathOverlayMaterial != None ) SetOverlayMaterial(DamageType.Default.DeathOverlayMaterial, DamageType.default.DeathOverlayTime, true); else if ( (DamageType.Default.DamageOverlayMaterial != None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail ) SetOverlayMaterial(DamageType.Default.DamageOverlayMaterial, 2*DamageType.default.DamageOverlayTime, true); } // stop shooting AnimBlendParams(1, 0.0); FireState = FS_None; LifeSpan = RagdollLifeSpan; GotoState('Dying'); if ( BE != None ) return; PlayDyingAnimation(DamageType, HitLoc); } function PlayDyingAnimation(class DamageType, vector HitLoc) { local vector shotDir, hitLocRel, deathAngVel, shotStrength; local float maxDim; local string RagSkelName; local KarmaParamsSkel skelParams; local bool PlayersRagdoll; local PlayerController pc; if ( Level.NetMode != NM_DedicatedServer ) { // Is this the local player's ragdoll? if(OldController != None) pc = PlayerController(OldController); if( pc != None && pc.ViewTarget == self ) PlayersRagdoll = true; // In low physics detail, if we were not just controlling this pawn, // and it has not been rendered in 3 seconds, just destroy it. if( (Level.PhysicsDetailLevel != PDL_High) && !PlayersRagdoll && (Level.TimeSeconds - LastRenderTime > 3) ) { Destroy(); return; } // Try and obtain a rag-doll setup. Use optional 'override' one out of player record first, then use the species one. if( RagdollOverride != "") RagSkelName = RagdollOverride; else if(Species != None) RagSkelName = Species.static.GetRagSkelName( GetMeshName() ); else Log("xPawn.PlayDying: No Species"); // If we managed to find a name, try and make a rag-doll slot availbale. if( RagSkelName != "" ) { KMakeRagdollAvailable(); } if( KIsRagdollAvailable() && RagSkelName != "" ) { skelParams = KarmaParamsSkel(KParams); skelParams.KSkeleton = RagSkelName; // Stop animation playing. StopAnimating(true); if( DamageType != None ) { if ( DamageType.default.bLeaveBodyEffect ) TearOffMomentum = vect(0,0,0); if( DamageType.default.bKUseOwnDeathVel ) { RagDeathVel = DamageType.default.KDeathVel; RagDeathUpKick = DamageType.default.KDeathUpKick; } } // Set the dude moving in direction he was shot in general shotDir = Normal(TearOffMomentum); shotStrength = RagDeathVel * shotDir; // Calculate angular velocity to impart, based on shot location. hitLocRel = TakeHitLocation - Location; // We scale the hit location out sideways a bit, to get more spin around Z. hitLocRel.X *= RagSpinScale; hitLocRel.Y *= RagSpinScale; // If the tear off momentum was very small for some reason, make up some angular velocity for the pawn if( VSize(TearOffMomentum) < 0.01 ) { //Log("TearOffMomentum magnitude of Zero"); deathAngVel = VRand() * 18000.0; } else { deathAngVel = RagInvInertia * (hitLocRel Cross shotStrength); } // Set initial angular and linear velocity for ragdoll. // Scale horizontal velocity for characters - they run really fast! if ( DamageType.Default.bRubbery ) skelParams.KStartLinVel = vect(0,0,0); if ( Damagetype.default.bKUseTearOffMomentum ) skelParams.KStartLinVel = TearOffMomentum + Velocity; else { skelParams.KStartLinVel.X = 0.6 * Velocity.X; skelParams.KStartLinVel.Y = 0.6 * Velocity.Y; skelParams.KStartLinVel.Z = 1.0 * Velocity.Z; skelParams.KStartLinVel += shotStrength; } // If not moving downwards - give extra upward kick if( !DamageType.default.bLeaveBodyEffect && !DamageType.Default.bRubbery && (Velocity.Z > -10) ) skelParams.KStartLinVel.Z += RagDeathUpKick; if ( DamageType.Default.bRubbery ) { Velocity = vect(0,0,0); skelParams.KStartAngVel = vect(0,0,0); } else { skelParams.KStartAngVel = deathAngVel; // Set up deferred shot-bone impulse maxDim = Max(CollisionRadius, CollisionHeight); skelParams.KShotStart = TakeHitLocation - (1 * shotDir); skelParams.KShotEnd = TakeHitLocation + (2*maxDim*shotDir); skelParams.KShotStrength = RagShootStrength; } // If this damage type causes convulsions, turn them on here. if(DamageType != None && DamageType.default.bCauseConvulsions) { RagConvulseMaterial=DamageType.default.DamageOverlayMaterial; skelParams.bKDoConvulsions = true; } // Turn on Karma collision for ragdoll. KSetBlockKarma(true); // Set physics mode to ragdoll. // This doesn't actaully start it straight away, it's deferred to the first tick. SetPhysics(PHYS_KarmaRagdoll); // If viewing this ragdoll, set the flag to indicate that it is 'important' if( PlayersRagdoll ) skelParams.bKImportantRagdoll = true; skelParams.bRubbery = DamageType.Default.bRubbery; bRubbery = DamageType.Default.bRubbery; skelParams.KActorGravScale = RagGravScale; return; } // jag } // non-ragdoll death fallback Velocity += TearOffMomentum; BaseEyeHeight = Default.BaseEyeHeight; SetTwistLook(0, 0); SetInvisibility(0.0); PlayDirectionalDeath(HitLoc); SetPhysics(PHYS_Falling); } simulated function SpawnGibs(Rotator HitRotation, float ChunkPerterbation) { bGibbed = true; PlayDyingSound(); if( GibCountTorso+GibCountHead+GibCountForearm+GibCountUpperArm > 3 ) { if ( class'GameInfo'.static.UseLowGore() ) { if ( !class'GameInfo'.static.NoBlood() ) Spawn( GibGroupClass.default.LowGoreBloodGibClass,,,Location ); } else Spawn( GibGroupClass.default.BloodGibClass,,,Location ); } if ( class'GameInfo'.static.UseLowGore() ) return; SpawnGiblet( GetGibClass(EGT_Torso), Location, HitRotation, ChunkPerterbation ); GibCountTorso--; while( GibCountTorso-- > 0 ) SpawnGiblet( GetGibClass(EGT_Torso), Location, HitRotation, ChunkPerterbation ); while( GibCountHead-- > 0 ) SpawnGiblet( GetGibClass(EGT_Head), Location, HitRotation, ChunkPerterbation ); while( GibCountForearm-- > 0 ) SpawnGiblet( GetGibClass(EGT_UpperArm), Location, HitRotation, ChunkPerterbation ); while( GibCountUpperArm-- > 0 ) SpawnGiblet( GetGibClass(EGT_Forearm), Location, HitRotation, ChunkPerterbation ); } function ClientDying(class DamageType, vector HitLocation) { } function PlayTakeHit(vector HitLocation, int Damage, class DamageType) { PlayDirectionalHit(HitLocation); if( Level.TimeSeconds - LastPainSound < MinTimeBetweenPainSounds ) return; LastPainSound = Level.TimeSeconds; if( HeadVolume.bWaterVolume ) { if( DamageType.IsA('Drowned') ) PlaySound( GetSound(EST_Drown), SLOT_Pain,1.5*TransientSoundVolume ); else PlaySound( GetSound(EST_HitUnderwater), SLOT_Pain,1.5*TransientSoundVolume ); return; } PlaySound(SoundGroupClass.static.GetHitSound(), SLOT_Pain,2*TransientSoundVolume,,200); } // jag // Called when in Ragdoll when we hit something over a certain threshold velocity // Used to play impact sounds. event KImpact(actor other, vector pos, vector impactVel, vector impactNorm) { local int numSounds, soundNum; numSounds = RagImpactSounds.Length; //log("ouch! iv:"$VSize(impactVel)); if(numSounds > 0 && Level.TimeSeconds > RagLastSoundTime + RagImpactSoundInterval) { soundNum = Rand(numSounds); //Log("Play Sound:"$soundNum); PlaySound(RagImpactSounds[soundNum], SLOT_Pain, RagImpactVolume); RagLastSoundTime = Level.TimeSeconds; } } //jag simulated function PlayDirectionalDeath(Vector HitLoc) { local Vector X,Y,Z, Dir; GetAxes(Rotation, X,Y,Z); HitLoc.Z = Location.Z; // random if ( VSize(Velocity) < 10.0 && VSize(Location - HitLoc) < 1.0 ) { Dir = VRand(); } // velocity based else if ( VSize(Velocity) > 0.0 ) { Dir = Normal(Velocity*Vect(1,1,0)); } // hit location based else { Dir = -Normal(Location - HitLoc); } if ( Dir Dot X > 0.7 || Dir == vect(0,0,0)) PlayAnim('DeathB',, 0.2); else if ( Dir Dot X < -0.7 ) PlayAnim('DeathF',, 0.2); else if ( Dir Dot Y > 0 ) PlayAnim('DeathL',, 0.2); else if ( HasAnim('DeathR') ) PlayAnim('DeathR',, 0.2); else PlayAnim('DeathF',, 0.2); } simulated function PlayDirectionalHit(Vector HitLoc) { local Vector X,Y,Z, Dir; if ( DrivenVehicle != None ) return; GetAxes(Rotation, X,Y,Z); HitLoc.Z = Location.Z; // random if ( VSize(Location - HitLoc) < 1.0 ) { Dir = VRand(); } // hit location based else { Dir = -Normal(Location - HitLoc); } if ( Dir Dot X > 0.7 || Dir == vect(0,0,0)) { PlayAnim('HitF',, 0.1); } else if ( Dir Dot X < -0.7 ) { PlayAnim('HitB',, 0.1); } else if ( Dir Dot Y > 0 ) { PlayAnim('HitR',, 0.1); } else { PlayAnim('HitL',, 0.1); } } simulated function FootStepping(int Side) { local int SurfaceNum, i; local actor A; local material FloorMat; local vector HL,HN,Start,End,HitLocation,HitNormal; SurfaceNum = 0; for ( i=0; i ComboClass; ComboClass = class( DynamicLoadObject( ComboClassName, class'Class' ) ); if ( ComboClass != None ) DoCombo( ComboClass ); else log("WARNING - Couldn't create combo "$ComboClassName); } function DoCombo( class ComboClass ) { local int i; if ( ComboClass != None ) { if (CurrentCombo == None) { CurrentCombo = Spawn( ComboClass, self ); // Record stats for using the combo UnrealMPGameInfo(Level.Game).SpecialEvent(PlayerReplicationInfo,""$CurrentCombo.Class); if ( ComboClass.Name == 'ComboSpeed' ) i = 0; else if ( ComboClass.Name == 'ComboBerserk' ) i = 1; else if ( ComboClass.Name == 'ComboDefensive' ) i = 2; else if ( ComboClass.Name == 'ComboInvis' ) i = 3; else i = 4; TeamPlayerReplicationInfo(PlayerReplicationInfo).Combos[i] += 1; } } } simulated function bool HasUDamage() { return (UDamageTime > Level.TimeSeconds); } function ClientSetUDamageTime(float NewUDam) { UDamageTime = Level.TimeSeconds + NewUDam; } function EnableUDamage(float amount) { UDamageTime = FMax(UDamageTime, Level.TimeSeconds+amount); ClientSetUDamageTime(UDamageTime - Level.TimeSeconds); if ( UDamageTimer == None ) UDamageTimer = Spawn(class'UDamageTimer',self); UDamageTimer.SetTimer(UDamageTime - Level.TimeSeconds - 3,false); LightType = LT_Steady; bDynamicLight = true; SetWeaponOverlay(UDamageWeaponMaterial, UDamageTime - Level.TimeSeconds, false); } function DisableUDamage() { LightType = LT_None; bDynamicLight = false; UDamageTime = Level.TimeSeconds - 1; ClientSetUDamageTime(-1); SetWeaponOverlay(UDamageWeaponMaterial, UDamageTime - Level.TimeSeconds, false); } function SetWeaponOverlay(Material mat, float time, bool override) { if (Weapon != None) { Weapon.SetOverlayMaterial(mat, time, override); if (WeaponAttachment(Weapon.ThirdPersonActor) != None) WeaponAttachment(Weapon.ThirdPersonActor).SetOverlayMaterial(mat, time, override); } } function ChangedWeapon() { Super.ChangedWeapon(); if (Weapon != None && Role < ROLE_Authority) { if (bBerserk) Weapon.StartBerserk(); else if ( Weapon.bBerserk ) Weapon.StopBerserk(); } } function ServerChangedWeapon(Weapon OldWeapon, Weapon NewWeapon) { local float InvisTime; if ( bInvis ) { if ( (OldWeapon != None) && (OldWeapon.OverlayMaterial == InvisMaterial) ) InvisTime = OldWeapon.ClientOverlayCounter; else InvisTime = 20000; } if (HasUDamage() || bInvis) SetWeaponOverlay(None, 0.f, true); Super.ServerChangedWeapon(OldWeapon, NewWeapon); if (bInvis) SetWeaponOverlay(InvisMaterial, InvisTime, true); else if (HasUDamage()) SetWeaponOverlay(UDamageWeaponMaterial, UDamageTime - Level.TimeSeconds, false); if (bBerserk) Weapon.StartBerserk(); else if ( Weapon.bBerserk ) Weapon.StopBerserk(); } function SetInvisibility(float time) { bInvis = (time > 0.0); if (Role == ROLE_Authority) { if (bInvis) { if ( (time == 2000000.0) && Level.Game.IsA('xMutantGame') ) // for mutant game Visibility = Default.Visibility; else Visibility = 1; SetWeaponOverlay(InvisMaterial, time, true); } else { Visibility = Default.Visibility; if (HasUDamage()) SetWeaponOverlay(UDamageWeaponMaterial, UDamageTime - Level.TimeSeconds, true); else SetWeaponOverlay(None, 0.0, true); } } } /* BotDodge() returns appropriate vector for dodge in direction Dir (which should be normalized) */ function vector BotDodge(Vector Dir) { local vector Vel; Vel = DodgeSpeedFactor*GroundSpeed*Dir; Vel.Z = DodgeSpeedZ; return Vel; } function bool Dodge(eDoubleClickDir DoubleClickMove) { local vector X,Y,Z, TraceStart, TraceEnd, Dir, Cross, HitLocation, HitNormal; local Actor HitActor; local rotator TurnRot; if ( bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking && Physics != PHYS_Falling) ) return false; TurnRot.Yaw = Rotation.Yaw; GetAxes(TurnRot,X,Y,Z); if ( Physics == PHYS_Falling ) { if ( !bCanWallDodge ) return false; if (DoubleClickMove == DCLICK_Forward) TraceEnd = -X; else if (DoubleClickMove == DCLICK_Back) TraceEnd = X; else if (DoubleClickMove == DCLICK_Left) TraceEnd = Y; else if (DoubleClickMove == DCLICK_Right) TraceEnd = -Y; TraceStart = Location - CollisionHeight*Vect(0,0,1) + TraceEnd*CollisionRadius; TraceEnd = TraceStart + TraceEnd*32.0; HitActor = Trace(HitLocation, HitNormal, TraceEnd, TraceStart, false, vect(1,1,1)); if ( (HitActor == None) || (!HitActor.bWorldGeometry && (Mover(HitActor) == None)) ) return false; } if (DoubleClickMove == DCLICK_Forward) { Dir = X; Cross = Y; } else if (DoubleClickMove == DCLICK_Back) { Dir = -1 * X; Cross = Y; } else if (DoubleClickMove == DCLICK_Left) { Dir = -1 * Y; Cross = X; } else if (DoubleClickMove == DCLICK_Right) { Dir = Y; Cross = X; } if ( AIController(Controller) != None ) Cross = vect(0,0,0); return PerformDodge(DoubleClickMove, Dir,Cross); } function bool PerformDodge(eDoubleClickDir DoubleClickMove, vector Dir, vector Cross) { local float VelocityZ; local name Anim; if ( Physics == PHYS_Falling ) { if (DoubleClickMove == DCLICK_Forward) Anim = WallDodgeAnims[0]; else if (DoubleClickMove == DCLICK_Back) Anim = WallDodgeAnims[1]; else if (DoubleClickMove == DCLICK_Left) Anim = WallDodgeAnims[2]; else if (DoubleClickMove == DCLICK_Right) Anim = WallDodgeAnims[3]; if ( PlayAnim(Anim, 1.0, 0.1) ) bWaitForAnim = true; AnimAction = Anim; TakeFallingDamage(); if (Velocity.Z < -DodgeSpeedZ*0.5) Velocity.Z += DodgeSpeedZ*0.5; } VelocityZ = Velocity.Z; Velocity = DodgeSpeedFactor*GroundSpeed*Dir + (Velocity Dot Cross)*Cross; if ( !bCanDodgeDoubleJump ) MultiJumpRemaining = 0; if ( bCanBoostDodge || (Velocity.Z < -100) ) Velocity.Z = VelocityZ + DodgeSpeedZ; else Velocity.Z = DodgeSpeedZ; CurrentDir = DoubleClickMove; SetPhysics(PHYS_Falling); PlayOwnedSound(GetSound(EST_Dodge), SLOT_Pain, GruntVolume,,80); return true; } function DoDoubleJump( bool bUpdating ) { PlayDoubleJump(); if ( !bIsCrouched && !bWantsToCrouch ) { if ( !IsLocallyControlled() || (AIController(Controller) != None) ) MultiJumpRemaining -= 1; Velocity.Z = JumpZ + MultiJumpBoost; SetPhysics(PHYS_Falling); if ( !bUpdating ) PlayOwnedSound(GetSound(EST_DoubleJump), SLOT_Pain, GruntVolume,,80); } } function bool CanDoubleJump() { return ( (MultiJumpRemaining > 0) && (Physics == PHYS_Falling) ); } function bool CanMultiJump() { return ( MaxMultiJump > 0 ); } function bool DoJump( bool bUpdating ) { // This extra jump allows a jumping or dodging pawn to jump again mid-air // (via thrusters). The pawn must be within +/- 100 velocity units of the // apex of the jump to do this special move. if ( !bUpdating && CanDoubleJump()&& (Abs(Velocity.Z) < 100) && IsLocallyControlled() ) { if ( PlayerController(Controller) != None ) PlayerController(Controller).bDoubleJump = true; DoDoubleJump(bUpdating); MultiJumpRemaining -= 1; return true; } if ( Super.DoJump(bUpdating) ) { if ( !bUpdating ) PlayOwnedSound(GetSound(EST_Jump), SLOT_Pain, GruntVolume,,80); return true; } return false; } simulated function NotifyTeamChanged() { // my PRI now has a new team PostNetReceive(); } simulated event PostNetReceive() { if ( ForceDefaultCharacter() ) { Setup(class'xUtil'.static.FindPlayerRecord(GetDefaultCharacter())); bNetNotify = false; } else if ( PlayerReplicationInfo != None ) { Setup(class'xUtil'.static.FindPlayerRecord(PlayerReplicationInfo.CharacterName)); bNetNotify = false; } else if ( (DrivenVehicle != None) && (DrivenVehicle.PlayerReplicationInfo != None) ) { Setup(class'xUtil'.static.FindPlayerRecord(DrivenVehicle.PlayerReplicationInfo.CharacterName)); bNetNotify = false; } } simulated function ClientRestart() { Super.ClientRestart(); if ( Controller != None ) OldController = Controller; } simulated function bool CheckValidFemaleDefault() { return ( (PlacedFemaleCharacterName ~= "Tamika") || (PlacedFemaleCharacterName ~= "Sapphire") || (PlacedFemaleCharacterName ~= "Enigma") || (PlacedFemaleCharacterName ~= "Cathode") || (PlacedFemaleCharacterName ~= "Rylisa") || (PlacedFemaleCharacterName ~= "Ophelia") || (PlacedFemaleCharacterName ~= "Zarina") ); } simulated function bool CheckValidMaleDefault() { return ( (PlacedCharacterName ~= "Jakob") || (PlacedCharacterName ~= "Gorge") || (PlacedCharacterName ~= "Malcolm") || (PlacedCharacterName ~= "Xan") || (PlacedCharacterName ~= "Brock") || (PlacedCharacterName ~= "Gaargod") || (PlacedCharacterName ~= "Axon") ); } simulated function bool ForceDefaultCharacter() { local PlayerController P; if ( !class'DeathMatch'.default.bForceDefaultCharacter ) return false; // validate and use player's model for enemies of same sex P = Level.GetLocalPlayerController(); if ( (P != None) && (P.PlayerReplicationInfo != None) ) { if ( P.PlayerReplicationInfo.bIsFemale ) { PlacedFemaleCharacterName = P.PlayerReplicationInfo.CharacterName; if ( !CheckValidFemaleDefault() ) { PlacedFemaleCharacterName = "Tamika"; return false; } } else { PlacedCharacterName = P.PlayerReplicationInfo.CharacterName; if ( !CheckValidMaleDefault() ) { PlacedCharacterName = "Jakob"; return false; } } } return true; } simulated function string GetDefaultCharacter() { if ( Level.IsDemoBuild() ) { PlacedFemaleCharacterName = "Tamika"; PlacedCharacterName = "Jakob"; } else { // make sure picking from valid default characters if ( !CheckValidFemaleDefault() ) PlacedFemaleCharacterName = "Tamika"; if ( !CheckValidMaleDefault() ) PlacedCharacterName = "Jakob"; } // return appropriate character based on this pawn's sex if ( (PlayerReplicationInfo != None) && PlayerReplicationInfo.bIsFemale ) return PlacedFemaleCharacterName; else return PlacedCharacterName; } simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow) { if ( (rec.Species == None) || ForceDefaultCharacter() ) rec = class'xUtil'.static.FindPlayerRecord(GetDefaultCharacter()); Species = rec.Species; RagdollOverride = rec.Ragdoll; if ( !Species.static.Setup(self,rec) ) { rec = class'xUtil'.static.FindPlayerRecord(GetDefaultCharacter()); if ( !Species.static.Setup(self,rec) ) return; } ResetPhysicsBasedAnim(); } simulated function ResetPhysicsBasedAnim() { bIsIdle = false; bWaitForAnim = false; } function Sound GetSound(xPawnSoundGroup.ESoundType soundType) { return SoundGroupClass.static.GetSound(soundType); } function class GetGibClass(xPawnGibGroup.EGibType gibType) { return GibGroupClass.static.GetGibClass(gibType); } simulated function DoDerezEffect() { Spawn(TeleportFXClass); } State Dying { simulated function AnimEnd( int Channel ) { ReduceCylinder(); } event FellOutOfWorld(eKillZType KillType) { local LavaDeath LD; // If we fall past a lava killz while dead- burn off skin. if( KillType == KILLZ_Lava ) { if ( !bSkeletized ) { if ( SkeletonMesh != None ) { LinkMesh(SkeletonMesh, true); Skins.Length = 0; } bSkeletized = true; LD = spawn(class'LavaDeath', , , Location + vect(0, 0, 10), Rotation ); if ( LD != None ) LD.SetBase(self); // This should destroy itself once its finished. PlaySound( sound'WeaponSounds.BExplosion5', SLOT_None, 1.5*TransientSoundVolume ); } return; } Super.FellOutOfWorld(KillType); } function LandThump() { // animation notify - play sound if actually landed, and animation also shows it if ( Physics == PHYS_None) { bThumped = true; PlaySound(GetSound(EST_CorpseLanded)); } } simulated function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class damageType) { local Vector SelfToHit, SelfToInstigator, CrossPlaneNormal; local float W; local float YawDir; local Vector HitNormal, shotDir; local Vector PushLinVel, PushAngVel; local Name HitBone; local float HitBoneDist; local int MaxCorpseYawRate; if ( bFrozenBody || bRubbery ) return; if( Physics == PHYS_KarmaRagdoll ) { // Can't shoot corpses during de-res if( bDeRes || bRubbery ) return; // Throw the body if its a rocket explosion or shock combo if( damageType.Default.bThrowRagdoll ) { shotDir = Normal(Momentum); PushLinVel = (RagDeathVel * shotDir) + vect(0, 0, 250); PushAngVel = Normal(shotDir Cross vect(0, 0, 1)) * -18000; KSetSkelVel( PushLinVel, PushAngVel ); } else if( damageType.Default.bRagdollBullet ) { if ( Momentum == vect(0,0,0) ) Momentum = HitLocation - InstigatedBy.Location; if ( FRand() < 0.65 ) { if ( Velocity.Z <= 0 ) PushLinVel = vect(0,0,40); PushAngVel = Normal(Normal(Momentum) Cross vect(0, 0, 1)) * -8000 ; PushAngVel.X *= 0.5; PushAngVel.Y *= 0.5; PushAngVel.Z *= 4; KSetSkelVel( PushLinVel, PushAngVel ); } PushLinVel = RagShootStrength*Normal(Momentum); KAddImpulse(PushLinVel, HitLocation); if ( (LifeSpan > 0) && (LifeSpan < DeResTime + 2) ) LifeSpan += 0.2; } else { PushLinVel = RagShootStrength*Normal(Momentum); KAddImpulse(PushLinVel, HitLocation); } if ( (DamageType.Default.DamageOverlayMaterial != None) && (Level.DetailMode != DM_Low) && !Level.bDropDetail ) SetOverlayMaterial(DamageType.Default.DamageOverlayMaterial, DamageType.default.DamageOverlayTime, true); return; } if ( DamageType.default.bFastInstantHit && GetAnimSequence() == 'Death_Spasm' && RepeaterDeathCount < 6) { PlayAnim('Death_Spasm',, 0.2); RepeaterDeathCount++; } else if (Damage > 0) { if ( InstigatedBy != None ) { if ( InstigatedBy.IsA('xPawn') && xPawn(InstigatedBy).bBerserk ) Damage *= 2; // Figure out which direction to spin: if( InstigatedBy.Location != Location ) { SelfToInstigator = InstigatedBy.Location - Location; SelfToHit = HitLocation - Location; CrossPlaneNormal = Normal( SelfToInstigator cross Vect(0,0,1) ); W = CrossPlaneNormal dot Location; if( HitLocation dot CrossPlaneNormal < W ) YawDir = -1.0; else YawDir = 1.0; } } if( VSize(Momentum) < 10 ) { Momentum = - Normal(SelfToInstigator) * Damage * 1000.0; Momentum.Z = Abs( Momentum.Z ); } SetPhysics(PHYS_Falling); Momentum = Momentum / Mass; AddVelocity( Momentum ); bBounce = true; RotationRate.Pitch = 0; RotationRate.Yaw += VSize(Momentum) * YawDir; MaxCorpseYawRate = 150000; RotationRate.Yaw = Clamp( RotationRate.Yaw, -MaxCorpseYawRate, MaxCorpseYawRate ); RotationRate.Roll = 0; bFixedRotationDir = true; bRotateToDesired = false; Health -= Damage; CalcHitLoc( HitLocation, vect(0,0,0), HitBone, HitBoneDist ); if( InstigatedBy != None ) HitNormal = Normal( Normal(InstigatedBy.Location-HitLocation) + VRand() * 0.2 + vect(0,0,2.8) ); else HitNormal = Normal( Vect(0,0,1) + VRand() * 0.2 + vect(0,0,2.8) ); DoDamageFX( HitBone, Damage, DamageType, Rotator(HitNormal) ); } } simulated function BeginState() { Super.BeginState(); AmbientSound = None; } simulated function Timer() { local KarmaParamsSkel skelParams; if ( !PlayerCanSeeMe() ) { Destroy(); } // If we are running out of life, bute we still haven't come to rest, force the de-res. // unless pawn is the viewtarget of a player who used to own it else if ( LifeSpan <= DeResTime && bDeRes == false ) { skelParams = KarmaParamsSkel(KParams); // check not viewtarget if ( (PlayerController(OldController) != None) && (PlayerController(OldController).ViewTarget == self) && (Viewport(PlayerController(OldController).Player) != None) ) { skelParams.bKImportantRagdoll = true; LifeSpan = FMax(LifeSpan,DeResTime + 2.0); SetTimer(1.0, false); return; } else { skelParams.bKImportantRagdoll = false; } // spawn derez StartDeRes(); } else { SetTimer(1.0, false); } } // We shorten the lifetime when the guys comes to rest. event KVelDropBelow() { local float NewLifeSpan; if(bDeRes == false) { //Log("Low Vel - Reducing LifeSpan!"); NewLifeSpan = DeResTime + 3.5; if(NewLifeSpan < LifeSpan) LifeSpan = NewLifeSpan; } } } >^HB9:%- w*8L>w.*R8CC-'-'a>($ G>Z7$_a.#wC*C-(C*-( G GcT2cg $B@q@qqY@q̱qY  y] Berserk!x5|+"+++>TJ6d3u =+  [.' '                             Fresh MeatI Must Break YouI'll Swallow Your SoulLost Is Your SoulMeet Your ExecutionerMy Name Is DeathNo Tears Please..Pain Will Purify YouI"                                   K"Z.] Female Night>>bclass Combo extends Info; #exec OBJ LOAD FILE=GameSounds.uax var localized string ExecMessage; var float AdrenalineCost; var float Duration; var Sound ActivateSound; var Material Icon; var class ActivationEffectClass; var sound ComboAnnouncement; // OBSOLETE var name ComboAnnouncementName; var int keys[4]; var class species; // CK_Up = 1; // CK_Down = 2; // CK_Left = 4; // CK_Right = 8; function PostBeginPlay() { local xPawn P; P = xPawn(Owner); if (P == None) { Destroy(); return; } if (ActivateSound != None) PlaySound(ActivateSound, SLOT_None, 2*TransientSoundVolume); if (ActivationEffectClass != None) Spawn(ActivationEffectClass, P,, P.Location, P.Rotation); // it's responsible for killing itself StartEffect(P); } // called when Adrenaline has been drained empty function AdrenalineEmpty() { Destroy(); } function Destroyed() { local xPawn P; P = xPawn(Owner); if (P != None) { StopEffect(P); if (P.CurrentCombo == self) P.CurrentCombo = None; } } function StartEffect(xPawn P); function StopEffect(xPawn P); simulated function Tick(float DeltaTime) { local Pawn P; P = Pawn(Owner); if ( (P == None) || (P.Controller == None) ) { Destroy(); return; } if ( (P.Controller.PlayerReplicationInfo != None) && (P.Controller.PlayerReplicationInfo.HasFlag != None) ) DeltaTime *= 2; P.Controller.Adrenaline -= AdrenalineCost*DeltaTime/Duration; if (P.Controller.Adrenaline <= 0.0) { P.Controller.Adrenaline = 0.0; Destroy(); } } >Hclass ChampRosterSemiFinal extends xTeamRoster; /* * Roster for championship levels. * Each level has its own roster. */ >E>>8class xNightMaleSoundGroup extends xPawnSoundGroup; hM i_ }2*Y 9Y 6Y >>:class xNightFemaleSoundGroup extends xPawnSoundGroup; jN km@ }2*Y 9Y  6Y >fY2lmd۹aE/  ]TeamSymbols_UT2003.Sym01 YMalcolmBrockLauren]Championship Match>>L 0.05>m 0.35>Bclass ChampRosterFinal extends xDMRoster; /* * Roster for championship levels. * Each level has its own roster. */ >oclass xMutatorList extends Actor; var() array MutatorList; simulated function Init(optional bool bLoadClasses) { local CacheManager.MutatorRecord tmp; local int i, j; class'CacheManager'.static.GetMutatorList(MutatorList); // sort by name for (i=0; i(DynamicLoadObject(MutatorList[i].ClassName,class'Class')); // } } pOKqPزFʁ)>>W//============================================================================= // xMonitorC. //============================================================================= class xMonitorC extends xMonitor; nrP Bs4 n?3t"$?>%o[2tc%1+  ]TeamSymbols_UT2003.Sym01 Y Malcolm]Championship Match>>W//============================================================================= // xMonitorB. //============================================================================= class xMonitorB extends xMonitor; >H(n G>vq %&#w*a $ ( G>wa T 9<a   G&PaB Y6y&Ƞ <b]intro_gorgefan.intro_gorgefan>>>>x` L K*!j 9=` @!r GB >x*4c jn4!O$Y4!T >n>$VSn?$ V$gn4!O$g4!Xn?$ $g4!{$g4!z$ g4!k$g4!wn>$n(?$$g+4!z $g@4!P$gU4!e$ gg4!_ $  G >{uu%u,{uO ut uO frut*``utiu r G >Vclass CachePlayers extends xUtil native; var array Records; > V _ [ n _ ?r* - `%:% 2%d9?%22&9?%22,9?%22,9?%22,2_F2_F%!_L=%:%:Fm_33>%:F&:%_-i';,;%;:;&:;:%-i(;}%:F_-io%o,rot*rotY **rotY .[-j';%;,;:;ot~ -j(;p-jTot%:%o_2 G>@>nuQ BB!0n?3t"$?>>^/* BossDM designed for 1 vs 1 DM against boss bot that tries to stay just a little better than you */ class BossDM extends xDeathMatch CacheExempt; var float BaseDifficulty; event InitGame( string Options, out string Error ) { Super.InitGame(Options, Error); BaseDifficulty = GameDifficulty; bAdjustSkill = true; bForceRespawn = true; } function AdjustSkill(AIController B, PlayerController P, bool bWinner) { if ( B.PlayerReplicationInfo.Score <= P.PlayerReplicationInfo.Score + 1 ) { if ( bWinner ) { if ( AdjustedDifficulty > BaseDifficulty + 1.5 ) AdjustedDifficulty -= 0.2; return; } else if ( AdjustedDifficulty < BaseDifficulty + 4 ) AdjustedDifficulty += 0.8; } else if ( bWinner ) { if ( B.PlayerReplicationInfo.Score > P.PlayerReplicationInfo.Score + 4 ) Bot(B).Accuracy *= 0.5; AdjustedDifficulty = FMax(BaseDifficulty, AdjustedDifficulty - 0.4); } B.Skill = AdjustedDifficulty; } 6Cf]6 D։67' _zVGB uzVGB _zVGB uzVGB| _  w<bF]Championship Match\ >>W//============================================================================= // xMonitorA. //============================================================================= class xMonitorA extends xMonitor; nER BF)gn?3t>>S TAa!<9S iZGS  G>i//============================================================================= // xMonitor - Team monitors for designating team areas. //============================================================================= class xMonitor extends Decoration abstract; var() byte Team; var() Material RedTeamShader; var() Material BlueTeamShader; var GameReplicationInfo GRI; simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(RedTeamShader); Level.AddPrecacheMaterial(BlueTeamShader); super.UpdatePrecacheMaterials(); } simulated function UpdateForTeam() { if (Team == 0) Skins[2] = RedTeamShader; else Skins[2] = BlueTeamShader; if ( (GRI != None) && (Team < 2) && (GRI.TeamSymbols[Team] != None) ) Combiner(Shader(Skins[2]).SelfIllumination).Material2 = GRI.TeamSymbols[Team]; } simulated function SetGRI(GameReplicationInfo NewGRI) { GRI = NewGRI; UpdateForTeam(); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); } >GVGI""rV*r.* ViZu{Vd Z ` V. TV G>7class xMercMaleSoundGroup extends xPawnSoundGroup; >Ij{ A5G>MQ V# G>>>LN V# G>NF(LV# G>OO V# G>Pz W# G>QSw X$ G>@>>RUk X#$ G>@>>TWC \M$' G>>>VYq a$ G>Z>>[>>\>>>>XV ihS%R r* 1-Kr*r* B9P  W 9?6BT9?9DW 9?6T9?T9?T9?T9?B6B9DTV a+BOB_V a+B G JS ^P }2*Y 9Y 6Y >>9class xMercFemaleSoundGroup extends xPawnSoundGroup; _T `Wn }2*Y 9Y 6Y >>`class xKillerMessagePlus extends LocalMessage; var(Message) localized string YouKilled; var(Message) localized string YouKilledTrailer; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if (RelatedPRI_1 == None) return ""; if (RelatedPRI_2 == None) return ""; if (RelatedPRI_2.PlayerName != "") return Default.YouKilled@RelatedPRI_2.PlayerName@Default.YouKilledTrailer; } >]^ ( G>bZ ( G>ce~") G>>>d^ _ _)~^  G>@>>f`)tw*a  - 'brEb-^'$a?' G>hj*'-(- ( G>iZ $+fE?b?-(Ua9?%a?Pa9?%*R w*%a@r* b9?,@-Z 'br* c-Z  E9?, 7-()6vE-(A\ q \ a L L|a+_c?[ uq a [ a+_c-'a+ 6H@ G>g>>N//============================================================================= // xKicker - from UT // Creatures will jump on hitting this trigger in direction specified //============================================================================= class xKicker extends Triggers placeable; var() vector KickVelocity; var() name KickedClasses; var() bool bKillVelocity; var() bool bRandomize; simulated function Touch( actor Other ) { local Actor A; if ( !Other.IsA(KickedClasses) ) return; PendingTouch = Other.PendingTouch; Other.PendingTouch = self; if( Event != '' ) foreach AllActors( class 'Actor', A, Event ) A.Trigger( Other, Other.Instigator ); } simulated function PostTouch( actor Other ) { local bool bWasFalling; local vector Push; local float PMag; bWasFalling = ( Other.Physics == PHYS_Falling ); if ( bKillVelocity ) Push = -1 * Other.Velocity; else Push.Z = -1 * Other.Velocity.Z; if ( bRandomize ) { PMag = VSize(KickVelocity); Push += PMag * Normal(KickVelocity + 0.5 * PMag * VRand()); } else Push += KickVelocity; if ( Other.IsA('Bot') ) { if ( bWasFalling ) Pawn(Other).JumpOffPawn(); Bot(Other).SetFall(); } Other.SetPhysics(PHYS_Falling); Other.Velocity += Push; } lgG ml؂uʁ)ʁ)ʁ)ʁ)h|ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)ʁ)Qd=_>>KzvU=G> a i5$ a _a  G>^class xJuggMaleSoundGroup extends xPawnSoundGroup; static function Sound GetHitSound() { if ( FRand() < 0.01 ) return sound'NewDeath.mj_hit15'; return default.PainSounds[rand(default.PainSounds.length)]; } >o\ \6 Z [ \  G>Q+)J \ J))  )  )  )  )  )  )  )  )  )  )  )   G >i>>X sN 4Cri*@{ipX iY  G >q`H7:r-'-^'$a?' G>uj"'8?"-( G>vb $..9vEADDq Da L L|b ua b q _ G>@>>class xJuggGibGroup extends xPawnGibGroup; static function class GetBloodEmitClass() { if ( FRand() < 0.4 ) return class'BotSparks'; if ( class'GameInfo'.static.UseLowGore() ) { if ( class'GameInfo'.static.NoBlood() ) return Default.NoBloodEmitClass; return Default.LowGoreBloodEmitClass; } return Default.BloodEmitClass; } >wMS= q!z  G>nc rZ=>d%/a0 -c :dLc 9d,:10 G>x>>{Y Ag?HS%SdqY  SL H qP vSY HSP qSH(U H' G>9class xJuggFemaleSoundGroup extends xPawnSoundGroup; >L//============================================================================= // Jugg Female Voice. //============================================================================= class JuggFemaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax >S> ~Y A] }2*Y 9Y 6Y >>Y// ==================================================================== // Class: XGame.xIntroPawn // Parent: UnrealGame.UnrealPawn // // These pawns are used in the intro sequence. // ==================================================================== class xIntroPawn extends UnrealPawn; var ShadowProjector PawnShadow; var() vector ShadowDirection; var() byte ShadowDarkness; var() string MeshNameString; function AddDefaultInventory(); // Override simulated function Destroyed() { if( PawnShadow != None ) PawnShadow.Destroy(); Super.Destroyed(); } simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( (Mesh == None) && (MeshNameString != "") ) LinkMesh(mesh(DynamicLoadObject(MeshNameString,class'Mesh'))); if(bShadowCast) { PawnShadow = Spawn(class'ShadowProjector',Self,'',Location); PawnShadow.ShadowActor = self; PawnShadow.RootMotion = True; PawnShadow.LightDirection = Normal(ShadowDirection); PawnShadow.LightDistance = 192; PawnShadow.MaxTraceDistance = 350; PawnShadow.InitShadow(); PawnShadow.ShadowTexture.ShadowDarkness = ShadowDarkness; } } >R//============================================================================= // Player start location with field position. //============================================================================= class xFieldPlayerStart extends PlayerStart; var() byte PositionNumber; // position on the field, as designated by the LD CRTDvX2q}oB >>}Zu8Aa7R , DZ AZ 6A9D9?.9?Z 9?,d6A9D9?]6A9D9?.B99AVDB9?DB9?,2DalS VD(4wD*lD9?,lB9?,2XwD*lB9?,2^V G>0class xFallingVolume extends PhysicsVolume; >D>F[ @` 2HN*bQ ^$Btb:5?H>=]cep]in air>>8class xEgyptMaleSoundGroup extends xPawnSoundGroup; I\ JG }2*Y 9Y 6Y >>:class xEgyptFemaleSoundGroup extends xPawnSoundGroup; K] L? }2*Y 9Y 6Y >>T >>S//============================================================================= // xDoubleDom //============================================================================= class xDoubleDom extends TeamGame config; // todo: doesn't handle the case where controllingpawn leaves the game or is killed (when it awards score, could be dangling...) var() config int TimeToScore; // duration both points must be controlled for to score a point // TODO (rjp) update this class to use new time tracking vars that were merged from Onslaught/Assault/BombingRun var() config int TimeDisabled; // duration both points are disabled for after a point is scored var xDomPoint xDomPoints[2]; // the two domination points in the level var int ScoreCountDown; // count down until a point is scored var transient int DisabledCountDown; // count down until points are re-enabled after a point is scored var() Sound ControlSounds[2]; // OBSOLETE control sounds var() Sound ScoreSounds[2]; // OBSOLETE score sounds var() Sound AvertedSounds[4]; // OBSOLETE score averted sounds var() name ControlSoundNames[2]; // control sounds var() name ScoreSoundNames[2]; // score sounds var() name AvertedSoundNames[4]; // score averted sounds var sound NewRoundSound; // OBSOLETE // mc - localized PlayInfo descriptions & extra info const DDPROPNUM = 2; var localized string DDomPropsDisplayText[DDPROPNUM]; var localized string DDomPropDescText[DDPROPNUM]; static function PrecacheGameTextures(LevelInfo myLevel) { class'xTeamGame'.static.PrecacheGameTextures(myLevel); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointGREY'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointLINESg'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMPointABg'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMPointABr'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointLINESr'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointRED'); myLevel.AddPrecacheMaterial(Material'XGameTextures.RedScreenA'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMPointABb'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointLINESb'); myLevel.AddPrecacheMaterial(Material'XGameTextures.DOMpointBLUE'); myLevel.AddPrecacheMaterial(Material'XEffects.RedMarker_T'); myLevel.AddPrecacheMaterial(Material'XEffects.BlueMarker_T'); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( !bRewardSounds ) { V.PrecacheSound(Default.ControlSoundNames[0]); V.PrecacheSound(Default.ControlSoundNames[1]); V.PrecacheSound(Default.ScoreSoundNames[0]); V.PrecacheSound(Default.ScoreSoundNames[1]); V.PrecacheSound(Default.AvertedSoundNames[1]); V.PrecacheSound(Default.AvertedSoundNames[3]); V.PrecacheSound('NewRoundIn'); } } /* OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor */ simulated function UpdateAnnouncements() {} // FIXME DDOM- 16 is alpha secure, 17 is bravo secure function int GetStatus(PlayerController Sender, Bot B) { local name BotOrders; BotOrders = B.GetOrders(); if ( B.Pawn == None ) { if ( (BotOrders == 'DEFEND') && (B.Squad.Size == 1) ) return 0; } else if ( (B.Enemy == None) && (B.Squad.SquadObjective != None) && (B.Squad.SquadObjective.DefenderTeamIndex == B.Squad.Team.TeamIndex) && B.LineOfSightTo(B.Squad.SquadObjective) ) { if ( DominationPoint(B.Squad.SquadObjective).PrimaryTeam == 0 ) return 16; else return 17; } else return super.GetStatus(Sender, B); } static function int OrderToIndex(int Order) { if(Order == 0) return 12; if(Order == 2) return 13; return Order; } static function PrecacheGameStaticMeshes(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); myLevel.AddPrecacheStaticMesh(StaticMesh'XGame_rc.DomRing'); myLevel.AddPrecacheStaticMesh(StaticMesh'XGame_rc.DomAMesh'); myLevel.AddPrecacheStaticMesh(StaticMesh'XGame_rc.DomBMesh'); } function PostBeginPlay() { local NavigationPoint N; local int i; Super.PostBeginPlay(); // find the first two domination points in the level i = 0; for(N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint) { if (N.IsA('xDomPoint')) { xDomPoints[i] = xDomPoint(N); xDomPoints[i].ResetCount = ResetCount; i++; if (i == 2) break; } } if (i != 2) { // there were not enough domination points in the level! log("xDoubleDom: Level has wrong number of Domination Points!",'Error'); } } State MatchInProgress { function Timer() { local Controller TeamMate; local int i; Super.Timer(); if (bGameEnded || xDomPoints[0] == None || xDomPoints[1] == None) return; // are both points currently disabled? if (DisabledCountDown > 0) { DisabledCountDown--; if ( DisabledCountDown == 7 ) { for ( TeamMate = Level.ControllerList; TeamMate != None; TeamMate = TeamMate.NextController ) if ( PlayerController(TeamMate) != None ) PlayerController(TeamMate).PlayStatusAnnouncement('NewRoundIn',1,true); } else if ( (DisabledCountDown > 0) && (DisabledCountDown < 6) ) BroadcastLocalizedMessage(class'TimerMessage', DisabledCountDown); if (DisabledCountDown == 0) { xDomPoints[0].ResetPoint(true); xDomPoints[1].ResetPoint(true); } } // nothing more to do unless the same team controls both points if ( (xDomPoints[0].ControllingTeam != xDomPoints[1].ControllingTeam) || (xDomPoints[0].ControllingTeam == None) ) return; if (ScoreCountDown == TimeToScore) { for (TeamMate = Level.ControllerList; TeamMate != None; TeamMate = TeamMate.NextController) { if (TeamMate.IsA('PlayerController')) PlayerController(TeamMate).PlayStatusAnnouncement(ControlSoundNames[xDomPoints[0].ControllingTeam.TeamIndex],1,true); } } if (ScoreCountDown > 0 && ScoreCountDown < 9) BroadcastLocalizedMessage(class'TimerMessage', ScoreCountDown ); if (ScoreCountDown > 0) { // decrement the time remaining until a point is scored ScoreCountDown--; return; } for (TeamMate = Level.ControllerList; TeamMate != None; TeamMate = TeamMate.NextController) { if (TeamMate.IsA('PlayerController')) { PlayerController(TeamMate).PlayStatusAnnouncement(ScoreSoundNames[xDomPoints[0].ControllingTeam.TeamIndex],1,true); PlayerController(TeamMate).ClientPlaySound(class'CTFMessage'.Default.Riffs[Rand(3)]); } } // controlling team has scored! xDomPoints[0].ControllingTeam.Score += 1.0; xDomPoints[0].ControllingTeam.NetUpdateTime = Level.TimeSeconds - 1; TeamScoreEvent(xDomPoints[0].ControllingTeam.TeamIndex,1,"dom_teamscore"); // award scoring players some Adrenaline and increase their score if ( (xDomPoints[0].ControllingPawn != None) && (xDomPoints[0].ControllingPawn.Controller != None) ) { xDomPoints[0].ControllingPawn.Controller.PlayerReplicationInfo.Score += 5.0; xDomPoints[0].ControllingPawn.Controller.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; xDomPoints[0].ControllingPawn.Controller.AwardAdrenaline(ADR_Goal); ScoreEvent(xDomPoints[0].ControllingPawn.Controller.PlayerReplicationInfo,5,"dom_score"); } if ( (xDomPoints[1].ControllingPawn != None) && (xDomPoints[1].ControllingPawn.Controller != None) ) { xDomPoints[1].ControllingPawn.Controller.PlayerReplicationInfo.Score += 5.0; xDomPoints[1].ControllingPawn.Controller.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; xDomPoints[1].ControllingPawn.Controller.AwardAdrenaline(ADR_Goal); ScoreEvent(xDomPoints[1].ControllingPawn.Controller.PlayerReplicationInfo,5,"dom_score"); } // reset count ScoreCountDown = TimeToScore; // make all control points be untouchable for a short period DisabledCountDown = TimeDisabled; // reset both domination points and disable them xDomPoints[0].ResetPoint(false); xDomPoints[1].ResetPoint(false); // check if the game is over because either team has achieved the goal limit if ( GoalScore > 0 ) { for (i = 0; i < 2; i++ ) { if ( Teams[i].Score >= GoalScore ) { EndGame(None,"teamscorelimit"); } } } } } function ClearControl(Controller Other) { local Controller P; local PlayerController Player; local Pawn Pick; if ( (PlayerController(Other) == None) || (Other.PlayerReplicationInfo.Team.TeamIndex == 255) ) return; if ( (xDomPoints[0].ControllingPawn != Other) && (xDomPoints[1].ControllingPawn != Other) ) return; // find a suitable teammate for( P=Level.ControllerList; P!=None; P=P.nextController ) { Player = PlayerController(P); if ( (Player != None) && (Player != Other) && (Player.PlayerReplicationInfo.Team == Other.PlayerReplicationInfo.Team) ) { Pick = Player.Pawn; break; } } // update both control points with the new controlling pawn, since the other one is leaving (if no other suitable // teammate was found, then the point will return to neutral) if (xDomPoints[0].ControllingPawn == Other) { xDomPoints[0].ControllingPawn = Pick; xDomPoints[0].UpdateStatus(); } if (xDomPoints[1].ControllingPawn == Other) { xDomPoints[1].ControllingPawn = Pick; xDomPoints[1].UpdateStatus(); } } function Logout( Controller Exiting ) { ClearControl(Exiting); Super.Logout(Exiting); } function ResetCount() { local name Aversion; local Controller TeamMate; if ( ScoreCountDown < TimeToScore ) { Aversion = AvertedSoundNames[1]; if (TimeToScore - ScoreCountDown > (TimeToScore/2)) { if (TimeToScore - ScoreCountDown >= (TimeToScore-1)) { // within one second of a score Aversion = AvertedSoundNames[3]; } else { // halfway to a score Aversion = AvertedSoundNames[2]; } } else if ( TimeToScore - ScoreCountDown < 2 ) { for (TeamMate = Level.ControllerList; TeamMate != None; TeamMate = TeamMate.NextController) { if (TeamMate.IsA('PlayerController')) PlayerController(TeamMate).PlayAnnouncement(Sound'GameSounds.DDAverted',2,true); } ScoreCountDown = TimeToScore; return; } for (TeamMate = Level.ControllerList; TeamMate != None; TeamMate = TeamMate.NextController) { if (TeamMate.IsA('PlayerController')) PlayerController(TeamMate).PlayStatusAnnouncement(Aversion,2,true); } } ScoreCountDown = TimeToScore; } function bool CriticalPlayer(Controller Other) { // In DOM, critical players are anyone within 1024 units of the dom point // who have los to it. if ( (vsize(Other.Pawn.Location - xDomPoints[0].Location) <=1024) || (vsize(Other.Pawn.Location - xDomPoints[1].Location) <=1024) ) return true; return Super.CriticalPlayer(Other); } function Killed( Controller Killer, Controller Killed, Pawn KilledPawn, class damageType ) { if ( (Killer != None) && Killer.bIsPlayer && Killed.bIsPlayer && (Killer.PlayerReplicationInfo.Team != Killed.PlayerReplicationInfo.Team) && (xPawn(Killer.Pawn) != None) && (DisabledCountDown > 0)) { Killer.AwardAdrenaline(ADR_MinorBonus); } Super.Killed(Killer, Killed, KilledPawn, damageType); } function GetServerDetails(out ServerResponseLine ServerState) { Super.GetServerDetails(ServerState); AddServerDetail( ServerState, "TimeToScore", TimeToScore ); AddServerDetail( ServerState, "TimeDisabled", TimeDisabled ); } static function FillPlayInfo(PlayInfo PlayInfo) { local int i; Super.FillPlayInfo(PlayInfo); // Always begin with calling parent PlayInfo.AddSetting("Game", "TimeToScore", default.DDomPropsDisplayText[i++], 40, 1, "Text", "3;0:60",,,True); PlayInfo.AddSetting("Game", "TimeDisabled", default.DDomPropsDisplayText[i++], 40, 1, "Text", "3;0:60",,,True); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "TimeToScore": return default.DDomPropDescText[0]; case "TImeDisabled": return default.DDomPropDescText[1]; } return Super.GetDescriptionText(PropName); } function actor FindSpecGoalFor(PlayerReplicationInfo PRI, int TeamIndex) { local XPlayer PC; local xDomLetter Dom[2],d; PC = XPlayer(PRI.Owner); if (PC==None) return none; foreach AllActors(class'xDomLetter',d) if (xDomA(d)!=None) Dom[0]=d; else Dom[1]=d; if ( vsize(PC.Location - Dom[0].Location) < vsize(PC.Location - Dom[1].Location) ) return Dom[1]; else return Dom[0]; return none; } event SetGrammar() { LoadSRGrammar("DOM"); } event Destroyed() { local int i; for ( i = 0; i < 2; i++ ) { if ( xDomPoints[i] != None ) xDomPoints[i].ResetCount = None; } Super.Destroyed(); } >P MN RQrT *rm*N{mP mQ  G >E @;Dw *J y%yfwJ*JJrJ*JJa/!wwJ*Ja!B Jy&* G>z//============================================================================= // xDomRing. //============================================================================= class xDomRing extends Decoration; var() Material RedTeamShader; var() Material BlueTeamShader; var() Material NeutralShader; >J>>L//============================================================================= // banner. //============================================================================= class banner_red extends uTeamBanner; #exec OBJ LOAD FILE=SC_Volcano_T.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } >R//============================================================================= // Nightmare Female Voice. //============================================================================= class NightFemaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax >Px vAF3x %m x LTm  CT xv  6xv  xTx9?,draO N Tx(* G>P //============================================================================= // xDomPointB. // For Double Domination (xDoubleDom) matches. //============================================================================= class xDomPointB extends xDomPoint placeable; simulated function PostBeginPlay() { Super.PostBeginPlay(); if (Level.NetMode != NM_Client) { DomLetter = Spawn(class'XGame.xDomB',self,,Location+EffectOffset,Rotation); DomRing = Spawn(class'XGame.xDomRing',self,,Location+EffectOffset,Rotation); } SetShaderStatus(CNeutralState[0],SNeutralState,CNeutralState[1]); } Vb` @a2WIp>@I՟3} t]BuWvwH] Point B,Y >>T>>D //============================================================================= // xDomPointA. // For Double Domination (xDoubleDom) matches. //============================================================================= class xDomPointA extends xDomPoint placeable; simulated function PostBeginPlay() { Super.PostBeginPlay(); if (Level.NetMode != NM_Client) { DomLetter = Spawn(class'XGame.xDomA',self,,Location+EffectOffset,Rotation); DomRing = Spawn(class'XGame.xDomRing',self,,Location+EffectOffset,Rotation); } SetShaderStatus(CNeutralState[0],SNeutralState,CNeutralState[1]); } Yaa @a2ZueI՟3} t]AuZS5H] Point A>>M//============================================================================= // xDomPoint. // For Double Domination (xDoubleDom) matches. //============================================================================= class xDomPoint extends DominationPoint; #exec OBJ LOAD FILE=UCGeneric.utx var() localized String PointName; // display name of this control point var() Sound ControlSound; // sound played when this control point changes hands var() Name ControlEvent; // any actors with tags matching this will be triggered when activity occurs on the control point var(Material) Material DomCombiner[2]; var(Material) Material CRedState[2]; var(Material) Material CBlueState[2]; var(Material) Material CNeutralState[2]; var(Material) Material CDisableState[2]; var(Material) Shader DomShader; var(Material) Material SRedState; var(Material) Material SBlueState; var(Material) Material SNeutralState; var(Material) Material SDisableState; var(Material) float PulseSpeed; var xDOMLetter DomLetter; var xDOMRing DOMRing; var transient byte NoPulseAlpha; var vector EffectOffset; delegate ResetCount(); simulated function PostBeginPlay() { Super.PostBeginPlay(); if ( (Level.NetMode != NM_Client) && !Level.Game.IsA('xDoubleDom') ) bHidden = true; } function string GetHumanName() { return PointName; } function Touch(Actor Other) { if ( (Pawn(Other) == None) || !Pawn(Other).IsPlayerPawn() ) return; // is this domination point controllable right now? if ( bControllable && (ControllingTeam != Pawn(Other).PlayerReplicationInfo.Team) ) { // touching pawn is now the controlling pawn for this domination point ControllingPawn = Pawn(Other); // update the domination point's status UpdateStatus(); } } function UnTouch(Actor Other) { local Pawn NewControl; if ( Other == ControllingPawn ) ForEach TouchingActors(class'Pawn', NewControl) { if ( NewControl.IsPlayerPawn() ) { ControllingPawn = NewControl; UpdateStatus(); break; } } } simulated function float Pulse( float x ) { if ( x < 0.5 ) return 2.0 * ( x * x * (3.0 - 2.0 * x) ); else return 2.0 * (1.0 - ( x * x * (3.0 - 2.0 * x) )); } simulated function Tick( float t ) { local float f; local float alpha; Super.Tick(t); if ( DomShader != None && PulseSpeed != 0.0) { if (bControllable) { f = Level.TimeSeconds * PulseSpeed; f = f - int(f); alpha = 255.0; ConstantColor(DomShader.SpecularityMask).Color.A = Pulse(f) * alpha; } else { ConstantColor(DomShader.SpecularityMask).Color.A = NoPulseAlpha; } } } simulated function PostNetReceive() { local xDomMonitor M; local byte NewTeam; if( !bControllable ) { SetShaderStatus(CDisableState[0],SDisableState,CDisableState[1]); NewTeam = 254; } else if ( ControllingTeam == None ) { SetShaderStatus(CNeutralState[0],SNeutralState,CNeutralState[1]); NewTeam = 255; } else { if ( ControllingTeam.TeamIndex == 0 ) SetShaderStatus(CRedState[0],SRedState,CRedState[1]); else SetShaderStatus(CBlueState[0],SBlueState,CBlueState[1]); NewTeam = ControllingTeam.TeamIndex; } // send the event to trigger related actors ForEach DynamicActors(class'xDomMonitor', M, ControlEvent) { M.NewTeam = NewTeam; M.UpdateForTeam(); } } simulated function SetShaderStatus( Material mat1, Material mat2, Material mat3 ) { if( DomCombiner[0] != None ) Combiner(DomCombiner[0]).Material1 = mat1; if( DomCombiner[1] != None ) Combiner(DomCombiner[1]).Material1 = mat3; if( DomShader != None ) { if (PulseSpeed != 0.0) DomShader.Specular = mat2; else DomShader.Diffuse = mat2; } } function UpdateStatus() { local Actor A; local TeamInfo NewTeam; local int OldIndex; if ( bControllable && ((ControllingPawn == None) || !ControllingPawn.IsPlayerPawn()) ) { ControllingPawn = None; // check if any pawn currently touching ForEach TouchingActors(class'Pawn', ControllingPawn) { if ( ControllingPawn.IsPlayerPawn() ) break; else ControllingPawn = None; } } // nothing to do if there is already a controlling team but no controlling pawn if (ControllingTeam != None && ControllingPawn == None) return; // who is the current controlling team of this domination point? if (ControllingPawn == None) NewTeam = None; else NewTeam = ControllingPawn.Controller.PlayerReplicationInfo.Team; // do nothing if there is no change in the controlling team (and there is a controlling team) if ((NewTeam == ControllingTeam) && (NewTeam != None)) return; // for AI, update DefenderTeamIndex NetUpdateTime = Level.TimeSeconds - 1; OldIndex = DefenderTeamIndex; if ( NewTeam == None ) DefenderTeamIndex = 255; // ie. "no team" since 0 is a valid team else DefenderTeamIndex = NewTeam.TeamIndex; if ( bControllable && (OldIndex != DefenderTeamIndex) ) UnrealMPGameInfo(Level.Game).FindNewObjectives(self); // otherwise we have a new controlling team, or the domination point is being re-enabled ControllingTeam = NewTeam; if (ControllingTeam != None) { PlayAlarm(); } ResetCount(); if (ControllingTeam == None) { // goes dark while untouchable (disabled) after a score if (!bControllable) { LightType = LT_None; SetShaderStatus(CDisableState[0],SDisableState,CDisableState[1]); if (DomLetter != None) DomLetter.bHidden = true; if (DomRing != None) DomRing.bHidden = true; } // goes back to white when neutral again else if (bControllable) { // change light emission properties LightHue = 255; LightBrightness = 128; LightSaturation = 255; LightType = LT_SubtlePulse; SetShaderStatus(CNeutralState[0],SNeutralState,CNeutralState[1]); if (DomLetter != None) { DomLetter.bHidden = false; DomLetter.Skins[0] = class'xDomLetter'.Default.NeutralShader; DomLetter.RepSkin = class'xDomLetter'.Default.NeutralShader; } if (DomRing != None) { DomRing.bHidden = false; DomRing.Skins[0] = class'xDomRing'.Default.NeutralShader; DomRing.RepSkin = class'xDomRing'.Default.NeutralShader; } } } else if (ControllingPawn.Controller.PlayerReplicationInfo.Team.TeamIndex == 0) { // red team controls it now LightType = LT_SubtlePulse; LightHue = 0; LightBrightness = 255; LightSaturation = 128; SetShaderStatus(CRedState[0],SRedState,CRedState[1]); if (DomLetter != None) { DomLetter.bHidden = false; DomLetter.Skins[0] = class'xDomLetter'.Default.RedTeamShader; DomLetter.RepSkin = class'xDomLetter'.Default.RedTeamShader; } if (DomRing != None) { DomRing.bHidden = false; DomRing.Skins[0] = class'xDomRing'.Default.RedTeamShader; DomRing.RepSkin = class'xDomRing'.Default.RedTeamShader; } } else { // blue team controls it now LightType = LT_SubtlePulse; LightHue = 170; LightBrightness = 255; LightSaturation = 128; SetShaderStatus(CBlueState[0],SBlueState,CBlueState[1]); if (DomLetter != None) { DomLetter.bHidden = false; DomLetter.Skins[0] = class'xDomLetter'.Default.BlueTeamShader; DomLetter.RepSkin = class'xDomLetter'.Default.BlueTeamShader; } if (DomRing != None) { DomRing.bHidden = false; DomRing.Skins[0] = class'xDomRing'.Default.BlueTeamShader; DomRing.RepSkin = class'xDomRing'.Default.BlueTeamShader; } } // send the event to trigger related actors foreach DynamicActors(class'Actor', A, ControlEvent) A.Trigger(self, ControllingPawn); } function ResetPoint(bool enabled) { if ( !bControllable && enabled ) UnrealMPGameInfo(Level.Game).FindNewObjectives(self); NetUpdateTime = Level.TimeSeconds - 1; bControllable = enabled; ControllingPawn = None; ControllingTeam = None; UpdateStatus(); } function PlayAlarm() { SetTimer(5.0, false); AmbientSound = ControlSound; } function Timer() { AmbientSound = None; // don't call super here since we don't want it incrementing score! } function bool BetterObjectiveThan(GameObjective Best, byte DesiredTeamNum, byte RequesterTeamNum) { if ( (Best == None) || (DefenderTeamIndex == DesiredTeamNum) ) return true; return false; } >@>>\>>UJ_(H~J #@Jy~qy9?,q~qyM @-^yJ %fL zLAeL|"fDzDe?yfeyzQ feI@9?,9?,Q y9?,I@9?,9Pq GgI6_p'! =+  [.' '                             Fresh MeatI Must Break YouI'll Swallow Your SoulLost Is Your SoulMeet Your ExecutionerMy Name Is DeathNo Tears Please..Pain Will Purify YouI"                                   K"Z.= Male Night>>]>>y>>C//============================================================================= // xDOMMonitorB - Domination monitor (two screens). //============================================================================= class xDOMMonitorB extends xDOMMonitor; pbWBc3.pnSMsrqL>>C//============================================================================= // xDOMMonitorA - Domination monitor (two screens). //============================================================================= class xDOMMonitorA extends xDOMMonitor; pdZBeGpnSMsrqL>>P//============================================================================= // xDOMMonitor - Domination monitor (two screens). //============================================================================= class xDOMMonitor extends xMonitor abstract; var() Material RedShader; var() Material BlueShader; var() Material ActiveShader; var() Material InactiveShader; var() Material ActiveTeamShader; var() Material InactiveTeamShader; var byte NewTeam; simulated function UpdateForTeam() { if ( NewTeam == 254 ) { Skins[2] = InactiveTeamShader; Skins[3] = InactiveShader; } else if ( NewTeam == 0 ) { Skins[2] = RedTeamShader; Skins[3] = RedShader; } else if ( NewTeam == 1 ) { Skins[2] = BlueTeamShader; Skins[3] = BlueShader; } else { Skins[2] = ActiveTeamShader; Skins[3] = ActiveShader; } if ( (GRI != None) && (NewTeam < 2) && !Level.IsSoftwareRendering() ) Combiner(Shader(Skins[2]).SelfIllumination).Material2 = GRI.TeamSymbols[NewTeam]; } simulated function Trigger( actor Other, pawn EventInstigator ) { local xDomPoint DPoint; DPoint = xDomPoint(Other); if ( DPoint != None ) { // is the point disabled? if (!DPoint.bControllable) NewTeam = 254; else if (DPoint.ControllingTeam == None) NewTeam = 255; else NewTeam = DPoint.ControllingTeam.TeamIndex; UpdateForTeam(); } } >N//============================================================================= // Nightmare Male Voice. //============================================================================= class NightMaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax > ^P V LiwP  -'[w*a ua+_ P  G>a//============================================================================= // PlayerLight. //============================================================================= class PlayerLight extends ScaledSprite; var() float ExtinguishTime; singular function BaseChange(); >hL sMQ{L DL QwD*D-Dd  oJ  XJ  GB>`>>EK N9*K %A $ !&B $  G >t//============================================================================= // xDomMessage. //============================================================================= class xDomMessage extends LocalMessage; var(Message) localized string YouControlBothPointsString; var(Message) localized string EnemyControlsBothPointsString; var(Message) color RedColor, BlueColor; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { if (Switch == 0) return Default.RedColor; else return Default.BlueColor; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch (Switch) { case 0: return Default.YouControlBothPointsString; break; case 1: return Default.EnemyControlsBothPointsString; break; } return ""; } >x2N POcN I.N ;wI*I xd'`9:9:$|--X! Gmlg 2oF  t ]! Your team controls both points!r ]! The enemy controls both points!R*HP*HkBS@@"h*HeZ$=|">>u//============================================================================= // xDomLetter. //============================================================================= class xDomLetter extends Decoration abstract; #exec OBJ LOAD FILE=XGameTextures.utx var() Material RedTeamShader; var() Material BlueTeamShader; var() Material NeutralShader; >nL Q'$Q/s9VL CharacterL 'b G>Q//============================================================================= // xDomB. //============================================================================= class xDomB extends xDOMLetter; >v'f|5qRw*-c$-c$(f ow6Bf*r*6Bfyf,6Bf,yf-A79:9:$ -p>demorecw*-b$w*A/-b$z.'%-b$a-C/r0-A/ G >>>n//============================================================================= // xDomAlert. //============================================================================= class xDomAlert extends TriggerLight; // could also give it an animating mesh type? // either we make this DominationAlertRed or we override a bunch of TriggerLight's properties... >YH s n={H [H =w[*[Y  oG  XG  GB>t>>y> wi {Sm-w 1pqq>>x`P7`4w.`*.` xY G>Q//============================================================================= // xDomA. //============================================================================= class xDomA extends xDOMLetter; `Sh^B~M`.8,Y>>e//============================================================================= // banner. //============================================================================= class banner_blue extends uTeamBanner; simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } >eWF=we*1e-e-(=ea G> @ . H H  99i-R o$9:9:$ G>AI,2r*a :r 9?%r ~wT *$T U wP *eaP  e$eo$ e-' G>Bm y G9:9:$u9?%D9?%m 7@9DD*k#o ckkm   G>y class ProjectileSpawner extends Actor placeable; var() float ProjectileSpeed; var() float SpawnRateMin; var() float SpawnRateMax; var() class TrailEmitter; var() class ExplosionEmitter; var() Mesh ProjectileMesh; var() float ProjectileMeshScale; var() Sound SpawnSound; var() Sound ExplosionSound; var() float Damage; var() float DamageRadius; var() class DamageType; var() float ProjectileLifeSpan; var() float RandomStartDelay; var() bool GravityAffected; replication { reliable if( bNetInitial && Role==ROLE_Authority ) ExplosionEmitter, TrailEmitter, ProjectileMesh, ExplosionSound, ProjectileMeshScale, ProjectileLifeSpan; } function PostBeginPlay() { if (SpawnRateMin > 0) SetTimer(1.0/SpawnRateMin+RandomStartDelay*FRand(), false); } function Timer() { SpawnProjectile(); if (SpawnRateMin > 0 && SpawnRateMax > 0) SetTimer(1.0/RandRange(SpawnRateMin, SpawnRateMax), false); } function SpawnProjectile() { local SpawnerProjectile Proj; Proj = Spawn(class'SpawnerProjectile', self,, Location, Rotation); Proj.Spawner = self; if (SpawnSound != None) { PlaySound(SpawnSound); } } function Trigger(Actor Other, Pawn EventInstigator) { SpawnProjectile(); } >A F E F %C D  G >Cj cS?z9:9:$u9?%D9?%b(Duo j wS *9:9:$g aS j h 9?,9Ph g $a G>E)class xDMRoster extends DMRoster DependsOn(xUtil); function Initialize(int TeamBots) { local int i; for ( i=Roster.Length; i PlayerRecords; local int i,j; Super.PostBeginPlay(); // add RosterNames to roster class'xUtil'.static.GetPlayerList(PlayerRecords); for ( i=0; i PlayerRecords; local int RND,i, num; local int max, total; class'xUtil'.static.GetPlayerList(PlayerRecords); for ( i=0; i= RND ) break; } num = i; if ( AvailableRecord(PlayerRecords[num].Menu) && !AlreadyExistsEntry(PlayerRecords[num].DefaultName,true) ) return class'xRosterEntry'.Static.CreateRosterEntry(num); for ( i=num; i 0) && !AlreadyExistsEntry(PlayerRecords[i].DefaultName,true) ) return class'xRosterEntry'.Static.CreateRosterEntry(i); for ( i=0; i 0) && !AlreadyExistsEntry(PlayerRecords[i].DefaultName,true) ) return class'xRosterEntry'.Static.CreateRosterEntry(i); return GetNamedBot("Jakob"); } function bool AvailableRecord(string MenuString) { return ( (MenuString ~= "DUP") || (MenuString ~= "SP") || (MenuString ~= "") || (MenuString ~= "UNLOCK") ); } function RosterEntry GetNamedBot(string botName) { local array PlayerRecords; local xUtil.PlayerRecord PR; class'xUtil'.static.GetPlayerList(PlayerRecords); PR = class'xUtil'.static.FindPlayerRecord(botName); return class'xRosterEntry'.Static.CreateRosterEntry(PR.RecordIndex); } function bool AlreadyExistsEntry(string CharacterName, bool bNoRecursion) { local int i; for ( i=0; i PawnClass) { return true; } >f6// // A Death Message. // // Switch 0: Kill // RelatedPRI_1 is the Killer. // RelatedPRI_2 is the Victim. // OptionalObject is the DamageType Class. // class xDeathMessage extends LocalMessage config(user); var(Message) localized string KilledString, SomeoneString; var config bool bNoConsoleDeathMessages; static function color GetConsoleColor( PlayerReplicationInfo RelatedPRI_1 ) { return class'HUD'.Default.GreenColor; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string KillerName, VictimName; if (Class(OptionalObject) == None) return ""; if (RelatedPRI_2 == None) VictimName = Default.SomeoneString; else VictimName = RelatedPRI_2.PlayerName; if ( Switch == 1 ) { // suicide return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.SuicideMessage(RelatedPRI_2) ); } if (RelatedPRI_1 == None) KillerName = Default.SomeoneString; else KillerName = RelatedPRI_1.PlayerName; return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.DeathMessage(RelatedPRI_1, RelatedPRI_2) ); } static function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( Switch == 1 ) { if ( !Default.bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); return; } if ( (RelatedPRI_1 == P.PlayerReplicationInfo) || (P.PlayerReplicationInfo.bOnlySpectator && (Pawn(P.ViewTarget) != None) && (Pawn(P.ViewTarget).PlayerReplicationInfo == RelatedPRI_1)) ) { // Interdict and send the child message instead. P.myHUD.LocalizedMessage( Default.ChildMessage, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); if ( !Default.bNoConsoleDeathMessages ) P.myHUD.LocalizedMessage( Default.Class, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); // check multikills if ( P.Role == ROLE_Authority ) { // multikills checked already in LogMultiKills() if ( UnrealPlayer(P).MultiKillLevel > 0 ) P.ReceiveLocalizedMessage( class'MultiKillMessage', UnrealPlayer(P).MultiKillLevel ); } else { if ( ( RelatedPRI_1 != RelatedPRI_2 ) && ( RelatedPRI_2 != None) && ((RelatedPRI_2.Team == None) || (RelatedPRI_1.Team != RelatedPRI_2.Team)) ) { if ( (P.Level.TimeSeconds - UnrealPlayer(P).LastKillTime < 4) && (Switch != 1) ) { UnrealPlayer(P).MultiKillLevel++; P.ReceiveLocalizedMessage( class'MultiKillMessage', xPlayer(P).MultiKillLevel ); } else UnrealPlayer(P).MultiKillLevel = 0; UnrealPlayer(P).LastKillTime = P.Level.TimeSeconds; } else UnrealPlayer(P).MultiKillLevel = 0; } } else if (RelatedPRI_2 == P.PlayerReplicationInfo) { P.ReceiveLocalizedMessage( class'xVictimMessage', 0, RelatedPRI_1 ); if ( !Default.bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } else if ( !Default.bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } >J//============================================================================= // xDeathMatch. //============================================================================= class xDeathMatch extends DeathMatch; #exec OBJ LOAD FILE=WeaponSkins.utx #exec OBJ LOAD FILE=UT2004Weapons.utx #exec OBJ LOAD FILE=XEffectMat.utx #exec OBJ LOAD FILE=WeaponStaticMesh.usx #exec OBJ LOAD FILE=NewWeaponPickups.usx #exec OBJ LOAD FILE="..\Textures\AW-2004Particles.utx" #exec OBJ LOAD FILE=intro_characters.utx #exec OBJ LOAD FILE=DemoPlayerSkins.utx #exec OBJ LOAD FILE=PlayerSkins.utx #exec OBJ LOAD FILE=InterfaceContent.utx #exec OBJ LOAD FILE=LastManStanding.utx #exec OBJ LOAD FILE=HUDContent.utx var globalconfig bool bCustomPreload; // if true, precache non-Epic characters as well static function PrecacheGameTextures(LevelInfo myLevel) { local int i; local array AllPlayerList, PlayerList; local bool bIsTeamGame; local class GameClass; local Texture LoadedSkin, LoadedSkinBlue, LoadedFace, LoadedFaceBlue; myLevel.AddPrecacheMaterial(Material'UT2004Weapons.AssaultRifleTex0'); myLevel.AddPrecacheMaterial(Material'XEffects.bulletpock'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.GrenadeTex'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.ShieldTex0'); myLevel.AddPrecacheMaterial(Material'XGameShaders.Minigun_burst'); myLevel.AddPrecacheMaterial(Material'XEffects.pcl_Spark'); myLevel.AddPrecacheMaterial(Material'XEffects.EmitSmoke_t'); myLevel.AddPrecacheMaterial(Material'XEffects.SmokeTex'); myLevel.AddPrecacheMaterial(Material'XEffects.rocketblastmark'); myLevel.AddPrecacheMaterial(Texture'XEffects.FlakTrailTex'); myLevel.AddPrecacheMaterial(Texture'ExplosionTex.we1_frames'); myLevel.AddPrecacheMaterial(Texture'ExplosionTex.exp2_frames'); myLevel.AddPrecacheMaterial(Texture'ExplosionTex.SmokeReOrdered'); myLevel.AddPrecacheMaterial(Texture'ExplosionTex.exp1_frames'); myLevel.AddPrecacheMaterial(Material'XEffects.Rexpt'); myLevel.AddPrecacheMaterial(Material'XEffects.SmokeAlphab_t'); myLevel.AddPrecacheMaterial(Material'XEffectMat.shock_ring_b'); myLevel.AddPrecacheMaterial(Material'XEffectMat.Shield.ShieldSpark'); myLevel.AddPrecacheMaterial(Material'XEffectMat.SlimeSkin'); myLevel.AddPrecacheMaterial(Material'XEffectMat.goop_green_a'); myLevel.AddPrecacheMaterial(Material'XGameShaders.PlayerShield'); myLevel.AddPrecacheMaterial(Material'XEffectMat.Shield3rdFB'); myLevel.AddPrecacheMaterial(Material'XEffectMat.ShieldRip3rdFB'); myLevel.AddPrecacheMaterial(Material'XGameShaders.LinkGunShell'); myLevel.AddPrecacheMaterial(Material'Engine.BlobTexture'); myLevel.AddPrecacheMaterial(Material'XGameShaders.LEnergy'); myLevel.AddPrecacheMaterial(class'NewTransDeresBlue'.Default.Texture); myLevel.AddPrecacheMaterial(Material'intro_characters.BRface1'); myLevel.AddPrecacheMaterial(Material'AW-2004Particles.Fire.BlastMark'); myLevel.AddPrecacheMaterial(Material'gradient_FADE'); myLevel.AddPrecacheMaterial(Material'AW-2004Particles.plasmastar'); myLevel.AddPrecacheMaterial(Material'XEffects.BotSpark'); myLevel.AddPrecacheMaterial(Material'InterfaceContent.SquareBoxA'); myLevel.AddPrecacheMaterial(Material'LastManStanding.LMSLogoSmall'); myLevel.AddPrecacheMaterial(Material'XEffectMat.redbolt'); myLevel.AddPrecacheMaterial(Material'XEffects.SpeedTrailTex'); myLevel.AddPrecacheMaterial(Material'XEffects.pcl_ball'); myLevel.AddPrecacheMaterial(Texture'XGameShaders.MinigunFlash'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat1'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat2'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat3'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat1P'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat2P'); myLevel.AddPrecacheMaterial(Texture'XEffects.BloodSplat3P'); myLevel.AddPrecacheMaterial(Texture'XEffects.xBioSplat'); myLevel.AddPrecacheMaterial(Texture'XEffects.xBioSplat2'); myLevel.AddPrecacheMaterial(Texture'XGameShadersB.BloodJetc'); myLevel.AddPrecacheMaterial(Texture'XGameShadersB.BloodPuffA'); myLevel.AddPrecacheMaterial(Texture'XGameShadersB.AlienBloodJet'); myLevel.AddPrecacheMaterial(Texture'XGameShadersB.BloodPuffGreen'); myLevel.AddPrecacheMaterial(Texture'XGameShadersB.BloodPuffOil'); myLevel.AddPrecacheMaterial(Texture'XEffects.GibOrganicGreen'); myLevel.AddPrecacheMaterial(Texture'XEffects.GibOrganicRed'); myLevel.AddPrecacheMaterial(Texture'XEffects.GibBot'); myLevel.AddPrecacheMaterial(Texture'EpicParticles.FlickerFlare2'); if ( myLevel.IsDemoBuild() ) myLevel.AddPrecacheMaterial(Material'DemoPlayerSkins.DemoSkeleton'); else myLevel.AddPrecacheMaterial(Texture(DynamicLoadObject("PlayerSkins.Human_Skeleton", class'Material'))); if ( !Static.NeverAllowTransloc() ) { myLevel.AddPrecacheMaterial(Material'XEffects.TransTrailT'); myLevel.AddPrecacheMaterial(Material'XGameShaders.TransPlayerCell'); myLevel.AddPrecacheMaterial(Material'XGameShaders.TransPlayerCellRed'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.NEWTranslocatorTEX'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.NEWTranslocatorBlue'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.NEWTranslocatorPUCK'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.NEWtranslocatorGlass'); } if ( Default.bAllowVehicles ) { myLevel.AddPrecacheMaterial(Material'HUDContent.NoEntry'); } myLevel.AddPrecacheMaterial(Material'EpicParticles.BurnFlare1'); myLevel.AddPrecacheMaterial(Material'DeRez.DeRezSkin'); myLevel.AddPrecacheMaterial(Material'DeRez.RezTest4'); // water effects myLevel.AddPrecacheMaterial(Material'xGame.xCausticRing2'); myLevel.AddPrecacheMaterial(Material'AW-2004Particles.Energy.SparkHead'); myLevel.AddPrecacheMaterial(Material'xGame.xSplashBase'); myLevel.AddPrecacheMaterial(Material'xGame.xWaterdrops2'); if ( ((myLevel.NetMode == NM_ListenServer) || (myLevel.NetMode == NM_Client)) && !myLevel.bSkinsPreloaded && ((myLevel.bShouldPreload && myLevel.bDesireSkinPreload && !Default.bForceDefaultCharacter) || myLevel.IsDemoBuild()) ) { class'xUtil'.static.GetPlayerList(AllPlayerList); if ( !myLevel.IsDemoBuild() ) { myLevel.ForceLoadTexture(Texture(DynamicLoadObject("UT2004PlayerSkins.XanMk3V2_abdomen", class'Material'))); myLevel.ForceLoadTexture(Texture(DynamicLoadObject("UT2004PlayerSkins.Skaarj_Skeleton_Body", class'Material'))); } // Filter out 'duplicate' characters - only used in single player // also filter out characters that aren't useable by bots (probably not meant for DM) for(i=0; i 0) ) { // if no custom preloading, only preload Epic characters - PlayerSkins, UT2004PlayerSkins, MechaSkaarjSkins, NecrisSkins, MetalSkins if ( Default.bCustomPreload || (Left(AllPlayerList[i].BodySkinName,12) ~= "PlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,18) ~= "UT2004PlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,21) ~= "UT2004ECEPlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,16) ~= "DemoPlayerSkins.") ) { PlayerList[PlayerList.Length] = AllPlayerList[i]; } } } GameClass = myLevel.GetGameClass(); bIsTeamGame = (GameClass != None) && GameClass.Default.bTeamGame; for (i=0; iF@ Cc+ D@ * G>O+GDfS 6 DGG  G  G   G >]>Ll  G > X#a!}L?-6' G> #a!}L?-6' G>g// ==================================================================== // Class: XGame.Intro_Fan_Gorge // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Fan_Gorge extends xIntroPawn; >_//============================================================================= // xCTFGame. //============================================================================= class xCTFGame extends CTFGame config; #exec OBJ LOAD FILE=GameSounds.uax #exec OBJ LOAD File=XGameShadersB.utx static function PrecacheGameTextures(LevelInfo myLevel) { class'xTeamGame'.static.PrecacheGameTextures(myLevel); } static function PrecacheGameStaticMeshes(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); } function actor FindSpecGoalFor(PlayerReplicationInfo PRI, int TeamIndex) { local XPlayer PC; local Controller C; local CTFFlag Flags[2],F; PC = XPlayer(PRI.Owner); if (PC==None) return none; // Look for a Player holding the flag for (C=Level.ControllerList;C!=None;C=C.NextController) { if ( (C.PlayerReplicationInfo != None) && (C.PlayerReplicationInfo.HasFlag!=None) && (PC.ViewTarget == None || PC.ViewTarget != C.Pawn) ) return C.Pawn; } foreach AllActors(class'CTFFlag',f) Flags[f.TeamNum]=f; if ( vsize(PC.Location - Flags[0].Location) < vsize(PC.Location - Flags[1].Location) ) return Flags[1]; else return Flags[0]; return none; } event SetGrammar() { LoadSRGrammar("CTF"); } QT4n 6RXf{ُzVGB3},e,e,ezVGBWݝҳWݝҳ,e,e,e$Wݝҳ$Wݝҳ$67'\Y  O]xGame.xTeamRosteri]XInterface.HudCCaptureTheFlagw]"!XInterface.MapListCaptureTheFlagZb%[F]Capture the FlagU]UT2004Thumbnails.CTFShots^]XGame.CTFGame\]CTF>>X 3>j//============================================================================= // xCTFBase. // For decoration only, this actor serves no game-related purpose! //============================================================================= class xCTFBase extends Decoration notplaceable; &Y`B Y6Um&Ƞ <b]intro_gorge.intro_gorge>>K@rR%@ w@*@a/!JR.@ERp.DeRR,@@!R,xDoubleDom: Level has wrong number of Domination Points!!b G>2class xBotSoundGroup extends xPawnSoundGroup; Wp X }2*Y 9Y 6Y >>_// ==================================================================== // Class: XGame.Intro_Gorge // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Gorge extends xIntroPawn; >h class xBot extends Bot DependsOn(xUtil); var() xUtil.PlayerRecord PawnSetupRecord; function SetPawnClass(string inClass, string inCharacter) { local class pClass; if ( inClass != "" ) { pClass = class(DynamicLoadObject(inClass, class'Class')); if (pClass != None) PawnClass = pClass; } PawnSetupRecord = class'xUtil'.static.FindPlayerRecord(inCharacter); PlayerReplicationInfo.SetCharacterName(inCharacter); } function Possess(Pawn aPawn) { Super.Possess(aPawn); if ( xPawn(aPawn) != None ) xPawn(aPawn).Setup(PawnSetupRecord); } >^KB.57D&5-CDZF^ rZ\-w.*$r.Z RDZF^-C RDZF^x9:9:$u.%Z O .wZF wF*5rF*wZFN.9?, D&.Z O .Wc.%..%2rFZ z %Z-CDZF^22-CDZF^ G >]>>t'L2 r* ew**9?&w*a/!o* w*w*a/!ox** G>V_a"G>$\/-  r%* r&*  T%TT,w*w.*.m5!i$'aT% T,c T T%%]'&]'Iw%&r%* 5Uw*a/!d.(m5%|.$'l5% 5, c 55%5 w*a/!d.(m5%}.$'.d,  )%?%9?&_%?dom_teamscoreDw%*w%*%@%9?&% fj%@dom_scoreLw&*w&*&@&9?&& fj&@dom_score5UTf %](&](%}%},}9?O*teamscorelimit} G>]//============================================================================= // xBombSpawn. //============================================================================= class xBombSpawn extends GameObjective placeable; var() Sound TakenSound; var xBombFlag myFlag; var class FlagType; #exec OBJ LOAD FILE=XGameShaders.utx function BeginPlay() { Super.BeginPlay(); if ( !Level.Game.IsA('xBombingRun') ) return; myFlag = Spawn(FlagType, self); if (myFlag==None) { warn(Self$" could not spawn flag of type '"$FlagType$"' at "$location); return; } else myFlag.HomeBase = self; Spawn(class'XGame.xBombBase',self,,Location-vect(0,0,60),Rotation); } function bool BotNearObjective(Bot B) { if ( (myFlag == None) || (B==None) ) return false; if ( (MyBaseVolume != None) && myFlag.bHome && B.Pawn.IsInVolume(MyBaseVolume) ) return true; return ( (VSize(myFlag.Position().Location - B.Pawn.Location) < 2000) && B.LineOfSightTo(myFlag.Position()) ); } function bool BetterObjectiveThan(GameObjective Best, byte DesiredTeamNum, byte RequesterTeamNum) { if ( !myFlag.bHome || (RequesterTeamNum == DesiredTeamNum) ) return false; return true; } `Ml@2aЙؚ[X! [X! |h[X! ʁ)|h|[X! 3}Zs[X!  m P]H= Bomb SpawnLzmu%lY$C[$@&oy$A"$@@f;$pB1$pBM>>A-//============================================================================= // BombMessage. //============================================================================= class xBombMessage extends CriticalEventPlus; var(Message) localized string ReturnBlue, ReturnRed; var(Message) localized string ReturnedBlue, ReturnedRed; var(Message) localized string CaptureBlue, CaptureRed; var(Message) localized string DroppedBlue, DroppedRed; var(Message) localized string HasBlue,HasRed; var sound ReturnSounds[2]; // OBSOLETE var sound DroppedSounds[2]; // OBSOLETE var Sound TakenSounds[2]; // OBSOLETE var sound Riffs[3]; var name ReturnSoundNames[2]; var name DroppedSoundNames[2]; var name TakenSoundNames[2]; static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( Switch == 3 ) P.PlayStatusAnnouncement(default.ReturnSoundNames[0],1, true); Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if ( TeamInfo(OptionalObject) == None ) return; switch (Switch) { case 0: P.ClientPlaySound(Default.Riffs[Rand(3)]); break; // Returned the flag. case 1: case 3: case 5: P.PlayStatusAnnouncement(default.ReturnSoundNames[TeamInfo(OptionalObject).TeamIndex],1, true); break; // Dropped the flag. case 2: P.PlayStatusAnnouncement(default.DroppedSoundNames[TeamInfo(OptionalObject).TeamIndex],2, true); break; case 4: case 6: P.PlayStatusAnnouncement(default.TakenSoundNames[TeamInfo(OptionalObject).TeamIndex],2, true); break; } } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch (Switch) { // Captured the flag. case 0: if (RelatedPRI_1 == None) return ""; return RelatedPRI_1.PlayerName@Default.CaptureBlue; break; // Returned the flag. case 1: if (RelatedPRI_1 == None) return Default.ReturnedBlue; return RelatedPRI_1.playername@Default.ReturnBlue; break; // Dropped the flag. case 2: if (RelatedPRI_1 == None) return ""; return RelatedPRI_1.playername@Default.DroppedBlue; break; // Was returned. case 3: return Default.ReturnedBlue; break; // Has the flag. case 4: if (RelatedPRI_1 == None) return ""; return RelatedPRI_1.playername@Default.HasBlue; break; // Auto send home. case 5: return Default.ReturnedBlue; break; // Pickup case 6: if (RelatedPRI_1 == None) return ""; return RelatedPRI_1.playername@Default.HasBlue; break; } return ""; } >@@>>r//============================================================================= // xBombingRun. //============================================================================= class xBombingRun extends TeamGame config; #exec OBJ LOAD FILE=E_Pickups.usx var globalconfig bool bBallDrainsTransloc; var localized string BRPropText,BRPropText2; var localized string BRDescText,BRDescText2; var transient int TeamSpawnCount[2]; var xBombFlag Bomb; var sound NewRoundSound; // OBSOLETE var float OldScore; var(LoadingHints) private localized array BRHints; static function array GetAllLoadHints(optional bool bThisClassOnly) { local int i; local array Hints; if ( !bThisClassOnly || default.BRHints.Length == 0 ) Hints = Super.GetAllLoadHints(); for ( i = 0; i < default.BRHints.Length; i++ ) Hints[Hints.Length] = default.BRHints[i]; return Hints; } function PostBeginPlay() { Super.PostBeginPlay(); // associate flags with teams ForEach DynamicActors(Class'xBombFlag',Bomb) { BombingRunTeamAI(Teams[0].AI).Bomb = Bomb; BombingRunTeamAI(Teams[1].AI).Bomb = Bomb; Bomb.bBallDrainsTransloc = bBallDrainsTransloc; } SetTeamBases(); } function bool NearGoal(Controller C) { return ( (VSize(C.Pawn.Location - BombingRunTeamAI(Teams[C.PlayerReplicationInfo.Team.TeamIndex].AI).EnemyBase.Location) < 1000) ); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( !bRewardSounds ) { V.PrecacheSound('NewRoundIn'); V.PrecacheSound('BallReset'); V.PrecacheSound('Red_Pass_Fumbled'); V.PrecacheSound('Blue_Pass_Fumbled'); V.PrecacheSound('Red_Team_on_Offence'); V.PrecacheSound('Blue_Team_on_Offence'); V.PrecacheSound('Last_Second_Save'); } } /* OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor */ simulated function UpdateAnnouncements() {} static function int OrderToIndex(int Order) { if(Order == 2) return 14; return Order; } //------------------------------------------------------------------------------ // Game Querying. function GetServerDetails( out ServerResponseLine ServerState ) { Super.GetServerDetails( ServerState ); AddServerDetail( ServerState, "BallDrainsTranslocator", bBallDrainsTransloc ); } static function PrecacheGameTextures(LevelInfo myLevel) { class'xTeamGame'.static.PrecacheGameTextures(myLevel); myLevel.AddPrecacheMaterial(Material'WeaponSkins.BallLauncherTex0'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.BallLauncherEnergy'); myLevel.AddPrecacheMaterial(Material'WeaponSkins.BallLauncherLine'); myLevel.AddPrecacheMaterial(Material'XEffects.RedMarker_T'); myLevel.AddPrecacheMaterial(Material'XEffects.BlueMarker_T'); myLevel.AddPrecacheMaterial(Material'XGameShaders.BombIconBlue'); myLevel.AddPrecacheMaterial(Material'XGameShaders.BombIconRed'); myLevel.AddPrecacheMaterial(Material'XGameShaders.BombIconYELLOW'); myLevel.AddPrecacheMaterial(Material'XGameShaders.BRBall'); myLevel.AddPrecacheMaterial(Material'XGameTextures.BombDeliveryTex'); } static function PrecacheGameStaticMeshes(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); myLevel.AddPrecacheStaticMesh(StaticMesh'XGame_rc.BombSpawnMesh'); myLevel.AddPrecacheStaticMesh(StaticMesh'XGame_rc.BombEffectMesh'); myLevel.AddPrecacheStaticMesh(StaticMesh'E_Pickups.FullBomb'); } function SetTeamBases() // Important for tracking { local xBombDelivery B; // associate flags with teams ForEach AllActors(Class'xBombDelivery',B) { Teams[B.Team].HomeBase = B; } } function GameObject GetGameObject( Name GameObjectName ) { // temp - sanity check assert(bomb != None && bomb.IsA(GameObjectName)); if ( Bomb.IsA(GameObjectName) ) return Bomb; return Super.GetGameObject(GameObjectName); } function Logout(Controller Exiting) { if ( xBombFlag(Exiting.PlayerReplicationInfo.HasFlag) != None ) xBombFlag(Exiting.PlayerReplicationInfo.HasFlag).Drop(vect(0,0,0)); Super.Logout(Exiting); } function DiscardInventory( Pawn Other ) { if ( (Other.PlayerReplicationInfo != None) && (Other.PlayerReplicationInfo.HasFlag != None) ) xBombFlag(Other.PlayerReplicationInfo.HasFlag).Drop(0.5 * Other.Velocity); Super.DiscardInventory(Other); } function ScoreGameObject( Controller C, GameObject GO ) { Super.ScoreGameObject(C,GO); if ( GO.IsA('xBombFlag') ) ScoreBomb(C, xBombFlag(GO)); } function ScoreBomb(Controller Scorer, xBombFlag theFlag) { local bool ThrowingScore; local int i; local float ppp,numtouch,maxpoints,maxper; local controller C; Bomb = theFlag; if( ResetCountDown > 0 ) { //log("Ignoring score during reset countdown.",'BombingRun'); theFlag.SendHome(); return; } // blow up all redeemer guided warheads for ( C=Level.ControllerList; C!=None; C=C.NextController ) if ( (C.Pawn != None) && C.Pawn.IsA('RedeemerWarhead') ) C.Pawn.Fire(0); // are we dealing with a throwing score? if (Scorer.PlayerReplicationInfo.HasFlag == None) ThrowingScore = true; if ( (Scorer.Pawn != None) && Scorer.Pawn.Weapon.IsA('BallLauncher') ) Scorer.ClientSwitchToBestWeapon(); theFlag.Instigator = none; // jmw - need this to stop the reentering of ScoreBomb due to touch with the base // awards for scoring IncrementGoalsScored(Scorer.PlayerReplicationInfo); OldScore = Scorer.PlayerReplicationInfo.Team.Score; if (ThrowingScore) { Scorer.PlayerReplicationInfo.Team.Score += 3.0; Scorer.PlayerReplicationInfo.Team.NetUpdateTime = Level.TimeSeconds - 1; TeamScoreEvent(Scorer.PlayerReplicationInfo.Team.TeamIndex,3,"ball_tossed"); // Individual points Scorer.PlayerReplicationInfo.Score += 2; // Just for scoring MaxPoints=10; MaxPer=2; ScoreEvent(Scorer.PlayerReplicationInfo,5,"ball_thrown_final"); } else { Scorer.PlayerReplicationInfo.Team.Score += 7.0; Scorer.PlayerReplicationInfo.Team.NetUpdateTime = Level.TimeSeconds - 1; TeamScoreEvent(Scorer.PlayerReplicationInfo.Team.TeamIndex,7,"ball_carried"); // Individual points Scorer.PlayerReplicationInfo.Score += 5; // Just for scoring MaxPoints=20; MaxPer=5; ScoreEvent(Scorer.PlayerReplicationInfo,5,"ball_cap_final"); } Scorer.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; // Each player gets MaxPoints/x but it's guarenteed to be at least 1 point but no more than MaxPer points numtouch=0; for (i=0;iMaxPer) ppp = MaxPer; for (i=0;i= GoalScore) ) EndGame(Scorer.PlayerReplicationInfo,"teamscorelimit"); else if ( bOverTime ) EndGame(Scorer.PlayerReplicationInfo,"timelimit"); ResetCountDown = ResetTimeDelay+1; if ( bGameEnded ) theFlag.Score(); else theFlag.SendHomeDisabled(ResetTimeDelay); } State MatchInProgress { function Timer() { local Controller C; local Projectile Proj; local Inventory Inv; Super.Timer(); if (ResetCountDown > 0) { ResetCountDown--; if ( ResetCountDown < 3 ) { // blow up all redeemer guided warheads for ( C=Level.ControllerList; C!=None; C=C.NextController ) if ( (C.Pawn != None) && C.Pawn.IsA('RedeemerWarhead') ) C.Pawn.Fire(1); } if ( ResetCountDown == 8 ) { for ( C = Level.ControllerList; C != None; C = C.NextController ) if ( PlayerController(C) != None ) PlayerController(C).PlayStatusAnnouncement('NewRoundIn',1,true); } else if ( (ResetCountDown > 1) && (ResetCountDown < 7) ) BroadcastLocalizedMessage(class'TimerMessage', ResetCountDown-1); else if (ResetCountDown == 1) { // reset all bot enemies Teams[0].AI.ClearEnemies(); Teams[1].AI.ClearEnemies(); // reset all players position and rotation on the field for the next round for ( C = Level.ControllerList; C != None; C = C.NextController ) if ( (C.PlayerReplicationInfo != None) && !C.PlayerReplicationInfo.bOnlySpectator ) { C.StartSpot = FindPlayerStart(C, C.PlayerReplicationInfo.Team.TeamIndex); if ( C.StartSpot != None ) { C.SetLocation(C.StartSpot.Location); C.SetRotation(C.StartSpot.Rotation); } if ( C.Pawn != None ) { if ( xPawn(C.Pawn) != None ) { if (xPawn(C.Pawn).CurrentCombo != None) { C.Adrenaline = 0; xPawn(C.Pawn).CurrentCombo.Destroy(); } if ( xPawn(C.Pawn).UDamageTimer != None ) { xPawn(C.Pawn).UDamageTimer.Destroy(); xPawn(C.Pawn).DisableUDamage(); } } C.Pawn.Health = Max(C.Pawn.Health,C.Pawn.HealthMax); SetPlayerDefaults(C.Pawn); C.Pawn.SetLocation(C.StartSpot.Location); C.Pawn.SetRotation(C.StartSpot.Rotation); C.Pawn.Velocity = vect(0,0,0); C.Pawn.PlayTeleportEffect(false, true); for ( Inv=C.Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) if ( Inv.IsA('TransLauncher') ) Weapon(Inv).GiveAmmo(0, None, false); } if ( C.StartSpot != None ) C.ClientSetLocation(C.StartSpot.Location,C.StartSpot.Rotation); } // destroy projectiles foreach DynamicActors(class'Projectile', Proj) Proj.Destroy(); Bomb.SendHome(); ResetCountDown = 0; } } else { if ( Bomb == None ) ForEach DynamicActors(class'xBombFlag',Bomb) break; if ( Bomb != None ) GameReplicationInfo.FlagPos = Bomb.Position().Location; } } } function AnnounceScore(int ScoringTeam) { local Controller C; local name ScoreSound; local int OtherTeam; if ( ScoringTeam == 1 ) OtherTeam = 0; else OtherTeam = 1; if ( OldScore <= Teams[OtherTeam].Score ) { if ( Teams[ScoringTeam].Score > Teams[OtherTeam].Score ) ScoreSound = TakeLeadName[ScoringTeam]; else ScoreSound = CaptureSoundName[ScoringTeam]; } else { if ( OldScore <= Teams[OtherTeam].Score + 3 ) ScoreSound = IncreaseLeadName[ScoringTeam]; else ScoreSound = CaptureSoundName[ScoringTeam]; } for ( C=Level.ControllerList; C!=None; C=C.NextController ) { if ( C.IsA('PlayerController') ) PlayerController(C).PlayStatusAnnouncement(ScoreSound,1,true); } } function actor FindSpecGoalFor(PlayerReplicationInfo PRI, int TeamIndex) { local XPlayer PC; local Controller C; local xBombFlag b; PC = XPlayer(PRI.Owner); if (PC==None) return none; // Look for a Player holding the flag for (C=Level.ControllerList;C!=None;C=C.NextController) { if ( (C.PlayerReplicationInfo != None) && (C.PlayerReplicationInfo.HasFlag!=None) ) return C.Pawn; } foreach AllActors(class'xBombFlag',b) return b; return none; } static function FillPlayInfo(PlayInfo PI) { Super.FillPlayInfo(PI); PI.AddSetting(default.RulesGroup, "bBallDrainsTransloc", default.BRPropText2, 40, 0, "Check",,,,True); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "bBallDrainsTransloc": return default.BRDescText2; } return Super.GetDescriptionText(PropName); } function int BallCarrierMessage() { return 15; } event SetGrammar() { LoadSRGrammar("BR"); } >z w s 2L-]'a w  G]6f%d =+  [.''      Life Is Pain, Get Over ItRight Between The EyesTag 'Em And Bag 'EmThat Was Nasty! You Bleed Better Than You Shoot  You Suck Lick meI"2                 !  I Can't Feel My Legs ! Nice Shot    K"Z.]Female Juggernaut>>ev ai sv }u 0w_*u!ao$7v!agr_**_rJ,*J,a ]1J,a*J,#w_* w_~%6%J,$6&J,$6%J,$6&J,$6%J,$6&J,$6%J,$6&J,$ G>^dfX#;r.d*%d, sw%dw&d O!wO*P.O wP* wPd1rPdBP!OObr%d%B%rr&d&B&r G>a// ==================================================================== // Class: XGame.Intro_Malcom // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Malcom extends xIntroPawn; >p'er %2reL} (Q.ewQ*wQ*QSf%Qa, իX  @ff]`F(e G>dclass xBombHUDMessage extends CTFHUDMessage; // // Bomb Messages // // Switch 0: You have the ball message. // // Switch 1: Enemy has the ball message. >Q> kw 2m3 4d  j].-You have the ball, deliver it to enemy base!i]%$The enemy has the ball, recover it!>>[//============================================================================= // xBomb // This is the bomb. Someone set us up the bomb. //============================================================================= class xBombFlag extends GameObject; var() String BombLauncherClassName; var() class PrevWeaponClass; var() Pawn PassTarget; var() float ThrowSpeed; var() float Elasticity; var() sound ImpactSound; var() float ThrowerTouchDelay; var() float ThrowerTime; var() vector InitialDir; var() float SeekInterval; var() transient float SeekAccum; var material TeamShader[2]; var byte TeamHue[2]; var bool bThrownBomb; var bool bBallDrainsTransloc; var material SecondRepSkin; var xEmitter TossTrail; #exec OBJ LOAD FILE=XGameShaders.utx replication { reliable if (Role == ROLE_Authority) SecondRepSkin, bBallDrainsTransloc; } function Destroyed() { if ( TossTrail != None ) TossTrail.Destroy(); Super.Destroyed(); } simulated event PostNetReceive() { Skins[2] = SecondRepSkin; } function ClearHolder() { if (Holder == None) return; if ( Holder.PlayerReplicationInfo != None ) { Holder.PlayerReplicationInfo.HasFlag = None; Holder.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; } if ( (Holder.PendingWeapon != None) && Holder.PendingWeapon.IsA('BallLauncher') ) Holder.PendingWeapon = None; if ( (Holder.Weapon != None) && (Holder.Controller != None) && Holder.Weapon.IsA('BallLauncher') ) Holder.Controller.ClientSwitchToBestWeapon(); Holder = None; HolderPRI = None; } // State transitions function SetHolder(Controller C) { local Class BombLauncherClass; local Weapon W; local BombingRunSquadAI S; local Inventory Inv; local Pawn P; // update AI before changing states if ( Bot(C) != None ) S = BombingRunSquadAI(Bot(C).Squad); else if ( (PlayerController(C) != None) && (UnrealTeamInfo(C.PlayerReplicationInfo.Team).AI != None) ) { S = BombingRunSquadAI(UnrealTeamInfo(C.PlayerReplicationInfo.Team).AI.FindHumanSquad()); if ( S != None && S.SquadLeader != C ) S = None; } if ( S != None ) S.BombTakenBy(C); Super.SetHolder(C); Instigator = Holder; bThrownBomb = false; Level.Game.GameReplicationInfo.FlagTarget = None; BombLauncherClass = Class( DynamicLoadObject( BombLauncherClassName , class'Class' ) ); PrevWeaponClass = C.Pawn.Weapon.Class; if( ClassIsChildOf( PrevWeaponClass, BombLauncherClass ) ) PrevWeaponClass = None; // Make sure the new holds has the BombLauncher P = C.Pawn; if (P==None) return; for( Inv=P.Inventory; Inv!=None; Inv=Inv.Inventory ) { if ( ClassIsChildOf(Inv.Class, BombLauncherClass) ) break; } if (Inv==None) { // Give the Ball Launcher to the player W = Spawn(BombLauncherClass,,,P.Location); if( W == None ) { log(self@"could not spawn a launcher for player"@p); return; } w.GiveTo(P); } C.ClientSetWeapon( BombLauncherClass ); } function SetThrow(vector start) { Instigator = Holder; ThrowerTime = Level.TimeSeconds; bThrownBomb = true; SetLocation(start); } function Throw(vector start, vector dir) { SetThrow(start); Drop(Dir); if( PassTarget != None ) { Enable('Tick'); SetPhysics(PHYS_Projectile); } else Disable('Tick'); if ( PassTarget == None ) Level.Game.GameReplicationInfo.FlagTarget = None; else Level.Game.GameReplicationInfo.FlagTarget = PassTarget.PlayerReplicationInfo; if ( TossTrail == None ) TossTrail = Spawn(class'BombTrail', self); TossTrail.SetBase(self); TossTrail.SetRelativeLocation(vect(0,0,0)); if ( (PassTarget != None) && (PassTarget != Instigator) ) { if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 0 ) { TossTrail.mColorRange[0].G = 0; TossTrail.mColorRange[1].B = 0; TossTrail.mColorRange[0].B = 0; TossTrail.mColorRange[1].G = 0; } else { TossTrail.mColorRange[0].G = 0; TossTrail.mColorRange[1].R = 0; TossTrail.mColorRange[0].R = 0; TossTrail.mColorRange[1].G = 0; } } } function bool CanBePickedUpBy(Pawn P) { return ( (P != Instigator) || (Level.TimeSeconds - ThrowerTime >= ThrowerTouchDelay - VSize(Location - P.Location)/440) ); } function bool ValidHolder(Actor Other) { local Pawn P; local Vector RefNormal; if ( (Other == Instigator) && (Level.TimeSeconds - ThrowerTime < ThrowerTouchDelay) ) return false; P = Pawn(Other); if( P != None && P.Weapon != None ) { // bounce the ball off the shield if( P.Weapon.CheckReflect( Location, RefNormal, 0 ) ) { P.Weapon.DoReflectEffect(10); Velocity = (Elasticity * 2.5) * (( Velocity dot RefNormal ) * RefNormal * (-2.0) + Velocity); RandSpin(30000); return false; } } return Super.ValidHolder(Other); } function RandSpin(float spinRate) { DesiredRotation = RotRand(); RotationRate.Yaw = spinRate * 2 *FRand() - spinRate; RotationRate.Pitch = spinRate * 2 *FRand() - spinRate; RotationRate.Roll = spinRate * 2 *FRand() - spinRate; bFixedRotationDir = true; } // Events function HitWall( vector HitNormal, actor Wall ) { Velocity = Elasticity*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); RandSpin(30000); PlaySound(ImpactSound, SLOT_Misc ); if ( (VSize(Velocity) < 20) && (HitNormal.Z >= 0.7) && Wall.bWorldGeometry ) Landed(HitNormal); else if (VSize(Velocity) < 300 ) { if ( TossTrail != None ) TossTrail.Destroy(); } } function Landed(vector hitNormal) { if ( TossTrail != None ) TossTrail.Destroy(); Velocity = vect(0,0,0); if ( Holder == None ) SetPhysics(PHYS_Rotating); } function TakeDamage( int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { if (Momentum != Vect(0,0,0) && !bHome && (Holder == None) ) { SetPhysics(PHYS_Falling); Velocity += Momentum/Mass; } } // Logging function LogDropped() { local TeamInfo T; if ( Holder == None ) return; if ( Holder.Health <= 0 ) { if ( Holder.PlayerReplicationInfo != None ) { if ( bLastSecondSave ) { if ( Holder.PlayerReplicationInfo.Team.TeamIndex == 0 ) T = TeamGame(Level.Game).Teams[1]; else T = TeamGame(Level.Game).Teams[0]; } else T = TeamGame(Level.Game).Teams[Holder.PlayerReplicationInfo.Team.TeamIndex]; } if ( bLastSecondSave ) BroadcastLocalizedMessage( class'LastSecondMessage', 0, Holder.PlayerReplicationInfo, None, T ); else BroadcastLocalizedMessage( MessageClass, 2, Holder.PlayerReplicationInfo, None, T ); } UnrealMPGameInfo(Level.Game).GameEvent("bomb_dropped","255",Holder.PlayerReplicationInfo); } function LogReturned() { if ( Level.Game.ResetCountDown == 0 ) BroadcastLocalizedMessage( MessageClass, 3, None, None, None ); } function SendHomeDisabled(float TimeOut) { if ( TossTrail != None ) TossTrail.Destroy(); CalcSetHome(); GotoState('HomeDisabled'); } function bool CanBeThrownBy(Pawn P) { // assert(bBallDrainsTransloc == xBombingRun(Level.Game).bBallDrainsTransloc); // return !xBombingRun(Level.Game).bBallDrainsTransloc || (P.Health < 45); return !bBallDrainsTransloc || P.Health < 45; } // States auto state Home { ignores SendHome, Score, Drop; function LogTaken(Controller c) { OldTeam = C.PlayerReplicationInfo.Team; BroadcastLocalizedMessage( MessageClass, 6, C.PlayerReplicationInfo, None, C.PlayerReplicationInfo.Team ); UnrealMPGameInfo(Level.Game).GameEvent("bomb_taken","255",C.PlayerReplicationInfo); } function BeginState() { if ( TossTrail != None ) TossTrail.Destroy(); Skins[2] = Default.Skins[2]; SecondRepSkin = Skins[2]; Super.BeginState(); SetPhysics(PHYS_Rotating); Level.Game.GameReplicationInfo.FlagState[0] = EFlagState.FLAG_Home; Level.Game.GameReplicationInfo.FlagState[1] = EFlagState.FLAG_Home; } } state HomeDisabled { ignores Score, Drop; function bool IsHome() { return true; } function BeginState() { if ( TossTrail != None ) TossTrail.Destroy(); Skins[2] = Default.Skins[2]; SecondRepSkin = Skins[2]; SetDisable(true); Level.Game.GameReplicationInfo.FlagState[0] = EFlagState.FLAG_Home; Level.Game.GameReplicationInfo.FlagState[1] = EFlagState.FLAG_Home; bHome = true; SetLocation(HomeBase.Location); SetRotation(HomeBase.Rotation); SetCollision(false, false, false); bHidden = true; } function EndState() { SetDisable(false); bHome = false; SetCollision(true, false, false); bHidden = false; } } state Held { ignores SetHolder, SendHome; function BeginState() { if ( TossTrail != None ) TossTrail.Destroy(); Level.Game.GameReplicationInfo.FlagState[Holder.PlayerReplicationInfo.Team.TeamIndex] = EFlagState.FLAG_HeldFriendly; if ( Holder.PlayerReplicationInfo.Team.TeamIndex == 0 ) Level.Game.GameReplicationInfo.FlagState[1] = EFlagState.FLAG_HeldEnemy; else Level.Game.GameReplicationInfo.FlagState[0] = EFlagState.FLAG_HeldEnemy; Super.BeginState(); bDynamicLight = false; LightType = LT_None; Skins[0] = TeamShader[Holder.PlayerReplicationInfo.Team.TeamIndex]; RepSkin = Skins[0]; Skins[2] = RepSkin; SecondRepSkin = Skins[2]; SetStaticMesh(StaticMesh'XGame_RC.BombEffectMesh'); SetDrawScale(1.0); } function EndState() { Super.EndState(); bDynamicLight = true; LightType = LT_Steady; Skins[0] = Default.Skins[0]; RepSkin = Skins[0]; SetStaticMesh(Default.StaticMesh); SetDrawScale(Default.DrawScale); } } state Dropped { ignores Drop; function HitWall( vector HitNormal, actor Wall ) { if ( (PassTarget != None) && (((Acceleration Dot HitNormal) < 0) || ((Velocity Dot (PassTarget.Location - Location)) < 0)) ) { Disable('Tick'); if ( Physics == PHYS_Projectile ) SetPhysics(PHYS_Falling); } Global.HitWall(HitNormal, Wall); } // pass seeking function Tick(float delta) { local vector Dir; local float Z; SeekAccum += delta; if( SeekAccum >= SeekInterval ) { SeekAccum -= SeekInterval; if ( (PassTarget != None) && (PassTarget != Instigator) ) { Dir = Normal((PassTarget.Location + (vect(0,0,1)*PassTarget.CollisionHeight*0.5)) - Location); Acceleration = 1.25 * ThrowSpeed * Dir; if ( VSize(Location - PassTarget.Location) < 250 ) { Velocity = Velocity + 10 * Acceleration * delta; if ( (Dir Dot Normal(Velocity)) < 0.9 ) Acceleration *= 0.4; } SetRotation(rotator(Acceleration)); if ( Level.TimeSeconds - ThrowerTime > 4 ) { Disable('Tick'); if ( Physics == PHYS_Projectile ) SetPhysics(PHYS_Falling); } } else { Disable('Tick'); if ( Physics == PHYS_Projectile ) SetPhysics(PHYS_Falling); } } if ( Physics == PHYS_Projectile ) Velocity = Velocity + 10 * Acceleration * delta; else { Disable('Tick'); Acceleration = vect(0,0,0); Z = Velocity.Z; Velocity.Z = 0; if ( VSize(Velocity) > 800 ) { Velocity = 800 * Normal(Velocity); Velocity.Z = FMin(100,Z); } } } function Landed(vector hitNormal) { if ( Skins[2] != Default.Skins[2] ) { Skins[2] = Default.Skins[2]; SecondRepSkin = Skins[2]; } Velocity = vect(0,0,0); Acceleration = vect(0,0,0); SetPhysics(PHYS_Rotating); if ( (Location.Z < Region.Zone.KillZ) || IsInPain() ) Timer(); } function LogTaken(Controller c) { if ( C.PlayerReplicationInfo.Team != OldTeam ) BroadcastLocalizedMessage( MessageClass, 4, C.PlayerReplicationInfo, None, C.PlayerReplicationInfo.Team ); OldTeam = C.PlayerReplicationInfo.Team; UnrealMPGameInfo(Level.Game).GameEvent("bomb_pickup","255",C.PlayerReplicationInfo); } function Timer() { UnrealMPGameInfo(Level.Game).GameEvent("bomb_returned_timeout","255",None); Super.Timer(); } function BeginState() { if ( ((PassTarget == None) || (PassTarget == Instigator)) && (Skins[2] != Default.Skins[2]) ) { Skins[2] = Default.Skins[2]; SecondRepSkin = Skins[2]; SetPhysics(PHYS_Falling); } else if ( Physics != PHYS_Projectile ) SetPhysics(PHYS_Falling); SetTimer(MaxDropTime, false); SetPhysics(PHYS_Falling); Level.Game.GameReplicationInfo.FlagState[0] = EFlagState.FLAG_Down; Level.Game.GameReplicationInfo.FlagState[1] = EFlagState.FLAG_Down; } function EndState() { PassTarget = None; if ( Skins[2] != Default.Skins[2] ) { Skins[2] = Default.Skins[2]; SecondRepSkin = Skins[2]; } Super.EndState(); } } >jC]} a@69DC9?,C69DC9?,C69DC9?,C-' GFF6p* =+  ''        Die HumanFaster Stronger Better Fear MeFlesh Is A Design FlawMy Victory Your DeathNot UnacceptableRogue Process TerminatedWitness My PerfectionYou Die Too EasilyYou Make Easy PreyYour Programming Is InferiorI"                  !  Rerouting Critical Systems!You Adapt Well    K"Z.]Robot>>ogDX gg]`Fa~ $9?,6g333?s-Cg9?,wJ,*J,a G>R#class xBombDeliveryHole extends Decoration notplaceable; #exec OBJ LOAD File=XGame_StaticMeshes.usx function Touch(Actor Other) { local xBombFlag bomb; bomb = xBombFlag(Other); if (bomb != None) TryThrowScore(bomb); else TryJumpScore(Pawn(Other)); } function bool CheckScorer(Pawn P, bool bKill) { local vector NewVel; local Controller ScoreController; // valid player if ( P == None ) return false; if ( P.IsPlayerPawn() ) ScoreController = P.Controller; else if ( !bKill && (P.Controller == None) && P.WasPlayerPawn() ) ScoreController = xPawn(P).OldController; else return false; // opposing team delivery if ( (ScoreController == None) || (ScoreController.PlayerReplicationInfo == None) || (ScoreController.PlayerReplicationInfo.Team.TeamIndex == xBombDelivery(Owner).Team) ) { if ( (Bot(ScoreController) != None) && ScoreController.IsInState('Testing') ) return false; if ( bKill && (P.Controller != None) ) { // propel him on through NewVel = 300 * Normal(P.Velocity); NewVel.Z = 100; P.AddVelocity(NewVel); P.Died( P.Controller, class'Suicided', P.Location ); } return false; } return true; } function TryThrowScore(xBombFlag bomb) { local Controller ScoreController; if ( !Bomb.bThrownBomb || !CheckScorer(Bomb.Instigator, false) ) return; if ( Bomb.Instigator.Controller != None ) ScoreController = Bomb.Instigator.Controller; else ScoreController = xPawn(Bomb.Instigator).OldController; // throwing score! xBombingRun(Level.Game).ScoreBomb(ScoreController, bomb); xBombDelivery(Owner).ScoreEffect(false); } function TryJumpScore(Pawn holder) { if ( !CheckScorer(holder, true) ) return; if (holder.Controller.PlayerReplicationInfo.HasFlag == None) return; // contact score! xBombingRun(Level.Game).ScoreBomb(holder.Controller, xBombFlag(holder.Controller.PlayerReplicationInfo.HasFlag)); TriggerEvent(Event,self, Holder); xBombDelivery(Owner).ScoreEffect(true); } // !! this uses a simple staticmesh for collision, a cylinder wouldn't suffice. >>>quC==wJ,*J,a#:r*o$ G>>>tw@LLIb# - r*o$b  G>x>>y>>b>>L+//============================================================================= // xBombDelivery. // For Bombing Run matches. //============================================================================= class xBombDelivery extends GameObjective placeable; #exec OBJ LOAD File=WeaponSounds.uax var(Team) int Team; var xBombDeliveryHole MyHole; var int ExplosionCounter,ExplodeNow,LastExplodeNow; var() float TouchDownDifficulty; replication { reliable if( Role==ROLE_Authority ) ExplodeNow; } function bool CanDoubleJump(Pawn Other) { return true; } function bool CanMakeJump(Pawn Other, Float JumpHeight, Float GroundSpeed, Int Num, Actor Start, bool bForceCheck) { if ( !bForceCheck && (JumpHeight > Other.JumpZ) && (PhysicsVolume.Gravity.Z >= CalculatedGravityZ[Num]) && (NeededJump[Num].Z < 2 * Other.JumpZ) ) return true; return Super.CanMakeJump(Other,JumpHeight,GroundSpeed,Num,Start,bForceCheck); } function float GetDifficulty() { return TouchDownDifficulty; } simulated function PostBeginPlay() { local NavigationPoint N; Super.PostBeginPlay(); if ( Role == ROLE_Authority ) { DefenderTeamIndex = Team; NetUpdateTime = Level.TimeSeconds - 1; // spawn my scoring hole MyHole = Spawn(class'xBombDeliveryHole',self,,Location,Rotation); // check if has shootspots for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) if ( (ShootSpot(N) != None) && (ShootSpot(N).TeamNum == Team) ) { bHasShootSpots = true; break; } } SetTeamColors(); } function ScoreEffect(bool touchdown) { ExplodeNow++; // spawn some explosions PlaySound(sound'WeaponSounds.BExplosion3'); Spawn(class'NewExplosionA',,,Location+VRand()*Vect(50,50,50)); ExplosionCounter = 1; SetTimer(0.25,true); } simulated function Timer() { PlaySound(sound'WeaponSounds.BExplosion3'); Spawn(class'NewExplosionA',,,Location+VRand()*Vect(50,50,50)); ExplosionCounter++; if (ExplosionCounter > 5) SetTimer(0.0,false); } simulated function SetTeamColors() { if (Team == 0) { LightHue = 0; Skins[1] = Combiner'XGameTextures.superpickups.BombgatePulseRC'; } else { LightHue = 170; Skins[1] = Combiner'XGameTextures.superpickups.BombgatePulseBC'; } } simulated event PostNetReceive() { Super.PostNetReceive(); if (LastExplodeNow != ExplodeNow) { LastExplodeNow = ExplodeNow; PlaySound(sound'WeaponSounds.BExplosion3'); Spawn(class'NewExplosionA',,,Location+VRand()*Vect(50,50,50)); ExplosionCounter = 1; SetTimer(0.25,true); } } >>>v_@  r* B%w*-%_&._%._.!-c %*_Bc,*_.'Wbomb_dropped255 G>| 0-%c,*** G>}`'wJ,*J,aKq!q G>>>s'Gm@ !G>k,U G>Ax,\ G>BD},b G>>>CKT0Kc,K*K.%Wbomb_taken255K G>A//============================================================================= // Robot Voice. //============================================================================= class RobotVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax >E`7wJ,*J,a,,X#,o$%$&$ G>@Oqc.$G>xE:! G>IK}E@! G>>>JMBIp!' G>>>L`N!wJ,*J,a,,X#,y'%$&$-'a  a+ a(((-' G>Nj^# y(-(a'((-( G>HU~ (G>z RPgW$ G>>>Qkga$ G>S`k$TwJ,*J,a$%&$%$-($%{ %,X#, ? G>Tj'K-'$%%%   G>Pe2d 4G >X}( G>>>~ JTL0TwJc,J*JJ.&Wbomb_pickup255J G>]//============================================================================= // xBombBase. // For decoration only, this actor serves no game-related purpose! //============================================================================= class xBombBase extends Decoration; >Y$1C.#Wbomb_returned_timeout255* G>[`2Zr_* r_w,,,,X#,o$oo9:9:$o$a(o$%$&$ G>it Nr~*,r|*CG @C|~t & )^@C~ T|r@*@G @@ .^@C~h@| G >>>T //============================================================================= // xBlueFlagBase. //============================================================================= class xBlueFlagBase extends xRealCTFBase placeable; #exec OBJ LOAD FILE=XGameTextures.utx simulated function PostBeginPlay() { local xCTFBase xbase; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { xbase = Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); xbase.Skins[0] = Texture'XGameTextures.FlagBaseTexB'; } } N`i @2a<#aNs63}pփC Pp ]kEH] Blue Flag,Y>>|//============================================================================= // xBlueFlag. //============================================================================= class xBlueFlag extends CTFFlag; #exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } >a4wa* H,wHa*....%Ha G>cq Qaq 4 G>_>>dI:7w*Q G>a!A-6' G> .a!A-6' G>peN   G >hF f!e'fF F  G>c'}a  a(#HBHBHBa  a(#HBHBHBa  a(#HBHBHBa  a(#HBHBHBa  a(#HBHBHBa  a(#HBHBHBa   G>lp&a  a(#HBHBHB G>mn @$Z8-o 'L!>Lh  EU#% U#n U#%im }a((- (p G>jQ.e*'k]5UQ.&h-qU5U,`U5U&Q.,h-nQ.,h-U5,{w{*{a/!d.{/ $'{{5U {]w{*F{a/!d.{m5Q.$'{{ 5U G>G @!>r>>h >> oJR T-rJ % 9?5J & 9?' J G>Mz <A.M)wA*nA9m.M G>8class xAlienMaleSoundGroup extends xPawnSoundGroup; uC v̠d }2*Y 9Y 6Y >>t8s r8*(68M\8-g r8*8j \.8$(r\*r\*6\.V~ w.\*\a!i (-g w8*@9?,8 6@B8 N@8'[8 8 (' G`g`Bx `.8\",Y>>NJ K[8J i j k l J z5!H$ G!>@>>hclass xAlienFemaleSoundGroup extends xPawnSoundGroup; #exec OBJ LOAD FILE=..\sounds\NewDeath.uax >w~n:U2~-]s~( ow~*^~^.~$.AQ^~.VI( GrU!E}dŷ"&Յ3}#CD$4Bg.&P"$333?>>|TmI sT' ;rT* .A9QT.TiT.VI' G {H 1՛ }2*Y 9Y  6Y >>|//============================================================================= // WildcardBase //============================================================================= class WildcardBase extends xPickUpBase placeable; // todo: add ability for LD to select which ones can and can't be spawned... // todo: we need a mesh specifically for this... var() class PickupClasses[8]; var() bool bSequential; var int NumClasses; var int CurrentClass; simulated function PostBeginPlay() { local int i; if ( Role == ROLE_Authority ) { NumClasses = 0; while (NumClasses < ArrayCount(PickupClasses) && PickupClasses[NumClasses] != None) NumClasses++; if (bSequential) CurrentClass = 0; else CurrentClass = Rand(NumClasses); PowerUp = PickupClasses[CurrentClass]; } if ( Level.NetMode != NM_DedicatedServer ) { for ( i=0; i< NumClasses; i++ ) PickupClasses[i].static.StaticPrecache(Level); } Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-1)); // adjust because reduced drawscale } function TurnOn() { if (bSequential) CurrentClass = (CurrentClass+1)%NumClasses; else CurrentClass = Rand(NumClasses); PowerUp = PickupClasses[CurrentClass]; if( myPickup != None ) myPickup = myPickup.Transmogrify(PowerUp); } @kwA`"&#3} Wd d d da g.&P"$L?;$pB1$@>>bclass VampireGameRules extends GameRules; var() float ConversionRatio; function int NetDamage( int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType ) { if ( NextGameRules != None ) return NextGameRules.NetDamage( OriginalDamage,Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); if ( (InstigatedBy != Injured) && (InstigatedBy != None) && (InstigatedBy.Health > 0) && (InstigatedBy.PlayerReplicationInfo != None) && (Injured.PlayerReplicationInfo != None) && ((InstigatedBy.PlayerReplicationInfo.Team == None) || (InstigatedBy.PlayerReplicationInfo.Team != Injured.PlayerReplicationInfo.Team)) ) InstigatedBy.Health = Min( InstigatedBy.Health+Damage*ConversionRatio, Max(InstigatedBy.Health,InstigatedBy.HealthMax) ); return Damage; } // // server querying // function GetServerDetails( out GameInfo.ServerResponseLine ServerState ) { // append the gamerules name- only used if mutator adds me and deletes itself. local int i; i = ServerState.ServerInfo.Length; ServerState.ServerInfo.Length = i+1; ServerState.ServerInfo[i].Key = "Mutator"; ServerState.ServerInfo[i].Value = GetHumanReadableName(); } >@>>class uTeamBanner extends Decoration; var GameReplicationInfo GRI; var int Team; simulated function UpdateForTeam() { if ( (GRI != None) && (Team < 2) && (GRI.TeamSymbols[Team] != None) ) TexScaler(Combiner(Shader(FinalBlend(Skins[0]).Material).Diffuse).Material2).Material = GRI.TeamSymbols[Team]; } simulated function SetGRI(GameReplicationInfo NewGRI) { GRI = NewGRI; UpdateForTeam(); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); } >Nclass UT2003LadderInfo extends LadderInfo; /* * This class contains the single player ladder for UT2003 PC. * See Engine.LadderInfo for details. * * created by: Capps 8/20/02 */ // These are listed again here for convenience; they appear in Engine.LadderInfo //const DMLadderIndex = 0; //const TDMLadderIndex = 1; //const DOMLadderIndex = 2; //const CTFLadderIndex = 3; //const BRLadderIndex = 4; //const ChampionshipLadderIndex = 5; EM F7lCSMU Y ~@ABCV Y DEFGHIW Y JKLMNZY OPQRSTX Y UVWXYY YZ[A"A>>Rh1 s l G>C>>e d Q!xd 4 G>H>>II':7w*Q G>J>>L>>_ MN R _  G >>>O>>P>>H//============================================================================= // Attract-mode camera points // Copyright 2001 Digital Extremes - All Rights Reserved. // Confidential. //============================================================================= class AttractCamera extends Keypoint; var() float ViewAngle; var() float MinZoomDist; var() float MaxZoomDist; >e c 4-9:X,,\ ,^ Y9:X%,s,c 9:X&,l,b ,] ,a  wx* 9:X,.., 9:Xx G> S[ z.vY.[ wY*:Y-X$z[rY*X9=,zX9=Y4 G>Q>>Y>>r class UT2003GameProfile extends GameProfile; /* * This class is a concrete subclass of GameProfile that * refers directly to the UT2003 ladder. * * author: capps 8/20/02 */ // completely overrides GameProfile function ContinueSinglePlayerGame(LevelInfo level, optional bool bReplace) { local Controller C; local PlayerController PC; // set character, player in current game PC = none; for ( C=level.ControllerList; C!=None; C=C.NextController ) { if ( PlayerController(C) != None ) { PC = PlayerController(C); break; } } if ( PC == none ) { return; } if (level.game.SavePackage(PackageName)) { Log("SINGLEPLAYER UT2003GameProfile::ContinueSinglePlayerGame() saved profile."); } else { Log("SINGLEPLAYER UT2003GameProfile::ContinueSinglePlayerGame() save profile FAILED."); } PC.ConsoleCommand("disconnect"); if ( bReplace ) PC.Player.GUIController.ReplaceMenu("xInterface.UT2SinglePlayerMain"); else PC.Player.GUIController.OpenMenu("xInterface.UT2SinglePlayerMain"); } WQN 2X]ʅ3},e,e3}Zs u uu*F #{ uu*F #{D Y]TeamSymbols_UT2003.sym01F " t "n]xGame.UT2003LadderInfo>>zclass UDamageTimer extends Info; #exec OBJ LOAD FILE=PickupSounds.uax var int SoundCount; function Timer() { if ( Pawn(Owner) == None ) { Destroy(); return; } if ( SoundCount < 4 ) { SoundCount++; Pawn(Owner).PlaySound(Sound'PickupSounds.UDamagePickUp', SLOT_None, 1.5*Pawn(Owner).TransientSoundVolume,,1000,1.0); SetTimer(0.75,false); return; } Pawn(Owner).DisableUDamage(); Destroy(); } >k//============================================================================= // UDamageCharger. //============================================================================= class UDamageCharger extends xPickupBase; function PostBeginPlay() { Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-1)); // adjust because reduced drawscale } >J//============================================================================= // Alien Male Voice. //============================================================================= class AlienMaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax Zh'P \ŷg"&CD$pBg.&P"$L?>>c a!x G>]4!9:c%% I<9:c&%%I% wc* 9:c,w9:cc*...%9:cc G>^Z Q"cZ 4 G>>>_I(J:7w*Q G> aY z1].Y w]*:]-c$z[r]*c9=,zc9=]4 G>NF&1N,%N,&+N,,, G >]>>/class TeamWarCry extends xTeamRoster; eQ 2f^"aE/  ]TeamSymbols_UT2003.WarCry YANebriMokaraAnatRamsesQuake VengeanceFaith Xantares]WarCry>>.class TeamVenom extends xTeamRoster; gR 2haE/  ]TeamSymbols_UT2003.Venom YIDelara GramatikPelosin SeeSeela LockdownSayiidJackylMolotov]Venom>>2class TeamSupernova extends xTeamRoster; >PV."q9:9:$G%@G,wGP*GS-G I%`IGIP9:9:$V.%V.GV.P n7V.a # G>ji+Vm'-G I9D9?I&9?G4IGIPjw* T GiS 2lS+aE/  ]TeamSymbols_UT2003.Supernova Y?MaatBastetTefenetMiseryFuryTitaniaPerishDragon] Supernova>>V!]=w`*`=9:` %-'a # G>pa>qa>a>2class TeamSunBlades extends xTeamRoster; rT 2spM?aE/  ]TeamSymbols_UT2003.SunBlades YCImhotepNekhbetOsirisLuxorBrutusClangorDespairAriel] SunBlades>>_class TeamRedConfigured extends xTeamRoster; /* this class used for configured instant action or multiplayer games with bots */ var config array Characters; function Initialize(int TeamBots) { local int i; for ( i=0; i Chars) { default.Characters = Chars; } static function AddCharacter(string CharName) { local int i; i = FindCharIndex(CharName); if ( i == -1 ) default.Characters[default.Characters.Length] = CharName; } static function RemoveCharacter(int Index, int Count) { if ( Index < 0 || Index >= default.Characters.Length ) return; if ( Count < 0 ) Count = default.Characters.Length; default.Characters.Remove(Index, Min(Count, default.Characters.Length - Index)); } static function int FindCharIndex(string CharName) { local int i; for ( i = 0; i < default.Characters.Length; i++ ) if ( default.Characters[i] ~= CharName ) return i; return -1; } static function GetAllCharacters(out array Chars) { Chars = default.Characters; } t_4\ 6u_#,aE/p'p  >>4class TeamPainMachine extends xTeamRoster; v] 2wvraE/  ] TeamSymbols_UT2003.PainMachine YAKomekCobalt Silhouette ObsidianCirce Mandible Tiberius] PainMachine>> sk{ ]L.wk*k-c-1wkcw.k* T%k f kcT N  G>3class TeamNightstalkers extends xTeamRoster; >D!(y^ 2{@پaE/  ]"!TeamSymbols_UT2003.Nightstalkers Y=AvariceBulldogHathorKhepry TranquilitySethChaos]Nightstalkers>>2class TeamIronGuard extends xTeamRoster; |b 2}raE/  ]TeamSymbols_UT2003.IronGuard Y3MakrethSeligRapier RenegadeSamediJigsaw] IronGuard>>2class TeamFirestorm extends xTeamRoster; >]hKhRV W X X -hz5R&,[/$'|hz5R&,[/$' G!>@>>H +(o9?%a?oS ( G>A$#\@K=o9?% O 9?%a?oO ( G>Bt K,1@t a z t =wU *aU  G~c 2D=y+aE/  ]TeamSymbols_UT2003.Firestorm Y>MotigNapaketIsis Sunspear HuntressGaulOdinHydra] Firestorm>> CFz8 K G>G>>>[c6HFg =+  [.' '             Blow me Camper!  Douche bag!  Spammer!SuckerTalk to the hand  You dick!I"222???                                   K"Z.= Male Alien>>@>>7Q T  c)7L%L77&]L&]77s6]76L7F L7L7]7]7F ]9L G>@>>5class TeamDragonBreath extends xTeamRoster; Ld 2M<aE/  ]! TeamSymbols_UT2003.DragonBreath Y@Timrit Avalanche StargazerSphinxNatronSorrowPhantom] DragonBreath>>2class TeamCrusaders extends xTeamRoster; >J~' GNg 2Py4aE/  ]TeamSymbols_UT2003.Crusaders YGKhepryArachneOutrage BullseyeCipherXargonOpheliaNemesis] Crusaders>>I dY*ZI `wZ*Iw.Z*Y.Z`ZZmrY* I  SINGLEPLAYER UT2003GameProfile::ContinueSinglePlayerGame() saved profile.0SINGLEPLAYER UT2003GameProfile::ContinueSinglePlayerGame() save profile FAILED.YK disconnect-P Y &[xInterface.UT2SinglePlayerMainY &]xInterface.UT2SinglePlayerMain G>2class TeamColdSteel extends xTeamRoster; >K>Rk 2Tv#aE/  ]TeamSymbols_UT2003.ColdSteel YD PredatorIncisorCycloneTorqueShardKatanaSeekerVector] ColdSteel>>5class TeamBoneCrushers extends xTeamRoster; >N//============================================================================= // Alien Female Voice. //============================================================================= class AlienFemaleVoice extends xVoicePack; #exec OBJ LOAD FILE=TauntPack.uax >!O >K b3O X* X6KXxGame.xPawnX!KXTX G >S>>X>Un 2Z#aE/  ]! TeamSymbols_UT2003.BoneCrushers YECaskuliRathikJezebelNafiret Nephthys PerditionNovaKain] BoneCrushers>>`class TeamBlueConfigured extends xTeamRoster; /* this class used for configured instant action or multiplayer games with bots */ var config array Characters; function Initialize(int TeamBots) { local int i; for ( i=0; i Chars) { default.Characters = Chars; } static function AddCharacter(string CharName) { local int i; i = FindCharIndex(CharName); if ( i == -1 ) default.Characters[default.Characters.Length] = CharName; } static function RemoveCharacter(int Index, int Count) { if ( Index < 0 || Index >= default.Characters.Length ) return; if ( Count < 0 ) Count = default.Characters.Length; default.Characters.Remove(Index, Min(Count, default.Characters.Length - Index)); } static function int FindCharIndex(string CharName) { local int i; for ( i = 0; i < default.Characters.Length; i++ ) if ( default.Characters[i] ~= CharName ) return i; return -1; } static function GetAllCharacters(out array Chars) { Chars = default.Characters; } >WM p2B  oM V* V6BVxGame.xPawnV!BVTV G >U Q N]>( -Q ,&U ;Q ,&U  G >V>[l4o 6_GaE/p'p  >>3class TeamBloodFists extends xTeamRoster; >\V A+\Pr6B!*pppCould not load species 9V6B! for 6! 6B!(y!V *V  G`D2bÃaE/  ]TeamSymbols_UT2003.BloodFists Y@Thorax WidowmakerSeptis Darkling CharismaJanusMedusa= BloodFists>>aW { 6gHW s 9L6C!? 9L6A!?9L6S!@9L6I!@9L6D!@9L6`!@z6m!*(6m! 9L6Q$!W  G>4class TeamBlackLegion extends xTeamRoster; dE2eJfaE/  ] TeamSymbols_UT2003.BlackLegion YJRavageFate HarlequinMortisDominaGryphon JackHammer Matriarch] BlackLegion>>3class TeamApocalypse extends xTeamRoster; fF2gNyaE/  ]TeamSymbols_UT2003.Apocalypse YE Brutalis SuccubusLexaCinderMr.Crow MystiqueRampageRust= Apocalypse>>L+k r0kk8bGameTimeToScoreT t $($Text3;0:60 'k9bGameTimeDisabledT t $($Text3;0:60 ' G >uJ  6 Juu  u  u  u  u  u  u  u   G >s//============================================================================= // SuperShieldCharger. //============================================================================= class SuperShieldCharger extends xPickupBase; function PostBeginPlay() { Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-1)); // adjust because reduced drawscale } ji'Hk""&C D$pBg.&P"$L?>>_//============================================================================= // SuperHealthCharger. //============================================================================= class SuperHealthCharger extends xPickupBase; #exec OBJ LOAD FILE=2k4ChargerMeshes.usx function PostBeginPlay() { Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-1)); // adjust because reduced drawscale } lj'RmX"&C D$pBg.@6A6:50@L6$333?& P"$L?>>o@>>p@>>m%>>iF DA 6 DF  G >xX KdX G H I ra rp/!>X z5 rp/$' G!>@>>C >>t>>jclass SPECIES_Night extends SPECIES_Human abstract; static function int ModifyImpartedDamage( int Damage, pawn injured, pawn instigatedBy, vector HitLocation, vector Momentum, class DamageType ) { Damage *= Default.DamageScaling; if ( instigatedBy.Health > 0 ) instigatedBy.Health = Clamp(int(instigatedBy.Health+Damage*0.5), instigatedBy.Health, instigatedBy.HealthMax); return Damage; } >u>>wN  C d  G >@>&_B Y6z 3&Ƞ <b]intro_lauren.Lauren>>Y>>4Qy2r/9:W9:$ - 6T Q 9:W9:${6pQr.6pQ |6QFemaleQg W-XGame.xJuggFemaleSoundGroup j XQh HW-XGame.xJuggMaleSoundGroup Xi 9:W9:$|6QFemaley XGame.JuggFemaleVoice y XGame.JuggMaleVoice w{ *{ y  VW-{6dQH6dQy H ry *H}5|6QFemaleWH rr* {QQ w .6S Q .q ,wW*W-q m%q ,1rW*W- -|6dQ, PlayerSkins.r ppppBright6dQ_9Sq Bo.r 'ro*r pp6dQ_9Sq o.r -6]#Qr%pp6S Q_9Sq M$.r% wM$*w M$ro*pTeamSkin not found 9Voo.6dQ o.6dQ [|6dQUT2004PlayerSkins.XanMk3V2_BodyUT2004PlayerSkins.XanMk3V2_abdomen W oW w W6R Q{ a { UW G Ve6}\ =+  [.' '                             Blow me Camper!  Douche bag!  Spammer!SuckerTalk to the hand  You dick!I"222???                                   K"Z.] Female Alien>>Gclass AimedAttachment extends Actor native; var() Vector BaseOffset; var() Vector AimedOffset; var() float DownwardBias; >a// ==================================================================== // Class: XGame.Intro_Lauren // Parent: XGame.xIntroPawn // // // ==================================================================== class Intro_Lauren extends xIntroPawn; }voS3@d}͡hhhhhR]XGame.NightMaleVoiceE]XGame.NightFemaleVoicev]XGame.xNightMaleSoundGroupw]XGame.xNightFemaleSoundGroup\]NightP"k Z/k ^/M$333?>>yclass SPECIES_Merc extends SPECIES_Human abstract; static function string GetRagSkelName(string MeshName) { if(InStr(MeshName, "Gitty") >= 0) return Default.FemaleRagSkelName; if(InStr(MeshName, "Ophelia") >= 0) return Default.FemaleRagSkelName; return Super.GetRagSkelName(MeshName); } }AX+T3B}͡v]XGame.xMercMaleSoundGroupw]XGame.xMercFemaleSoundGroup\] MercenaryP">>Iclass SPECIES_Jugg extends SpeciesType abstract; static function string GetRagSkelName(String MeshName) { return "Jugg2"; } >Zz NB z 2%r"*"i  `&Gr"*w"e  ,sr"*"k  ,w ,r"*"`  ,w ,r"*"`   G >8class SPECIES_Human extends SpeciesType abstract; >:class SPECIES_Egypt extends SPECIES_Human abstract; }Fv3GQL}͡\] EgyptianP"k o.k t.L$ @^$̌?W$?Q$?$?>>Gclass SPECIES_Bot extends SpeciesType abstract; static function string GetRagSkelName(String MeshName) { return "Bot2"; } >|x A9D9?x A  G >a8 J6A                                                                                                               ~    2.PlayerSkins.Human_Skeleton PV6              m-          s7    r7  q7> 9: 9:$9: 9:$ -E - - -  b2E ;  :n5.UT2004PlayerSkins.XanMk3V2_abdomen  >n5.UT2004PlayerSkins.Skaarj_Skeleton_Body @ %h@ 7E ^{6y@ E DUP9:6^"@ E %^-a8%|6d@ E , PlayerSkins.+|6d@ E ,UT2004PlayerSkins..|6d@ E ,UT2004ECEPlayerSkins.)|6d@ E ,DemoPlayerSkins.7C C @ E @ BF! p--G!wF!*F!-@ %> @ 7C 6T @ C  -G! w * -  -%|6d@ C , PlayerSkins.A-.ppBright6d@ C _0B ' A-.p6d@ C _0  A-.6d@ C  n5A-   -%|6d@ C , PlayerSkins.A-.ppBright6d@ C _0B 'G/.ppBright6d@ C _1B ' A-.p6d@ C _0 G/.p6d@ C _1  -6]#@ C J..p6S @ C _0 e/.p6S @ C _1  n5J. n5e/ n5A- n5G/ -6]#@ C J..6S @ C  n5J.4 {6d@ C 6d@ C @  G >L>>M>>N>>O>>P>>>&i^B Y6Q{v&Ƞ <b]intro_malcom.Malcom>>J{D%N{  {  {  {  {  {  {  {  {  {  {  {  {  {  {  KV6{   G >T>>U>>V>>W>>X>>>>u EGJ E D B   @      ~ } |  G >e ^K*%v,^m5%X/$'^vv w {Vr.{* v }%^d,r ' & , ,^"m5.{X/$'' ,^"m5.{M1$'' , $,^"m5.{L1$''  G!Hlw3[(!R]XGame.RobotVoiceE]XGame.FemRobotVoice`]xEffects.xBotGibGroupv]XGame.xBotSoundGroupw]XGame.xBotSoundGroup\]RobotP"."k >T Want some?Q$?M$?_$̌?{$L?U$333?>>Kclass SPECIES_Alien extends SpeciesType abstract; static function string GetRagSkelName(String MeshName) { return "Alien2"; } >@>>C5 x; M -`%K9: 9:$w *w *f" w *w *$w *f" 69: v/f"'H6 rf"'F.6T r rF*pFailed to load player mesh 6T r( -`%' F k -|6rFemale9w * - -9: 9:${6prq.6pr , -eg  - g XGame.xJuggFemaleSoundGroup ) g j eh  - g XGame.xJuggMaleSoundGroup  g i 79: 9:$wq* Gq''{e G.e f",w *w *f" fw *w *$w *f" ffw *" -f"m%H6 rf"7-6F&r 9: 9:$  7|6drUT2004PlayerSkins.XanMk3V2_Body, .UT2004PlayerSkins.XanMk3V2_abdomen  fa K9: 9:$|6rFemalesXGame.JuggFemaleVoicesXGame.JuggMaleVoiceos   s/w * o mo -w *{ s s6dr{sos Bro*s}5 - os   sw * o moy"%6 y",, y"n%!>#7 # y"n%# y"N', #,6 y"' G > ] n x . n m ] -'-' G{z~`1c@E>>F>\iy3b3!R]XGame.AlienMaleVoiceE]XGame.AlienFemaleVoice`]xEffects.xAlienGibGroupy]Aliens.Skeleton_Alien|]Aliens.Skeleton_Alienv]XGame.xAlienMaleSoundGroupw]XGame.xAlienFemaleSoundGroup\]Alienk o.k t.T  Tail wagT Gun checkT DismissalT 360L$?^$33?Q$ff?_$̌?>>zclass SpeciesType extends Object abstract native; #EXEC OBJ LOAD FILE=UT2004Weapons.utx var string MaleVoice; var string FemaleVoice; var string GibGroup; var string MaleRagSkelName; var string FemaleRagSkelName; var string FemaleSkeleton; var string MaleSkeleton; var string MaleSoundGroup; var string FemaleSoundGroup; var string PawnClassName; var localized string SpeciesName; // human readable name, for menus var int RaceNum; var int DMTeam; // team color used in DM var name TauntAnims[16]; var localized string TauntAnimNames[16]; var float AirControl, GroundSpeed, WaterSpeed, JumpZ, ReceivedDamageScaling, DamageScaling, AccelRate, WalkingPct,CrouchedPct,DodgeSpeedFactor, DodgeSpeedZ; static function string GetVoiceType( bool bIsFemale, LevelInfo Level ) { if ( bIsFemale ) { if ( Level.bLowSoundDetail ) return "XGame.JuggFemaleVoice"; else return Default.FemaleVoice; } if ( Level.bLowSoundDetail ) return "XGame.JuggMaleVoice"; else return Default.MaleVoice; } static function LoadResources( xUtil.PlayerRecord rec, LevelInfo Level, PlayerReplicationInfo PRI, int TeamNum ) { local string BodySkinName, VoiceType, SkelName, FaceSkinName; local Material NewBodySkin, NewFaceSkin, TeamFaceSkin; local class VoiceClass; local class GibGroupClass; local mesh customskel; if ( (Level.NetMode != NM_DedicatedServer) && class'DeathMatch'.default.bForceDefaultCharacter ) return; DynamicLoadObject(rec.MeshName,class'Mesh'); if ( (Level.NetMode != NM_DedicatedServer) && (rec.Skeleton != "") ) customskel = mesh(DynamicLoadObject(rec.Skeleton,class'Mesh')); if ( rec.Sex ~= "Female" ) { SkelName = Default.FemaleSkeleton; if ( Level.bLowSoundDetail ) DynamicLoadObject("XGame.xJuggFemaleSoundGroup", class'Class'); else DynamicLoadObject(Default.FemaleSoundGroup, class'Class'); } else { SkelName = Default.MaleSkeleton; if ( Level.bLowSoundDetail ) DynamicLoadObject("XGame.xJuggMaleSoundGroup", class'Class'); else DynamicLoadObject(Default.MaleSoundGroup, class'Class'); } if ( Level.NetMode == NM_DedicatedServer ) { if ( rec.Sex ~= "Female" ) VoiceClass = class(DynamicLoadObject("XGame.JuggFemaleVoice",class'Class')); else VoiceClass = class(DynamicLoadObject("XGame.JuggMaleVoice",class'Class')); if ( PRI != None ) PRI.VoiceType = VoiceClass; return; } if ( !Level.bLowSoundDetail && (rec.VoiceClassName != "") ) { VoiceType = rec.VoiceClassName; VoiceClass = class(DynamicLoadObject(VoiceType,class'Class')); } if ( VoiceClass == None ) { VoiceType = GetVoiceType(rec.Sex ~= "Female", Level); class(DynamicLoadObject(VoiceType,class'Class')); } if ( (CustomSkel == None) && (SkelName != "") ) DynamicLoadObject(SkelName,class'Mesh'); NewFaceSkin = Material(DynamicLoadObject(rec.FaceSkinName, class'Material')); if ( (TeamNum == 255) && (Level.GRI != None) && Level.GRI.bForceTeamSkins ) TeamNum = Default.DMTeam; if ( (TeamNum != 255) && ((Level.GRI == None) || !Level.GRI.bNoTeamSkins) ) { if ( class'DMMutator'.Default.bBrightSkins && (Left(rec.BodySkinName,12) ~= "PlayerSkins.") ) { BodySkinName = "Bright"$rec.BodySkinName$"_"$TeamNum$"B"; NewBodySkin = Material(DynamicLoadObject(BodySkinName, class'Material',true)); } if ( NewBodySkin == None ) { BodySkinName = rec.BodySkinName$"_"$TeamNum; NewBodySkin = Material(DynamicLoadObject(BodySkinName, class'Material')); // allow team head skins with new skins if ( rec.TeamFace ) { FaceSkinName = rec.FaceSkinName$"_"$TeamNum; TeamFaceSkin = Material(DynamicLoadObject(FaceSkinName, class'Material')); if ( TeamFaceSkin != None ) NewFaceSkin = TeamFaceSkin; } } if ( NewBodySkin == None ) { log("TeamSkin not found "$NewBodySkin); NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material')); } } else NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material')); // Xan hack if ( Rec.BodySkinName ~= "UT2004PlayerSkins.XanMk3V2_Body" ) DynamicLoadObject("UT2004PlayerSkins.XanMk3V2_abdomen", class'Material'); Level.AddPrecacheMaterial(NewBodySkin); Level.AddPrecacheMaterial(NewFaceSkin); Level.AddPrecacheMaterial(rec.Portrait); GibGroupClass = class(DynamicLoadObject(Default.GibGroup, class'Class')); GibGroupClass.static.PrecacheContent(Level); } static function int ModifyReceivedDamage( int Damage, pawn injured, pawn instigatedBy, vector HitLocation, vector Momentum, class DamageType ) { return Damage * Default.ReceivedDamageScaling; } static function int ModifyImpartedDamage( int Damage, pawn injured, pawn instigatedBy, vector HitLocation, vector Momentum, class DamageType ) { return Damage * Default.DamageScaling; } static function ModifyPawn(Pawn P) { P.AirControl = P.Default.AirControl * Default.AirControl; P.GroundSpeed = P.Default.GroundSpeed * Default.GroundSpeed; P.WaterSpeed = P.Default.WaterSpeed * Default.WaterSpeed; P.JumpZ = P.Default.JumpZ * Default.JumpZ; P.AccelRate = P.Default.AccelRate * Default.AccelRate; P.WalkingPct = P.Default.WalkingPct * Default.WalkingPct; P.CrouchedPct = P.Default.CrouchedPct * Default.CrouchedPct; P.DodgeSpeedFactor = P.Default.DodgeSpeedFactor * Default.DodgeSpeedFactor; P.DodgeSpeedZ = P.Default.DodgeSpeedZ * Default.DodgeSpeedZ; } static function string GetRagSkelName(string MeshName) { if(InStr(MeshName, "Female") >= 0) return Default.FemaleRagSkelName; return Default.MaleRagSkelName; } static function SetTeamSkin(xPawn P, xUtil.PlayerRecord rec, int TeamNum) { local string BodySkinName, FaceSkinName; local Material NewBodySkin, TeamFaceSkin, NewFaceSkin; NewFaceSkin = Material(DynamicLoadObject(rec.FaceSkinName, class'Material')); P.TeamSkin = TeamNum; P.bClearWeaponOffsets = rec.ZeroWeaponOffsets; if ( TeamNum == 0 ) P.Texture = Texture'RedMarker_t'; else P.Texture = Texture'BlueMarker_t'; if ( (TeamNum != 255) && ((P.Level.GRI == None) || !P.Level.GRI.bNoTeamSkins) ) { if ( class'DMMutator'.Default.bBrightSkins && (Left(rec.BodySkinName,12) ~= "PlayerSkins.") ) { BodySkinName = "Bright"$rec.BodySkinName$"_"$TeamNum$"B"; NewBodySkin = Material(DynamicLoadObject(BodySkinName, class'Material',true)); if ( NewBodySkin != None ) P.AmbientGlow = 0.5 * P.Default.AmbientGlow; } if ( NewBodySkin == None ) { BodySkinName = rec.BodySkinName$"_"$TeamNum; NewBodySkin = Material(DynamicLoadObject(BodySkinName, class'Material')); // allow team head skins with new skins if ( rec.TeamFace ) { FaceSkinName = rec.FaceSkinName$"_"$TeamNum; TeamFaceSkin = Material(DynamicLoadObject(FaceSkinName, class'Material')); if ( TeamFaceSkin != None ) NewFaceSkin = TeamFaceSkin; } } if ( NewBodySkin == None ) { log("TeamSkin not found "$NewBodySkin$" for "$P.Mesh); NewBodySkin = Material(DynamicLoadObject(rec.BodySkinName, class'Material')); } P.Skins[0] = NewBodySkin; } else P.Skins[0] = Material(DynamicLoadObject(rec.BodySkinName, class'Material')); P.Skins[1] = NewFaceSkin; } static function bool Setup(xPawn P, xUtil.PlayerRecord rec) { local mesh NewMesh, customskel; local string VoiceType, SkelName; local class VoiceClass; local int TeamNum, i,j; if ( P.bAlreadySetup ) { // make sure correct teamskin if ( P.Level.NetMode == NM_Client ) { if ( (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team != None) ) TeamNum = P.PlayerReplicationInfo.Team.TeamIndex; else if ( (P.DrivenVehicle != None) && (P.DrivenVehicle.PlayerReplicationInfo != None) && (P.DrivenVehicle.PlayerReplicationInfo.Team != None) ) TeamNum = P.DrivenVehicle.PlayerReplicationInfo.Team.TeamIndex; if ( P.TeamSkin == TeamNum ) return true; SetTeamSkin(P,rec,TeamNum); } return true; } NewMesh = Mesh(DynamicLoadObject(rec.MeshName,class'Mesh')); if ( NewMesh == None ) { log("Failed to load player mesh "$rec.MeshName); return false; } P.bAlreadySetup = true; P.LinkMesh(NewMesh); P.AssignInitialPose(); P.bIsFemale = ( rec.Sex ~= "Female" ); if ( P.PlayerReplicationInfo != None ) P.PlayerReplicationInfo.bIsFemale = P.bIsFemale; if ( (P.Level.NetMode != NM_DedicatedServer) && (rec.Skeleton != "") ) customskel = mesh(DynamicLoadObject(rec.Skeleton,class'Mesh')); if ( P.bIsFemale ) { SkelName = Default.FemaleSkeleton; if ( P.Level.bLowSoundDetail ) P.SoundGroupClass = class(DynamicLoadObject("XGame.xJuggFemaleSoundGroup", class'Class')); else P.SoundGroupClass = class(DynamicLoadObject(Default.FemaleSoundGroup, class'Class')); } else { SkelName = Default.MaleSkeleton; if ( P.Level.bLowSoundDetail ) P.SoundGroupClass = class(DynamicLoadObject("XGame.xJuggMaleSoundGroup", class'Class')); else P.SoundGroupClass = class(DynamicLoadObject(Default.MaleSoundGroup, class'Class')); } if ( P.Level.NetMode != NM_DedicatedServer ) { if ( CustomSkel != None ) P.SkeletonMesh = CustomSkel; else if ( SkelName != "" ) P.SkeletonMesh = mesh(DynamicLoadObject(SkelName,class'Mesh')); TeamNum = 255; if ( (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team != None) ) TeamNum = P.PlayerReplicationInfo.Team.TeamIndex; else if ( (P.DrivenVehicle != None) && (P.DrivenVehicle.PlayerReplicationInfo != None) && (P.DrivenVehicle.PlayerReplicationInfo.Team != None) ) TeamNum = P.DrivenVehicle.PlayerReplicationInfo.Team.TeamIndex; else if ( (P.Level.GRI != None) && P.Level.GRI.bForceTeamSkins ) TeamNum = Default.DMTeam; SetTeamSkin(P,rec,TeamNum); if ( rec.UseSpecular && (P.Level.DetailMode!=DM_Low) ) { P.HighDetailOverlay = Material'UT2004Weapons.WeaponShader'; // Xan hack if ( Rec.BodySkinName ~= "UT2004PlayerSkins.XanMk3V2_Body" ) P.Skins[2] = Material(DynamicLoadObject("UT2004PlayerSkins.XanMk3V2_abdomen", class'Material')); } } P.GibGroupClass = class(DynamicLoadObject(Default.GibGroup, class'Class')); if ( P.Level.NetMode == NM_DedicatedServer ) { if ( rec.Sex ~= "Female" ) VoiceType = "XGame.JuggFemaleVoice"; else VoiceType = "XGame.JuggMaleVoice"; VoiceClass = class(DynamicLoadObject(VoiceType,class'Class')); P.VoiceType = VoiceType; if ( P.PlayerReplicationInfo != None ) P.PlayerReplicationInfo.VoiceType = VoiceClass; P.VoiceClass = class(VoiceClass); } else { if ( !P.Level.bLowSoundDetail ) { if ( (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.VoiceTypeName != "") ) VoiceType = P.PlayerReplicationInfo.VoiceTypeName; else VoiceType = rec.VoiceClassName; if ( VoiceType != "" ) VoiceClass = class(DynamicLoadObject(VoiceType,class'Class')); } if ( VoiceClass == None ) { VoiceType = GetVoiceType(P.bIsFemale, P.Level); VoiceClass = class(DynamicLoadObject(VoiceType,class'Class')); } P.VoiceType = VoiceType; if ( P.PlayerReplicationInfo != None ) P.PlayerReplicationInfo.VoiceType = VoiceClass; P.VoiceClass = class(VoiceClass); } // add unique taunts for ( i=0; i<16; i++ ) if ( Default.TauntAnims[i] != '' ) { j = P.TauntAnims.Length; P.TauntAnims[j] = Default.TauntAnims[i]; P.TauntAnimNames[j] = Default.TauntAnimNames[i]; if ( j == 15 ) break; } return true; } static function int GetOffsetForSequence(name Sequence) { local int i; for ( i=0; i<16; i++ ) { if ( Default.TauntAnims[i] == '' ) return -1; if ( Default.TauntAnims[i] == Sequence ) return i; } return -1; } ~oad;o2ʁ)>>^ class SpeciesGameRules extends GameRules; function int NetDamage( int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType ) { if ( NextGameRules != None ) return NextGameRules.NetDamage( OriginalDamage,Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); if ( xPawn(injured) != None ) Damage = xPawn(injured).Species.static.ModifyReceivedDamage(Damage,injured,instigatedBy,HitLocation,Momentum,DamageType); if ( (InstigatedBy != Injured) && (xPawn(InstigatedBy) != None) ) Damage = xPawn(InstigatedBy).Species.static.ModifyImpartedDamage(Damage,injured,instigatedBy,HitLocation,Momentum,DamageType); return Damage; } >_Cw Cg 9?&h-d c] ?L> ] 9?,L?-d Cg 9?,.C?] >C G>Z class SpecialKillMessage extends LocalMessage; var(Messages) localized string DecapitationString; var sound HeadShotSound; // OBSOLETE static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return Default.DecapitationString; } static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); P.PlayRewardAnnouncement('HeadShot',1); } gyC2hb:Fݕ u  x ] Head Shot!!k@h*HeZ$=>>AjSs Alien2 G >k@>>@>>AmSq Bot2 G >n@>>@>>u tBzto qJ%J9D9?J9?t?J9DJt G >N% class SpawnerProjectile extends Projectile; var xEmitter Trail; var ProjectileSpawner Spawner; replication { reliable if( Role==ROLE_Authority ) Spawner; } simulated function Destroyed() { if (Trail != None) { if (Trail.mRegen) Trail.mRegen = false; else Trail.Destroy(); } Super.Destroyed(); } function PostBeginPlay() { Super.PostBeginPlay(); Spawner = ProjectileSpawner(Owner); Speed = Spawner.ProjectileSpeed; MaxSpeed = Spawner.ProjectileSpeed; Velocity = Speed * Vector(Rotation); if (Spawner.GravityAffected) SetPhysics(PHYS_Falling); if (Level.NetMode != NM_DedicatedServer) { //PostNetBeginPlay(); } } simulated function PostNetBeginPlay() { if (Spawner == None) { Destroy(); return; } if (Spawner.ProjectileLifeSpan > 0) LifeSpan = Spawner.ProjectileLifeSpan; if (Spawner.ProjectileMesh != None) { SetDrawType(DT_Mesh); LinkMesh(Spawner.ProjectileMesh); SetDrawScale(Spawner.ProjectileMeshScale); } if (Spawner.TrailEmitter != None) { Trail = Spawn(Spawner.TrailEmitter, self,, Location, Rotation); Trail.RemoteRole = ROLE_None; Trail.SetPhysics(PHYS_Trailer); Trail.bTrailerSameRotation = true; } } simulated function ProcessTouch (Actor Other, vector HitLocation) { if (Role == ROLE_Authority && Spawner.DamageRadius == 0 && Spawner.Damage > 0) { Other.TakeDamage(Spawner.Damage, None, HitLocation, Vect(0,0,0), Spawner.DamageType); } Explode(HitLocation, Normal(HitLocation-Other.Location)); } simulated function Explode(vector HitLocation, vector HitNormal) { local xEmitter Exp; if (Role == ROLE_Authority && Spawner.DamageRadius > 0 && Spawner.Damage > 0) { HurtRadius(Spawner.Damage, Spawner.DamageRadius, Spawner.DamageType, 0, HitLocation); } if (Spawner.ExplosionEmitter != None && Level.NetMode != NM_DedicatedServer) { Exp = Spawn(Spawner.ExplosionEmitter,,, HitLocation+HitNormal*8, Rotator(HitNormal)); Exp.RemoteRole = ROLE_None; } Destroy(); } simulated function Landed( vector HitNormal ) { HitWall( HitNormal, None ); } >J>>r//============================================================================= // ShieldCharger. //============================================================================= class ShieldCharger extends xPickupBase; function PostbeginPlay() { if ( (Level.Title ~= "IronDeity") && (Name == 'ShieldCharger0') ) { SpawnHeight = 130.0; Super.PostBeginPlay(); if ( myPickup != None ) myPickup.PrePivot.Z = 85.0; return; } Super.PostBeginPlay(); SetLocation(Location + vect(0,0,-2)); // adjust because reduced drawscale } >t>>u>>v>>>>AxSr Jugg2 G >y@>>@>>{@~>@~|>@>]TUT-DM]Deathmatch Tutorial]xGame.DMRosterTrainingDay$ AX]?Quickstart=true]xGame.xDeathmatch>MDM-TrainingDay]xGame.DMRosterTrainingDay$$ AX]?WeaponStay=true"]xGame.xDeathmatch>] DM-Gael]xGame.DMRosterGael$L>$ AX]?WeaponStay=true"]xGame.xDeathmatch>] DM-Leviathan]xGame.DMRosterLeviathan$?$pAX]?WeaponStay=true"]xGame.xDeathmatch>= DM-Oceanic]xGame.DMRosterOceanic#]DRAFT$=$pAX]?WeaponStay=true"]xGame.xDeathmatch>= DM-Phobos2]xGame.DMRosterBeatTeam#= TDM OPENED$?$AX]?WeaponStay=true"]xGame.xDeathmatch>] DM-Insidious]xGame.TeamSupernova#] TRADE Remus$?$ AX]?TeamScreen=true"]xGame.xTeamGame>] DM-Curse3]xGame.TeamCrusaders$@?$pAX]?TeamScreen=true"]xGame.xTeamGame>= DM-Antalus]xGame.TeamSunBlades#]TRADE Cannonball$?$pAX]?TeamScreen=true"]xGame.xTeamGame>] DM-Plunge]xGame.TeamDragonBreath#= DOM OPENED$?$AX]?TeamScreen=true"]xGame.xTeamGame>] DM-Asbestos]xGame.TeamBoneCrushers#] TRADE Horus$?$AX]?TeamScreen=true" ]xGame.xTeamGame>]DM-TokaraForest]xGame.TeamVenom#] TDM COMPLETE$@$AX]?TeamScreen=true" ]xGame.xTeamGame>]DOM-ScorchedEarth]xGame.TeamWarCry#]TRADE Damarus$?$@@X]?TeamScreen=true"]xGame.xDoubleDom>] DOM-Core]xGame.TeamBoneCrushers$@?$@@X]?TeamScreen=true"]xGame.xDoubleDom>]DOM-SepukkuGorge]xGame.TeamFirestorm#= CTF OPENED$?$@@X]?TeamScreen=true" ]xGame.xDoubleDom>]DOM-Suntemple]xGame.TeamApocalypse#MTRADE Faraleth$?$@X]?TeamScreen=true" ]xGame.xDoubleDom>]DOM-Outrigger]xGame.TeamBlackLegion#] DOM COMPLETE$@$@X]?TeamScreen=true" ]xGame.xDoubleDom>] CTF-Maul]xGame.TeamNightstalkers#MTRADE Subversa$?$@@X]?TeamScreen=true"MxGame.xCTFGame>] CTF-Citadel]xGame.TeamVenom$?$@@X]?TeamScreen=true"MxGame.xCTFGame>= CTF-Chrome]xGame.TeamBlackLegion#] TRADE Lilith$?$@@X]?TeamScreen=true"MxGame.xCTFGame>MCTF-Geothermal]xGame.TeamBloodFists#] BR OPENED$?$@X]?TeamScreen=true"MxGame.xCTFGame>]CTF-Lostfaith]xGame.TeamIronGuard$@$@X]?TeamScreen=true" MxGame.xCTFGame>] CTF-Face3]xGame.TeamColdSteel#] CTF COMPLETE$ @$@X]?TeamScreen=true" MxGame.xCTFGame>] BR-TwinTombs]xGame.TeamVenom#] TRADE Syzygy$@?$pAX]?TeamScreen=true"]xGame.xBombingRun>]BR-Disclosure]xGame.TeamBlackLegion$?$pAX]?TeamScreen=true"]xGame.xBombingRun>= BR-Bifrost]xGame.TeamColdSteel#]TRADE Corrosion$?$AX]?TeamScreen=true"]xGame.xBombingRun>] BR-Anubis]xGame.TeamBloodFists$@$AX]?TeamScreen=true" ]xGame.xBombingRun>= BR-Skyline]xGame.TeamPainMachine#] BR COMPLETE$ @$AX]?TeamScreen=true" ]xGame.xBombingRun>]DM-Compressed]Tournament Semi-Final]xGame.ChampRosterSemiFinal$0@$AX]?TeamScreen=true"]xGame.xTeamGame>]DM-1on1-Serpentine]Tournament Final]xGame.ChampRosterFinal#]CHAMPIONSHIP COMPLETE$ AX]?TeamScreen=false"] xGame.BossDM>>>>T&>>>>>>Q$@>>s@>>^"@>>>>>>n@>>b@>>s>>>>nyc,$ G>O%>>@>>W&@>s>xub,Cvc,u G>|2oe, (r *t@@ppServerRequestRules Level.TimeSeconds:9ULastRequestTime:9Ut t d,ob,n%%n76ob,pp6 n6o=6 n6on G>@>[JQN$?M$ @>e$>b$L=U$?L ^$HB]SD $?C $>f$C>>|>>>W>{},eWW{w{*|.W{w|*b,pppp|,|,|b,pppp{,AI Controlled,BOT{{b,Done G>@>>s~~,^V G>E >>@> >>>G!@>W >F @> >C @>X >>G ] [ F-G EjU@E>>O>>B @>>M @F->@F->J @F->N @F->K @F->L @F->Q F->R @F->S @F->T @F->O F->Z @>>Z!I K-^B %B ,-|B O I  zB O B O I B t B O rB t* ``B ti B  G>@> >@> >~U I-?3 )U G4%>@> >P \ G-!6BA P 6T A Q 6dA R 6S A S 6R A T 6@A O 6dA L 6A J 6yA M 6pA N 6bA K A  G!>A @> >n class PlayerRecordClass extends Object abstract dependsOn(xUtil); /* PLAYERRECORDCLASS Use PlayerRecordClass to push down player skins and meshes from the server. For example, if the Reaper clan was running a server, and had their own clan skin, in ReaperSkin.utx, here's what they'd need to do: Create a new ReaperMod.u file, with the class Reaper in it. The package name must be the class name with "mod" appended. Reaper is a subclass of PlayerRecordClass, with all the default properties set appropriately to setup up the character. Clan members will have to edit their user.ini file, to change their character in the [DefaultPlayer] section, or have a .upl file with the same character definition. The server will need to have both ReaperSkin and ReaperMod in its serverpackages. */ var() class Species; // Species var() String MeshName; // Mesh type var() String BodySkinName; // Body texture name var() String FaceSkinName; // Face texture name var() Material Portrait; // Menu picture var() String TextName; // Decotext reference var() String VoiceClassName; // voice pack class name - overrides species default var() string Sex; var() string Menu; // info for menu displaying characters var() string Skeleton; // skeleton mesh, if it differs from the species default var() string Ragdoll; simulated static function xUtil.PlayerRecord FillPlayerRecord() { local xUtil.PlayerRecord PRE; PRE.Species = Default.Species; PRE.MeshName = Default.MeshName; PRE.BodySkinName = Default.BodySkinName; PRE.FaceSkinName = Default.FaceSkinName; PRE.Portrait = Default.Portrait; PRE.TextName = Default.TextName; PRE.VoiceClassName = Default.VoiceClassName; PRE.Sex = Default.Sex; PRE.Menu = Default.Menu; PRE.Skeleton = Default.Skeleton; PRE.Ragdoll = Default.Ragdoll; return PRE; } >>>c >>g >>_ >W>d >>f >>>>b >W>>>>>` >W>n >>q >>m >>F+i T-3e .Wi &re **/a0 d dVw.E d *%b d c&b d 10e  %b  e  &b  &b %b * G>r >>o >>e >>a >>p >>h >>zk T-H.h .Wk &rh **` w` *w` *w` *` ` ` :/a0 g 0g 10* G>}W-sY U- G>t ^ U-z]Y- a!\)^  T-%w^ *w.^ *^ V-^ -'*V-*-(a ^  G ^   G>_j T-fa .Wj &ra **_ w_ *w_ *w_ *5ra *wa _ _ _ _ :/a0 f 9:f c f 10Ya  %c  a  &c  &c a%c * G>>>tl'} C /4w,,,,X#,##o$66`-$ G>D!@>>S!@>>>>T!@>>A->>F!>>@> >H!@>P!>K!@>>I!>> fJ!JPH b2I!H!  oJ! >6bH! G>UE!k-\ B|E!DUP |E!SP |E!|E!UNLOCK G>@> >[B!k-D4B|B!DUP |B!SP |B!|B!UNLOCK G>OA!d,(cD!76A!76A!D!&6 D!6A!Mutator6 D!6A!n- G>>>>>f|IronDeity !o-Cdw*6 B a # G>d2W!l-6%w`*` 9= G>>>f0@>>>>j8Y!|--f0-Y! G>>>b]!A. [ % G>q/ > >b!>>>j)D+^02c!fm`U>>>l)t4Y/`e!KeCSML,;L,;ʢm`Uʚʢm`Um`Uʚʚʢm`Um`Um`Um`Um`Um`Um`Uc!fc!fi!U.Ui!U.Um`Um`Um`Um`Um`Uc!fm`UX,j}c!fښʚi!U.Ui!U.Uc!fi!U.Ui!U.Um`Ui!U.Um`Ui!U.Um`Ui!U.Um`Ui!U.Um`Ui!U.Uc!fi!U.Um`Ui!U.UʊX,j}c!fi!U.Ui!U.UX,j}ʚʚʚʚʊX,j}c!fX,j}c!fc!fc!fc!fc!fc!fX,j}c!fc!fc!fc!fc!fc!fc!fc!fc!fc!fz0Y ~++@,A,B,C,|0"}0"~0"0"@1"A1"G7Ya1u1U Y ^+_+`+a+b+c+V Y d+e+f+g+W Y p+q+r+s+t+u+ZYh+i+j+k+l+m+n+o+X Yv+w+x+y+z+{+|+}+Y YD,E,>d)w'f03f!>'@>~'>k">Xm)W4N12Wi!U.UX]e!Kec!fc!fc!fe!KeZs3}Zs3}Zs3}Zs3}Zs3}ZsZsZsc!fZs3}ZsZsZsZs- =1zVGBJzVGBJzVGBBzVGBJ'zVGBJzVGBJzVGBBzVGBJ'zVGBL,;L,;X,j}X,j}e!Kee!Kee!Kee!Kee!Kee!Kee!Kee!Kec!fc!fc!fc!fc!fZsZsZs3}ZsZsZszVGBzVGBJc!fZs- =1zVGBzVGBzVGBzVGBzVGBzVGBzVGBJ8f8f8f8fzVGBzVGBf!m/$L=n/$=o/$ ף

q/"p7$@?r/$>d2{6y6]#"GUI2K4.UT2K4SinglePlayerLoginMenuM7{6t5"t5<t5xt5t5,t5o5" o5o5<o5do5o5o5r5] Flak Monkeyr5  Combo Whorer5  Head Hunterr5 Road Rampager5  Hat Trickr5  Untouchables7"O8"v6"e8" O7"\8= CHEATER!!!^7] creditsL8]credit}7$=c8MChallenge gamej8]Additional ladder game_8]match^8] Ladder game[8] ChampionshipW8n]xGame.UT2K4LadderInfo>>o!@>X'f)M"T0k!5Ӈ@E>>w&@>^'>g!@>y'>H#@>V'>d!@>~)>s">>s$>>U->i!>@>\'>Q">>_'@>`'>r"@>E*>\">k!>~!@>k)>@>>B$>>[">>B">>Y"@>b*>x&>>p">>P+>>>>!@>i)>]+@>\+>z/@>f!h)}'x03P"[JUf!>V">>@>>j$>>m*>>f#>>>>U">>{%>>E->c!>[#>>>>C">>F&>>y!@>>|$>>>>t!@>J)>V#>>>>y">>>>G$>>@>>v*>>}!@>C*>R#>>C#>>s%>>~*>>B+>>>>Q#>c!>V%>>r0>>D$>>x#>>>>#>>>>d">>f*>>[%>>>>}">>A#>>B#>>b">>u!@>>y#@@>e'>t">>N/>>j&>>>>U%>>J#>>a$@>>g#>>{!>>t-@>U(>h#>>^>Q,>>>>J, >>@>>R,>c!>Z$>>S7>>{'>>>>w.>T+d'H0b#26&%v̅3}Եi0Bʁ)ʁ)3}Եi0Bi0Bi0Bi0B&_ $ff&?,Y>>m"@Y/P*>B'>>h">c!>>>m#>>>>>>>>I%>>r(@>>^$>>@#>>>>>>m!@>o'>y.>>>>[)>>n&>>@>]'>>>z$>>q$>>}#>>>>g)@>>>f!>m$>>M+>>>>O/>>Z+@>>z%>>y >>>>@>>_5@>>x-@>G+>v(@>>^%>>_#@>z'>\$>>C/>>>>Q&>>p#>>_$>>K#>>Y&>>b$>>>>f$>>i/>>m&>>@>>u#>>>b#>>>A$>>p&@>>>>>>r$>>v$>>p$>>q&@>>E#>>U#>>P,>>_)>>i&>>>>~$>>v"@>>s!>c!>>>S#@>>z!>>R)>>>>q">>>>E%>>H%>>t#>>>>d#>>J+@>>T'>>>>n'>>^>>C%>>z&N#f/>S%>>`$>>>]%>r#>>T%>>c">>T">>j/>>C)>>M%>>r*>>Z&O#O0>[$>>>>Y$>>>>G&>>l!>>z*@>>I(>>@>>n%>>N'>>_(@>>O'>>O$@>>o@>>T.@>>n">>>>Q'>>l">>l&>>~%@>>u%>>%@>>@&@>>A&@>>@>>C&>>a(>>@>>]#>>w"@>>k(>>L&@>>O&@>>N&@>>{(@>>x'>>[&@>>R&>>>>@)>>X# >>W%>>@>X&>sN)F/%L G>A7@>>c&R%G0>h&@>>e">>>>a&>>C Y'Y%nu w.i!*.i!y59Vj/j/77]-%]-7]- p]-]-vY%&C Y% zh$h$%7&%  ph$%A G>]&>>g$>>h.>J'`&C0>b&h.>d&h.>G%>>e&h.>k&@>>f&>>B%>>L@>>$>>S3>>\)>>>>`)>>t)>>h$>>`/@>>X1@>>t&@>>u&>>v&>>~#>>j!>>K1@%b/>|&>>W#>>A%>>&>>[*>>>>}&>>o1>>P%>>l->>A'>>i*>>j">>]$>>E'@>>Q%U/t/>{*>>P/>>p%>>J @>>x%>>I">>E$>>h%>>>>['H'k/<7%7F#%]$%6]$H'O/]$b G>@>Q%>U'q#O/$7y#q#7y#@#77@#&7F#@#&@# pq#y#@#A@#F#q#y#Ay#q#& G>@>z&>Z'@>>a'>>SF#_ 7F#%F#S G>@>>@>>@>J'>x$@>>>>r&>>nP1?a''- 'U#w$ G>L Xw$U# G>f'W$@Dw.*.-[$(.u.F%E% {/%%*&*,* G>@>>g'o&aS 9?&?o&6.% 9=9DC G>F%X" %${%l&a${% X". B0 X"%X"-'X"-'6X" $%X"&X",X" G> a # G>  a # G> 5 a # G> + a # G>m'e$a_*Ue$eU| U| Iw_* w_f$_ #?_?ի?Sf$_ 9?,9?, e$f$fff?>a+9PFL9?,v!aF9:9:$o$ev!ae9:9:$o$9:9:$9?, e$v!a#i/669? 9? 6Bi/ G>qWL%D(vcw_*8L%9?%"_ 9?%v!ac9:9:$o$8DL%T' G>>>>c&>gN%X0CSwN%?L} N% 9? G>>>q'>>~r'{0&#-T&r',- G>i2|-\,X# G >>>qu'A/.Q+-c$--b$ G> _&^#/7%w.* ^#sw.^#*_%a._%@0.^#^#*' G>>`>>Z&>>>_%>>u \#l.^w*w* M0Z$_#%_#7Z$ir_#Z$\#%_#Z$\#ppp9WSending BanInfo To Client PlayerID:9S_#Z$Hash:_#Z$Address:_#Z$!P6MA8_#Z$_#Z$_#Z$e6pppp9S_#Z$,_#Z$,_#Z$_#E G>_&J(n 0Tried to use a UT2K4PhantomRoster in game G>>]%>Z"@>@(>@>>Y I&d/@ )I&)L&)N& G$>EE>^2d%n\'1rF,*F,e! F,G&b6w"d%ww"*w.w"*d%S0.w" (w"w"_**7d.w.d%* {k/.d%k/ G> u2C/d l. G>>>QC(j%d*D$*u"j%`wu"*Iw.u"*D$.u"`u"u"mrD$* j% 訨level.game.SavePackage() FAILED.-Z"(D$K disconnect G>O(E&x.CW&F/E& G>u">>>>j@C>c8W"e/f/f#.c!n.H#9D|-z%H#7t#%-t--Z"-Z" wR,*R,Z6W"U"U"U"9DU"R1W"W"p-%E$7t#%7l!%_w.U"*h"%h",h"b19:h".U"h"[19:h".U"p-9:h".U"h"e1h"0h"%_h",h"c19:h".U"h"\19:h".U"p-9:h".U"h"f1h"H#p-F,m"h"a.'6K#h"o!-6U%h"o!l"W"-l"9D9?U"&9?,.W"?U".W"?T/W"U"-t- wR,*-z,R,N/-z,'-z,N/oW" w.R#G$%SG$7R#IwG$R#U"l"G$R#l"G$R#G$l"U"?-Y,TeamRating =9Ul"[,-l"9?6r#h"o!l"W"- -Z"l"9?%l"?l"&&l"l"l"l"?l"r-Y,稨Challenge chance =9Ul"9US'l"S'l"L/9V{5{L/ppCHALLENGEL/;-t- wR,*-z,R,y.-z,'-aBp; `/H#f#_-W"--z,y.f#_-M'7g!,x%W"--z,y.H#O'7g!,x%9?,w&H#z%K/W"U"f#p5W"U"f#-Z"(O^.F,m"I/9D9?7o!&@-t- wR,*R,S6W"U"H#N/H#N/aB;DONATION-( G>K(@C>w`#L1EWr *=O%@@z O%w.7x.`#%`#7w.x.`#w.`# G>>>L(}%Y02PBh-h%(-(-'}%P}%, ~-}%, F,Q,W~-*i-Z"R,*s%W/M/-Y,Selected EnemyTeam =[,-Z"-I/'-Z" wR,*-I/R,y.7g!%-I/T.%sT.j7g!7g!&6O#7g!&g!`.T.T.|-y.H#O'-Y,ForFeitFee =9U|-|-u% n"u%Awn"**w.n"*.n"K STARTs% n"n"No local player controller found G>z N$ #qN$N$,bbAllowTranslocator~%$$CheckN$%bbAllowBoost%$$Check G >V(R.a0aYHO$n1ewR.*R.n8R. g8@R.#m8%O$ 9=,$${q%aCO$Player used cheat:q%O$[,-L'' G>X(o%~.VLo% $bAllowTranslocator@& :bAllowBoostA& o% G(>h2B&n.~K-Z"[#wF,*F/T6B&C&bF/F,b.B&C&F/'F,b.B&C&x$UT2K4GameLadder == none* G>@>>X44wL-|%w.*.?t-G.-' G>F/>>w2c(r.1Qr-Z" c$I.a-%oa-7I.e|6a-I.[#6a-I.a-!r. G>a-@>>b(f(jR<-Z"i#[#-i#{.i6i# G>i#>>A3H&f.U>#w* f.H&;PC Load Letter G>>>i(m(d.V y& G>>>l(j#].Wj#7|! j#].F,m"].F,C#].F,B#].F,A#].F,}"].F,d"j#|!j#|!% G>O3n#o04p^zn#(g"%g"d.g"7zg"g"n#g"`.n#'-6m#g"j!(6I%g"j!-Y,Added team mate:n#[,'|g"n#(g"( G>g">>p(X$K0P`zX$(L#%L#d.|L#X$J#L#|J#7&J#J#&J#E7&J#`.X$'-6m#J#j!'6I%J#j!-Y,Released team mate:X$[,'L#( G>L#>>t(M&\0jzc=s#%8s#d..|s#M&'s#( G>s#>>y(P&i.txdF,i.P&R& G>@"@>>2~(J/RC@"Role:  0$@"p@"None P$@"p@"DumbProxy u$@"p@"SimulatedProxy $@"p@"AutonomousProxy $@"p@"Authority @" G>@>>}(Z%^.z-eZ%|!f.Z% G>>>A)E)_0ec^.F,}"^.F,B#^.F,d"^.F,A# G>>>D)V&T/gC7g!%V& w.c"t!%t!7c"rt!c"W%wt!c"W%V%9?t!c"&t!c"9?&7g!7g!&6O#7g!&g!`.t!c"'6g#7g!&g!V%t!,t!%t!7g!s"t!&s"7g!6g#t!g!6g#s"g!T%t!g!t!g!s"g!s"g!T%s"=t!@-Y,Rand team mates[,t!%@t!7g!稨p9St!]6@%6O#t!g!j!9U6g#t!g!t! G>>>c//============================================================================== // Weak roster group, used in the TDM ladder // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRosterWeak extends UT2K4RosterGroup; k!K)k0L) \;k!5k.YKxGame.TeamNewFirestormxGame.TeamNewBlacklegionxGame.TeamNewBloodfistv.">>@>>F)^&y.[my.7t#7g!S"%6S"7g!j$6O#S"g!u#9?p. j$a&u#9?^&p%9?7g!S"7g!6`&S"t#j$6]&S"t#9Du#-Y,稨ppPaycheck: 9SS"]6@%6`&S"t#j!9S6]&S"t#H#9Du#y.u#S"g$7g!g$7g!S"7g!&S"g$p. 6O#S"g!m&-Y,稨ppIncrease fee: 9SS"]6@%6O#S"g!j!9Um&S"`y. G>Q)\&f e".\&we"*ab& @@ad& e" e"#?e" Ng&e"[*e&e"  G>g&d$z .+w.d$*d$d$ G>D%>>VI#[/[9:9:$09:I#9:$q"%uP9:I#9:$q"&uq9:I#9:$q",u9:I#9:$q",uaq"?=-'q"x<6?6?D%6իj&B%B%B-_!z%}-q/69?6D%6I#o$0$$n B' G>g//============================================================================== // Strong roster group, used in the TDM ladder // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRosterStrong extends UT2K4RosterGroup; > |3L/H Gk!T)E0V)]ok!5k.YAxGame.TeamThundercrashxGame.TeamIronSkullxGame.TeamCorruptv.">>O)}$p.tr#{}$v"`.}$-n&Jv"v"7j!sx#9?&6S#v"j!9Dx#x#9?%6S#v"j!9?&x#6S#v"j! G> U)y$Q/Ly$,,y$ G >d//============================================================================== // Middle roster group, used in the TDM ladder // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRosterMid extends UT2K4RosterGroup; k!Y)[0Z) Dk!5k.YDxGame.TeamHellionsxGame.TeamNewIronGuardxGame.TeamJuggernautsv.">>>>>>W)n$`.tJ"%AJ"7j!7|6@%J"j!n$J"J"-p&7j!J"&6@%J"j!n$6S#J"j! s   on$6h#J"j!$d-6m#J"j!'6I%J"j!J" G>uw#B/Ѿj9?9D%eg@w#,2w#9D9?,2e,9D9?9Dg9D9?w#% G>>>J">>c//============================================================================== // Easy roster group, used in the TDM ladder // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRosterEasy extends UT2K4RosterGroup; >])D#N/vAD#%D#&D#7g!D#7g!b"7g!&>b"D#ZQ'46h#6O#b"g!j!9C9?9D6g#b"g!9?,,<,9?, E$6O#b"g!4-Y,pInjureTeamMate =6@%6O#b"g!j!got injured, health9R6h#6O#b"g!j!%[,b"< Gk!a)z/c)K+k!5k.YCxGame.TeamNewSunbladexGame.TeamNewSuperNovaxGame.TeamGoliath>>D//============================================================================== // Team Roster, UT2K4 style // Note: the first name in the RosterNames array is considered the Team Leader // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRoster extends xTeamRoster abstract; /** Description */ var localized string TeamDescription; /** Team voiceover */ var sound VoiceOver; /** Only the team name */ var sound TeamNameSound; /** Difficulty level */ var int TeamLevel; /** The team leader, if this is empty the first RosterNames is used */ var string TeamLeader; /** If TeamBots == 1 use the team leader, else use the default behavior */ function Initialize(int TeamBots) { local array RosterOverride; local int i; if (UT2K4GameProfile(Level.Game.CurrentGameProfile) != none) { if (UT2K4GameProfile(Level.Game.CurrentGameProfile).GetAltTeamRoster(string(class), RosterOverride)) { RosterNames = RosterOverride; Roster.Length = RosterNames.length; for ( i = 0; i < RosterNames.Length; i++ ) { Roster[i] = class'xRosterEntry'.Static.CreateRosterEntryCharacter(RosterNames[i]); } } } if (TeamBots != 1) { Super.Initialize(TeamBots); return; } // else pick the team leader if (TeamLeader == "") TeamLeader = RosterNames[0]; Roster.Length = 1; Roster[0] = class'xRosterEntry'.Static.CreateRosterEntryCharacter(TeamLeader); Roster[0].PrecacheRosterFor(self); } function bool AddToTeam(Controller Other) { local SquadAI DMSquad; // if a team game use the default routine if (TeamGame(Level.Game) != none) return Super.AddToTeam(Other); // otherwise add fake squads if ( Bot(Other) != None ) { DMSquad = spawn(DeathMatch(Level.Game).DMSquadClass); DMSquad.AddBot(Bot(Other)); } Other.PlayerReplicationInfo.Team = None; return true; } >U3@$M/'z{@$&;@$O@$;L",invalid magic string:@$~!k!&L" r~!*Invalid team roster class:&L"7!%|,L"final {^.^.5|,L"least|,L"most|,L"mostC"&C"?\"C"9?B"%2B"7~!M"["a.B"~!M"'9?6K#["o!C"\"7!!B"~!M"((9?6K#["o!C"\"\"9?6K#["o!C"7!&%!B"~!M"B"A|,L"best|,L"worst|,L"final|,L"worstC"C"?\"C"9?9?B"%B"7~!M"["a.B"~!M"'D6r#["o!C"\"7!!B"~!M"6r#["o!C"\"\"6r#["o!C"7!&%!B"~!M"B"|,L"random!~!M"unsupported magic string:,L"x7!%\"9?7~!M"empty team list, will use:9D\"~!M"9D\"~!M"|,L"final^.7!!^.7!! G>`//============================================================================== // Roster Group, a collection of rosters, used in Single Player to group the // diffirent enemy teams into difficulty levels // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4RosterGroup extends Object abstract; /** all team rosters */ var array Rosters; /** the difficulty of this roster */ var int Difficulty; >L"@>>h//============================================================================== // Phantom Team Roster, game will shut down when you actually use this team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4PhantomRoster extends UT2K4TeamRoster abstract; function Initialize(int TeamBots) { Error("Tried to use a UT2K4PhantomRoster in game"); } >@>>q//============================================================================== // Additonal Match Info for UT2004 Ladder games // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4MatchInfo extends MatchInfo; /** Custom thumbnails, to override default behavior */ var Material ThumbnailActive, ThumbnailInActive; /** alternative maps to use */ var array AltLevels; /** this number of entries in the AltLevels array has a higher priority, this means that only these will be randomly selected */ var byte Priority; /** prize money you win */ var int PrizeMoney; /** Fee to pay when you want to enter this match */ var int EntryFee; /** a string with requirement information, parsed in UT2K4SP_Main and called from UT2K4SP_TabLadderBase */ var string Requirements; /** if > 0 a time limit is set on the match */ var float TimeLimit; >@>>Z//============================================================================== // Single Player Ladder Info // // Written by Michiel Hendriks // (c) 2003, 2004, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4LadderInfo extends LadderInfo config; var() editinline array ASMatches; /** New constants for ladder ids defined as vars for static outside access */ var int LID_DM, LID_TDM, LID_CTF, LID_BR, LID_DOM, LID_AS, LID_CHAMP; /** custom ladders you can add to the game */ var config array< class > AdditionalLadders; /** challenge games */ var config array< class > ChallengeGames; // config breaks the array /** for backward compatibility */ static function MatchInfo GetMatchInfo(int ladder, int rung) { return GetUT2K4MatchInfo(ladder, rung, 0, true); } /** Retreives the match info and fills in the alternative map path is used as a constant random to define the path, should be a very large number if bSelect then path is the position in the AltLevels array to use */ static function UT2K4MatchInfo GetUT2K4MatchInfo(int ladder, int rung, optional int path, optional bool bSelect) { local array matcharray; local UT2K4MatchInfo selmatch; local string tmp; local int i; //log("GetUT2K4MatchInfo"@ladder@rung@path); if (rung < 0) { Warn("rung < 0"); return none; } switch (ladder) { case default.LID_DM: matcharray = Default.DMMatches; break; case default.LID_TDM: matcharray = Default.TDMMatches; break; case default.LID_CTF: matcharray = Default.CTFMatches; break; case default.LID_BR: matcharray = Default.BRMatches; break; case default.LID_DOM: matcharray = Default.DOMMatches; break; case default.LID_AS: matcharray = Default.ASMatches; break; case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break; default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10))) { matcharray = default.AdditionalLadders[ladder-10].default.Matches; } } if ( matcharray.Length <= 0 ) { Warn("matcharray.Length <= 0"); return none; } if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]); else selmatch = UT2K4MatchInfo(matcharray[rung]); if ((selmatch != none) && bSelect && (selmatch.AltLevels.length > 0)) { tmp = selmatch.AltLevels[path % selmatch.AltLevels.length]; if (tmp != "") selmatch.LevelName = tmp; } else if ((selmatch != none) && (selmatch.AltLevels.length > 0)) // select one from the list { path = abs(path + ((rung+1) * (ladder+1))); if (selmatch.Priority > 0) i = selmatch.Priority; else i = selmatch.AltLevels.length; tmp = selmatch.AltLevels[path % i]; if (tmp != "") selmatch.LevelName = tmp; //Log("Set level name to:"@selmatch.LevelName); } if ( selmatch == none ) Warn("selmatch == none"); return selmatch; } /** get the ID of the alternative level match priority has no relevance here */ static function byte GetAltLevel(int ladder, int rung, int path, int selected) { local array matcharray; local UT2K4MatchInfo selmatch; local int origpath; if (rung < 0) return -1; switch (ladder) { case default.LID_DM: matcharray = Default.DMMatches; break; case default.LID_TDM: matcharray = Default.TDMMatches; break; case default.LID_CTF: matcharray = Default.CTFMatches; break; case default.LID_BR: matcharray = Default.BRMatches; break; case default.LID_DOM: matcharray = Default.DOMMatches; break; case default.LID_AS: matcharray = Default.ASMatches; break; case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break; default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10))) { matcharray = default.AdditionalLadders[ladder-10].default.Matches; } } if ( matcharray.Length <= 0 ) return -1; if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]); else selmatch = UT2K4MatchInfo(matcharray[rung]); if ((selmatch != none) && (selmatch.AltLevels.length > 0)) { origpath = abs(path + ((rung+1) * (ladder+1))); if (selmatch.Priority > 0) origpath = origpath % selmatch.Priority; else origpath = origpath % selmatch.AltLevels.length; if (selected == origpath || selected == -1) { path = (abs(path + ((rung+1) * (ladder+1)))+1) % selmatch.AltLevels.length; if (path == origpath) path = (path + 1) % selmatch.AltLevels.length; //Log("GetAltLevel (path)"@path@origpath); return path; } //Log("GetAltLevel (orig)"@origpath@selected); return origpath; } return -1; } /** check if there is an alternative level */ static function bool HasAltLevel(int ladder, int rung) { local array matcharray; local UT2K4MatchInfo selmatch; if (rung < 0) return false; switch (ladder) { case default.LID_DM: matcharray = Default.DMMatches; break; case default.LID_TDM: matcharray = Default.TDMMatches; break; case default.LID_CTF: matcharray = Default.CTFMatches; break; case default.LID_BR: matcharray = Default.BRMatches; break; case default.LID_DOM: matcharray = Default.DOMMatches; break; case default.LID_AS: matcharray = Default.ASMatches; break; case default.LID_CHAMP: matcharray = Default.ChampionshipMatches; break; default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10))) { matcharray = default.AdditionalLadders[ladder-10].default.Matches; } } if ( matcharray.Length <= 0 ) return false; if ( rung >= matcharray.Length ) selmatch = UT2K4MatchInfo(matcharray[matcharray.Length-1]); else selmatch = UT2K4MatchInfo(matcharray[rung]); if (selmatch == none) return false; return (selmatch.AltLevels.length > 1); } static function MatchInfo GetCurrentMatchInfo(GameProfile G) { if (UT2K4GameProfile(G) != none ) return G.GetMatchInfo(G.CurrentLadder, G.CurrentMenuRung); return GetUT2K4MatchInfo(G.CurrentLadder, G.CurrentMenuRung); } /** Get the number of matches in a ladder */ static function int LengthOfLadder(int ladder) { switch (ladder) { case default.LID_DM: return Default.DMMatches.Length; case default.LID_TDM: return Default.TDMMatches.Length; case default.LID_CTF: return Default.CTFMatches.Length; case default.LID_BR: return Default.BRMatches.Length; case default.LID_DOM: return Default.DOMMatches.Length; case default.LID_AS: return Default.ASMatches.Length; case default.LID_CHAMP: return Default.ChampionshipMatches.Length; default: if ((ladder >= 10) && (default.AdditionalLadders.length > (ladder-10))) { return default.AdditionalLadders[ladder-10].default.Matches.Length; } return -1; } } /** Update the ladder */ static function string UpdateLadders(GameProfile G, int CurrentLadder) { local string SpecialEvent; local UT2K4GameProfile GP; local int i,j; GP = UT2K4GameProfile(G); if (GP == none) { Warn("PC Load Letter"); // wtf does that mean? return ""; } if (GP.bIsChallenge) return GP.ChallengeInfo.SpecialEvent; if (CurrentLadder < 10) { if ( GP.LadderProgress[CurrentLadder] > G.CurrentMenuRung ) { // they've chosen to play a match they've completed previously return ""; } } // updates ladder rungs appropriately switch( CurrentLadder ) { case default.LID_DM: SpecialEvent = Default.DMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_TDM: SpecialEvent = Default.TDMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_CTF: SpecialEvent = Default.CTFMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_BR: SpecialEvent = Default.BRMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_DOM: SpecialEvent = Default.DOMMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_AS: SpecialEvent = Default.ASMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; case default.LID_CHAMP: SpecialEvent = Default.ChampionshipMatches[GP.LadderProgress[CurrentLadder]].SpecialEvent; break; default: i = CurrentLadder-10; if ((i >= 0) && (default.AdditionalLadders.length > i)) { j = GP.GetCustomLadderProgress(string(default.AdditionalLadders[i])); if ( j > G.CurrentMenuRung ) return ""; SpecialEvent = default.AdditionalLadders[i].default.Matches[j].SpecialEvent; GP.SetCustomLadderProgress(string(default.AdditionalLadders[i]), 1); return SpecialEvent; } return ""; } GP.LadderProgress[CurrentLadder] += 1; return SpecialEvent; } /** Return the friendly name of the current match's gametype */ static function string GetMatchDescription (GameProfile G) { return GetLadderDescription(G.CurrentLadder, G.CurrentMenuRung); } static function string GetLadderDescription(int LadderId, optional int MatchId) { local string retval; local CacheManager.GameRecord gr; switch (LadderId) { case default.LID_DM: retval = default.DMMatches[MatchId].GameType; break; case default.LID_TDM: retval = default.TDMMatches[MatchId].GameType; break; case default.LID_CTF: retval = default.CTFMatches[MatchId].GameType; break; case default.LID_BR: retval = default.BRMatches[MatchId].GameType; break; case default.LID_DOM: retval = default.DOMMatches[MatchId].GameType; break; case default.LID_AS: retval = default.ASMatches[MatchId].GameType; break; case default.LID_CHAMP: retval = default.ChampionshipMatches[MatchId].GameType; break; default: if ((LadderId >= 10) && (default.AdditionalLadders.length > (LadderId-10))) { retval = default.AdditionalLadders[LadderId-10].default.Matches[MatchId].GameType; } else return ""; } gr = class'CacheManager'.static.GetGameRecord(retval); return gr.GameName; } /** return the id of a random ladder */ static function int GetRandomLadder(optional bool bIncludeChamp) { // +1 because DM will never be returned if (bIncludeChamp) return rand(default.LID_CHAMP)+1; else return rand(default.LID_AS)+1; } /** create a URL for a selected profile */ static function string MakeURLFor(GameProfile G) { if ((UT2K4GameProfile(G) != none) && (UT2K4GameProfile(G).bIsChallenge)) return MakeURLFoMatchInfo(UT2K4GameProfile(G).ChallengeInfo, G); return MakeURLFoMatchInfo(GetCurrentMatchInfo(G), G); } /** create a URL for the selected MatchInfo */ static function string MakeURLFoMatchInfo(MatchInfo M, GameProfile G) { local string URL; if ( M == none ) { Warn("MatchInfo == none"); return ""; } G.EnemyTeam = M.EnemyTeamName; G.Difficulty = G.BaseDifficulty + M.DifficultyModifier; URL = M.LevelName$"?Name="$G.PlayerName$"?Character="$G.PlayerCharacter$"?SaveGame="$G.PackageName$M.URLString; if ( M.GoalScore != 0 ) URL $= "?GoalScore="$M.GoalScore; if ( M.NumBots > 0 ) URL $= "?NumBots="$M.NumBots; if ( M.GameType != "" ) URL $= "?Game="$M.GameType; URL $= "?Team=1?NoSaveDefPlayer?ResetDefPlayer"; // with ?NoSaveDefPlayer the DefaultPlayer properties won't be saved to the user.ini // with ?ResetDefPlayer the DefaultPlayer properties will be restored from the saved settings if (UT2K4MatchInfo(M) != none) { if (UT2K4MatchInfo(M).TimeLimit > 0) { URL $= "?TimeLimit="$string(UT2K4MatchInfo(M).TimeLimit); } } return URL; } /** return a random or selected challenge game */ static function class GetChallengeGame(optional string ClassName, optional UT2K4GameProfile GP) { local array< class > chalgames; local int i; //log("GetChallengeGame"@ClassName); if (ClassName == "") { chalgames = default.ChallengeGames; while (chalgames.length > 0) { i = rand(chalgames.length); if (chalgames[i].static.canChallenge(GP)) return chalgames[i]; chalgames.Remove(i, 1); } return none; } for (i = 0; i < default.ChallengeGames.length; i++) { if (string(default.ChallengeGames[i]) ~= ClassName) { if (default.ChallengeGames[i].static.canChallenge(GP)) return default.ChallengeGames[i]; return none; } } return none; } >y//============================================================================== // Single Player Game Profile for storing the additional info // // Written by Michiel Hendriks // (c) 2003, 2004, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4GameProfile extends UT2003GameProfile; /** used to keep track of future changes */ var protected int revision; var bool bDebug; var class UT2K4GameLadder; /** Progression in the ladders */ var array LadderProgress; /** The map that will be played, set by the "play" button */ var CacheManager.MapRecord ActiveMap; /** seed to select the random level */ var int AltPath; /** map selection record, this will override the default behavior of map selection for a match */ struct LevelPathRecord { /** the selected ladder */ var byte ladder; /** match in the selected ladder */ var byte rung; /** the offset in the AltLevel array */ var byte selection; }; /** the selected path */ var array LevelRoute; /** The actual team size Warning, absolute max size is 7 (set by GameProfile) Don't use this variable, call GetMaxTeamSize() instead */ var protected int MaxTeamSize; /** Statistics for each bot in this profile. Saved per profile because they change during the tournament */ struct BotStatsRecord { var string Name; /** updated price to 'buy' the player, this is also used to calculate the fee and injury treatment */ var int Price; /** injury stats, 0 = dead (you don't want that ;)) */ var byte Health; /** is this a free agent, e.g. can you hire him/her */ var bool FreeAgent; /** location of his team in the TeamStats list */ var int TeamId; }; var array BotStats; /** Stats for each team */ struct TeamStatsRecord { /** the fully qualified name of the team class */ var string Name; /** the difficulty level of this team */ var int Level; /** number of games played against this team */ var int Matches; /** number of games this team won from you */ var int Won; /** the rating of this team compared to you */ var float Rating; }; var array TeamStats; /** The current Player Balance */ var int Balance; /** the minimal balance */ var int MinBalance; /** total ingame time */ var float TotalTime; /** Set to 'true' when the SP has been completed */ var bool bCompleted; /** the best team played against, used for championship */ var string FinalEnemyTeam; /** Player used a cheat */ var protected bool bCheater; /** if set to true users can't unlock characters with this profile */ var protected bool bLocked; /** prevent some cheating */ var protected string PlayerIDHash; /** Team percentage modifier This value is multiplied with the fee for each player, lower value = lower take of the earnings */ var float TeamPercentage; /** Percentage of the Match price that counts as bonus (per player) **/ var float MatchBonus; /** The percentage of the team players fee to pay out when the team loses */ var float LoserFee; /** Every time a bot played a match and won his fee increases with this */ var float FeeIncrease; /** The chance a team player get's injured */ var float InjuryChance; /** the offset in the BotStats array of the last injured player */ var int LastInjured; /** injury treatment modifier */ var float InjuryTreatment; /** Chance the losing enemy team will challenge you for a rematch */ var float ChallengeChance; // Last match details -- /** if set to true the details are new and the detail window should be displayed */ var bool lmdFreshInfo; /** player details from the last match */ struct PlayerMatchDetailsRecord { var int ID; var string Name; var float Kills; var float Score; var float Deaths; var int Team; /** special awards won by this player, like Flag Monkey */ var array SpecialAwards; }; /** per player details */ var array PlayerMatchDetails; /** total change in the balance, includes payment and bonuses */ var int lmdBalanceChange; /** true if the player won the match */ var bool lmdWonMatch; /** enemy team class */ var string lmdEnemyTeam; /** game type string */ var string lmdGameType; /** true if the last match was a challenge match */ var bool lmdbChallengeGame; /** map title */ var string lmdMap; /** total prizemoney */ var int lmdPrizeMoney; /** total bonus money */ var int lmdTotalBonusMoney; /** last spree count */ var int lmdSpree[6]; /** last multikill count */ var int lmdMultiKills[7]; /** player ID of injured player */ var int lmdInjury; /** health, stored here because player could have been healed */ var byte lmdInjuryHealth; /** injury treatment gost */ var int lmdInjuryTreatment; /** total match time */ var float lmdGameTime; /** true if it was a team game */ var bool lmdTeamGame; /** teamID of the player's team (usualy 1) */ var int lmdMyTeam; struct PayCheckRecord { var int BotId; var int Payment; }; /** payment overview of you team mates */ var array PayCheck; struct PhantomMatchRecord { var int Team1; // team id in the team stats array var int Team2; var float ScoreTeam1; var float ScoreTeam2; var int LadderId; var int MatchId; var float GameTime; }; /** phantom match overview */ var array PhantomMatches; // -- Last match details struct TeamMateRankingRecord { var int BotID; var float Rank; }; /** Used for payment and injuries, only valid during RegisterGame() */ var array TeamMateRanking; /** Phantom Teams to choose from */ var array PhantomTeams; /** when true use ChallengeInfo for information */ var bool bIsChallenge; /** the challenge match info, obsolete? */ var UT2K4MatchInfo ChallengeInfo; /** will be set to the challenge game class used if bIsChallenge = true*/ var class ChallengeGameClass; /** true we we got challenged, false if we took the initiative */ var bool bGotChallenged; /** contains data about the challenge variables, used for fighthistory */ var string ChallengeVariable; /** When set override the default LoginMenuClass with this one */ var string LoginMenuClass; /** @ignore */ var name LogPrefix; // more all time stats -- var int Spree[6]; var int MultiKills[7]; var int SpecialAwards[6]; // -- more all time stats /** bonus received for each killing spree */ var int SpreeBonus[6]; /** bonus received for each multikill */ var int MultiKillBonus[7]; /** Special Awards labels */ var localized string msgSpecialAward[6]; /** special award levels */ var int sae_flackmonkey, sae_combowhore, sae_headhunter, sae_roadrampage, sae_hattrick, sae_untouchable; var localized string msgCheater, msgCredits, msgCredit; /** The fee you have to pay when you forfeit the game */ var protected float ForFeitFee; /** percentage of the match prize a map challenge costs */ var float MapChallengeCost; struct FightHistoryRecord { /** yyyy-mm-dd */ var int Date[3]; /** hh:mm */ var int Time[2]; /** magic string, fields seperated by ';'
field 1: match type (Ladder game, challenge game, custom ladder game)
field 2: match description */ var string MatchData; /** additional data, depends on the MatchData type */ var string MatchExtra; /** map name */ var string Level; /** gametype class, fully qualified */ var string GameType; /** enemy team class, fully qualified */ var string EnemyTeam; /** price money */ var float PriceMoney; /** balance change */ var float BalanceChange; /** bonus money won */ var float BonusMoney; /** game time */ var float GameTime; var bool WonGame; /** team scores, 1 = our team, 0 = enemy team */ var float TeamScore[2]; /** gee, what would this be then */ var bool TeamGame; /** team layout */ var string TeamLayout[2]; /** player's score in this game */ var float MyScore; /** number of kills */ var int MyKills; /** number of deaths */ var int MyDeaths; /** my awards */ var string MyAwards; /** final position in the scoring table */ var byte MyRating; }; /** the history of all fights */ var array FightHistory; /** localized strings used for the fighthistory */ var localized string msgChallengeGame, msgAdditionalLadder, msgMatch, msgLadderGame, msgChampionship; /** team roster override record */ struct TeamRosterRecord { /** fully qualified name of the team roster class */ var string name; /** the alternative roster */ var array roster; }; /** team roster override records */ var array AltTeamRoster; /** information about a custom ladder */ struct CustomLadderRecord { /** the fully qualified name to the ladder class */ var string LadderClass; /** current progress */ var int progress; }; /** custom ladders */ var array CustomLadders; /** will be set when a custom ladder has been played, and unset when not */ var class LastCustomCladder; /** if true match details will be shown after a match */ var bool bShowDetails; /** call this when you create a new profile, this will set the protection data */ function CreateProfile(PlayerController PlayerOwner) { if (PlayerIDHash == "") PlayerIDHash = PlayerOwner.GetPlayerIDHash(); } /** call this when you load the profile, it will lock the profile when the PlayerIDHash has changed */ function LoadProfile(PlayerController PlayerOwner) { if (PlayerIDHash != PlayerOwner.GetPlayerIDHash()) { bLocked = true; PlayerIDHash = PlayerOwner.GetPlayerIDHash(); } } /** initialize the profile, called at the beginning of each game */ function Initialize(GameInfo currentGame, string pn) { local Controller C; if (UT2K4GameLadder == none) { UT2K4GameLadder = class(DynamicLoadObject(GameLadderName, class'Class')); GameLadder = UT2K4GameLadder; } PackageName=pn; UpgradeGP(); // set character, player in current game for ( C=currentGame.Level.ControllerList; C!=None; C=C.NextController ) { if ( PlayerController(C) != None ) { currentGame.ChangeName (PlayerController(C), PlayerName, false); break; } } NextMatchObject=None; ChampBorderObject=None; Playerteam.length = GetMaxTeamSize(); // make sure it's never larger than this if ((DeathMatch(currentGame) != none) && (LoginMenuClass != "")) { DeathMatch(currentGame).LoginMenuClass = LoginMenuClass; } //if (Balance < MinBalance) Balance = MinBalance; } /** Called on gamerestart */ function ContinueSinglePlayerGame(LevelInfo level, optional bool bReplace) { local Controller C; local PlayerController PC; // set character, player in current game PC = none; for ( C=level.ControllerList; C!=None; C=C.NextController ) { if ( PlayerController(C) != None ) { PC = PlayerController(C); break; } } if ( PC == none ) { return; } //if (Balance < MinBalance) Balance = MinBalance; if (!level.game.SavePackage(PackageName)) { Warn("level.game.SavePackage("@PackageName@") FAILED."); } bIsChallenge = false; PC.ConsoleCommand("disconnect"); } function CheatSkipMatch(GameInfo CurrentGame) { local UT2K4MatchInfo MI; MI = UT2K4MatchInfo(GetMatchInfo(CurrentLadder, CurrentMenuRung)); Balance = Balance + ForfeitFee + MI.PrizeMoney;; Super.CheatSkipMatch(CurrentGame); } /** After a game is completed, this function should be called to record the player's statistics and update the ladder. Currently called from Deathmatch 'MatchOver' state */ function RegisterGame(GameInfo currentGame, PlayerReplicationInfo PRI) { local UT2K4MatchInfo MI; local int i, j, OldBalance; local float TeamRating; local array PRIarray; local bool TempbIsChallenge, doPayTeamMates; local string tmp; MI = UT2K4MatchInfo(GetMatchInfo(CurrentLadder, CurrentMenuRung)); Balance += ForFeitFee; // payback forfeitfee OldBalance = Balance; PayCheck.length = 0; SpecialEvent = ""; TempbIsChallenge = bIsChallenge; if (bIsChallenge && ChallengeGameClass != none) ChallengeGameClass.static.PreRegisterGame(self, currentGame, PRI); Kills += PRI.Kills; Goals += PRI.GoalsScored; Deaths += PRI.Deaths; Matches++; TotalTime += currentGame.Level.TimeSeconds-currentGame.StartTime; lmdTotalBonusMoney = 0; LastInjured = -1; PayCheck.length = 0; PlayerMatchDetails.length = 0; if (TeamPlayerReplicationInfo(PRI) != none) { for (i = 0; i < 6; i++) { Spree[i] += TeamPlayerReplicationInfo(PRI).Spree[i]; lmdSpree[i] = TeamPlayerReplicationInfo(PRI).Spree[i]; lmdTotalBonusMoney += TeamPlayerReplicationInfo(PRI).Spree[i]*SpreeBonus[i]; } for (i = 0; i < 7; i++) { MultiKills[i] += TeamPlayerReplicationInfo(PRI).MultiKills[i]; lmdMultiKills[i] = TeamPlayerReplicationInfo(PRI).MultiKills[i]; lmdTotalBonusMoney += TeamPlayerReplicationInfo(PRI).MultiKills[i]*MultiKillBonus[i]; } } Balance += lmdTotalBonusMoney; if (CurrentLadder != UT2K4GameLadder.default.LID_DM) { i = GetTeamPosition(EnemyTeam, true); TeamStats[i].Matches++; if (!bWonMatch) TeamStats[i].Won++; TeamRating = 0; if (currentGame.bTeamGame) { // Rating is: team score / other team score * (team won match) // Rating will increase faster than it will decrease TeamRating = (TeamGame(currentGame).Teams[(PRI.Team.TeamIndex+1) % 2].Score+1.0)/(TeamGame(currentGame).Teams[PRI.Team.TeamIndex].Score+1.0); RankTeamMates(currentGame, PRI); if (TempbIsChallenge && ChallengeGameClass != none) doPayTeamMates = ChallengeGameClass.static.injureTeamMate(self); else doPayTeamMates = true; if (doPayTeamMates) InjureTeamMate(); } else { // won from the whole team currentGame.GameReplicationInfo.GetPRIArray(PRIarray); for (j = 0; j < PRIarray.length; j++) { if ((PRIarray[j] != PRI) && (TeamRating < PRIarray[j].Score)) { TeamRating = PRIarray[j].Score; } } TeamRating /= (PRI.Score+1.0); } if (bDebug) log("TeamRating ="@TeamRating, LogPrefix); if (bWonMatch) TeamRating *= -1; // enemy lost to rating is negative TeamStats[i].Rating += TeamRating; } if (currentGame.bTeamGame && !bIsChallenge /*&& (completedLadder(class'UT2K4LadderInfo'.default.LID_TDM))*/) { /* rating -3/4 -- increase chance -2/4 -- decrease chance -1/4 -- increase chance 4/3 ->3/4 -- increase chance 4/2 ->3/2 -- decrease chance 4/1 ->1/4 -- decrease chance */ if (TeamRating > 0) TeamRating = 0.5/TeamRating; else if (TeamRating > -0.5) TeamRating = -1-TeamRating; TeamRating = 0.5+abs(TeamRating); if (bDebug) Log("Challenge chance ="@TeamRating@(ChallengeChance*TeamRating)); if ((frand() < ChallengeChance*TeamRating )) { // challene enemyteam game tmp = string(GetChallengeGame()); if (tmp != "") SpecialEvent = "CHALLENGE"@EnemyTeam@tmp$";"$SpecialEvent; // make first because of possible message window } } if (TempbIsChallenge && ChallengeGameClass != none) doPayTeamMates = ChallengeGameClass.static.payTeamMates(self); else doPayTeamMates = true; if ( bWonMatch ) { SpecialEvent $= ";"$GameLadder.static.UpdateLadders(self,CurrentLadder); // updates LadderRungs appropriately Wins++; // calculate new balance Balance += MI.PrizeMoney; if (currentGame.bTeamGame && doPayTeamMates) PayTeamMates(MI.PrizeMoney, TeamPercentage, (TeamMateRanking.length/2), FeeIncrease); // increase fee of 50% of the best players } else { // team mates take an percentage of the current balance if (currentGame.bTeamGame && doPayTeamMates) PayTeamMates(Balance, LoserFee, (TeamMateRanking.length/3), (FeeIncrease/2)); } // Stats -- lmdBalanceChange = Balance-OldBalance; procLastMatchDetails(currentGame, PRI, MI); AddHistoryRecord(currentGame, PRI, MI); // bIsChallenge must not been reset // only create phantom matches when we entered the tournament bIsChallenge = false; // to get proper match info if (completedLadder(UT2K4GameLadder.default.LID_DM)) procPhantomMatches(ceil(float(TeamStats.length-1)/2.0 * frand())); // -- Stats if (TempbIsChallenge && ChallengeGameClass != none) ChallengeGameClass.static.PostRegisterGame(self, currentGame, PRI); if (Balance < MinBalance) { Balance = MinBalance; SpecialEvent $= ";DONATION"; } bWonMatch = false; } /** Send the player to the next match in the given ladder */ function StartNewMatch(int PickedLadder, LevelInfo CurrentLevel) { local Controller C; local string NewURL; local int i; local bool doCancelFee; lmdFreshInfo= false; bWonMatch = false; bInLadderGame = true; CurrentLadder = PickedLadder; if (PickedLadder >= 10) LastCustomCladder = UT2K4GameLadder.default.AdditionalLadders[PickedLadder - 10]; else LastCustomCladder = none; if (!bIsChallenge) ChallengeGameClass = none; NewURL = GameLadder.static.MakeURLFor(self); EnemyTeam = GetEnemyTeamName(EnemyTeam); // find enemy team, if needed if (bDebug) Log("Selected EnemyTeam ="@EnemyTeam, LogPrefix); if (!bIsChallenge) SpecialEvent = ""; // challenge class will/should do this doCancelFee = true; if (bIsChallenge && (ChallengeGameClass != none)) doCancelFee = ChallengeGameClass.static.payTeamMates(self); // calculate lamer forfeitfee TeamMateRanking.length = 0; if (doCancelFee) { for (i = 0; i < GetNumTeammatesForMatch(); i++) { TeamMateRanking.length = TeamMateRanking.length+1; TeamMateRanking[TeamMateRanking.length-1].BotID = GetBotPosition(PlayerTeam[PlayerLineup[i]]); } ForFeitFee = PayTeamMates(Balance, LoserFee); if (bDebug) log("ForFeitFee ="@ForFeitFee); } else ForFeitFee = 0; CurrentLevel.Game.SavePackage(PackageName); // open game for ( C=currentLevel.ControllerList; C!=None; C=C.NextController ) { if ( PlayerController(C) != None ) { PlayerController(C).ConsoleCommand("START"@NewURL); return; } } Warn("No local player controller found"); } /** Will be called in case of a cheat */ function ReportCheat(PlayerController Cheater, string cheat) { local string s; s = msgCheater; if (Cheater != none) { Cheater.ClearProgressMessages(); Cheater.SetProgressTime(6); Cheater.SetProgressMessage(0, s, class'Canvas'.Static.MakeColor(255,0,0)); } if (cheat != "") s @= "Player used cheat:"@cheat; Log(s, LogPrefix); bCheater = true; } /** return true of the Cheat flag has been set */ function bool IsCheater() { return bCheater; } /** never allow team change unless we're god */ function bool CanChangeTeam(Controller Other, int NewTeam) { if (Other.bGodMode) return true; return ( !Other.Level.Game.GameReplicationInfo.bMatchHasBegun && (Other.PlayerReplicationInfo != None) && (Other.PlayerReplicationInfo.Team == None) ); } /** Overwritten to get alt matches */ function MatchInfo GetMatchInfo(int ladder, int rung) { local int i; if ( bIsChallenge ) return ChallengeInfo; if ( UT2K4GameLadder != none ) { i = GetSelectedLevel(ladder, rung); if (i > -1) return UT2K4GameLadder.static.GetUT2K4MatchInfo(ladder, rung, i, true); else return UT2K4GameLadder.static.GetUT2K4MatchInfo(ladder, rung, AltPath); } else { Warn("UT2K4GameLadder == none"); return none; } } /** return a selected UT2K4MatchInfo record */ function UT2K4MatchInfo GetSelectedMatchInfo(int ladder, int rung, int selection, optional bool bOrig) { if ( UT2K4GameLadder != none ) { if (bOrig) return UT2K4GameLadder.static.GetUT2K4MatchInfo(ladder, rung, AltPath); else return UT2K4GameLadder.static.GetUT2K4MatchInfo(ladder, rung, selection, true); } Warn("UT2K4GameLadder == none"); return none; } /** check if there is an alternative level */ function bool HasAltLevel(int ladder, int rung) { if ( UT2K4GameLadder != none ) return UT2K4GameLadder.static.HasAltLevel(ladder, rung); Warn("UT2K4GameLadder == none"); return false; } /** get the alternative match ID */ function byte GetAltLevel(int ladder, int rung) { if ( UT2K4GameLadder != none ) return UT2K4GameLadder.static.GetAltLevel(ladder, rung, AltPath, GetSelectedLevel(ladder, rung)); Warn("UT2K4GameLadder == none"); return -1; } /** Get the friendly game type name */ function string GetMatchDescription() { local int i; local array gr; if ( bIsChallenge ) { class'CacheManager'.static.GetGameTypeList(gr); for (i = 0; i < gr.length; i++) { if (gr[i].classname ~= ChallengeInfo.GameType) return gr[i].GameName; } return ""; } return GameLadder.static.GetMatchDescription(self); } /** return number of teammates needed for currently selected match assumes player team always gets an odd player */ function int GetNumTeammatesForMatch() { local MatchInfo M; if ( bIsChallenge ) M = ChallengeInfo; else M = GameLadder.static.GetCurrentMatchInfo(self); return GetNumTeammatesForMatchInfo(m); } /** return number of teammates needed for the provided assumes player team always gets an odd player */ function int GetNumTeammatesForMatchInfo(MatchInfo M) { if ( !IsTeamGametype(M.GameType) ) return 0; else return M.NumBots / 2; } /** return true if it's a team game type */ function bool IsTeamGametype(string gametype) { local CacheManager.GameRecord GR; if (gametype == "") return false; GR = class'CacheManager'.static.GetGameRecord(gametype); return GR.bTeamGame; } /** return the length of a selected ladder */ function int LengthOfLadder(int LadderId) { if (GameLadder != none) { return GameLadder.static.LengthOfLadder(LadderId); } else { Warn("PC Load Letter"); return -1; } } /** return the maximum size of a team that you manage */ function int GetMaxTeamSize() { return MaxTeamSize; } /** Enable a ladder, this makes sure a ladder is not reset Special case, ladderid=-1 this will set all ladders except the championship */ function enableLadder(int ladderId) { if (ladderId > LadderProgress.length) return; if (ladderId == -1) { enableLadder(UT2K4GameLadder.default.LID_DM); // DM enableLadder(UT2K4GameLadder.default.LID_TDM); // TDM enableLadder(UT2K4GameLadder.default.LID_CTF); // CTF enableLadder(UT2K4GameLadder.default.LID_BR); // BR enableLadder(UT2K4GameLadder.default.LID_DOM); // DDOM enableLadder(UT2K4GameLadder.default.LID_AS); // AS } else { if (LadderProgress[ladderId] == -1) LadderProgress[ladderId] = 0; } } /** get the progres of a custom ladder */ function int GetCustomLadderProgress(string LadderName) { local int i; i = GetCustomLadder(LadderName); if (i == -1) return -1; return CustomLadders[i].progress; } /** set the progress of a custom ladder */ function SetCustomLadderProgress(string LadderName, int increase) { local int i; i = GetCustomLadder(LadderName); if (i == -1) return; CustomLadders[i].progress += increase; } /** add a new custom ladder */ function RegisterCustomLadder(string LadderName) { if (GetCustomLadder(LadderName) > -1) return; CustomLadders.length = CustomLadders.length+1; CustomLadders[CustomLadders.length-1].LadderClass = LadderName; CustomLadders[CustomLadders.length-1].progress = 0; } /** return the id of a custom ladder */ function int GetCustomLadder(string LadderName) { local int i; for (i = 0; i < CustomLadders.length; i++) { if (CustomLadders[i].LadderClass ~= LadderName) return i; } return -1; } /** add teammate to the next available position on the team return false if not added because already on team or no room assumes it's a legal player record */ function bool AddTeammate(string botname) { local int i; if ( botname == "" ) return false; for ( i=0; i < GetMaxTeamSize(); i++ ) { if ( i >= PlayerTeam.Length || PlayerTeam[i] == "" ) { Playerteam[i] = botname; i = GetBotPosition(botname, true); BotStats[i].FreeAgent = false; BotStats[i].TeamId = -1; if (bDebug) log("Added team mate:"@botname, LogPrefix); return true; } if ( PlayerTeam[i] ~= botname ) { // already on team return false; } } return false; // never found space } /** remove teammate from the team return false if not removed because not on team */ function bool ReleaseTeammate(string botname) { local int i, j; if ( botname == "" ) return false; for ( i=0; i < GetMaxTeamSize(); i++ ) { if ( PlayerTeam[i] ~= botname ) { // player is on team, shuffle list for ( j=i; j= LengthOfLadder(LadderId); } /** return true when the ChampionshipLadder is within reach*/ function bool openChampionshipLadder() { return completedLadder(UT2K4GameLadder.default.LID_DOM) && completedLadder(UT2K4GameLadder.default.LID_CTF) && completedLadder(UT2K4GameLadder.default.LID_AS) && completedLadder(UT2K4GameLadder.default.LID_BR); } /** Rank team mates based on how they did in the last match */ function RankTeamMates(GameInfo Game, PlayerReplicationInfo Me) { local array PRI; local int i, j; local float Rank; local TeamMateRankingRecord temp; TeamMateRanking.length = 0; Game.GameReplicationInfo.GetPRIArray(PRI); // create index for (i = 0; i < PRI.length; i++) { if ((PRI[i].Team == Me.Team) && (PRI[i] != Me)) { Rank = (PRI[i].Kills+1)/(PRI[i].Deaths+1); TeamMateRanking.length = TeamMateRanking.length+1; TeamMateRanking[TeamMateRanking.length-1].BotID = GetBotPosition(PRI[i].PlayerName, true); TeamMateRanking[TeamMateRanking.length-1].Rank = Rank; } } // sort, since it's a small array, just use selection sort for (i = 0; i < TeamMateRanking.length; i++) { for (j = i+1; j < TeamMateRanking.length; j++) { if (TeamMateRanking[i].Rank < TeamMateRanking[j].Rank) // swap { temp = TeamMateRanking[i]; TeamMateRanking[i] = TeamMateRanking[j]; TeamMateRanking[j] = temp; } } } if (bDebug) { log("Rand team mates", LogPrefix); for (i = 0; i < TeamMateRanking.length; i++) { log(i$"]"@BotStats[TeamMateRanking[i].BotID].Name@TeamMateRanking[i].Rank); } } } /** Pay out the participating team mates and increase their fee A percentage of the match earnings is added/removed from their fee IncreaseFeeOf = number of team mates to pay updateFee = percentage to increase the fee Return the total payment */ function float PayTeamMates(int Money, float FeeModifier, optional int IncreaseFeeOf, optional float updateFee) { local int i, botid; local float fee, totalFee; totalFee = 0; PayCheck.length = TeamMateRanking.Length; for (i = 0; i < TeamMateRanking.Length; i++) { botid = TeamMateRanking[i].BotID; fee = GetBotPrice(, botid) * FeeModifier; // Bonus: MatchPrize * MaxMatchBonus * Rank fee += Money * MatchBonus * ((TeamMateRanking.Length - i) / TeamMateRanking.Length); PayCheck[i].BotId = BotId; PayCheck[i].Payment = Fee; if (bDebug) log("Paycheck: "$i$"]"@BotStats[PayCheck[i].BotID].Name@PayCheck[i].Payment); balance -= Fee; totalFee += Fee; //Log("UT2K4GameProfile::PayTeamMates() - "@PlayerTeam[PlayerLineup[i]]@"earns"@fee, LogPrefix); } // increase payment of IncreaseFeeOf best team mates IncreaseFeeOf = TeamMateRanking.length-Min(IncreaseFeeOf, TeamMateRanking.length); for (i = TeamMateRanking.length-1; i >= IncreaseFeeOf; i--) { GetBotPrice(, TeamMateRanking[i].BotId, updateFee); if (bDebug) log("Increase fee: "$i$"]"@BotStats[TeamMateRanking[i].BotID].Name@updateFee); } return totalFee; } /** Find the price of this player If increase > 1 increase the fee with that amouth if 1 > increase > 0 multiply the fee with that amouth if increase == 0 do nothing */ function int GetBotPrice(optional string botname, optional int botid, optional float increase, optional bool bAdd) { if (botname != "") botid = GetBotPosition(botname, bAdd); if ((botid == -1) || (botid > BotStats.length)) return -1; if (increase > 1) BotStats[botid].Price += increase; else if (increase > 0) BotStats[botid].Price *= (1+increase); return BotStats[botid].Price; } /** return the position of the bot in the botstats array */ function int GetBotPosition(string botname, optional bool bAdd) { local int i; for (i = 0; i < BotStats.length; i++) { if (BotStats[i].Name ~= botname) return i; } if (bAdd) { //log("UT2K4GameProfile::GetBotPosition() - adding bot:"@botname, LogPrefix); BotStats.length = i+1; BotStats[i].Name = botname; BotStats[i].Price = class'xUtil'.static.GetSalaryFor(class'xUtil'.static.FindPlayerRecord(botname)); BotStats[i].Health = 100; BotStats[i].FreeAgent = true; BotStats[i].TeamId = -1; return i; } return -1; } /** Find the worst team mate(s) and injure it Only one injury is supported */ function InjureTeamMate(optional int Number) { local int i; if (Number <= 0) Number = 1; Number = TeamMateRanking.length-Min(Number, TeamMateRanking.length); for (i = TeamMateRanking.length-1; i >= Number; i--) { if (FRand() > InjuryChance) continue; // injury at least 5% // injury not more than 75% // player did bad = rank is low (kills/deaths) BotStats[TeamMateRanking[i].BotID].Health = min(TeamMateRanking[i].Rank*25, 60)+25+(10*frand()); LastInjured = TeamMateRanking[i].BotID; if (bDebug) log("InjureTeamMate ="@BotStats[TeamMateRanking[i].BotID].Name@"got injured, health"@BotStats[TeamMateRanking[i].BotID].Health$"%", LogPrefix); } } /** Returns true when the player has a full team */ function bool HasFullTeam() { local int i; for (i = 0; i < GetMaxTeamSize(); i++) { if (PlayerTeam[i] == "") return false; } return true; } /** Return the team name based on a magic string A magic string starts with a ';', if not asume it's a real team name */ function string GetEnemyTeamName(string MagicString) { local array parts, teams; local class RGclass; local float X, mod; local int i, j; if (Left(MagicString, 1) != ";") return MagicString; if (Split(MagicString, ";", parts) < 3) { Warn("invalid magic string:"@MagicString); return ""; } RGclass = class(DynamicLoadObject(parts[1], class'Class')); if (RGclass == none) { Warn("Invalid team roster class:"@parts[1]); return ""; } teams.length = 0; // final is the best team but set statically for each profile at the end if ((parts[2] ~= "final") && (FinalEnemyTeam != "")) { return FinalEnemyTeam; } if ((parts[2] ~= "least") || (parts[2] ~= "most")) // least/most played with this team { if (parts[2] ~= "most") mod = -1; else mod = 1; X = mod*MaxInt; for (i = 0; i < RGclass.default.Rosters.length; i++) { j = GetTeamPosition(RGclass.default.Rosters[i], true); if ((TeamStats[j].Matches*mod) == X) // same, so add { teams[teams.length] = RGclass.default.Rosters[i]; } else if ((TeamStats[j].Matches*mod) < X) // reset list { X = TeamStats[j].Matches*mod; teams.length = 1; teams[0] = RGclass.default.Rosters[i]; } } } else if ((parts[2] ~= "best") || (parts[2] ~= "worst") || (parts[2] ~= "final")) // best/worst team you played against { if (parts[2] ~= "worst") mod = -1; else mod = 1; X = mod*MaxInt*-1; for (i = 0; i < RGclass.default.Rosters.length; i++) { j = GetTeamPosition(RGclass.default.Rosters[i], true); if ((TeamStats[j].Rating*mod) == X) // same, so add { teams[teams.length] = RGclass.default.Rosters[i]; } else if ((TeamStats[j].Rating*mod) > X) // reset list { X = TeamStats[j].Rating*mod; teams.length = 1; teams[0] = RGclass.default.Rosters[i]; } } } else if (parts[2] ~= "random") { teams = RGclass.default.Rosters; } else { Warn("unsupported magic string:"@parts[2]); } if (teams.length == 0) { X = rand(RGclass.default.Rosters.length); Warn("empty team list, will use:"@RGclass.default.Rosters[X]); return RGclass.default.Rosters[X]; } if (parts[2] ~= "final") // set final team { FinalEnemyTeam = teams[rand(teams.length)]; return FinalEnemyTeam; } return teams[rand(teams.length)]; // return a random team } /** Find the position of this team in the list */ function int GetTeamPosition(string teamname, optional bool bAdd) { local int j, i, k; local class tr; for (j = 0; j < TeamStats.length; j++) { if (TeamStats[j].Name ~= teamname) return j; } if (bAdd) // team not found, add it { //log("UT2K4GameProfile::GetTeamPosition() - adding team:"@teamname, LogPrefix); TeamStats.length = j+1; TeamStats[j].Name = teamname; TeamStats[j].Matches = 0; TeamStats[j].Won = 0; // Add ream bots tr = class(DynamicLoadObject(teamname, class'Class')); TeamStats[j].Level = tr.default.TeamLevel; for (i = 0; i < tr.default.RosterNames.length; i++) { k = GetBotPosition(tr.default.RosterNames[i], true); BotStats[k].TeamId = j; BotStats[k].FreeAgent = false; // default not free } return j; } return -1; } /** Generate stats for the last match, all except the balance change */ function procLastMatchDetails(GameInfo currentGame, PlayerReplicationInfo PRI, UT2K4MatchInfo MI) { local array PRIArray; local int i; lmdFreshInfo= true; lmdbChallengeGame = bIsChallenge; lmdTeamGame = currentGame.bTeamGame; lmdWonMatch = bWonMatch; lmdEnemyTeam = EnemyTeam; lmdGameType = currentGame.GameName; lmdGameTime = currentGame.Level.TimeSeconds-currentGame.StartTime; lmdMap = Left(string(currentGame.Level), InStr(string(currentGame.Level), ".")); if (PRI.Team != none) lmdMyTeam = PRI.Team.TeamIndex; else lmdMyTeam = 0; if (MI != none) { lmdPrizeMoney = MI.PrizeMoney; } else { lmdPrizeMoney = 0; } lmdInjury = LastInjured; if (lmdInjury > -1) { lmdInjuryHealth = BotStats[lmdInjury].Health; lmdInjuryTreatment = int(round((100-lmdInjuryHealth)*BotStats[lmdInjury].Price/100*InjuryTreatment)); } currentGame.GameReplicationInfo.GetPRIArray(PRIArray); PlayerMatchDetails.Length = PRIArray.Length; for (i = 0; i < PRIArray.Length; i++) { PlayerMatchDetails[i].ID = PRIArray[i].PlayerID; PlayerMatchDetails[i].Name = PRIArray[i].PlayerName; PlayerMatchDetails[i].Kills = PRIArray[i].Kills; //PlayerMatchDetails[i].Score = PRIArray[i].GoalsScored; PlayerMatchDetails[i].Score = PRIArray[i].Score; // use score instead PlayerMatchDetails[i].Deaths = PRIArray[i].Deaths; if (PRIArray[i].Team != none) PlayerMatchDetails[i].Team = PRIArray[i].Team.TeamIndex; else if (PRIArray[i] == PRI) PlayerMatchDetails[i].Team = 0; else { PlayerMatchDetails[i].Team = -1; } PlayerMatchDetails[i].SpecialAwards.Length = 0; if (TeamPlayerReplicationInfo(PRIArray[i]) != none) { if ( TeamPlayerReplicationInfo(PRIArray[i]).flakcount >= sae_flackmonkey ) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[0]; if (PRIArray[i] == PRI) SpecialAwards[0]++; } if ( TeamPlayerReplicationInfo(PRIArray[i]).combocount >= sae_combowhore ) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[1]; if (PRIArray[i] == PRI) SpecialAwards[1]++; } if ( TeamPlayerReplicationInfo(PRIArray[i]).headcount >= sae_headhunter ) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[2]; if (PRIArray[i] == PRI) SpecialAwards[2]++; } if ( TeamPlayerReplicationInfo(PRIArray[i]).ranovercount >= sae_roadrampage ) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[3]; if (PRIArray[i] == PRI) SpecialAwards[3]++; } } if ( PRIArray[i].GoalsScored >= sae_hattrick ) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[4]; if (PRIArray[i] == PRI) SpecialAwards[4]++; } if (( PRIArray[i].Deaths == sae_untouchable ) && !lmdTeamGame) { PlayerMatchDetails[i].SpecialAwards[PlayerMatchDetails[i].SpecialAwards.length] = msgSpecialAward[5]; if (PRIArray[i] == PRI) SpecialAwards[5]++; } } } /** Create information about other matches played by other teams */ function procPhantomMatches(int games) { local array MatchHistory; local array PhantomEnemies; local UT2K4MatchInfo MI; local int i, j, n1, n2; PhantomMatches.Length = games; if (games == 0) return; // to save time PhantomEnemies = TeamStats; for (i = 0; i < PhantomEnemies.length; i++) { if (PhantomEnemies[i].Name ~= EnemyTeam) { PhantomEnemies.Remove(i, 1); break; } } MatchHistory[MatchHistory.length] = CurrentLadder*100+CurrentMenuRung; // remove own match while (games > 0) { if (PhantomEnemies.length <= 1) break; // no more enemies // find a random match do { PhantomMatches[games-1].LadderId = UT2K4GameLadder.static.GetRandomLadder(); PhantomMatches[games-1].MatchId = rand(LengthOfLadder(PhantomMatches[games-1].LadderId)); n1 = PhantomMatches[games-1].LadderId*100+PhantomMatches[games-1].MatchId; for (j = 0; j < MatchHistory.length; j++) { if (MatchHistory[j] == n1) break; } } until (j >= MatchHistory.length); MatchHistory[MatchHistory.length] = n1; // add this item MI = UT2K4MatchInfo(GetMatchInfo(PhantomMatches[games-1].LadderId, PhantomMatches[games-1].MatchId)); // find team 1 j = rand(PhantomEnemies.length); PhantomMatches[games-1].Team1 = GetTeamPosition(PhantomEnemies[j].Name); n1 = PhantomEnemies[j].Level; PhantomEnemies.Remove(j, 1); // find team 2 j = rand(PhantomEnemies.length); PhantomMatches[games-1].Team2 = GetTeamPosition(PhantomEnemies[j].Name); n2 = PhantomEnemies[j].Level; PhantomEnemies.Remove(j, 1); // normalize levels, -1 -> equal team strength if (n1 == -1) n1 = max(n2, 0); if (n2 == -1) n2 = max(n1, 0); n1++; n2++; // calculate the odds that team1 wins if (rand(n1+n2) >= n2) { n2 = PhantomMatches[games-1].Team1; PhantomMatches[games-1].ScoreTeam1 = MI.GoalScore; PhantomMatches[games-1].ScoreTeam2 = (MI.GoalScore-1)*frand(); } else { n2 = PhantomMatches[games-1].Team2; PhantomMatches[games-1].ScoreTeam1 = (MI.GoalScore-1)*frand(); PhantomMatches[games-1].ScoreTeam2 = MI.GoalScore; } PhantomMatches[games-1].GameTime = (PhantomMatches[games-1].ScoreTeam1+1)*(PhantomMatches[games-1].ScoreTeam2+1)+(frand()*MI.PrizeMoney); // n2 is set to the winning team RandomIncreaseBotFee(n2, FeeIncrease/2); games--; } } /** Increase fee of a few bots that belong to TeamId */ function RandomIncreaseBotFee(int TeamId, float updateFee) { local int i; for (i = 0; i < Botstats.length; i++) { if ((BotStats[i].TeamId == TeamId) && (frand() > 0.5)) { GetBotPrice(, i, updateFee); } } } /** converts money to a formatted string */ static function string MoneyToString(int money) { local string res, tmp, prefix; if (money == 0) return "0"@default.msgCredits; if (money < 0) { prefix = "-"; money *= -1; } else prefix = ""; res = ""; if (money == 1) return prefix$"1"@default.msgCredit; while (money > 0) { if (tmp != "") res = ","$res; tmp = string(int(money%1000)); money = money / 1000; if (money > 0) tmp = Right("00"$tmp,3); res = tmp$res; } return prefix$res@default.msgCredits; } /** return the stored player id, use this to check a profile before loading it */ function string StoredPlayerID() { return PlayerIDHash; } /** return if a profile has been locked out for character unlocking */ function bool IsLocked() { return bLocked; } /** return the level ID selected, or -1 if no selection */ function int GetSelectedLevel(int ladder, int rung) { local int i; for (i = 0; i < LevelRoute.length; i++) { if (LevelRoute[i].ladder == ladder && LevelRoute[i].rung == rung) return LevelRoute[i].selection; } return -1; } /** set a level selection */ function SetSelectedLevel(int ladder, int rung, byte id) { local int i; for (i = 0; i < LevelRoute.length; i++) { if (LevelRoute[i].ladder == ladder && LevelRoute[i].rung == rung) break; } if (i <= LevelRoute.length) LevelRoute.length = i+1; LevelRoute[i].ladder = ladder; LevelRoute[i].rung = rung; LevelRoute[i].selection = id; } /** remove a previous set selection */ function ResetSelectedLevel(int ladder, int rung) { local int i; for (i = 0; i < LevelRoute.length; i++) { if (LevelRoute[i].ladder == ladder && LevelRoute[i].rung == rung) { LevelRoute.remove(i, 1); return; } } } /** get the alternative team roster */ function bool GetAltTeamRoster(string TeamRosterName, out array result) { local int i; result.length = 0; if (TeamRosterName == "") return false; //Log("GetAltTeamRoster"@TeamRosterName); for (i = 0; i < AltTeamRoster.length; i++) { if (AltTeamRoster[i].name ~= TeamRosterName) { result = AltTeamRoster[i].roster; return true; } } return false; } /** set the alternative team roster */ function SetAltTeamRoster(string TeamRosterName, array NewRoster) { local int i; if (TeamRosterName == "") return; for (i = 0; i < AltTeamRoster.length; i++) { if (AltTeamRoster[i].name ~= TeamRosterName) break; } if (AltTeamRoster.length <= i) { AltTeamRoster.length = i+1; AltTeamRoster[i].name = TeamRosterName; } AltTeamRoster[i].roster = NewRoster; } /** Adds the current match info to the history table */ function AddHistoryRecord(GameInfo Game, PlayerReplicationInfo PRI, UT2K4MatchInfo MI) { local int i, j, n; local array PRIArray; local string tmp; i = FightHistory.length; FightHistory.length = FightHistory.length+1; FightHistory[i].Date[0] = Game.Level.Year; FightHistory[i].Date[1] = Game.Level.Month; FightHistory[i].Date[2] = Game.Level.Day; FightHistory[i].Time[0] = Game.Level.Hour; FightHistory[i].Time[1] = Game.Level.Minute; FightHistory[i].Level = Left(string(Game.Level), InStr(string(Game.Level), ".")); FightHistory[i].GameType = Game.GameName; FightHistory[i].EnemyTeam = EnemyTeam; if (MI != none) FightHistory[i].PriceMoney = MI.PrizeMoney; FightHistory[i].BalanceChange = lmdBalanceChange; FightHistory[i].BonusMoney = lmdTotalBonusMoney; FightHistory[i].GameTime = Game.Level.TimeSeconds-Game.StartTime; FightHistory[i].WonGame = bWonMatch; FightHistory[i].TeamGame = Game.bTeamGame; if (Game.bTeamGame) { Game.GameReplicationInfo.GetPRIArray(PRIArray); tmp = ""; for (j = 0; j < PRIArray.Length; j++) { if (PRIArray[j].Team.TeamIndex == ((PRI.Team.TeamIndex+1) % 2)) { if (tmp != "") tmp $= ", "; tmp $= PRIArray[j].PlayerName; } } FightHistory[i].TeamScore[0] = TeamGame(Game).Teams[(PRI.Team.TeamIndex+1) % 2].Score; FightHistory[i].TeamLayout[0] = tmp; tmp = ""; for (j = 0; j < PRIArray.Length; j++) { if (PRIArray[j].Team.TeamIndex == PRI.Team.TeamIndex) { if (tmp != "") tmp $= ", "; tmp $= PRIArray[j].PlayerName; } } FightHistory[i].TeamScore[1] = TeamGame(Game).Teams[PRI.Team.TeamIndex].Score; FightHistory[i].TeamLayout[1] = tmp; } for (j = 0; j < PlayerMatchDetails.length; j++) { if (PlayerMatchDetails[j].ID == PRI.PlayerID) { FightHistory[i].MyScore = PlayerMatchDetails[j].Score; FightHistory[i].MyKills = PlayerMatchDetails[j].Kills; FightHistory[i].MyDeaths = PlayerMatchDetails[j].Deaths; for (n = 0; n < PlayerMatchDetails[j].SpecialAwards.length; n++) { if (FightHistory[i].MyAwards != "") FightHistory[i].MyAwards $= ", "; FightHistory[i].MyAwards $= PlayerMatchDetails[j].SpecialAwards[n]; } break; } } if (bIsChallenge) { FightHistory[i].MatchData = msgChallengeGame$";"$ChallengeGameClass.default.ChallengeName; ChallengeGameClass.static.AddHistoryRecord(self, i, Game, PRI, MI); } else if (CurrentLadder >= 10) { FightHistory[i].MatchData = msgAdditionalLadder$";"$LastCustomCladder.default.LadderName@msgMatch@CurrentMenuRung; LastCustomCladder.static.AddHistoryRecord(self, i, Game, PRI, MI); } else { FightHistory[i].MatchData = msgLadderGame$";"; switch (CurrentLadder) { case UT2K4GameLadder.default.LID_DM: case UT2K4GameLadder.default.LID_TDM: case UT2K4GameLadder.default.LID_CTF: case UT2K4GameLadder.default.LID_DOM: case UT2K4GameLadder.default.LID_BR: case UT2K4GameLadder.default.LID_AS: FightHistory[i].MatchData $= GetLadderDescription(CurrentLadder); break; case UT2K4GameLadder.default.LID_CHAMP: FightHistory[i].MatchData $= msgChampionship; } FightHistory[i].MatchData @= msgMatch@CurrentMenuRung; } } /** return a random or selected challenge game */ function class GetChallengeGame(optional string ClassName) { return UT2K4GameLadder.static.GetChallengeGame(ClassName, self); } /** return the minimal fee for x team members, only uses team mates that are healthy */ function float getMinimalTeamFee(int members, optional bool bIgnoreHealth) { local array fees; local int i, j, n, tmp; for (i = 0; i < GetMaxTeamSize(); i++) { j = GetBotPosition(PlayerTeam[i]); if ((j > -1) && ((BotStats[j].Health >= 100) || bIgnoreHealth)) { tmp = BotStats[j].Price*LoserFee; for (n = 0; n < fees.Length; n++) { if (fees[n] > tmp) { fees.Insert(n, 1); fees[n] = tmp; break; } } if (n == fees.length) { fees.length = fees.length+1; fees[fees.length-1] = tmp; } } } if (fees.length < members) return 2147483647; j = 0; for (i = 0; i < members; i++) { j += fees[i]; } return j; } /** get the minimal fee for this match, based on the entry fee for the match and the minimal fee to pay out to your team mates if you lose. If you don't have enough team mates the result is negative */ function int getMinimalEntryFeeFor(UT2K4MatchInfo MI, optional bool bIgnoreHealth) { local int res; res = MI.EntryFee; if (IsTeamGametype(MI.GameType)) { res += getMinimalTeamFee(MI.NumBots / 2, bIgnoreHealth); } if (bDebug) log("getMinimalEntryFeeFor ="@res); return res; } function UpgradeGP() { local int i; if (revision == 0) { log("Revision upgrade to 1", LogPrefix); MinBalance = 75; InjuryChance = 0.30+(BaseDifficulty / 30); ChallengeChance = 0.30+(BaseDifficulty / 30); FeeIncrease = 0.02+(BaseDifficulty / 300); TeamPercentage = 0.35+(BaseDifficulty / 30); MatchBonus = 0.03+(TeamPercentage / 10); revision = 1; } if (revision == 1) { log("Revision upgrade to 2", LogPrefix); TeamPercentage = 0.25+(BaseDifficulty / 30); MatchBonus = 0.05+(TeamPercentage / 10); revision = 2; } if (revision == 2) { log("Revision upgrade to 3", LogPrefix); InjuryTreatment = 0.75+(BaseDifficulty / 50); MapChallengeCost = 0.10+(BaseDifficulty / 100); revision = 3; } if (revision == 3) { log("Revision upgrade to 4", LogPrefix); for (i = TeamStats.Length-1; i >= 0; i--) { if (TeamStats[i].Name == "") TeamStats.Remove(i, 1); } for (i = BotStats.Length-1; i >= 0; i--) { if (BotStats[i].Name == "") BotStats.Remove(i, 1); } revision = 4; } if (revision == 4) { log("Revision upgrade to 5", LogPrefix); if (bCompleted && !bLocked && !bCheater) { if (completedLadder(UT2K4GameLadder.default.LID_CHAMP)) { bCompleted = false; SpecialEvent = "COMPLETED CHAMP"; } } revision = 5; } } >^//============================================================================== // Roster for single player DM games, Players are selected randomly // Roster consist from unknown players from: Juggs, Mercs and Egypt // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4DMRoster extends xDMRoster config; /** To create the same team in the loading screen and actual game */ var config array UsedBots; var array BotList; function PostBeginPlay() { if (UsedBots.Length != 0) RosterNames = UsedBots; Super.PostBeginPlay(); } function PreInitialize(int TeamBots) { local int i; Roster.Length = 0; UsedBots.Length = 0; for (i = 0; i < TeamBots; i++) { AddPlayerFromList(); } SaveConfig(); } function AddPlayerFromList() { local int i, n; rand(BotList.length); // for randomness' sake i = rand(BotList.length); n = roster.length; Roster.Length = n+1; UsedBots.Length = n+1; Roster[n] = class'xRosterEntry'.static.CreateRosterEntryCharacter(BotList[i]); Roster[n].PrecacheRosterFor(self); UsedBots[n] = BotList[i]; BotList.Remove(i, 1); } %n)W'h06o)@m%1+75p  E1Yv AvalancheSorrow Perdition Vengeance StargazerPhantomKain SilhouetteSphinxNatronNafiret Tranquility] Death Match>>W//============================================================================== // Thunder Crash - Strong Enemy Team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamThundercrash extends UT2K4TeamRoster; >e)t$a.{tPA"%AA"7o!7|6N#A"o!t$A"A"G-q&7o!A"&6N#A"o!t$6K#A"o!%6U%A"o!%A$f!t$ 6a$A"o!A$r&B$%AB$7A$m$`.B$A$'6I%m$j!A"-6m#m$j!(B$A" G>X)Y#d,V9Y#J6Y#BallDrainsTranslocator9T-J& G>s o$ /Ho$o$1bbBallDrainsTransloc[&$($Check ' G >A">f!p)~/2u)ncf!>L//============================================================================== // The new SuperNova team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewSuperNova extends UT2K4TeamRoster; >s)K%~.07K% %bBallDrainsTranslock& K% G(f!v)x/2x)o('f!>q)a"K/4-h%'-X1-Z"-G%a"--v&-u&t&a" f&a"a"s&9Va"~9Va".w|$*H%|$H%%w~$*`/~$_-`/%|#E$|#z$6h#|#j!i&9DaB9<z$9?6S#|#j!9?,dO/a" w.s!7l!7s!d!%d!7s!6U/d!l!d!s!6I'd!l!d!s!6E'd!l!9?d!s!6A'd!l!d!s!6}&d!l!d!s!wd!s!*6A%d!l!d!s!rd!s!|$6A%d!l!%6A%d!l!76z!d!l!%w.d!s!*.d!s!h176z!d!l!6z!d!l!%T-rd!s!|$%W-.d!s!i176z!d!l!6z!d!l!&T-rd!s!|$&W-r.d!s!j176z!d!l!6z!d!l!,T-rrd!s!|$,W-.d!s!k176z!d!l!6z!d!l!,T-rd!s!|$,W-Gd!s!l176z!d!l!6z!d!l!,T-Grd!s!|$,W-d!s!9?m1 -G%76z!d!l!6z!d!l!,T-rd!s!|$,W-d! G>W//============================================================================== // UT2K4 Iron Guard - Mid Enemy Team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewIronGuard extends UT2K4TeamRoster; >zF"u.Q&S9:9:$4w$*p$.$]wp$*rp$-s$'9:9:$ -s$9?,a {aE#a w[*E#[ S xPawn.PlayDying: No Species{E# {E#u!.u!E# 'wF"*F"-#F"-XF"[F"~#r$X~#}#6}#|6}#|> #<q$FWq$S}#r$F"-u! #F"-u! 96u! ?66u! ?66u! ?6u! r$F"-F"-69?6u! [F"-#u!  #au!  q$v$9?9D9Du! 9?&~#u! ի9?,v$~#u!wF"*F"-\F"u!- ' 'o$-s$u!-'u!-F"--C/F"-u! |0   k%%eCx&o$ Gf!z)p02})Nf!>>>J//============================================================================== // UT2K4 Firestorm team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewFirestorm extends UT2K4TeamRoster; >y)h!I/Ӕ7m!h!h!% }!o!Q#%nQ#7}!d|6N#Q#}!A}!Q#&nQ#+7k"k",dh!%7}!&6p#h!&m!F,G/6^$h!&m!f.6p#h!&m!Q"6p#h!&m!,d6^$h!&m!{!%b{!7k"X{!k"Q"b{!0{!7k"7k"k"Q"r".c!n.6p#h!&m!6^$h!&m!{!7}!6R%h!&m!a.6N#{!}!Q"6a${!}!A}!{!&{!7}!6S%h!&m!a.6N#{!}!V"6a${!}!A}!{!&Q"Q"V"%V"V"Q"%Q"V"8Q"V"V"V"6R%h!&m!6`$h!&m!r"6_$h!&m!r"9?&V"6S%h!&m!6`$h!&m!r"9?&6_$h!&m!r"6Q&h!&m!6`$h!&m!9?&6_$h!&m!9?&9?r"_-H/V"x%9?,h! Gf!)t02A*-ef!>E//============================================================================== // UT2K4 Bloodfist // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewBloodfist extends UT2K4TeamRoster; >>f!B*g02D*q\Rf!>@>Q%>O//============================================================================== // UT2K4 Black Legion team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewBlacklegion extends UT2K4TeamRoster; f!F*U12G*mf!>D//============================================================================== // UT2K4 Bloodfist // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamJuggernauts extends UT2K4TeamRoster; f!H*Q02I*b~Zf!>X//============================================================================== // Iron Skull Skaarj - Strong Enemy Team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamIronSkull extends UT2K4TeamRoster; >@*{&H/6]W#%ZW#7j!P6I%W#j!{& ?p. W#|&W# Gf!J*Y12N*'f!>@//============================================================================== // UT2K4 Hellions // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamHellions extends UT2K4TeamRoster; >>c!f!O*j/2Q*'f!>//============================================================================== // The 2nd Juggernaut team: Goliath // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== #exec OBJ LOAD FILE=TeamSymbols_UT2004.utx class TeamGoliath extends UT2K4TeamRoster; f!R*I02S*]pf!>P//============================================================================== // The Corrupt - Strong Enemy Team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamCorrupt extends UT2K4TeamRoster; f!T*Z02U*%f!XanEnigmaDivisorVirusMatrixCathodeCyclopsAxon] The Corrupt>>Kclass SPECIESSkaarj extends SpeciesType abstract; static function string GetRagSkelName(String MeshName) { return "Skaarj"; } V*U+C13W**!R]XGame.AlienMaleVoiceE]XGame.AlienFemaleVoice`]xEffects.xAlienGibGroupy]SkaarjAnims.Skaarj_Skel|]SkaarjAnims.Skaarj_Skelv]XGame.xAlienMaleSoundGroupw]XGame.xAlienFemaleSoundGroup\]Skaarj."k o.k Z/k ^/k \/k ]/k >T  Hair flipTSlashTScanTFingerTIdleL$?W$?Q$ff?>>c#~&n.mb.~&&%' G >>>Y*>>>>X*J%b.-d#%rung < 0*J% 6m"D" LC#D" bB#D" xA#D" }"D" d"D"c# V#D" J%, 7Q,J%, D"J%, Q,Y-%7D"%matcharray.Length <= 0*Rd#7D"Y".c!7D"&D"hY".c!d#D"wY"*-o17Y"R$%E-9D9?B'9?7Y"R$Y"R${E-Y"E-wY"*7Y"R$%B'9D9?B'd#&J%&_9:Y"x-%H/9:Y"x-tH/7Y"R$E-9D9?B'9?H/Y"R${E-Y"E-rY"*selmatch == noneY" G >\Z*j0v !w0 G>P//============================================================================== // Phantom Team - Raw Steel // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PhantomRawSteel extends UT2K4PhantomRoster; > h*@'V0c1L @'.w#*#--\Iw^ *^ O6( G>D">c!P"^*J02a*WP"[JU  T.]uOnly men are allowed in the fighting force known as 'Raw Steel.' An amalgamation of human muscle and polyfoam metals, 'Raw Steel' upholds strength and power over all other virtues.U."] Raw Steel>>>>c//============================================================================== // Phantom Team - Necris Black Legion // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PhantomNecrisBlackLegion extends UT2K4PhantomRoster; >j4~"{.b<w.i!~"*~""n.~"~"b.~"~" G P"c*v/2e*3ᥑP"[JU  T.]SQThis powerful team of Necris Phayder assassins seeks to dominate the Tournament.U."]Necris Black Legion>>>>d*F'f.F' m"7 %C#7 4B#7 CA#7 R}"7 ad"7c# pV#7 F', 7Q,F', 7F', Q,Y- G > GD'D0/ D''w#*#-(Bw^ *^ O6'l-%l-7w.l-*l-a**l-I G>>>g*X%`/y!.i!X%0ry!*PC Load LetterZy!-Z"y![#T", T"y!|!X%T" m"_"T"y!|! C#_"T"y!|! 3B#_"T"y!|! gA#_"T"y!|! }"_"T"y!|! d"_"T"y!|!c# V#_"T"y!|! U-T", U-%7Q,U-.y!u69VU-Q,o.X%_".U-Q,Y-y!l69VU-Q,&_"T"y!|!&_" G >>>M//============================================================================== // Phantom Team - Epic Games // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PhantomEpic extends UT2K4PhantomRoster; >_"@>P"l*S12n*WP"[JU  T.m^\Founded in 1991, Epic has long been a pioneer of cool PC games, new business models, and boundary-defining game technologies. Epic was founded by Tim Sweeney (Jill of the Jungle, Unreal), and joined shortly after by Mark Rein (VP of Marketing), James Schmalz (Epic Pinball, Extreme Pinball, Unreal), and Cliff Bleszinski (Jazz Jackrabbit, Unreal).U."]NvidiaLogo_T.Logos.Epic_Logo]Epic Games, Inc.>>V//============================================================================== // Phantom Team - Dark Phalanx // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PhantomDarkPhalanx extends UT2K4PhantomRoster; >j*\%r.r#&i.\%\% G >k*q.Yi%w*q.Uw*w*q.pw$*$q.r*r*, G>@>>p*G'i.K$G' ,m"O"j"b QC#O"j"b vB#O"j"b A#O"j"b }"O"j"b d"O"j"c#b V#O"j"b _G', 7Q,G', O"j"G', Q,Y-bz/ c2O"6z/ G >vh/  -^% -^%'.-Y$'mr k R*'.9?& GP"o*A02u*ŞP"[JU  T.]lThe Dark Phalanx are an honorable collection of military specialists. All have proven themselves in the Human/Skaarj war and now seek glory in the ranks of the Tournament.U."] Dark Phalanx>>O"@>>X//============================================================================== // Phantom Team - Blood Reavers // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class PhantomBloodReavers extends UT2K4PhantomRoster; >>>s*K'G/@(%-K'V#&"d"& G >@>>>>y*o"W/GU)bHw.i!o"*.i!o"-Z"|..i!o"[#o"|.{.o"o" G P"w*c/2}*3D0P"[JU  T.]XAn organization of mercenaries and ex-military specialists, the Blood Reavers are interested in fame and fortune. They seek to win the Tournament for the prize that victory offers: nearly limitless wealth and power.U."]Blood Reavers>>@>>|*G"|.Q*(#rG"*MatchInfo == nonep"G"p"p"G"R"pppppppG"?Name=p" ?Character=p"?SaveGame=p"G"&G"9?%aBR"p?GoalScore=9UG"`G"%aBR"p?NumBots=9SG"{G"aBR"p?Game=G"aBR"?Team=1?NoSaveDefPlayer?ResetDefPlayerw.c!G"*.c!G"\09?%aBR"p?TimeLimit=9U.c!G"\0R" G >W// ==================================================================== // A land mine. Blows up players who touch it and chucks their bodies into the air // // Written by Matt Oelfke // (C) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class LandMine extends Triggers placeable; var() vector ChuckVelocity; var() class DamageType; var() class BlowupEffect; var() Sound BlowupSound; function Touch(Actor Other) { if (Pawn(Other) != None) { Other.PendingTouch = self; PendingTouch = Other; } } function PostTouch(Actor Other) { local Pawn P; P = Pawn(Other); if (P != None) { PlaySound(BlowupSound,,3.0*TransientSoundVolume); spawn(BlowupEffect,,,P.Location - P.CollisionHeight * vect(0,0,1)); P.AddVelocity(ChuckVelocity); P.Died(None, DamageType, P.Location); } } @+P)h. A+>?߅؂uhhhhhʁ)B1:5zDtT1l0;$B1$HB>>R"@>>,class FemRobotVoice extends RobotVoice; >E+>>R$>>hi%~.zC2Ji% TimeToScore%l% 8TImeDisabled&l% i% G(>@>pC+a/6H+e!p*  L+$?>>}4>>@>>w)N+P0m1, G>xi"d,i/Mi"J6i"TimeToScore9SUJ6i"TimeDisabled9Sf  G>>>>> S+C$Q/[!&C$%, C$,, C$ G >v%>>U 2> Y+P'e0G Mv%I"F0\rI"*Yv%!b0I"&%J9rI"*wI"*E9:I"I"$I"bI"39:.I"%,6,J P'I" G>class BodyEffect extends Effects; var class DamageType; var vector HitLoc; function PostBeginPlay() { local ColorModifier Alpha; local float frame, rate; local name seq; Super.PostBeginPlay(); LinkMesh(Owner.Mesh); Owner.GetAnimParams( 0, seq, frame, rate ); PlayAnim(seq, 0, 0); SetAnimFrame(frame); StopAnimating(); Alpha = ColorModifier(Level.ObjectPool.AllocateObject(class'ColorModifier')); Alpha.Material = Skins[0]; Alpha.AlphaBlend = true; Alpha.RenderTwoSided = true; Alpha.Color.A = 128; Skins[0] = Alpha; Skins[1] = Alpha; Skins[2] = Alpha; } simulated function Tick(float deltaTime) { SetDrawScale(DrawScale * (1 + 0.5*DeltaTime)); ColorModifier(Skins[0]).Color.A = int(128.f * (LifeSpan / default.LifeSpan)); } simulated function Destroyed() { if ( xPawn(Owner) != None ) { xPawn(Owner).bFrozenBody = false; xPawn(Owner).PlayDyingAnimation(DamageType, HitLoc); } Level.ObjectPool.FreeObject(Skins[0]); Skins[0] = None; Skins[1] = None; Skins[2] = None; Super.Destroyed(); } >AV+Ss Skaarj G >W+@>>@>>AF$SvE~F$Gitty%K 6~F$Ophelia%K AF$ G > r3L/?z  G>@>>^.>>@>>>k5$pA]TUT-DM]Deathmatch Tutorial]xGame.UT2K4DMRoster$ AX]"!?Quickstart=true?TeamScreen=true]xGame.xDeathmatch>j5"c."2k5$ A]DM-1on1-Idoma]xGame.UT2K4DMRoster$ AX]"!?WeaponStay=true?TeamScreen=true"]xGame.xDeathmatch>S.Y DM-1on1-SpiritDM-1on1-Tritej5"c."Kk5$pA]xGame.UT2K4DMRoster$L>$ AX]"!?WeaponStay=true?TeamScreen=true"]xGame.xDeathmatch>S.Y(DM-1on1-AlbatrossDM-1on1-Roughineryj5"c."dk5$pA]xGame.UT2K4DMRoster$>$pAX]"!?WeaponStay=true?TeamScreen=true"]xGame.xDeathmatch>j5"c."k5$pA]DM-1on1-Desolation]xGame.UT2K4DMRoster#]BALANCE 2000;DRAFT$>$pAX]"!?WeaponStay=true?TeamScreen=true"]xGame.xDeathmatch>j5"c."i8] FULLTEAMk5$pA]DM-1on1-Irondust]xGame.DMRosterBeatTeam#]OPEN TDM;QUALIFIED SINGLE$?$AX]"!?WeaponStay=true?TeamScreen=true"]xGame.xDeathmatch>S.Y DM-Sulphur DM-Curse4j5"k5$pA]"!;xGame.UT2K4TeamRosterEasy;least$?$AX]?TeamScreen=true"]xGame.xTeamGame>S.Y DM-Rankin DM-Rrajigarj5"k5$A]"!;xGame.UT2K4TeamRosterEasy;least$@?$ BX]?TeamScreen=true"]xGame.xTeamGame>S.YDM-Corrugation DM-Antalus{%j5"k5$A]"!;xGame.UT2K4TeamRosterEasy;least$?$HBX]?TeamScreen=true"]xGame.xTeamGame>S.Y DM-Morpheus3 DM-Goliathj5"k5$A]! ;xGame.UT2K4TeamRosterEasy;best#]%$OPEN DOM;QUALIFIED TEAM;UPDATETEAMS$?$pBX]?TeamScreen=true" ]xGame.xTeamGame>S.Y)CTF-FaceClassic CTF-Maul CTF-Citadel{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least$@?$@X]?TeamScreen=true"MxGame.xCTFGame>S.Y-CTF-Grendelkeep CTF-MagmaCTF-Geothermal{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least#] OPEN BR$?$@X]?TeamScreen=true"MxGame.xCTFGame>S.Y CTF-SmoteCTF-TwinTombsj5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least#] UPDATETEAMS$?$@@X]?TeamScreen=true" MxGame.xCTFGame>S.YCTF-Grassyknoll CTF-Avaris{%j5"k5$A]! ;xGame.UT2K4TeamRosterMid;least$?$@@X]?TeamScreen=true" MxGame.xCTFGame>S.Y CTF-JanuaryCTF-Lostfaith{%j5"k5$A]! ;xGame.UT2K4TeamRosterMid;least$?$@@X]?TeamScreen=true" MxGame.xCTFGame>S.YCTF-MoonDragon CTF-Orbital2{%j5" k5$A]! ;xGame.UT2K4TeamRosterMid;least#] UPDATETEAMS$@$@X]?TeamScreen=true" MxGame.xCTFGame>{%j5" k5$A]CTF-BridgeOfFate]$#;xGame.UT2K4TeamRosterStrong;least$@$@X]?TeamScreen=true" MxGame.xCTFGame>S.Y&CTF-AbsoluteZeroCTF-DoubleDammage{%j5" k5$A]$#;xGame.UT2K4TeamRosterStrong;least#]COMPLETED CTF;UPDATETEAMS$ @$@X]?TeamScreen=true" MxGame.xCTFGame>S.Y" DOM-AtlantisDOM-ScorchedEarth{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least$@?$@X]?TeamScreen=true"]xGame.xDoubleDom>S.YDOM-Renascent DOM-Junkyard{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least#] OPEN CTF$?$@X]?TeamScreen=true"]xGame.xDoubleDom>S.Y DOM-AccessDOM-Outrigger{%j5"k5$pA]! ;xGame.UT2K4TeamRosterMid;least#] UPDATETEAMS$?$@X]?TeamScreen=true"]xGame.xDoubleDom>S.YDOM-RuinationDOM-Suntemplej5" k5$A]! ;xGame.UT2K4TeamRosterMid;least$@$@@X]?TeamScreen=true" ]xGame.xDoubleDom>S.Y DOM-Conduit DOM-Core{%j5" k5$A]! ;xGame.UT2K4TeamRosterMid;least#] UPDATETEAMS$@$@@X]?TeamScreen=true" ]xGame.xDoubleDom>S.Y DOM-AswanDOM-SepukkuGorge{%j5" k5$A]$#;xGame.UT2K4TeamRosterStrong;least#]COMPLETED DOM;UPDATETEAMS$ @$@@X]?TeamScreen=true" ]xGame.xDoubleDom>j5"k5$pA] BR-Serenity]"!;xGame.UT2K4TeamRosterWeak;least$@?$pAX]?TeamScreen=true"]xGame.xBombingRun>S.Y BR-Bifrost BR-Anubis{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least#] OPEN AS$?$pAX]?TeamScreen=true"]xGame.xBombingRun>S.Y BR-CanyonBR-DE-ElecFields{%j5"k5$pA]"!;xGame.UT2K4TeamRosterWeak;least#] UPDATETEAMS$?$AX]?TeamScreen=true" ]xGame.xBombingRun>j5"k5$A]BR-Disclosure]! ;xGame.UT2K4TeamRosterMid;least$?$AX]?TeamScreen=true" ]xGame.xBombingRun>j5" k5$A] BR-TwinTombs]! ;xGame.UT2K4TeamRosterMid;least$?$AX]?TeamScreen=true" ]xGame.xBombingRun>j5" k5$A] BR-IceFields]! ;xGame.UT2K4TeamRosterMid;least#] UPDATETEAMS$@$AX]?TeamScreen=true" ]xGame.xBombingRun>S.Y BR-SkylineBR-BridgeOfFate{%j5" k5$A]$#;xGame.UT2K4TeamRosterStrong;least$@$AX]?TeamScreen=true" ]xGame.xBombingRun>j5" k5$A] BR-Colossus]$#;xGame.UT2K4TeamRosterStrong;least#]COMPLETED BR;UPDATETEAMS$ @$AX]?TeamScreen=true" ]xGame.xBombingRun>j5"k5$pA]AS-FallenCity]"!;xGame.UT2K4TeamRosterWeak;least$@?X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=10?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5"k5$pA]AS-RobotFactory]"!;xGame.UT2K4TeamRosterWeak;least#] UPDATETEAMS$?X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=11?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5"k5$A] AS-Convoy]! ;xGame.UT2K4TeamRosterMid;least$?X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=12?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5" k5$A= AS-Glacier]! ;xGame.UT2K4TeamRosterMid;least$@X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=13?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5" k5$A] AS-Junkyard]! ;xGame.UT2K4TeamRosterMid;least#] UPDATETEAMS$@X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=14?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5" k5$A]AS-MotherShip]$#;xGame.UT2K4TeamRosterStrong;least#]COMPLETED AS;UPDATETEAMS$ @X]\Z?TeamScreen=true?FirstAttackingTeam=1?RoundTimeLimit=15?ReinforcementsFreq=7?RoundLimit=1" ]UT2k4Assault.ASGameInfo>j5"] DM-Deck17]$#;xGame.UT2K4TeamRosterStrong;final$@@$ BX]?TeamScreen=true" ]xGame.xTeamGame>j5"'MDM-HyperBlast2]$#;xGame.UT2K4TeamRosterStrong;final#]COMPLETED CHAMP$@@$AX]?TeamScreen=true"] xGame.BossDM>>|!>e!>J2@>_2>K,>>@>>>>d.>\6z5d73L,;@Ei!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Ui!U.Uc!fi!U.Ui!U.Uv7]We got challengedu7]We challengedt7]for>>O,@>C6>|,>>M-@>E6>y&@>a2>f-@@>Z4>i->L,>>>S,@>H6>M,>i!>s-@>o4>d,@>g4U6o6C73X,j}@Et6]Custom Ladder>>F,>>s,@>M4>b1>>n,>>>>>>@>>>>~-@>Y2>f/>>a,@>Z2>u,>c!>k >>Z3>>>>>>g.>>k,>>Z->>J1>i!>s/>>Q-@> >v/@D>>Y,>>n.>>E0>>v,>>>>>>~,>>->>c/>>L/>>L6>i!>_.>>P0>>Y.>>_,@>C4>>>G/>>h,@>L3>[->>{.>i!>H/@>>N.>>>>b-@>>H.>>^->>>>u.@>>T,>f!>X.>>>>>>C.>>d1>i!>].>>h1@>>.>>@>D5>e1>>^,@>y4>@>a6>}->>>>V-@>E5>>>x,>>I+>>>>I.>>@.@>>@/>>>>>>@@>\4>>>c ^>b/>>>>>>>>}>>w0\/r7>M'@>>[1>t5n2g62 q-ey_Ѕ3}3}3}̅3}h3}TG8$>>A/>>>c!>z,>>>>>>B0>>_->>D/>>>q->k.>>r1>>J/>>[2>X,>\->>@>>>>A.>>S0@>>M/>>B.>>G5@>H5>h0>>G.>>@>}2>e/>>g6>>>{0>>M.>>q1>>j2>>{>>q%>>~.>>I/>>>>>>H1>>W.>>>>[.>>V/>>P1>>\.>>L'@>>H,>c!>@>3>b.>>@>F4>`.>>,>>i>>>>>>@]6D4>>>V0@>>>>>>B-u5>q.>>`2@>>@>n0>>>V6>i!>v1>c!>x3>>x1@>>w1@>>@>y2>>>>>@]6S4>q5>>}.^>h-^>>>>>>>>>t/>>R7>>m4>>[3>>>>J.>>>>>>C->>c3>>@>>>>R1>>S'>>o->>T1>>Q/>>S1>>@>>I'>>>>>>M1>>T/@>>R5@>S5>>>Y/@>>m3>>>>^/@>>p->>U5@>Z5>k/@>>e4>>b,>>>>g/>>h/>>B1>>>>]-@>i4>[,@>>o/>>p1@>>g5D-p5B 4D--i-6u.{.D-G,A1S6u.{.D-G,C1{D-b/aC6u.{.D-G,F1D-b/ G >y0>>~ >>`% > >y/@>>>>L->>>>>>u/@>>c->>t3@>s3>@>>J5@>K5>g,>>A0@>>G>>@0>>z2>>w4>i!>>>z">>x.>>>>A2>>C2@>>@>>}3>>K0u5>k0u5>l0@>>>>@3>>M2@>>>>C3@>>I2>>q,@>>>>>>@>]2>@>>i,>>U0@>>f.@>>E>>>>N5@>O5>B5>>@>@5>^0>>G3@>>j0@>>X0>>O->>g0@>>c$>>l.>>@> >z4@>>>>m.u5>>>>>Le G>Q3@>>@>v4>w->>q0>>v2>>@>>@>s4>s0>>M5@>>r2>>x0>>>>@> >\ >n4@>>E/>>@>k4>Y6>i!>C1@>>z->>F1@>>@>f4>G1>>Q5@>>e3>>@> >a4@>>>>p,Z.m7>>>L1>>W/>>^6@>>@> >N1>>[+>>Q1>>],>>V5[5S6!? G S6i73V1>PpW1]%o was OBLITERATED by %k!y0]%o was OBLITERATEDU0]%o was OBLITERATED]8Se7V&~6R)$I&G&$?>>Y1>>s&>>G->>@N6>\1>>|#>]6Q8b7@]1@8c2ʁ)uP>:5S>:5y @>>U1R-Y6&yR-R--Z"'R-H#R-[#I+R-R,R-Y0d1 G >Z1@N6>@>^4L,`6Z6f72-a1tUu*L,;i!U.Ui!U.Ui!U.Ui!U.Uc!fi!U.Ui!U.Ui!U.Uc!fi!U.Ui!U.Ui!U.Ui!U.Ui!U.Ue!Kei!U.Ui!U.Ui!U.Ui!U.Uc!fi!U.Ui!U.Ui!U.Uc!fi!U.Uf!>c1>>W->>>>f1>>T->>^1b5U64 G >i1>>j1>>k1>>l1>>m1>>n1>>m/@>>`*>>|-@>>Y4>>G,>>]%B/B7>@2>i!L,O6U82u1L,;^6] Head to Head\6]-,A 1 vs 1 match against another team leader.[6]GUI2K4.UT2K4SP_CGManoEMano>>U4>>t,@>y3>y1@>>z1@>>{1@>>|1>>}1>>~1>>1>>F0>>Q2>>G0>>>c!>D2>>E2>>o.>>J4>p5\3@72G2++o>+q-ey_q-ey_q-ey_̅3},e,eh,e̅3}  >>n/u5w5L ' G >K4>>K2@>>O0@>>B2>>N2@>>c,@>>s1j.Z8>G4@>>L2>>>>H2x5y.R< ' G >|5>i!>O2Z0Y8>A4>P6h3N62W2(px@p  x7]..._7]54You have been targeted by an orbital Ion Satellite!kSF8@">>b0@>>@>U2>@>O2>>>U2R2l7G%$!zo-o-R2 G>@>>\2M0V7P&96{o-M0-P/'o-M0 G>@>s1>>>>K1>>> `c2z7 ^QGr`*`pp9V ILLEGAL WEAPONTYPE 9V`'  G>\j64D_*;w,,,,X#, G>[(g2R7pI -L' G>>>f2P.C8vUJyP.-'P.-wP.*rP.* G>  W% wJ,*J,a  G>k2>>>>`Q aK.( G>^(l/Z7MvVwF,*6-x0F,b.l/o/x$VF,b.l/o/y0'UT2K4GameLadder == none* G> q2l2_6S G!>p2`E+(- aK.( G>x/z43P8x/@/K.c-.x/zw.c-*@/9?9D.c->%c- u@/Y7c-l8 G> t2o2xKe G!>>c!>m2v0K6OE%wF,*F,K6v0s0UT2K4GameLadder == none( G>K.L.`6<K.L.o$q!_6-(- '-(-'L.9?,L.-'-(L.9?, G>|'t0e6Mb,)w.*. X/t0 G>>>s2/|5O`:wF,*F,%|5/@0x$T6/@0UT2K4GameLadder == none9= G>jk8WO$!r6Bd*-' G>@>>>>I,@>>({2H7c I,Physics:  <$I,pI,None Z$I,pI,Walking x$I,pI,Falling $I,pI,Swimming $I,pI,Flying $I,pI,Rotating $I,pI,Projectile $I,pI,Interpolating :$I,pI,MovingBrush W$ I,pI,Spider u$ I,pI,Trailer $ I,pI,Ladder $ I,pI,Karma I, G>@>>e(N0i66T4F6N0%1N0, G>B3L0G6IQ1L0L0l0 G>>>~2Q0F6U4zQ0(W0 c2Q0-6W0 G>X&},L78?-r*G6Pawn is none - returning },w},* P0w.},*G6ppWeapon:9W},Priority:9R.}, !D7P0},},A G>W0>>F3d0D67 bO-_wO-*Hw.O-*.O- dd0O-O- G>n(a0u6Z:i.v5a0&i.6f.i.a, G>H3j,}d Z-a}-J/j,#@Fj,(C-j,6C-6}-6j,9?k,am. C-wk,*k,Q6j,#?[-#DZ-a}-J/C-[-j,(.rZ-*k,am. C-[-.wk,*k,Q6j,#?Z-a}-J/C-[-j,(rZ-*k,am. C-[-wk,*k,Q6j,#? G>i.>>p8c0w7:wc0 /a3J0X0Bi,.X0uri,*i,-  -K0}>i,1Bh,&w.i,*.i, Z%.i,Zh,&9 h,&}i, 99h,&i,[* V1i, -g.'10\h,%D6 }}h,&-g.D6 -g. h,&h, G>E3e0l6Z<l.v5e0"l. 6f.l.a,g0 G>K3T0b8 T0}>T0 G>J0@-P7 @-w@-*w@-*a@-J0@-- -K07B-B-@-r*h,k0a h,k0,h,w.@-*.@- Z% G>>>I3H0w6[Zv5H0 7a,7a,&6Z07a,&a,H06f.7a,&a,% G>Ym0O6--m0 G>M3o0v5#]Jg-%Ag-7a,7|6Z0g-a,o0g-g- G>@>>g->>I7P3R6Z0o,TamikalJakobaIA=o,Tamikaa@=lJakobw*-o,l G>S">>dD8 | G>b)V3`8^y:u-%5u-d.+zu-(u-' G>u->>AQ7q(\6w0*0a6w*SwK*Ka_ G>K*f,z6C$f,%0m/;f,%@.-f,9?C@.H-hf,&p@.1p1f,%{b-H-p,H-b-9S9D9?f,9?f,f,f,%b-p00b-,H-pb-H-hp@.H-m/ G > iz0I7$ z0!w*$ G>H-@>>P->>]3~0a6HZ ur~0* rE/*P-P-99E/ ~7P-P-E/ P-9?,d#HCP- G>d3d/m6,rd/* rb,* z-a q- b, f/a6d/b,b,b, g/h/B1z-Ma b, իL?b,g/իb,h/z- f/z-$`6b,> G>X3_3a8[B o- G>@>>^3a3|7aá -P/ G>>>`3E1T6h]wK-%nK-7P,d9:6Z.K-P,E19:6[.K-P,G19:6V/K-P,K- G>>>f3K/L!'E@wK/*wK/*K/L'( G>K->> E.h7wE.* wE.B. LB.A..B.wA.*%A.>9?,m6E.A. E.B. G>b3R/V8sp],%^],7P,T9:6Z.],P,R/9:6[.],P,Q/^],}],7P,7P,],&6Z.],P,9=R/6[.],P,9=Q/6V/],P,T1 G> n3S/S88 S/S1Q1N1W/5S/%W/@? G >@>>i3>>j3>>g3W1}6lG-%iG-7P,_9:6Z.G-P,W19:6[.G-P,Y1AP,G-& G- G>k3>>_1]/N &]/%p9S]/_1#Z1 G > q3d-WP5Qd-%Hd-,>wd-*Ed-p.D>d-  G>l3r/y5/n7y/%zr/(j-%ij-7c,_|6j.j-c,r/y/6V0j-c,'j-( G>l 5 5I6DOM G>rm,n61U m,-s/-s/m, l5%|.m, l5&|.m, l5%}.m, l5&}.m, l5&h-m,l5,h-m, l5!i G >@>>j->>K+51 I6BR G>p3v.C6ڧzv. t,%Lt,7c,B|6j.t,c,v.Lt,7c,t,7c,t,&6j.t,c,v.6V0t,c,w1 G> GD0K7< D0x.9x.a/!3QD0.x. G>>>@>> ~t.k7J w_*_a/t.;_a/t._ t. G>v3N,p5XH,7G,7G,7G,&%6B/H,G,N,&6B/H,G,N,,6B/H,G,N,%6t/H,G,N,&6t/H,G,N,6x1H,G,9VN,~9VN,.6y1H,G,N, 6z1H,G,w_.*6{1H,G,9?_._-6|1H,G,9?w&6}1H,G,9?p-6~1H,G,N,N,-61H,G,--6A2H,G,N,-`N,-N, w.,_,K,%K,7,9?K,,9?|,&9?,{_,aB_,, aB_,K,,K,g%6F0H,G,9D9?|,&9?,.N,%6G0H,G,_,_,K,%K,7,K,,|,{_,aB_,, aB_,K,,K,x&6F0H,G,|,.N,&6G0H,G,_,K,%K,7l!6U/K,l!|,6C2H,G,6A'K,l!6D2H,G,9D6E'K,l!6E2H,G,9D6}&K,l!d.%d.76z!K,l!R{6o.H,G,aB6o.H,G,, aB6o.H,G,d.6z!K,l!d.K,g-Z"6L-H,G,ppJ2;R,w0R,p5H,N,|,_.U\, 6L-H,G,ppK2;~-O1O09S~-p5H,N,|,_.U6L-H,G,pM2; F,m" F,C# F,B# F,}" F,A# F,d"aB6L-H,G,i.3 0F,V#aB6L-H,G,N2 aC6L-H,G,O09S G>~3r,n6:r,-E0-E0r, l5!ir, l5!{r, l5!_r, l5!Ir, l5!jr, l5!\r, l5!] G >>>iI0Q85nI0 .I0 9? G>@>>@>>c.@>@4> J&V2k6g%-V2 7h.%`. c.%^c.7h.7`.`.c.h.c.,`. G >>>@>>{3P2{5F, {5P2 G>@>>>L,>E4R0s6ss,%s,d.v,`.s,v,"9:6h#v,j!,d-I2Y.9D9?6S#v,j!O'~,%~,7Z,~,Z,Y.@Z,~,&~,Z,Y.~,~,7Z,7Z,7Z,&7Z,&Z,Y.s,/7Z,R0Ov,%s,%hs,R0v,s,Z,s,=9?v, G>@>>a.@>I4>Z,>> O4F2k6cg%-F2 7z.%b. a.%^a.7z.7b.b.a.z.a.,b. G >>>>>Q4N4V6 ' G >>>z.P4@8( G>H4s.h8@1U.s.I+RF6s.U.9Ds6s.,-v1-Y,getMinimalEntryFeeFor =9SU.U. G>@>>v 57BI6CTF G>U.>>#41-A7a G2 G>R4`,b6Lp,%Revision upgrade to 1[,N/,KQ'>9?,S'>9?,x% ף<9?,M'33>9?,p%<M'9?, p,&p,&Revision upgrade to 2[,M'>9?,p%L=M'9?, p,,vp,,Revision upgrade to 3[,O/@?9?,2r1=9?,dp,,6p,,Revision upgrade to 4[,`,7o!&`,%z6N#`,o!Ao!`,&`,`,7j!&.`,%$z6@%`,j!Aj!`,&`,p,,p,,Revision upgrade to 5[,-[+ -P/ -L'^.F,V#-[+(COMPLETED CHAMPp,, G>](S.V %j/a0 S.KS.-'JwS. *S. a10/a0 ~.~.a/!U7~.q!f610 G>>>>X,> O.] `q1$5w.O.*.O.-'q!>[w.O.*.O.-q/'' G>>L,>[4E7G>@>>b4`1E6M`1f  G >\*J-|5g ^-%9=J- 0m"W, FC#W, \B#W, rA#W, }"W, d"W,c# V#W, J-, 7Q,J-, W,J-, Q,Y- 7W,%9=8^-7W,d,.c!7W,&W,Nd,.c!^-W,wd,*7d,R$%u,9D9?x,^-&J-&9:d,x-%u,9D9?u,9<d,x-u,9D9?u,9?7d,R$c/u, c/x,9D9?9D9?x,^-&J-&9?&9?7d,R$x,u,x,9D9?x,&9?7d,R$9=x,9=u,9= G >`->>c4I1s5D<E`-%<`-7f 2|`-f I1`-`- G >d4D.M67XD.%D.7f  6M/%M/7f Af D.M/7f D. G >h4_/X60o5^/s5_/2^/7f f _/ G >W,>>@>>>>iD1W6) f D1 G >@>>`4y-K6e D/%(y- *m"V, @C#V, VB#V, lA#V, }"V, d"V,c# V#V, y-, 7Q,y-, V,y-, Q,Y-7V,%(,D/7V,s-.c!7V,&V,Bs-.c!D/V,Ors-*(7s-R$& G >@>>p40E6M0Y  G >V,>>k->>>>q4}0s5D=Ek-%<k-7Y 2|k-Y }0k-k- G >r4r-M67Xr-%r-7Y  6A/%A/7Y AY r-A/7Y r- G >u4w/X60p5u/s5w/2u/7Y Y w/ G >@>>*}/{5s/kz}/X-f-i7X-%^,7X-Z^,X- w5A0^,X-AX-^,&*^,%^,7f-|9V^,f-}/^,f- w5A0^,f-*^,r* G >iu0W6) Y u0 G >@>>X->L,>{4p0E6Mp0q G >>L,>e->>|4i0s5D)Ee-%<e-7q2|e-qi0e-e- G >~4{-M67X{-%{-7q 6k.%k.7qAq{-k.7q{- G >\0@>>A5Y0X60\5U0s5Y02U07qqY0 G >X `0}5&p<-`06^0-XGame.JuggFemaleVoice<] g^0-XGame.JuggMaleVoicemX  G >@>>X_0W6)q_0 G >@>>A\,H6Fq..6S n, \,v/9=Q-\,-R7-6S7n,sQ-%\, \, Q-,Cr\,*$\,- -|6dn,, PlayerSkins.C.ppppBright6dn,_9SQ-Bq,.C. 'wq,*\,9C?9<\,,rq,*C.pp6dn,_9SQ-q,.C. ,-6]#n,S0pp6S n,_9SQ-n..S0 ,wn.*q.n.rq,*pppTeamSkin not found 9Vq, for 9V\,q,.6dn, %\,q,%\,.6dn, &\,q. G >@>>>>>>w,@>F5>@>>pF.H85 c)V-*7F.%7\-7V-w,%w,7V-|7F.%w,\-6w,V- -%-7F.|-F.6w,V-7\-\-6w,V- -w,1\- G!>I->>@>>B{/J8*1H.I-%G.%]G.7{/H.?I-IoG.{/G.H.9?%I-9D9?I-H.I-Ih0I- G!>A1@>>F->>@>>Q]06i +N.F-%M.%]M.7]0N.?F-MoM.]0M.N.9?%F-9D9?F-N.F-M{0F- G!>@>>N->>@>>lZ/d8)$X.N-%W.%]W.7Z/X.?N-HoW.Z/W.X.9?%N-9D9?N-X.N-HH1N- G!>S->>n-W5Z6 G >X5>i!>Y5>>>>@>>\5>i!>]5>>>>a/X8].S-%\.%]\.7a/].?S-No\.a/\.].9?%S-9D9?S-].S-NP1S- G!>m@>>|class xVehicleCTFGame extends xCTFGame; var(LoadingHints) private localized array VCTFHints; function bool AllowTransloc() { return false; } static function bool NeverAllowTransloc() { return true; } static function array GetAllLoadHints(optional bool bThisClassOnly) { local int i; local array Hints; if ( !bThisClassOnly || default.VCTFHints.Length == 0 ) Hints = Super.GetAllLoadHints(); for ( i = 0; i < default.VCTFHints.Length; i++ ) Hints[Hints.Length] = default.VCTFHints[i]; return Hints; } R`5L4B86a5.RXf  S7Y31You can't carry the flag in a Manta or a Raptor.|Sr6SJ7w]XInterface.MapListVehicleCTF{]VCTFz]VCTFF] Vehicle CTFB]wuLike traditional Capture The Flag, only adding vehicles into the mix! Only ground-based vehicles can carry the flag.U]UT2004Thumbnails.VCTFShots^]XGame.xVehicleCTFGame\]VCTF>>c5>i!>e5@>d5>@>>@>f5>@>n->g1h5q69' G >i5>i!>k5@>j5>@>>m5@>l5>@>n->>>a//============================================================================== // Phantom Teams, you will never face these, they are used as addition teams // in the phantom matches // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4TeamRosterPhantom extends UT2K4RosterGroup; k!n5`7o5Ck!5k.YmxGame.PhantomNecrisBlackLegionxGame.PhantomDarkPhalanxxGame.PhantomRawSteelxGame.PhantomBloodReaversv.">>R-//============================================================================== // Created on: 12/20/2003 // Checks all dying pawns for UDamage time, and spawns a new pickup if the pawn // still had time remaining // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UDamageRules extends GameRules; // This is called whenever a player is killed by another player // Check if the dying player had any UDamage time remaining function ScoreKill(Controller Killer, Controller Killed) { local xPawn Dying; if ( Killer != None && Killer != Killed && HasUDamage(Killed) ) { Dying = xPawn(Killed.Pawn); // If the player had UDamage time remaining, toss out another // UDamage pickup that is worth the remaining time if ( Dying != None && Dying.UDamageTime > Level.TimeSeconds + 3 ) ThrowUDamage(Killer, Dying); } Super.ScoreKill(Killer, Killed); } function bool HasUDamage(Controller Killed) { if ( Killed != None && Killed.Pawn != None && Killed.Pawn.HasUDamage() ) return true; return false; } function ThrowUDamage( Controller Killer, xPawn Killed ) { local vector tossdir, x, y, z; local UDamageReward Reward; if ( Killer == None || Killed == None ) return; // This chain of events based on the way that weapon pickups are dropped when a pawn dies // See Pawn.Died() Reward = Spawn( class'UDamageReward', , , Killed.Location ); // Find out which direction the new pickup should be thrown tossdir = GetThrowVector(Killer, Killed); Killed.GetAxes(Killed.Rotation, X,Y,Z); // Set the pickup's location to a realistic position outside of the dying pawn's collision cylinder Reward.SetLocation( Killed.Location + 0.8 * Killed.CollisionRadius * X + -0.5 * Killed.CollisionRadius * Y ); // Now apply the throwing velocity to the position of the pickup Reward.velocity = tossdir; // Since we are spawning this pickup on the server only, tweak the pickup's replication-related properties // so that the new pickup appears for clients Reward.InitDrop(Killed.UDamageTime - Level.TimeSeconds); } // based from the way weapons are thrown when a player dies ( see Pawn.Died() ) function vector GetThrowVector( Controller Killer, xPawn Killed ) { local vector v; if ( Killer == None || Killed == None ) return v; // Get a vector indicating direction the dying pawn was looking v = Vector(Killed.GetViewRotation()); // Adding coordinates to the directional vector v = v * // Clamp the "aiming spot" to a point that is in the dying pawn's point of view (I think) ((Killed.Velocity Dot v) // this controls how far away we're aiming for + 100) + // And this controls how high to aim the throw Vect(0,0,200); return v; } >r5>>s5>>>c!>Y'//============================================================================== // Created on: 12/29/2003 // A UDamage pickup that has been dropped by a dead player // When picked up, gives player any UDamage time that was left when the original player died // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UDamageReward extends UDamagePack; var() float FadeTime; // This is a modified version of InitDroppedPickupFor - since UDamagePacks don't have associated inventory, // we don't care about that here....but I *do* need to know how much time is remaining to the UDamage charge function InitDrop( float RemainingCharge ) { // This is when the original UDamage time will expire FadeTime = RemainingCharge + Level.TimeSeconds; // We're falling SetPhysics(PHYS_Falling); GotoState('FallingPickup'); // Only need to know about me if I'm in your area bAlwaysRelevant = false; // set this flag to indicate that this pickup is not on a pickup base (and thus should be destroyed when picked up) bDropped = true; bIgnoreEncroachers = false; // handles case of dropping stuff on lifts etc bIgnoreVehicles = true; // Bots care less about pickups with less udamage time remaining MaxDesireability *= (RemainingCharge / 30); // TODO - what does these do (or why do we need them in dropped pickups) NetUpdateFrequency = RemainingCharge; bUpdateSimulatedPosition = true; bOnlyReplicateHidden = false; LifeSpan = RemainingCharge * 2; } // Simple overrides that modify the amount of UDamage time given to a pawn that runs over this pickup auto state Pickup { function Touch( actor Other ) { local Pawn P; local float NewTime; if ( ValidTouch(Other) ) { NewTime = FadeTime - Level.TimeSeconds; P = Pawn(Other); // Add this pickup's remaining time to any UDamage time the pawn already had if ( xPawn(P) != None ) NewTime += Max( xPawn(P).UDamageTime - Level.TimeSeconds, 0); P.EnableUDamage(NewTime); AnnouncePickup(P); SetRespawn(); } } function BeginState() { if ( bDropped ) { AddToNavigation(); SetTimer(FadeTime - Level.TimeSeconds, false); } } } state FallingPickup { function BeginState() { SetTimer(FadeTime - Level.TimeSeconds,false); } } >v5>i!>>>J//============================================================================== // The new Sunblade team // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class TeamNewSunblade extends UT2K4TeamRoster; >y5>i!>>>S2T2N/[V T2-i- G f!w5q72{5hof!>>>R//UT2004 weapon base with new staticmesh //to automatically convert all xWeaponBases in a level to have this mesh, use the editor console command "NewPickupBases" class NewWeaponBase extends xWeaponBase; V}5o7~5V;I:5l@>>m//UT2004 superhealth base with new staticmesh //to automatically convert all SuperHealthChargers in a level to have this mesh, use the editor console command "NewPickupBases" class NewSuperHealthCharger extends SuperHealthCharger; >g1X2U,U6!z%M,TRADE7O,7O,&6\/7O,&O,b06Y/7O,&O,&M,6T/7O,&O,,M,U,y5&M,T,M-f!&M, wM-*T,M-Some Nali cow ate the enemy team classS,%GS,7T,=|S,T,,M,AT,S,&GS,U,C6&M,T,S,U,`.,M,S,6h#S,U,j!$d6I%S,U,j!U,H#9D9?6S#S,U,j!j0z%M,UNTRADE7O,7O,&6\/7O,&O,X26Y/7O,&O,&M,6T/7O,&O,,M,U,K0,M,U,y5&M,T,M-f!&M, wM-*T,M-Some Nali cow ate the enemy team class7T,%7T,7T,&7T,&T,,M,S,U,`.,M,S,6h#S,U,j!$d6I%S,U,j!U, a.&M,U,C6&M,T, G m5N8A6.mX>>Y//UT2004 health base with new staticmesh //to automatically convert all HealthChargers in a level to have this mesh, use the editor console command "NewPickupBases" class NewHealthCharger extends HealthCharger; >@>FB6W7D6jh=F32"$ff>I:5 @>>@>n->R //============================================================================== // Created on: 12/20/2003 // All functionality is handled by the game rules class 'UDamageRules' // Gamerules cannot appear in mutator lists, however, so I use a mutator class // to add my gamerules class to the game // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MutUDamageReward extends Mutator; event PostBeginPlay() { Super.PostBeginPlay(); if ( !bDeleteMe ) Level.Game.AddGameModifier(Spawn(class'UDamageRules')); } F6V4x62G6 jW3}Zs  LMUDamage RewardB]NLAny remaining UDamage powerup is thrown from players when they are fragged.>>@>>Nclass MutFastWeapSwitch extends Mutator; auto state Startup { function bool CheckReplacement( Actor Other, out byte bSuperRelevant ) { bSuperRelevant = 0; if ( GameReplicationInfo(Other) != None ) { GameReplicationInfo(Other).bFastWeaponSwitching = true; GotoState(''); } if ( xPawn(Other) != None ) xPawn(Other).bCanBoostDodge = true; return true; } } >U1@6{,S6e {,-i-W{,-aB{,p;{,[#{,{,{,[# G I6]4F72K6@9jW- =1  V= WeapSwitchL] UT2003 StyleB]76UT2003 style fast weapon switching and boost dodging.>>M6>>>>n/J6t1p5q"n/t1@2Q2L2B2 G >{//============================================================================== // Single Player Challenge Game code // 1 vs 1 challenge against the team leader // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class ManoEMano extends ChallengeGame; >D //warning message for players in an IonCannonKillVolume that they're about to be vaporized class IonCannonKillWarning extends CriticalEventPlus; var() localized string CountDownTrailer, WarningString; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if (Switch > 0) return Switch$default.CountDownTrailer; else return default.WarningString; } static function GetPos(int Switch, out EDrawPivot OutDrawPivot, out EStackMode OutStackMode, out float OutPosX, out float OutPosY) { Super.GetPos(Switch, OutDrawPivot, OutStackMode, OutPosX, OutPosY); if (Switch == 0) OutPosY = 0.75; } >N7//if a pawn of a certain class stays within this volume for too long, an ion cannon from space blows it away class IonCannonKillVolume extends PhysicsVolume; var() class TargetClass; var() bool bAffectsFlyingPawns; //does this volume kill pawns that can fly? var() int CountdownTime; //how long pawn has to get out var() class IonEffectClass; var array Targets; var int TimeRemaining; event PawnEnteredVolume(Pawn Other) { Super.PawnEnteredVolume(Other); if (Other != None && (Other.Controller != None) && ClassIsChildOf(Other.Class, TargetClass) && (!Other.bCanFly || bAffectsFlyingPawns)) { Targets[Targets.length] = Other; if (PainTimer == None) { TimeRemaining = CountdownTime; PainTimer = spawn(class'VolumeTimer', self); } else TimeRemaining = Min(CountdownTime, Max(3, TimeRemaining)); if (PlayerController(Other.Controller) != None) PlayerController(Other.Controller).ReceiveLocalizedMessage(MessageClass, 0); } } event PawnLeavingVolume(Pawn Other) { Super.PawnLeavingVolume(Other); RemoveTarget(Other); } function RemoveTarget(Pawn Other) { local int i; for (i = 0; i < Targets.length; i++) if (Targets[i] == None || Targets[i] == Other) { Targets.Remove(i, 1); i--; } if (Targets.length == 0 && PainTimer != None) PainTimer.Destroy(); } function TimerPop(VolumeTimer T) { local Actor A; local Pawn P; local bool bFound; if (T != PainTimer) return; foreach TouchingActors(TargetClass, A) { P = Pawn(A); if (P.Controller == None || (P.bCanFly && !bAffectsFlyingPawns)) { RemoveTarget(P); continue; } if (TimeRemaining > 1) { if (PlayerController(P.Controller) != None) { PlayerController(P.Controller).ReceiveLocalizedMessage(MessageClass, 0); PlayerController(P.Controller).ReceiveLocalizedMessage(MessageClass, TimeRemaining - 1); } } else if (TimeRemaining == 1) SpawnEffects(P.Location); else if (TimeRemaining < 1) P.Died(None, class'DamTypeIonVolume', P.Location); bFound = true; } if (TimeRemaining == 0) PlayGlobalSound(sound'WeaponSounds.redeemer_explosionsound'); else if (TimeRemaining == 1 && bFound) PlayGlobalSound(sound'WeaponSounds.TAGRifle.IonCannonBlast'); if (bFound || TimeRemaining <= 1) TimeRemaining--; } function SpawnEffects(vector EffectLoc) { local IonEffect IonBeamEffect; local Actor Other; local Vector HitLocation, HitNormal, Top, CP; Other = Trace(HitLocation, HitNormal, EffectLoc + vect(0,0,10000), EffectLoc, false); Top = EffectLoc; Top.Z = FMax(HitLocation.Z, EffectLoc.Z + 2000); IonBeamEffect = Spawn(IonEffectClass,,, Top); if (IonBeamEffect != None) IonBeamEffect.AimAt(EffectLoc, Vect(0,0,1)); CP = vect(1500,0,0); Other = Trace(HitLocation, HitNormal, Top + CP, EffectLoc, false); if ( Other == None ) { IonBeamEffect = Spawn(IonEffectClass,,, Top + CP); if (IonBeamEffect != None) IonBeamEffect.AimAt(EffectLoc, Vect(0,0,1)); } Other = Trace(HitLocation, HitNormal, Top - CP, EffectLoc, false); if ( Other == None ) { IonBeamEffect = Spawn(IonEffectClass,,, Top - CP); if (IonBeamEffect != None) IonBeamEffect.AimAt(EffectLoc, Vect(0,0,1)); } } function PlayGlobalSound(sound S) { local Controller C; for (C = Level.ControllerList; C != None; C = C.NextController) if (PlayerController(C) != None) PlayerController(C).ClientPlaySound(S); } Q6D3u5@` 2R6 8bQ 3},e u,eMMMhhhh uh uhhh׿e]hhhhh u{7c7" M8c $?|6$DgW2>>:class DamTypeIonVolume extends DamageType abstract; >H2N6r.w5w7 rr.*'r.^.r.F,C# G >N//============================================================================== // Base class for custom ladders // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class CustomLadderInfo extends Object abstract; var string LadderName; var localized array EntryLabels; var array Matches; /** called when the game was a challenge game and was not one of the default special events. Fill the GUIPages array with pages you want to be opened after this special event has been processed. Yes I know this method sucks, but it was the best I could come up with without a lot of changes in the current system. */ static function HandleSpecialEvent(UT2K4GameProfile GP, array SpecialEvent, out array GUIPages) { } /** Handle match requirements, return false if a requirement has not been met */ static function bool HandleRequirements(UT2K4GameProfile GP, array SpecialEvent, out array GUIPages) { return true; } /** will be called after the default info has been added to the history record. override this to change or append additional into. */ static function AddHistoryRecord(UT2K4GameProfile GP, int offset, GameInfo Game, PlayerReplicationInfo PRI, UT2K4MatchInfo MI) { } >>>S2T6@1y.}'@1-i- G >V//============================================================================== // Custom Ladder class: Onslaught // // Written by Michiel Hendriks // (c) 2003, 2004, Epic Games, Inc. All Rights Reserved //============================================================================== class CLOnslaught extends CustomLadderInfo; >>>^1W6l,Y6l,Il,-i-l,l,[#l,-Z"'l,H#l,[#I+l,R,l,Y0J1 G X,X6X72[6f:$X,j}t6] Onslaught\7YY Hit & Run RoadkillDrive-by shooting Road warriorCore meltdownVehicle slaughter4Y u6v6w6x6y6z6>>x1//============================================================================== // Single Player Challenge Game code - base class // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class ChallengeGame extends Object abstract; /** name of this challenge */ var localized string ChallengeName; /** description of the challenge */ var localized string ChallengeDescription; var localized string msgGotChallenged, msgWeChallenged, msgFor; /** the challenge configuration menu */ var string ChallengeMenu; struct TriString { var string GUIPage; var string Param1, Param2; }; /** called from GameProfile.RegisterGame() before anything is processed */ static function PreRegisterGame(UT2K4GameProfile GP, GameInfo currentGame, PlayerReplicationInfo PRI) { } /** called from GameProfile.RegisterGame() after everything is processed */ static function PostRegisterGame(UT2K4GameProfile GP, GameInfo currentGame, PlayerReplicationInfo PRI) { } /** start this challenge */ static function StartChallenge(UT2K4GameProfile GP, LevelInfo myLevel) { GP.SpecialEvent = ""; GP.bIsChallenge = true; GP.Balance -= GP.ChallengeInfo.EntryFee; GP.ChallengeGameClass = default.class; GP.StartNewMatch ( -1, myLevel ); } /** called when the game was a challenge game and was not one of the default special events. Fill the GUIPages array with pages you want to be opened after this special event has been processed. Yes I know this method sucks, but it was the best I could come up with without a lot of changes in the current system. */ static function HandleSpecialEvent(UT2K4GameProfile GP, array SpecialEvent, out array GUIPages) { } /** Handle match requirements, return false if a requirement has not been met */ static function bool HandleRequirements(UT2K4GameProfile GP, array SpecialEvent, out array GUIPages) { return true; } /** will be called after the default info has been added to the history record. override this to change or append additional into. */ static function AddHistoryRecord(UT2K4GameProfile GP, int offset, GameInfo Game, PlayerReplicationInfo PRI, UT2K4MatchInfo MI) { if (GP.bGotChallenged) GP.FightHistory[offset].MatchExtra = default.msgGotChallenged; else GP.FightHistory[offset].MatchExtra = default.msgWeChallenged; if (GP.ChallengeVariable != "") GP.FightHistory[offset].MatchExtra @= default.msgFor@GP.ChallengeVariable; } /** Return true when this challenge game can be used to challenge the player */ static function bool canChallenge(optional UT2K4GameProfile GP) { return true; } /** return true when the team mates should be payed */ static function bool payTeamMates(UT2K4GameProfile GP) { return true; } /** Return true when a team mate _may_ be injured, this does not mean a team mate will be injured. By default only challenged that where initiated by the player may have a team mate injured. */ static function bool injureTeamMate(UT2K4GameProfile GP) { return !GP.bGotChallenged; } >Gclass BombTrail extends SpeedTrail; simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if ( bNetNotify ) PostNetReceive(); } simulated event PostNetReceive() { local Actor OldBase; if ( Base != None ) { OldBase = Base; SetLocation(Base.Location); SetBase(OldBase); SetRelativeLocation(vect(0,0,0)); bNetNotify = false; } } >Y-@>_6>@>>jF//============================================================================== // Single Player Challenge Game code // A blood rite challenge is a challenge against an whole team. The prize is a // exchange of team mates. // // Written by Michiel Hendriks // (c) 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class BloodRites extends ChallengeGame; /** menu to display when we lost out team mate */ var string UntradeMenu; /** The trade menu */ var string TradeMenu; /** entry fee multiplicator of the bot's price */ var float ChalFeeMultiply; /** We have two special events: TRADE and UNTRADE Both have the arguments In case of TRADE you get a player to add to your team, unless your team is already full, then you have to remove one firts. UNTRADE will just give you the message that a team mate has been removed from your team. */ static function HandleSpecialEvent(UT2K4GameProfile GP, array SpecialEvent, out array GUIPages) { local class ETI; local array NewTeamRoster; local int i; if (SpecialEvent[0] == "TRADE") { GUIPages.length = GUIPages.length+1; GUIPages[GUIPages.length-1].GUIPage = default.TradeMenu; GUIPages[GUIPages.length-1].Param1 = SpecialEvent[1]; GUIPages[GUIPages.length-1].Param2 = SpecialEvent[2]; // remove the player from that team if (!GP.GetAltTeamRoster(SpecialEvent[1], NewTeamRoster)) { ETI = class(DynamicLoadObject(SpecialEvent[1], class'Class')); if (ETI != none) NewTeamRoster = ETI.default.RosterNames; else Warn("Some Nali cow ate the enemy team class"); } for (i = 0; i < NewTeamRoster.length; i++) { if (NewTeamRoster[i] ~= SpecialEvent[2]) { NewTeamRoster.remove(i, 1); break; } } GP.SetAltTeamRoster(SpecialEvent[1], NewTeamRoster); // update bot stats i = GP.GetBotPosition(SpecialEvent[2]); if (i > -1) { GP.BotStats[i].Health = 100; GP.BotStats[i].TeamId = -1; // refund entry fee GP.Balance += GP.BotStats[i].Price*default.ChalFeeMultiply; } } else if (SpecialEvent[0] == "UNTRADE") { GUIPages.length = GUIPages.length+1; GUIPages[GUIPages.length-1].GUIPage = default.UnTradeMenu; GUIPages[GUIPages.length-1].Param1 = SpecialEvent[1]; GUIPages[GUIPages.length-1].Param2 = SpecialEvent[2]; // remove the player from our team GP.ReleaseTeammate(SpecialEvent[2]); // add it to the enemy team if (!GP.GetAltTeamRoster(SpecialEvent[1], NewTeamRoster)) { ETI = class(DynamicLoadObject(SpecialEvent[1], class'Class')); if (ETI != none) NewTeamRoster = ETI.default.RosterNames; else Warn("Some Nali cow ate the enemy team class"); } if (NewTeamRoster.length == 0) { NewTeamRoster.length = NewTeamRoster.length+1; NewTeamRoster[NewTeamRoster.length-1] = SpecialEvent[2]; // update bot stats i = GP.GetBotPosition(SpecialEvent[2]); if (i > -1) { GP.BotStats[i].Health = 100; GP.BotStats[i].TeamId = GP.GetTeamPosition(SpecialEvent[1]); } } GP.SetAltTeamRoster(SpecialEvent[1], NewTeamRoster); } } /** when we where challenged the SpecialEvent logic goes the other way around */ static function PostRegisterGame(UT2K4GameProfile GP, GameInfo currentGame, PlayerReplicationInfo PRI) { // do the switch if (GP.bGotChallenged) { if (!GP.bWonMatch) GP.SpecialEvent $= ";"$GP.ChallengeInfo.SpecialEvent; else { // remove the UNTRADE GP.SpecialEvent = repl(GP.SpecialEvent, GP.ChallengeInfo.SpecialEvent, ""); } } } static function AddHistoryRecord(UT2K4GameProfile GP, int offset, GameInfo Game, PlayerReplicationInfo PRI, UT2K4MatchInfo MI) { super.AddHistoryRecord(GP, offset, game, PRI, MI); } static function bool canChallenge(optional UT2K4GameProfile GP) { if (GP == none) return true; return GP.completedLadder(GP.UT2K4GameLadder.default.LID_TDM); } static function bool payTeamMates(UT2K4GameProfile GP) { return ! GP.bGotChallenged; } static function StartChallenge(UT2K4GameProfile GP, LevelInfo myLevel) { GP.SpecialEvent = ""; if (GP.bGotChallenged) GP.SpecialEvent = GP.ChallengeInfo.SpecialEvent; // so you can't chicken out GP.bIsChallenge = true; GP.Balance -= GP.ChallengeInfo.EntryFee; GP.ChallengeGameClass = default.class; GP.StartNewMatch ( -1, myLevel ); } >>c!>O1c6U6 G >d6>i!>f6@>e6>@>>@>g6>@>n->b6i6q6f' G >j6>i!>l6@>k6>@>>n6@>m6>@>n->>>h6p6p5# G >q6>i!>r6>>s6>>t6>>>c!S.YONS-FrostBite ONS-Primevalj5" k5$A]"!;xGame.UT2K4TeamRosterWeak;least$@$?X]?TeamScreen=true"]Onslaught.ONSOnslaughtGame>S.Y ONS-Dawn ONS-Torlanj5"k5$A]"!;xGame.UT2K4TeamRosterEasy;least$@$?X]?TeamScreen=true"]Onslaught.ONSOnslaughtGame>S.Y&ONS-ArcticStrongholdONS-Crossfirej5"k5$A]! ;xGame.UT2K4TeamRosterMid;least$ @$?X]?TeamScreen=true"]Onslaught.ONSOnslaughtGame>j5"pk5$A] ONS-Dria]! ;xGame.UT2K4TeamRosterMid;least$0@$?X]?TeamScreen=true"]Onslaught.ONSOnslaughtGame>j5"Xk5$A]ONS-RedPlanet]$#;xGame.UT2K4TeamRosterStrong;least$@@$@X]?TeamScreen=true" ]Onslaught.ONSOnslaughtGame>j5"@k5$A]ONS-Severance]$#;xGame.UT2K4TeamRosterStrong;least$@@$@X]?TeamScreen=true" ]Onslaught.ONSOnslaughtGame>>>>>>>}6>>B7>>C7>>v@>>~6>>|6>>f6y<Cz~6%8~67.6~6'~6}6  v<6q}6%}67(6}66!> G>^@7v<g.\|6%S|6,.|6n%!>I|6n%@7|6|6 G >>>L7H7@=.|lJakob|lGorge|lMalcolm |lXan|lBrock|lGaargod|lAxon G>>>G7J7B=;* -(F7C=wF7*wF7*F7-o,F7A=o,Tamika(lF7@=lJakob(' G>F7>>>>hK7A=#&|o,Tamika|o,Sapphire|o,Enigma|o,Cathode|o,Rylisa|o,Ophelia|o,Zarina G>O7>>M7>>>>>>T7>>X>>>>>>~>\7k8f=@ V7p`܆hW=W=W=W=W=W=W%Y`7\=rS]=>Y7g=@W7-eW%Y a7b7c7d7\=rS]=>[7d=@X7nW%Y]7^7_7\=rS]=>>Iclass WaterSplash extends Emitter; #exec TEXTURE IMPORT NAME=xCausticRing2 FILE=TEXTURES\CausticRing2.bmp GROUP=Water Alpha=1 DXT=5 #exec TEXTURE IMPORT NAME=xSplashBase FILE=TEXTURES\SplashBase.tga GROUP=Water Alpha=1 DXT=5 #exec TEXTURE IMPORT NAME=xWaterDrops2 FILE=TEXTURES\WaterDrops2.tga GROUP=Water Alpha=1 DXT=5 >aP7e=T\P7&r.P7* Y.P7-R7# G>(class BulletSplash extends Emitter; >Mclass WaterRing extends Emitter; function PostBeginPlay() { local float F; Super.PostBeginPlay(); if ( Instigator != None ) { F = (70 + 30*FRand()) * sqrt(Instigator.CollisionRadius/25); Emitters[0].StartSizeRange.X.Min = F; Emitters[0].StartSizeRange.X.Max = F; Emitters[0].StartSizeRange.Y.Min = F; Emitters[0].StartSizeRange.Y.Max = F; Emitters[0].StartSizeRange.Z.Min = F; Emitters[0].StartSizeRange.Z.Max = F; } } Z=O=M=SK=c=P=Su&:5RL=Y7F=$H*H>F=$L?H*HX>F=$?H*H>N="I=Y1F=$H=$L>>F=$>H=$333?>F=$?H=$>>Q=ZG=DF*JQN$@M$@>I*JQN$BM$B>K*JQN$BM$B>>a=:5 #< #<?J=$@EPR=JQN$L?M$L?>U=ZG=DF*JQN$ M$ B>I*JQN$ M$ B>K*JQN$pBM$C>>>O=M=ST=V=W=SK=P=SY=u&:5HL=Y7F=$H*H>F=$L?H*HljJ>F=$?H*H>N="^=ZG=DF*JQN$M$>I*JQN$M$>K*JQN$M$pA>>S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y!F=$H=$>F=$?H=$33?>Q=ZG=DF*JQN$ AM$A>I*JQN$BM$B>K*JQN$BM$B>>J=$CPr7[="X="R=JQN$?M$?>U=ZG=DF*JQN$M$A>I*JQN$M$A>K*JQN$BM$B>>h=ZG=DF*JQN$M$Q>>I*JQN$M$Q>>K*JQN$M$>>>O=b=M=ST=V=W=SK=P=SY=u&:5 L=Y%F=$H*H>F=$?H*H>_=$?N=" S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y1F=$H=$L>>F=$?H=$?>F=$?H=$?>Q=ZG=DF*JQN$AM$A>I*JQN$BM$B>K*JQN$BM$B>>J=$CPq7[="X="R=JQN$?M$?>U=ZG=DF*JQN$M$A>I*JQN$M$A>K*JQN$BM$B>>>Z=O=M=ST=V=W=SK=P=SL=Y7F=$H*H>F=$?H*H>F=$?H*H>N="`=ZG=DF*JQN$M$=>I*JQN$M$>K*JQN$M$>>S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y!F=$H=$>F=$?H=$?>Q=ZG=DF*JQN$BM$B>I*JQN$BM$B>K*JQN$BM$B>>J=$BPs7R=JQN$?M$?>>Z=O=M=ST=V=W=SK=P=SL=Y7F=$H*H>F=$?H*H>F=$?H*H>N="`=ZG=DF*JQN$M$=>I*JQN$M$>K*JQN$M$>>S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y!F=$H=$>F=$?H=$?>Q=ZG=DF*JQN$AM$B>I*JQN$BM$B>K*JQN$BM$B>>J=$BPs7R=JQN$L?M$L?>>Z=O=M=SK=c=P=Su&:54L=Y7F=$H*H>F=$L?H*HX>F=$?H*H>N="I=Y1F=$H=$L>>F=$>H=$333?>F=$?H=$>>Q=ZG=DF*JQN$@M$@>I*JQN$BM$B>K*JQN$BM$B>>a=:5 #< #<?J=$@EPR=JQN$L?M$L?>U=ZG=DF*JQN$M$A>I*JQN$M$A>K*JQN$BM$ C>>>O=M=ST=V=K=P=SY=u&:54L=Y7F=$H*H>F=$L?H*H>F=$?H*H>^=ZG=DF*JQN$M$>I*JQN$M$>K*JQN$M$pA>>S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y!F=$H=$?>F=$?H=$L?>Q=ZG=DF*JQN$ AM$A>I*JQN$BM$B>K*JQN$BM$B>>J=$HBPr7[="X="R=JQN$L?M$L?>U=ZG=DF*JQN$M$>I*JQN$M$>K*JQN$HBM$B>>>O=b=M=ST=V=W=SK=P=SY=u&:5L=Y%F=$H*H>F=$?H*H>_=$?N=" S=ZG=DF*JQN$M$?>I*JQN$M$>K*JQN$M$>>I=Y1F=$H=$L>>F=$?H=$?>F=$?H=$?>Q=ZG=DF*JQN$AM$A>I*JQN$BM$B>K*JQN$BM$B>>J=$CPq7[="X="R=JQN$?M$?>U=ZG=DF*JQN$M$A>I*JQN$M$A>K*JQN$BM$B>>>RO8N8I>6 e7Q{RXfȊ]Нy-Pв]Нввy-P  h1M>= Allow ZoomL>]%$Instagib rifles have sniper scopes.|Sr6SO>]xGame.InstagibMutatorF] Instagib CTF^]XGame.InstagibCTF\]ICTF>>>>n7>>y7>>u7>>H8@>>f7>>>>P8@>>o7>>k7>>>H>*H@>B>D>F>A>"E>"G>"C>"> A @UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU+mf,1UU% ۃ]!UUWTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU.mX m1U .MiMBAUI$H$AUWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU9I$!5UUU p$I$TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIɑU1=<1U^X^)$I$AUUU$I$AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$UUUI$I$AUUWh$I$A_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUUI$oUUU.XuX&R9AK$H$AWWWWIə!UU3  IJUU_xI$UUUI$I$AUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU+MXM1UI$H$AUWWWI$E)UUU I$N'UUUVUUUUəəU+mu9A/+XBA/-=1WV\X 6b[-؂UW2͠ lIJrUU*XM`1UUH$I$AWWUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!$I$AUUUUUUUA1ɟ$R UU=ذm!TWUUUUUUUUUUɐ$I$AUUU I$UUUə5-l9^X*6hӒi1U.0&&1'W|'|$VTVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,mf,1UU%)I:C?1U{`.mФ9UUmۂ!UUU\56`hb(IJU55^I$}> cUW^xI$I$AUUUWUUUU I$IUUUI$>!UUU\Iə!UU*۔d9UU+,1U%'|'XWVTH$I$AWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIIAU* ˠ 1{b{`9 MkA Gm['Z{^\,7GZBpx^I~t׎sU 5,B_\\W6mf,IJUU5BI$9RUUp+mЄe1UU*6`hh1U%O'xUVTI$I&AUUU^UUUUUUUUUUUUUUUUbcaE)UUC,mۊRX_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUlI$5UUjp'I$\WUU=s?BA s} IĂU wUU-b$MkAU~" ؂1\UU\,y9AGyaF>Z-{-eFM01W^3f,IJUU52 ۂ]9UUW\4jCa95UUK'I$Rx_UUXgmUUUK$I$AUUUAɛɛ$IJ5UB}'}$IJ^\^UUUUUUUUUUUUUm6d,E)UUU5I$>E)UUU\UUUUUUUUUUUUUUUUUUUUUUUU16`hjh1U%O'x'UVTVUUUU,6`hb1U%5=ؕ1UWV\CyyIJ FO$}>RWW^X_9I$s-UU|}ɛA.5Ur'|QA\\^Cy&ZA5\R u c%b}' cA^W^3KpBA5}}'} A^W W.MkAu4-ӴfIJUWI!UU1 1UU^X3m5IJUU- ۃ]!UUWT.6`hb9U%5Mؑ!UWTTUUUU@bh6`IJ5UUJr'I$IJ\^UUUUUUI$IAUUUI$I&AUUU_UUUUUUUU2mf1UU%$|'!UUWTH$I$AWUUUUUUUb#6f1UNyZA\ѿ{E)VWB`ݎRAU,h1^X^ I$NUUU\IۧlMkACh{ZA\WyAU! OЈ# c|^xE>Zp_] Ir? U_ hB'oQ\^4N>j9zX0f-!U8m?^_{AW]k2X MIJUU+MXM1W-h09%UUp'O$!TWUUUUUUUUUUUUUUUUUU6f#6h,!54 Ͱ IJAWXr_UUUUUUUU9I$!5UUU p$I$TUUUUUUUUUUUUUUUŖ$I$AUUU3ЄPchIJAu%*眆1'6,2hBA5V\xΟϑ!Ta/v Mk!퍋 .۔ 9X\x/wɝ$UA UUMkE)\|fla{551ItnIJU/'9C`\WMO_Z>hC>{\XZOI$MkAuUUH$I$AVWUU)$I$AUUUUUUUIɑU1=<1U^X^UUUUUUUUUUUU1jh6`ۆ1%UU<ذm!\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU $IAUUϗE)C,ZA^\\WI$I$AUUU`I$sA UU^sMkAz J&RUUr 7UU+q/{lIJ(a @A's \{;쁒!~w͡E)B&h'RzXX_I$I$AUUUW,6`hb1U%5=ؕE)UWV\UUUUI$I$AUUU`$I$A_UUUUUUUI$IAUUUI$I$AUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU56d,IJՕ55IR۴ӜU7|I$}QAUUV|BIRU--nj(O c5ו?oP?>-{xhX5! ,r=A\x5٨dhBA\d߉w c5-,N{{9AW6MXџZ575MIJWV\\bca!UU4MZ 5IJA^% ۄ!UUVTUUUUUUUU3mЄIJUU1f&1%W|'|$VTVUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUUI$IAUUUUUUUII$AU1ڶN1b{U{I$A5UUhͶ<U U%UqVbQ9ּHu2TU c_j %5 B$HP='*\} 3ϙ!X^5f|>{AV\LPZ: W[YR??dtB>is^Z8&IR_U VI$~> cUU_x9!%UUz$I$TUUUUUUUacb+1U[yi#> cApX@N1ZAW O'x'!UWTWUUUUUUUUUUUUUUUUI$IAUUUI$I&AUUU^PɛysMkA55/>Wxp^L$H$AWWWU[I1MkAU 4-&,IJUW7iI[MkAUU6MI's c@UW^A)jZAuH/I$ZA UUksA QArpp4yBA^55W /~> c!-W] _5a Mk!X/}=71bu^ ϑxy c75&O~b:1^_{:vIJ!t{A[ y< MkuW O$}'1UUWTUUUU I$UUU'I$!XUUU)$I$AUUUH$I$AWUUUUUUUUUUU0MXM1UUUUUBɛɛ$IJ5UB}'}$IJ^\^UXbm! UUU'I$!XUUU*mf,1UU%'}'!UWTzɛxA5np'{A<\VQ!7I` cUUKty ZA^W 71rIJAUW\6 hIJ㝗m s[/{!_}z`KwaRwZ=+=m{E)%tM?>^ZXb1j׎sy#n:{(M#09UC~܊RAWANn^[AIJAWh?{${A/W)x'~$9TVWUUUUUUUUUUUUUUUUUUUUUUUUUUUUU$I$AUUUUUUUUUUUUUUUUUUUUUUU9I$!5UUU|əVU5yRBA5-p]ك !TTWUUUUU/ɛ|1 ՕP'H c}t">@3Q^Xpb(M0c1UՕO9WZA7>o ${oh2'}$QA\^WUbIUUU?I$!bUUUA6`hb,RU%%-"h@B5VVTMk!mm-ۂa!VUWI$!UUU, I$N'UUUVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUU2 1UU{bUUUUUUUU16dhjh1յ%@@!XVTWUUUUI$IAUUUɑ!UA~R_Ջ ']ӜE)UUx'VTVPI$ c?UUb'I$sAxWUUH$I$AWUUUUUUUm6d,E)UU55 KפRA]hOL{AUuG'Sɝ$Z -U3VaCIJAUAsA'RA..Wك E)TTWUI$IAUUUI$I$AUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I$AUUUmbUUUUUUUUUUUI$I$AUUUH$I$AWUUUIɑ1UwI&{կRO'p"' cAUV\\nI7wBsA- m_?N$Ab_WWH$I$AWUUUbI܉XsAU55my>3>s]zxx,mf,1UU%*I:C?1U{`?bh0 IJ5UWD4mR^UUa|IsA}UUN$~>!UUU\I$I$AUUUh$I$A_UUUIIAUO}&w cAս=]O$}MkAUWV\+m6-1UU.I$|'!UUWTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$ɟ!UUU5 I$OUUU| @UUU)I$1UUUضm!\UUU+I$BUUUBOIZAU55%-X11UW,6 ,:@IJA55W5P!UUU\UUUUBI)ZAUu+ 1UU{bAEs?IZAs]U* j1UU^ I$N'UUUTUUUUUUUUUUUUUUUU1mЄu1UUI$M$AUUWWI$IAUUUI$I&AUUU_+6`hbh1U%O'x'UVTVUUUUUUUU6jca!UU+؃>A_^x\NIIJյ5Z KCMkzXZ*-1VW^XUUUUUUUUUUUUUUUU'I$UUUH$I$AWUUUəəU3 ͠ IJAWXr]ɐ$I$AUUUH$I$AWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUU+ L1UU{bI$I$AUUUWUUUUjm!5UUUCmۆ17UUU 'I$1\UUUI$I$A5UUUIUUU'I$!\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUŒ$I$AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I$AUUU[SMkA% ّ=؆1WTTWUUUUUUUUUUUUUUUUUUUU3f,jCB553]<BW\\_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU1MXM1UI$H$AUWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUU$I$AUUUH$I$AWUUUUUUUUUUUUUUUUUUUUUUUI$I$AUUUX$I$A_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU$I$AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUKm6d+ cUU5I$M$!UUWTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I$!5UUUH$I$ATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU``!UK-ؑ- cUW\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I!UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI11Z}UUUU !UUdmۂ cUUWXUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUKmVd cUuuUUUUUUUUUUUUUUUUII$!UKقm cW\WUIF}ɝ$ c=UM$M$!WTWU I$I$AUUUPs?I$ cr]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUII$!UKقm cW\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULm6d+ cUU5HIr?S? cU]s_UUUUUUUUKmCbC cU5I$H$!UWTWUUUUUUUUI$IAUUU!UUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUK6 []s]mmۆ%UU Jc8$Z]s_WUUUUUUUUUUUUI$IAUUU!UUU\IIR4!UsK-ضm c\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUUI$I&!UUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU O AbC c5M$H$!WWTWKm cUU]sKm$Z#UM$M$!WTWU`!UUK-ضm c\WUUI1 cs}uUUUUUUUUUUUUKm cUU]sUUUUKmCbC cU5I$H$!UWTWUUUUUUUUUUUUUUUUUUUUII$!UUK-ضm c\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUK cU]s]UUUUK ZA]]s]UUUUUUUUUUUUUUUUUUUUI$IAUUUI$I&!UUU\UUUU!sUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IE)UUU5I$I'E)UUU\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU I$IAUUUI$I&!UUU\hd%d{ UM$M&!WTW\UUUUK6d+6d c5UM$M$!WTWUII$!UW]d, cW\%I$M$!UUWTII c5 K-2+ c\W5I$M$!UUWT !UUUsUUUUUUUUUUUUUUUUKmCbC cU5I$H$!UWTWUUUUhbCm{5UUh-ضm{\WUUUUUUUUUUUUUUUUUUUUUUKm6d+ cUU5!UUWTUUUUUUUU`!UUK-ضm c\WUU`!UUL!Xa c\UUKقm cW\WUUUUUhmېD{UU}Kmۆ`E cUUuRVhHaCMkU Kق cW\WUUUUU!5UUU H$I$ATUUUK m cs]UUUUUUK cU]s]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUII!5Q~>s? cWXr_UUUUUUUU!5UUUH$I$ATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUII!UK <(MkAU^C}F q!R-7>m RA_׬JI$k cWף$$Oņ1UU ɑI1U H$IE)TW I$N$UUWT! H`E)U}AUI$IUUUUI$I$AUUUWa#6f!UU ۳mۂUVWUII$UU9pL>əBz(sۧ.1`kQɝpOsAյ5wQA-7WC hA^Zlv< aئHibH}lRA^WKA %e$IJPZUm!SUUM$y!WUuMUUUUIɑ!ՕU$z'N$1T\WUUUUUUUUUUUUU#ag#1UUVy7C cAeu^bOɗ$ cAU Z}r/J c^ ykok,QC[KvMk.+1r/W9AMm;$IdM$1ՕT.=9UW^s1$I$AuUUU!I$If܅)UU ۱=ۂUUVWUUUUI$IAUUU6I$IIJUU5d sUU^\JTWV &O cAXU5OLBA% 'E, ZAsWUUI$I$AUUUVUUUUUUUU$I$AUUUUUUUɓI$!UuUUUUU l!iqUU_mf%sUU V9NMkAU6Rv=r$ c_P\WR/$yMkAmUuImۆE)UUu+$9 U?![?RA5PZU4MlB.UU6N$əBWU%,I$N9UUW I$O$UUUVUUUUUUUUUUUUm۶a#!UUU2 L1U]Vj۰ !UUU'$1UM0ld9]U%.O$9aoUU!Y 1=%,ȉJ$9 WLm c\WUUUUUɑ$I$!UUU#$I1UUyH$I$AVUUUUUUUUUUUUUUU ɑ$IUUl۰X!}UUT I$I'UUUV:$yb9]U]!I&hφ1U\\I$I$AUUUV Fc۶mۂ%UUUm6`/!UUU5I$IAUUUWm6#!UU I$M$UUWVXfCgE)UU=؁ !UWTUUUUUUUUUUUUUIIAU!\U\#6f!TUM/_$ cAmCUU@ɟ$RuU؃ !WTWUUUUU I$I$UUU c{mۂUU x'I$E)T\UUH$I$UUUUUUUUUUUUUUUUUUUUUUUUI$I$UUUU:lBssUUUUUUUUUU6ba!UUذm!VTUUUUUUUUUUUUUUUUUUUUUUUUUUf/6`!5UUN$I$AUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU I$IE)UUUI$I$UUUVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I$UUUH$I$AWUUUUUUUUUUUUUUUUUUUUUUUIIR$AUS(PE)WTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU m6d+E)UU5UUUUUUUU mVlE)UUMu'ڍl1SSp]'mFdۆ1UMUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU'm۶F1UUuUUUU mE)UU]qUUUUI$I#AUUUMII$AUU( E)TWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFIZAU p$OE)\WU'mۍ,1UUp_ mVlE)UuMU!V,ؙE)MW\SUUUU(PE)UUU\ mE)UU]qUUUUUUUUII$AUU( E)UWTUUUUUUUUUUUUUI$IAUUUBɓIJUe IN$E)uWW mێlE)UUq](mVm(1UUM5 m';E)UU! ۱E)UWTsp$I'A\UU\UUUU(E)UUI$M$AUUWT )mNlۆ1U}AUUUUUUUUU(E)UUI$N$AUTWUI$I$UUU(E)UUU QlȶmE)LuUU(m'f1U ByZA]U H$CpE)TWA$H$AqUTW m۶mE)\UU ٶmE)W\UUUUUU mۆlE)UUuMUUUU II$E)U(ٲmۆ1T\WUUUUUUUUUUUUUI$IAUU(l Ȇ1uMSp'mۆd1UU  ؐmE)\S]uWI$s( cUU]A(E)UU $N$ATWUUUUU mېE)UU]SUUUUUUUUUUUUUUUUUUUU )m۶c1UU )m۱ ۆ1UUTW"I$IE)UUU!6d+=E)5U_ m+6$E)U5W Fl۶mE)MUUM)I$AMU!@E)UTO lXE)q}MS'-Uf1UOI$M$AUUWTUUUU 6d+mE)5UUUUUU m6d+E)UU5 (cmۆ1UU3 1TWUU(E)UU;۰mۂVWU! `۶mE)UUU Hb1E)TsUB$H$RUUTU يe;E)U] b۰-E)=UUWUUUU(l6d'1qU lmE)q]UuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU I$IE)UUI$H$AUUTW ȶmE)]qUUUUUUUUUU `GmE)uUUCs$y$RUSUU FbmE) UUH$I$ATWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU $I$AUUU !mFE)UUMqUUUUUUUUUUUU m vdE)UuUUUUUUUUUUUUU( E)UUUqUUUUUUUUUUUUUUUUUUUUUUUUUUUU l۶mGE)]UU(E)UUUMUUUUUUUU(E)UUU5UUUUUUUUUUUUAI$AqU( E)UWTUUUUUUUUUUUUUUUUUUUUUUUUU $I$AUUU lEaE)uUU(PE)UTWUUUUUI$I$A5UUUUUUU ٶmE)W\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ضmE)]SUUUUUUUUUU( @E)UUH$I$ATWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@i @ II$AUUI$L$AUWWUUUUUUUUUm;!UmWذmUTUUUUUUUUUUUUUUm۶m#UUU5bS5U.IO!UUUaP N!ܭ ]ؙ ۂWV\UUUUUUUUU I$IUUU([15=/Lxo9A/a0IRj_9AUs"y׿4E)AUwup H*U^A: a6  H$I?VVUUA:I$Aq}UU"Vda{E)͕U<}h_w,BAIyIJAձU1t$BUaE) #X'p$18V\WOy!WI$L$AUWWUUUUU 9}me%?1UU(= 9W_sU I$]U `P`UMU *[mۂ5UUM$I$AWTUUUUUU FdmE)UUUUUUU NlmۂAUUUUUUUUUUUUUUU lضmۂQUUUII$UUI$N$AUWUUUUUUUUUU I$1$UUmWUUUUUUUUUUUUUUUUI$IUUU% TUQU II܂UU1V`l!uUUUUUUUUUUUUUUUUU6c;i !KYVYŶMUI0σ?!UuUV I'IU^U a[$'UN$I$WVUU?I$y]UU1$IUU!iE)]r !{V B,;dg] H$I TUUE Ib$I$U[UUVm!M]UU I$UAU Idٝ?U]'A`̵o&[D* ƀ[W[rQ I$I$UUU II$UUUUUUUUUUUI=yUq] p$I$^UUU UՕ ۶m!UUUM$IWUUUUUUUUUUUUUU I$uUIr&?U[cu II$UU I$ $UUEU I$AUUN$I$WVUUUUUU $I$EUUUUUUU $I$yUUUUUUUUUUUUUUUUUUU @k @?IDA]UU mUUS qs?C8}_xrUUUU6bh!UJy;yWR!Uu5H @RAUW|^b u=AmS&qX+)e ?5N&xRAU/ QФ9 ‚U^Y |ɑ$ՕUisɟ$!}cUUI$A=UU$ $A{UuU?IDA]UUI$HAUU] Ir'`r'U]\]UUUUcdU u&AURgA}sys$ $AuQ7UI$AUU ۴ AtQ 1'J]A$O%AUU]I$I$AUUU $A}uUYI$A]UU!$I$A}UUU l @9m1UU%(-1UWW\21ɟ$9-uU$S?I$1XUU ! UUO$_AWT-ɛAuU>$AP_UUl sǞ'!Ucc]HAuk]l 'I!_U5l   'z^ m   'z^H>*H@>B>D>F>A>"E>"G>"C>">T @UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$ɝTAUUյI$O$AUUUWm۶AUUUsUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUUI$I$UUUUI$IAUUU I$]UUUIygbE)UյI?aE)UW~* @09Uս", ᖭE)A]_,Inߣ!U ~2'j>U^\\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUII$AUU ^%Uu ";^Ȇ1AU]iW܉w cA d)O`Fӎs!H (RWUZ\KZrA f־1IJC`%W17 ##?1^\^I$K$AUUWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUU I$wM`UU}I$I$AUUUWI$I2AUUUI$I$AUUUWUUUUUUUUUUUUUUUUUUUUI AUUUI!UU GlۤRAQ ? c]%5V4#' cAx\9 $1IJWUmI0ϛ95%U PO'Z^W:'RA\WՕ7zl BX=L6cIJJokN򼾡!W7<.Ib?؃>BU_x\UUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IAUUUm&UU /I 9UU ^ I6@ cU>IkmZAUW)y9AU_ {2Ќ͂W~I$H$UUUUUUUUUUUUUUUUUUUUI$IAUUU<ɛX9BIJ5% AZ^OnR !p$NE)\VWW%'i1+1Ww 1--/VOb8@ c!Uߢ1}k BWV>(* lR>9^[\+ /c>9A{#s\'[1AVW7t!^u|UUUUUUUUUUUUUUUUUUUUUUUUUUUU 6dCa,UU5(y1A5%l߹y{1յ-r\M>qQ!z\6sE) Y' c^V^C?}&^^W\UUUUUUUUUUUUUUUUUUUU 6b,*i5N\ Z 7/6IJ\W=Qj!'\W 6->' qoy1-++@r%:9!"~9 'IJA~_-po$9A/U*XMڷ9z}!D:~R'1rWW cɂ>UU]4m6d,BWU5&m9UUWI$N'AUUWVUUUUUUUUUUUUUUUUUUUU@9IJA%%D}>㖊RE)WXz51uފR- ~OrӜUzIB ]QU;ScƊR_9sBA\#P?!AUppI$N'AUUUVUUUUUUUUUUUUvfAUUUL 1ZA (ܺ97O IJU/ A |܊R7;|?oIJ!V\~_;?E)Ar^_ 3'vn_A|? o UU(N1A-)-rcU9A\:=IB@RAU*G䮒1d/_?sV|~_H$I$ATWUUUUUUUUUUUUUUUUUUI$IUUUUjəX9{5--?ON$! ZU*p5Q-///fh4a `zWZڨ-?֎s\Jz?Z!TT|hIN<؆1zWWH$I$AVUUUUUUUUUUUUUUUa{i;AU2 99As_4eBAյNE)*UW2SpBBA% &A9X\\^/`>!AZx^!A*{9\xWWɝye cA%=OIJ_pMk! Uq'~-{9BCU's's_W^\I$I$UUUUUUUUUUUUUUUUUUUU &Xi c oxs-'X׽9*?5B-,]׽?>%59xm\?{~4#:mٚBxxyb'؏Ӝ1U_XXt2'E)V^\xUUUUUUUUUUUUUUUU y 9 MIyy ZAխ R$IZ:Zpx#]E)֯ 4 )vmIJ L $-Z_W/>'u>RAUW_\ #A_m|y5%` {|WU,9!ߝ_8$t'IJ*_^ @MkU@p'}?RA\WVWH$I$AWUUUUUUUUUUUUUUUUUUUw- -L`w cA/Uy@w*!I$YE) U<ȶ c2ۤ UIJ׾*HlP)UZ࠼t'{\$>C'1xX\^UUUUUUUUUUUUII$UUUU(I155c&{B---/n >PmxXfI MkA0v/'9 *\b Жws!.}uQ p'O c\VUUhC/.c $AMkUk IܿUQUյ?q'{W\3E)xoQVE)AU=;$/̠>1Akx\O$K$AUWWUUUUUUUUUUUUUUUUU XɗA55tNm_߿/ @ 1#iRA-/~ͱ}?brw{1 ]y0\?Q1_s n?E)~]24 B|_WU `'I$^UUUUUUUUUUUUUUUUUUU!jC6dC!5L ͧ c! i}9V'RA_WF yBZ׵ pBPr!AT^ !X5[E)A kIb~?E)Uc](7O^9m^zɖj?MkE)=-A>R!/zz]2 p'BA\W( əWE 155 $h.1A^X\ C>E)^Zz`UUUUUUUUUUUUUUUUUUUUUUUU Xc1h[-%U+:}$|WUKM`UU&ˤ lE){UUfbUZO$UUH'M$AWWUUUUUUUUUUUUUUUUUUUUUU5U/`o9/UHMǂTԗ`*ؕ!m!W\IwkUU 9uT??MkW^\,e9{p5oBA}U I$_pZUU"< o IJ@ 7{IJm`p7i*6R)3  IJAx__XUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIAUUI-UU&܆155' ִ9AxU| '9QA kP_?|{p_Voəw Sh(;Mk!\vaDMkAowdE){ݗdKh(s!\Q *= cZ56oB/!'N'1\WWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU I$AUUUU5UU 30$^s]UW/p$Mk U9BA4WuTL l c{UU+$ 9U+nɛSpO{A% /lM5{E)V``3p$O$B\WWUBS5'psUɕ$I$AUUUp$I$A^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIDA].)9A͍A ]h?R_5 p p'I$A\WUUUUUUUUUUI AUUU-x,U75$ܿ1 U5 DI!AUXTV:A*;U>v ^)dA]=] 4ܴ`Anw7ɝtE) %q&VI1ATUUӟwQV?;ɍ E)U_rXUUUUUUUUUUUUUUUUUUUUɕAՕ5 4-‚xD  /--' v91 , $9?%]m4@{E)_߫[ t=@- c^p+ oB 9]( N?E)AUw^\kѼ~A?U @>I~z_UI$~&AUUW\UUUUUUUUI$IUUU+6fH&1pE!!=WT 6PKb 'rA!!mUU wgt A?{P!!%#{|U$!!VTWF3C!srPvyz!Ya>K!\\^ XӮ%xIr;'U}aUUUUUUUUUUUUUII AUUUUvjA O^W=M#pRAU}H RA _)sBU]-[*9Mk1pX\Z9y MkE) F'ՊR!^V^=ڐ/>E)AV^P\ !N 1_zYq m&&ÂWp$O$A\VUUUUUUUUUU ɗ&7?9bEUUe DA( 4Aw}A .AV? &UA˃0}E)AUIGnD^[ w?! Uس͟nE)!XVWLI c]U\CA_ &-$!UU?IlUUI$M'AUUWVUUUUUUUU9TiA-#}sN1AU--F IlZA/ W( uMk9[$OMk1W_*Dh_'sB __}RnMQE)^$1ijf9 u'b rBWG|IZ^r3O{E)y`p^JDH~I$L$AUUWWUUUUUUUUMdOAU?N;!%Ww2 vjAU{۶AU ΐAw{*P!! `/:!Ah`z^?A^WW~AUՔ&`N1A-)]U&b81A\ع_ Н$!!< { qjR U- :?A~|_UM^,!W?O$K'UUVTI$IAUUU _UA#6W?!/7%C vBzR t, B+ -HuN$!m c_* -;`='B\#9o׽9pp߻A x׽Zy*O" U9׿Bz ͊R!\|- :B_U>!Ao^hH$I$AWUUUUUUUUUUUIIAUU `m>_a[Ux/!^ymOAl@Aߵ[# /PNIAzx^ WC$ SnA* 0Zb}- p̻7?A RwA/nn)!A--">>E)A_^XX& AUUU ضmTUUUIIdAUU .O=?A\9{yxRA5ZB(sE)ibjn O {-- )BV~?Ӝ9ץ''O\9_+<^i`:6֎s~#%v9Xx%wr 1_B >Q??R'/V^; 5?IJA``} MؙMقUW^WUUUUUUUU f0kb%wr!UUӺ- ڒ6Agc֢!}akU g~jA? @ pXWU Vmu8A"h5 ='E)|WW[rA q[A+/@A+-3!x^_^M$R8AWUUsUUUUI$I$UUUU al^1U -#[6E)55/( N[ˤ974{`w$! _Uu3>o{IJzi}TI$UWps ӜE)- n?r:sE){AyRrQR(,7HXӜ9Vb ?'{^X#4:!xpzUUUUUUUUUUUU(ecj+1Օ55( { w9VTּ7IiJAUU7+9aUW_>E)AU]X\y[55 M`* ƯA 2I)_ ͞va լAW@noA ~qiۂ?/Q>(~x$M$AWWWUUUUUUUUUI$AUUU c#A A+{{8O[BA5 B sZUhtJysE) Uu}|Q1W}`'!wMk9 ?la>Q1^Y ضs9~mm0NBAAo^??AWU o&A S'}\AUWU-Z!WKxpUUUUUUUUUUUUUUUUA$I$UUUUˌms]UUv!559۔  XBpX> x#~B'1W^+l}9A%f$1UU.ɝB>7,$BAWUMذ ۂ\VUUUUUUUUUUUUUU Iy$5UbUdE)U Oa^W }޿b}Wv^`BAW! Ik?r Q3?h$Z!~|XWnAF$yߓA[ClAUU{ve?/%)aUUzThA75 L x\^ZH$I$UUUUUUUUUUUUUUUUUUUUII$AUUUNE)/!MN1A%*`϶9XVVq x$~B'UW_ Ҩ6AUU+)>! _HżI$AUUH$I$AWUUUUUUUUUUUUUUUI AUUU6` 5UUI!=5@0_^tWu յ-/R $i9aE]U9O'lIJ!Uuwj U> ۸a// w{v[$!A=/5($v 9b^ jTO'!bV L؂MAxV_^UUUUUUUUUUUUUUUUUUUUUUUUɗI$AUUUlm6` UUV?I$_UU $I$^UUUh$I$A^UUU>O$A]UUɓ$Ap}UUUUUUUUUUUUUUUUUUUUUUUUUU I$UUUU MVdÂEU ,A~syU$A/9A}U G$!!VUU3} B $=E)AW&߮1AUտ?O':AUW^x#I!/UUU 4 ]U$$I$AUUU{$I$AWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIAyyc7$!AuU+ IV95{(1!wUlڜQ!: [tR'__W?'I$EUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$I$@UUU$I$AUUU 'I$zUUUI$I$UUUU$I$AUUUH$I$AWUUUUUUUUUUUUUUUUUUUUUUUUUUUd @@UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUI$IUUUUI$IAUUUI$I~[!UUU=m06!UUU  v!UU_ I$M'UUWVUUUUUUUUUUUUUUUUUUUUI$IAUUUI$IAUUUuI$I$UUUUUUUUUUUUI$[UU5=g RAU0G P܊R PEm*uMIJ-4-BA1<)@j9V^P%mۂ؆1UUWTUUUUUUUUUUUU6`h!U5=]OXa cM Ie? cU~{ |>r'W\VVUUUUUUUU7IB55>?RBAv~XI$L$AUWWUUUUU3I B50~&BA/^ 0j5r P9AÊ@Hi!AXVEmIJA?G sZW5g/34{rpXrK$I$AWUUUUUUU6h6b Zwܒ)9%0A昼9FPOמsp^u}s?3?Q_|~~UUUUI$IUUUUXx9sյ%-` dzMkAZ܈B cชR{++ίx9AWVTU YsYUNv[?ZA|E@c;}ZAp}H$H$AWUWUUUUUII$AUU0qW$B5}UX $ cA(uUk('{AUU,ذ !\WUUUUUUUUUU8IJ U4#ϟBA7UUIiBӜյ =\7RVvA IrRU6 MIJA׽)>(1AvfI@UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU I5UUUo<!}Ua$MkcqUy)]usA^ba{sRΓ$ZwU'Es?I$9s]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU)jh`ۆ15UU68>O$BXUUkdl!yUU$I$UUUUUUUUUUUUUUUUUUUUUUUUI$IAUUU I$́UUUI$H AUUUUI$I'UUUUUUUUI$IUUUUI$IAUUUU I$IlAUU I?M!UUU? IUU^m۳AUUWTUUUUUUUUUUUU I$IUUU/  =kE)(>k'9_^T|JAmޮ |R?&W_s\UUUU I$_UUUy.19A _#y<1A+UU+xw!ޕ}R?oE)W_\I$~'!UUWTUUUUI$IUUUU .ߝ}BzZTy -Z cP˃foZT/?!AUV  ɰ W}r_UUUU6f(!5[ ׂ/yn E)AuX~AFM@vM^UI$O$AUUUWPKA5%7RqWBA)=-*%{ IJW ,$ۖIJ_uJ8 v׽ZyZ_S4JýC' cv^>܃=^_ZXUUUU ?9ۂ5ϷA!A5U&!\^IE)A5UUUJϝE)U+s39a{}m  ۂ_jwU 95>)J{IJA dJpsE)vZpQ!ϣ:51UB`=P6ӜE)Xx~7,-IJ\_WWUUUU)!mE)AU]Uvn}!__ ւU_XxI$H$UUUU$vQE) 0q9A-zz'c]>) 9A_+W MkUU\\II$AUp$US:u$Axz^UII$UUUUG~ZAm]e >y_{W]uS9.`IJoX-p&u&1\[_ZUUUUUUUUUUUUUUUUcHmۂ-UU<D1$IJUC4$RARUU ضm\UUUI$IAUUUmUU+Ir'!U]^T I$|'UUWV IyUU$IEi)U_O:(ߡU|l I$I$UUUV(Iy1U55x {-9H{z}b砋QW_x=؄]UWWVhywKf-@!W_xZ6hfIJ5US @;Z" } _u$Ӝ^Ux$N$!TWWUo]L#4O?y4BAUUuqm~? ҳ=[=Z[[XI$I$UUUUd m}UU [$ oUUUH$I$UUUU XfHmۂUU溎)$!뮍UI !/^WU ضmۂ^UUU  @m6dYUU5I$O'UUW\)IBΆ1 ;9OR'c"BU^_KI$5UUp$I$\WUU+b9A⏥3c6$IJz~XUVIMkUU dI$}&{AUUW\IՍN>SW_~F)ɟ$ZA UU`'I$sX_UU\KBx 5 \1<؂okrW @NI,ђ$ZUaaU_í-E)Ayi?Ir,$IJAUaAU _ӍB{1{y *bb2:AXX ۲"Ab1 ԢEAb9H>*H?@>B>D>F>A>"E>"G>"C>"> z @UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUUUUAUUU\AUUUAUUUAUUUWUUUUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUucbU5UAA~1 55%!V\\AUUAUWUU+UUW\AUUUAUAUWWWAUU]}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUAU/e)!U]=9!YRF)UU)AuUUNcbUU%RUU^pR5R|!W.[zX\!\W/9a55jJAV\ U*A}zTWW_ !UUUUUUAUUWVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUսA_AA^AA?JBյ1\U%!aP-[%1`bk!/ ^^sUU2P`}9buJJaU E)A%_f)AUUvUU%rUU\Rկ/.cZ*B/U)A\xU_zxpAU_uAUUUWAUUUZUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAյ551AAZW!\UUA*oc UU E)!U]xx+kA?S|UUW)BA{* [R_\s 3UUW|!{X9U%|Ƨ1UWSUU^\!aU/s%! UR\Xf){f)_U%!A^x1!UU/1!]_X\AUUUA-/ZrAUU_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUA-- 1AUU51AUUrA_f) [UU?UUV\Ռ% ]kE!WUU)B f)AW\6!%V)B\W)B Ux1\^VWR/%|\^WU)//)BE)u!~^Vf) U1P^ t%!U}ycA^^AWWWR!55saUW\^! my[\UUUUAUU_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUյ9 UF) \W!sp}%!!5Uf)!x_WU UU Ra5}s s\rss%!b+*NcRf)%.f)W/Rf)\\\\J1- oc)\\\^1zzZ%!EEmb.^^a(nc!%%RUW^|E!U+k$!5-7JBcxz)BUحU}J!UU)BA}Z\E)bpsqq \Z%!!UU)!UU^XA[_UUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU:!q]e)!UU W׵\!U1AU)55?5jJzp92|1]}ˊ.[E!Uտs1pp9%!URE) UJ"2|9_^s9UU g)_s1U_xJF)MOˋW_T|1Uv1% E!^9UU+=RUU݂|F)WW-[f) {!RMc^X\9b}* |U^pa1bs[)bXU_\|UUUUAUU}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUWAU5 bȪ-[A5cU_1U_*%!|E)%/5 [rbrrb7> [9sf)-sE!ppr)!f)!ok155ocf)^^79UU5jJ_] 1WW\^JE)-%5>RUW^nc5 b|%!WUUNc!/-sE!/xUUf)WWWkf)-5UkJo UE)UW\^JXU1i :͵ :AW^xA] :U-9AU_\W^zAUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU! UU%E!!UU`AA/AWU-c%]Nc!. ])BW9^^\E!_{AJbprzrb>)9U :JBUW~J-9U^zp1%!s155kJf)\\%! k[^R -jJ!pSsZ/-9_/5E)_^XZ%!?f)5- sx\\\b*W#f) 9!*UU{1X[QJW^xxAa5/F!Apz)A}1-}[V%!1A\V!^X[qW{csUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUuA1A%f)AX^^\AkAU-Vf)Ucj}%!r}!p7!-[\x*s%!U|bzzsU/)s٭WUU1*UU{ S9WS:ek@R1ՕtTTVVk!55- 7R.cxWWWs5UsE!pNc!շ V BKkuRXz˯E)bUWW\1 E)WWV.f)|1QQQyNcZzr1Uկ1y⏍15t=__-[!!ATT7:!}}zsrAUUWxUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU59AUrf)!U]r!!55-f)\xJUUr%! _UR|5WV\Xb)B%559%!^\9%!]Usf)- [7%z[1PZZ{%!^~zb*_%%JW^X\k*B%5տ : حf)W [1ZUՌ!W\U9UU~61qaaAs%!ssssJ!%5RE)V|E!W bZf)UUf)UU*1}1^WR%!z-?1UW_1tF)UU إF)5 b_x_UUJb}]ZP1!ɉ9pc͏ z\\˭AUWW^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA=/1UucF)y- !brX715)JJbPP^_RUյ95 1s魽UUVXJB=sF)WWf)UU*{)% k9^^x9ˍ%E!UW^*BUF)55 [\^]Uk)B*/ %!zR1-Rf)Hln1( [F)U-jJ۠_RE!srp.c%!UU5%!^WUU6%!_W1UUU>׋J 1x^WWRf)/U1 UUJB}]E!xWUUE!bp꪿f)axPf) /-R-*{U1 ^\E)!UUW\A^7AUUWVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAU_%! 1A{5)B majJu_^\Ԕ ~1Uf)}\sf)խxՔUKBb믭RՋW:^WWs955 wF)^_2|%!Rf)/WVR]kU )z^\xkJf) m.[f)kzoOOE) RF) 2f)Kc{E) +b1?5:!IB=:X\WUJz [Օ BTVWRE!s\sf)5J1^s1յ{)WWW/Ԍ1yys1^^^\b*Z~1_͍%!}_--c}/JBUU1( [_/1!UW\\A^Z{sUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUյf)!Uս%jBai_9%s%!5RE)VVRF) R%!WWUs)?UsX\\^b/?!F) _WحF!%kF)zzzx2[ym9s1VZ k9Z^\6JB-jJp*1UUjJ%!u`JBϥb/.J]]r1mMM1rx~F)>1'&Nc1{_]1^V-[ -sE!ՌE!bR%!555f)b`pX{f)Uխr{1 >75f)x\) |!TXPpE)UE!UՕ5~f)UWXokf)m}{\1!JB^_Jkmf)A^-7NcbU}UAUUVTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!A_AWUW1b- -1 pPNc}U] Bb{!1--%s\XZ[b? :JJ\\\^|!5UU;JBx1 ?Ws%!W{{ :-{us)Busf) *Uf)*WU6!Rf)BkNcU cWTVWRYR[ZF)e1b\^jJb?1zz1Iii$!W Mc%!}{)B%!-c!p^WWR%! }]R55Ƃ\VWURzRE!/Uu=߇)eS9p-[1UՔ)B%-)WZ9ՋU1Yco)U9-__)BbxWUU! akrAA__W_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUA?A1U_ )B :UU.[ Uc%!.[):p}J1^UN[1%RE!\pb:!UU E!]]VT)5[)!x :UW\b<.%!!W^\xAWWWWA1b55ok!rrs[91bx\WA f)-Uk$! UR}{`XWUR5Z1ϧ1W|f)W_ 1U :U- 1bZ\VWA(A~AU__^UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUյA!5UAW)B5okUU)BzWUJ-|f)UU-JՕ 71x^s)-J- ^߱k/_U٭1TToc)UUW\JBޗR%!^zE!x\):bkiWVTVA BbU-9p] :rZ_W)B%JJUW^TA  UU=R% :icUk!UUVXE!Օ5t1UUUT2|1UUU 1)U%zzU1b WUA\WAUA~A^_]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUb㫯/A_pA//1bꂋ!*)U 9Jf)-UWkB])ߨ`s^UU)(5=t1asF)sqAJBf)Z5Jo@`{):)%!a\\^^f) {]UAVUUUUUUU%!bURU][X%!b(.R!5UV^kJU1ՠ1!__^ B[[--kJ5WW_RUUUsjJ/|f)W^9UW\%!U+UE!xf)A^^A\~UUAAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUW 5)BZb%!bկF)b *)W f)Uս52t%!\\|)ׯ-s|1z\^W?f)yik%!UB5- c1rXz1ME :E!mmR%!}}f)מ)AzpPA__^\UUUUUUUUF! =5U.[b"- :Wܨ)BUWܸ):\\z!.%7%!*זok)Ua9]scisf)5W|E!Unc9uu Z9krjJz^_A^_9bUU9Uf)b\pAA_WUUUUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAյ? f)b_^^pAc{\bAUկf)b-kJ Ncp/2|%!7 :Օ5tt@K^_[)Ux):%!WUJBf!-5S|15UU|9VW%JWW*B?1!PX_WA^WUUUUUUUUUUA}UU5! 1cy BɭJBUUR!UU|1 /7ƫRm%U[UW\JUUU*=߇)-+g)_^xNcUUJBp_9XWU)UA^^\AA~WUAUUUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA+%!!UU/%!A--(Bz]f)W^ JBU ZUJBf)p_Uk)-UUWJՄz^Tc UU[)xXs)WW| :%!5555*BUk1 )V!%UAX\\^UUUUUUUUUUUUAUUbRaUխR!Uhkk5UE!xWU BUUs!? [1|\^_s)/UUUt)}UU9/u֋RUR1^Xz{1z_)B jJ%!`!p~A U/!U{pA_^_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUb!-e)b-UJzU)B_*:5__)BU9%!1f)-UU1_J =XxjaxN[ 51UW^)յ/\9rX\_kB?WW)uU!xA^^AUUUUUUUUUUUUUUUUUUUR!%JB1WW!xzxf)/2|!յ |)BU^Z)Z1U *s BkX\^ [ B R1ckzp1_b ԔzpX\AU_AuR5jB\\^__AU__~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA-5E)b_c!AUUW\!+kJUUf) 1U_ *B )U}kB_^^|1=JBϵ)WWVkUյ%1{_W1ByY_Oc%!鍥1b~)AzpAz˽%!AUAWVWUUUUUUUUUUUUU%!-UU1! UUAtA{sSf)! JB*USskf)^U9U9%!5555s9^> ֬RիW1^\\.c!UU. B s)\zx :%!%JBzX1a\_]bb^A~|AU{zUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUAUUUAU}AWa/A-51bUU~A(F!-1{-kF!-U : -WJ:VUƧ)UU+wJB " :W֌1`kBzkBx]UR5JB%!U*BApAUVT\A^WUUUUUUUUUUUUUUUUUUUUUյsU}-[bSZ^WAmm)AՕJBs{UU1WWV\%!-1Uյ-?!\VS_UUk/k JBVW|1Xz|E!pkJ\VWU%!b]}+JBf)WW_A AUWAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUWAA+AA/A!--f) UU1W/stUտ/stf)pp UUWF!T\c)- Oc1"X1c[^UUU%! UU\F!^xO[%!UUW:zp*BA(]]RU!X\\VAUUUUUUUUUUUUUUUUUUUUUUUU5UUkb!\V .A;R:x [$!UU?9 _ocTTT^b)55=-kJR|9WW_xs)B -cpZZXf))B5 ):WkF!{yA\\%!A!AW\\WAzAUAUUUAUU{UUUUUUU]UUUUUUUUAUUUAUUU_UUUUAAA**AU=-%!AU_+kBbU]g)AUW1-*B!F)Uf)pU SUWx[5յ/|J:jpc%!/W S)x5j:UWW\():=UUUF! %X\^WAY{)A`b|AUWUUUUUUUUUUUUUUUUUUUUUUU%!=U)!W\xRA-%%c~^\s-Ԍ9{ [9X6!__z9UU%!Uյ-;9z^WRf)^U%| Wk)\_R)_)B^W1Uի1az^^\E!A55E)bpx~zAUUAU%AUuAAUUWA]AUUUAU_Z\AAAAA%!A]} !aU} !A-%5kB%!{}R‚ -.[F)R%!x^_3t!UU/f)W_{1)Wk :}Uk)Kc[Z)E!U}o1??^{/JUUU\kUU-k{xx):_%.[1+*)BAx\^WAZ\UUUUUUUUUUUUUUUUUUUUUUUUUUUUAf)a 9W+ Bb-WUJ\^[qF!A5s1qYZ)5- : U^9^jJxx`J1_W*.[zXXJUURE!}[^\9isp)յZf))\\||!bՕ?F)bzxb]_1bE)U_^\)UAU޸!U^XAA W__R U5%!au.F)AUUA5%!A^sA %5%!b.\pf)AV^{1b1/WU9(7UUk%!*+-W) ^W%!UUSt)^p4t)5-|1^z71U k1\W1?UJ\Uk :V\XF!^_{!bp^W :\VWAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA-5E)!p[E)!‹AW_jJA{!/Ռ1k}9xWWs! -55sjJ/xR|JBXmk\^k5^WՔ1^] 9UUkJ)}JE)`xf)\~/ [ R1}9Wk%!탢1^JBbBA|\^AAPzWVAUUF) Rz{*!5=?89rrp`AVWf)?) JUUW1Brrcf)A%U*:UWz1UU1UU}k%!--J~WWAUUg!-x)3t%!z^Wk%!%jJF!WV\9+_jB! J{Vemf)b 6u}sUW^XUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU!_ )5_^1azsf)b/5%!.67R! _WJBWWW-RUU5=+ocf)x\\TsE!-5U9_s1Uf) cZsf)UUJ1 J)xcE!zXR%!zrsp1^R5NcE!~u9ו5s!{srpUB.[55JU^\^] )BmC15 )\XZ{R%!kɭ)BAUU1%=Zpaf)e%!bW[WJBF!u_\KB%!]]_g) cW\XZbU:JU5CɃkRWWV\ :5k)\X[sF)x c!=b_\^_RM}UU?UE)_UUA\UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ~%!!%5jJbW^E)b55 B^z`1 _U1AJB=ocE!\\^^)!5=//s1Rsc)Bݽ%!\VWUF!-JF! ocJB y615Wtf))xxf)cr9ɍ 9%!%_Unc.c%!UW^jBR^f)5f)U]y%!VT\1 --9`z.[\{y}!򫷷J%[)U׾J:%!W()Uտ/ :Uzx :^WB%!տ| ~UUO[- s|1WJBp@*Bյ5.tF!エWRE!W( nc!sVkJE!X{1!^\^_UWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU!=}UJ{]UA91UU%!kյ=k1_^^|9pWf)-5Us\ok%!W(sU2|)JBbbJ%!VWרB%!{_WF!X+%!Xܖ|%!U][1 @B7Օ2tf)rzR1ʍ1!7.c)UU1㫷U*B!V\\V)/1xx`157)<*BE!`l!J1?_t|f) ztF!x{I[)5c)|\\BF!UU޶)UUk)-5)W_ : t\\\A(ՕJBbk_!<Rb_U!\_UUAUUW_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUA}]UUA /-JU1b xRbF!Yf)5uZ\WUUb*WWUU5Jx\ UUS|UUS|>)B_\Xz.[9-5ocE!W^1u}{%!Uյ/!xX :AXVWURA55% s9nZE!Nc1^\\9MMM)B)B^^^ cUU?z9Uut%!տ6JBUzxZ*BE!x^6 t| :UUc%!z^\\T|J:1=7c)\Zr)_^\xE!J%!5|pZZ)b Ռ\sUՂ`)Bb_TTUAU *!a]{`AAWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU- f)f)bpb1A%UU1*+-JF)OOAx\VA%%>%!51xzj1UUWT!bU?kՕ5 ~2|]= 1W\xJ%^{ [\V_W.[--/kXXXxAU}R !!WVTt1^XXP1qQ2|f)e9s%!ԜE!UUIB2sa9zPsI1__ :Օ*: is&!\x%!5%kB)TܾcJBim o[)W_jB%!U*o[)Z{1(t|WU2t!pz%!Ap\ *(/ p^WUAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU Aյ51}{ppA뉵U)A }RA+- :AW^ BA/x|UR! 5Wt^ [5WNcf) UsE!^^_1(WWUX%!{m9J1<W9Zrsk)B!UsE!ICCC2|E)f)pPXVt|!Q[__REeeJBՕ.ߧ1mcW9!WWTXE)ɍ%-jB?;W^Oc!o[%!WU?JBURcP^tkBUXs|JB Uք.[/ Gxkf)U|)rr^Ut_W1A\WUU _\_ݵAWWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUA(UU1! 5!W^\V/-E!VpsZA _WE!!\W_A ]YJb ٭ :}icBf)xxx%!?JBE)rkɉE)WW^\S|!oc9jJ1\^KB%5=|)\V:Kˍ9}{.[)5+oc%!TJ)\\<[Ƈ) Ocuk`|sE!U_ |f)}~9xx)B!(~WU1Ռ)UJf)TX S)55-3t ^/S1J1zxS| :UtbTWWUA]%!AuU%!A{5AUBA\\\^A5A_WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAA~?!s{{_!-%1UWzp%!}W%f)kJ_^^1)Rf)- +kE!W\ s%!  sf)XRf) _U?1+;)^9WUs9pzZ_kB155sU A6)B?xWߧ1UU [\V^^f)/UUs+-5ֆ1xxxz1!WW )IE)~^_R%JF!~\X1Xcf! S)XXXpJ1_{AMF)^W1a{~XP cx_U!UU%!!|_UUAzUA}UUAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUA/#]U⋭!UU_c1A%}Y)BbxuA WU%!A*.c |1UW ٭f)UU1+{9/(%!^XXXf)^_U%!/t!/=1WW 9)BUUp1-5KB@p{o9)]f)^V1X{]W^x-c5555Rp^s9U^)AaRX!^~X=Jrsyy%!A StA/{St{]): UU֌ ]ZX\u!UzAp~AUUAU}_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!ɭ559Sx1mb51bUUF!}ZF)Ukf)U9%!`^R557/Nc)|\\kB%!`U BUWx%!(f)Օ51Us)\/ :% s%)>zSf)UW\_F!V^Z81 )-{:^W)U*BZZc*:__~xf)U/x} yUUWXcrUJ:}K)u )bs\bk~~z|A]UUUAmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5UU%!x_UUF!!%Uf)A{R9A )Bx~W [UU]aJ%!AqSE!/ %!^^\^1]]]1 Wocf)U5E)sZWU1-WR! U*B_WJBpUUkJMkUsf)U Z x\֭JJ_]}R~_%!ATUU [xz}}J {A UUu|\UUUAz!UAUU_UUUUUAq[A_WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU!!5f)AX^7 Ռ kJVT\kJqy])S[_k5-v1U~*B%!(WW9WWwE!iy B^_}%JUUUb ^^Ap%1A{rAڭ5Nc-\\-c\WU)Bi A_XppAUUAWU/f)U5%cA_VVTA* 2!UU[AUUW\AAAUUWAWWUAVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWUUE! UUU%! }]UE! %9A WJuR^_U1b Ur|%!U ssrz^15JJ.cUzB{A-WW9ar}UUA%%Z_1A1brWJis|+|pP\A_UUA/<ףUUc!\WUUb A5wbTTWUA*^UA_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU%! -U!\\pA UWA5 :UUԌ%!%5-R|%!\\z1_W(1b]UA(^!5.[Ug)aUWVz^!WU JB}C :b-*UR^\Rcb!_^A5 WW\ U5!\W%!rWUUA+]UAXWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA U꿽!-\):b i}) WUUJ! UUc!UUJb 9bW\f)AUx~!A=s%!]UJAUr1bpUUjJc}}!B--):AWp^ATVAabuUA~_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUUAWWUUUUUUUUUUA5UU*WU UU)!/UURAP^UUAz_UA ?B!c[UUaUUAWWUUA]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUA_UUUAUUUAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU @UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU?UU%!UUUUVUU_UUUcAUUսAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUAUվ/1AV*BAU77׸{sb`1AUU_f)aAVnkbUUWjJ!Uf)UUWW\AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAյ5/!!zVW :!U5ocbUWUc!]}]JJ~[s%!u |aSF)yRUTkc__f)5JbU_XF) WTWUJ!uU}IUWZTAUUU_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUU! \ gs%!AmU/)B! [!BMk!յ7)/U9[\zR|9}uukF)U62|!]yrSX2U^jJuV [bUu|%! UT\sAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5 U\/Z]!McU_xpJEe52|1I?8E!UUW\Z1aqq%! Ԕ%!wjC!5^VW [5UԌE)PKe)BW\1bsmf)A?)-[bUWpsW^|UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%!UUͥ%! 1AVWޏZ=sUUWTحf)qUUkE!e?)%oRUUW!*BU_%s7|!rPbs!sE!-V6W]'%!UU]=f)uu-[V-[%!U]_(Ԍc^JBSX1AW\\SbUWX{UUUUUUUUUUUUUUUUUUUUUUUUUUUUAUU!!9b@!uU 5%!U]6%!\C %1UskE!5`2|%!.>}Ɔ)UV/1VVԌ1 Nc.[E)^_X^kb %!V2%!"WU1|%!u1b{]}׭95UU%!`__^f)aK7jJ?-1XUU_)B!UW^rAUWV\UUUUUUUUUUUUUUUUUUUUAUUե!!U1A:5-ci W{%!s^WURBkMMk55Ԍ7W71w8rOc%.k966(_٭1\kJ9|{[sS)?jJp^_]s1]UWsf)ۘUsKY|f)W!bc!?/9U\_k%!uUUZ^UTkR!_X_UAUWTWUUUUUUUUUUUUUUUU%|aյ5f)UUswo )BXTZ1ujJ!xsUUJB}JB)Bb7WWV :bcWf)!n~9bri-[usYE)A *?IBU9wό BcXRbUU5s9]_[Nc JjjJÍeoc!-[XWWVE)!VXZUU_UUUUUUUUUUUUAU.[bUUnku]\_f)޷5 E!+URWok)Pkf)]}|^1UZ51bf)!\T\Z?UE)!|zWUs!5mA>;%!aՕjBbZs!5UUt!uUz?;f)UU|sE)UU Ԕf)V\]nk_~[Q!!\W_zAUWVWUUUUUUUU9 UUU1AAS!U5}Ys_\ZS%61W|f)j`BX{R/1W)BA^X%! _WAWUAWUUUAUUUA_UUUAUUUsUU%!a5Wf)b97^y1S|1%%w\V^|55wE!UWp!yibU%!![_f)UUUsUUUUUUUU 9bancsUUΆ1uk1io%5-[~xkUJE)\~v]9ar/A}`1 X_WUA^_UUUUUUUUUUUUUUUUUUUUUUUUUUA=UU?a(!A/E)b?JE!} [! U{JB/mk!TUUUJJU RAUrp^f)!C}]WUUUUAUJA-akpuJbկc:U]U%R14%!WWk^UjJ~]!`jWVA_WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUbAs^%!A- -c-1_]R|1oCRE)/5f)XUU2|_ScU)AWWUTVWAcWUs%!ekA S{\_s!?UUUR|!W\|E!X]WRF)_W [W^W%!A}xWxxWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA%!A%1bסWRح!sWW2|9i;s͋pP [_z5JB}U\ ^_sAVWWW9Aͯ s1Y+RUW^x9A?/XZ{oczAJ!^]JbWU^ WpA\_WWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUE) }!A/Nc71W%\WZbR?*s!w?.~)B![^RsAUUUW: uNc5%O2{UU:F)sc {%!G-_Wk!}_\9/տRb|V^!W^xA^WUWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUUA!%UU|-٭1UWWWbcBB!bo(kJA]UW|A___WA=55)JMM9V5ԔE!µ [%!/UR BWz7NcVXP :%kW [UUE)!\WUUAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUUA?/+E)b/JB^oc!_+f)  [pr¨sUUu1Mk1uU\UW^\F!5R9ar{cA/!/s!ՕR!R{.|!Uuk1bkrZUxAWWW_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAՕ!׿f)b7 5J]UR!-׋Bmk \U; :rowJB%!_K :p{]) ^R^U5JUVXoc!muwBUUs%!uuϊs1+Wk B?{oc^^Wf)b%%!AxV\[A\~_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA1A%umF!A/_W/[?oc%!4 kBwo[յ\R|1UcS)!J@{AWVWUAU:!U5JB?X|UWՔf);}uR|bW1iÃNcz\ :Wxx UUAU_W_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUյ!!U=9.1b ZS|) |V\Xc^z)bS_]U rZ_WUUUUUUUU*B UkJXE9W %!pJJE! ٵ)BW׷ ok^\1icsj1AU1AbW~xAUU_^UUUUUUUUUUUUUUUUUUUUUUUUAUUUA551b5U^)x-)U-f!UU\Z[ 8f!}[Xs :_j \AWWUUUUUUA)BbO`SY;sX_}ٵ!5TWWZ%!-%55k9H>7s{\VV :rRUWXX U]AU_AUUUUUUuUUUUAUUUAUA-/ U )!W15= s|)IU6b3t :YrڥE!VW]7BUUحE!UGCq)Bb U\VWWUUUUUUUUAUUE!!i%%JBAZoc?WWs9pzW^«sk/^ [E)Vt*B\5/%!Aܸ%!A\^|%!AUE!AUU[pubUuo!!UU-E!!UU 5<!bjjJ /U [/5tF!uV[1%=s|f!^V6f)u?%!Uc_^XkJ!bp[[A_VWUUUUUUUUUUUUUf)AZŕJ;!x__Uoc5?S)WՌ!f)w\J1HR%jBpZ{Xk_^^\9UUyAf)Ae 1a:b^\XsU}MF!aZ{1U곏S|F!7Jb^WVT%kUWRE!WT\jJC`o[A[_UR[xWUUUUUUUUUUUUUUUUU5UU U:bXW1xXJB?J!x1?NcTWk1oc%!f)ln [%!]U|cx)B"Nc%!u 177IB :.S)]1ukJF!߃Mٝ_Uk)zoc^bocu)BAu%! TVWUUUUUUUUUUUUUUUUUUUUUUUUUAuUU1!%JBA_r%!u-cTUUUocUUU{%!-x :]u)U,b~\VV{c1gGDkE)RӰJW?5)]\^s%!"ז?O[g)Oϧ/J%!UUV2t%!mms|e%UUPVU jYAx\WUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=Uf) sy :+UuJBarW.[f)z_XRk|9SY]_ح1V^s)s)Om}%!WW/6%!Zf)_1]%k)}[pu*:uc9 W*{_NcbU.[brWUUrAzx^WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUf)!1AY{r{s f)+Ք%!^TT :luu :%f)^UU9T^v͍S|f)JJB7UU :Al)ymwoc__?kJaWVT_^A__WUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUA5UU)! uUF)aZeQ|5}UR!ptf)}ci1Pϕs5yE!pUs"UJ^|٭okիbU^WUAkWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAuUUU[UUUUUUUb UU UU9UUUb WU) UUUA|UUUAWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU @@UUUUUUUUUUUUUUUUAUUUUUf)Uu*Nc!UUϨ!Uw/ B!UUU*!UU_xUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ŭ/Ra];k~-kf) [p{_Zk_W kbUW1]{UUV\UUUUUUUUUUUUUUUUUUUUUjJAUU7Z]K6ݕ?|![J% BuWss%!ޏ.cqr>Ԕ%!<JWRUEb\%!W_^|UUUUUUUUUUUUUU=jJb}/s%!U!ýY2|1zV9pt%!UWNc%!7VVTk!sf)usnokɂ):!\nf)UU\WUUUUUUUU BARE!_%Uصf)2|1QrV}ZUf)Ackh1AuU1AUU1A]UJBkeoc兹UF)W^-[!{]B9 Wwx|AUUUWIBb?_sk^ :!l)!Ko_WUUUUUUAUUUA.U%!A?UU);.sf)jU}rZ [^\}kU^X_f)R\`1E!}uRF)GzRW^X^VUUUUUUUUUUUUUUUUUA%!A{E! oncf):B1|uW}rz^\jJ!յ5s_{ʵEzZ%!~WT1AWXT~AVUWUUUUUUUUUUUUUUUUUAUUU!#Ԕ?-s7ծjB)X1VTW^)B!5-c%-WWԔf)SZTV+)BAx]^WAWUWWUUUUUUUUUUUUUUUUAUUE!!յ= B/>2|%!c*psU_x)Z~h~1ՕJJ_okf)%r|F)z_Pr9a_PWUU[UUUUUUUUUUUUUUUUUյ%f)b]#oc?xE![swoc%!oaP%!ZXVW!UU1bXV|F)\E)rkXjz B ^{UUWxAUUU]AUUUUAUU= ՋJA/ k)YS|@Wk\XP^VWAUUUF)AncOuԔk%!wJ_YJBbWJBAUWV)AUݣjJbUU6 :%U.[{sw%}Q2F!]wJAtlWAWUUUUUUU=UU9a)}jJs[{Z)[s!UunpR"Nc%!][TsE!UCN[!.!RF! ;[J!`RTWTWWUUUUUUUUUUUUU!UU1AmUkM|!ݽ+2| :^?|!XW1|f)ӱtuUt oRAhUWWAH_UUUUUUUUUUUUUUUUUUUUUF)5UUR!?UR!5uR!GiR]U]jJ sb XZkBA\) WV\_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUJ UU)?U9 _U)c]Ub~UUA_UUUUUUUUUUUUUUUUUUU@@ @UUUUUUU1UU/.c UkJ URUWwbUUUTUUUUAUUU)BAU k)U=kE!RJNc%!Y/jJ_|UUUT1 5 [%!)h c__%!WUU*B :s)WE:W^\zRA)NcE!q1x^V^UUUUUUUU%-[9a9)B!X^r|RA=}k!{kE)\^^\UUUUUUUU! k)MN[!|z\E)ŵnc%!?ZT|{1UW%!UU J5-mN[1yVJ Z\^_A5UUU1A+˽UNc%!=sf)u+ [E!W"o[f)~#uJB^WATWUUUUUUUUUjJ!+UUJAzUZAOU1|UUATUUUUUUU  @9UU%JA-)BAU9UUVX)BA B^VW1/JB!x```JJ -)BWW\)Օ5+B!B`xf)%UUJJb"{U):XWUU  @JBA a[)B!_pJBASa JBApW* )AAM8@>>>>{7@>>v7@>>V8>>A8>>w7@>>|7@>>@>>>>s7}7h$p' G>`(i7Qr.e7* .e7-z7z !sExWeapons.ZoomSuperShockRiflexWeapons.ZoomSuperShockRifle-G.e7--|%.e7-w7.e7-v7-u7'i7`( G>x~7x7h)% w* hx7( G>g7>>vE8h7] C-u7g7.h7twg7*6g7 6g7 i7g7-'g7$f7.h7Iwf7*n7f7 f7 o76n7k7 @f7o7i7f7 n7k76f7 o7k7?i7k7w.h7*w.h7*.h7 6  i7vh7y7 G>@>>C8@>>](R8D8~.9 G(> z7j7J> ozj7(N>j7(=|j7xGame.MutInstagib(`|j7xGame.MutZoomInstagib( j7 G >_#//============================================================================= // InstagibMutator. //============================================================================= class InstagibMutator extends MutZoomInstagib HideDropDown CacheExempt; var float GravityZ; var bool bLowGrav; function PostBeginPlay() { if ( InstagibCTF(Level.Game) == None ) return; if ( InstagibCTF(Level.Game).bZoomInstagib ) { WeaponName = 'ZoomSuperShockRifle'; WeaponString = "xWeapons.ZoomSuperShockRifle"; DefaultWeaponName = "xWeapons.ZoomSuperShockRifle"; } bAllowTranslocator = InstagibCTF(Level.Game).bAllowTrans; bAllowBoost = InstagibCTF(Level.Game).bAllowBoost; if ( InstagibCTF(Level.Game).bLowGrav ) { bLowGrav = true; Level.DefaultGravity = GravityZ; } Super.PostBeginPlay(); } function bool MutatorIsAllowed() { return true; } function bool AlwaysKeep(Actor Other) { if ( NextMutator != None ) return ( NextMutator.AlwaysKeep(Other) ); return false; } function GetServerDetails(out GameInfo.ServerResponseLine ServerState) { // Do not add game-type default mutators to list } static function FillPlayInfo(PlayInfo PlayInfo) { } static event string GetDescriptionText(string PropName) { return ""; } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local PhysicsVolume PV; local vector XYDir; local float ZDiff,Time; local JumpPad J; if ( bLowGrav ) { PV = PhysicsVolume(Other); if ( PV != None ) { PV.Gravity.Z = FMax(PV.Gravity.Z,GravityZ); PV.bAlwaysRelevant = true; PV.RemoteRole = ROLE_DumbProxy; } J = JumpPad(Other); if ( J != None ) { XYDir = J.JumpTarget.Location - J.Location; ZDiff = XYDir.Z; Time = 2.5f * J.JumpZModifier * Sqrt(Abs(ZDiff/GravityZ)); J.JumpVelocity = XYDir/Time; J.JumpVelocity.Z = ZDiff/Time - 0.5f * GravityZ * Time; } //vehicles shouldn't be affected by this mutator (it would break them) if (Vehicle(Other) != None && KarmaParams(Other.KParams) != None) KarmaParams(Other.KParams).KActorGravScale *= class'PhysicsVolume'.default.Gravity.Z / GravityZ; } return Super.CheckReplacement(Other,bSuperRelevant); } >>>F8l7 vl7l7.bbAllowBoost ]%$$Checkl7'bbZoomInstagib{7$$Checkl7+bbLowGrav  $$Check G vG8B8K>6J8@v-:bQ bQ bQ bQ udƃʁ)ududududƃʁ)ʁ)bQ jW3}3}e7Q{3}e7Q{3}e7Q{3}e7Q{3}  R>$r}]xWeapons.SuperShockRifleq]xWeapons.SuperShockRifle>>I8t7~.# lt7 &bAllowBoost ]A& >bZoomInstagib|7 ZbLowGrav  t7 G(>>>@>> K8m7Q>/wX ~m7bWeaponStay(I~m7bAllowWeaponThrowing( m7 G(>Bclass InstagibCTF extends xCTFGame; var globalconfig bool bZoomInstagib; var globalconfig bool bAllowBoost; var globalconfig bool bLowGrav; var localized string ZoomDisplayText, ZoomDescText; static function bool AllowMutator( string MutatorClassName ) { if ( MutatorClassName == "" ) return false; if ( static.IsVehicleMutator(MutatorClassName) ) return false; if ( MutatorClassName ~= "xGame.MutInstagib" ) return false; if ( MutatorClassName ~= "xGame.MutZoomInstagib" ) return false; return super.AllowMutator(MutatorClassName); } static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.RulesGroup, "bAllowBoost", class'MutInstagib'.default.BoostDisplayText, 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bZoomInstagib", default.ZoomDisplayText, 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bLowGrav", class'MutLowGrav'.default.Description, 0, 1, "Check"); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "bAllowBoost": return class'MutInstagib'.default.BoostDescText; case "bZoomInstagib": return default.ZoomDescText; case "bLowGrav": return class'MutLowGrav'.default.Description; } return Super.GetDescriptionText(PropName); } static event bool AcceptPlayInfoProperty(string PropertyName) { if ( InStr(PropertyName, "bWeaponStay") != -1 ) return false; if ( InStr(PropertyName, "bAllowWeaponThrowing") != -1 ) return false; return Super.AcceptPlayInfoProperty(PropertyName); } >>>U8p7|MJw*p7a  a*p7#-( G >X(T8L8 5 G >@>>@8S8d,1 G>IR-| G>>>>>>>>Y8>>Z8>>\8@>d8>[8@>e8>>c!>_8>>@>>E(]8n>e\8a w\8*\8m>,d]8No of Aliases:9S7]8Z8%Z87]8p Alias9SZ8:Z8]8Z8V\8a G> G(`8o>,Q_8.c!n.H#9D9?H#|-9?_8_- `8 G>@>>@>>b8^8q>+g[8a w[8*[8m>,e^8No of Bindings:9S7^8Y8%Y87^8p Binding9SY8:Y8^8Y8W[8a G>>>>>f8h8x>EhM/a0 h8I稨#### D:9Vh89U h8 10 G>}IN.+9:9:$|--X! G >g8Sw*g8B9?,9?,66 %g866 %g866%g866%g866%g866%g8 G>>>l8>>>>>>J3m8}>)l8%\l87B-Rrl8B-*rl8B-m8AB-l8&l8l87B-% w*a G> {I|d! z[ -A. G> s8n8_ )_Qw*--`B-`EQm  n8 G> Go8~M_Qw*--`B-`EQm  o8 GX+X+W+G+X+W+RW+dW+\+X+gW+^+W+W+W+g+W+i*W+l+g+u*W+d*W+:W+b+W+c+W+_*^+Y*W+dW+j+W+[+`+5W+k+W+q*W+kc+R*X+uW+k*X+eX+A#W+tW+q'g+d*W+d+W+jW+TX+V+d+,g+\g+bW+PW+e*W+e+g+d*g+dj+\W+Kg+i*c+T*W+mW+Hd+NW+LW+p*W+n)W+f+l+BW+iW+wj+K*W+m+W+j*W+e'W+nX+JW+m)W+oW+[W+gW+]*W+X+I`+sX+O`+b)c+{$m+_g+mW+O+X+Ag+Kc+S*g+Ej+n$g+eW+f*^+d+ W+o2W+FW+`*X+Fl+dg+AW+v*X+b;g+R4X+I;d+D X+s#X+Z#X+#m+T+X+N#g+e*g+nW+o'W+w*m+Ug+y%g+eW+|*W+PW+tg+FW+F2`+Z*W+q,b+z'j+_ W+d<l+|$c+N*W+C+c+u$`+HW+XX+T^+W+m*W+B+W+UW+xW+~;W+`+j+xk+BW+\*b+d+GW+r4l+J+b+#j+P)j+c W+}*j+xW+a*N+hX+f#`+s,g+ql+AW+l*W+s-N+sW+_+l+k4b+#^+Kc+Vj+1X+B#g+OW+Z>k+Xj+q;W+Wl+V2X+W^+IX+`X+[X+Om+]W+U(b+PX+Kg+Gg+Hm+Nb+T2^+Nf+a+k+f%e+W+X+GX+Cg+ZW+qf+~"X+zm+zg+f*g+nk+w-g+I&W+}=d+k d+W%`+EW+u>k+u4X+pc+u&j+a'k+]k+^c+n9X+K$d+bk+vj+o%l+L+W+h*e+gc+t{g+]j+W`+|;^+I)g+j j+g+z)^+$j+Ad+gl,e+l4k+t$^+D-X+B,W+{W+`<g+E^+ ^+n&`+Q^+~.k+@f+q$g+u^+aW+x*_+a^+XW+y*g+:^+(b+)c+d$j+d+Y d+X W+{*W+pd+Zd+W X+@)X+A)l+lc+Q=b+{H<l+u3_+d d+V d+U m+X'W+~S`+G=W+~*W+o*X+Tq_+Hj+;k+C&g+x9k+@k+x;X+_;X+i<_+\)g+ae+s$_+~ m+ug+{k+j$g+^*j+z&b+z'f+U+d+Fg+Pj+^^+hm+C'W+Yk+O'g+Jg+s X+RSPTX+,X+F<X+p:X+NW+c*^+D^+JW+x3^+WW+y^+^+Wm+O*m+A*X+i:g+~*X+@<^+d,l+c+]%X+Z$^+n6^+@-_+z j+X5X+Dk+_$^+e+CO+~W+@O+}^+ $X+f4^+fl+K+X+k2j+y3O+^+{(k+ct-g+v3^+zX+Cg+BO+{j+{O+z^+J)O+|k+S)`+j,c+"O+j c+xC:O+d PUW+V>^+L(O+pj+kO+N ^+zj+I*c+Mk+K^+h9O+L W+z*W+[`+\'O+x^+d(k+Q^+W+fg+\"O+wO+{g+tj+DO+H^+V W+Zk+v"W+2qO+Im+n l+O+]O+_k+Qc+\&^+QO+uj+F*d+r*l+C5j+ok+Q4j+Lj+_4^+|k+M,W+Y+g+y"W+VX+X;k+tX+_1k+xPXz=W+RX+d]+PX+TXb+5I+m+=^+^(X+j=W+hW+h:l+U)v*Lae+@ b+^ ^+D^+Gj+k$O+yf+m O+@m+C<j+Ym+lm+s9_+mO+xk+B^+y(^+v(^+T-k+W'X+T$^+}j+`v*Pd3^+5_+p&^+h'X+@U$g+HW+W:^+|g+P6g+v4j+N_+HfE+]j+@5e+] g+x%W+n,k+_&X+>y^+W6W+y4j+G&g+a4^+E6k+h5g+U%k+^1b+c+dn%a9g+Dj+Mw;^+A c+I*^+}c+K*m+C*m+P*z*dz*e`+cX+z)X+EW+T5W+n'f+j<W+S4l+R'g+e"c+f"j+l"W+E;N+e^+A N+[N+GN+Qg+|c%N+}X+uc+Y_>O+t#O+~#^+e=m+dx"O+}#O+|#O+{#O+z#^+C^+Q7^+P7^+b8O+y#O+x#O+w#k+R&O+v#O+u#k+o O+Y#O+X#O+W#O+V#O+U#O+T#O+S#O+R#O+Q#j+R)O+P#g+9O+O#k+oO+@$O+J$O+I$O+H$O+G$^+u O+F$k+j&O+E$^+e O+D$O+C$O+B$O+A$O+e#O+d#^+sO+c#O+b#O+a#O+`#O+_#k+b%k+V5j+a%j+`%O+^#O+]#j+m&g+W"O+\#O+[#W+]+O+S"^+LO+@"O+y!^+V O+t!O+a!O+_!O+K!O+J!O+@!O+~ O+} O+z O+y ^+[ O+x ^+V0^+iO+t O+s ^+D0O+r O+q O+p ^+I7O+o O+h O+c O+_ O+] O+[ ^+C/O+Z O+Y m+q-O+X g+@%O+W O+V O+U m+{%O+T O+S k+yt<O+R O+P O+O _+y_6O+M O+I j+jP'O+E ^+jO+D O+C O+B O+A ^+zO+}^+W^+GO+{^+_ g+q9O+z^+~^+z7O+yO+vO+sO+rO+pg+rO+oO+nO+lc+ HO+hO+bg+Ag+@O+[c+qHO+ZO+Xg+|O+WO+Vg+yO+Sk+h$O+RO+Pk+g$O+OO+Jb+j+}"O+{b+z'O+yO+xO+vO+tO+nO+mj+y&O+hO+gO+eW+n*O+dO+HO+Gj+l<O+C^+o>O+oO+mO+cO+\O+[O+VO+UO+TO+RO+Qg+{"c+tzj+tK;O+Pk+xO+OO+NO+MO+KO+Jj+ej+fj+Uj+{j+_O+IO+FO+EO+DO+CO+BO+AO+@O+~O+}g+z3O+zO+yk+}8O+wg+j*k+c9W+2rW+2sW+t*k+u"O+tW+u=O+r^+O^+h7O+qO+p^+S8O+nO+mO+lO+kW+SO+jg+S4g+cO+iW+QO+hO+gW+OW+lO+fO+eO+dg+`;O+cO+aW+*O+`j+"O+^b+W+@+O+[O+Z^+nO+Y^+X^+G^+J^+/^+mO+WO+VO+UO+TO+SO+RO+PO+OO+NO+LO+K^+] ^+k7^+K7^+b PCXPCYPCD9O+Jm+IO+GO+FO+EO+DO+jO+i^+jO+dO+MO+KO+z^+{ O+yO+Z^+xO+Yb+BO+UO+AO+^+J>f+m;O+uO+m^+Q/^+g^+W^+e0O+lb+F^+L/c+F*^+R _+xl+H [^+Q>X+Z^+k6^+k6X+Yk+JW+~RW+~XW+~PW+~Wk+EO+>BX+Bp<k+U'j+kc+GX+R]X+RfO+r^+M(^+K)^+z(g+VJ^+w(W+F+W+x)b+@ ^+p(^+o(^+l(^+j(eba`X+\X+[k+^+IZXk+~^+2`X+LX+JPPv*xv*pb+i,b+x,w*jPM^+zb+5LPQS^+z W+O5^+j ^+f b+"Fg+rX+\^+{ e+b^+l ^+R^+$^+x^+{ ^+^+$^+j^+Xl+B5^+{~.^+jb+`5^+^+P^+|^+`^+A/^+I^+G`W+a-^+TW+b*^+P^+r k+Y<^+k^+x^+Pk+@j+I3k+D:^+{0^+X0k+H:g+dg+Dk+m9^+`^+L^+Bc+L^+Cj+e^+@^+ j+_j+hb+_+z k+Rm+|` ^+`^+Vm+S5m+z` ^+h^+e ^+P1^+Zb+"I+j+bj+hj+ej+gj+fj+N,j+Z4^+A^+u^+o=^+@^+p ^+t k+sw*QZPQUPQVPxJPPIPPcPPNPxp;PPLPPbPL]Py9PL_w*QYw*QQv*QPv*P:v*Xv*Wk+"w-v*L`w*QRX+D;v*QTv*PHv*Pu;v*LNPLL^+CP ;PQ+PP+X+~^+_PkPnPtPlPsPvPuPrPmPqv*v*Av*Bv*}v*~v*@v*|Phv*yv*zv*{`+W5k+y'v*oPe5v*wPT;^+^v*Vv*Qv*RPWw*SPT^+`Y^+aE+A^+~^+[/z*hz*i^+d^_^+e^+t ^+} E+cd^+V^+e(gW+c;^+h(W+uW+vW+wW+x^+| ^+y<^+m(W+]5k+q"k+J^+q(W+X:W+Y:W+c:W+|W+~^+t(m+vW+Ck+wP|:Po;PU4Pag+VI]+R5P\4Pf1P`4PV4^+G)X+g9P~9PD<P}:Pa:P{;^+M)PJ;Pl;Po9^+\(k+xM<PW;PT:PB<PQPu,PRPSPN<Pa;^+P(PI:PV^+t3g+u2j+g3]+QO+\sO+\tX+K%X+TA;O+x:O+\E9PYk+z<k+OX+u8X+^;X+RMPa<PkPlz*mz*nz*oz*hz*gPb<PPX+ZO+BP[PQ<k+@T3P;o8P`9Pk:E<m:r:S9Y;d9Pq8R;s;L;R<e+me+pe+ne+qe+re+oe+r9e+v8]+b^+zk+Ng+_HO+*EO+*Ck+CO+*DPf:PNPOPLPK<Py:Pt9PEPHO+RX+>OO+>AW+~QO+>~k+J7O+>@X+P4O+LO4j+x'^+jb+w^+Q8^+zj+RX+bx4X+bEv*C[;PDK4v*bw4Ps8^S^I^K<X+p8;s<k+T'PdX3PdV:Pdt:X+z8P5w9X+n<X+3I;P2w:k+N)l+O+iO+jO+k^+P0f+_:O+nO+oO+pO+qO+rO+sO+tf+f;O+vO+wO+xO+yO+zO+{O+|O+}O+~j+]4O+@^+w O+BO+CO+DO+EO+FO+GO+HO+IO+JO+KO+LO+MO+NO+OO+PO+QO+RO+SO+Tb+qO+VO+WO+X^+O^+@8O+[O+\O+]O+^O+_O+`O+aO+bO+cO+dO+eO+fO+gO+hO+iO+jO+kO+lO+mO+nO+oO+pO+qO+rO+sO+tO+uO+vO+wO+x^+V6b+y6O+{O+|O+}O+~O+O+@O+AO+BO+CO+DO+EO+FO+GO+HO+IO+Jj+^O+Le+Z5O+NO+OO+PO+QO+RO+SO+TO+UO+VO+WO+XO+YO+ZO+[O+\O+]O+^O+_O+`O+aO+bO+c^+hO+eO+fO+gO+h^+hk+H1O+kO+lO+mO+nO+oO+pO+qO+rO+sO+tO+uO+vO+wO+xO+yO+zO+{O+|O+}O+~O+O+@O+AO+BO+Ck+|k+bk+w<PC{:PCr;m+QPC~8l+o)^+d,O+Mg+Kg+\m+]O+Ql+b4l+a3l+`3l+f5j+ab-l+g:O+X^+Il+|8l+W<O+\c+Il+R9l+@:b+z-m+['O+bj+Z'k+x-k+e1W+E:k+}<W+K:j+`>^+n:e+m ]+b:^+N ^+EO+o^+F^+d,^+Nc O+sk+t"k+H.O+vk+F.O+xb+Xk+Cj+O+|k+w"b+O+k+h>^+f.^+r.^+W/^+{.^+n.^+`/O+GO+Hj+Wj+v=j+uO+Lc+vc+wk+x;b+y^+C8^+a0O+S^+K0^+o0^+jO+WO+XO+YO+Z^+r.^+dO+]O+^O+_O+`O+aO+b^+Y0O+dO+eO+fO+gO+hO+iO+jO+kO+l^+e/O+n^+n.O+pO+qO+rO+sO+tO+uO+vO+wO+xO+yO+zO+{O+|O+}O+~O+O+@O+AO+B^+nO+DO+EO+Fk+p4g+]1O+IO+JO+KO+LO+MO+NO+OO+PO+QO+RO+SO+TO+UO+VO+WO+XO+YO+ZO+[O+\O+]O+^O+_O+`O+aO+bO+cg+q4j+|"O+fj+q<b+nO+iO+jO+kO+ll+4l+|3O+oO+pO+qO+rO+sl+X5O+ul+~4O+wl+C5b+G3O+zj+v.O+|O+}O+~O+O+@O+AO+BO+CO+DO+EO+FO+GO+HO+Ib+O+KO+LO+MO+Ne+c$W+s>O+Qm+@^+(_9O+TO+Ug+s>f+}k+qz4O+Yk+qb5f+bO+\O+]O+^O+_O+`O+ag+FO+cO+dO+eO+fO+gb+TO+iO+jO+km+O+mPCm+IW+h<O+q^+Z^+h/O+tO+u^+ic+d-g+c-^+l-k+g.j+DO+|^+l O+~O+O+@ ^+@^+D^+jc^+jy j+jQ'O+F O+G O+H c+I'O+J O+K `+e-^+`f+w&^+`_+yxO+Q ^+y[:k+y\:j+yg;^+D8k+A2b+t)e+B%j+'G%^+l._+{ O+\ ^+jO+^ ^+`O+` O+a O+b ^+$j+yO+e O+f O+g ^+_ O+i k+}9O+k O+l O+m O+n ^+~^+;i^+;q ^+;C ^+j^+`O+u O+v O+w ^+\^+L^+O O+{ O+| ^+Q ^+^ O+ ^+Z O+A!O+B!O+C!O+D!O+E!O+F!O+G!O+H!O+I!^+z ^+N O+L!O+M!O+N!O+O!O+P!O+Q!O+R!O+S!O+T!O+U!O+V!O+W!O+X!O+Y!O+Z!O+[!O+\!O+]!O+^!^+k O+`!^+w O+b!O+c!O+d!O+e!O+f!O+g!O+h!O+i!O+j!O+k!O+l!O+m!O+n!O+o!O+p!O+q!O+r!O+s!^+q O+u!O+v!O+w!O+x!^+j O+z!O+{!O+|!O+}!O+~!O+!^+pO+A"O+B"O+C"O+D"O+E"O+F"O+G"O+H"O+I"O+J"O+K"O+L"O+M"O+N"O+O"O+P"O+Q"O+R"^+F O+T"O+U"O+V"c+_%k+CO+hg#O+hh#O+hi#O+hj#O+hk#O+hl#O+hm#O+hn#O+ho#O+hp#O+hq#O+hr#k+{8^+t^+Zj+k&^+uk+Uk+e%^+_^+x^+k8^+T ^+nk+O)^+y^+W^+B/W+R,^+j0k+x8^+w ^+Lj+~%j+A&j+h)j+z9O+,M$O+,N$O+,O$O+,P$O+,Q$O+,R$O+,S$O+,L$k+Q;^+x ^+q.^+}k+T3^+y k+c2k+s1k+~-k+h2k+K&k+[&k+M&k+V&k+P&k+j)k+S&^+w7^+D^+dY^+um+dP%j+YX>g+Yc>k+BO+[C#O+[D#O+[E#O+[F#O+[G#O+[H#O+[I#O+[J#O+[K#O+[L#O+[M#j+Mi%O+vO+wN+yN+MN+CN+WN+aN+zN+NN+DN+XN+bN+xN+LN+BN+VN+`N+wN+KN+AN+UN+_N+{N+ON+EN+YN+cW+X+k+Q:k+rc+Mh%PV%^+A.g+s"k+.k+q"N+vN+JN+@N+TN+^N+N+SN+IN+]N+gk+@g+N+~N+RN+HN+\k+p"N+fW+'Pv;N+|N+PN+FN+Z^+NN+dW+g'^+G N+iN+jN+kN+lN+mN+nN+oN+pN+qN+rN+t^+j^+`O+9V$O+9W$O+9X$^+V*^+u^+| Pf,Pp,z*\$z*[$PR+PS+X+{'O+S|']+|9^+} ^+q^+@^+u^+M B)TE)D)C)F)^+$^+@ O+h^+@v*UPL^O+i4O+h4O+p1O+h3O+{3O+S2O+1O+I2O+s4O+[4O+P2O+L5O+M2O+d4O+O2O+{4O+K3O+D2O+M;O+F;O+Y5O+v2O+Y2X+v2A+(Q2c\KIJ]e J[B D*] 3Gm Vbt CzV KP A_ ONx SF BeV w{ v$K PyZ [fS k(y TJ (aZ I{ @(I wY lsi s\ ]Lk Gw wF dTU bi ]'y Y%H >i)Y mh H%x u%I Z\Y Dsu >>2Sh s`w VG JwX gyg }` >^$p jX@ Q(O ]H&^ ]"o D ~ \sM f)@ wP sa` I(n H*} J xL tD e$U td }u lSE j T &c"e fv [H*E nT H*d :D*s gC Pc(R eD*b }'q }A ;eQ ]h)a H*o |~~ LH*N h\ Mk  z o^I |u*g pfw oF mV j f `$w M`H F*X I*h N`x I`H <~X \h [x ])H tW T i v[y jtI fZ g[j Dz oI R}Y D*V n]Gd F(k ~z @ J N(Y D*j H*x fF F*V ^pe ;}t iD [ PS :L*c :et dE bJ&T bXb k%q Uh)A Z+P CH*_ O*m W)} |@ L v)[ ^%i O z JH*J jwY |h D*w F D*U we =D*t V(C owR \l)a r)q Wl)A Q_Q QD*` cep E G@ JG*G wU Je _$u }tF }U we Ju >s~D iS T b >Yr 8fC ~S cb P*q ||) ~O _"^ ~l 'j{ S'K 2H*Y ~g ~v nqE >:x(T Te >VFt [Yz :wK r)Z KC=k `n _"~ ~L c[ ~j >~y >D*H >jO&W jP*e jcv wE ~*U we H*u ]H*C eR >US*a W&r LA*A T)Q MH*` O Bn H*p "T)~ oM G\ X)k Mq){ l ^I i&g N%x O%I H*W >\%f H*u [%D &H*S )~a bq ;c@ w%O ;da ;tq Y B F'Q ZH*b iSq d[@ gM'P Ua(` iH*p H*~ oL }$[ dj V\x >>EP*G EE*X w'h E|w B(G R(V we =_(t [C }R D*b pH*q zH*@ vrO H*A H+P H*_ n\n H*~ H+M LX\ o&k 'H*{ v%J H*Z H+i #H*x L&F H*V H+e J(t _EC D(H C(W qf ~'u {)C uR H*G H+V Q%e C*s &H*C EkR H*b H+q A @ o GN G U H*c Vk'r H+A YP >g_ >qF Q V HH*e ns H*C X Q H*` ho f~ H+M i\ cj [ x >SG W ^V X Dt Zx ~ R H*b Y @p Z gp |dW Ne |{)t QC H T U|d Jt HC IR K a vq > 6@ b"P kF*_ a"n Yw~ $M%M q\ T l mS| NK ^~ Z ^} i m$x l$\ i @ QDO {^ ;&m E} JV ;A'e Is OO*B ;a&R NQ&b ;`r ;~&B bQ ;}&` ;|&p PB'@ ^| N ~C*] WO*m ^F*} ^f(L O\ ZMk bz \lI eX jg%g >`"w 7i&F -H'V nDf ^t%u WlE ET gc [s {`"B cQ t` eq g"A o&R k"b gN'p h~ l&N 9O(^ dm xg%} &e|M a$I F*X kh |j%x b$G p[V F*f D%v vwF kV F f x[u 4mE Y"U dd S s On@ ` P _  ^ [k >>`'z H`I `(Y >>Z g PC*v n(D TT -~ e >ot GKD mO S?_ A%^ `m EJ%{ Vl'K W\ Z%m [~ @ N [] G*m r(| jJ #Z+Y s(h dw ^&I ?Z+X ]&g Vv u(D Ea(R K Ab vc Yq Et%@ sP l%^ >E(m K(| JK :M*Z >8{ j O(z [J z"Z `i ?wy S(I T(X h}*f npw >>LB&G >=pX rog nqv cF UE&U Z+f 8su >>DWC SZ 8ri ]|%w JH %niX ^"A JQ z~` C*o 7Z(@ >p~N jN&] \l poz zmJ pmX ~(f [u qQ&E sX*V zje Mu y^D %vR mH UF&V oe G*u Uu)C >qS pc js V} B m UD&M >LS*_ ep Xl@ >jO >>q_ >4ao p nO w%^ jp m 'G*M ay[ { ]k \H >oX mh X&v p%E rT _d jt tD Z&R ma uo V} oL &G*\ njj CMT mc yq V) [)N s*\ zj zx {G jX |f K w D+E jW &Pg ^)v _)H d"Z mj kx ZH _yV O f P w oH >l*X Vh my >rG jV >g&f 5yu W*E `T d d ds | C X"S [a f$q t@ `P I*` r p _ i@ Ce)i I*y ]$I r"W <@q l 9O z` E%o j"~ i"M h"\ o&k &L| &bH uV >X*f Jfu t&F X*T Qu*b cwr >qi(B 7bP nj%a XHq hwy ^g(H LV Kf Iu ;M*D aJ*S cC*b Rq j @ hP Ha h p EA mLP ;@'_ ;W&o `~ g M Q[^ yn >ZD*} yM |\ vk wz dA*I gL'X U](g uw MF KU |` d |Js LB gQ O` Ut%o |}) UD*O |w%^ p |t Q*Q c'_ A*o Pq f'O R%] wk Iz i'I ^D%Y b] u l Vm'z >wI uY th Pw D*G nW =m%f ]Z+t fC o&T hH*d gr ^A W(P rw_ =t%o *X( *Y(N *Z(^ a'l 8kz 8lK 8mY /^g 7Y(u ;](E @T 8ub 8tp w~ AgN 8qu 8pC 8oQ 8n_ bm M+{ >8lJ 8n[ 8Hl fs} cp B1 mp n@ cP U@_ Z+_ |Um } {K UZ {i _x QG WV xoe ou ^D qSS rZ+b rmq rnA LQ J ` c o \\~ 8tM Wk)] Ql Jg){ d) J c)W 8ge `)u ?mE ?nU ?oe "[t aD [S p^ c p\ s prC x S w b psr pMB pSR ab n4[q mL H)y tH Z+X mg nw oG }V cf Q)u A {D a } pN >Z+~ iM h\ hl t A{ kJ|PGFuM]][ka yXI`Wot for toRBoPRk KaZ+lx]{x[Jh KYj]dlZ+sj[B^^QU``Uko]p ]d MEL%ZE`hOmx=Z(HX FW W T]zo qzn  1$L1~$\1s&lU d|&}$`^nx|M*JdZojv'{pK~ Zu'hixlIt'Zs'ipx&k HqVpfI suhh^xdGeWtgVzxVj'FaW CfB {uqpS@d'Q +`-} ob'~-| N>J*\x k}z[Iu Y^'hpwxo^HMWthk[w<q G-K'U-J'c-Qr^[AG'Qo`E'qL)UND']SwlF{RwTmI+c;X&rmWA;{&RNBb?wd Ps0cB&` S&cSs-@#B M%Si abpK*SOi^ cn I%~ YNF%^r&lVzL*Im"WLfn"uo"DUR *a_r^B\RA*a^q<A e/PK*K*O|P_tn@#~dOU_knl}kMl\`&lk|lK]&[kjUyJ GrXlg`wJ*FcVz"edu>kElTkdeslCkS>>>lbkrlAsvQzk_sunpk~>epMeX[\ jeL&yekIYYPJ*jW zUR*I8YX}iS xSSIXYWLR*hMPxG^G>>M VL eK tJ CI Rva> T%p8t~8sL.z%[&Lj'MypHV~fqv&YDd%UxdIGr XcyY\U*kSaP|U*LaGT[!U*o9r}YM>!J*\!r)laD){#MdanLsR@*4H1yG GlUmnvAG $wa@[)U*[>j :k,U*elAs&U*tkICWbLTRn=U*@z >N=] Lp8]6U*U Gsc m'V%ld}@ 4a@`U %m'uw W\y =s?U*p}IAU*H>9] W9U*hYyvgQDC _nLUMU*aMLpHMlhN %GhvY^:@*4Mm_D5zXU*o%m^@Z8^Pr)V-se%kuXC%M %JR\Yn[U*} %XcNYqrR@a@*4XRPU*jcxx%DzGtfAxg>t5w_GTlfU*@V@*4KOf_PZX jm@*4Hi>%G[qpU*L>I t[wYOzU*hR`w>>>xHWw^_a]mJ rJ{|x Vw%j]M|U*j>U*yfyHL pVC 5nLF}@*4ORU*aiXp>M nH>A Ev@*4a{@*4e\U*A^^PMn5D5}N pr>U*b>r)qP n@SGn>>>U*ut )CH*lU*}CBKU*M{6[U*Q&hb`5GTBU*V}PeU*uVyDf5P}[PM>R p]@*4YMnAfuhgU*O} ,^cJNBY>BJ[>_:e]I_S nhqf V@*4n|>U*jU*yU pIVzZyU*SU*bAWe?rV nq@*4|_HU*[IU*i@*4u,wMU*l`e{TK`NU*kF %yt^do| z~U*xcH 0-WdqD[uZE\U]e@*4B u|U*wC|FU*BU*R\ _a |/@SDoMvssU*i@*4s w^jU*z[6J} vZ~)Pa $_U*C<hJSz9]<X0m*]b }mU*jE,yD(ex)MU*vy)DU*mWo{$EjU*oZ+~U*itowpXfc &~TgdYKL2ZU*LJ6ZA @PuZP<h5j_]_Ft|<VYpd &Ie oe o}u hl U*TJ2cezUf O| C^g"aU*qg A~ZPKojU*Y@*4f h L_Nl Gmh t@*4Y ChH\D2dDJV&W;`u<["U*WA ee>$U*J|lX L5Dx_yQX)x&ib/w01f&e$W-U*{)1K@*4t|0U*pc)AH3j4u(]5s*E4}gS$Lz K%F4M @U4@@U|kU<@*4P @QFPgm^V Mt&cBC>@*4F ENRKC@*4k ]mS%HmBWmVfmvum_'DhlPS@*4ocCR 4`-a4$QN`y_4^OXCXUggrm5|hrl4qUweg{m8t{$ElCvqF'gh{lgw zJ^Z[hZ_x>>XNH>1VMkG>>gmJr-zF|<$AB<O-C-f ypr@*4xi|ahlJ]XdgJuKDY@pU*Y a[g b aBsU*c Rfqh&WvU*}`@*4`K ] XkxU*ChzQ}U*K{@*4b Y Sm{gwh j^wnKU\(`U*HzuVv Kp YZhwsfkB`Am g}nU*kayy WXr e &J>|Up>QiE7Tn CB@*4TEYV YrSo@*4JBBmL@*4j#y]rc@*4bUZ4w$(kxCS@*4XV p)np~U*NJZs\JWsOz@*4iBa3k4N^Q/l$][@*4Dxwj|@*4`2fwVF@*4Q\Z| m@*4jiFPS@*4s"cU*VVu'd[KU*[Vj Vi]KO@*4QNA@*4s_NH MRjM_p@*4llU*XVt )fU*OVz]@*47WVI[Np'iV$_wVQKVV|lamM@*4f ^@*4Q DV @Ue wU<@*4sLU*xJMSW &OXhU*@U*NDr'\@*4tk[m_@*4TL\t ` OIT@*4w]ACT U*W @*4| g YXc!IH{!F6C!U*y!@*4dI!Hwm)$Dd) TTh)JV |) @*4nR)@*4T@)A(T)@*4Cd) M Sg)@*4Ez) N S)YuR)G( G)H( S)@*4N_)@*4{m)Krh)@*4cZ)nP j}*%[fg*@*4cM*n$p*q AT*T 2U*&aBG*U*I*L;W*c CR*WU*@*4bl* [ wN*4U*E*>nQ jS*@*4j}*6]gg*@*4cN*nR dq*TNU*n@*4uc*GMX*@*4Be*{ 3g* Q $Z* }$~* N $M* L'q* O &X* z $~* w %b*s)G* k %U*s)z* C 'H*U*o* q %}*^b*Zq*VA*X%R* i_b* S SA* @*4DT* T SX*]@*4lk* ^ $W* Z ${* ~%_*$}$D* _ ,R*4o~* `yN* j>G* $fE*4nk*-@*4Z{*GbU+v3w+ .i8j+W@*4jb+.\7L+JAC+4Z+D+zNWS+.`Mj+.jOw+.$PF+OU*V+V@*4Kd+.M(o+rPW+Oog+Arw+A@*4Di+@*4Xm+=U*E+ Y ST+&@*4eg+D@*4^L+Tej+uxO+H@*4;G+EU*B+[ TR+J@*4Cf+ \ Si+L@*4E|+ ] SA+OZ+T+@*4`c+]NcC-@Lf-@*4Fr-PU*x-~@*4XH-@*4^`-vZ~-W@*4\ X-` Xt-UU*L-Z@*4P [-a Jk-@*4Zu-lU*O.lo]._hm.IS U.lnh/^U*x/c@*4OI/pWyX/e@*4OQ/pZy`/p@*4\Y/_@*4Zu/ V nO/@*4m}/s}j/lmg/oNFw/o@*4@}/Pi}/g qf/@*4AW/QFX/I@*4]^/|_{/U*Z/>>{@*4zj/9smd/nQ/ma/ i gq/9PGX/E@*4]_/`^g|/@*4qc/WYT/ |m/IJi/y `s/@*4ES0oE9X0cZQ0%@*4Q)k0@*4r6|06@*4Wn0C-E2DYr2WK2l $Y20:}2p:w2@*4sq2@*4kd2n ^O2Ym20@*4v{2&`|q2\m2@*4=I2 p MF2@*4kS29@*4t ~2KY r2`K2Lx[2a3S2$hF2@*4in3lEW38@*4M-\3U*i3@*4x3sCw5]D z5aL~5fPJ5@*4mZ5r UG5@*4p\5U*L5 w B[5@*4h]5]BE7Fw G7Dp~72@*4^#n7y)L7CV[7`q7@a@7ca7_p7d@7V@*4X+P7th7@tx7 El7`Aq7xr7m3@7k#s7x$V7}%z7^"_7TGn7@*4Mu7`JB8q2L8x#~8}%a8^"F8B'U8U*|8`qJ8j;{8~ 3v8z P$i8D*M8k$\8`R@8jSR8d 3e8}$X8^"|8T_K82@*4ij8$WS8`|j8>NCf8U*i8@*4` y8N \Y80@*4Hu8 4H}8 Q/E8mt8 IID85M8~5B8N 0w8f3g8>}dZ8pA~8@N8eeM8v r8d@8eP8 R C`82zIc8@*4Cl8 C So82sMB8``nO8KH}8U*E8@*4tT82nwH8ES82m_R8 H Sq8@*4HD8wBL8&@*4nN8U*|9 @*4K J9@*4ZU9M Go9nh@v9ov9nQ/F9nu9nIIE9mN9Z+^9N)m9#U*V9#Xd9#["t9-@*4TD9e p4hX9 pzD@9#Z"D9_T9@*4~d9N bb9@*4FD9@*4wJ9H@*4VA9P @W93W94yJ9Q/C9U*r9II@9 zDI9FMM9"_Z9&@*4:j9Q Rd9(@*49v9R Xo9,@*4=G9PD9irT9S VF9>j\9wF9Y)V9Z)f93@*4=t9T Zq95@*4kK:\ Cv:7@*4?y:] \x: { oT:;@*4>C:a)A:^ \S:=@*4=o:b Jl:D@*4=v:K@s:]U*s:EA:$TF:KOZ:c Ui: z)~:E[g:E_w:cV F:7f)\:T_l:]oK:M@*4@[:d ][:P@*4=x:~#u:g ^X:dAv:T@*4=w:]nt:k [D:Z@*4@_:}@*4Z_:>@y:]my:WU*I:n bY:_@*4l{:pCg:NSj;\U*};o CM;b@*4>P;AGN;DXU;{ Lm;e@*4?y;Eex;g@*4>];F][; cx;JY[;k@*4t;H@s;m@*4ks;R\^;^ z;\I;PX;D2g;KfY;xU*;xnM;xm];@*4vm;xZ+c;N1r;U*c;&_xq;ni;yfy;eY _;@*4Sx;z@*4mK;}Sjx;@*4Eb;}Tvg;@*4U];8Nqr;@*4Cc;@*4Ef;}vck;@*4SN;A1a;6Jk!R;T }<}M<d]<em<t}<U*N<&^x\<6D~T<T R<}b<dr<eB<tR<U*c<E{q<8KAl<wnm<@*4W[<U*r<xs@< xBs<~^u<U*S<yUb<@*4Gw<a_~>@*4j ]>w {G>@*4f B>C]h>AS-E>Ir>U*A>AS+O>Iz>U*I>u BW>@*4Z%V>T p>@*4~@>d~>eN>t^>U*o>AS,}>Ii>U*x>MF>B*U>B*e>>n+vs>o+pi>p+cY>q+m|>r+ri>s+w[>t+wR>u+dI>v+ym>w+uf>x+y[>y+wT>z+|K>{+gG?|+zn?}+|h?~+|d?+w`?@,`W?A,uw?B,ul?C,fa?D,sG?E,vz?F,lp?G,z\?H,gV?I,x}?J,Ju?K,X?P,W?O,f?P,u?J*D? N,S?T,b? S,q?>>>>>>>>>>H*@?H*N?g,\? k,m?w,|?|w,M?c,$]?v,A?o,P?m,^?b,/o?e,F^?o,d?{,Pr?D*B?A-R?},_b?B-A?~,&O?H*u?`D?H*S?N-a?`r?L-B?M-S?F-^d?]G*B?O-Q?O`?S,o?N}?K%L?k,[?Mj?j y?IJ?JY?Kh?Lw?\G?K-hV?N-~?L-M?I-&\?U*B?G-VQ?U*g?@*4z w?5Y-q?6D*@?3D*P?6_`?,X-q?6Z-A?,E*R?,_a?6}$r?3C*B?3_Q?,Ub?6Ur?3UB?T-uR?3BG?,BV?,U*e?6U*u?6BE?3U*T?T-md?W-'Q?U-lx?T-md?>>>>>>>`Q?tCP`?>>Ru-p?Qv-A?>RH*P?Ov-^?y-m?r-~?MlM?MY\?M}m?MU*|?> JRM?>k-[_?IYz?%k-[I?&d,gd?QU*K?OU*Y?Jg?l-Aq?VU*r?-A?ZC*P?|-/^?>>^U*M@A.,[@G.G@>GH*X@GJ.g@^0_u@y H*T@Y/Db@f0yf@ii2_@ ~1p@XN1t2@in3s@T0^D@i\3b@il2s@>ii3D@>>>y y2U@F H*f@{ Q&u@>>> jF@ ^3W@ G*g@ig/v@ {1G@e E2X@e Fj@? J*{@q G*I@e H*X@e B2g@ ~2v@>{ tG@ TX@> C*h@] H*x@>e M5F@kk.W@> ~h@f!x0hw@ z1_@ d1n@O H*|@ k4K@ UZ@ w1j@ H2x@ Q*H@ m1Y@ie2j@e G*y@e F*G@> X2V@ #f@>y H2u@b H*E@F US@e@1d@P ws@` B@0 H*Q@ H*_@ u-n@ a1~@ }1M@ `2^@er1m@ D*|@ O*L@ O*\@S Vl@ b2z@F G*K@o4Z@ D*j@W @3z@ D*I@>H*X@eg@>>e0w@ O*F@[jV@ r)e@e~0s@e}0B@e|0Q@b U5`@{ f&o@o Q5~@iO@ii/_@S Vn@4 G*@Q 4M@4 H*\@>Q a+k@] @3z@> H*I@ y2X@ q3i@>dx@eA1F@ H*U@N0c@r u-u@>id2E@ u3V@ v1e@ [t@ H*D@ F*R@>H0qa@ez0R@ }4c@> b2r@] j2C@ dQ@% Ta@. n2p@fH*~@> o3L@0 }[@> n2j@ H*y@Q P5H@9 H*V@i}2d@O K2u@H*D@^ UR@W J2a@o E1p@H*@@>iN3N@{ b&]@{ a&m@G*}@e G2K@q @2Z@q H*k@ N5z@ _I@iq/X@ Ig@ G*v@>>>>>|c1E@ }*U@ L*e@> Z4s@cS.B@>>>>>4 }S@k3b@ [5q@g1B@T3Q@ H*`@ a1n@ r2}@ s2L@Q u*[@O1j@D1y@Q [H@ TW@ if@O U2v@f]0E@>O @3S@q1b@ p3r@q M4@@] }O@s c5^@{ _n@{ c&}@{ d&M@{ h&]@q l@>{ e&{@J4J@ir3Y@X N5h@iM3w@j3G@y UU@W }e@y b2t@ g&E@ a+S@ \b@S o4q@b1A@S v&O@k^@tm@iF3~@iB3M@ T4\@ [1j@w n1y@ `HA[b1XA wfA\5vAMEAif/TA |2nA x2}AF D3LAQ l3\AF j2kAF ]2zA O*JA MZAA n2iA[MxA O*GAiO0WAf3qA m3@AW2PA|4_A>> H2mA>>>i_3}A n1LA u*[A>U/kA.yAk HA n1WAim/fA N4uA|KDA _2SA> p2bA S3rA>io/@A> a2OA r^Ah1mA m4|Aq0KA}/ZAd5iAK5xA [1FA }4UA> ^5dA J5rA n4AA) n2PA )_A`0nA> ^}A9 }LA t1[AV1jA= n2yA m2HA= a1VA>`0eA>F bvA_5FAF/$VA[2zAiG0IAG1cAP [rA 2BAO \2PAC fnk_A @3JAO Z2YA l0hAiC0xA T1RA tdAiH3uA B1DAu0TAiL3cAS irAI1BA UQAO R2`AW w3oA ^~A] w3LAq w3[AfU.jAiP3yAiQ3HAiR3WAiV3fAi[3uA{ kDAis0TAib/cA T4}A R2LA X5[A [1jA }4yA C2HA xXA q2gAjvA C2EA C5VA [1eA n2tA MCA a+RAit/aA k1{Aib3JAil/YAThAin/wA c4FAip/VA>ir/eA y)tAo k/NCAoi3QAo O/NaAjn3oAfT.AfV.NASo 8_Az^3WAE1eAl\3sAis3CA|g/TAfX.bAP16sA.iAW}WAQ5TAabbASDA:WAk:QAm:KA:EAavAqD}uA U*rA}2@AX0_PA U*oA w}A{0?MA|-LA U*yAA/EGA f/CLA U*OAml2_A [5oA U*~Al.kMA_&nQxAgi2IAif2YA f2jAd/,xAmPdAinYsA> C/1LAA5}AQidXLAx./dA SA MbAX1pAie/hAF1gA>L1rvA>>>>>y2hAiY0}wA> CtA>>ia0jwA>~.daBin.bEB U*gBruB U*gBir.FwB" U*}B>ijNLB% U*ZB>>if.WiB>) U*@Bid.(NB, U*vBi].pDB>io0RtB>0 U*FB>iK0jUB>4 U*B>>i\0PNB>9 U*^B>ii.6mB? U*cBJ/NrB= U*@Bi^.5NB>A U*CBi_0lQBD U*}BiT/HKB>>>USBL @*4obBk!k0uQB> ^5FBiy.JTB f Z^B zCxBS U*{B[/jJBV @*4stB L/$gBk!E0kKBip.gvB Q/6]BZ @*4pSBk![0nCB^ U*qBW U*Bi`.IMBB/vVBX U*LB] U*ZBc @*4oiBiN/ZXBk!z/frBf@*4PXBiM/ahCk@*4lICe U*uC@*4tDCM5xCc@*4}FCFCCe@*4gQCi@*4FxDo @*4j~K%h0LhKu @*4ctKia.KWKd,QbK `sKq U*SKf!~/\bKx @*4X~K~.QVKf!x/xgKiK/@_K} @*4c_Ku.eBK>f!p0MgKsy2tK @*4VCKiI/\ YKf!t0TuK @*4QIL}1ZLf!g0lhL}{1TL @*4[dLf!U1RL @*4PQLf!Q0[aL @*4d|LiH/h`L>>f!Y1KHL @*4LSLz0_Lf!j/LoL @*4K{Lf!I0QFL @*4\WLf!Z0hsL @*4W[LC1xrLen.2jL U*\L H*jL U*{Leb.b JLj0)lL @*4\UL V0ZqL U*KLP"J0w\L~2SL @*4obLe{.jQMP"v/]{M U*XMef.pgM D0MWM U*dMe`/F rM U*xM @*4YFM U*_MP"S1GnM @*4buMer.>WMq.aUM U*vMei.DDMh/VHMP"A0q^M U*OM @*4d^M[.BMeG/@RM U*RM U*`MeW/hnMP"c/^VM U*tMe|.iBM @*4ckMh.ANM U*OM @*47^Mcj1UMci1eM~.buM S.WMpa/neMcc.SMw U*bMP0(pMd,_XM U*wM U*EM Q/BSM U*UMF5 dM> e0fmM@*4KSMA S-^N IKN U*ZNASZhN L/$BN U*fNic3tNk.CNkv.QNc!en+G_Nc!eo+IfNc!ep+aoNc!eq+iPNc!er+kyNc!es+AdNc!et+MeNc!eu+NrNc!ev+V@Nc!ew+wVNc!e+`MNc!e@,pmNc!eA,^]Nc!eB,T{Nc!eC,SONc!eD,ebNc!e~3JGNc!e3}QNc!ez+\NNc!e{+ejNc!e|+eONc!e}+TtNc!e~+aHNc!e@4xiNc!eE,CaNc!eF,_dNc!eG,iCNc!eH,DlNc!eI,CpNc!eA4SsNc!eB4[FNc!eC4baNc!eD4OCNc!eE4aRNc!eF4JsNc!eG4J}Nc!eH4\GNc!eI4ncNc!eJ,zQNc!eK,OKNim<ZNie<lN H*}N J*LN^<ZN G*iNd7]xN #UN bfN S<vNii9GNeV;XNic<iN H*{N J<IN jZN* ~2kN ~2|NC7qMNid:~N };MNiM7^NC wmN H*}N4 H*KN fYN H*gNiW9uN { FNiT9VN m1gNR:xN \2GNj;VN @;fN wtN J:DN I<TN jeN C2vNC ~GNT8WNi]7fNC |)uN C2EN H*VN H*eN S;sN G*AOI H*PO q2_O> 8nO j}O UNO e^O r)oO y2~O [OOs:^O o<oO b9@O jPO faOP ~pO H*O q:MOL ~\O [1kO H*zOs ~:HO P<WOT ~iO D*xO C2GOC ` VO^ jeO^ ~vOir5EO H*TOI ]9cOi^3sO4 N:BO 4SO [cO v9sOI h;BO H*SO }4aOcj5pO" H*O" H*MO f\O wkO H*{O; H*IOeG7WO H*gO~5uOil:DO H*SO0 H*aO H*oO~}O r7LOiL:fOi]<uOg6iDO1 VmO* m1|O @9LO H*[OqH*iOJ%wOc{%GO* [1WO l9fO< VvOiQ9EO dTOiX9dOI G*vO Z9EO HSO { bOC JrO# VAO fPOI u9`OL H*qOL H+@O" B;OON;_Oq z:pO ^:~OP H*LOP H+[O [jO [zOWJO U:YO wiO H*yO q:HO*H*VOT H*dOT H+sO fBOK [1POK }4`O^ H*pO^ H+OiZ;NO b2]O [9nO H*~O [9MO H*]O r)lOe;{O A<JO f9XOE8fO H*vO a+DO< H+SO H*aO M8oOC c1AOs M:QOH;`OC })pO jO b2PO P9aOs f<pO r<O C3NO k9^OO L<mOa S7{O YKOd6ZOj6iO e9xO G*HO e:VO1 H+dOs C;rOx;AO* }4PO { _O H*oOT<}O H*NO N9\O `jO { zO fJO# H+XOiK8fOip7uOi_<DO }4SO [1bO Z+qOn \<@O k;NOK t8]O d;lO8h6zOn v:IOT ^9XOq5iOn U<wO Z+FO$ H*UO$ \cOi[<rO^ ^9AOiX<RO j9aO fpOu:@O w8PO F*`O I*pO K*@O y;NOiy6_O [1nOi^7}O p5TLO }4`O x5oOG;~O r<OO F:^Os X*lO2 H*{O];IO2 \XO [gO ]:wO B;HOL ^9XOi;iO4 I+xOS:GO [1VO }4eO4 jtOO:EOe)UO D*fO F:vOs p9DOs B:SO t6bO D*pO {7@O j:QO F9`O C9oO T~Oi_8NO H+]O kO B9zOC KIO [XO> H*gO NuO B;EO A*UO> \eO V9tO[S:COck5ROP ^9`O? u*qOA `:AO? QQO t6`Oa g7oO J*~O L*OO t6`Ot;oO J2~OL lMO; \\Oa a7kO c7yO r8HO A9VOe#dO t6GO8 `:VO`fOdvO }4FO k<UO5 `:cO [1sO ^6BO Z<QO t8`O D*oOP l~ON7MO0 \[O fjO, `:zO jJO v7[O K*jO u7zO( `:IO [1YO t7hO }4wOT lFO" \UO SdOim7sO8o6MO8p6[O o:jO t6yO^ lHO y8WOi:hO {9wO k;HO S6$XOi7P|O [1LOiO9[O }4jO _7yOiA:GOiG<VOb7TeO Y6|yO x7uO `:DOL,f7{ TOiC<OOis9^O^ SmOit5|Oio5KO U6$ZOis7~OiO8MOiv6\Oie8kOiO7zOiV<IOi\8XO O<gOiL8vO wEOi}7UOiB7dO j~OL,U8BOO Y9QO z;`Os u*qOs @Os T2OOs R.^Os U;mOs g<|Os m2KOs G:ZO YiOs jxO b2GOs \;WOs n;fOs \9uO O;DO@7USO w5&hO Y9NOic8]Oij8lO U{Oi^8KOi[8ZOiZ8iO I+CO bRO C9bO y.&qOz jWOiY8hO O;BON6zQOa j7KO! W9ZO# T9jOiW8zOil7=HO NEOiV7LSO e<_Os U9oO i9~O> U*NO z7i\OjPEOiR7)UO U*~OiC8~LO W;JP fEP U*TP `4bPiZ7VP q _63UP `@HP zMHP q x3UP U*HPiK6\XPq `6EtPe6CyP U*|Pi|5oJPk8dpUG*TVa>dV[uV R>EVe>TVX*cV }*rV^>BV[>QVd>aVY>pVW>VVT>fU[U>w {^ n1rh ]>Ah ]>Oh h1^h[mhw}h \>Mh M>\h L>kh U*yhs h'Gh`( tnhx h?bhU*ahv ] aphU*Qhn1_h]( ~.(nh J>CVh @*4k#YhU*Di  qRivK>hCi ~.~ki}*ii U*yi Q>rGi @*4NyiU*Gi] |^UiX(  %siu-Xi d,%hi] I2MiU*ib>Mi>&H*Oi"H*]i&L*ki"L*|i"r>Mi&r>^i#b2oi#H2i6t>Oin>i]i io>[Fir>air>oiq>l}i+}$ii)E*wix>]GiIDdi [hi0H*Ci0[Qi2}$ai3}$oi }>G}i I8Di _ k|i ~kgi