*9Fh99SA)3t-BBBR3W7W8W9W:W;TVoprstuvwNone HudMutantColorCore BonusPackEngineSystemMinRangeMax Lighting LightColor Movement CollisionKarmaForceStaticPrecacheCreateInventory SetMutantxLastManStandingGameReceiveLocalizedMessageSendAllCurrentMutantMessagePlayAnnouncement xMutantGame UnrealGameTintsPosY RelativeTime ScoreEventYZDrawSpriteWidgetDrawNumericWidget LerpColor ParseOption XInterfacePlayerController RangeVector AutoTaunt CheckScoreX ScoreKillRecommendComboFindNewEnemyForOffsetY NotifyKilledXGameSetInvisibility AdjustSkillRandomTeleportMutant bIsUnique bFadeMessageSendCurrentMutantMessage AIController Lifetime DrawColor DrawPivot SpriteWidgetAcronymSendCamperWarning DecoTextNameWidgetTexture RenderStyle TextureScale GameName MapListTypeOffsetX StackMode ScaleModePosX xMutantPawnUser GetStringClientReceiveGlobalPickRandomTauntForTimerKillHint SendMessageScaleWinTopWinLeft WinWidthIntBoxX1Y1X2Y2 WinHeightInitComponent CaptionWidthLoadMutantRangeFontCaptionNoneTextureCoordsComponentJustificationNone IsCheckedCheckedNoneXRadXCen WeaponPickup LastMaxLivesLastGoalScoreYCenYRad LMSMessage Controls bNoDeletebNetTemporary bHardAttachMapListLastManStanding bOwnerNoSeeMapListMutantMutantGameReplicationInfoLastExtraLives MutantGlowMutantMessageMutLastManStanding MutSquadAITab_IALastManStanding Tab_IAMutant SmallDotSizeNoneUpdateRankAndSpread BigDotSizeVector DrawHudPassA LMSDataEntryCampThreshold PostLoginHUDTypeLogin InitGame GoalScoreReCamperWarnIntervalNone MutatorClassWeaponNoneGameReplicationInfoClassScreenShotName bCamperAlarmMutantMaterialPrecacheGameTexturesMultiKillBonusBaseKillScorePickupMutantSuicidePenaltyYouAreCamperMessageTickFXInvisMaterialLogout xWeaponBaseAddGameSpecificInventoryYouAreCamperSoundSetPlayerDefaultsSomeoneIsCamperMessageAdrenalinePickup ReduceDamage UDamagePack PickupQueryPainterPickupRedeemerPickupEndGameFindPlayerStart EnemyChangedRatePlayerStartSomeoneIsCamperMessageTrailerYouAreMutantMessageNoneSomeoneIsMutantMessageSomeoneIsMutantMessageTrailerNone RemoveEnemyCheckReplacement SetEnemy AddEnemy FFAMessageCheckMaxLivesMatchInProgressGetLocationName SpawnBotNone DMSquadClassNone TopRadarBGCenterRadarBGNoneCurrentMutantColorTextureMutantRangeFontNamePlayMaxAngleDeltaMutantRangeColorOverridePickupQuery UpdateGRIAboveMutantColorLevelMutantColorTargetScoreStringLifetimeRangeSecondsBeforeInactiveAutomaticInitialSpawningInitialParticlesPerSecondPostBeginPlayClientSetLocation GiveHealth Emitters AutoDestroy DestroyedSkeletalScaleUseSkeletalLocationAs UniformSizeStartSizeRangeBelowMutantColorRangeDotColorLevelRampRegion ClientFlashHandlePickupQuery StartBerserk StopBerserk bCenterRadarStartLocationRange MaxParticlesCoordinateSystemFadeOutStartTimeColorMultiplierRange ColorScaleUseColorScaleRangeRampRegionDrawCrosshairNoneNoneNoneNoneNone bShowPoints PawnOwnerPRI PawnOwner PlayerOwnerBotEnemynextControllerbAdrenalineEnabledSkeletalMeshActor bIsPlayerNone AirControlJumpZ AirSpeedGUIControlleroutput WaterSpeedClipYColorModulateDrawTextJustifiedSetPosbotname GroundSpeedSquadAI UnrealPlayer DeathMatchUnrealMPGameInfoDMSquad bAdjustSkill bAllowTauntsControllerListGameL bOutOfLives bIsSpectator OtherPRI VoiceType SquadMembersEnemies NumLives NewEnemy PRIArraybSuperRelevant ComboName bSeeEnemy OldEnemy GameSounds FanfaresNoneUT2K3Fanfare11NoneInterfaceContentSkinAScorerMultiKillLevelTeam XGameShadersPlayerShaders InvisFinalShadersEpicParticlesHotSpotFlaresBioRiflePickupSniperRiflePickupShockRiflePickupRocketLauncherPickupMinigunPickupLinkGunPickupFlakCannonPickup bAllowPickupIteminjuredKillerInv xDeathMatchNonexPawnxPlayerExitingNoneNone bBerserk PawnClassPCmaxDim NewPlayerComboNameList WeaponType XWeaponsPainter RedeemerInOptHudBase GUIComponentGUIMultiComponent GUISliderNone GUILabel GUIImageNone moCheckBoxmoNumericEditTab_InstantActionBaseRulesTab_IADeathMatchNmyLevelGameRulesModifiersNone MaxLives bOverTimeScore PlayerNameNumericWidget PassStyleValue instigatedByPNone DigitsBig mySpreadmyRankMyScoreOptionalObjectNoneNoneNone RelatedPRI_2 RelatedPRI_1Dir Momentum HitLocationDamage DeltaTime MyControllerMyOwnerOtherCollisionRadiusbHiddenPortalURLNone VoicePack ScoreBoardNoneMapList GameRules LocalMessage IARulesBK1 IARulesBK2 IARulesBK3IARulesGameSpeedLabelIARulesGameSpeedSliderIARulesWeaponStayIARulesTranslocatorIARulesFriendlyFireLabelIARulesFriendlyFireSliderIARulesGoalScoreIARulesTimeLimitIARulesMaxLivesIARulesAllowWeaponThrowDynamicLoadObjectAnglejiAlpha ReturnValue Velocity Rotation LocationBoxRGWCBLMSGameMutantLocation MutantPRINonepred mutantGame mutantPawnALocationHistoryNextLocHistSlot bWarmedUp ReWarnTimeNoneLMSData ScriptText GameStats LevelInfobAllowSuperweapons GameInfoNone OtherPawn PlayerStartCamper HistoryBox bSentWarningnewdataHUDCurrentMutantNonePlayerReplicationInfoGameReplicationInfo Inventory Controller DamageTypeNavigationPoint PredPawnpcPredMutatorisPreduPredxKillerxOtherxExituKiller KillScoreCanvasFontLevel FinalBlendSomeoneIsCamperSound SwitchNumEmitterPawnPlayerSpriteEmitter MaterialParticleEmitterActorbMutantEffectbOldMutantEffect MutantFXStyleYawOptionsNoneSoundErrorMutantRangeFontFontRoleClassPackage TextBufferObject FunctionState bTestHudPlaneRotatorStruct StrPropertyStructPropertyArrayPropertyClassPropertyObjectPropertyFloatProperty BoolProperty IntProperty VertDiff AngleDelta MutantInfo BytePropertyLastSuperWeaps MyExtraLives MySuperWeapsClipX MutantSkinsMutantGlowFinal big_circleGlowEm0IARulesExtraLivesIARulesSuperWeapsNoneNonekeysGetSmallerFontFor__OnChange__Delegate IsRelevantClientReceiveComboGetMediumFontFor FriendlyName StartEffect Description ExecMessage StopEffectExtraLivesChangeAllowAdrenalineChangeSetTerrainMeshAllowPickupsChangeSuperWeapChangeSetIndoorMesh ComboCrate ComboMiniMe DrawTitleNone IsPlayerPawnScoreBoardLMSHudLMS DrawType Duration CanSpectate CrateActorPlayersRemainStringLivesRemainingStringInitialViewingStringNoneDrawSpectatingHudbStasis GrayedOutFullOn LivesTextMutCrateCombo DrawMatchID DrawNetInfoScoreBoardType DrawScaleNetUpdateFrequency StaticMeshGetConsoleFontDisplayLocalMessages xPickUpBaseUpdateScoreBoard HudClass ScoreXPos BoxMaterialTitleMenu NowViewing WhiteColor TurqColorBeamsbWaitingPlayerNetXPosPRIViewer InfoStringXL OldModulate ViewTargetOutdoorCamouflageMeshIndoorMeshDrawscale SetDrawColorbNameFontReduction MaxNamePosnetXLscoreXLOldColorModulate deathsXLSetStaticMesh BoxWidthbAllowAdrenalinebAllowPickupsYLLastManStanding LMSLogoSmallTextTopMedHSmallHCombo NextMutatorDrawTileStretchedDeaths PointsText DeathsXPosEffect OwnerOffsetbHealthForKillIndoorCamouflageMesh bCanCrouchNetModeGRIOutdoorMeshDrawscalebDisplayMessagesBoxTextOffsetYDecoTop SetDrawScaleHeight MaxScaling NameXPosPlayerBoxSizeYSenderScoreBoardDeathMatchHealth MessageFoot HeadFootIARulesBrightSkins TowerStaticRock TowerStoneCEgypt_techmeshes_Epicegypt_techpassagesec6HumanoidHardwarejribbedcolumn01HA OwnerBase PlayerCountfullBase SquareBoxALastAllowPickupsLastAllowAdrenaline OwnerPosFontReductionMyAllowPickupsMyAllowAdrenaline OwnerPRIHeaderOffsetYOutTextNetTextbOnlySpectator NotifyPlayercnt HitNormalCollisionHeight TerrainInfoOwnerIARulesLMSAllowPickupsIARulesLMSAllowAdrenaline GoldColorBoxXPos BoxSpaceY TitleYPos PlayerTextNone TimeSeconds DMMutatorWinner StartTimeNoneNoneNoneNoneMutantNameMessageLoadLevelActionFont MutantDamageBottomFeedersChangeDegenIntervalbLocationalHit MaleSuicideBottomFeederTextbIsConsoleMessageMutantKillHealthBonusDamTypeMutantTick bArmorStops DeathStringBottomFeederTextColor bCausesBloodNoneLastBottomFeedersBottomFeederMesgDiedFemaleSuicideIARulesAutoAdjustSkillMyBottomFeedersNoneNoneMyPRINoneNoneNoneTearOffMomentumNoneNoneIARulesBottomFeeders IARulesBK4NoneNoneNone bAlreadyDeadNoneRegenTimeCarryOver DeltaSecondsSwitchNoneBaseEyeHeightNoneUpdateBottomFeederPRIIsBottomFeeder ComparePRI PRIIsMutantBottomFeederMessageDrawHUDbEnableBottomFeederbAlwaysZeroBoneOffsetMutantHudTintNoneNoneDrawWeaponBarNoneCurrentBottomFeeder new_mutantNonePRI1bottom_feederBottomFeederPRINoneyou_have_mutatedNoneNoneNoneNoneNoneNoneNoneNoneNonebMutantHudColorNone AdrenalineNoneNoneNoneNoneNone MutantGRIPRI2NoneNoneNoneoldBFNoneNoneMutantScoreboardPawnIsVisibleDrawBottomFeederIndicator MutantMarkerNoneBottomFeederBeaconMatBottomFeederMarkerNoneNone TeamBeaconT TeamSymbols StartTraceNoneBitmapMaterialVSizeUSize vecPawnViewNoneScoreboardU_FBNoneNone MenuEffects BFeeder_icon EndTraceV IconScaleNoneNoneNoneNone MatchOver EquipMutant BFISizeX BFIMargin MNOriginXTournamentHealth BFISizeYMNSizeX BFIPulseRate BFIOriginX ShieldPickupNotBottomFeederMessage ForceCrouchMNSizeY MNOriginY BFIOriginYBottomFeederIconNoneNone BorderBoxDNoneUT2K3Fanfare08NoneNoneIsBottomFeederMaxMultiKillScoreBottomFeederKillScoreNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneLMSBroadcastHandlerNoneNoneAssignSquadResponsibilityBroadcastHandlerClassInOrderDefaultMaxLivesNoneBroadcastHandlerP1None ViewportP2NoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone WantsPickupsNoneNoneNoneNoneNoneNoneGetDisplayTextLMSPropDescTextLMSPropsDisplayText__OnCreateComponent__DelegateInternalOnCreateComponent FillPlayInfoGetDescriptionTextGetServerDetailsUpdateAnnouncementsNoneAcceptPlayInfoProperty MutPropTextNoneDisplayEnemyName MutDescTextInfo Camouflaged PropertyNameKeyNone ServerStateNoneNoneNone ServerInfo PlayInfoNone KeyValuePairNoneNoneNoneNoneNone PropName LMSPROPNUMPiServerResponseLineNone Pint_sizedbPartitionSpectatorsConstNoneNoneAddServerDetailAddPrecacheMaterialPrecacheSoundPlayStatusAnnouncementPrecacheGameAnnouncementsComboAnnouncementName MaxOutAmmoUpdatePrecacheMaterials CamoDescText TimeLimitbAllowCamouflageSuperMaxOutAmmoMiniDisplayTextDrawCustomBeaconCamoDisplayText bAllowPint GetColor bFullAmmo MiniDescText ExtraMarkingYPos HudScaleRealBlueColor ScreenLocX HudColorBlue HudColorRedMutate RealRedColor ScreenLocY RulesGroup bStartupbRewardSoundsAnnouncerVoice HealthMaxPlayerNameMessage GameGroupNetUpdateTimeHudCDeathmatchYOffsetbScriptPostRenderXPos Cellular_0NoneNoneNoneNoneNoneAddShieldStrengthNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone^k^^o@^k^^^^^d^^[^^W^^^^^|O 6H rZ7'в|,e,e uݝҳhhh,ezVGBzVGBzVGB,e,e,ezVGB,e,e,ezVGBp^,e,ezVGBp^,ezVGB,ezVGB,ezVGB3},e,e,ezVGB3}zVGB,ezVGB,ezVGB,e,ezVGB,ezVGBIPÅ,ezVGB,e,ezVGB,e,ezVGB,eo>+,e,e,e,e,eo>+zVGBh####o>+hh@q,e,e,e,e,e,e,ȅ̏̏̏̏̏̏̏̏̏̏̏̏̏̅,e,e,ȅqYԏ̏̎3}Zs,e@q@qqY@qIPÏ̏̏̏̏̏̏̏@qqY@q,eɢ,eɢɢɢ̅,eɢɢ uq}oB,eh3},e,e u u u,e- =1- =1zVGB,ezVGB,ezVGB,e u uzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGB,e _ ._ ._ .3}UPڎ3}3}3}. Qg $L?S"T"V"u "l "v "V C]Enable BottomFeederF]`^If enabled, the player with the lowest score is the BottomFeeder, and can kill other players.zrm]BonusPack.MutantScoreboardE]BonusPack.HudMutantA]BonusPack.MapListMutantH"N@]MutantMm~The first player to score a frag becomes the Mutant. Everyone else hunts the Mutant, as by killing the mutant, a player becomes the mutant, with superhuman powers. The player with the lowest score is the Bottom Feeder. He can also kill other players.O]UT2004Thumbnails.MutantShots<]BonusPack.MutantGame:]MUT^^^^9 ^^@^^D^^T^^^^^{TFG9:9:$GBY6 ̻W=3}3}W=ܻܻܻW=܎3}3}Zs.GY^^Q^3^^i^^ ^^^^\ ^Iwt-9:9:$G6- =13} rZ,eh ^^Y^^K^^^^w^^g^^e^^^^m^^l^^^^'^^^^^^j^^^^Z^^x^ ^O@^^^^c^^^O^^6^^m^^b^<^^X^^^~^^^^^^p^^?^^a^^T^^u ^^F^^^H^^^y^^^@^}G 6KH657'вввввввв3},e,ezVGBzVGB,e,e,e,ezVGBhhzVGB| u uzVGB uzVGB uzVGB uh3},e3} uzVGB u u u,e,e,eh,eh,eh_ .#4y ߙșlW]hhhhhhhh@qqY@q. C$DI" Ptz ]Camping Thresholdz Camper Warning Intervalz Gain Health For Killsz Allow SuperWeaponsz  Camper Alarmz Allow Pickupsz Allow Adrenalinez  Full Ammoy ]YWDetermines how long a player can stand in one spot before triggering a camper warning.y 21Specifies how often the camper warning is playedy QOIf this option is enabled, a player gains health after killing another player.y @?If checked, super weapons are included in the player load out.y ][Enable this option to cause an alarm to be played if a player stands in one spot too long.y 32If checked, pickups will be available in the map.y 0/If checked, adrenaline combos will be enabled.y :9If checked, players start with max ammo for all weapons._ "m]BonusPack.ScoreBoardLMSE]BonusPack.HudLMSA]"!BonusPack.MapListLastManStanding["l"K]BonusPack.MutLastManStanding] ]BonusPack.LMSBroadcastHandler@]Last Man StandingM]trEach player starts with a limited number of lives. The goal is to be the last player left when the smoke clears.O]UT2004Thumbnails.LMSShots<]BonusPack.LastManStandingGame:]LMS^^j@^^^^0^^z^ ^^^I^f^^^^R^T^w^^`^S^^J@^^G@^^8^^^^D^^^^\^^B^^W@^^K ^^^NGIw2dg Fݐ u u u u uzVGB k]You Have Mutated!m] n] Has Mutated!t]First Blood Mutates!T ]You Are The Bottom Feeder!g ]No Longer Bottom Feeder!236"7*C$w>^^^^K^^ ^^^^o^^^^^^^^^^n^^C^^^^^a^^P^r ^^b^^^.^^Y^^^^y^^B^;^^>^}^y^^^^7@^p^^^^m^^e^U@^^&^^^^F^QDl2N`ىFݐ uzVGBzVGB W]You Are Camping!_] j] Is Camping!236"7*C$=^^v^x^^b^]^^S^|^^ ^^A^Z^^[^^U^^U^^^_@^^`@^^Q@^^r^^4^U ^/^F^^^^^M@^^g^^ @^^H@^^[@^^n@^^G@^^l@^^i^^f^De y2#rKDW73} rZ rZ rZ,e| rZ|3} rZ rZ rZ| rZ,eh|h||||3} rZ rZ rZ rZ,e rZ,e||| ^Hv@sg2QYVRnSorp^^u^^^^M^^l@^^^^z^^{^^^^~@^^@^^A@^^|@^^|vHgv %| @&#rM*~M K,A V,| a,M  G ^LqI1UqCyz{C O%LwH*qf!t$'R  G!^@^^G^^H^^@^^CAI;AFpigF D%Af!d $' b&Af!^ $' ,A $' ,Af!a $' ,A $'  G!^E^^J^^kqHnaq %k [&#rf*ppmfn(fw)  G ^J^^PhxN?Jh0wJ*J P J G^P@^^Z-*rMz-xGame.ComboInvisPNP>-xGame.ComboSpeedzP(?-xGame.ComboBerserk-xGame.ComboDefense- G^*^^J]XBu]Dwqu*rqu-'L-(-w*$r.r.- -g a s +w *%  a #DB a+a<" a*--gw *% * M *-g- G^V^FOI\*^_`Sw*** ,.** G^RSgz E<w *% * M * G^^^WVa{:Gvw*#w|*w|#wy*wyt y%V|yYZ[ G^X)6ew*e%-'- w* w&w*w*9a/!$DO!&9= K(( A!JDO!&9= K(' A!Jer r*bw*r9?c9?/9?&bw*$self_fragw*9?&w*grw*89D?88/9?8dw*?fragYrY.wY*t 9?T 9?/YdU #9?/Vw*?fragt 9?/w*?fragr*9?/w*?frag?w*)^w*'xr* r*  -(a/!$a/!$a/!50..' a/!50..( G^Y!'4u! 6w* '! w!*- %!9?f!fraglimit G^[=cW2pr=p?a/!`?a/!b?a/!a ?a/!f (w*E=?L9:L&r=*'= \? G^+ZAKzr+<w+*Z.+XwZ*+Z(*.u*P + G^\ -)l T"r* Ow*\.w *w *]. r*w * w  w]*]% .u ]'c*r{r * r *.u*\('w]*]%\( .u ]''*.u*\(ccr -] PB,P  G^R C=E!-W /$IFa/!FNON MUTANT PAWN????? P,,R,d] C-(CBC1Chw*]-'j / ^C-' Yw *B a/!L. ^  -(e.Cwe*e% G^_"1)g";r*Could not teleport Mutant "a  "a+ ma  ma+ m #""O  i."&wi*i[=#/D/D G^p^^`sinsarwr* w*p.swp*n9?, p  n G^a$l a!\  $iw$*l.$Rwl*4l$$! G^W :4X~ a!\  1r*:  d,{Xr::  d%{: d& G^^e^D^^--L>%>7r6>^xLastManStandingGame: Already have LMSData for a PC >(6B^a7&7aa&B G^L]-J %7 -D\r6*A&6-&6-*6696 6 69n69, 69%-6~'-6~666%6 666%6 666%6 666%6 666%6 666%6 &, 666666 666666 666666 666666 666666 666666 s[666666666666[o6;%;66;l-D'6;%6; G^fdvhG^gK;&w&*'.&w'*n9?'9?,- r'K'  N%' N&K&& G^h1-y1Ofe-[ r1*r1*1,d 19D1 G^W IG[ 8Ij "ISuperWeapsG{ -V9K  "ICamperAlarm{ -J9K  "IAllowPickups{ -U9K  "IAllowAdrenaline{ -L9K  "IHealthForKill.{ -[9K % G^jRAV               G ^X \*jXWeapons.BioRifleXWeapons.FlakCannonXWeapons.LinkGunXWeapons.MinigunXWeapons.RocketLauncherXWeapons.ShockRifleXWeapons.SniperRifleg-k \ gw\ *Pw.\ *.\ i\ \ ! G^^}^\2!5=6(9C29<669<6<6(9C29<669<6<6(9C29<669<6<6(9C29<669<6<( G^L^^q+(VL. srL*rLrLd-3zLw*  9?-3b-3bQwz h-3'( G^,^^(^^)r F,. rr,*r,)r,d))jx,.%.,w.xp..wj,(sj(+)w)*)b G^~ u\Ewnr7*7.E nr7*pppWarning: 9V Couldn't dynamically load font E7 G^^^}A .w.= -N5wu*wu-b$U$\8-Nk9P# 6 K#  k9P @ 6 @6 K @ 9?, 9?9D9?6k6 @9?04tk9?%!4Pt4!4Pvv$-bQR?FT`?F'~m>C =1,=Q8=Fa FFQDnCCC-b0IKIebQR0?T`0?Fa QDnCCCQR0?T`0?Fa QDnCCCX\l9S9DK'$><? ף=0K N 5 O P Sd -NdDefLoc$>u<333?== su$>u<333?=S rr*  Q 0H G 5 F I 69C9?,??I@Q >H E G E `aJ F 9?,E I 9?,E CC G^xML"MSM. JwM*@M  G^@N9:9:$aL>' G^B^^q/B.HyrB*Should only use MutLastManStanding with xLastManStandingGame game type.D$']a/!UB-U-a/!`B-L(Sa/!g>B-V(a/!da/!eD$'P-]D$'"a/!sa/![B-V:r. r. -(-'""B-U-'D$' G^Q(// ==================================================================== // Class: BonusPack.xMutantPawn // // New pawn class. Allows for Mutant skin/particles etc. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class xMutantPawn extends xPawn; var MutantGameReplicationInfo MutantGRI; // This is so the pawn can know if its the mutant... var bool bMutantEffect; var bool bOldMutantEffect; var Emitter MutantFX; replication { reliable if(Role == ROLE_Authority) MutantGRI; } // Disable invis combo in mutant game type //function DoCombo( class ComboClass ) //{ // if( ComboClass == class'XGame.ComboInvis' ) // return; // // Super.DoCombo( ComboClass ); //} event PostBeginPlay() { // Send GRI to Pawn if(Role == ROLE_Authority && Level.Game != None) { MutantGRI = MutantGameReplicationInfo(Level.Game.GameReplicationInfo); } } function MutantDamage() { local bool bAlreadyDead; if ( Role < ROLE_Authority ) return; bAlreadyDead = (Health <= 0); Health -= 1.0; if( bAlreadyDead ) return; if ( Health <= 0 ) { // pawn died TearOffMomentum = vect(0, 0, 0); Died( None, class'DamTypeMutant', Location); } } simulated function TickFX(float DeltaTime) { Super.TickFX(DeltaTime); // See if there is a mutant, and this is the mutant pawn if( MutantGRI.MutantPRI != None && MutantGRI.MutantPRI == PlayerReplicationInfo ) bMutantEffect = true; else bMutantEffect = false; bScriptPostRender = ((Level.GRI != None) && (PlayerReplicationInfo == MutantGameReplicationInfo(Level.GRI).BottomFeederPRI)); if(bMutantEffect && !bOldMutantEffect) { // Spawn funky glowy effect MutantFX = Spawn(class'BonusPack.MutantGlow', self, , Location); if ( MutantFX != None ) { MutantFX.Emitters[0].SkeletalMeshActor = self; MutantFX.SetLocation(Location - vect(0, 0, 49)); MutantFX.SetRotation(Rotation + rot(0, -16384, 0)); MutantFX.SetBase(self); } } else if(!bMutantEffect && bOldMutantEffect) { // Remove funky glowy effect if( MutantFX != None ) { MutantFX.Emitters[0].SkeletalMeshActor = None; MutantFX.Kill(); MutantFX = None; } } bOldMutantEffect = bMutantEffect; } simulated function Destroyed() { if( MutantFX != None ) { MutantFX.Emitters[0].SkeletalMeshActor = None; MutantFX.Kill(); MutantFX = None; } Super.Destroyed(); } ^p// ==================================================================== // Class: BonusPack.xMutantGame // // Main 'Mutant' game type tab. Basic idea: // - When there is no existing mutant, first blood mutates. // - Everyone else must hunt down the mutant - you can't kill each other. You get a radar to find them. // - If you kill the mutant, you mutate. // - Mutant gets invisibility, agility and regen based on number of other players. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== #exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=MutantSkins.utx #exec OBJ LOAD FILE=InterfaceContent.utx class xMutantGame extends xDeathMatch; // Settings var() Material MutantMaterial; // Internal var Controller CurrentMutant; var Controller CurrentBottomFeeder; var float RegenTimeCarryOver; var() float DegenInterval; //var() InterpCurve RegenRate; // Health mutant gets each second as a function of other players var() int MultiKillBonus; // Additional points for each level of multi-kill var() int BaseKillScore; // Basic number of points for a kill var() int MutantSuicidePenalty; // When the mutant suicides, number of points they lose var() int MaxMultiKillScore; // Cap on multi-kill score var() int MutantKillHealthBonus; // Health the mutant gets for killing someone var() int BottomFeederKillScore; // Points the mutant gets for killing the bottom feeder var() config bool bEnableBottomFeeder; var localized string MutPropText; var localized string MutDescText; function bool WantsPickups(bot B) { return (B != CurrentMutant); } static function PrecacheGameTextures(LevelInfo myLevel) { Super.PrecacheGameTextures(myLevel); myLevel.AddPrecacheMaterial(class'HUDMutant'.default.BottomFeederIcon); myLevel.AddPrecacheMaterial(Material'MutantSkins.Cellular_0'); myLevel.AddPrecacheMaterial(Material'TeamSymbols.TeamBeaconT'); myLevel.AddPrecacheMaterial(Material'InterfaceContent.BorderBoxD'); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( !bRewardSounds ) { V.PrecacheSound('you_have_mutated'); V.PrecacheSound('new_mutant'); V.PrecacheSound('bottom_feeder'); } } /* OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor */ simulated function UpdateAnnouncements() {} event Tick(float deltaSeconds) { local xMutantPawn p; Super.Tick(deltaSeconds); if(CurrentMutant == None) return; p = xMutantPawn(CurrentMutant.Pawn); // Regenrate the Mutant RegenTimeCarryOver += deltaSeconds; while(RegenTimeCarryOver > DegenInterval) { p.MutantDamage(); RegenTimeCarryOver -= DegenInterval; } } // Parse options for this game type event InitGame( string Options, out string Error ) { local string InOpt; Super.InitGame(Options, Error); // Should we enable bottom feeders InOpt = ParseOption( Options, "BottomFeeder"); if(InOpt != "") { log("BottomFeeder: "$bool(InOpt)); bEnableBottomFeeder=bool(InOpt); } } function int ComparePRI(PlayerReplicationInfo PRI1, PlayerReplicationInfo PRI2) { // Highest score is best if(PRI1.Score > PRI2.Score) return 1; else if(PRI1.Score < PRI2.Score) return -1; // Least deaths is best if(PRI1.Deaths > PRI2.Deaths) return -1; else if(PRI1.Deaths < PRI2.Deaths) return 1; // Most recent start time is best if(PRI1.StartTime > PRI2.StartTime) return 1; else if(PRI1.StartTime < PRI2.StartTime) return -1; // Just can't decide... return 0; } // When someone scores, update the list of 'bottom feeders' function UpdateBottomFeeder() { local int i; local PlayerReplicationInfo myPRI; local Controller oldBF; local PlayerController Player; oldBF = CurrentBottomFeeder; CurrentBottomFeeder = None; if(!bEnableBottomFeeder) return; for(i=0; i 0 ) CurrentBottomFeeder = Controller(myPRI.Owner); } } // Set the BF PRI into the Mutant GRI if(CurrentBottomFeeder != None) MutantGameReplicationInfo(GameReplicationInfo).BottomFeederPRI = CurrentBottomFeeder.PlayerReplicationInfo; else MutantGameReplicationInfo(GameReplicationInfo).BottomFeederPRI = None; // Dont send messages once game is over. if( IsInState('MatchOver') ) return; // If its a new bottom feeder - send messages to new and old if(CurrentBottomFeeder != oldBF) { // 'No Longer Bottom Feeder' message if(oldBF != None) { Player = PlayerController(oldBF); if(Player != None) Player.ReceiveLocalizedMessage(class'BonusPack.MutantMessage', 4); } // 'New Bottom Feeder' message if(CurrentBottomFeeder != None) { Player = PlayerController(CurrentBottomFeeder); if(Player != None) Player.ReceiveLocalizedMessage(class'BonusPack.MutantMessage', 3); } } //Log( "FEEDER: "$CurrentBottomFeeder.PlayerReplicationInfo.PlayerName ); } function bool IsBottomFeeder(Controller C) { if(C == None) return false; if(C == CurrentBottomFeeder) return true; return false; } // Send message stating current Mutant situation to single client. function SendCurrentMutantMessage(PlayerController Player) { // Dont send messages once game is over. if( IsInState('MatchOver') ) return; if(CurrentMutant == None) Player.ReceiveLocalizedMessage(class'BonusPack.MutantMessage', 2); else { if(Player == CurrentMutant) Player.ReceiveLocalizedMessage(class'BonusPack.MutantMessage', 0); else Player.ReceiveLocalizedMessage(class'BonusPack.MutantMessage', 1, CurrentMutant.PlayerReplicationInfo); } } // Send message stating current Mutant situation to all clients. function SendAllCurrentMutantMessage() { local Controller P; local PlayerController Player; // Dont send messages once game is over. if( IsInState('MatchOver') ) return; for(P = Level.ControllerList; P != None; P = P.nextController) { Player = PlayerController(P); if (Player != None) { SendCurrentMutantMessage(Player); } } } function float RatePlayerStart(NavigationPoint N, byte Team, Controller Player) { local PlayerStart P; local float Score; Score = Super.RatePlayerStart(N,Team,Player); // If there is a Mutant around - pick a start point a distance away. if(Player != None && CurrentMutant != None) { P = PlayerStart(N); if ( P != None ) Score += 10 * VSize(P.Location - CurrentMutant.Pawn.Location); } return Score; } function RandomTeleportMutant(Controller Pred, xPawn PredPawn) { local NavigationPoint N; local PlayerController pcPred; N = FindPlayerStart(Pred); if(N == None) { Log("Could not teleport Mutant"); return; } Pred.SetLocation(N.Location); Pred.SetRotation(N.Rotation); PredPawn.SetLocation(N.Location); PredPawn.SetRotation(N.Rotation); PredPawn.Velocity = vect(0,0,0); Pred.ClientSetLocation(N.Location, N.Rotation); // Flash clients screen purple pcPred = PlayerController(Pred); if(pcPred != None) pcPred.ClientFlash(0.1, vect(700,0,700)); } function EquipMutant(xPawn PredPawn) { local Inventory Inv; PredPawn.CreateInventory("XWeapons.BioRifle"); PredPawn.CreateInventory("XWeapons.FlakCannon"); PredPawn.CreateInventory("XWeapons.LinkGun"); PredPawn.CreateInventory("XWeapons.Minigun"); PredPawn.CreateInventory("XWeapons.RocketLauncher"); PredPawn.CreateInventory("XWeapons.ShockRifle"); PredPawn.CreateInventory("XWeapons.SniperRifle"); for( Inv=PredPawn.Inventory; Inv!=None; Inv=Inv.Inventory ) if ( Weapon(Inv) != None ) Weapon(Inv).SuperMaxOutAmmo(); } function SetMutant(Controller Pred, xPawn PredPawn, bool isPred) { local Inventory Inv; local UnrealPlayer uPred; if(isPred) { // Invisibility PredPawn.SetInvisibility(2000000.0); if(!PredPawn.IsA('xMutantPawn')) Log("NON MUTANT PAWN"); // This will trigger glowy effect //xMutantPawn(PredPawn).bMutantEffect = true; // Agility combo PredPawn.AirControl = PredPawn.Default.AirControl * 1.5; PredPawn.GroundSpeed = PredPawn.Default.GroundSpeed * 1.5; PredPawn.WaterSpeed = PredPawn.Default.WaterSpeed * 1.5; PredPawn.AirSpeed = PredPawn.Default.AirSpeed * 1.5; PredPawn.JumpZ = PredPawn.Default.JumpZ * 1.5; // Give the mutant something to start with. PredPawn.GiveHealth(150, 150); PredPawn.AddShieldStrength(100); // Give the mutant weapons EquipMutant(PredPawn); // Dont let Mutant use or pickup Adrenaline. // Also, make sure they have at most 99 adrenaline, so they can't perform combos. Pred.bAdrenalineEnabled = false; Pred.Adrenaline = FMin(99, Pred.Adrenaline); // Teleport new Mutant to somewhere in the level. RandomTeleportMutant(Pred, PredPawn); // Triple jump //PredPawn.MaxMultiJump = 2; //PredPawn.MultiJumpBoost = 50; // Reset regen clock RegenTimeCarryOver = 0.0; // Set Berserk on if (PredPawn.Weapon != None) PredPawn.Weapon.StartBerserk(); PredPawn.bBerserk = true; } else { // Turn invisible off PredPawn.SetInvisibility(0.0); // Turn off glowy effect //xMutantPawn(PredPawn).bMutantEffect = false; //PredPawn.InvisMaterial = class'xpawn'.default.InvisMaterial; // Turn off agility Level.Game.SetPlayerDefaults(PredPawn); // Back to just double jump //PredPawn.MaxMultiJump = 1; //PredPawn.MultiJumpBoost = 25; // Re-enable adrenaline Pred.bAdrenalineEnabled = true; // Turn Berserk off for( Inv=PredPawn.Inventory; Inv!=None; Inv=Inv.Inventory ) { if (Inv.IsA('Weapon')) Weapon(Inv).StopBerserk(); } PredPawn.bBerserk = false; } // Re-zero multi kill level whenever you transform uPred = UnrealPlayer(Pred); if(uPred != None) uPred.MultiKillLevel = 0; } function NotifyKilled(Controller Killer, Controller Other, Pawn OtherPawn) { local xPawn xKiller, xOther; Super.NotifyKilled(Killer, Other, OtherPawn); // If no-one died - no nothing if(Other == None) return; // Get xPawns involved if(Other.Pawn != None) xOther = xPawn(Other.Pawn); if(Killer != None && Killer.Pawn != None) xKiller = xPawn(Killer.Pawn); // If there was no Mutant (ie were in FFA) if( CurrentMutant == None ) { // As long as this wasn't a suicide, and the killer is still alive, make the killer the Mutant. if(Killer != None && Killer != Other && xKiller != None && xKiller.Health > 0) { CurrentMutant = Killer; MutantGameReplicationInfo(GameReplicationInfo).MutantPRI = CurrentMutant.PlayerReplicationInfo; SetMutant(Killer, xKiller, true); SendAllCurrentMutantMessage(); } } // If it was the Mutant that was killed, decide what to do. else if( Other == CurrentMutant ) { // If the Mutant killed themselves or suicided, enter FFA again if( Killer == None || Killer == Other ) { CurrentMutant = None; MutantGameReplicationInfo(GameReplicationInfo).MutantPRI = None; SetMutant(Other, xOther, false); SendAllCurrentMutantMessage(); } else if(xKiller != None && xKiller.Health > 0) // Make the killer the mutant - if they are still alive { SetMutant(Other, xOther, false); CurrentMutant = Killer; MutantGameReplicationInfo(GameReplicationInfo).MutantPRI = CurrentMutant.PlayerReplicationInfo; SetMutant(Killer, xKiller, true); SendAllCurrentMutantMessage(); } else // Mutual kill - free for all { CurrentMutant = None; MutantGameReplicationInfo(GameReplicationInfo).MutantPRI = None; SetMutant(Other, xOther, false); SendAllCurrentMutantMessage(); } } else { // If this the Mutant killing another player, give them back some health. if(Killer == CurrentMutant && Other.bIsPlayer) { xKiller.GiveHealth(MutantKillHealthBonus, 150); } } // Update list of bottom players when someone scores UpdateBottomFeeder(); } // Don't let the Mutant pick up adrenaline, health or armor. function bool PickupQuery( Pawn Other, Pickup item ) { local byte bAllowPickup; if(Other.Controller == CurrentMutant) { //if( item.IsA('AdrenalinePickup') || item.IsA('UDamagePack') ) if( item.IsA('AdrenalinePickup') || item.IsA('UDamagePack') || item.IsA('TournamentHealth') || item.IsA('ShieldPickup') ) return false; } if ( (GameRulesModifiers != None) && GameRulesModifiers.OverridePickupQuery(Other, item, bAllowPickup) ) return (bAllowPickup == 1); if ( Other.Inventory == None ) return true; else return !Other.Inventory.HandlePickupQuery(Item); } // see if this score means the game ends function CheckScore(PlayerReplicationInfo Scorer) { if ( CheckMaxLives(Scorer) ) return; if ( (GameRulesModifiers != None) && GameRulesModifiers.CheckScore(Scorer) ) return; if ( (Scorer != None) && (bOverTime || (GoalScore > 0)) && (Scorer.Score >= GoalScore) ) EndGame(Scorer,"fraglimit"); } function ScoreKill(Controller Killer, Controller Other) { local PlayerReplicationInfo OtherPRI; local UnrealPlayer uKiller; local int KillScore; // Check if we have used up all our lives OtherPRI = Other.PlayerReplicationInfo; if ( OtherPRI != None ) { OtherPRI.NumLives++; if ( (MaxLives > 0) && (OtherPRI.NumLives >=MaxLives) ) OtherPRI.bOutOfLives = true; } // Do suitable taunt! if ( bAllowTaunts && (Killer != None) && (Killer != Other) && Killer.AutoTaunt() && (Killer.PlayerReplicationInfo != None) && (Killer.PlayerReplicationInfo.VoiceType != None) ) { if( Killer.IsA('PlayerController') ) Killer.SendMessage(OtherPRI, 'AUTOTAUNT', Killer.PlayerReplicationInfo.VoiceType.static.PickRandomTauntFor(Killer, false, false), 10, 'GLOBAL'); else Killer.SendMessage(OtherPRI, 'AUTOTAUNT', Killer.PlayerReplicationInfo.VoiceType.static.PickRandomTauntFor(Killer, false, true), 10, 'GLOBAL'); } // Score negative for suicide if( (killer == Other) || (killer == None) ) { if ( OtherPRI != None ) { if(Other == CurrentMutant) Other.PlayerReplicationInfo.Score -= MutantSuicidePenalty; // Mutant loses a third of their score if they suicide else Other.PlayerReplicationInfo.Score -= BaseKillScore; // Ordinary players lose normal kill amount Other.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; if (GameStats!=None) GameStats.ScoreEvent(Other.PlayerReplicationInfo,-1,"self_frag"); } } else if ( killer.PlayerReplicationInfo != None ) { Killer.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; if(CurrentMutant != None) // Mutant present { if(Other == CurrentMutant) // Mutant was killed { if ( OtherPRI != None ) KillScore = 0.5 * (OtherPRI.Score - Killer.PlayerReplicationInfo.Score); KillScore = Max(KillScore, BaseKillScore); //Log("KILLED MUTANT: "$KillScore); Killer.PlayerReplicationInfo.Score += KillScore; if (GameStats!=None) GameStats.ScoreEvent(Killer.PlayerReplicationInfo,1,"frag"); } else if(Killer == CurrentMutant) // Mutant killed someone { uKiller = UnrealPlayer(Killer); if(uKiller != None) { //Log("MUTANT KILL: "$BaseKillScore + (uKiller.MultiKillLevel * MultiKillBonus)); // If the mutant killed the bottom feeder, they get a special score // Otherwise - score base on multi-kill level if( IsBottomFeeder(Other) ) Killer.PlayerReplicationInfo.Score += BottomFeederKillScore; else Killer.PlayerReplicationInfo.Score += Min( BaseKillScore + (uKiller.MultiKillLevel * MultiKillBonus), MaxMultiKillScore ); } else { //Log("MUTANT KILL: "$BaseKillScore); Killer.PlayerReplicationInfo.Score += BaseKillScore; // FIXME: Give bots multi-kill bonus? } if (GameStats!=None) GameStats.ScoreEvent(Killer.PlayerReplicationInfo,1,"frag"); } else if( IsBottomFeeder(Killer) ) { //Log("BOTTOM FEEDER KILL: "$BaseKillScore); Killer.PlayerReplicationInfo.Score += BaseKillScore; if (GameStats!=None) GameStats.ScoreEvent(Killer.PlayerReplicationInfo,1,"frag"); } } else if(CurrentMutant == None) // FFA Kill { Killer.PlayerReplicationInfo.Score += BaseKillScore; if (GameStats!=None) GameStats.ScoreEvent(Killer.PlayerReplicationInfo,1,"frag"); } } // Let the game rules modify the score as well if ( GameRulesModifiers != None ) GameRulesModifiers.ScoreKill(Killer, Other); // Check if this means the end of the match if (Killer != None) CheckScore(Killer.PlayerReplicationInfo); if ( (killer == None) || (Other == None) ) return; // Adjust bot skills if desired if ( bAdjustSkill && (killer.IsA('PlayerController') || Other.IsA('PlayerController')) ) { if ( killer.IsA('AIController') ) AdjustSkill(AIController(killer), PlayerController(Other),true); if ( Other.IsA('AIController') ) AdjustSkill(AIController(Other), PlayerController(Killer),false); } } // function int ReduceDamage( int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType ) { // If there is a Mutant - disable friendly fire (except for bottom feeder). if( CurrentMutant != None && (injured != None && injured.Controller != CurrentMutant) && (instigatedBy != None && instigatedBy.Controller != CurrentMutant) && !IsBottomFeeder(instigatedBy.Controller) ) return 0; // Regular damage evaluation return Super.ReduceDamage(Damage, injured, instigatedBy, HitLocation, Momentum, DamageType); } // Change the default pawn class to xMutantPawn on login. event PlayerController Login( string Portal, string Options, out string Error ) { local PlayerController pc; pc = Super.Login(Portal, Options, Error); if(pc != None) { pc.PawnClass = class'BonusPack.xMutantPawn'; xPlayer(pc).ComboNameList[3] = ""; // Remove invis combo from players list. } return pc; } event PostLogin( PlayerController NewPlayer ) { Super.PostLogin(NewPlayer); // Update list of bottom players when someone joins UpdateBottomFeeder(); } // If the Mutant leaves - put things back into FFA function Logout(Controller Exiting) { local xPawn xExit; if ( Exiting == CurrentMutant ) { if( Exiting.Pawn != None ) xExit = xPawn(Exiting.Pawn); if( xExit != None ) SetMutant(Exiting, xExit, false); CurrentMutant = None; MutantGameReplicationInfo(GameReplicationInfo).MutantPRI = None; SendAllCurrentMutantMessage(); } // Update list of bottom players when someone leaves UpdateBottomFeeder(); Super.Logout(Exiting); } // So bots dont try and do invis combo function string RecommendCombo(string ComboName) { local float R; // Change combo if its invisibility. if( ComboName == "xGame.ComboInvis" ) { R = FRand(); if( R < 0.33 ) ComboName = "xGame.ComboSpeed"; else if( R > 0.66 ) ComboName = "xGame.ComboBerserk"; else ComboName = "xGame.ComboDefense"; } return Super.RecommendCombo(ComboName); } // Set bot pawn class function Bot SpawnBot(optional string botName) { local Bot B; B = Super.SpawnBot(botName); if(B != None) { B.PawnClass = class'BonusPack.xMutantPawn'; } // Update list of bottom players when a bot joins UpdateBottomFeeder(); return B; } static function FillPlayInfo(PlayInfo PI) { Super.FillPlayInfo(PI); PI.AddSetting(default.GameGroup, "bEnableBottomFeeder", default.MutPropText, 40, 1, "Check",,,,True); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "bEnableBottomFeeder": return default.MutDescText; } return Super.GetDescriptionText(PropName); } function GetServerDetails(out ServerResponseLine ServerState) { local int i; Super.GetServerDetails(ServerState); i = ServerState.ServerInfo.Length; ServerState.ServerInfo.Length = i + 1; ServerState.ServerInfo[i].Key = "bEnableBottomFeeder"; ServerState.ServerInfo[i].Value = Locs(bEnableBottomFeeder); } ^Q// ==================================================================== // Class: BonusPack.xLastManStandingGame // // Main 'Last Man Standing' game type tab. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class xLastManStandingGame extends xDeathMatch config; struct LMSDataEntry { var PlayerController PC; var vector LocationHistory[10]; var int NextLocHistSlot; var bool bWarmedUp; var int ReWarnTime; }; var array LMSData; var config float CampThreshold; var config int ReCamperWarnInterval; var config bool bHealthForKill; // number of kills before you get an extra life (zero indicates never give extra life) var config bool bAllowSuperweapons; var config bool bCamperAlarm; var config bool bAllowPickups; var config bool bAllowAdrenaline; var config bool bFullAmmo; const LMSPROPNUM = 8; var localized string LMSPropsDisplayText[LMSPROPNUM]; var localized string LMSPropDescText[LMSPROPNUM]; // When player starts - give them all the weapons (not super weapons)! function AddGameSpecificInventory(Pawn p) { local Inventory Inv; Super.AddGameSpecificInventory(p); p.CreateInventory("XWeapons.BioRifle"); p.CreateInventory("XWeapons.FlakCannon"); p.CreateInventory("XWeapons.LinkGun"); p.CreateInventory("XWeapons.Minigun"); p.CreateInventory("XWeapons.RocketLauncher"); p.CreateInventory("XWeapons.ShockRifle"); p.CreateInventory("XWeapons.SniperRifle"); if ( bFullAmmo ) { For ( Inv=P.Inventory; Inv!=None; Inv=Inv.Inventory ) { if ( Weapon(Inv) != None ) Weapon(Inv).MaxOutAmmo(); } } } // Make sure all weapons are loaded. static function PrecacheGameTextures(LevelInfo myLevel) { Super.PrecacheGameTextures(myLevel); class'XWeapons.BioRiflePickup'.static.StaticPrecache(myLevel); class'XWeapons.FlakCannonPickup'.static.StaticPrecache(myLevel); class'XWeapons.LinkGunPickup'.static.StaticPrecache(myLevel); class'XWeapons.MinigunPickup'.static.StaticPrecache(myLevel); class'XWeapons.RocketLauncherPickup'.static.StaticPrecache(myLevel); class'XWeapons.ShockRiflePickup'.static.StaticPrecache(myLevel); class'XWeapons.SniperRiflePickup'.static.StaticPrecache(myLevel); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( !bRewardSounds ) V.PrecacheSound('Camper'); } /* OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor */ simulated function UpdateAnnouncements() {} // Parse options for this game... event InitGame( string Options, out string Error ) { local string InOpt; Super.InitGame(Options, Error); // Should we allow superweapons InOpt = ParseOption( Options, "SuperWeaps"); if(InOpt != "") bAllowSuperweapons=bool(InOpt); // Use camper alarm InOpt = ParseOption( Options, "CamperAlarm"); if(InOpt != "") bCamperAlarm=bool(InOpt); InOpt = ParseOption(Options, "AllowPickups"); if (InOpt !="") bAllowPickups=bool(InOpt); InOpt = ParseOption(Options, "AllowAdrenaline"); if (InOpt !="") bAllowAdrenaline=bool(InOpt); InOpt = ParseOption(Options, "HealthForKill"); if (InOpt !="") bHealthForKill=bool(InOpt); GoalScore=0; // Force no Frag Limit } // Used to award extra lives for kills function NotifyKilled(Controller Killer, Controller Other, Pawn OtherPawn) { Super.NotifyKilled(Killer, Other, OtherPawn); // If we are not doing extra-life bonus' if(!bHealthForKill || Killer==None || Killer.Pawn == None || Killer.Pawn.Health >100) return; Killer.Pawn.Health = Killer.Pawn.HealthMax; } // Send camper warning function SendCamperWarning(PlayerController Camper) { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { Player = PlayerController(P); if (Player != None) { // No one camps in the first 45 seconds if (Level.TimeSeconds - Player.PlayerReplicationInfo.StartTime < 45) return; if(Player == Camper) Player.ReceiveLocalizedMessage(class'BonusPack.LMSMessage', 0); else Player.ReceiveLocalizedMessage(class'BonusPack.LMSMessage', 1, Camper.PlayerReplicationInfo); } } } // Camper-detector State MatchInProgress { // GameInfo's already have a 1 second timer... function Timer() { local int i,j; local Box HistoryBox; local float MaxDim; local bool bSentWarning; Super.Timer(); // Do nothing else if camper alarm is off. if(!bCamperAlarm) return; i=0; while(i < LMSData.Length && !bSentWarning) { //Log( "Checking: "$LMSData[i].PC.PlayerReplicationInfo.PlayerName ); // If controller has expired (eg. left the game), remove the guard. if( LMSData[i].PC == None ) { //Log("Expiring Camper Guard."); LMSData.Remove(i, 1); } else if( !LMSData[i].PC.PlayerReplicationinfo.bIsSpectator && !LMSData[i].PC.PlayerReplicationinfo.bOnlySpectator && LMSData[i].PC.PlayerReplicationInfo.NumLives 0) LMSData[i].ReWarnTime--; } i++; } else i++; } } } event PostLogin( PlayerController NewPlayer ) { local LMSDataEntry NewData; local int i, l; Super.PostLogin(NewPlayer); NewPlayer.bAdrenalineEnabled = bAllowAdrenaline; // Check we dont already have data for this player controller. for(i=0; i 0 ) { for ( C=Level.ControllerList; C!=None; C=C.NextController ) { PRI = C.PlayerReplicationInfo; if ( (PRI!=None) && !PRI.bOnlySpectator && !PRI.bOutOfLives ) { if ( Winner!=None ) return false; else Winner = PRI; } } if (Winner==None) EndGame(Scorer,"LastMan"); else EndGame(Winner,"LastMan"); return true; } return false; } function GetServerDetails(out ServerResponseLine ServerState) { Super.GetServerDetails(ServerState); AddServerDetail( ServerState, "CampThreshold", CampThreshold ); AddServerDetail( ServerState, "CamperRewarnInterval", RecamperWarnInterval ); AddServerDetail( ServerState, "HealthForKills", bHealthForKill); AddServerDetail( ServerState, "AllowSuperWeapons", bAllowSuperWeapons ); AddServerDetail( ServerState, "CamperAlarm", bCamperAlarm ); AddServerDetail( ServerState, "AllowPickups", bAllowPickups ); AddServerDetail( ServerState, "AllowAdrenaline", bAllowAdrenaline ); AddServerDetail( ServerState, "FullAmmo", bFullAmmo); } static event bool AcceptPlayInfoProperty(string PropertyName) { if ( !Default.bCamperAlarm ) { if ( InStr(PropertyName, "CampThreshold") != -1 ) return false; if ( InStr(PropertyName, "ReCamperWarnInterval") != -1 ) return false; } if ( PropertyName == "MaxLives" ) return true; if ( PropertyName == "bWeaponStay" ) return false; return Super.AcceptPlayInfoProperty(PropertyName); } static function FillPlayInfo(PlayInfo PI) { Super.FillPlayInfo(PI); PI.AddSetting(default.RulesGroup, "bHealthForKill", GetDisplayText("bHealthForKill"), 40, 1, "Check", ,, ,True); PI.AddSetting(default.RulesGroup, "bAllowSuperweapons", GetDisplayText("bAllowSuperweapons"), 40, 1, "Check", ,, ,True); PI.AddSetting(default.RulesGroup, "bAllowPickups", GetDisplayText("bAllowPickups"), 60, 1, "Check", ,, ,True); PI.AddSetting(default.RulesGroup, "bAllowAdrenaline", GetDisplayText("bAllowAdrenaline"), 50, 1, "Check", ,, ,True); PI.AddSetting(default.RulesGroup, "bFullAmmo", GetDisplayText("bFullAmmo"), 50, 1, "Check", ,, ,True); PI.AddSetting(default.RulesGroup, "bCamperAlarm", GetDisplayText("bCamperAlarm"), 60, 1, "Check", ,, True,True); PI.AddSetting(default.GameGroup, "CampThreshold", GetDisplayText("CampThreshold"), 60, 1, "Check", ,, True,True); PI.AddSetting(default.GameGroup, "ReCamperWarnInterval", GetDisplayText("ReCamperWarnInterval"), 60, 1, "Text", "2;0:99",, True,True); } static function string GetDisplayText(string PropName) { switch (PropName) { case "CampThreshold": return default.LMSPropsDisplayText[0]; case "ReCamperWarnInterval": return default.LMSPropsDisplayText[1]; case "bHealthForKill": return default.LMSPropsDisplayText[2]; case "bAllowSuperweapons": return default.LMSPropsDisplayText[3]; case "bCamperAlarm": return default.LMSPropsDisplayText[4]; case "bAllowPickups": return default.LMSPropsDisplayText[5]; case "bAllowAdrenaline": return default.LMSPropsDisplayText[6]; case "bFullAmmo": return default.LMSPropsDisplayText[7]; } return Super.GetDisplayText(PropName); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "CampThreshold": return default.LMSPropDescText[0]; case "ReCamperWarnInterval": return default.LMSPropDescText[1]; case "bHealthForKill": return default.LMSPropDescText[2]; case "bAllowSuperweapons": return default.LMSPropDescText[3]; case "bCamperAlarm": return default.LMSPropDescText[4]; case "bAllowPickups": return default.LMSPropDescText[5]; case "bAllowAdrenaline": return default.LMSPropDescText[6]; case "bFullAmmo": return default.LMSPropDescText[7]; } return Super.GetDescriptionText(PropName); } ^e// ==================================================================== // Class: BonusPack.Tab_IAMutant // // Mutant game type config page. // // Written by James Golding // Rollback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class Tab_IAMutant extends Tab_IADeathMatch; var localized string TargetScoreString; var config bool LastBottomFeeders; var moCheckBox MyBottomFeeders; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyBottomFeeders = moCheckBox(Controls[16]); // Make the boxes a bit bigger. Controls[1].WinHeight = 0.538638; Controls[2].WinHeight = 0.538638; Controls[14].WinTop = 0.800430; MyBottomFeeders.Checked(LastBottomFeeders); //MyGoalScore.MyLabel.Caption = TargetScoreString; //MyGoalScore.SetValue(LastGoalScore); } // Add extra options to URL function string Play() { local string url; LastBottomFeeders = MyBottomFeeders.IsChecked(); SaveConfig(); url = Super.Play(); url = url$"?BottomFeeder="$LastBottomFeeders; return url; } function BottomFeedersChange(GUIComponent Sender) { LastBottomFeeders = MyBottomFeeders.IsChecked(); SaveConfig(); } ~^{6 @IvoZZnLnLnLZ#GI] Score Limitt i"mY#`^^V&// ==================================================================== // Class: BonusPack.Tab_IALastManStanding // // Last Man Standing game type config page. // // Written by James Golding // Rollback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class Tab_IALastManStanding extends Tab_IADeathMatch; var config bool LastExtraLives; var config bool LastSuperWeaps; var config bool LastAllowPickups; var config bool LastAllowAdrenaline; var moCheckBox MyExtraLives; var moCheckBox MySuperWeaps; var moCheckBox MyAllowPickups; var moCheckBox MyAllowAdrenaline; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyExtraLives=moCheckBox(Controls[14]); MySuperWeaps=moCheckBox(Controls[15]); MyAllowPickups=moCheckBox(Controls[16]); MyAllowAdrenaline=moCheckBox(Controls[17]); Controls[2].WinHeight=0.643324; // Make the box a bit bigger. MyExtraLives.Checked(LastExtraLives); MySuperWeaps.Checked(LastSuperWeaps); MyAllowPickups.Checked(LastAllowPickups); MyAllowAdrenaline.Checked(LastAllowAdrenaline); //MyGoalScore.MenuStateChange(MSAT_Disabled); //MyGoalScore.SetValue(0); } // Add extra options to URL function string Play() { local string url; LastExtraLives = MyExtraLives.IsChecked(); LastSuperWeaps = MySuperWeaps.IsChecked(); LastAllowPickups = MyAllowPickups.IsChecked(); LastAllowAdrenaline = MyAllowAdrenaline.IsChecked(); SaveConfig(); url = Super.Play(); url = url$"?HealthForKill="$LastExtraLives$"?SuperWeaps="$LastSuperWeaps$"?AllowPickups="$LastAllowPickups$"?AllowAdrenaline="$LastAllowAdrenaline; return url; } function SuperWeapChange(GUIComponent Sender) { if (MySuperWeaps.IsChecked()) MyAllowPickups.Checked(true); LastSuperWeaps = MySuperWeaps.IsChecked(); SaveConfig(); } function AllowPickupsChange(GUIComponent Sender) { if (!MyAllowPickups.IsChecked()) MySuperWeaps.Checked(false); LastAllowPickups = MyAllowPickups.IsChecked(); SaveConfig(); } function AllowAdrenalineChange(GUIComponent Sender) { LastAllowAdrenaline = MyAllowAdrenaline.IsChecked(); SaveConfig(); } function ExtraLivesChange(GUIComponent Sender) { LastExtraLives = MyExtraLives.IsChecked(); SaveConfig(); } ^V %hP(% GATz6 C7WbvoZZZZZZZZZZZZnLZZZZ#Guh"mY%WXVW^^m$class MutSquadAI extends DMSquad; // This only runs on server function bool SetEnemy( Bot B, Pawn NewEnemy ) { local xMutantGame mutantGame; local pawn mutantPawn; local int i; mutantGame = xMutantGame(Level.Game); // If no-one is a mutant (or we are), or we are the bottom feeder, do as normal DM. if( mutantGame.CurrentMutant == None || mutantGame.CurrentMutant == B || mutantGame.CurrentBottomFeeder == B ) return Super.SetEnemy(B, NewEnemy); mutantPawn = mutantGame.CurrentMutant.Pawn; // ??? If there is a mutant, remove all non-mutant enemies. for(i=0; i<8; i++) { if(Enemies[i] != mutantPawn) RemoveEnemy(Enemies[i]); } // Return false if NewEnemy != mutant. if( NewEnemy != mutantGame.CurrentMutant.Pawn ) return false; if ( !AddEnemy(NewEnemy) ) return false; return FindNewEnemyFor(B,(B.Enemy !=None) && B.LineOfSightTo(SquadMembers.Enemy)); } function bool FindNewEnemyFor(Bot B, bool bSeeEnemy) { local xMutantGame mutantGame; local Pawn OldEnemy, MutantPawn; mutantGame = xMutantGame(Level.Game); // If no-one is a mutant (or we are), or we are the bottom feeder, do as normal DM. if( mutantGame.CurrentMutant == None || mutantGame.CurrentMutant == B || mutantGame.CurrentBottomFeeder == B ) return Super.FindNewEnemyFor(B, bSeeEnemy); OldEnemy = B.Enemy; MutantPawn = mutantGame.CurrentMutant.Pawn; if(MutantPawn != None) { if ( VSize(MutantPawn.Location - B.Pawn.Location) < 1500 ) bSeeEnemy = B.LineOfSightTo(MutantPawn); else bSeeEnemy = B.CanSee(MutantPawn); // only if looking at him } B.Enemy = MutantPawn; if(OldEnemy != MutantPawn) { B.EnemyChanged(bSeeEnemy); return true; } return false; } function bool AssignSquadResponsibility(Bot B) { local xMutantGame mutantGame; local pawn mutantPawn; mutantGame = xMutantGame(Level.Game); // If there is a mutant (and I'm not it) if(mutantGame.CurrentMutant != None && mutantGame.CurrentMutant != B) { mutantPawn = mutantGame.CurrentMutant.Pawn; // If I'm not the bottom feeder but i'm hunting someone, it can only be the mutant. if(B.Enemy != None && mutantGame.CurrentBottomFeeder != B && B.Enemy != mutantPawn) { FindNewEnemyFor(B, false); } } return Super.AssignSquadResponsibility(B); } ^L// ==================================================================== // Class: BonusPack.MutLastManStanding // // Used to remove weapons from the level. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MutLastManStanding extends DMMutator HideDropDown CacheExempt; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local xLastManStandingGame LMSGame; LMSGame = xLastManStandingGame(Level.Game); if(LMSGame == None) { Log("Should only use MutLastManStanding with xLastManStandingGame game type."); bSuperRelevant = 0; return true; } // Remove conventional weapon pickups. Leave super weapons, all ammo etc. if ( Other.IsA('Pickup') ) { if (!LMSGame.bAllowPickups) return !Level.bStartup; if (Other.IsA('AdrenalinePickup') && !LMSGame.bAllowAdrenaline) return false; if( Other.IsA('WeaponPickup') ) { if( LMSGame.bAllowSuperweapons && (Other.IsA('PainterPickup') || Other.IsA('RedeemerPickup')) ) { bSuperRelevant = 0; return true; } else return !Level.bStartup; } else { bSuperRelevant = 0; return true; } } // Hide all weapon bases apart from super weapons if ( Other.IsA('xPickupBase') ) { if ( Other.IsA('xWeaponBase') ) { if( LMSGame.bAllowSuperweapons && (xWeaponBase(Other).WeaponType == class'Painter' || xWeaponBase(Other).WeaponType == class'Redeemer') ) Other.bHidden = false; else Other.bHidden = true; } else if (!LMSGame.bAllowPickups) Other.bHidden = true; } bSuperRelevant = 0; return true; } Ezx6FK23}ʁ)H653}ʁ)H65ʁ)H65ʁ)ʁ)3}ʁ)ʁ)H65;;ʁ)ʁ)H65ʁ) ^^P$// ==================================================================== // Class: BonusPack.MutantMessage // // For displaying localized messages related to the Mutant game type. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== #exec OBJ LOAD FILE=GameSounds.uax class MutantMessage extends LocalMessage; var localized string YouAreMutantMessage; var localized string SomeoneIsMutantMessage; var localized string SomeoneIsMutantMessageTrailer; var localized string FFAMessage; var localized string BottomFeederMessage; var localized string NotBottomFeederMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch(SwitchNum) { case 0: // You are the Mutant return Default.YouAreMutantMessage; case 1: // Someone is the Mutant if (RelatedPRI_1 == None) return ""; return Default.SomeoneIsMutantMessage@RelatedPRI_1.PlayerName@Default.SomeoneIsMutantMessageTrailer; case 2: // First blood becomes Mutant! return Default.FFAMessage; case 3: // You are the Bottom Feeder! return Default.BottomFeederMessage; case 4: // No longer Bottom Feeder! return Default.NotBottomFeederMessage; } } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); switch(SwitchNum) { case 0: // You are the Mutant P.PlayStatusAnnouncement('you_have_mutated', 1, true); break; case 1: // Someone is the Mutant P.PlayStatusAnnouncement('new_mutant', 1, true); break; case 2: // First blood becomes Mutant! P.PlayAnnouncement(sound'GameSounds.UT2K3Fanfare11', 1, true); break; case 3: // You are the Bottom Feeder! P.PlayStatusAnnouncement('bottom_feeder', 1, true); break; case 4: // No longer Bottom Feeder! P.PlayAnnouncement(sound'GameSounds.UT2K3Fanfare08', 1, true); break; } } ^G// ==================================================================== // Class: BonusPack.MutantGlow // // Glowing particle effect for mutant // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== #exec OBJ LOAD FILE=EpicParticles.utx class MutantGlow extends Emitter; ^Y// ==================================================================== // Class: BonusPack.MutantGameReplicationInfo // // New GRI for Mutant game type. Used to replicate mutant position etc. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MutantGameReplicationInfo extends GameReplicationInfo; var vector MutantLocation; var PlayerReplicationInfo MutantPRI; var PlayerReplicationInfo BottomFeederPRI; replication { reliable if(Role == ROLE_Authority) MutantLocation, MutantPRI, BottomFeederPRI; } // every so often - update replication position of Mutant. function PostBeginPlay() { if(Role == ROLE_Authority) SetTimer(0.2, true); } function Timer() { local Controller pred; pred = xMutantGame(Level.Game).CurrentMutant; if(pred != None) { MutantLocation = pred.Pawn.Location; } super.timer(); } ^A// ==================================================================== // Class: BonusPack.MapListMutant // // Written by JamesGolding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapListMutant extends MapList config; Js6Kx6cH ^^_tZtuU.,S.,w.,E.,,$?U c-_S c-Ww c-GE c-K G^T// ==================================================================== // Class: BonusPack.MapListLastManStanding // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapListLastManStanding extends MapList config; Mq6Nf cH ^^LPB2w-_Ub-WSb-Gwb-KEbbGGppppppppG?HealthForKill=9T-_?SuperWeaps=9T-W?AllowPickups=9T-G?AllowAdrenaline=9T-KG G^G@^^M// ==================================================================== // Class: BonusPack.LMSMessage // // For displaying localized messages related to the Last Man Standing game type. // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== #exec OBJ LOAD FILE=TauntPack.uax class LMSMessage extends LocalMessage; var localized string YouAreCamperMessage; var sound YouAreCamperSound; // OBSOLETE var localized string SomeoneIsCamperMessage; var localized string SomeoneIsCamperMessageTrailer; var sound SomeoneIsCamperSound; // OBSOLETE static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch(SwitchNum) { case 0: // You are a camper return Default.YouAreCamperMessage; case 1: // Someone is a camper if (RelatedPRI_1 == None) return ""; return Default.SomeoneIsCamperMessage@RelatedPRI_1.PlayerName@Default.SomeoneIsCamperMessageTrailer@"("$RelatedPRI_1.GetLocationName()$")"; } } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); switch(SwitchNum) { case 0: // You are a camper if(Default.YouAreCamperSound != None) P.PlayStatusAnnouncement('Camper', 1, true); break; } } ^g// ==================================================================== // Class: BonusPack.HudMutant // // HUD for Mutant game-type. Adds things like the mutant-detecting radar // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class HudMutant extends HudCDeathMatch; var() SpriteWidget TopRadarBG; var() SpriteWidget CenterRadarBG; //var() localized String CurrentMutantFontName; //var() Font CurrentMutantFontFont; var() Color CurrentMutantColor; var() Color MutantHudTint; var() localized String MutantRangeFontName; var() Font MutantRangeFontFont; var() Color MutantRangeColor; var() localized String BottomFeederText; var() Color BottomFeederTextColor; var() Color AboveMutantColor; var() Color LevelMutantColor; var() Color BelowMutantColor; var() Color RangeDotColor; var() float LevelRampRegion; var() bool bCenterRadar; var() bool bTestHud; var() float RangeRampRegion; var() float MaxAngleDelta; var() float BigDotSize; var() float SmallDotSize; var() float XCen, XRad, YCen, YRad; // Center radar tweaking var() float MNOriginX, MNOriginY, MNSizeX, MNSizeY; var() float BFIOriginX, BFIOriginY, BFISizeX, BFISizeY, BFIMargin, BFIPulseRate; var() Material BottomFeederIcon; var() Texture BottomFeederBeaconMat; var transient bool bMutantHudColor; function color LerpColor(float Alpha, color A, color B) { local color output; output.R = lerp(Alpha, A.R, B.R); output.G = lerp(Alpha, A.G, B.G); output.B = lerp(Alpha, A.B, B.B); output.A = lerp(Alpha, A.A, B.A); return output; } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'InterfaceContent.HUD.SkinA'); Super.UpdatePrecacheMaterials(); } simulated function font LoadMutantRangeFont() { if( MutantRangeFontFont == None ) { MutantRangeFontFont = Font(DynamicLoadObject(MutantRangeFontName, class'Font')); if( MutantRangeFontFont == None ) Log("Warning: "$Self$" Couldn't dynamically load font "$MutantRangeFontName); } return MutantRangeFontFont; } // Alpha Pass ================================================================================== // Draw radar showing simulated function bool PRIIsBottomFeeder(PlayerReplicationInfo PRI) { local MutantGameReplicationInfo mutantInfo; mutantInfo = MutantGameReplicationInfo( PlayerOwner.GameReplicationInfo ); // Check this players PRI against the current BF PRI to see... if(PRI == mutantInfo.BottomFeederPRI) return true; else return false; } simulated function bool PRIIsMutant(PlayerReplicationInfo PRI) { local MutantGameReplicationInfo mutantInfo; mutantInfo = MutantGameReplicationInfo( PlayerOwner.GameReplicationInfo ); // Check this players PRI against the current Mutant PRI to see... if(PRI == mutantInfo.MutantPRI) return true; else return false; } // Copy from HudCDeathMatch - need to hack it to change HUD color. simulated function DrawWeaponBar( Canvas C ) { local color RealRedColor, RealBlueColor; if ( !bMutantHUDColor ) { Super.DrawWeaponBar(C); return; } RealRedColor = HudColorRed; RealBlueColor = HudColorBlue; HudColorRed = MutantHUDTint; HudColorBlue = MutantHUDTint; Super.DrawWeaponBar(C); HudColorRed = RealRedColor; HudColorBlue = RealBlueColor; } simulated function DrawHud(Canvas C) { local color RealRedColor, RealBlueColor; bMutantHudColor = PRIIsMutant(PlayerOwner.PlayerReplicationInfo); if ( !bMutantHUDColor ) { Super.DrawHud(C); return; } RealRedColor = HudColorRed; RealBlueColor = HudColorBlue; HudColorRed = MutantHUDTint; HudColorBlue = MutantHUDTint; Super.DrawHud(C); HudColorRed = RealRedColor; HudColorBlue = RealBlueColor; } simulated function bool PawnIsVisible(vector vecPawnView, vector X, pawn P) { local vector StartTrace, EndTrace; if ( (PawnOwner == None) || (PlayerOwner==None) ) return false; if ( PawnOwner != PlayerOwner.Pawn ) return false; if ( (vecPawnView Dot X) <= 0.70 ) return false; StartTrace = PawnOwner.Location; StartTrace.Z += PawnOwner.BaseEyeHeight; EndTrace = P.Location; EndTrace.Z += P.BaseEyeHeight; if ( !FastTrace(EndTrace, StartTrace) ) return false; return true; } function DrawCustomBeacon(Canvas C, Pawn P, float ScreenLocX, float ScreenLocY) { if ( P.PlayerReplicationInfo != MutantGameReplicationInfo(PlayerOwner.GameReplicationInfo).BottomFeederPRI ) return; C.DrawColor = BottomFeederTextColor; C.SetPos(ScreenLocX - 0.125 * BottomFeederBeaconMat.USize, ScreenLocY - 0.125 * BottomFeederBeaconMat.VSize); C.DrawTile(BottomFeederBeaconMat, 0.25 * BottomFeederBeaconMat.USize, 0.25 * BottomFeederBeaconMat.VSize, 0.0, 0.0, BottomFeederBeaconMat.USize, BottomFeederBeaconMat.VSize); } simulated function DrawBottomFeederIndicator(Canvas C); //OBSOLETE simulated function DrawHudPassA(Canvas C) { local rotator Dir; local float Angle, VertDiff, Range, AngleDelta; local MutantGameReplicationInfo mutantInfo; local xMutantPawn x; Super.DrawHudPassA (C); mutantInfo = MutantGameReplicationInfo(PlayerOwner.GameReplicationInfo); x = xMutantPawn(PawnOwner); // If there is a mutant, and we are not it - draw radar indicating mutant location. if( bTestHud || (mutantInfo.MutantPRI != None && mutantInfo.MutantPRI != PlayerOwner.PlayerReplicationInfo) ) { // Draw radar outline if(bCenterRadar) { PassStyle=STY_None; DrawSpriteWidget (C, CenterRadarBG); PassStyle=STY_Alpha; } else { DrawSpriteWidget(C, TopRadarBG); } if(bTestHud) { Dir = rotator(vect(0, 0, 0) - PawnOwner.Location); VertDiff = 0.0 - PawnOwner.Location.Z; Range = VSize(vect(0, 0, 0) - PawnOwner.Location) - class'xPawn'.default.CollisionRadius; } else { Dir = rotator(mutantInfo.MutantLocation - PawnOwner.Location); VertDiff = mutantInfo.MutantLocation.Z - PawnOwner.Location.Z; // Remove player radiii from range (so when you are standing next to the mutant range is zero) Range = VSize(mutantInfo.MutantLocation - PawnOwner.Location) - (2 * class'xPawn'.default.CollisionRadius); } Angle = ((Dir.Yaw - PawnOwner.Rotation.Yaw) & 65535) * 6.2832/65536; if(VertDiff > LevelRampRegion) C.DrawColor = AboveMutantColor; else if(VertDiff > 0) C.DrawColor = LerpColor(VertDiff/LevelRampRegion, LevelMutantColor, AboveMutantColor); else if(VertDiff > -LevelRampRegion) C.DrawColor = LerpColor(-VertDiff/LevelRampRegion, LevelMutantColor, BelowMutantColor); else C.DrawColor = BelowMutantColor; C.Style = ERenderStyle.STY_Alpha; if(bCenterRadar) { C.SetPos(XCen * C.ClipX + HudScale * XRad * C.ClipX * sin(Angle) - 0.5*BigDotSize*C.ClipX, YCen * C.ClipY - HudScale * YRad * C.ClipY * cos(Angle) - 0.5*BigDotSize*C.ClipX ); } else { C.SetPos(0.492 * C.ClipX + HudScale * 0.034 * C.ClipX * sin(Angle), 0.042 * C.ClipY - HudScale * 0.045 * C.ClipY * cos(Angle)); } C.DrawTile(Material'InterfaceContent.Hud.SkinA', BigDotSize*C.ClipX, BigDotSize*C.ClipX,838,238,144,144); if(bCenterRadar) { // Draw dots to indicate mutant range AngleDelta = (FMin(RangeRampRegion, Range)/RangeRampRegion) * MaxAngleDelta; C.DrawColor = RangeDotColor; C.SetPos(XCen * C.ClipX + HudScale * XRad * C.ClipX * sin(Angle + AngleDelta) - 0.5*SmallDotSize*C.ClipX, YCen * C.ClipY - HudScale * YRad * C.ClipY * cos(Angle + AngleDelta) - 0.5*SmallDotSize*C.ClipX ); C.DrawTile(Material'InterfaceContent.Hud.SkinA', SmallDotSize*C.ClipX, SmallDotSize*C.ClipX, 838, 238, 144, 144); C.SetPos(XCen * C.ClipX + HudScale * XRad * C.ClipX * sin(Angle - AngleDelta) - 0.5*SmallDotSize*C.ClipX, YCen * C.ClipY - HudScale * YRad * C.ClipY * cos(Angle - AngleDelta) - 0.5*SmallDotSize*C.ClipX); C.DrawTile(Material'InterfaceContent.Hud.SkinA', SmallDotSize*C.ClipX, SmallDotSize*C.ClipX, 838, 238, 144, 144); } else { // Draw on Mutant range in middle of dial C.DrawColor = MutantRangeColor; C.Font = LoadMutantRangeFont(); C.DrawTextJustified( Min(int(Range),9999) , 1, 0.4 * C.ClipX, 0.03 * C.ClipY, 0.6 * C.ClipX, 0.08 * C.ClipY); } // Draw on Mutant name C.DrawColor = WhiteColor; C.SetPos(C.ClipX * MNOriginX, C.ClipY * MNOriginY); C.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxD', MNSizeX * C.ClipX, MNSizeY * C.ClipY); C.DrawColor = CurrentMutantColor; C.Font = LoadLevelActionFont(); if( bTestHud) C.DrawTextJustified("DefLoc", 1, 0.3 * C.ClipX, 0.015 * C.ClipY, 0.7 * C.ClipX, 0.065 * C.ClipY); else C.DrawTextJustified(mutantInfo.MutantPRI.PlayerName, 1, 0.3 * C.ClipX, 0.015 * C.ClipY, 0.7 * C.ClipX, 0.065 * C.ClipY); } // If there is no bottom feeder - no more HUD to do. if( mutantInfo.BottomFeederPRI == None) return; // If we are a bottom feeder - indicate on the screen if( PRIIsBottomFeeder(PlayerOwner.PlayerReplicationInfo) ) { C.DrawColor = WhiteColor; C.SetPos(C.ClipX * BFIOriginX, C.ClipY * BFIOriginY); C.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxD', BFISizeX * C.ClipX, BFISizeY * C.ClipY); C.DrawColor.R = 255 * (0.5 + 0.5 * Cos(Level.TimeSeconds * Pi * BFIPulseRate)); C.SetPos(C.ClipX * (BFIOriginX + BFIMargin), C.ClipY * (BFIOriginY + BFIMargin)); C.DrawTile( BottomFeederIcon, C.ClipX * (BFISizeX - 2*BFIMargin), C.ClipY * (BFISizeY - 2*BFIMargin), 0, 0, 256, 256); } } // Draw enemy name. Also indicate bottom feeders. function DisplayEnemyName(Canvas C, PlayerReplicationInfo PRI) { // Send 'bottom feeder' indication if( PRIIsBottomFeeder( PRI ) ) PlayerOwner.ReceiveLocalizedMessage(class'MutantNameMessage',1,PRI); else //send blank bottomfeeder message PlayerOwner.ReceiveLocalizedMessage(class'MutantNameMessage',0,PRI); } simulated function DrawCrosshair (Canvas C) { Super.DrawCrosshair(C); } ^wRZ8Rxf.,&. ?,. ?,L?f c-l G^L^RB>CUPڟ7r u u u uhhhhhȟhҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽzVGBҽҽҽҽ uҽҽҽҽҽҽҽҽ3}ҽҽҽҽҽҽh uҽҽډډҽډډډډ uhhhh u u u3}#G|Z9j=>_ZTU"V"pW"X"^?$33>8E$?$ #_ZTU"V"W"X"^?$L?8E$?$?B","DP$?*^*X *dA]UT2003Fonts.FontMonoD*j ]BOTTOM FEEDERq *G*H*X*Y*2Z$C_g$@EC$?$<|$Q8j$?k$L>` $)\>j $oi $u=e $fff?k $ #?^ $Q=b $=_ $ #*Pn^$L?*H2^$?*^dZ%8(Z$L> $L>^Z$L> $L>^Z$L> $L>^^c$L?ba"Z`Z%8(Z$@ $@@^Z$@ $@@^Z$@ $@@^^WZ%8(Z$@ $@A^Z$@ $@^Z$B $B^^UT:@>>p>M$@E@K$JZ$> $?^^`[$fff?]]Killing Gives Health{ 'W| N]NLWhen selected, a portion of the player's health is restored with each kill.Q$)\??R$L=S$>Y$ #=G'CP^`[$fff?]]Allow Super Weapons{ 'X| N],+When selected, allow super weapon pickups.Q$%L?R$ ?S$>Y$ #=G'CT^^C^^c^^x^^V^^j^^_^^y^^{^^\^^o @^^s^^O^^n^^A^^a^^^^z^^d^^`^^b^^^^A^^c^^d^^^^R^^i^^B^^E^^i@^^k^^g^^u^^^^^^G ^^S^^Y^^`^^Z^^@^^^^^^K@^^F^^Q^^I^^U@^^k @^^^^^^^h^^^^]^^|^yI`Txʁ)3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}ʁ)ʁ)ʁ)ʁ)]pfW o$ An$ףp>rp^^L@^^\^^D^^^T^v^^Z^^V@^^]^^^^^l^^H@^^W^^j@^^^^^^t^^|^^C@^^b^^e^^@^^shOT9:h9:$hhh-h-hhhh  G^~e_ ! rf*(w.f*8r.f*(w.f* wfe .f-w.f*.fZ .f- G^F// ==================================================================== // (C) 2002, Epic Games // ==================================================================== class ScoreBoardLMS extends ScoreBoardDeathMatch; var localized string LivesText; var plane FullOn, GrayedOut; simulated event UpdateScoreBoard(Canvas Canvas) { local PlayerReplicationInfo PRI, OwnerPRI; local int i, FontReduction, OwnerPos, NetXPos, PlayerCount,HeaderOffsetY,HeadFoot, MessageFoot, PlayerBoxSizeY, BoxSpaceY, NameXPos, BoxTextOffsetY, OwnerOffset, ScoreXPos, DeathsXPos, BoxXPos, TitleYPos, BoxWidth; local float XL,YL, MaxScaling; local float deathsXL, scoreXL, netXL, MaxNamePos; local string playername[MAXPLAYERS]; local bool bNameFontReduction; local plane OldColorModulate; OldColorModulate = Canvas.ColorModulate; OwnerPRI = PlayerController(Owner).PlayerReplicationInfo; for (i=0; i (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { BoxSpaceY = 0.125 * YL; PlayerBoxSizeY = 1.25 * YL; if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) PlayerBoxSizeY = 1.125 * YL; if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; PlayerBoxSizeY = 1.125 * YL; HeadFoot = 5*YL; if ( PlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; PlayerBoxSizeY = 1.125 * YL; HeadFoot = 5*YL; if ( (Canvas.ClipY >= 768) && (PlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY)) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; PlayerBoxSizeY = 1.125 * YL; HeadFoot = 5*YL; } } } } } if ( Canvas.ClipX < 512 ) PlayerCount = Min(PlayerCount, 1+(Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ); else PlayerCount = Min(PlayerCount, (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ); if ( OwnerOffset >= PlayerCount ) PlayerCount -= 1; if ( FontReduction > 2 ) MaxScaling = 3; else MaxScaling = 2.125; PlayerBoxSizeY = FClamp((1+(Canvas.ClipY - 0.67 * MessageFoot))/PlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); bDisplayMessages = (PlayerCount <= (Canvas.ClipY - MessageFoot)/(PlayerBoxSizeY + BoxSpaceY)); HeaderOffsetY = 3 * YL; BoxWidth = 0.9375 * Canvas.ClipX; BoxXPos = 0.5 * (Canvas.ClipX - BoxWidth); BoxWidth = Canvas.ClipX - 2*BoxXPos; NameXPos = BoxXPos + 0.0625 * BoxWidth; ScoreXPos = BoxXPos + 0.5 * BoxWidth; DeathsXPos = BoxXPos + 0.6875 * BoxWidth; NetXPos = BoxXPos + 0.8125 * BoxWidth; // draw background boxes Canvas.Style = ERenderStyle.STY_Alpha; Canvas.DrawColor = HUDClass.default.WhiteColor * 0.5; for ( i=0; i MaxNamePos ) { bNameFontReduction = true; break; } } if ( !bNameFontReduction && (OwnerOffset >= PlayerCount) ) { playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) bNameFontReduction = true; } if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1); for ( i=0; i MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[OwnerOffset] = left(playername[OwnerOffset], MaxNamePos/XL * len(PlayerName[OwnerOffset])); } Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * (PlayerBoxSizeY - YL); Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= PlayerCount ) { OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*PlayerCount + BoxTextOffsetY; // draw extra box Canvas.Style = ERenderStyle.STY_Alpha; Canvas.DrawColor = HUDClass.default.TurqColor * 0.5; Canvas.SetPos(BoxXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY)*PlayerCount); Canvas.DrawTileStretched( BoxMaterial, BoxWidth, PlayerBoxSizeY); Canvas.Style = ERenderStyle.STY_Normal; } else OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*OwnerOffset + BoxTextOffsetY; if (GRI.PRIArray[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.DrawColor = HUDClass.default.GoldColor; Canvas.SetPos(NameXPos, OwnerPos); if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1); Canvas.DrawText(playername[OwnerOffset],true); if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.SetPos(ScoreXPos, OwnerPos); Canvas.DrawText(int(GRI.PRIArray[OwnerOffset].Score),true); if ( GRI.PRIArray[OwnerOffset].bOutOfLives ) { Canvas.StrLen(OutText,Xl,Yl); Canvas.SetPos(DeathsXPos-(XL/2), OwnerPos); Canvas.DrawText(OutText,true); } else { Canvas.SetPos(DeathsXPos, OwnerPos); Canvas.DrawText(int(GRI.MaxLives-GRI.PRIArray[OwnerOffset].Deaths),true); } if ( Level.NetMode == NM_Standalone ) return; Canvas.StrLen(NetText, NetXL, YL); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NetXPos + 0.5*NetXL, TitleYPos); Canvas.DrawText(NetText,true); for ( i=0; i P2.Deaths) return false; if (P1.Deaths == P2.Deaths) { if (P1.Score < P2.Score) return false; if ( (P1.Score == P2.Score) && (PlayerController(P2.Owner) != None) && (Viewport(PlayerController(P2.Owner).Player) != None) ) return false; } return true; } ^a[eL*-[ r[i[[J[[aWe`Y`[q[[aWeWYWAYv[9?,ADA9?,9?,6[C6[C6[6[C[v[9=,9=,9=,9=,[ [A6[CBv9?,|[v9?,[$[4a CDCDCC[$w.* w.*[$ 9=,$ 9=,[9?W[CD@?B[ a([aaen[&[9?,eB[aa[9=,9=,$9=,[J[[%CD@?BW[)a.(xp9S9D9?|.[axen[-[9?,eBW[ ax([9=,9=,9=,9=,[J[[aen[F[9?,e9?,vA9?,n9?,[ a([q[[a|en[,[9?,e9?, A[9=,9=,9=,9=,6[C[a|S%@%@7|w@|*!@|-!@|-!@|-S@fxp9SSj[axen[9[9?,e9?,v9?,n[axi[ G^mLJ9:m9:$m?mm-(m&am?mmL?m G^r^FGj6 uN1jWݝҳݝҳݝҳݝҳݝҳݝҳjWݝҳݝҳвв mrq]Camouflage Comboo]Pint-sized Combok]qoWhen enabled, this adrenaline combo covers you with a holographic projection of a rock or a part of a buildingu]76When enabled, this adrenaline combo makes you smallerK] Bonus CombosM]DBAdds the Pint-sized combo (LLLL) and the Camouflage Combo (RRRR).^^J@// ==================================================================== // (C) 2002, Epic Games // ==================================================================== class HudLMS extends HudCDeathMatch; var localized string LivesRemainingString; var localized string PlayersRemainString; #EXEC OBJ LOAD FILE=LastManStanding.utx simulated function DrawSpectatingHud (Canvas C) { local string InfoString; local plane OldModulate; local float xl,yl,Full, Height, Top, TextTop, MedH, SmallH,Scale; local int i,cnt; local GameReplicationInfo GRI; if (!PlayerOwner.PlayerReplicationInfo.bOutOfLives) { Super.DrawSpectatingHud(C); return; } DisplayLocalMessages (C); OldModulate = C.ColorModulate; C.Font = GetMediumFontFor(C); C.StrLen("W",xl,MedH); Height = MedH; C.Font = GetConsoleFont(C); C.StrLen("W",xl,SmallH); Height += SmallH; Full = Height; Top = C.ClipY-8-Full; Scale = (Full+16)/128; // I like Yellow C.ColorModulate.X=255; C.ColorModulate.Y=255; C.ColorModulate.Z=0; C.ColorModulate.W=255; // Draw Border C.SetPos(0,Top); C.SetDrawColor(255,255,255,255); C.DrawTileStretched(material'InterfaceContent.SquareBoxA',C.ClipX,Full); C.ColorModulate.Z=255; TextTop = Top + 4; GRI = PlayerOwner.GameReplicationInfo; C.SetPos(0,Top-8); C.Style=5; C.DrawTile(material'LMSLogoSmall',256*Scale,128*Scale,0,0,256,128); C.Style=1; if ( Pawn(PlayerOwner.ViewTarget) != None && Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo != None ) { // Draw View Target info C.SetDrawColor(32,255,32,255); if ( C.ClipX < 640 ) SmallH = 0; else { C.SetPos((256*Scale*0.75),TextTop); C.DrawText(NowViewing,false); C.StrLen(LivesRemainingString,Xl,Yl); C.SetPos(C.ClipX-5-XL,TextTop); C.DrawText(LivesRemainingString); } C.SetDrawColor(255,255,0,255); C.Font = GetMediumFontFor(C); C.SetPos((256*Scale*0.75),TextTop+SmallH); C.DrawText(Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo.PlayerName,false); InfoString = ""$Int(GRI.MaxLives - Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo.Deaths); C.StrLen(InfoString,xl,yl); C.SetPos(C.ClipX-5-XL,TextTop+SmallH); C.DrawText(InfoString,false); } else { C.SetDrawColor(255,255,255,255); C.Font = GetMediumFontFor(C); C.StrLen(InitialViewingString,XL,YL); C.SetPos( (C.ClipX/2) - (XL/2), Top + (Full/2) - (YL/2)); C.DrawText(InitialViewingString,false); } C.Font = GetConsoleFont(C); C.StrLen(GRI.GameName,XL,YL); C.SetPos( (C.ClipX/2) - (XL/2), 10); C.SetDrawColor(255,255,255,255); C.ColorModulate.Z = 255; C.DrawText(GRI.GameName); Cnt=0; for (i=0;i= 640 ) DrawNumericWidget (C, mySpread, DigitsBig); DrawNumericWidget (C, myRank, DigitsBig); } } ^EKO wX*Xa Gv@\>Yx'C7rY! u- =1zVGB u- =1 u- =1zVGBzVGBҽ uzVGBҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ uҽҽҽҽ u uhҽҽҽҽҽҽҽҽҽҽҽҽ uhzVGB- =1 uhzVGBҽҽҽҽҽҽҽҽҽҽҽҽ- =1ҽҽҽҽҽ- =1- =1- =1- =1zVGB- =1zVGB- =1zVGBҽҽҽҽҽ#Gb]Lives Remaininga]Players Remain -- ^^Qclass CrateActor extends Actor; #exec OBJ LOAD FILE=TowerStatic.usx #exec OBJ LOAD FILE=Egypt_techmeshes_Epic.usx #exec OBJ LOAD FILE=HumanoidHardware.usx function PostBeginPlay() { local Actor OwnerBase; local vector HitNormal, HitLocation; SetBase(Owner); if ( Owner.Base != None ) OwnerBase = Owner.Base; else OwnerBase = Trace(HitLocation, HitNormal, Owner.Location - vect(0,0,300), Owner.Location, false); if ( TerrainInfo(OwnerBase) != None ) SetTerrainMesh(); else SetIndoorMesh(); } function SetTerrainMesh() { if ( Level.OutdoorCamouflageMesh == None ) { if ( (Level.Title ~= "Facing Worlds 3") || (Level.Title ~= "Temple Of Anubis") || (Level.Title ~= "Sun Temple") ) { Level.OutdoorCamouflageMesh = StaticMesh'Egypt_techmeshes_Epic.Deco.egypt_techpassagesec6'; Level.OutdoorMeshDrawScale = 0.8; } else { Level.OutdoorCamouflageMesh = StaticMesh'TowerStatic.TowerStoneC'; Level.OutDoorMeshDrawScale = 0.235; } } SetStaticMesh(Level.OutdoorCamouflageMesh); SetDrawScale(Level.OutDoorMeshDrawScale); } function SetIndoorMesh() { if ( Level.IndoorCamouflageMesh == None ) { if ( (Level.Title ~= "Facing Worlds 3") || (Level.Title ~= "Temple Of Anubis") || (Level.Title ~= "Sun Temple") ) { Level.IndoorCamouflageMesh = StaticMesh'Egypt_techmeshes_Epic.Deco.egypt_techpassagesec6'; Level.IndoorMeshDrawScale = 0.8; } else { Level.IndoorCamouflageMesh = StaticMesh'HumanoidHardware.jribbedcolumn01HA'; Level.IndoorMeshDrawScale = 0.45; } } SetStaticMesh(Level.IndoorCamouflageMesh); SetDrawScale(Level.IndoorMeshDrawScale); } LwV2z-7$Tx̏̏̏. N] Camouflaged!^$4BhHE"EEE^^f^^Xclass ComboMiniMe extends Combo; function StartEffect(xPawn P) { if (P.Role == ROLE_Authority) { P.SetDrawscale(0.5 * P.Default.DrawScale); P.bCanCrouch = false; P.SetCollisionSize(P.CollisionRadius, 0.5*P.CollisionHeight); P.BaseEyeheight = 0.8 * P.CollisionHeight; } } function StopEffect(xPawn P) { if (P.Role == ROLE_Authority) { P.SetDrawscale(P.Default.DrawScale); P.bCanCrouch = P.default.bCanCrouch; P.BaseEyeheight = P.Default.BaseEyeheight; P.ForceCrouch(); } } ^j fxH ;Mf2wM*M--LM G}kW2%$̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏̏. N] Pint-sized!h^E"EEE^^pJ~ ]#r*F 69D9?Q%I%I7I-QIg6Q69DZ- JEJ9? J J G^^^B aL!a%a, wa*aIBonuspack.ComboCrateaIBonuspack.ComboMiniMea*a G^M^^PN a*3w*PrPabh #C (w.P*RU G^X~Lckh9:~9:$Xa T~ ~ ~# ?~  G^Sclass MutCrateCombo extends Mutator; var xPlayer NotifyPlayer[32]; var config bool bAllowCamouflage; var config bool bAllowPint; var localized string CamoDisplayText, MiniDisplayText, CamoDescText, MiniDescText; static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.RulesGroup, "bAllowCamouflage", default.CamoDisplayText, 0, 1, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bAllowPint", default.MiniDisplayText, 0, 1, "Check"); } static event string GetDescriptionText(string PropName) { switch (PropName) { case "bAllowCamouflage": return default.CamoDescText; case "bAllowPint": return default.MiniDescText; } return Super.GetDescriptionText(PropName); } function Timer() { local int i; for ( i=0; i<32; i++ ) if ( NotifyPlayer[i] != None ) { NotifyPlayer[i].ClientReceiveCombo("Bonuspack.ComboCrate"); NotifyPlayer[i].ClientReceiveCombo("Bonuspack.ComboMiniMe"); NotifyPlayer[i] = None; } } function bool IsRelevant(Actor Other, out byte bSuperRelevant) { local int i; if ( xPlayer(Other) != None ) { for ( i=0; i<16; i++ ) { if ( xPlayer(Other).ComboNameList[i] ~= "Bonuspack.ComboCrate" ) break; else if ( xPlayer(Other).ComboNameList[i] == "" ) { xPlayer(Other).ComboNameList[i] = "Bonuspack.ComboCrate"; break; } } for ( i=0; i<16; i++ ) { if ( xPlayer(Other).ComboNameList[i] ~= "Bonuspack.ComboMiniMe" ) break; else if ( xPlayer(Other).ComboNameList[i] == "" ) { xPlayer(Other).ComboNameList[i] = "Bonuspack.ComboMiniMe"; break; } } for ( i=0; i<32; i++ ) if ( NotifyPlayer[i] == None ) { NotifyPlayer[i] = xPlayer(Other); SetTimer(0.5, false); break; } } if ( NextMutator != None ) return NextMutator.IsRelevant(Other, bSuperRelevant); else return true; } ^BpH,\w.p*r%r,]|r.pBonuspack.ComboCratezr.pr.pBonuspack.ComboCraterr%fr,|r.pBonuspack.ComboMiniMef\\zr.pr.pBonuspack.ComboMiniMefrr%r, rr*r.pa?(rmw*Hpd' G^DR6r*|Facing Worlds 3#|Temple Of Anubis|Sun Temple L? ףp> G^HU-nr*|Facing Worlds 3#|Temple Of Anubis|Sun Temple L? ff> Gon [2cJU^TʆzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGB uҽ u- =1- =1zVGBzVGBzVGBҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽu)ҽҽҽҽҽҽ- =1zVGBҽ- =1zVGBҽҽ- =1zVGBҽ- =1zVGBҽҽҽu)ҽҽҽu)- =1zVGBҽҽҽҽҽҽu)- =1zVGBҽҽҽҽ- =1zVGBҽu)- =1zVGBҽҽҽҽҽҽҽ- =1- =1zVGBҽҽu)ҽҽҽ- =1zVGBҽҽҽu)ҽҽҽҽҽҽ- =1zVGB- =1zVGBҽҽҽҽҽ- =1- =1zVGB3}ҽҽu)ҽҽ- =1- =1# i]LIVEShZj[$?($?$?$?^gZj[$@?($@?$@?$@?^^^^^Oclass ComboCrate extends Combo; var CrateActor Effect; function StartEffect(xPawn P) { if (P.Role == ROLE_Authority) Effect = Spawn(class'CrateActor', P,, P.Location + P.CollisionHeight * vect(0,0,0.55), P.Rotation); } function StopEffect(xPawn P) { if (Effect != None) Effect.Destroy(); } ^_Yt%cYZ.Z%Z7CZC-&C-C-rCZ`Z]Z4]], Y JYYaTesta\_9D>\^9D?\d9D9?,\O9D?9?d9?]Y?9?d9?^__9D>\^9D?\9?]Y?9?d9?^_Y9?]Y?9?d9?^_^9D?\9?]Y?9?d9?^_cYFYcYaTesta\_9D>\^9D?\d9D9?,\9?]Y9?d9?^_cYFYcYaTesta\_9D>\^9D?\d9D9?,\Y9?19?]Y9?d9?^_cYFYcYaTesta\_9D>\^9D?\d9D9?,\Y9?]]9D9?&Y9?d9?^_]]9DY9?d^_/`]]&Ic,V@@TV@^9D?Y+?9?O9?]9?_9?^V\-9?]Y9?O9?^_j9D9?,\g9Dp?Yi9D?Y9?gg9DY9?,iy9D9?i=9?g{9D9?i?9?gu9D9?i0?9?gR9D9?iP?9?gY$Yb(?Z%~Z]Y)9?i9?j^_ZY9?g9?^ZY$Y$XY9?j9?]&9?^_9?^z9D9?j?\Ya]\Ya_\\YY9?y9?zY a'Y"9?{?]9?zY a'Y"9?u?\9?zY a_'lfff?9?{yZ% Z]ZbZYaZba\ al-o' Z  -o `]`b`Ya`ba\ al-o'3 -oYFYc&Z% Z]ZbZYaZba\ alZbZb9Dla9?}ZbZ:  `]`b`Ya`ba\ al`b`b9Dla9?}`bY$YY&?Y9?j,k9D9?j?9?^\YZ% Z] Z` Z-YF YHY-9?y9?^_9?Z9?kYaZb'Z+  -oYFYcYZ%Z]Z` Z-YF YHY-9?{9?^_9?Z9?kY%a9S9DZ'Z9 YZ%Z]Z`Z-YFYaa\Y:9?ua9?,9?^_9?Z9?kY a'YHY-9?u9?^_9?Z9?kY7a9S9D9?Z'Z5\`]s^_]kY$Yb(?Y)9?i9?j^_]Y9?g9?^Y$|s^_`kZ-YFYHYY9?y9?s--oYFYc&Ya`b'm-oYFYcY9?{9?sY%a9S9D`'3`-Yaa\Y!9?ua9?,9?sY a'Y9?u9?sY7a9S9D9?`'9:9:$ Ya^\YY"9?R?^9?zY a'Z%jZ7ZZZ'lYcj^_k`]RkYc G ^OOTAF>"Sbwc'-WSbb G^^^NQSK@$wbSc(-Gwbb G^^^PSQU-KEbb G^^^RUP[R -_Ubb G^^`[$fff?]]Allow Pickups{ 'V| N]&%When selected, allow normal pickups.Q$@??R$ ?S$>Y$ #=G'CS^`[$fff?]]Allow Adrenaline{ 'W| N],+When selected, players can use Adrenaline.Q$Y?R$ ?S$>Y$ #=G'CQ^^Y^^Z^^^^X^^[^^m\u3y#%XwX*YXwY*Y-Y-wZ*(ZYXXrZ*f\LastManfZLastMan'( G^^^^^y^^f@^^@^^@^^v^^^Y| c 2x.vFݙHUwpzVGBzVGB u ](BOTTOM FEEDER)2k S36"7*$z?^^d^^^E@^^O^^H@^T ^o@^^@c ^tZm 3IͿpp ]%o suffered a fatal mutation!w ]%o suffered a fatal mutation!i ]%o suffered a fatal mutation!o Sh Sr S^^H{e /?l9:9:$ -{%9D?:-{ i%#v * I G^@^^L^^M^^N^^G@HfA@%O>>@&OG G ^W}Ga i}Eo"}BottomFeederf{opBottomFeeder: 9T9Ko-t9Ko G^I tn KB mtr* v.htjhyve hy= G^P// ==================================================================== // Class: BonusPack.MutantNameMessage // // Sends Bottom Feeder Message // // Written by James Golding // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MutantNameMessage extends LocalMessage; var() localized String BottomFeederMesg; static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(Switch == 0) return RelatedPRI_1.PlayerName; else if(Switch == 1) return RelatedPRI_1.PlayerName@Default.BottomFeederMesg; } static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { if ( Switch == 0 ) return class'PlayerNameMessage'.Default.DrawColor; else return Default.DrawColor; } ^@// ==================================================================== // Class: BonusPack.DamTypeMutant // // Damage class for mutant losing health over time. // // Written by James Golding // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class DamTypeMutant extends DamageType abstract; ^S\B*U-lfbbnnppn?BottomFeeder=9T-ln G^n@^^[_f 5-lfbb G^^`[$fff?]]Bottom Feeder{ '`| N]98When selected, bottom ranked player(s) can kill anyone.Q$6?R$L=S$>Y$ #=G'@f ^^E^h^^B^^u^^g^^ ^^i ^^h^^^^ ^^ ^^C @^p^^^^^^^^G^^D^^M @^^l ^^Em[ q h-km i j bbmi j  G^SxD[JxP  G^tyQ U ;w.6rywr'8( G^CnP udd*-t n%n7hnh-#w*rhrd*d.hR dh%d.hn&.wd*.rdC.r*Pa!\  wduwu*p.uwp*p  d,wd*p.dwp*p  d, G^^^ViR o6 &ig&MMigwigig&ig&ig% G^v^^@{S b ;v.6r{vu'8( G^~}U %-kS 3-k} l o bb}l o  G^w^^qN%|KH9:9:$w*q. G^k^^^g^^^^^^x~ ^~ ^r^^z^^C i@  G^F{ r* r*(4w(L{z333?(h 6hgr 6grb$gh(' G^h^^Fclass MutantScoreboard extends ScoreBoardDeathMatch; var() Material BottomFeederMarker; var() Material MutantMarker; function ExtraMarking(Canvas Canvas, int PlayerCount, int OwnerOffset, int XPos, int YPos, int YOffset) { local int i, OwnerPos; local float IconScale; local MutantGameReplicationInfo MutantInfo; MutantInfo = MutantGameReplicationInfo(GRI); // draw mutant and BF marker IconScale = Canvas.ClipX/1024; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.Style = ERenderStyle.STY_Normal; for ( i=0; i= PlayerCount ) { OwnerPos = YPos*PlayerCount + YOffset; // Mutant/Bottom Feeder marker for owner if( MutantInfo.BottomFeederPRI == GRI.PRIArray[OwnerOffset] ) { Canvas.SetPos(XPos - 64*IconScale, OwnerPos - 16*IconScale); Canvas.DrawTile( BottomFeederMarker, 64*IconScale, 64*IconScale, 0, 0, 256, 256); } if( MutantInfo.MutantPRI == GRI.PRIArray[OwnerOffset] ) { Canvas.SetPos(XPos - 64*IconScale, OwnerPos); Canvas.DrawTile( MutantMarker, 64*IconScale, 32*IconScale, 0, 0, 256, 128); } } } A y ~ 2B Q^Tʆҽҽu)ҽ- =1ҽҽ- =1ҽҽ- =1ҽҽ- =1ҽҽ# D A ^^D ^^^^Q ^I ^F ^G ^E ^]^N ^@^^O ^P ^H ^J ^]C ] +VC XWeapons.BioRifleC XWeapons.FlakCannonC XWeapons.LinkGunC XWeapons.MinigunC XWeapons.RocketLauncherC XWeapons.ShockRifleC XWeapons.SniperRifleD C SwD *<w.D *.D nD D   G^V ^^t^B^^^AS t A# rS *(rS d'( G^q ^^b ^^O ^^] ^ ^^^^^W ^^nR \ INW . wW *wW R ] W wR *wW dR wR ] +R (R  G^c` Z` u* Go S Y 6k   ^^MV ^ 5%.V -)O -'+(BBO -'eV O (V O V O (V O w.O *%w..O *(' G^R//============================================================================= // BroadcastHandler // // Message broadcasting is delegated to BroadCastHandler by the GameInfo. // The BroadCastHandler handles both text messages (typed by a player) and // localized messages (which are identified by a LocalMessage class and id). // GameInfos produce localized messages using their DeathMessageClass and // GameMessageClass classes. // // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class LMSBroadcastHandler extends BroadcastHandler; function PostBeginPlay() { Super.PostBeginPlay(); bPartitionSpectators = true; } static event bool AcceptPlayInfoProperty(string PropName) { if (PropName == "bPartitionSpectators") return false; return Super.AcceptPlayInfoProperty(PropName); } ^^^s ^^^^br q ,wr  G^@^^^^}@^^x @^^{ @^^^^P @^^U @^^N @^^H @^^^^^^F @^^D @^^@^^@ ^^@^^K B ~ I1B !CampThreshold%x BReCamperWarnInterval&x ^bHealthForKill,x ~bAllowSuperweapons,x bCamperAlarm,x bAllowPickups,x bAllowAdrenaline,x bFullAmmo,x B  G(^@^^} @E  G^NA } OHA A 1bbEnableBottomFeederC $($Check ' G ^M  x y. !CampThreshold%y BReCamperWarnInterval&y ^bHealthForKill,y ~bAllowSuperweapons,y bCamperAlarm,y bAllowPickups,y bAllowAdrenaline,y bFullAmmo,y   G ^J ~ ~ P7~ %bEnableBottomFeederD ~  G(^Q w } k)Jw w =bbHealthForKillx bHealthForKill$($Check 'w EbbAllowSuperweaponsx bAllowSuperweapons$($Check 'w ;bbAllowPickupsx bAllowPickups$<$Check 'w AbbAllowAdrenalinex bAllowAdrenaline$2$Check 'w 3bbFullAmmox bFullAmmo$2$Check 'w 9bbCamperAlarmx bCamperAlarm$<$Check ''w ;bCampThresholdx CampThreshold$<$Check ''w ObReCamperWarnIntervalx ReCamperWarnInterval$<$Text2;0:99 '' G ^@^^L z  |Q~z { 76z 76z { &6{ 6z bEnableBottomFeeder6{ 6z 9T-t G^^^T | BYi(V-J-~| CampThreshold(V~| ReCamperWarnInterval(lz| MaxLives'z| bWeaponStay(|  G(^N-' G^R } B1"z} bPartitionSpectators(}  G(^]u  L%"u cu CampThreshold9Uocu CamperRewarnInterval9Slcu HealthForKills9T-[cu AllowSuperWeapons9T-Vcu CamperAlarm9T-Jcu AllowPickups9T-Ucu AllowAdrenaline9T-Lcu FullAmmo9T-k  G^^^vE EH&H+Q @  x&@ E x%@  G^@ @T  G^ 8^] ^^b ^^g ^^^^^^^^m ^^d ^^` ^^a ^^[ ^^c ^^^^v ^^Y ^^^^j ^^^^y @^^o ^^^^A @^^^^h ^^F ^^@^^r @^^s @^^t @^^x ^^^^w ^^wZ v K] .Y Z 9?Z Z $[ %[ b r] r[ Z <9?` 9?,@Y 9?d [ c 9?,Y Z 4awBY BY CCr] u[ Z /9?` 9?,@Y 9?d [ c Z 4axBY BY CC[ ba b g d b c r] ra Z .9?` 9?,@Y 9?g 9?,Y Z 4awBY BY CCr] ua Z !9?` 9?,@Y 9?g Z 4axBY BY CC G^^^z ^^Pq s!&q % # G ^ _ g;[_ -m X-m _ e!d _ e!^ _ e!a  G ^lj? d  G^t ^ R1!g^ ^ d UJ ^ d ^ d ^ d  G ^ip gN 3p -h 0-h p e!t G ^@^^D n ~ =In "bAllowCamouflages 7bAllowPintr n  G(^~f p1wv .r f Hf Bx >9?]w >9?]f `a]>9?]>9?]9?]9?] G^e } ne e *bbAllowCamouflageu $$Checke $bbAllowPintt $$Check G ^u @^^{ ^^E @^ddcKc{c~d#cqcfcWd.cgcRdcnc{c$c|cxctcml@cGcrcpccr|csq{qMcncHc}gBcSrloWcUc|lXceqe nWr]qRn7crqqrcq n@cGcAdGqLcLcQcVcQcKr(rsOqpnn r\ c}pux[n{q|qR qmm^daomcMcLxbq|m@c@cyq}cY cFqMsL rxq{cCmEtr c@mxc[cK l\n|nVcVn{qscCcIqYcErN dx@bt^ g[ ljcUcmgH d}qF t[oPxYt[g-cgBqE ggr[ cUg~ g} mJ cxgRqb sugk cLdygGgDgIq~gZgxg gZhvsc gHnegU @to xerf dxgNsPrP rwpRoQlktUrG qtca gAc@qLmctRal_rYxZsxcx]tHg[ csmFtL qvtM ghgA#QBc5q}#QCrp pA#QD#PE#NFc_#SGgeqLrygjc\ rzcEr{qTg+grg\ r~dH @+G nhngg\rDgF#SHnf#PI#NJt\\#TKgkLgin7#TL#TMgagBqe gx sAx`#SNd\d]#Su qZ g*@cT lSdv d w l9qwgLmK m] tdp x m@g~ gBg} g@dy gn gO c|rngLgOs@gSgXdi c|pFq@ cmcscrcqrGqocpcocnpz cHgN@U chclc`dT cpcorQcQ cTNhdgmY df@kdlqWdjgvgtdS d}NP @tA _q __gq mzg)g'gug_sKsJgcqScHg~cd gpgEsnn|nU qSr[swn@ rDsJg^ sg gssX_xd gqgH#QD #Sx s\did}@Lm a@cN~m Js~gOgNgLnUcId{ d}p| \HHkXRiww yFuVAfvvZEs'TwG}fVJevsvCPSQaF`o|O]]Wl}B}XLc[tTk^QuOd^wmX}xLc]bl^c|\Lc[Sj}y]HBX}gcwYGRV Tdvrw@SPZ^Zm^e{aJJZ}ghSw}iF]TvdRsuB_Sce^ubEXT^ dzq[]Z]ixcFbVievsYCfQe_{mj}zKHo[yj^IyHICXGgFvDFuVkeNs_A^w@OEOn_Yo^B}VLo\SlA{]J^cXciSyWIGZ`iX{(JdYbh[x^vGHBW}ho^^^w}PMv\A jPwOF]VggHPutDtSnblKr^H}^tL]rl}|rLD[DiqxpHX|jszyH]W`feuYE VS S aCnr|iKCZmi`yWGHIV_ejtHCCnRPbyQqvyB t{ uLP[IjuynHmXihdkw^dmFdnU^dtd^dHusIahTImWigTwdIyEi~mNHq^TO xN_Tm *l|ThXJw F]ASR^Tp aW~ )DU 'KY cKd Zzo -ri [ 1{ZTU iFd gj 4tQ QEHD@TLW THv3kH;l^H-MJHGBWHR~YH\AWkX!MhTu+EDTITWrzf^^\B`TbA^rLZPN;jTeqZtl4](N l4}kHl4^hl4qF^{Ywl4b&Ph*r zm\ l4y$I l4XB xcZ dl4\$} l4SY l4el l4MQ sf^ ZnD l4`r qfR Bex T] l4Yl l4tE ZBy T{ NJ @SX Ack B@N KN R^ p\m S } ~ L o [ W j ` y C H ^W E f t u pC D mE S P c kcr V A I P h _ J n sc} pS L I [ vj ^Rz D H ^^ W pj f F u pB E n T X c vr pe A ^cP uM _ pRo p ~ pV M @ \ pPl G { gJ B Z hi Rz \I C Y HQ h ~]w ^s F } U N e s pN B `^Q HR o m ~ pX M z_ \ pl l H { Ha K N Z L i K x iG pW V xbe qt M C XS mA c ~Cs ^O B pD R xac OFq ^H_xw ^l4So xe^B ^^Lc` TC jIR xl4V@[ zO8q\^iTl4]GVSd^mL wl4dFHxMjWvwx~ZmmTGuL]U~TrTNQBzLvSul4_IuHahTRdITUdm[]Qwcnzl4[}tC:XTQ[p lSS{p NQ7]p TP7cp ZS tiT }]\Z@ j] zTIcXHuSh^^^R{^^^^y I^ J X^^^t g^zvJD^^^^K R^ca^c |p g l^H z^]H^^L Wj f l t^^`B^u Qq _m Une xC^T{iImYniHUy^^^^^ GvN n mD^l4\ql4LMBeYT~^f 7Mp DC GS^X Z^ ] i^^w y| I` Y^n i^\wRG^SVv eb v^ V G{ UwewtDC@ R^@ bdT r\A[ hQ D0yQ Li P tuTi R YwTPS L_U ykTdNYs^^^^^^^^^^^^^^^^^^^^C L^^^^^^^^^>U \>I k=\{^^^^^^^^>cJ^^^^BD ZBA k^>({>N K^@ $[ m>Tl^Bl4R{~ mMRAzRxJ_ Z^ hk ve Db Rl `` p^dg ~j Lc Zi hd v ] |DW\@ v P u ^WTl t >z^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^e x^^]H^^^b Xch^^^^^dx^^}G^TV^^\ pe^^^^HZ1UY gF^^^ uml4^b^T@]NT^ q -lLY^[iHy xHz GLVRgIuYDYSYb@ q[@YO C^ Fm\{TKH~ FYT_ @$m } `QHx Fq ~ QwH} xHT@  ~NTLHBhZN-BBMoH P|TLERZH@$lHZPW XKgRwxFwVXeV tKE` T~ cIrwAQP\_D oB~~Ly\Htk~zBJYXygV vL GuuVukduosuqBcQazoBv~ ~T|mKs@[ gc[j5~ RksHgG^Teu~ aspdTu} @xurxnGumW