*X,qg.IvCK8\7wSyyyyDJ^+0:5B8G?MGWGXGYGZK\1"3E,H,I,I,I,N,N,N,Q,Q,Q,Q,U,U,X,X,X,X,X,NoneWinTop WinHeightWinLeft WinWidthColor PlayerOwnerCaptionTintsHintCore XInterfaceSystemY2Y1X1X2 StyleName RenderStyleOffsetYIntBoxOffsetX TextureScale DrawPivotPosXTextureCoordsPosY ImageStyleWidgetTexture ScaleModeImageScale SpriteWidgetInitComponentConsoleCommandMenu__OnClick__Delegate CaptionWidthSetText ControlsGetTextInternalOnClickComponentJustification TextAlignImages IsCheckedAddItemHudBDeathMatchDrawSpriteWidgetAdd IniOption SetIndex TextFont KeyBinding bNeverFocusAliasLabels BindKeyNames BindingsbIsSectionLabelBinds KeyLabelBindLocalizedKeyNamesbSquareInternalOnLoadINIChecked ImageColorbAcceptsInputMenuStateChange FontColors ItemCount__OnLoadINI__Delegate FontNamesGet IniDefault OpenMenu TextColor CloseMenuKeyNamebBoundToParent OnChange__OnChange__DelegateClear GetProfileInternalOnSaveINIAddTabBorderOffsets OnClickSound bVisible GetExtra__OnSaveINI__DelegateImageRenderStyle AlignThumbInternalOnChange SetContentInternalOnKeyEvent ButtonClick ReadOnly Position bReadOnlyScoreBoardDeathMatch ImgStylebFocusOnWatchWidgets ParseDescStrEngine MaxValueFindPlayGraphicNone DrawTextHudBase MoveGripByRStylesClientPlaySoundbVisibleWhenEmpty SetFocusCrosshairNamesHudBTeamDeathMatchGetItemAtIndex Background LabelFont SetValueRemove EOLDelaybScaleToParent TestVignette CharDelay bRepeatClickDrawNumericWidgetGetCellLeftWidthNumericWidget WheelDownWheelUp ActivateTab CancelPingsGetNameTimer HandleInput ActualWidth EnterStateUserMinDigitCount ScrollRight AddQueryTermAddBrowserPage bMultiLine PingServer RefreshListColumnHeadingsbPadWithZeroes CloseAll DisplayModeLabelJustification PageCaption SetTopItem MyOnChange CountDown ImgColorsSetupQuestion LoadDecoText GetStyleAddJustifiedTextProfileUpdated DisplayModes FocusFirstHeightTopPage InitPanelClearProgressMessagesNoneFontScreenWidthSmallDrawFontScreenWidthMediumPgUp ShowPanel BaseWeaponsbUseTextHeight AddButtonPlayConsoleSound ScrollLeft ReadMapListNone GetValueOnProfileUpdated GetPortraitNoneNone MyTabControlWidth ActualLeft ButtonNamesMyReceivedPingInfoServerBrowserTagInternalOnCloseInternalOnKeyType SkillLevelNone DifficultiesbRequire640x480Swap GetIndex MyOnDrawItemGetMapListClassActivateTabByNameDifficultyLevels ImageAlign DLOTextureChangeCustomBots ChangeHint TabChange UpdateHint SMStateName BackClick ListChangePositionChange DetailLevelsFontScreenWidth FontName CanShowPanelAutoPingServersMapListChangeConnect ReplaceMenuForceReceiveLocalizedMessage AddImage GetGameClassEndKarma GameTypeUpdateLadderButton LoadFrom GetMapPrefixPlayAnnouncement CollisionReplaceHandleParametersJustification SetYellowBarRestart MovementGetSmallerFontFor DLOMaterial LightColor LightingSaveINIGetIsTeamGameLoadINI GetObject GetSoundPgDn HaveHalfFontValueShowTeamScorePassAhome BarColorFavoritesServerInfoMyPingTimeout SetNewImageGetRulesClass GetRecord ReadMapInfoUpdateTeamHud TabHeightAddPrecacheMaterialGetFontNewLadderButtonOnChangeCustomBotsbCaptureMouseInternalOnReOpen ReplaceTabDraw2DLocationDotMyQueryFinished LongCount Initialize SortSMArrayOnCloseBrowserSetActiveMatch MinValue AdrenalineCheckSupportedResolutionsSetupBotListsUpdateGripPosition OpenSound ActualHeightCharListChangeCheckResolution bIgnoreEsc bTabStopReloadPortraitsUpdateMatchInfo FixLineupPlayButtonClickSetControllerStatus StatNames ClientTravelResetTitleBarTeamScoreOffsetSetTutorialNameUpdateRankAndSpread SelectedText EndScrollingMyOnReceivedServerEffect StopPingsMapAdd MapRemove StartQueryMessageGetMutatorConfigMenu GetDecoText SpinnyWeapInternalApplyInitListExclusive bClientBound SetState PrevControl OnActivate NextControl LoseFocus BackColor FocusLastGetCurrentKeyBindShowMatchInfoOnNewImgStyleInternalOnPreDrawOnNewImgAlignOnNewImgSelectIsInClientBounds MyKeyEvent ActualTop GetMapList UpdateListCharListUpdate IsTeamFull InternalDraw__OnReOpen__Delegate BuildStatsFinishButtonClickSetSize bFillHeightConsoleVisibleOnStatsConfiguredValidStatConfig NetSpeedTextBackButtonClickRegisterStyle ZoneClickStopOnClickNone RefreshClick UpdateStatsChangeGameType StartLoad RemoveTabGetProfileList ConsoleOpenOnScrollZoneClick ConsoleClose AddLoading SymbolGBMapDownMapUp MapClearMapAllMyRefreshClickChangeActiveStateHandleSpecialEventBrowser_ServerListPageMSHudBBombingRunNoneInitShowTeamScorePassCSaveFavoritesGameTypeChanged AudioModes VoiceModes AddMutator ResetListNoneNone GetMatchInfo RemoveItemOnChangeGameTypeComponentClassNameUpdateCurrentWeaponNoneChangePortraitsNoneNoneNoneRemoveExistingKeyFixedItemsPerPageNoneInitColumnPercDisplayLocalMessagesGetFontSizeIndex ClearMessageGoalScoreText DrawHudPassC UpdateHUD DrawHudPassA FormatTime MyOnOpenGetSmallFontForLocalizeRulesSetCrossHairGraphicRePingServersInvalidatePingsDown DrawMessage WeapApplyRefresh GetNewKey bFillBounds SwapWeaponsbAllowSelectEmptyPgDownDefaultPortraitNotifyLevelChange DrawTeam SkipChar MakeVisible InitBindings InitList DrawNetInfoMessageNoInfobVerticalLayout MyComponent DrawMatchIDGetItemGetItemObject DrawTitleTextStrNoneUpdatePrecacheFonts KeyEventDrawScreenTextAnnounceModesInternalCapturedMouseMoveHudBDoubleDominationNoneMyAddFavoriteNone ClearStatsSetPosHudBCaptureTheFlagPlayerOnClickNewProfileClickInternalOnCanClose LeftButton FFlagWidget PrevPage FPointWidget ShowListBoxAddTextUpdatePrecacheMaterialsClientSetMusicNone DetailChangeUpdateStatusPingCount LoadClick AddTeamBarNextMutatorInStringSpeechOnOpen PlayNextAnim DrawVignetteGetCurrentResGetWeaponList OnEndOfLine OnDeActivate IsOnTeam GetGroupForViewStatsStrings PostRenderOnCloseRemoveMutatorPostBeginPlay NextPageTick ResetFocusCreated DeleteCharSpeechMenuVisible GetMenuFontUp PrevImage CalcMaxLen DrawNumbersSpinnerPlusClickSpinnerMinusClickDrawCurrentArrayWeight EditOnChangeDrawTargetingFindComponentIndexGetMediumFontForUpdateSpinnyDudeDrawCrosshairUpdateDraftable CreateMenu NextImage FirstImageOnMatchUpdatedSetChampionshipOnQuitClickedPlayOpenSound ChampMatch IsInBoundsMatchDoubleClick MatchUpdated BackgroundsGetMidGameFontAdjust AddClick MOTDVerifiedOnAddFavorite OnClick1LayoutButtonsOnButtonClickPlayCloseSound__OnDraw__DelegateOnNewClientBound SetupBotInfoOkClickDrawSpectatingHud OnBuyClickedLocalizedMessageNoneNoneDisplayPortraitAddTextMessage__OnClose__Delegate__OnCanClose__Delegate__OnOpen__DelegatebAllowedAsLastbCheckResolution AutoFillTeamPointsBackgroundRStyle RepeatDelayBackgroundColor ClearConfirm EnterConfirmInternalOnAdjustTop BeginConfirm EditKeyEventSplitOrientation SetPlayerSplitPosition SwapConfirmCancelConfirm LeaveState MainTabLabelSplitterUpdatePositionsRebuildSMArray MainTabHintGetVoiceClassNoneNoneRulesTabLabelNone RulesTabHintPlayerTabLabelHasMouseMovedPlayerTabHintNoneNoneMyReceivedMOTDData UpgradeClick MyOnLoadINIInternalTabClick bFillSpace JoinClickGetTeamSymbolListGetMainMenuClass SetDodgingSpectateClick bDockPanelsFindPlayerInPlayerListAddTeamCompareAddFavoriteClick TextChangedIsDeadAddOpponentRosterAddPlayerRoster AddTitleAddBackgroundSetHandTeamSaySay CanClose ItemChangedCurrentServerIsInFavorites ScreenTextButtonClicked PointState HideListBox FlagWidgetsResetKeyboard MyRePingAddBuddyClick FBombWidgetRemoveBuddyClickInternalListClickPassThroughProfileUpdatedReOpen AddIPClickRemoveFavoriteClickExecute drawLinkText showLinksFavoriteToServerStaticAddFavoriteInternalEditPressed ScoreTeamDrawWeaponBarInternalOnInvalidateInternalListDeActivateDrawEnemyNameCalculateScoreCalculateAmmoCalculateEnergyCalculateShieldCalculateHealth StartTimerNoneNoneReset MaskText WeapDown MyOnDraw LogoPosY LogoPosX LogoScaleY LogoScaleXWeapUp SortListGetObjectAtIndexGetExtraAtIndex GetAtIndex DrawBindingListOnKeyEvent SearchUp SearchDownRemoveAllOccuranceDrawInstructionKeyTextDrawInstructionText AddNewKeyRawKeyMyOnAdjustTopGetScreenCoords SortColumnLayoutMessage ResetClicked WeapDefaultsUpdateWeaponPrioritiesExpandLastColumnRemovedCurrent DrawHudPassDUpdateScoreBoardInternalGameSpeedDraw DrawHudPassBCompareWeaponPriority ApplyChangesInternalFriendlyFireDraw AddFavorite MyOnDblClick GetLifeTime bPlaySounds BitDepthTextRemoveCurrentServerBuildTeamStats RedClickAdd BlueClickAddCalculateOffsetRedClickRemovebLockedBlueClickRemove BotInfoClick DigitSetBuildCharStats TeamColorsTeamBoxMaterialCharListClick ClickLineupDefaultsClick NextSymbol PrevSymbol FragLimit NextSkinKeyTypeInitListInclusiveNoneError PrevSkin CreateClickInternalOnMousePressed LoadSymbolsChangeMapBotsMapListDblClickBrowser_ServersList Browser_ServerListPageFavoritesDoubleClickListBrowser_ServerListPageBuddy Browser_PageGUITabControl DeleteClick SetCheckedDeleteConfirmResolveMutatorAllowedCharSetOnWatchOnSortChangedSelectMutator OnSaveINI OnReOpenAvailDBLClick OnLoadINISelectedDBLClickOnDrawMutConfigClickGetLocationNameAddAllMutatorsRemoveAllMutators OnAdjustTopUseMapOnChangeUseCustomOnChangeUseCustomBots EndState BeginStateApplyStatConfig OnViewStatsGetSortStringVector HandNames AddMaterialinternalKeyEvent FlagState TeamNames TeamSymbols Toggle3DView NextAnim LastImageMatchButtonClick Idle_RestDoShowMatchInfoBotSkillChangedxPawn xDomPointA xDomPointTAUNTNone MaxLines bFixedSizeGetCurMatNamebWrap bTransparent TextStyleFocusedTextColor ClickingCol SizingColConvertIllegal OrderToIndex LastLength LastCaret bIntOnly ContinueNoneNone bCheckBox RemoteRoleACK FRIENDLYFIRECaptionStyleNameWhiteRedBlueYellowConnectFailureInsertbIgnoreBackClickbCenterInBoundsTranslocatorStringMinPlayersStringTimeLimitStringGoalScoreStringFriendlyFireStringPlayersBalanceTeamsStringBalanceTeamsStringMutatorStringGameSpeedStringGameStatsStringPasswordStringAdminEmailStringAdminNameStringNonDedicatedStringDedicatedStringServerModeString FalseString TrueString UpdatedItem AddedItemChangeSortOrder CellSpacingMultiColumnSortData VisibleLines Separator STS_RepeatSTS_EOL xRedFlagBase STS_Char STS_Initial STS_None DefaultNameHighSortSelectedImageSelectedBKColor MyOnCloseRestoreTextSingularRestoreTextPostRestoreTextPreMessageDraftTitle MessageDraft BoxChange PopupButtonTabHintTutorialsTabHintRosterTabHintLadderTabHintQualificationTabHintProfileLoadTabHintProfileNewTabNameTutorialsTabNameRosterTabNameLadderTabNameQualificationTabNameProfileLoadTabNameProfileNewMessageCreateProfileFirstMessageLadderCompleteMessageLadderAvailable GameTabHint GameTabLabelWeaponsTabHintWeaponsTabLabelIForceTabHintIForceTabLabelControlsTabHintControlsTabLabelNetworkTabHintNetworkTabLabel AudioTabHintAudioTabLabelDetailsTabHintDetailsTabLabel VideoTabHintVideoTabLabel BotTabHint BotTabLabelServerTabHintServerTabLabelMutatorsTabHintMutatorsTabLabelLeaveEntryButtonTextClientMessageInitializeControllerNativeConsoleOpenNeedsMenuResolutionProgressCommandPThrust AssSmackSetRequiredGameResolution gesture_haltgesture_beckongesture_point ThroatCutBotConfigTabHintBotConfigTabLabelMapListTabHintMapListTabLabelMutatorTabHintMutatorTabLabelLogoMessageTradePicHint CaptionBackMessageTradeCancelMessageTradeInfoMessageTradeConfirm MessageTitleBox StatsMessageEnterConfirmMessageClearConfirmMessageButtonStyleDisabledButtonStyleEnabled SetupPageNoInformationBarVPos BarHeight ButtonVGap ButtonHGap ButtonHeight ButtonWidthLeaveSPButtonTextLeaveMPButtonText LocalizeSSV_NoStatsEnabledSSV_OnlyStatsEnabledSSV_AnyDesiredMutator BuddiesPage PrefsPageLANPageFavoritesPageDomServerListPageBRServerListPageCTFServerListPageTDMServerListPageDMServerListPage MOTDPage OnClick2 DrawTypeLODBias DrawScalebUnlit bAlwaysTick LadderButton bPersistentInactiveFadeColor WhiteBorderOther SetTimerMapNameMaxVisibleItems FloatOnlyIntOnlyScoreComponentWidthbHeightFromComponent LabelColorSpinnyWeapOffset MaxLives TimeLimitSelectMessage UseLowGorePostStatsMessage SetPauseCurrentTeamSymbolNameGetTeamSymbolNameErr_CantCreateProfileErr_ProfileExistsDefaultTeamSymbolTeamSymbolPrefixDefaultCharacterDefaultTeamName HudClass DeathMessageDeleteMessageNumDifficultiesNoneNone ChangeFocus LockIndexes CompareItemGetOrderStringForShow3DViewCaptionShowBioCaption bRenderDudeSpinnyDudeOffset StatsURLHeaderSM_NoneSM_UpSM_Down DrawColor MoveFocusedGetRelatedString GetString GetColorGetPos OnCanCloseOnCapturedMouseMove GetFontSize UpdateGRI PercentTextOnColumnSized OnDblClickDrawHUDCrouchOnDrawCaption OnDrawItem OnDrawTextFindInventoryType OnHitTest OnInvalidate OnKeyEvent OnKeyTypeSectionLabelMargin OnMessageOnMousePressedOnMouseReleaseOnNeedRawKeyPressFooter OnPreDraw OnRenderNone OnRightClickBkColorRePingCaption AddIPCaptionRemoveFavoriteCaptionRemoveBuddyCaptionAddBuddyCaption BudSplitStepPlayBeepSoundGUIProgressBar GUIComponentGUIGUIScrollTextBoxGUIListBoxBaseGUIMultiComponentGUIScrollTextGUIList GUIVertList GUIListBaseGUICharacterListGUICircularList GUIHorzList GUISlider GUISplitter GUIPanel GUITitleBarGUIMenuOption GUIComboBox GUITabPanel GUITabButton GUIButton SetAutoTaunt GUIStylesGUIMultiColumnListHeaderGUIMultiColumnListGUIMultiColumnListBox GUIListBoxGUIHorzScrollBarGUIScrollBarBaseGUIHorzGripButton GUIGFXButtonGUIHorzScrollButtonGUIHorzScrollZoneGUIVertScrollBarGUIVertGripButtonGUIVertScrollButtonGUIVertScrollZoneGUINumericEdit GUIEditBoxGUICheckBoxButtonGUISpinnerButton GUILabelGUIFontGUIPage GUIImageBrowser_AddBuddyBrowser_BuddyList Browser_MOTDRefreshCaptionBrowser_OpenIPBrowser_PlayersListBrowser_PrefsBrowser_RulesListBrowser_ServerListPageBaseRePingServersCaptionRefreshFinTailRefreshFinMidBrowser_ServerListPageLANRefreshFinHead DrawOpBase DrawOpImage DrawOpTextExtendedConsoleGUICharacterListTeamGUIComboButton GUIImageListGUIQuestionPageMustUpgradeStringPingRecvStringCriticalEvent QueryFinTail QueryFinHeadJoeTestJoeTestPanelAJoeTestPanelB ListTestMapListBombingRunMapListCaptureTheFlagMapListDeathMatchMapListDoubleDominationMapListTeamDeathMatch moCheckBox moComboBox moEditBoxmoNumericEdit SwitchTeamScoreBoardTeamDeathMatchDodgingIsEnabled IsSpectatingSTY_ArrowLeftSTY_RoundButtonSTY_ArrowRight STY_BindBoxSTY_NoBackgroundSTY_CharButtonSTY_SquareButtonSTY_ComboListBox STY_ListBox STY_Footer STY_HeaderSTY_LadderButtonSTY_LadderButtonActiveSTY_LadderButtonHiSTY_MidGameButtonSTY_SquareMenuButton STY_PageSTY_RosterButtonSTY_RoundScaledButtonSTY_ScrollZoneSTY_ServerBrowserGridSTY_ServerBrowserGridHeaderSTY_SliderCaptionSTY_SquareBarSTY_TabButtonSTY_TextButtonSTY_TextLabelTab_AudioSettingsTab_ControlSettingsTab_DetailSettingsTab_GameSettingsTab_IABombingRunTab_InstantActionBaseRulesTab_IACaptureTheFlagTab_IADeathMatchTab_IADoubleDominationTab_IATeamDeathMatchTab_IForceSettingsTab_InstantActionBotConfigTab_InstantActionMainTab_InstantActionMapListTab_InstantActionMutatorsTab_MultiplayerHostMain"Tab_MultiplayerHostServerSettingsTab_NetworkSettingsTab_PlayerSettingsTab_SPLadderBaseTab_SPPanelBaseTab_SPLadderQualifyTab_SPLadderTeamTab_SPProfileLoadTab_SPProfileNew Tab_SPRosterTab_SPTutorialsTab_VideoSettingsTab_WeaponPrefTestGFXButtonPageTestImagePage ConnectLANUT2ArenaConfigUT2BadCDKeyMsgUT2BotInfoPageUT2CongratulationsUT2DefaultFontUT2DeferChangeResUT2DemoQuitPage UT2DraftTeamUT2GetPasswordUT2HeaderFontUT2InstantActionPage UT2LargeFontUT2LoadingPageBaseUT2LoadingWeaponsUT2LoadingWeaponsArena UT2MainMenu UT2MenuFontUT2MidGameFontUT2MidGameMenuUT2MultiplayerHostPageUT2NetworkStatusMsgUT2PerformWarn UT2QuitPageUT2ServerListFontUT2SettingsPageUT2SinglePlayerMain UT2SmallFontUT2SmallHeaderFontUT2SP_DraftEventPageUT2SP_LadderEventPageUT2SP_LadderLoadingUT2SP_PlayerTradePageUT2StatsPrompt UT2StatusMsgUT2VideoChangeOK VignetteTest RankText PlayerText PointsText TimeText PingText DeathsText AdminTextNetText FooterText MatchIDTextOutText ReadyText NotReadyTextNoneNoneFPHEndedSpacer BoxMaterialVersionString ReReadyPause ReadyStringRefreshCompleteStringQueryCompleteStringConnTimeoutStringConnFailStringAuthFailStringStartQueryString ChargeBar GetAmmoCountNone AmmoStatusSplitAreaSizeSPLIT_HorizontalSPLIT_Vertical bShowValueValueRightWidthValueRightAlignBarTopBarBackNone FillOwnerConsoleMessagePosXConsoleMessagePosY KillTimerCreateKeyMenusCheckCountdown__OnKeyEvent__Delegate__OnDblClick__DelegateLaunchAutoUpdateDrawInstructionGfx__OnActivate__Delegate ScoreBoardUSetInstructionText TimerIndexSetInstructionKeyTextCS_Down ScoreBack FlagIconCS_UpCS_Edit CS_ClickCS_NonebMouseOverSound TimeLeftDrawLevelAction SetTargetingbRequireReleaseClick SetCroppingGetConsoleFontLargerFontThan spinRate GUIListElem PGA_BottomPGA_Top PGA_Right PGA_Left PGA_Client PGA_NoneSM_Left SM_Right ICP_Bound DigitTextureICP_StretchedBroadcastPingRequest ICP_Scaled ICP_Center ICP_Normal MSTY_AlphaZMSTY_ParticleMSTY_SubtractiveMSTY_Additive MSTY_AlphaMSTY_ModulatedMSTY_Translucent MSTY_MaskedHudLocalizedMessage MSTY_Normal MSTY_None EDM_Numeric EDM_Alpha EDM_NoneIMGA_BottomRight IMGA_CenterTargetMaterial IMGA_TopLeftISTY_Justified ISTY_Bound ISTY_ScaledISTY_StretchedInstructTextBorderXInstructTextBorderY ISTY_Normal TXTC_LowerNone TXTC_UpperCroppingAmount TXTC_None TXTA_Right TXTA_Center TXTA_LeftMSAT_Disabled MSAT_Pressed MSAT_Focused MSAT_Watched MSAT_BlurryMyGetSmallFontForOrderMaterialUSizeMaterialVSizeGUIControllerSpeechMenuToggleAddCurrentToFavoritesClsStoredPassword SMDenySoundSMAcceptSound SMOpenSound SMMoreString SMAllString SMMargin SMOriginY SMOriginXClearTeammatesReleaseTeammateSMS_PlayerSelectSMS_TauntAnim Crosshairs SMS_Taunt SMS_Other SMS_OrderSMS_FriendFireSMS_Ack SMS_MainAddedCurrentTailAddedCurrentHeadConsoleSoundVolMaxScrollbackSize DownSoundUpSound EditSound ClickSound DigitsBigMouseOverSound AddTeammate SetLineupMenuMouseSensbHighlightCurrentFastCursorStep SetPositionGetPositionDescription CursorStepTextPositionDescription AmmoIconGetNumTeammatesForMatchNoneAdrenalineCountNoneNoneNone mySpreadmyRankMyScoreNoneNoneAdrenalineIconNoneNoneNoneNoneNoneNoneLevelActionLoadingLevelActionPausedNoneLevelActionFontColorLevelActionPositionXLevelActionPositionYNoneNoneNoneGetNumPositionsGetMatchDescriptionContinueSinglePlayerGameFindFirstUnfinishedLadderButtonRepeatDelayDblClickWindowMouseCursorOffset MouseCursors StyleNames FontStack AnimNamesAnimChangeIntervalConsoleToggleDelayedConsoleCommandLoadingMessage CharFrameAddMultiLineTextAddImageStretched LoadingColor LoadingPosY LoadingPosXLoadingStringNone PS_Disabled PS_HeldEnemyPS_HeldFriendly PS_Neutral BombWidgetBombBG BombStateStartNewMatchLinkEstablishedMessageCNPosYCNPosXCarrierTextColor3CarrierTextColor2WonMatchPostFixWaitingToSpawnYouveWonTheMatchYouveLostTheMatchCarrierTextColor1 totalLinksNoneNoneNonebInLadderGameNoneNoneNoneNoneNoneNoneNoneChampBorderObjectNextMatchObjectCurrentMenuRungCurrentLadder GameLadderMatchesWinsGoalsNone InfoString NormalScaleNonePlayerCharacterViewPosBaseDifficultyTeamSymbolNamePortraitWidthPortraitHeightAbbrevPortraitString PlayerLineupLevelActionText NewPortrait PlayerTeamNone MakeColor SetDrawColorrungWonMatchPrefix PortraitX CarriersNameCarriersLocation PortraitTime NameTime NamedPlayer DrawIconSetClip SetOriginNoneDrawTileStretchedLineNonedxOldRemainingTimeWrapStringToArray ScoreDiffCurRank BombFlagMyBombDelivery TeamOffsetGetCameraLocationColorModulateSizeYRedBase BlueBase EPointState CurScore MaxEnergy MaxShieldNoneSizeXCurYDP1DP2CurXNoneNone CurEnergy LastShield CurShieldClipY OperationsClipX NewImage LastHealth FontScaleYNewText CurHealth FontScaleXJust BlackTextureTextureFullName GameProf myMatchInfoEnemyTeamInfoNone ladderrungNone UTIclassMouseSensitivityMouseSmoothingMode bInvertMouseGIClass PlayerListPlayers TeamLinkedNone TeamIconNameCrewbNameUpTSymILeftISpaceImgWImgH IconBoxW IconBoxH IconBox2Left bIgnoreKeys Team1Stat Team2StatTxtFontTopLineLineSpcHistorybPlayRandomAnimsNoneNone NextAnimTime TypedStr NewAnimName MenuStack ActivePageNone StyleStackNoneNoneNonePersistentStackMouseXMouseY LastMouseX LastMouseY ShiftPressed AltPressed CtrlPressedNoneLastClickTime LastClickX LastClickYNone RepeatKey RepeatDelta RepeatTime CursorFaderetvalFastCursorFade lineupnumFocusedControlActiveControl SkipControl MoveControlbIgnoreNextRelease bModAuthor bDesignModeWEAPON_BAR_SIZEbCurMenuInitializedGameResolutionposnMainNotWantedbotnameCrosshair_Triad3Crosshair_Triad1Crosshair_Triad2Crosshair_PointerbForceMouseCheckbIgnoreUntilPress HistoryCur HistoryBot HistoryTopConsoleHotKey SymbolNamesbNoSinglePlayerGameRes WeaponDescOn ProfileList bCanceledNewKey__OnNeedRawKeyPress__Delegate NewMenuClassCurMenu CurIndex NewMenuNameNewStyleClass DefaultPens StyleClassWorldToScreenCtrlbmLeftbmTopbmWidth bmHeightMasterCrosshair_Circle2 ScrollbackSBHeadSBPosbCtrlbConsoleHotKeyCrosshair_Circle1Crosshair_Bracket2Crosshair_Bracket1 SMLineSpaceESpeechMenuStateCrosshair_Cross5Crosshair_Cross4Crosshair_Cross3Crosshair_Cross1Crosshair_Cross2Crosshair_DotstrYstrXSMStateSMTypeSMIndex SMCallsign SMOffset SMNameArray SMIndexArray SMArraySize CropHeighttileYtileXSMTabbRequiresTickRatioYRatioX ScreenPosScaleYScaleXt1ServerSavedPasswordsPasswordPromptMenuLastConnectedServerMsgLifeChampionshipMatchesUnicodeTempfwfhyclip FadeValue IPString portString colonPosportNum LevelNameViewportOwner EInputKey EInputActiontmpInt TmpStringstrtvpMyPRIScreenYGameMesgGroupConfiguredInternetSpeed bNoSoundbShowWindowsMouseScreenXkeyIn selectIndexEnemyTeamNameNumNumsIncZerosizingXMaxYMaxNonestopAtHSelLeft eMenuStatekdyidxTopScale3D eTextAlignIpDrvMasterServerUplinkMasterServerClient eTextCaseCroppingMaterial DoCropping InstrRate eImgStyle InstrDeltaInstructionKeyTextInstructionTextTargetingSizeTargetingLocation eImgAlignbShowTargetingVoteMenuClassLocalMessages eEditMaskDrawn StringFont EndOfLifeEMenuRenderStyle RelatedPRIStringMessage PassStyleServerQueryClientLANQueryClientQuery QueryType DoUplink EPingCauseListIDeIconPosition PingCause__OnReceivedPingInfo__Delegate__OnPingTimeout__Delegate EQueryType QueryData ePageAlign EScaleMode SymbolVSize SymbolUSize OrdersTextScoreYL IconScaleQBTN_Ok QBTN_Cancel QBTN_RetryQBTN_Continue QBTN_YesQBTN_No QBTN_Abort QBTN_IgnoreQBTN_OkCancelQBTN_AbortRetry QBTN_YesNoQBTN_YesNoCancelNameY ExtraData ExtraStrData MenuOwner MenuState InitialDelayNone ScoreYPosEResponseInfo bHasFocus MainFont bCaptureTabsActiveBluePRITargetLocationRedPRI FocusInsteadbShowMaxPlayerCountMsgTypeCriticalStringBlueOwnerOffsetMouseCursorIndexRedOwnerOffset LineCountFriendlyLabelRedPlayerCount EClickSoundBluePlayerCountScoreBackScale IconSizeEMOTDResponse ResultCount ScoreIcon_FBBounds ClientBoundsbPendingFocusScoreboardU_FB bTimerRepeatTimerCountdownTimerIntervalSaveXSaveY SaveColor SaveFont SaveStyle__OnPreDraw__Delegate ScoreIcon MenuEffects__OnDeActivate__Delegate__OnWatch__Delegate__OnHitTest__Delegate__OnRender__Delegate__OnMessage__Delegate__OnInvalidate__DelegatebHaveHalfFont ResponseInfo__OnRightClick__DelegatebRepeat__OnMousePressed__Delegate__OnMouseRelease__DelegateXPos__OnKeyType__DelegatenetXLdeltaXdeltaY __OnCapturedMouseMove__DelegatescoreXL deathsXL Interval MaxScaling BoxWidth TitleYPosNone ResScaleY MyControllerMyOwner ResScaleXNoneNoneBoxXPosCrosshairScaleCrosshairStyleHudCanvasScale DeathsXPos ScoreXPos OwnerOffsetbCrosshairShowbShowWeaponBar CaptionAlignBoxTextOffsetY bShowPointsValueFontNameGraphicMargin NameXPos bShowLow bShowHigh BoxSpaceY NumDecimalsbShowPersonalInfoNoneNonebShowWeaponInfo LocalList MyScrollText bMessageBeep TurqColor GoldColor BlueColor CyanColor NewContentsep RedColor WhiteColor VoteMenu PawnOwnerPRIEGUISplitterTypePlayerBoxSizeY MessageFoot PawnOwner bChecked HeadFoot PlayerCountNetXPos MyButtonCurAmmoPrimaryMaxAmmoPrimary OwnerPosBrowserFontReduction OwnerPRI ScoreInfoXLTitleXLscoreinfostring titlestring PlayerAreaYHeaderOffsetYNoneMSCMOTD MOTDTextBoxUpgradeButton MustUpgradeGotMOTD__OnQueryFinished__Delegate__OnReceivedServer__DelegatebShowChargingBar ItemName IconCoords IconMaterialAttachmentClass PickupClassbIsInitialised__OnReceivedMOTDData__DelegateUWebInventoryGroupNewMenuMyServersList WebServerbCancel ListenPortNoneCriticalEventPlus bStarted Spectator BallLauncher UnrealGameSquadAI UnrealPlayerCTFBase GameObjectCTFHUDMessageUnrealTeamInfoNoneQDdotPosDominationPointPlayerNameMessageSayMessagePlusGetServerNetworkAddressbEnableGUIForceFeedbackBuddies MainSplitStringMessagePlus MyBuddyListTeamPlayerReplicationInfoTeamSayMessagePlusBuddyInitializedbEnableDamageForceFeedbackbEnableWeaponForceFeedbackbEnablePickupForceFeedback FavoritesTeamVoicePack UnrealPawn MinPlayersSQCMyAddIPButtonStatsPasswordStatsUsernamebNoMatureLanguage bAutoTauntbNoAutoTauntsbNoVoiceTaunts numFavoritesLQCbNoVoiceMessagesAnnouncerLevelbNeverSwitchOnPickup bSnapToLevelb1b2b3AdrenalineMax HandednessbActivesplash PrioritynewRotSourcenextNavigationPoint MyListBoxNone adrenalin bEnabled DelayTimebSetNextKeyPress NewIndex NewSubIndex SelStylerow HackIndextwotenTempInt TempStrA TempStrB HitActorLocalizedKeyNameLastbindNewItemw1 InBindAreasixAmountcindexseven WeaponClass SubIndexoneShieldStrengthNoneTauntAnimNames TauntAnims MenuNameHealthNoneBaseEyeHeight bPlayedSoundprevWorldDetailprevTextureDetailprevCharDetailgoingUp newDetailPendingWeapon bWeaponBobimgLastFriendlyFireLastWeaponStayLastTranslocatorLastGameSpeedLastGoalScoreLastTimeLimit LastMaxLives MyGameSpeed MyWeaponStayMyTranslocatorMyFriendlyFire MyGoalScore MyTimeLimit MyMaxLivesnine NewGameSpeedfourbDisplayMessages bChangedLastAutoAdjustSkill AutoSlope InvertMouse MouseSmooth UseJoystick MouseSens MenuSens ifWeapon ifPickup ifDamageifGUI MyRedTeam MyBlueTeam MyPortrait MyBotList MyBotMaker MyBotNamebIgnoreListChange RelatedPRI2fivebIsTeamtRedtBluetDMeight1_minute_remainsmyHUD5_minute_warning30_seconds_remainWhoName FontSize LastGameTypeLastMap LastBotSkill LastBotCountLastUseMapBotsLastUseCustomBots MyMapList MyGameCombo MyMapImage MyMapScroll MyBotSkill MyUseMapBotsMyUseCustomBots MyBotCount MyMapName StackMode3_minutes_remain 20_seconds__OnChangeGameType__Delegate2_minutes_remain__OnChangeCustomBots__DelegateNoneDescStr EStackMode LifetimebBeep bFadeMessagebIsPartiallyUnique bIsUniquemName bIsSpecialAction Password SpecialEventDesctmpMyFullMapList MyCurMapListpMainNone HolyShit_F IsDemoBuildNavigationPointListGameEngineVersionNetModeLastActiveMutatorsMyAvailMutatorsMySelectedMutators MyDescBoxMutListMutConfigMenu LevelActionDefaultTexturePauserDecalStayScalePhysicsDetailLevel Screenshot TimeSecondsNewDescLgnameKillsbBot bOutOfLives bDedicated bLanPlay bUseDefaultsbUseCustomBots MaxSpecs AdminPass GamePassbCollectStats MyDedicated MyLanGame MyAdvertiseMyCollectStatsMyBalanceTeamsMyUseDefaultBots MyMinPlayers MyMaxPlayers MyMaxSpecs MyServerNameMyServerPasswrd MyAdminName MyAdminEmailMyAdminPasswrdMyMOTD1MyMOTD2MyMOTD3MyMOTD4MyUseWebAdmin MyWebPortgc bReadyToPlaybWaitingPlayer bIsSpectator VoiceType BotSkillTeamIDHasFlagDeathsMatchIDFlagPos bUnlocked SpinnyDudebBalanceTeams RosterNamesSquadO PRIArray PlayerMesh BodySkin HeadSkinNoneCamPosCamRotNoneNonecnameNonePNamePCharPTeam AdminEmail AdminNameiLadderiMatchTeams ElapsedTimeRemainingTimeTCbMatchHasBegun ScrollInfo MapPicHolder MapNameLabelActiveLadderButton TeamColorBtn LadderIndex MatchIndex TeamIndexSizeBtns TeamNameMI FriendlyNameConfigMenuClassNameLButtonWhoSPMTeamButtonsWinnerMaterialFullName DMButtons TDMButtons DOMButtons BRButtons CTFButtonsVal ChampButton ChampBorder lockindexHiStrMsgSenderbEnable lbProfiles ebPlayerName ebTeamName ebDifficultyebKills ebDeathsebGoalsebWins ebMatchesimgPlayerSkinimgTeamSymbolbutNew MapListClass GameSoundsOtherFanfarespMyControllerItem profilenamesbOnlySpectator ProfileNameWeapons profileclassInvbButtonPassTargetLockedPagePCTeamNum ePlayerName eTeamName cDifficultyclPlayerSkins iTeamSymbols ScoreBoxB ScoreBoxA ScoreBoxCLadderButtonShaderCurrentTeamSymbolNumSP_FinalButton BorderBoxA2 MINSYMBOL MAXSYMBOLbAdmin BorderBoxA1ButtonBobFinal FailCodeAddressmut bFileExists mutClassResultIndexSplitterCursorVertPRI MatesCount MatesBase MatesCtrls pnlMates imgMates lblMates cboMates btnMateslblNA lboStats lboTeamStats imgPortrait lblMatchDatastbPlayerData cltMyTeamPreStatsMessageSplitterCursorPnlMNbg10 nummatesNoneMyListmyLevelMapsDeletePackageteambox SavePackageNoneNoneNoneNoneNoneNoneNoneNoneNone TutImages TutBorders TutLabels TutButtonsbg09 bTDMUnlocked bDOMUnlocked bCTFUnlocked bBRUnlockedDMIndex DOMIndex CTFIndexBRIndex NumButtons TutorialName ShowSShotCurrentGameProfile DecoTextNameOtherMesgGroupbg11 BitDepthCurrentSelectionArrowBlueRight DesiredResMyCurWeaponListSwitchWeaponCheckBoxWeaponDescriptionBox MyCurWeaponArrowBlueLeftbWeapPrefInitialisedbUseDefaultPriority GoalScoreElemAElemBPAPBWAWB GameNameNumBots NumPlayers MapPrefixIndexAIndexB StartTimecurrPosAutoAimWXWYWZNone currWeap attachClassswGameDifficultybAlternateModeNoneNoneStatusBarInner bFlipped bTeamGame PlayerInfo ServerInfo MaxPlayersMyLabelCurrentPlayersNone MyCheckBox ServerName QueryPort MyComboBoxIP ServerIDServerResponseLineStatsIDTestbExact StatusBarExtraPing PlayerNamePlayerResponseLineKeyNone KeyValuePair CurrentTime bHideHUD MyEditBoxLadderButtonPressedLadderButtonOverCodeMyNumericEditDataParam2Param1PLadderButtonHiOverbListItemsOnlybShowListOnFocusmatEditNoneNoneXLYPosYLGRI NewStyleTextdistOptionalObject RelatedPRI_2 TabStack ActiveTabBackgroundStyleNameBackgroundStyleBackgroundImage RelatedPRI_1TexEntry aTabIndex StartIndexGetNextIntDesc PanelClassExistingPanel bForceActiveNewPanelClass NewTabButton NewTabPanelPrefixWhich OldTabPanelDir ConsoleBack bFocusPanelStarttabnamePlayOwnedSoundBut SquareBoxANewPos HitLocationitemsNoneNone HitNormalNewPercNewLeft DeltaTimeNoneSongYellowArrowVBandpos GetUrlOptionNoneNone GrabOffset NewValueNewTopNone UpdateURLlocbLeftJustified GroupName digitcount LinkMeshDelta SetDrawTypeSetStaticMeshSetDrawScale3DLadderButtonHiPressed SetDrawScale bRenderWorldbPauseIfPossibleCommand EFlagState CloseSoundNoneLadderButtonHi ParentPageTimers bSelectedBarVerticalHi BarVertical ERenderStyleSkins DrawScale3DBarHorizontalBarCornerRightBaseOwnerClosing CurrentResNewHint MyNewBuddy MyBuddyPage buddyName MyIpAddressMyFavoritesPage lMessage MessageIconBarCornerLeftDefaultButton CancelButtonLastURL__OnButtonClick__DelegateOp MsgArrayPort Question bButtons ActiveButtonURLidesc ScoreBoardcolwbtnw MatchInfoNoneMapListSPMenutScroll LadderInfoLock4Lock3Lock2Lock1NoLevelPreview GammaSet0 GammaSet1 EditBoxDown BoxTabPulse2 BoxTabPulsebCreatedQueryTabsbCreatedStandardTabsbOnlyShowStandardbOnlyShowNonPasswordbDontShowFullbDontShowEmptyBoxTabWatched CustomQueryEStatsServerViewBoxTabSimpleBorder_FCharFrame_FinalStatsServerView LocalMessageLoadDataObjectNewPageTabCCreateDataObject__OnAddFavorite__DelegateobjStaticSaveConfig ImgAlign ImgSelectDynamicLoadObjectEnable NewImgStyle NewState NewImgAlign PackageName CO_FinalAngle ImageName WeaponComboSrcNoneNoneNoneNoneEditBoxWatchedEditBoxButtonWatched BorderBoxF SymbolShader BotPortraitBotRaceBarsLeftjfbSymbolShader PageMessageContinueCaption CongratsPic ExitScreenQuitA1QuitA2QuitA3QuitA4QuitB1QuitB2QuitB3QuitB4QuitC1QuitC2QuitC3QuitC4QuitD1QuitD2QuitD3QuitD4 bClickedBuyit lblChoose cltPortrait butDraft butRelease butClear butEnterbutAutobutLeft butRight MyTitleBar MyHintBar fbArrowLeftButtonBigPulseNone MouseCursor BorderBoxASVGCL ReturnValue Rotation bAffordablebOnTeam bCanDraft Locationcharbox EDrawPivot nextDraftoldbPlaySounds listsize listoffset BorderBoxDRGLogos fbArrowRight fbBombFocus pEmptySlotfbPlayerHighlight GammaBarbutSwapTradingPlayerNameMaxNoneaskstrWZPR2 RetryURLUnused MyConsolepRules pMutators pMapList pBotConfig pPlayerSetupMyTabsYXDC LadderClosedSkinAInterfaceContentArenaWeaponClassName MutArena XWeaponsBA RulesClass ScriptText LadderOpenedFullURLGameURL FirstMap SpeciesName MutatorListMS_ListChangeUp WeaponTabMS_ListChangeDownTabarena AllowCloseMS_Edit MS_ClickWeaponpServer MS_MouseOverselectK selectDshortselectJ MenuSounds OldIndexNoneNoneNoneNoneShieldStrengthMax UDamageTime NameSound AckStringbNoConsoleDeathMessages TeamMateRecNone CharactersTeamInfoTacticsRatingTeamTacticsRatingTeamInfoAgilityRating pWeaponPrefpPlayer pNetwork SavedPitch PlayerRot Vignette LevelInfo TP_Profile TP_TutorialsTP_Qual TP_Ladder TP_RosterTP_Play ButtonMenu ButtonPlayTeamAgilityRatingTeamInfoAggressivenessRatingTeamAggressivenessRatingTeamInfoAccuracyRating numcharsPRGPTeamAccuracyRatingAggressivenessRatingTacticsRatingAgilityRatingAccuracyRatingGetFavoriteWeaponForPREMutatorRecordsbFinishedPanels charNameyButton GameInfoLPageTPageGPageHUDTBPlayerRecordsPlayerReplicationInfo bRosterOn lblTitle lblCaptiongImagebtnOKbtnMapGameReplicationInfotutnameAggressivenessStringAccuracyString__OnStatsConfigured__Delegate SettingsPage LevelSummaryOrigResTacticsStringAgilityString TextNameNoneresbitPickupVig Portrait bCancelled InventorybSorted FaceSkinName BodySkinName ItemsPerPage ItemHeight ItemWidth bHotTrack MyScrollBar__OnDrawItem__Delegate__OnAdjustTop__Delegate MeshName AmmunitionPerc ControllerPlayerControllerLadder TeamInfo ElementsInventoryAttachment__CompareItem__DelegateNavigationPointelem GameProfileLowSpeciesCanvasItemStr ExtraObj ExtraStrFont bClearFirstt2 eScrollState PlayerRecordMutatorRecord xTeamGamenumAcks xMutatorListContent xDoubleDom FFireString VisibleChars oldWidth ScrollState bNewContent bStopped__OnEndOfLine__Delegate InteractionBaseGUIController FFireAbbrev SortString SortItem SortData InvSortData Interactions ColumnWidthsInteractionMaster xDomMessageLevelSortDescendingShaderNone NeedsSortingxDeathMessage xCTFGame xBombingRunColumnOldItem TexPanner FinalBlendPawn CellLeft CellWidthMyPage listitemxBombHUDMessage xBombFlagxBombDeliveryUT2003GameProfileTeamRedConfiguredTeamBlueConfiguredDMRosterConfigured xDeathMatchBossDMxUtil SpeciesTypeXGameAdrenelinPickup PickupSoundsLinksLinkGunNoneNonePlayerServers MyRulesListMyPlayersListOutstandingPingsMaxSimultaneousPingsUseSimultaneousPings PingStartNumReceivedPings Materials StaticMeshInfo MaterialBitmapMaterialMeshActorListCountNoneStyleNone ClassNameVSizeUSizexModNoneYawPitch moveCount DescriptionNoneNoneSoundAllPlayerListTextureNone ModuNoise SoundNameNone PeriodPosZoomFX XGameShaderss2 ProgressNone CaptionStyle bIntSlider__OnDrawCaption__DelegateTitleNoneConsole RepeatClick DockedTabs bDockTop HolderPRIMyPanelMap IsActiveClass bInitializedPackageConfig bNewCheckedConst numFFiresbDisplayWinnerbDisplayLoser NewStyleNameSwitch bMaskTextControllingTeam bFloatOnly bIncludeSignbConvertSpaces MaxWidth TextCase PreBeginPlay CaretPos FirstVis LastSizeXbControllablebPlayerShadows bAllSelectedLastKey PlayerInputst PortraitPRI inputstr OtherAbbrev OtherString__OnScrollZoneClick__Delegate OtherSound OrderAbbrev TextBuffer OrderStringObjectEnum FunctionStateRotatorStruct MatNames OrderSoundNameMatName MatureTaunt Gameplay StrPropertyStructPropertyArrayPropertyClassPropertyDelegateProperty NamePropertyObjectPropertyFloatPropertyFontsNoneAlign__OnDrawText__Delegate BoolProperty numTauntsXResNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone IntProperty BytePropertyLftFontClassNameResXFntClsfnt bStretch TauntAbbrevNone TauntStringNoneNoneNoneNoneSinglePlayerThumbsGrey GUIMenuFontGUIDefaultFont GUILargeFontGUIHeaderFont GUISmallFontGUIMidGameFontGUISmallHeaderFontGUIServerListFont MyBackButton MyStatus FooterPanelOnlyStandardCheckBoxNoPasswdCheckBoxNoFullCheckBoxNoEmptyCheckBoxStatsViewCombo MutatorCombo FilterTitle TestButtonA TestButtonB TestEditB AudioBK1 AudioBK2AudioMusicVolumeLabelAudioMusicVolumeSliderAudioEffectsVolumeLabelAudioEffectsVolumeSliderAudioVoiceVolumeLabelAudioVoiceVolumeSlider AudioModeAudioReverseStereoAudioMessageBeepAudioAutoTauntAudioMatureTauntsAudioLowDetailAudioPlayVoicesAudioAnnounce DetailBKDetailWorldDetailDetailCharacterDetailDetailActorDetailDetailPhysicsDetailCharacterShadows DetailDecalsDetailDynamicLightingDetailCoronasDetailDetailTexturesDetailDecalStayDetailProjectorsDetailDecoLayersDetailTrilinearGameBKGameBK1GameScreenFlashesGameWeaponBobGameReduceGore GameDodging GameAutoAimGameHudVisibleGameCrossHairGameCrossHairImage CrosshairBKGameDeathMsgs IARulesBK1 IARulesBK2 IARulesBK3IARulesGameSpeedLabelIARulesGameSpeedSliderIARulesWeaponStayIARulesTranslocatorIARulesFriendlyFireLabelIARulesFriendlyFireSliderIARulesGoalScoreIARulesTimeLimitIARulesMaxLives IARulesBK4IARulesAutoAdjustSkill InputBK1 InputAutoAimInputAutoSlopeInputInvertMouseInputMouseSmoothingInputUseJoystickInputSliderLabel1InputMouseSensitivityInputSliderLabel2InputMenuSensitivity InputBK2InputIFWeaponEffectsInputIFPickupEffectsInputIFDamageEffectsInputIFGUIEffectsInputIForceLabel MPServerBk1 MPServerBk2MPServerDedicatedMPServerLanGameMPServerAdvertiseMPServerCollectStatsMPServerBalanceTeamsMPServer_BotSkillMPServerUseDefaultsMPServerUseCustomBotsMPServerMinPlayersMPServerMaxPlayersMPServerMaxSpecs MPServerName MPServerPWMPServerAdminNameMPServerAdminEmailMPServerAdminPWMPServerMOTD1MPServerMOTD2MPServerMOTD3MPServerMOTD4MPServerUseWebAdminMPServerWebPort OnlineBK1OnlineNetSpeedOnlineStatsNameOnlineStatsPWOnlineStatDescOnlineTrackStatsViewOnlineStatsInvalidWarningSPTutDM SPTutDMB SPTutDMLSPTutDMButton SPTutDOM SPTutDOMB SPTutDOMLSPTutDOMButton SPTutCTF SPTutCTFB SPTutCTFLSPTutCTFButtonSPTutBR SPTutBRB SPTutBRLSPTutBRButtonVideoResolutionVideoColorDepthVideoFullScreen VideoApplyGammaBK GammaLabel GammaSliderBrightnessLabelBrightnessSliderContrastLabelContrastSlider BrightDesc1 BrightDesc2 VideoLeft VideoRight HScrollZone HLeftBut HRightButHGrip ScrollZoneUpButDownButGrip EditBox1NoneNoneVidOKBackground OkButton AddBuddyDescBuddyEntryBox OpenIPDesc IpEntryBoximgBack lblQuestion TitleStrip TitleText TestButton1 TestNumEdit TestNumEdit2DialogBackground DialogText DialogText2 WeaponSelectBadCDBackgroundBadCDOk BadCDLabel PageBackBotPortraitBorder imgBotPiclblNamelblRacemyPBmyPB2myPB3myPB4myPB5CongratsHeaderCongratsPictureCongratsFooter BackButton QuitImageA1 QuitImageA2 QuitImageA3 QuitImageA4 QuitImageB1 QuitImageB2 QuitImageB3 QuitImageB4 QuitImageC1 QuitImageC2 QuitImageC3 QuitImageC4 QuitImageD1 QuitImageD2 QuitImageD3 QuitImageD4 BuyButton QuitButtonGetPassBackground GetPassPW GetPassRetry GetPassFail GetPassLabel IAPageHeader IAPageTabs IAPageFooterIAPagePlayButtonIAPageBackButtonLoadWeapBackground LoadWeapText ImgUT2Logo ImgUT2ShaderSinglePlayerButtonMultiplayerButton HostButtonInstantActionButtonSettingsButtonQuitBackgroundContMatchButtonQuitGameButtonLeaveMatchButtonChangeTeamButtonAddFavoriteButton HostHeader HostTabs HostFooterHostPlayButtonHostBackButtonNetStatBackground NetStatOk NetStatLabel YesButton NoButton QuitDescSettingHeader SettingTabsSettingFooter LogoSymbolSPTabsSPHintsSPBackSPPlay SPPageHeader SPLEPtitle SPLEPcaption SPLEPimageSPLEPOKSPLEPimageborder SPLEPMapPromptBackground PromptHeader PromptDesc AcceptButton VideoOKDescVideoOkTimerDesc TheScrollbarNoneNone MyHeaderNone MyMOTDTextMyRefreshButtonMyUpgradeButton VersionNumTheServersListServersListBoxThePlayersListPlayersListBox TheRulesList RulesListBox ServersPanel RulesPanel PlayersPanelDetailsSplitter MainSplitterRefreshButton JoinButtonSpectateButton UtilButtonA UtilButtonB TheBuddyList BuddyListBox BuddyPanelBuddySplitterKeyConfigKeyList KeyConfigBK1 KeyConfigBK2 KeyConfigBK3KeyConfigAliasLabelKeyConfigAliasLabel2KeyConfigAliasLabel3KeyResetButtonIABotConfigBK1IABotConfigRedListIABotConfigRedAddIABotConfigRedRemoveIABotConfigPortraitIABotConfigPortraitBorderIABotConfigBlueAddIABotConfigBlueRemoveIABotConfigBlueListIABotConfigCharListIABotConfigConfigIABotConfigNameIABotConfigRedNameIABotConfigBlueNameIABotConfigDMNameBotLeft BotRight IAMainBK1IAMain_BotCountIAMain_GameTypeIAMain_MapListIAMain_MapImageIAMain_MapScroll IAMainBK3IAMain_BotSkillIAMain_UseMapBotsIAMain_UseCustomBots IAMainBK2IAMain_DescBackIAMain_MapNameIAMapListFullMapListIAMapListCurMapList IAMapListAddIAMapListRemove IAMapListAllIAMapListClear IAMapListUpIAMapListDownIAMapListAvilLabelIAMapListSelectedLabel IAMutatorBK1IAMutatorAvailListIAMutatorSelectedListIAMutatorScrollIAMutatorConfig IAMutatorAddIAMutatorRemove IAMutatorAllIAMutatorClearIAMutatorAvilLabelIAMutatorSelectedLabel MPHostBK1 MPHostBK2MPHost_GameTypeMPHost_MapImageMPHost_MapScroll MPHostBK3MPHostListFullMapListMPHostListAddMPHostListRemove MPHostListUpMPHostListAllMPHostListClearMPHostListDownMPHostListCurMapListMPHostMapName PlayerBK1 PlayerHandPlayerCharList PlayerScroll PlayerLeft PlayerRightPlayerPortrait Player3DViewPlayerPortraitBorder Player3DBack MapPicBackMapPic MapInfoBack MapInfoNameMapInfoScrollDMBar1DMBar2 DMLabel0 DMLabel1 DMLabel2 DMLabel3a DMLabel3b DMLabel4a DMLabel4b DMLabel5a DMLabel5b ImgLock1 ImgLock2 ImgLock3 ImgLock4 TopLeftBarTopLeftCornerTDMBar1TDMBar2 TopRightBarTopRightCornerCTFBar1CTFBar2 MidLeftBarMidLeftCornerDOMBar1DOMBar2 MidRightBarMidRightCornerBRBar1BRBar2 TDMLabel CTFLabel DOMLabelBRLabelSPLChampButtonSPLChampBorder lboxProfilemoebPlayerName moebTeamNamemoebDifficulty moebKills moebDeaths moebGoalsimageSkinBackimagePlayerSkinimageTeamSymbol btnDeletebtnLoadbtnNew SPPLDataBox SPPLImageBox SPPLLblStatsSPPLLblProfiles symbolBack moebWins moebMatchesWeaponPrefWeapListWeaponPrefWeapUpWeaponPrefWeapDownWeaponDefaultsWeaponAutoSwitchWeaponDescriptionWeaponPriorityLabel WeaponBK ShowList ListBox1 Scroller btnAddItems MyMOTDPageMyDMServerListPageMyTDMServerListPageMyCTFServerListPageMyBRServerListPageMyDomServerListPage MyLANPageMyBuddiesPage MyPrefsPageServerBrowserHeaderServerBrowserTabs Backdrop TheButton lblImgStyle cboImgStyle lblImgAlign cboImgAlign lblImgSelect cboImgSelectlblClientBoundcbbClientBound TheImageSPDTRosterBK0SPDTRosterCharListSPDTMatchData SPDTCharDataSPDTCharStatsSPDTCharListBox SPDTPortrait SPDTDraft SPDTRelease SPDTClear SPDTEnter SPDTPicLeft SPDTPicRightSPDTTeamStatsSPDTLblChoose SPDTHeader SPDTHints SPDTAuto SPPTSwap imgEditsBack ebNameEdit ebTeamEdit cbDifficultymocbDifficultyclistPlayerSkinsilTeamSymbolsbtnBack btnDefaultsbtnSaveProfile imgSkinsBack btnPrevSkin btnNextSkinimgSymbolsBackbtnPrevSymbolbtnNextSymbollblTeamSymbol lblCharacterportraitBackgroundsymbolBackground SPRosterBK0SPRosterPortraitSPRosterPortraitBorderSPRosterCharList SPMatchData SPCharData SPCharStatsSPCharListBox Mate1Back imgMate1 lblMate1 cboMate1 btnMate1lblNA1 pnlMates1 Mate2Back imgMate2 lblMate2 cboMate2 btnMate2lblNA2 pnlMates2 Mate3Back imgMate3 lblMate3 cboMate3 btnMate3lblNA3 pnlMates3 Mate4Back imgMate4 lblMate4 cboMate4 btnMate4lblNA4 pnlMates4 SPRTeamStatsNoneParseDelimited ChopLeft SystemText AddCommandChopFindChannelWindow ProcessInputSendBufferedData LetterKeys NumberKeysSetCurrentChannel DisconnectGetUserSendCommandTextIRC ChangedNickNumberToString ChannelText JoinChannel ChangeOpChannelAction PrivateText UserQuit ChangeVoiceSetAwayPrivateActionInGameRemoveNickPrefix UserNotice FindNick ChangeMode KickUser PartChannelJoinedChannelFindPrivateWindowUpdateConnectCaptionCTCPPartedChannelCopyToClipboardIsAway RemoveUserUserInChannel DestroyLinkSendChannelTextRemoveChannelPasteFromClipboardFindChannelHistoryIndex UserSetFlagSetExtraAtIndexSendChannelActionFindServerHistoryIndexCreatePrivChannelAddUser CheckAwayMyCompareItemMyListDblClickBegin IRC_Private ConnectClickRemoveChannelClick LoggingIn LoggedInSetItemAtIndexLoadSpeechCommandsSetCurrentChannelPageSetNick KeyToNumber MyOnPreDrawRemoveServerClickJoinChannelClickPartCurrentChannel ChangeNickFindChannelIndexLeaveChannelClickbSpeechMenuUseMouseWheelIRCPageReadBufferedLineDisconnectTextNotInAChannelText UserListBoxRemoveServerButtonHasJoinedTextWasKickedByText ChannelCombobFixedSplitter QuitText ServerLabel IsAwayTextConnectedText IsConnected HasLeftText CurChannelNotifyAfterLevelChangeResolveOpened InviteStringConnectingToText IRC_ChannelDoBufferQueueIOClosed BindPortOpen IRCVisible HudTabLabel HudTabHintSpeechBinderTabLabelSpeechBinderTabHintJoinChannelButton ChannelLabel PrevChannel bNoTeletypeGetActivePageKickedFromTextGetAddressURLErrorBindingTextNowKnownAsTextRemoveChannelButton ResetBufferResolveFailedTextCloseTab_SpeechBinderTab_HudSettings IRC_Page TimeOutError ServerComboConnectButtonResolveFailedIRCLink IRCClosed Resolved SendText IRC_System SystemLabel SpeechLabelbDrawSplitterNotifyQuitUnrealMaxChatScrollback Browser_IRCByTextInvalidAddressText ConnectTextDisconnectReason SetsModeTextIdealPlayerCountMinbAwayConsoleMessageCountOldCMTemp3ix InNickNamebSpeechMenuUseLettersTestIRCString LeaveButtonMode SystemPage NewVoiceNoneKickerbShowPortrait HudOpacityMyPlayersMustBeReady FullNameInput TextDisplayGetEntryLevelServerHistory TabButton AwayTextCrossHairColor HighlightRowTcpLink xVoicePackAuthor InSystemPagebSet MyIRCPagePlaneNonebListInitialisedChannel ChannelTabs InFullNameOldNick ServerPort Username ChannelsServerAddressbRequireRawJoystickNewOp IsSections1 IsPrivateOldW bConnectedCmdIdealPlayerCountMaxTemp2IpAddrBufferedTCPLink InUserIdentMPServerPlayersMustBeReady NewExtramDescAnnouncerVolumeInKeybSysInitialisedBrowserButtonDefaultChannelMyServerLabelMyConnectButtonMyServerComboMyRemoveServerButtonMyChannelLabelMyJoinChannelButtonMyChannelComboMyRemoveChannelButtonMyLeaveButton ServerIpAddrChannelTabControlAddr DrawName InternetLink NickNamethree TextEntryConsoleFontSizeLinkCRLF ChannelName InServer OldModulateIAMain_MapPlayersIAMain_MapAuthorflag MaxHistoryFlags OldScale UserIdentbUsersNeedSorting HudScalebPlayersMustBeReadyNewChGameHudOpacityGameHudOpacityLabelNickpriv GameHudScalebIrcIsInitialisedGameHudScaleLabelGameHudMessageOffsetInDefaultChannelGameHudMessageScaleGameHudMessageCountOldPlayerNameChannelHistoryGameHudShowPortraitsGameHudShowWeaponBar KickedNickGameHudShowScoreNewNick UtilPanelReasonGameHudShowPersonalInfoGameHudShowWeaponInfoGameHudCrossHairA bAddModifierGameHudCrossHairALabelGameHudCrossHairBNumbVoicebOpGameHudCrossHairRLabelGameHudCrossHairRMyUserListBox ChannelPage DisplayPanel DisplayBox EntryBoxGameHudCrossHairBLabelGameHudCrossHairGGameHudCrossHairGLabelMessageFontOffsetNoneFontArrayNamesLoadFontStaticLoadInstructionFontLoadLevelActionFontLoadLoadingFont LoadFontInstructionFontNameLeaveChannelCaption NowViewingLoadingFontNameLevelActionFontNameLeavePrivateCaptionHeadGetHumanReadableNameProgressFontNameLeavePrivateCaptionTailLoadingFontFont bMakeActiveFontArrayFontsLevelActionFontFont ViewTargetInstructionFontFont bForceFlashNone IsNumber StripColorsChangeNickClick bStripColors IRC_NewNickChooseNewNickTextNickInvalidTextNickInUseText MyNewNick MyStringChangeNickButton StrippedTextLenFromEscapeNewNickDialog NickMesgMyChangeNickButton EscapePos RemCountNewNickPrompt NewNickEntryNoneNoneNoneNone STY_IRCEntry STY_IRCText UT2IRCFont GUIIRCFontNoneNoneDefaultChannelsNoneMakeColorCodeUpdateMutatorVisibilityColorizeLinksMutatorModeStringsTranslocatorStringsWeaponStayStringsStripColorCodes ProcessRuleIsStandardGameType UpdateAwayPrecacheFonts IngameChatCopyServerToClipboardIRCTextDblClickDrawWeaponNameNoneTSV_OnlyTranslocInputHistorySize IRCTextColor DefaultTextServerRequestRulesVMM_NoMutatorsChat IRCLinkColor TeamChatOnlyTab_ServerInfo GUIFloatEdit IRCInfoColorVMM_AnyMutatorsWeaponStayString ChatStructWSSV_OnlyWeaponStayWSSV_NoWeaponStayVMM_ThisMutatorTSV_AnyFOV MaxGamespeedGetWordUnderCursorUT2ServerInfoGetLocalStatsScreenTab_ServerMOTD ChangeTeamVMM_NotThisMutatorTSV_NoTransloc IRCNickColorIRCActionColor moFloatEdit WSSV_AnyTranslocatorComboViewMutatorModeWordChatBackgroundWeaponStayServerViewWeaponStayComboColourlessWordMPServerAllowBehindView HudColorETranslocServerViewInWordTranslocServerViewbNoEnemyNamesServerInfoFooterNoneFadebLastWeaponThrowingDesiredMutator2WeaponDrawTimer__ProcessRule__DelegateMouseSmoothingStrength DefaultFOV ChatEdit chatTextMouseAccelThresholdMutatorCombo2FontsPrecachedMyAllowBehindView MinGamespeedServerAdminEmail ServerBK1 bIgnoreCharbDoneInputScrollInputHistoryPosServerInfoBackgroundServerInfoLabel WeaponSwapServerInfoHeader InStringServerInfoTabsIARulesAllowWeaponThrowEWeaponStayServerViewMouseThresholdServerBackButton DoubleClickbAllowBehindView ClickStringbTeamChatOnlyDoubleClickTimebDontShowWithBots CharacterMutatorModeCombo2 ChatMenubExpertMyWeaponThrowingServerInfoBK2 ServerBK2MyTextCodePos bClickText MouseLag ScreenNoise bBlobShadowViewMutator2Mode MaxNamePosCurWeaponNameMouseSmoothStr InputHistory MOTDTextExchangeFireModesServerInfoBK1 bDrawFPHLocalStatsScreenInputMouseLagInputDodgeTimeInputMouseAccel PlayerFOV ChatMessages OutStringxPlayer NewColorLastWeaponName DetailBlobNewRuleSinceLastLevCheckInputMouseSmoothStrbCleanGameHudShowEnemyNamesbNameFontReductionEViewMutatorModeClickedString InfoText AwayStringNoBotServersCheckBoxServerMOTDLabelMutatorModeComboServerAdminNameLocalStatsScreenClassWeaponDrawColor HaveWordOldCMCNone OutFireTextNewTeambHideWeaponName OriginalTeamRestartStringNoneSetInitialMusic SetMusic MusicChangedPlayListStructAutoLoadMenusNone GetOGGListUT2MusicManagerNone MusicMenu AutoLoadSongs PlaylistMusicManagerClassNameNewSong bShuffleCurrent OGGFiles MusicManagerNone ReloadList FormatID BanClicked KickClickedSelectGameTypeServerRequestPlayerInfoTab_AdminPlayerList UT2AdminMenu EpicIDMsgAdminPlayerList PlayerIDAdminPlayerKickHUDPRI MyPlayersAdminBackground bDemoOwner MyPlayerListAdminInfoBackgroundAdminPlayerBanGetPlayerIDHash PlayerIPAdminBackButtonAdminInfoFooterAdminPlayersListBoxAdminInfoBackground2EpicIDConsoleMessage AdminList TextMessagesAdminInfoHeaderAdminInfoTabsIdNoneAddToBindingsBrightOnchangeMapPosYKeyInfoGUIUserKeyBindingMyBrightSkins GetNextIntFindPlayerRecord FlagHolder OtherTeam DMMutator bBrightSkinsbSectionLabelbLowSoundDetailAt bIsSectionIARulesBrightSkinsKeyData UserKeyClassFPHTimeNoneSpecButtonClick AckAbbrev bSpectateIAPageSpecButtonNone APackInfo PackInfoBonusPackInfoCustomizedAnnouncerPackAudioAnnouncerPackDefPackAPackNone ChangeTopic ChangeHalfOpMyParseDescStrGetScoreValue GetScoreTextHaveBonusPackGetScoreTagLinePopulateGameTypesFindGameTypeNameHaveCustomGameTypes InvasionTypeInitialViewingStringCustomServerListPage MutantType LMSTypeName ScoreTextGameTypeSplitInvasionTypeName NewTopicTextLMSTypeBrowser_ServerListPageMSCustomMutantTypeName TypeName MyGameType NewTopicTextTop LMSLogoSmallGameTypeCombofullSmallHbHalfOp NewHalfOpLastManStandingMyCustomServerListPageMyGameTypeComboGameTypePanelCustomInitializedMedH ChannelTopicMyGameTypeLabelMyGameTypeSplitterNoneNoneNoneInternalShowIconKeyBrowser_IconKeyIconDescriptionsIconsIcon1Label3 IconPosXLabel6Label5Icon6 MyKeyButtonLabel2 ServerIconsDrawX checkFlagIcon2Label1 ListenServerLabel4 InstagibStats StandardLatestVersionIcon4 IconPosYIcon3Icon5NonebDisconnectOnOpencheckDefaultBindingsTabsNoneNoneCompNoneNoneNoneSM bIsRunningMySceneManagers SceneManagerNone TeamChangeNoneNone SliderChangeDoPerc SetDefaultsNoneNoneAggDCComboBoxChangeComDCBotConfigClickCheckBoxChangeAccDCStrDCTacDCReaDC ResetClickMipZeroUClampUBitsVClampFormat IndexForVBitsUT2BotConfigPagebAlphaTexture AccuracyTacticsBotReactionSliderBotTacticsSliderNone BotCfgName NameWidthStrafingAbilityNoneBotCStyleSliderBotStrafeSliderLabel7 ConfigIndexBotAccuracySliderWepNone CombatStyle bBehindView ResetButton BotWeaponNonebDynamicNetSpeedThisBotbSmallWeaponsFavoriteWeapon ReactionTime ConfigArrayCustomBotConfigNoneCharacterNameIcon7AggressivenessIABotConfigDoConfig S_UTClassicNoneNonevminNetworkDynamicNetspeedNonebIgnoreChangeBotAggrSliderCustomConfigurationNone BotJumpyControlPlayerSmallWeapNoneCustomCrosshairCustomCrossHairColorCurrentCrosshairColorCurrentCrosshairNoneNone PlayerOGGNoneNone HighestResNoneCustomCrossHairScaleCustomCrossHairTextureNameCurrentCrosshairScale LongestNameCustomCrossHairTexturebForceFeedbackSupportedLongestNameLength CHtexture ReducedFontNoneNoneNoneNonebAdvancedAdminNoneInternalOnCreateComponent__OnCreateComponent__Delegate IsValidIndexInternalOnMouseReleaseSetVisibilitySetHint AddComponent ValidIndexCrosshairTexture FindIndexIsValidFreeGetComponentValueInternalOnActivate InitBaseListSetComponentValueInternalOnDragOverInternalOnBeginDragInternalOnDragDropInternalOnEndDragHideBarBorderAmmoIndicator BarBorderInternalOnDragLeaveBarWeaponIconBarBorderScaledPositionInternalOnDragEnter__OnDragLeave__Delegate RenderWeight__OnEndDrag__Delegate__OnDragDrop__Delegate__OnDragEnter__DelegatePropagateVisibility__OnDragOver__Delegate__OnBeginDrag__DelegateGUISubtitleTextAppendComponent TabIndexSetOutlineAlphaCheckLinkedObjectsCanAcceptFocusDefaultListClassCloseSpeechMenu FontScaleOnCreateComponentNone IsMember FontBKColors FindExtra ModAuthor ImgWidthsNoneSetupAlternateKeyName ImgHeightsRemoveComponentGetPendingElementsNoneGenerateMenuOptionOnDestroyPanelNone ResetInput InsertItem GetCallSign GetChannelsLostActiveTabCanJoinChannel ImageIndexbIncreaseButtonDecreaseClickNoneIncreaseClick OnEndDragNone MoveRightVoiceChatAllowedSMChannelOptions AddSubtitle OnStopped MoveLeftProcessMapNameInternalOnDblClick TabOrder FindComp DrawTimerInternalOnColumnSizedDisplayEnemyName DrawUDamageOutlineStyleNameNoneSetObjectAtIndex ListSaveIniMinGripPixelsGetShortOrderStringForOnHide HudColorTeamGetTitleStringTeamScoreBackGroundDiscGetDefaultScoreInfoString RemoveExtraEnableLinkedObjectsSetCustomHUDColorNoneFlagDownWidgets OnDragEnterOnShow SetTitleLabelStyleNameNoneTimerDigitSpacerNoneMyDecreaseButtonNoneNoneGetRestartStringNoneNone OnDragLeaveCustomHUDColorAllowedOnChatMessage ZoomFadeOutNoneDrawAdrenaline OnBeginDragTeamScoreBackGroundNoneHandleContextMenuCloseFindPlayerByIDGetInfoString SetCaptionCustomCrosshairColorAllowedDisplayVoiceGainResetComponent ListLoadIniSetExtraValue ToggleExpandNone Collapse DrawMembersNoneUpdateExtraValueClearSubtitlesIsActiveChannelGetDecoTextAtShow MyGripButtonFlagHeldWidgetsNone MyScrollZoneSetCustomCrosshairColorsMyIncreaseButtonNoneNoneNone RemoveObjectHandleContextMenuOpenButtonCheckedRefocusCustomCrosshairsAllowedInsertSubtitleBarWeaponIconAnimListCreateComponent NumColumnsDisableLinkedObjectsShowReloadingPulseNewFlagWidgetsExpandGetPendingItemsSetFriendlyLabelDrawChargeBar VoiceChatSetCustomCrosshairs REDtmpScaleYDebugFocusPositionGUIMultiOptionListBoxNoneNone GetGenderAt TextIndentGUIScrollButtonBaseNoneMultiSelectListBoxDS_Visibility GetLevel MyScoreIconbDrawTabAbove GUITreeList DumpRecordsNone DrawMyScoreGUIMultiOptionListNoneCurrentListIdHudBorderAmmoSetLevelAtIndexNone GetRecordAtRemoveItemByIndexWantsZoomFade HilightColorGetPortraitAt ItemPaddingNone InitListExcl HudColorBlue ReplaceItemMyOpenNoneNone BorrowPanelRemoveItemByNameNone GetGenderNoneExtraCompClass DigitsShieldbCaptureInputInternalOnShow GetListIndexDRD_RightToLeftButtonStyleNameInitLinkObjects LoadingPivotMultiSelectListRemapComponentsGUIGripButtonBaseMyCloseAddLinkObject FNS_LargeGUITreeListBoxAdrenalineBackgroundNoneNone FNS_Small DRP_Source GUITreeNode FONT_NUMmoComboboxPlus ShadowColorISTY_PartialScaledServerRequestMapListBombWidgetStatus DumpPlayInfo moButton DigitsHealthInternalOnScrollReleaseGetLevelAtIndex bAutoSize GUIHeaderSTY_ListSelectionbUseCustomWeaponCrosshairsProfileStructInitializeColumnsORIENT_Horizontal GetNameAt STY_EditBoxInitializeControls OnScrollBy RechargeBarTimerBackground OnDragOverGUIListSpacerGUIListHeader REDtmpScaleXGUIContextMenuHudBorderShieldIcon UT2MainPage OnPostDraw JoinArrayMyShowListBtnSliderCaptionStyleNamePadLeft DigitsAmmoDRD_BottomToTop VersusSymbolTimerBackgroundDisc PadRightHudBorderHealthIcon PanelCaption CURSOR_NUM DS_StoppedAdrenalineAlert DRP_RejectDRD_LeftToRight GetCaptionSMS_VoiceChatChannelHudBorderHealthDumpNone VisibleDelay MightRemoveNonebNotifyAdrenalineBackgroundDisc REDtmpPosX TimerHoursInsertComponentFindItemObjectHudColorNormalNone GetDEMHeaderGetCaptionAtIndexHudColorHighLight DropShadowHudColorBlack REDtmpPosYButtonCaptionDrawTeamOverlay BLUEtmpPosY GetSoundAt Orientation InsertTab DRP_None TextSizeBLUEtmpScaleYNoneDumpCacheRecords HudColorRed GetDEMListDefaultCrosshairsGetChannelMembersAtSMS_VoiceChat AutoPosition HideList FadeTime moSliderPLTextProfile DRP_TargetSectionStyleNameSelectedStyleName STYLE_NUM SetSubtitlesOnReleaseSplitterMultiSelectListElem GUIFooter DebugFocus DropShadowY ItemScaling DropShadowXGetValueAtIndexGUIScrollZoneBaseAutoPositionOn BarStyleNameOnTrack FadeZoom TimerMinutesDRD_TopToBottombInitNewDrawWeaponInfoMyScoreBackgroundSliderBarStyleNameGuessCharTime AddMessageNoneSelectionStyleName FNS_MediumNoneSetCaptionAtIndexHudBorderShieldc_Tabs TimerIconGUITreeScrollBar PanelHintDropStateChangeBLUEtmpScaleXNone UDamageIconTab_ServerMapListbDrawSelectionBorderNoneNone UpdateOffset DS_DelaySetValueAtIndexbModulateStackedMenusNone BLUEtmpPosX DRP_AcceptNoneNoneORIENT_VerticalNone OnDragDrop TimerSecondsSliderStyleName CrosshairNotifyContextSelect NewCaptionbAutoSizeCaptionShadowOffsetXNone NewAlphaNonePadStrbSpeechMenuLockedbUniqueLinkedObjectsNoneNoneNoneNoneNoneNone__OnChatMessage__Delegate PacketLossOfficialColorZoomToggleTimeNoneNoneVisible__ProcessMapName__Delegate RightBoundMyONoneMyCmenusNone HUDPulseNoneNewMax t_HeaderSeconds bDropSourceNoneNone__OnStopped__DelegateNone bAcceptedNoneNoneNonebIgnoreBlanks StringArray ModResultInOwnerCrosshairRecordMinutesbFillBackgroundCurLineHilightOffsetX IconOffsetCaptionEffectStyleeDrawDirectionMaxPercentage NewCompClasseDisplayState CacheTypeNewStepNoneNewMapScreenshotRef LeftBound UpperBound__OnTrack__DelegateNoneNoneNoneLeftPadNewVbLoseLastPlayerIDTalking LowerPadNone BarStyle BarAmmoIconSexNewObj MySlider__OnPostDraw__DelegateNoneNone LowerPadPercNoneframe__OnColumnSized__Delegate EOrientation CSVStringNone PendingItem SectionStylePickupClassName VisibleTime NewComponentNone 2K4MenusHeaderColumnPerc DEMFiles ButtonBobSectionJustificationNewComp DropTarget RightPadPerc RecordedBy BlockSizeStrLenESCCOMMA RecordIndexDelimNone NewLabelGetMutatorListPosH ReqPackagesNone bDontGuessWRecsProfileSecondsSelectionStyle ScoreLimit LowerBoundLastVoiceGain bNoChange MarkerWidth DemoNameDriver WeaponRecordCustomHUDHighlightColorMo__OnHide__Delegate__OnShow__Delegate LastLinebAllowEmptyItemsNone PlayInfoStatsPromptMenuClassNonebOldStyleMenus MOTDStringMinVGetURLProtocol menulistVRIMapListClassName fb_Pulse001TypeNone bDropTargetDeco eFontScale ContextItems VertAlignNone TestObject GameAcronymbAlwaysNotifyOfficial2004ColorHudScaleOffsetNone eDropState PageTabs OutlineStyleVoiceChatReplicationInfoMRecs OldPanel bGuaranteeShadow MapRecord TempElemNoneComponentClass HUDContent ProfilersPanelsDefaultPanelsGRecsPlayerCountMin SubTitlesContextMenuOwner CacheManagerAtIndexSubTitleTiming ClientSideHoursMOClassNoneMembers UpperPadPerc GameRecordMarginoXLIconMaterialName DecoText LeftPadPercnewdata ContextMenu bPending DisplayStateRecords __NotifyContextSelect__Delegate bIsVisibleCurrentPlayer MElements SkipRemapPosWMesgAcronym Components NewObject IsRepeatVehicleNoneCaptionEffectStyleName ImageList BarDirection DropSourceNoneGripPos LastIndex ItemIndexVoiceChatRoomGameTypeGroupNoneNone#__HandleContextMenuClose__Delegatealldata cMyEditBoxCustomCrosshairsLastPickupTimeHT bLowGoreSelectedStyle lengthdataMaxTop"__HandleContextMenuOpen__Delegate__OnReleaseSplitter__DelegateNoneNoneNoneSelectionIndexHOLDNone UpperPadbInt NewScaleNoneNone DockAlignNoneLastPlayerIDTalkingTime bDecoText bNoCheckInHintoYLNoneGenericNonebExtraCrosshairPackNone DropStatebUsingCustomHUDColorWhiteSquareTextureVoiceReplicationInfoNone VoiceGain__CheckLinkedObjects__Delegate bDrawTimerHilightOffsetY InCaption ExtraCompExtraCompSize InControllerALNoneServerInfoMenuAHAW MyFooter ChannelIndexNonePlayerCountMaxMutRecs ExtraInfo GripSizeCheckStyleNameNoneLastVoiceGainTime datalength AcceptingParentCaption ClickIndexbDrawPLNoneNoneNeedPasswordMenuClass MouseOffset TimeStampNone HudMinScaleShadowOffsetYNone__OnScrollBy__Delegate SettingsRowsCRecsNewMinDelayNoneAttachmentClassNameBonusPackColor RightPadNoneChange NewPositionNone FillColorPInfo NewTitle bExpertModeCustomHUDColorNewOptionClassVoiceChannelsbTempMaxV NewLevel TypedStrPos ColumnWidthNoneNoneNone bPositioned ActiveRoom t_Footer TauntPawnNoneHudCDeathmatchOptionCanFocusElement SetReadOnlyCalculateIndexHudCTeamDeathMatchGUISectionBackground CenterMouseHudCDoubleDominationInternalOnRightClickValidateValuebRequiresStyle GUIToolTipRemoveElementHudCCaptureTheFlag HardInsertInternalActivateGUIVertImageListInternalDeactivateCountDownNameWeaponBarTrimWeaponBarIconWeaponBarAmmoFillWeaponBarTintAddComponentClassScoreBg GripPreDrawGUIVertImageListBoxPlayStatusAnnouncementToolTip HasChildrenIsMultiSelect bNeverScaleFindParentIndexBeginAnimation EndAnimationElementVisibleServerFavoriteClearPendingElementsFindMenuIndex LevelChangedLongCountNameAutoLoginInfoHudCBombingRunCheckedOverlaySilentSetIndexSetToolTipTextFindVisibleIndexPopMenuGetChildIndexList GetTitle RemoveItemAtDebugTabOrderPositionChangedChangePortionValidSelectionAtShowPointBarTop GripPressedFindNextAvailableRootIndexLHud1 pulseWidget FormatValueRestoreMenuItemInternalDblClickMidGameRHud1 DisableMeUnPressButtonsRHud2 CheckValue LeaveAreaPaddingPercentDrawHUDAnimWidgetGetTopBelowCursorPanelLHud2 GUIBorderShowPointBarBottom RemoveSilent ShowToolTipShowPersonalScore RemoveMenu HideToolTip ImageOffset GUITabItemFindAvailableChildIndexShowVersusIconDrawVehicleNameOnEndAnimationPurgeComponentClasses SetHUDScaleResolutionChangedDesignModeHintDrawHUDAnimDigit StateButton PushMenuAdditionalDebugStringCheckDragSelectSaveRestorePagesSetFocusInstead IndexChangedStandardHeight RTeamHudGetTopAboveCursor LTeamHud ResizeImageSetList LoadTexture SetExtraGetValueStringOnMultiSelect EnableMeCloseOverlaysInternalEnterArea VerifyStack pulseNumberFindMenuIndexByNameGetElementAtIndexPrecachePlayerRecordsIsInCinematicFormatToValue GetWidthInternalLeaveAreaSetSmallWeaponBarInternalPreDraw RemoveImage OnPlusClickGetItemIntAtIndex GetAmmoClassTestCollisionDoCollisionTestOnChat PageClosedPurgeObjectReferences LocationDotModifyTooltipForDraggingGetParentCaptionAtIndex IsExpanded ExtraMarkingResizeInternalFormatValue HardSwapDrawDamageIndicators FindImageDrawVehicleChargeBar OwnerPageCheckDuplicateTabOrder RemoveMenuAtRevertTooltipToNormalInternalClick GetGUIFontGetImageAtIndexConsolidateMenus VertBorderGetRestoreParams HorzBorder ImageScaleToolTipLeaveArea GetTeamColorGetDataStringValidSelectionGetMarkerPosition ResetItemValueToFormatIsToggleClickGUICircularImageListAnimateMenuOptionClickedMakeTabActive OnHideListInsertElement MySpinner EnterAreaOnBeginTooltipScrollAlignThumbbInitializeList OnEndTooltipGetLeftCheckInvalidTabOrder ArmorPulseDrawIntroSubtitles OnMinusClick DomPointsInternalOnRendered LowHealthInternalOnOpenSetImageAtIndex AddElementOnTimerSpaceOutTeamInfoRemoveButtonsGetTop OnShowListNewOnButtonClick GetHeight CoolImageOnExecAddFavorite HealthIconGetInstantActionPagebAllowDuplicateCaptionMatchSetupMenu GetImageSpeak DisplayHitGetSettingsPagebPlayCrouches FindElementPlayRewardAnnouncement OldHUDScaleFindPanelClassRelativeHeightCS_Fade NewOffsetXArrayPropertyMenu GetIndexListbShowMissingWeaponInfoResetDesignerCS_Drag HudAmmoALERTHudVehicleHealthALERT PopulateListImageListElemGUIFormatNumEditCurrentWeaponPositionY bMultiSelect UT2K3GUIPage ShieldIconReloadingFillGetAllLoadHints bGroupItemsSubYLKeyNameFromIndexUDamageTeamTintSubYSubXLDebugGetItemHeightFindPersistentMenuByClassClientNetworkMessagePlayInterfaceSoundPlayWaitingGameSCALE_YSCALE_XDisableComponentServerFullMsg InFavorites OnSelectFloatingImage GetChannelAt SearchBindsCELL_FixedCountTestPanelBase LaunchURLSetRenderDevice eOwnageMapRenderComplexMessagei_Test co_Style co_Align co_SelectFindMenuByClass co_Render nu_Width nu_Height nu_PortionX1 nu_PortionX2 nu_PortionY1 nu_PortionY2b_Add l_ImageSize IsLocked SetTooltip AT_PositionSpecialDrawCrosshair GetModLogo GetFavoritesSubXDefaultStyleNamesGetCurrentBindbDrawFocusedLast PopInSound SlideInSound FadeInSound BeepSoundDLOIsOpenMapListVehicleCTFSetDataString HandleObjectCELL_FixedSizeKillAnimation KeyPressed SetKeyBindGetAssignedKeys LogoTexture GetQuitPage GetModValueDigitsVehicleHealth ShieldCount LastSelectedbDisplayHeaderUpdatePositionAnimEndGetServerBrowserPage DesignerMenu FillImageEnableComponent DAnimate WeaponStateGetSinglePlayerPageReloadingTrimbShowValueTooltip GetModPageIsPendingConnection bShowMarkerSetMoveControlbStandardized GetModList OnRenderedHudBorderVehicleHealthIconShowQuestionDialogFindIndexByValue CS_Slide GetSubTitlesSaveOwnageList CS_Hover FilterMenuUT2K3TabPanelDigitsBigPulseRequestDataMenuExpirationSeconds AmmoCountReloadingTeamTintRedeemerWarheadOnHover RelativeTopRelativeWidthHudBorderVehicleHealthOnDesignModeKeyEvent OnArrivalOnContextHitTestJoinFindPersistentMenuByNameHudHealthALERT UT2K4GUIPage CanShowHintsGetParentCaptionOnStatsClosedNoVisibleRowsNoVisibleCols DropIndex AddTabItem AutoLoadMenubSmallWeaponBar LinkIcon AddBuddyChatMenuClass HorzPerc VertPercAutoSizePadding UDamageTrim SCALE_All bAutoShrink RelativeLeftLeave ShrinkHUD bWrapItemsFindFullIndexmoFormatNumEditDrawHeadShotSphereGrowHUD GetMenuPathDrawCinematicHUD FindItemOnPreDrawCaption ISTY_TiledbHotTrackSoundGetOwnageList bWrapText InitListInclKickVotingMenu TestPageBaseMapVotingMenuRemoveFavoriteUnmanageComponentManageComponentUT2K4TabPanel RightPadding LeftPaddingActivateTabByPanel ColPaddingPerformRestore HeaderBase HeaderBar HeaderTopDynArrayPropertyMenu bRemapStackAtMenus AT_DimensionY3X3 IndexLocked STYComboBoxQuestionMenuClassNetworkMsgMenuDesignModeHintsFindPersistentMenuIndexUpdateVisibleCount AnimInfo HealthCount RemovedItemEditFavoriteMenuSetTip__OnRendered__Delegate SpecialHit bTrackInputPropertyManagerBaseCurrentWeaponPositionXShieldIconGlow UDamageFillDumpLoadingHintsIsDigitGetMultiplayerPage Validate BindKeyNameOnPreDrawCountU growAccumCObAllowParentSelectionbComplexString__OnContextHitTest__Delegate__EnterArea__Delegate MaxLineWidth__GetHeight__Delegate__OnSelect__DelegateTargetYTempY S_FlagIconPulseNewTip checkBoxX_bHeadLocHitColMin__OnChat__DelegateGroup PlayerNamesbNewKeyDownIndexes__GetSortString__Delegate bDebugging HeadScaleMessageOfTheDay bRestorableIgnorecXcY ResetDelayNoAnims MaxScale MinScale MinFadeTime MaxFadeTimeMinResetDelayMaxResetDelay FullAlphaGUIComboBoxToolTipbResetPositionl1l2r1r2NumberOfColumnsCollide bShowCaption soundType bRecursiveSprite__OnMinusClick__Delegate__OnPlusClick__Delegate NewSliderBarbIgnoreChangeWhenTypingAltCaptionOffsetAltCaptionAlign bAltCaption RealLeft bFillClient AlignStackbAllowDecimalchIdxBGetBoneCoords bUnformated SavedPosY RealWidth TopPaddingBottomPadding Designer MaxPerColumn DamageTime ComponentbAlwaysAutomateLookDirNewDamageTimeLPadRPadTPadBPad bRelativeOrigin InFocusCompFav__LeaveArea__Delegate KeyState RealSeconds__Tick__Delegate__ShowToolTip__DelegateNone__HideToolTip__Delegate__GetLeft__Delegate__GetTop__DelegateLastKickWarningTime TargetTop__GetWidth__DelegateHints OnDrawCount PickupTimerMidX bAllOverlay comboTimeAlphabShowPortraitVCForceFeedbackSupported OptionInMapDescAnimsAccessControlbForceRelative NewWidthEParentScaleType GameMessageBombTargetMessagebAdrenalineEnabledActiveChannelSelectedPrefixWidthColumnPaddingModKey HeadHeight TexRotatorbRealSmallWeaponBarnScaleStringElementsNodesB BoundingTypebUseCaptionHeight bWrapCaptionbAltRocketLauncher defButton__OnArrival__DelegateOnRenderedCountrotReticle001SizingCaption WeaponSounds Reticles ScaleFactorMinigun__AlignThumb__Delegate GameClassFallbackPackagechIdxAfbLinks CellStyleMapURLCurrentSubTitlesbSizingE FlakCannon__OnEndAnimation__DelegateFloatingShadowLastArmorPickupTimeNewPosY JumpinessYOWaitingGameClassNameF CharFadeLastAdrenalineTime increment checkBoxX_fItemsPerColumnaccumbDesignModeToolTips RenderDeltatest2Race NormalXResbPreInitializeRegisteredClassesGUIButtonToolTip bAnimatingSelectedElements GameEngine BZoomIn1ActionMessageCounter StrWidthTargetSceneSubtitlesbSpecialCrosshair DrawCount HealthMax rotDomRingAddPosX ExtraWeapon growSpeedLastMenuStateModDirs DefaultScale bSnapCursorComboTickPressed ParentIndexARealTop ParentLevel FadeSoundbReceivedNewContentLastHealthPickupTimeColumnHeadingHints PositionTime HUDPiece bSection RealHeight ValueStrSliderFillBlurryTransRechargeAmount growTraceGUISliderToolTip LockedMat ModTitlesgIndexPointerProperty DisplayingbScaledCaptionOffsetVRecsDimensionTimeAnimationCount MouseOverbForce bTemporaryARecsbValueMouseCursorBounds__OnBeginTooltip__Delegate bQuietMenuPRlistbFullHeightStyle TargetAlphabDrawPercentSignEAnimationType ScalingType HeadBone__OnEndTooltip__DelegateNumbertIndex bTravellingModDirMenuClassNamebForcedbDrawFullPathsBigStepCurPos__PositionChanged__Delegate BindAliasbAutoRefreshBrowser DamageType MotionFramebValueReadOnlyHitDir BindAliases DragSound Display98 BioRifleComboTickBlurry SizeFrame MenuTitleXstrYstr ErrorMargin HeadRadiusOptionalObj_1OptionalObj_2 DefaultColorLocalMessageClass__OnTimer__Delegate!__OnDesignModeKeyEvent__Delegate bWasActive__OnMultiSelect__DelegateResY HasWeaponQPage Floating__MoveGripBy__DelegateVehicleRecordcntGetEnumInList BlackColor BaseGunTechAdrenalineReady ClassType BindKeyValue checkBoxX_dLocalizedBindKeyNames accumData AmmoClass SelectImageNewToolTipTextMidY ParentIndexB NewHeight MenuClasspIndexAvail bTrackMouse TextHeightPhysics ImageWidth bShowJoinMainMenuOptions2K4MenuSounds bAutologin bPlaying TargetIndex DoCounterAnnouncerRecord ImageHeight LastPressY RealHUDScale ListClass FallBackRes KickWarning__OnPreDrawCaption__Delegate TabOrders Animating PrefixOffsetiKey OutArray__GetItemHeight__DelegateComboTickFocused PendingTab ImageDimsbCaseSensitiveYourArrayIndexImagePortionX1 checkBoxX_wMNamesfirstImagePortionY1 GraphSlide__FormatValue__DelegateNewRenderDevice AnimScaleDamagecolorHighlightoScaleLockedNewFavfbHUDAlertSlowImagePortionX2 SourceTree CloseKey combocountLastRenderTimeSaveModulationRecsgrowing__OnShowList__Delegatetest1 bIsCinematic AssaultRifle ShockRifle DamageFlash EmphasizedImagePortionY2bResultCoords TimeDilationForwardmURL bNoToolTipsGUINumericEditToolTipGUIFloatEditToolTipselect3VAlign cMySpinnerParentNode SniperRifle NewBuddyName InTooltip ParentIndex ChildIndex TravelTimeXAxis FlagTarget LastPressXDrawDebugSphere IPBannedYOffsetbShift__AddBuddy__DelegateHitRowbNoSortpRatebDup VisibleCount bNoRecurse FadeInTimeNewElempulseArmorIcon ArmorGlow__NewOnButtonClick__Delegate RestoreMenusCurVehicleHealthLastVehicleHealth LastEnergyLastDamagedHealthLastDamagedVehicleHealth__OnHover__DelegateTime bShowAll VehicleNameVehicleNameString PickUPTime AnimTimeScalingOldPawn ActiveNameRealPawnOwner bShowLeaveNodesAVehicleDrawTimerULGUIMenuOptionToolTipVLRLevelLowHealthPulse InfoClasses FloatBoxbRequireValidIndexOnRenderCountAnnouncerMale2K4 StrHeight NewControls checkBoxX_pComboTickWatchedBarWeaponStates__OnExecAddFavorite__DelegatepulseHealthIcon PageClassMaskVCR PreDrawCountTreeScrollbar bSkipCleanupGUIListBoxBaseToolTip DistanceBotDifficultySelectedItemsParam__OnHideList__Delegate MainMenuNewPosXLines growScale ShieldGun testLerpDisconnectMenuClass PageOwnerSessionBannedbInteractiveMode PrefixWidthBindAliasMaskbWindowsMouseAvailable eCellStyle bShowTalkNone bMSVerifiedIconFlashMaterialOriginalStyleNonebFixedMouseSizeNoneNoneNoneNoneNoneNone AllowOpenNoneNoneNoneNoneCheckFirewallAuthroizeFirewallNoneNone CheckForECE bECEEditionNoneNoneNoneNoneF_W @D#F@f a3b3 DnLf *<}#nLnLnLnLnLZZ}#}#}# unLnLnLnLZnLnLZZZnLZnLZZZZZZZZZZZZZZZZZZZZnLZZZZnLZZZZZ ߢ(a u}#}#ZZ}#nL}#nL NHF$?yE$?oF"C"XyJm"y*F_H O1l}Y2 &H OIEpRJw'% Z'% '% '% '% '%  NFF]XInterface.GUIListF_W3`y?RZ#{I Fu*F uu*F uu*F uu*F uu*F uu*F uu*F uu*F uMMMM"MMu*Fu*F uu*F u3}MMMMMMMMMnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLu*Fu*F uu*Fu*F uu*Fu*Fu*F uMMMMkh:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM""""""""/$q,ǰڌڌ/$1c1c i NII" hJ"tI"FYU??????????IY XNYNZN[N\N]N^N_NaGY   IUiJXInterface.STY_RoundButton!XInterface.STY_RoundScaledButtonXInterface.STY_SquareButtonXInterface.STY_ListBoxXInterface.STY_ScrollZoneXInterface.STY_TextButtonXInterface.STY_PageXInterface.STY_HeaderXInterface.STY_FooterXInterface.STY_TabButtonXInterface.STY_CharButtonXInterface.STY_ArrowLeftXInterface.STY_ArrowRight!XInterface.STY_ServerBrowserGridXInterface.STY_NoBackground'XInterface.STY_ServerBrowserGridHeaderXInterface.STY_SliderCaptionXInterface.STY_LadderButtonXInterface.STY_LadderButtonHi"XInterface.STY_LadderButtonActiveXInterface.STY_BindBoxXInterface.STY_SquareBarXInterface.STY_MidGameButtonXInterface.STY_TextLabelXInterface.STY_ComboListBox XInterface.STY_SquareMenuButtonXInterface.STY_IRCTextXInterface.STY_IRCEntryXInterface.STY_ListSelectionXInterface.STY_EditBoxIWic[&] Keyc.]-, DescriptionF_[&] (F1)c.]76 View this help screenF_[&] Ctrl + Alt + Dc.]+* Toggles design modeF_[&] Ctrl + Alt + Ec.]43 Toggles property editor modeF_[&] [Ctrl +] Hc.]76 Toggles active/focused infoF_[&] [Ctrl +] Ic.]32 Toggle interactive modeF_[&] [Ctrl +] Pc.]MK Toggles full MenuOwner chains for active/focusedF_[&] [Ctrl +] Cc.]CA Copy MoveControl position to clipboardF_[&] [Ctrl +] Xc.];: Export MoveControl to clipboardF_[&] [Ctrl +] Uc.]HF Refresh the property window in the designerF_[&] [Ctrl +] Up/Down/Left/Rightc.]21 Reposition MoveControl using arrow keysF_[&] [Ctrl +] +/-c.]76 Resize MoveControl verticallyF_[&] [Ctrl +] Num+/Num-c.]:9 Resize selected component horizontallyF_[&] [Ctrl +] WheelUpc.]@? Set MoveControl to MoveControl's menuownerF_[&] [Ctrl +] WheenDownc.]EC Set MoveControl to MoveControl's focused controlF_[&]#" [(Ctrl + Alt) +] MouseX/Y+LMousec.](' Reposition MoveControl using mouseF_[&] (Shift)c.]?> Hides all design mode indicatorsF_[&] (Ctrl + Alt)c.]*) View focus chainF_[&] [Ctrl +] Tabc.]0/ Select new MoveControlF_[&] [Ctrl +] LMousec.]-, Select new MoveControlF_]$?E$?D$>_"b"Z X W V U g }U]GUI2K4.UT2K4GetDataMenuIT]GUI2K4.GUIArrayPropPageV]GUI2K4.GUIDynArrayPagezU]GUI2K4.UT2K4_FilterListPagerV]xVoting.MapVotingPagepV]xVoting.KickVotingPage|S]xVoting.MatchConfigPageOW]GUI2K4.EditFavoritePagedU]GUIDesigner.PropertyManagerTK^QHW]GUI2K4.UT2K4NetworkStatusMsgGW]XInterface.GUIQuestionPageF_`H?qQ2 zm`ˆ=ˆ='% ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=0 ND]XInterface.GUIComboBoxF_gH0E{E2 '% gL<ZZZZZ'% ZuUuUuUuUuU'% '% uUuU N+F_y9](S2  nLZ Na[VJ{QYV$>ZV$F_^V] SquareButton$ #=cCOvQQUrWYR$ #=fW_F_F_F_`E?zP2 Z`ytytytytytytZytyt" N?%$L?D]XInterface.GUICheckBoxButtonF_F_RF_g/]k2   nL NB*[""" "DW$CW$yE$=F_F_ Gr/;h2  ߢ(anL NL*@| *P { 4] UT2MenuFontz C*KI*dH*$u=yE$>F_`J?t1R2 dd`000000 ND]XInterface.GUIEditBoxF_{~3Qj3 M{n'WZZZ uZZZZZZZkh:ZZZZZZkh:ZZZ u uZ NuHIb*f*@@@`yE$8cSCF_F_rG{S8KG 2 o{n'W=W=W=W=W=WuJ=WuJ=W=WuJ=WuJ=W=W=W=WuJ=W=W=W=WuJ=W=W=W=W=W=WuJ=WuJZ uZ=WZ=W=W=W=WuJZ=W=W=W=WuJuJuJuJuJZuJuJ=W=WuJuJ=WuJ=WuJ=WuJ=WuJ=WuJ=WuJuJuJuJ=WZuJuJ=W=WuJuJ=WuJ=WZuJuJ=WuJuJ=WuJuJ=WuJ=WuJ=WuJ=WuJuJuJuJ=W=W=WZ NVHJ$ ף=jWjEF_{H6]P2 Yˆ={n'W000Hn&Hn'% 00'% '% '% '% '% '% '% '% '% '% '% 0'% '% 0'% 00'% '% 0000'% '% 0&&&&HnZHnZ&'% '% '% Hn0HnZ&'% '% '% 0&0&ZZ000Z00Hn0&'% '% '% '% '% '% '% &00000'% HnHn Nk"`$"m&NVjIOVdPV}E$u=CQQUEfW_F_{L50M2 k{n'WnLnL N}EcSF_IF:TN2 IDE8 Nr] TextLabelcSF_3R8w~2 3[d@/$/$!/$/$!/$ NF_H3`e2 0 ZZ u u u u NP/"B "A "] EditBox$u=OSPWjWDQyWFQFWEfW_F_F_ GF_Eh/F_KF_F_mF_I2[J]2  ZZ NcSF_Q8OJR2 =W uJuJuJuJuJ N] TabButton$=O6WF_{I?HGB 2 (-?^{Y]"ҽҽҽҽ""""o>>>Q "F_b9f Q3 uJkZ=W NF_F_toG`[?lS2 !`Q0珛Q0珛Q0珛Q0珛Q0珛0Q0珛Q0珛Q0珛Q0珛Q0珛Q0珛Q0珛Q0珛Q0珛 NY"j"'|"D]XInterface.GUINumericEditF_f u7^MU "f *<Z NH] UT2SmallFontH UT2SmallFontH UT2SmallFontH UT2SmallFontH UT2SmallFontH  UT2MenuFontH  UT2MenuFontH  UT2MenuFontH  UT2MenuFontH UT2MenuFontH UT2LargeFontH UT2LargeFontH UT2LargeFontH UT2LargeFontH UT2LargeFontE*@E@EP EP ELF*LFLFLFLF_*____rrrrreeeeeOF$OFOFOFOFSF$SFSFSFSFV" V V V F_F_x @B CFF_E @pYF_S}kF_C@F_]F_t'F_F_f!F_F_t@F_[M}$@?a$@@l ]|FF]XInterface.GUIScrollTextHFF_F_hABE\BF_A @F_IGF_}F_F_cxys)!bcs)q)O %_O 7O -k'O -b'O  GF_H @F_F_F_ox9dH2 3[d@oA1Z/$ NF_F_cG6f'!Yccf'e'f* GF_LF_F_oF_q7iK2 7: 8 nL}#Z}#}#}#}#}#}#}#}#}#}#}#}#}#}#}#}# uZZZZZ}#ZZ Nj$BnUkUeUK ]SliderCaptiontJ] SliderBar= SliderKnob$L z-so>L >L CbA=W=WnL u3}Zs NF_F_^h/KF_Z pF_F_tQAN8B6 Bd?tI=WJ%J%J% u3}cCcCcCcCcCcC uWi. u N]SV\TV[UVZVVYWVXXVnBSjWYVVZVU\VT[Vh:o`wB]MutantsB] InvasionpB]Last Man StandingoB] xMutantGamelB] InvasionuB]xLastManStandingS?"]ey'Y]V^V$?F_tLSP@l2 DCbAtI u3}Zs>L =W>L zm u3}Zs䶉 u3}Zs=W=WZ u3}Zs u3}Zsʘʘʘʘʉ u>L ZʘZZI F䶉 u3}Zs u3}Zsʉ u3}Zs u3}ZsZZ[-E ZZS1ZZY.Y.[-E ߢ(aY[-E  uY.Y.[-E ߢ(aXf[-E  uY.Y.[-E ߢ(a[-E  uY.Y.[-E ߢ(ap[-E  u^I^I u3}Zsʉ u u3}ZsZZZ u[-E ߢ(aY[-E [-E ߢ(aXf[-E[-E [-E ߢ(a[-E[-E [-E ߢ(ap[-E[-E [-E ߢ(a։[-E  u3}Zsʉ u3}Zs>L >L >L >L ʘ>L =W>L =W>L =W>L >L  NN ]ladder is now available.M ]ladder completed.L ]32You must create or load a profile before playing.K MCreate ProfileJ ]Manage ProfilesI ]QualificationH ]LadderG ]RosterF ] TutorialsE ]%$Create a new single player campaignD ].-Manage your existing single player campaignsC ]=$?v'IHF_F_o@SF_BH ^AMGzL>ʁ)3}3}3}3}3}3} i ~" NATK$@@JYn bl k q n p o _H `$PGa$?bcF_F_Th F_F_\wdF_NF_F_TgF_F_tF_F_e!F_F_tF_F_FF_F_CvKF_G#F_fF_F_F_F_DF_t`OO-p2 [-EtI     Z u3}Zsʉ u3}Zs u3}Zsʉ u u3}ZsZ    Ny'Y vRwRxRyRzR{R$?F_F_jF_P LnL nLnL L> uu*Ft?ҽL>ҽL>L>L>L>nLzmzmzmzmzmzmzmzmzmˆ= 3[d@,KGZ⤉ uL> uL>L>L>L> dd0dd0!Q0珛 Z u uu*Ft?nL Nd ]Rightd Hiddend Leftd Centerh ]Redh BlueN:c CBML]BioK] 3D View'YwTxTyTzT{T|T}T~TT@UAUBUDful~l$>$Q8?N'^RF_F_F_F_eF_F_} PF_qs GuF_UF_F_a#zPMWkB6 se>' z-sozmˆ='% '% '% zmZ&'% Zzm&&'% &'% &&'% &'% &&'% &'% &'% &'% &&'% &&'% &&'% &&'% &&'% &'% &'% &'% &'% &'% &&'% &'% &'% &'% &'% ߢ(aր%  ր%  ր% ߢ(aր%ր% ߢ(aZր% ߢ(a,KGր% ߢ(aր% ߢ(a,KGzmzmzmzmzm&'% &'% u u3}zm uzmˆ='% zm&'% &'% &'% &'%  Nn]No information available!'Y#hTiTjTkTlTmTnToTpTqTrTsTtTuTvTm`n`$>$E?F_F_F_F_w @F_JDzZJx:u6 Vh(z-soZzmzmzmzmzmzmzm u u u u uzmzmzmzmzmzmzm u u uzm u u u3}zm u u u3}zm u u u3}zm u3}zm u3}zm u3} u3} u3} u3} u Zn Zn Z u Zn Zn Z unL Zzm u3}zm u3}zm u3} u3} u3} u3} unL Z ZZ uzmzmzmzm Z Z Z Z Zzm Z Z uzmzm u uzm u3}zm u3}zmzm Zn Z u3}zmzmzm Zn ZnL u3}zmzmzmzmzmzmzmzmzmzmzmzmzmzm NZ]LowestZLowerZLowZNormalZHighZHigherZ Highest'Y~NN@OAOBOCODOEOFOGOHOIOJOKOqe$>$p=?F_F_@ F_F_X$@@C R=F_XF_FzZLY86 ^l z-soZEiZ Z!!Z Z Z Z! Z!ZzmZ&'% Zzm ߢ(aր% ߢ(a  ր%  ր% ߢ(aր%ր%Zր% ߢ(a,KGր% ߢ(aր% ߢ(a,KG&'% Z&&'% &'% zmzmzmzmzm!zmˆ='% '% '% zm&'% &'% u u3}zm uzmˆ='% zm&'% &'% &'% zmzmzm! Z Z Z Z! Z!! NO]NoviceO AverageO  ExperiencedO SkilledOAdeptO  MasterfulO InhumanO Godliken]No information available!'YFTGTHTITJTKTLTMTNTOTPTQTRTk`l`$>$E?F_F_\F_[F_W@F_NL>#L>#L>#L>##L>#L>xL>L>xL>xL>xxL>xxL>L>,KG&'% qY ZҽL>L>L>L>ҽ&'% &'% &'% &'% &'% &'% &'% &'% &'% &'% &'% &'% qY&'% qY Z u&'% ZZMj#qYԌqY Nr:c CZB`A'Y FVGVHVIVJVKVLVMVOf$>$p=?N'IRF_z[BtF 2 J%z-so NR]Querying Master ServerQ]Authentication FailedP]Connection Failed - RetryingO]Connection Timed OutN]Query Complete!M]Refresh Complete!L]ReadyW$>$Y?F_F_A F_Lt7N?L2 L [knLnLnL Nj$?c;W$A] SquareButtonC6PF_F_sF_F_F_F_p@F_F_XF_F_E@F_kF_F_bAr.iP~8 )r.)q. G-zOLUl~2 wT;3z-soZZ^kLs3[d@3[d@3[d@ZZZfȺ3[d@3[d@3[d@3[d@3[d@&'% 3[d@&&'% &'% &'% &'% &&'% &'% &'% &'% &&'% ߢ(a&&'% ߢ(a 3[d@ ߢ(a3[d@3[d@ u u_#,_#,_#,&&_#,&'% &_#,_#, uGGG&&G&'% &GG u&&&'% &&'% &'% u_#,&'% _#,_#, uG&'% GG u&'% nLnLnLnLnLnL 3[d@ ߢ(a3[d@ N'Y%uSvSwSxSySzS{S|S}S~SS@TATBTCTDTETtl$>$E?F_F_F_F_oF_F_ uPF_k"F_>sMV/M6 3Y.>L u3}Zs u3}Zsʉ u3}Zs u3}Zsʉ u u3}Zsʉ uZ    ^I         ߢ(a7' ߢ(a ߢ(aXf ߢ(ap ߢ(a Nu]Click to play tutorial forW'Y!VPWPXPYPZP[P\P]P^P_P`PaPbPcPdPeP$>$E?F_F_cF_F_TF_F_F_F_m F_F_bF_F_a(@F_{h2O2 `{n'WnLnLZ ߢ(a ߢ(anL ߢ(a ߢ(a ߢ(a ߢ(aZ ߢ(a ߢ(a ߢ(a ߢ(a ߢ(anLnLnLnLnLnLnLnL NbK*%$?o$z] UT2MenuFontHG] TextLabelq*@}E^E'`]E$>$>$?$$E?F_F_GF_F_]F_LF_ uPF_fF_F_X5F_F_m@F_F_]#F_F_aF_F_w F_F_WF_P F_{u#F_p-F_F_W uP F_UF_lF_i @F_zVJP$p=?F_F_D @F_IFx6kD2 y4J''% uU Nl ]|k "@$>}$@?a$@@+$Wy)F'yEf'y_F_F_F_R3HC3 '{n'WnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLZnLZZnL NKUcF_JdA|=t2 (|;J%-?^-?^-?^ZL [kZa-?^-?^L [L [kZa-?^L [L [kZa-?^o<-?^o<-?^pN*-?^pN*kk k k k k  N'Y_ShSF_F_LF_F_? h/F_@F_F_ZHF_F_vhF_F_ZF_F_x!F_F_V  F_^ F_F_F@F_\5`@~2 HmYnL N^] B*t $B%$ff>\\] UT2MenuFont[$L>ZF_F_O@F_b.F_G G F_F_]F_Q F_F_lF_F_|F_F_J F_F_CF_F_`F_F_oF_F_cF_F_j\)p"hYw * -cF稨# # # #AJShowPanel() 9T-\)!NFaE-\) GF_y@F_K$E?F_F_@ F_F_G@F_YF_m*F_yF_rF_F_\@@E b=F_Y+F_F_@F_I$>F_F_` @@F_HEF_@@F_P zegcu) $ҽҽҽҽҽҽҽҽҽҽҽҽ3}ҽҽ3}ҽҽҽҽҽҽhhqYԏ3}hqYԄҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ uhҽҽҽҽҽҽҽʁ) uҽҽҽҽҽҽҽҽ u uzVGBҽҽҽFݏ3}F݄ҽ3}ҽҽҽҽҽҽF݌F݄ҽҽҽҽҽF݉ uF݌F݄ҽҽ u u8f u8fhh uF݌F݌F݉ uF݉ uF݌F݉ uFݏ3}FݑzVGBzVGBzVGBhhhhhhhhҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽhҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ i N_ e$ Af$ A~=]UT2003Fonts.jFontMono800x600k$>w= LOADING...x]PAUSEDB>]UT2003Fonts.FontMediumd] won the match!e]! Press [Fire] to join the match!AW]Press [ESC] to close menuf]You've won the match!g]You've lost the match.@>] Now viewingqB]ScoremB]'&Press Fire to View a different PlayerzRJiAZ"""@ "@F_$@?$?$?""$?*F_Z"""@ "@F_$@?$?$?""$?*F_ Z"""@ "@F_$@?$?$?""$?*F_ Z"""@ "@F_$@?$?$?""$?*F_ Z"""@ "@F_$@?$?$?""$?*F_ Z"""@ "@F_$@?$?$?""$?*F_ Z"""@ "@F_$?$?$?""$?*F_ Z"""@ "@F_$333?$?$?""$?*F_ Z"""@ "@F_$333?$?$?""$?*F_ Z"""@ "@F_$333?$?$?""$?*F_ Z"""@ "@F_$?$?$?""$?*F_ Z"""@ "@F_$?$?$?""$?*F_ Z"""@ "@F_$>$?$?""$?*F_ Z"""@ "@F_$>$?$?""$?*F_WIE>]UT2003Fonts.FontMediumx=]UT2003Fonts.FontEurostile37x=UT2003Fonts.FontEurostile29x=UT2003Fonts.FontEurostile24x=UT2003Fonts.FontEurostile21x=UT2003Fonts.FontEurostile17x=UT2003Fonts.FontEurostile14x=UT2003Fonts.FontEurostile12x=UT2003Fonts.FontEurostile9x=UT2003Fonts.FontSmallTextn"n@nnn nnnn@l"l l ll@lll lF_F_[%F_F_xF_F_mF_ |T@h>V F_{NBSEq2 pN*{Y]-?^|;"-?^"-?^-?^"-?^"-?^ NVY% Player NameScore Stats IDPingNY{.>G=G=G=F_F_F@F_F_M#F_z[Lx7@2 7sz-so&&'% &'% &&'% &'% &&'% &'% &'% &'% &&'% &&'% &&'% &&'% &&'% &'% &'% &'% &'% &&'% &'% &'% &'% &'%  N'Y STTTUTVTWTXTYTZT[T\T$>$E?F_F_KF_F_uF_F_}F_F_XCh/F_F_t6cf2 yt N`Q`Q`Q`Q`QbG ] CheckBoxcF_F_SKuS:}4`2 {,uUZCngK'*ZCngK'*CngK'*ZRnidRnidZCngK'* NyF" qGzPsG|PLG{PnG}P$l sl l l ft/uT;3l =W^Il ft/urS2sl T;3l &'% l Zkh:Z^IZl l l T;3l sl l  Nn= Select Mapq]21Choose the starting map and game type to play...u= Game Rulesw]$#Configure the current game type...w ] Mutatorsv ]-,Select and configure any mutators to use...u ] Map Listt ]'&Configure the list of maps to play...s = Bot Configr ]32Configure any bots that will be in the session...x]Playerz]! Configure your UT2003 Avatar...yS'EPY'ED'Y DRERFRGRHRoh$?F_F_t@F_WF_F_@F_F_@F_F_a @F_F_@F_F_CKeF_S F_F_X Ro|(! tX |(A)$-XE)D)qre* Ro%Ro7|(VveRo|(Vv G{n3zd2 Q0珛{n'W0000t0nL00000000000tttt N`&Rv_SUt]0Y"j"'|"}E$u=CQQUvy'Q~PF_F_F_F_yF_s'F_m' F_F_B @F__0F_KF_zQMd5C6 dXphz-so Z Z Z!! Z Z Z!! Z!! Z Z!!! Z Z Z Z Zzm!!! Z Zdddddd Z Z- =1dd- =1- =1ddRя ZRя!RяZH =Ke>' e>' Z Z Z Z Z Zzml zmzm Z Z!!!dd- =1dddddd- =1dd ZRя!Rя Zdd0dd0dd0 N'Y5vOwOxOyOzO{O|Oc`}O~OO@PAPBPCPDPEPFPGPHPIPJPKPLPMPze$>$E?F_{HFyDm2 Yh5${Y]""ne@ Z NVY  Buddy NameNY?V F_F_pF_GF_ZF_F_Q F_F_F_F_F_F_F_F_IF_F_KF_F_coonmF_DF_F_PF_"[H^ f4" NN] SquareButtonE*EEE,,,,,F_>pMz1J2 kgh>L &'% =WCbAZ&'% ZI FI FI F&'% ʉ u3}Zs u3}Zs&'% u3}Zs u3}Zsʉ u3}CbACbA&'% dddddd  dddddddddd u3}Zs/$dddddd  ddddddddddZ&'% &'% &'% =WCbA=WnLCbA&'% &'% ʘʘ*t%[CbACbA NH]NoviceH AverageH  ExperiencedH SkilledHAdeptH  MasterfulH InhumanH GodlikeD"C]b`You are about to delete the profile for '%prof%'||Are you sure you want to delete this profile?'Y)~UrUsUtUuUvUwUxUzUyU{U|U}UU@VAVBVCVDVEV$>$E?F_F_r3F_>rMs/L2 [iq,o>L ˆ=ʉ u3}Zs&'% &'% /$/$&'% /$/$&'% /$/$&'% /$/$&'% &'% /$&'% /$/$&'% /$/$&'% /$/$&'% /$/$&'% &'%  =W u,KGZiq,o ,KG&'% ʌ/$⤘ ߢ(aʘ ߢ(aˆ= ߢ(a ⤘ ߢ(a⤘ˆ=ˆ=ʘˆ=⤘     nL⤉ u3}Zs ߢ(aZ&'% &'% ˆ=ˆ=ˆ=ˆ=kkkkk Nn]No information available.w]StatsW'Y ZW[W\W^W_W`W]WaWhWoWvW}W~W$>$E?F_F_DF_F__@F_F_jF_F_F@@YLF_F_F_S@F_F_F_IF_NF_ F_F_F_M@F_o;r}6Zt?h:u*Fu*FZu*FZMڌZsu*Fu*F uu*F u3}u*F u3}ڌڌڌڌڌڌвввu*FZZZu*FZu*FZu*FZZu*F uu*F uzהҽҽҽ- =1zVGBҽҽҽҽJ, ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽgcҽgcgcu*Fu*F uu*F uu*F uzהu*F uu*Fu*F uu*F u_ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu*F uu*F uu*F uu*F uu*F uu*F uu*F uu*FIPIP}LIPIPÖhu*F uu*F uu*F uzVGBu*F uu*F uhqJ;CqJ;Cu*F uqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;Cu*F u3}qJ;CqJ;CqJ;Cu*F u3}ZsqJ;CqJ;CqJ;CqJ;CqJ;CqJ;CqJ;Cu*Fu*F uu*F uu*F u- =1- =1- =1zVGBzVGB- =1zVGBJzVGBJ- =1zVGBzVGB- =1zVGB- =1zVGBu*Fu*FIPIPIP}LIPÖhhu*Fu*F uu*F uu*Fu*F uu*F uu*F uu*F uzה__u*Fu*F uu*F uu*F uzה____zה____zה___u*Fu*F uu*F uzVGBu*F uzVGBu*F uzVGBu*Fu*F uu*F uҽgcҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu*F u u u uu*Fu*F uu*F uzVGBzVGBJzVGBzVGBu*F uzVGBu*F uu*F uu*F#{u*F uu*F#{u*F uu*F#{u*FZMu*F uu*F#{@?±u*F uu*F#{@?±u*F uu*F#{@?u*F uu*F uu*F u@?u*F#{u*F u i T"S$>R]Added Server:Q]To Favorites!hT]Server is now fullE$ #C$u^I^IL>^I u uhq q^IIm?5Zhq q=WZ=W=WuJ=W u u N^ ]Video] ]65Select your resolution and change your brightness...\ ] Details[ ]HFAdjust the detail settings for better graphics or faster framerate...Z ]AudioY ]! Adjust your audio experience...x]Playerz]! Configure your UT2003 Avatar...X ] NetworkW ]-,Configure UT2003 for Online and Lan play...V ] ControlsU ]Configure your controls...T ]InputS ]"!Configure misc. input options...R ] WeaponsQ ]/.Adjust your weapon priorities and settings...P ]GameO ])(Adjust various game related settings...D;]HudE;]Customize your hud...F;]SpeechG;]Bind messages to keys...yS'FPY'FDZ'FE'Y lRmRnRoRpR$?F_ d/oL@2 G ֖   N] NoBackgroundcCOF_F_D F_F_F_F_C/dF_ tsrqpF_F_F_@F_T9F_`F_F_Q@Y.F_~F_F__MF_F_mF_F_~F_ F_F_F_VF_F_SF_F_zF_F_`@F_F_fsF_F_5F_zaJk:v2 A[z-so fFp3: Z unL Z u Zh ZhZs ZZs Z u u ZZsZsZs+_ Z+_+_+_+_zmzm uu) uu) uu) uu)zm uu) uu)7: 8 uu)  uu) uu)7: 8 uu)  uu) uu)7: 8 uu)  uu) uu)7: 8 uu)  uu) Z Zh ZZs Z u ZZs Z+_u)u)zm7: 8 u)7: 8 u)7: 8 u)7: 8 u)  uu)nLzmzmZsnL Nv]Hiddenv  Cross (1)v  Cross (2)v  Cross (3)v  Cross (4)v  Cross (5)vDotv Pointerv  Triad (1)v Triad (2)v Triad (3)v Bracket (1)v Bracket (2)v Circle (1)v Circle (2)'Y'LOMONOOOPOQOROWOTOUOVOL`M`N`O`P`Q`R`S`$>$p=?F_F_F_F_VF_F_F_F_F_F_b F_F_F_F_XF_F_B F_zvM`/N2 6ez-sonLnL  zmˆ=0zm ZnLZZ~ נZnL u7: 8 u7: 8 u7: 8 ZzmZzmZ uzmzmnL u Zzmˆ=0zmzmzmzm Z uzm uzmzmnLzmzmzmnLnLnL NeJY~"@g"F_eY~"g"F_eY~"g"F_eY~"g"F_eY~" g"F_eY~" g"XF_eY~"g"XF_eY~"g"F_eY~"g"F_eY ~"g"`F_eY ~"g" F_eY ~"g"VF_eY ~"g"F_eY ~"g"F_eY~"g"F_eY~"@g"F_eY~"g"F_eY~"g"F_eY~" g"@F_c ] 16-bit Colorc  32-bit Color'Y!fPgPhPiPjPkPlPmPnPoPpPqPrPsPtPuP$>$p=?F_F_F_F_F_zYMP5D2 Mhq qz-so uZzm uzm uzm uzm u`ytdddddddddddd u Z unL Z udd udd udd udd u Zddddu*Fzmzmzmzm u udd udddddd u udd udddddd`yt u unLnLzmdd0dd0dd0dddddd ߢ(a u Z u N[]Modem[ISDN[ Cable/ADSL[LAN/T1O]#"http://ut2003stats.epicgames.com/gA]Your Unique id is:'Y NPOPPPQPRPSPTPUPFh]l$>$p=?F_F_kF_oF_~  F_F_SF_pF_OF_F_dF_F_TF_F_j(@F_F_ F_F_c@F_F_I@F_F_xF_F_L@F_F_KF_F_SF_F_F_F_oGF_F_F_F_F_F_yF_F_xF_F_}F_F_}&@F_F_F_F_c F_F_WGF_F_D@F_F_EF_F_WF_F_O@F_F_t F_F_j"@F_F_eF_F_F_nF_\F_F_OF_F_kF_!F_cpm!. -Z-O9?,cV-t. cEXInterface.GUILabelrt*稨Failed to create 9V due to problems creating GUILabel -]-9:} 9:$} $9:} 9:$} $9:N9:$N$9:N9:$N$t;c-QzIrtA/_-tpa-tA bIrtSmtSmSmt.} tMMt-u'zC WcEC/rW*Could not create requested menu componentC bEQWMM{-^- -Z-rWrWrrEW&D]W-v'Wsn&W-u'W-w-wEHt9:?9:$?$vQ GF_YjF_F_}$F_YF_PF_F_UKF_FF_F_F_F_GF_F_gF_F_F_F_UF_F_V@F_F_WF_F_W)i GF_ uPQF_I F_F_cF_IF_r#F_F_r F_F_W&F_F_@.@F_F_g@F_F_gF_gB;Ja/>HfFp3:gczVGB3}3}3}3}3}ҽҽҽҽҽҽҽҽzVGBzVGBJhhhh@qqYԨqYԨqYԨqY@qqYԨqYԨqYԌqYԌqYԨqYԨqYԨqYԄҽҽҽҽҽҽҽҽzVGBҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽzVGBzVGBJҽҽҽh̏3}̏3}hhqYԄҽhqYԄҽ uhҽҽҽhzVGBҽҽҽҽҽҽҽҽҽҽҽҽҽhzVGBhhhqYԖhqYԖhqYԌ\"\"\"3}ҽҽ3}ҽҽҽډډ u uhhhh,ehhzVGBhzVGBhzVGBh3}h3}hhhqYԖhqYԖhqYԖhqYԖhqYԖhqYԖhqYԖhqYԖhhqYԖhqYԏ3}3}3}3}ҽҽҽ u uzVGBH^Tʆ3}IPÌ=0H^Tʆ3}IPÌ=0 uu*FZ u uzVGB^-ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽ uҽҽҽҽIPIPIPÉ u- =1 u- =1zVGBҽҽҽҽҽҽ u uhҽҽҽҽҽҽҽҽҽҽҽҽ uhzVGB uhҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽzVGBzVGBhhqYԖh u uh,eh,eh̖hY! u- =1 u- =1zVGB u- =1 u- =1zVGB u- =1zVGBzVGB u- =1zVGBҽ3} uzVGB u- =1zVGB3}3}3}- =1- =1- =1- =1 u u u u u u uڏ3}3}3} i NYjm ZIZ"d"" "F_"""c "cF_"d"" "cF_""d"c "F_"d"d" "F_"""c "+F_"d"" "+F_"","c "F_"d"," "F_ """c "F_ """+ "cF_F_oQZ _Z"""* "F_$>$$U?""$?*F_oQ _Z"+"" "F_$>$$U?""$?*2@2F_oQ _Z"""b "F_$>$$U?""$?*2@2F_oQ _Z""p" "F_$>$$U?"U"2$?*F_QZ _Z"c"" "F_$>$$U?""<$?*F_Q _Z"c" " "F_$>$$U?""<$?*2@2F_Q _Z"c"" "F_$>$$U?""<$?*2@2F_Q _Z"*"" "F_$>$$U?"Z"#$?*ddF_uQZ _Z"*"" "F_$>$?$U?""$?*F_uQ _Z"""+ "F_$>$?$U?""$?*2@2F_uQ _Z"b"" "F_$>$?$U?""$?*2@2F_uQ _Z""p" "F_$>$?$U?""2$?*F_xQZ _Z"""c "F_$>$?$U?"L"<$?*F_xQ _Z"" "c "F_$>$?$U?"L"<$?*2@2F_xQ _Z"""c "F_$>$?$U?"L"<$?*2@2F_xQ _Z"*"" "F_$>$?$U?""%$?*F_JQZ _Z"""L "F_$>$\=$?5~?""$?*F_JQ _Z"""L "F_$>$p=>$?5~?""$?*F_JQ _Z"""L "F_$>$̌>$?5~?""$?*F_JQ _Z"""L "F_$>$H>$?5~?""$?*F_JQ _Z"""L "F_$>$>$?5~?""$?*F_JQ _Z"""L "F_$>$ ?$?5~?""$?*F_JQ _Z"""L "F_$>$\"?$?5~?""$?*F_JQ _Z"""L "F_$>$9?$?5~?""$?*F_JQ _Z"""L "F_$>$ףP?$?5~?""$?*F_KQZ _Z"""L "F_$>$\=$33s?""$?*2@2F_KQ _Z"""L "F_$>$p=>$33s?""$?*2@2F_KQ _Z"""L "F_$>$̌>$33s?""$?*2@2F_KQ _Z"""L "F_$>$H>$33s?""$?*2@2F_KQ _Z"""L "F_$>$>$33s?""$?*2@2F_KQ _Z"""L "F_$>$ ?$33s?""$?*2@2F_KQ _Z"""L "F_$>$\"?$33s?""$?*2@2F_KQ _Z"""L "F_$>$9?$33s?""$?*2@2F_KQ _Z"""L "F_$>$ףP?$33s?""$?*2@2F_HQZ _Z"""L "]F_$>$\=$33s?""$?*F_HQ _Z"""L "]F_$>$p=>$33s?""$?*F_HQ _Z"""L "]F_$>$̌>$33s?""$?*F_HQ _Z"""L "]F_$>$H>$33s?""$?*F_HQ _Z"""L "]F_$>$>$33s?""$?*F_HQ _Z"""L "]F_$>$ ?$33s?""$?*F_HQ _Z"""L "]F_$>$\"?$33s?""$?*F_HQ _Z"""L "]F_$>$9?$33s?""$?*F_HQ _Z"""L "]F_$>$ףP?$33s?""$?*F_IQZ _Z""'" "MF_$?$V>$?""$?*F_IQ _Z""'"I "OF_$?$A`>$?""$?*F_IQ _Z""" "F_$?$>$?""$?*F_IQ _Z""n"J "F_$?$\>$?""$?*F_IQ _Z""N" "|F_$?$>$?""$?*F_IQ _Z""P"L "jF_$?$q= ?$?""$?*F_IQ _Z""" "F_$?$?$?""$?*F_IQ _Z"""M "F_$?$333?$?""$?*F_IQ _Z"""K "F_$?$G?$?""$?*F_q q q q qq q q q dZ _Z""" "F_$ff>$?$U?"i",$?*F_MQZ _Z"c"" "F_$k>$$"_" $?*F_MQ _Z"c" " "F_$k>$$"_" $?*2@2F_MQ _Z"c"" "F_$k>$$"_" $?*2@2F_MQ _Z""p" "F_$k>$$""$?*F_ZZ _Z"""c "F_$k>$?$"" $?*F_Z _Z"" "c "F_$k>$?$"" $?*2@2F_Z _Z"""c "F_$k>$?$"" $?*2@2F_Z _Z""p" "F_$k>$?$""$?*F_Z _Z"*"" "F_$L>$?$"#"$?*F_ySZ _Z""" "oF_$>$$U?"R"7$?*F_gZDCO"$Q8>$?$""(*W"F_MWZDCO"$>$$U?"l"*W"F_UZDCO"$>$?$U?""_*W"F_^UZDCO"$>$?$U?""*W"F_kZDCO"$Q=$$""*W"F_lZDCO"$>$$""(*W"F_mZDCO"$Q8>$$"0"(*W"F_VWZ _Z"M"H" "F_$>$?$U?""}$?*F_VTZ _Z""H"G "F_$>$?$U?""$?*F_pZ _Z""l" "F_$k>$?$""$?*F_@VZ _Z"D"" "F_$>$?$U?"w"$?*2@2F_jUZ _Z"D"" "F_$>$?$U?"w"$?*F_WTZ _Z"D"" "F_$>$?$U?"w"$?*F_\TZ _Z"D"" "F_$>$$U?""$?*2@2F_\VZ _Z"D"" "F_$>$$U?""$?*F_WWZ _Z"D"" "F_$>$$U?""$?*F_z*{$?|$>UW$QX?ST$fff?ZU@ $> $>~ $H>} $>DT$?^ ^ ^ ^ ^ ^ ^ ^ ^ ^ T T T T T T UVa$ ף;b$33S?F_F_hXAxI rc,* C}.P  GF_FuYAzVHrc,* zM?|M@InternalC}S ~c,"getMuz~~{ C}S ~~ GF_O@F_F_sJGECdpS GF_F_F_F_F_0tS"!)0S"T"B .7,k. ,j. ,W .7,N .!, g.!, u .!, i9Dq9?,dB U9?i,2,k A-sW Ut9?,dj A-rN {og {nu {mEB mDZ EW mD^ ,E. ,,E. ,cc. , cc A-ubZh. , ZhA -  G"QEY ns" NN] RoundButtonHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontH UT2SmallHeaderFontH UT2HeaderFontH UT2HeaderFontH UT2HeaderFontH UT2HeaderFontHUT2HeaderFontE*EEE,,, ,,F_F_Q.F_F_@F_F_F_F_IB@F_^,t{VM=b2 u6RtIZZZZZZZ u3}nLnL NjC\yZ'uT 'YMRNRORPRQRRRSRTR$?f'uLF_F_^7@F_F_sF_F_BF_F_e+@eF_jv@dF_}@F_F_F_F_SF_F_@F_F_l F_F_Y$@F_F_@F_F_BWODF_` F_F_bMF_F_JF_F_@F_F_{F_F_JF_F_nF_F_j@F_F_F_F_SF_F_tDF_F_@F_F_F_F_}F_F_eF_F_R@F_>dMe3F2 WX$>L nLnLnLnLnLnLnL*t%[*t%[nL*t%[nLnL=WnLCbACbA*t%[*t%[*t%[*t%[*t%[*t%[*t%[Z*t%[*t%[*t%[*t%[ʘ m`Um`Um`Um`Um`Um`Uր%ր%   Z,KGތ~*m`Um`U ߢ(am`U ߢ(aր%X$ʘ*t%[*t%[*t%[*t%[*t%[*t%[*t%[*t%[*t%[ u3}Zs*t%[*t%[*t%[*t%[*t%[*t%[ NF_F_W@F_F_~F_F_2F_XSv'\NQF_F_pF_F_FF_z,B  G>qMk0K2 p`Ƕ+>L ZZ=WCbAG ֖G ֖00000 u3}ZsZZZI FI F u3}Zs00G ֖⤘ˆ= u3}Zsʉ u3} u3}Zsʉ u3}Zs=WCbA=WCbA uZZZI F00ˆ=ghG ֖ZG ֖G ֖0000=WCbA=WnLCbA=W=WnLCbA`000`00`^InLnLnLnLnLnLghˆ=ghˆ= Ns ]Player@]Team]Gorge~]TeamSymbols_UT2003.sym}"|]*)Profile with name %prof% already exists!{]Profile creation failed.'Y'OWDWFWHWJWPWKWQWRWSWLWTWUWMWNWWWVWYWXW$>$E?F_F_@F_|b?@t2 VcC|; u3}-?^k k k k k -?^-?^-?^-?^-?^-?^-?^-?^-?^-?^=W=W-?^=W-?^-?^Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd?Bd? NF]Query Complete! Received: E] ServersC]Pinging ServersB]21Upgrade available. Please refresh the News page.y]Pinging Complete! w= Servers, v] Playersu] RE-PING LISTo] REFRESH LISTF_F_C)F_F_EF_F_eF_F_sF_F_WF_F_@F_r>F_e>F_F_ZF_F_hF_TF_mF_XF_IF_F_F_F_TF_F_PF_TF_z$@F_TGF_wF_F_t@F_VGF_\!F_F_O@F_a0F_Q@F_F_@F_F_pF_F_GF_F_wF_F_}F_F_j;F_F_o@F_^0F_RF_F_i;F_F_K@F_k&F_j F_F_KF_F_q F_F_[F_F_@7F_F_z:F_F_{F_F_O F_F_gF_!F_F_F_\F_F_T F_F_e)F_F_Pi@F_F_U F_F_YF_F_V F_F_F_F_qF_F_wF_F_e @F_F_MF_F_~reF_F_F_KF_F_lF_F_F_F_d F_F_g F_F_F_F_IF_F_U/F_F_Fb@F_F_tF_F_o F_F_\pF_q'm`9  GF_rF_F_QF_F_y F_F_@F_F_iF_|F_T F_F_F_F_M}F_F_@F_F_K( F_F_F#F_F_w F_F_nF_F_]F_F_F_s F_E F_F_F F_F_WF_F_fF_{x1HB2 H OI{n'WFX-̟uUFX-̟nLFX-̟FX-̟FX-̟nLFX-̟FX-̟FX-̟FX-̟FX-̟FX-̟FX-̟uUuU NfJ] ListSectionp,\cS}E^E'H ]EHF] NoBackgroundCQQUCF_F_gIG I 6s}KG 8rG * f%f,hrfG *6sfN9DfG wfG *6HfyfG f? GF_RF_F_@@F_F_@F_F_@F_F_n.@F_m/F_N @F_n/F_F_F_P F_F_F_F_hIR @`zw-0R ,N0R &N0R %N0R ,P0R &P0R %P GF_@F_F_O=F_F_LF_F_dCV(!(>dV(Y(;{gvS| bgvV| GF_nF_F_N'F_F_h F_F_h5 jF_FJwF_j@F_F_x@F_F_F_F_@F_WHF_XF_Hnm0bJ^2 c zNCHn N`F"F_F_o$F_o:s@ f *<@E NF_F_SJF_F_kF_F_[@F_F_VdF_F_QF_F_F_gF_F_F_F_WF_F_k4F_F_F_F_t F_F_h@WQDF_FF_F_ccF_!F_V @F_F_F@F_LDF_[MF_F_v@F_F_p=F_F_jLF_F_cduv*!$L5-kt-Wr-Wr(cv*t*-Wr-kt GF_lF_*F_X F_F_FG@F_~FtxVn=e2 MB ]tIZ u u3}Zs u3}Zsʉ uZZZnL uZnL uZZ u3} u uk&D2k&D2k&D2nLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnLnL u- =1 u3} u3}ZsnL u3}  u3}nLnL NbN= DISCONNECTM] FORFEITe MSERVER BROWSERL$q=>K$ #=J$ ףG$?IS\^'YURVRWRXRYRZR[Rd`F_F_@F_F_~ F_F_F_F_UF_F_@F_twVV>f2 ' ft/uT;3e>' =We>' ft/urS2XphT;3Xphe>' &'% e>' &'% e>' &'% e>' &'% e>' &'% e>' &'% e>' &'% e>' Xph u uZZe>' e>' XphT;3e>' XphXph Nn= Game & Mapq]21Choose the starting map and game type to play...u= Game Rulesw]$#Configure the current game type...d ] Mutatorsc ]-,Select and configure any mutators to use...b ]Servera ]+*Configure all server specific settings...` = Bot Config_ ]32Configure any bots that will be in the session...yS'H P'Y \R]R^R_R`R$?F_F_M @F_F_pF_F_[-@F_F_`b@BU%F_DF_q=QzP Nl@Eq,ǰҽҽҽҽҽ T*F_F_|@F_F_JGF_F_LF_F_z*F_F_BF_F_@F_b3F_XF_F_uF_F_zF_F_F_F_R F_>F_] F_>F_rF_F_0'b'! -C'.%.%.%.L%'x 'i.o%.%.%.L&.L%'k.p%.%.&.L&.L%'iy'i~ ''kf 'kG'Q.,.&Q ^Gd0b'a'-CE.%.&)DWE.&.&)DbE.,.&)DB E.,.&)DF E.,.&)DJ -C' GF_F_F_F_F_S F_F_f$@F_y8F_CF_F_VG?]*' GF_F_F_dCP fp;cIw>j h-fFp3: u- =1- =1J- =1- =1ҽҽҽҽҽhV u uzVGB i Nl ZDCO"$u>$?$ #<"j"P*W"F_l DCO"$u>$?$ #<"x"P*W"F_iZDCO"$L>$?$U?""Z*W"F_nZDCO"$Q8>$$"0"(*W"F_\RZ _Z"""c "F_$>$?$ #<""$?*F_\R _Z"" "c "F_$>$?$ #<""$?*2@2F_\R _Z"""c "F_$>$?$ #<""$?*2@2F_ZRZ _Z"c"" "F_$>$?$ #<""$?*F_ZR _Z"c" " "F_$>$?$ #<""$?*2@2F_ZR _Z"c"" "F_$>$?$ #<""$?*2@2F_i Z _Z""" "F_$=$?$ #<""<$*dd F_i _Z""" "F_$=$?$ #<"Z"<$* F_h*c*b*a$ #<`$ #<_]LINK ESTABLISHEDF_F_@F_F_[@F_F_A F_IF_Y F_F_@F_F_cF_F_Y F_F_@F_F_`DF_jF_F_hF_F_AF_F_iF_F_eF_F_NeF_O@F_aF_F_PF_F_F_F_OF_F_NF_F_mDF_}qF_"F_K F_F_F_F_F_F_F_F_F_F_IF_F_^F_*F_@F_F_F_F_F_F_uF_F_[F_F__?F_>F_U F_F_IF_F_ZF_F_a F_F_JF_F_YF_F_F_F_X3@F_Z3F_[ @F_[3F_z)F_F_A@F_F_F_F_\ @F_\3F_wF_F_` @F_]3F_F_F_F_F_YF_F_yF_IF_@F_F_F_F_F_F_@F_F_eF_F_xF_}yMc8P2 !q 7@)}B<ytˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ=ˆ= N['q W'Y _V`VaVbVcVdVeVfVgVhVF_F_F_F_D$F_F_bYF_F_C$F_F_F_F_F_F_G F_F_{F_F_{ F_F_NuPcF_F_F_v F_F_HF_,F_F_F_kF_7F_F_]F_]KF_F_qF_F_F_F_F_F_F_F_F_F_rF_F_mF_ F_F_F_M F_F_F_F_F_F_O F_rs3e2 R  r N`F"] ComboButtonASWF_F_vF_ F_z @F_F_G&@F_F_N F_7F_VF_F_F_]F_F_F_m@F_F_F_F_@F_F_F_F_F_F_F_F_F_F_F_F_UF_F_F_F_F_F_M5@dF_n#F_F_FF_F_F_F_T@F_F_l @F_F_F_F_j dF_q F_F_UF_B_ORGq:@s t_Bp /$/$/$/$/$/$/$/$] A] A]] A] A'] A] A] A] A] A] A] Am`UQJQJm`Um`U''ҽ]m`U]]]ҽm`UZs] AQJҽ] A3}Zs]]]]m`U/$ i L *O *N *@@M * O i-VSi  AccuracyiAggressivenessi Agilityi TacticsN= Loading...F_F_jF_F_F_F_QF_F_F_F_b[@F_F_X]G'F_F_F_F_F_F_t[OSAu2 ~ נtI u u ߢ(aZZ u u u u uZZZ ߢ(a ߢ(a u uZ N{ ])((Original settings will be restored in z ] seconds)y ]21(Original settings will be restored in 1 second)f*'Y DSESFSGSHS$>$>j'~ v F_F_F_F_F_F_VF_F_QF_F__ @F_F_F_F_H@@CF_WF_F_L@CF_XF_F_~@F_F_F_F__F_F_TDWF_tF_F_^ @F_F_HF_F_eF_F_|F_F_BF_F_GF_F_w@F_F_F_F_vF_F_KF_F_F_F_`F_F_U6X6o GF_F_F_xF_F_QF_DbF_vF_F_K6^'S-bE^' GF_cF_F_EF_ F__'F_g F_wF_!F_sF_F_iF_!t]Ot@s2 ltI u uZZZFmFmFmhq q Z ZFmhq qnLZ u NS'lc 'Y |R}R~RR@S$ff>$ff>F_F_MF_F_B F_ F_qF_ F_P@F_F_oF_F_{F_F_@F_F_F_F_TF_F_RRr/%%3b Cx\ GF_F_F_F_F_HF_F_{F_F_F_RnV:}Kc2 |ĠRnidZ NF_F_F_F_@F_F_|F_F_@F_nHF_\F_F_]@@F_F_AF_F_CF_F_r@F_G/F_ZB|'F_PLkbF_OEF_F_F_F_NF_F_YF_F_F_F_rF_sF_WF_^F_F_F_r @pF_boF_F_t@F_F_{F_fF_W@F_F_^@F_F_gF_F_[F_F_aF_F_RF_F_F_F__@@F_F_l@@F_F_aF_F_bF_F_x@F_F_@F_gHF_F_F_jF_F_bIuK(F_[cF_F_[hF_F_F_F_F_F_@qF_F_F_F_J@F_HnT:iJb2 rHn N`F"] VertUpButtonF_F_k$F_F_kF_F_F_F_YF_F_@F_W(F_F_F_IF_F_WbF_F_|F_F_CF_F_FmF_F_^ @F_F_~F_F_CF_F_BF_F_@F_F_F_F_h @F_F_J F_F_MF_F_@F_F_F_F_q F_F_F_F_NF_F_F_F_F_F_8F_F_sF_ F_y@@F_F_R@@F_F_V@F_F_@F_@HF_hF_F_RF_F_Y F_F_QF_LF_F_F_EF_F_YF_LF_bF_F_`F_F_dF_F_kF_F_F_F_@F_taCh6p2 eR^tIddk&D2Zdd0 N'Y FQJQHQIQGQ$>$>F_F_yK GFQ:YBF2 gL$>F_F_F_F_F4F_ F_I F_F_oF_fF_F_F_p@F_F_~F_F_F_F_wF_F_h@F_F_x3@F_{3F_u F_F_F_F_~F_F_C!F_F_F_F_bF_F_l F_F_NEF_F_o@F_F_j@F_lGF_^;F_F_F_Vf@F_F_eb@@BF_F_IF_dF_F_h3@F_i3F_yF_F_ewF_F_F_F_PEF_F_F_F_YwF_F_x@F_F_{C YXVUTSRQPOF_@F_F_F_F_C@F_F_XF_F_P+F_F_WF_F_pF_F_QF_F_[@F_ZGF_@F_F_\F_F_YGF_F_hF_"cCc ^e\" NN] LadderButtonE*EEE,, ,, ,V"VVVF_F_xMI mhI 4Y 9?I q 9?I I Q.I _ GF_nDF_p F_}zMSQ6 Vbehb}B< Q0珛 Q0珛 Q0珛 Q0珛  Q0珛  Q0珛   ߢ(a |; |;zmzmzm   zm          zm       Q0珛 Q0珛 zmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmˆ='% zmzmzmQ0珛Q0珛Q0珛Q0珛zmzmzmZ NtTjVuTUBvTUEwTU|yTUYzTU\{TU]|TUa}TU|~TUeTU}@UU~AUU~,YPlayerPictures.cEgyptFemaleBAInterfaceContent.Menu.bg07"2K4Menus.Controls.menuBackground2 2K4Menus.Controls.popupBorder_b2K4Menus.Controls.editbox2_b['bmSQW'bkSF_F_x F_F_O)F_F_IF_F_F_F_F_F_IF_F_K F_F_iF_F_lF_IF_fF_^F_c@F_F_F_u~0]4Z2 oF.juUZCngK'*ZCngK'*CngK'*ZRnidRnidZCngK'* NSJyF" qGvPsGxPLGwPnGyP$=Cv'oNQF_F_L F_O3IV2 q?nLZ N~ "} "tJ]SectionHeaderBar]SectionHeaderTopCPF_F_@F_F_cF_F_DW GF_BF_F_T)#F_}@F_F_F_F_F_F_F_F_F_F_@F_F_UF_IF_|F_F_F_F_RN@dF_K*@F_F_zF_F_J/dF_^F_F_Wj@F_F_EF_m?DNd2]H^TʆY!- =1ҽu)zVGBҽҽzVGBҽҽҽu)ҽҽҽ- =1ҽҽzVGBҽҽzVGBҽҽҽzVGBҽҽzVGBҽҽҽIPIPÙ- =1- =1zVGBzVGBҽҽzVGBҽҽzVGBҽҽzVGBzVGBҽҽzVGBҽҽzVGBҽҽzVGBzVGBҽҽzVGBҽҽzVGBҽҽzVGBҽҽzVGBzVGBzVGBҽҽzVGBҽҽzVGBzVGBҽҽzVGBҽҽzVGBҽҽzVGBҽҽzVGB- =1ҽҽҽ- =1ҽҽҽ- =1 u- =1- =1zVGBzVGBzVGBҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽu)ҽҽҽҽҽҽ- =1zVGBҽ- =1zVGBҽҽҽҽҽҽҽ- =1zVGBҽ- =1zVGBҽҽҽu)ҽҽҽu)ҽҽҽҽu)ҽ- =1zVGBҽҽ- =1zVGBҽu)ҽҽ- =1zVGBҽҽu)ҽҽҽҽu)ҽҽҽҽҽ- =1zVGBҽҽ- =1zVGBҽҽ- =1zVGB3}ҽҽu)ҽҽ- =1- =1- =1- =1- =1- =1- =1- =1- =1 uzVGB3}IPÌ=03}3}Zs3}Zsʏ3}Zs- =1- =1- =13}ҽҽҽu)IPÌgcIPÌgc uҽҽҽҽҽҽҽҽҽҽҽҽҽҽ i smwvgbw]RANKx]PLAYERy]SCOREz]TIME:{]PING:cJ]P/L:|]DEATHS}]ADMIN~]NET]Elapsed Time:@]UT2004 Stats Match IDA]OUTEA]-, You are OUT. Fire to view other players.B]READYC] NOT RDYF]NOVICEF AVERAGEF  EXPERIENCEDF SKILLEDFADEPTF  MASTERFULF INHUMANF GODLIKEs= MAX LIVES:v ] FRAG LIMIT:F]PPHh]GAMEj] in r],+ You were killed. Press Fire to respawn!D ] Press [Fire] to continue!G]The match has ended.t]REMAINING TIME:H] IAgF_F_@@F_F_vF_F_D@F_q*F_e0uPcF_U@F_`0F_nF_F_GF_F_E@F_F_@MWF_$ pF_F_F_f@@F_F_\@@F_F_sF_F_@F_F_F_F_dF_F_r F_F_m#F_F_F_F_k#F_F_F_F_F_F_F_F_F_F_@F_F_aF_F_oF_F_Z@F_F_F_F_EkF_FF_u@F_F_pF_F_wF_ F_@F_F_HF_F_fF_ F_dF_F_F_F_F_F_zF_F_{F_F_JF_F_SeiDM$9:?9:$^?-o(?i? X$P-w-a'?$ $-a(9:^9:$9:^9:$CD[ $-T)u* C@+M  $r g g*r m B* !wE*E?? GF_@@F_F_@F_F_O F_F_I@F_S.F_TF_F_vbF_ F_[/F_F_F_F_w F_E/F_F_F_F_F_hcF_F_[@F_F_pbF_ F_MF_ F_NF_ F_OF_ F_PF_DbF_x@F_u$333?F_F_F_F_CMpF_F_F_c@F_F_PF_F__F_F_CpF_F_a@F_F_d@F_F_xb@F_F_qF_F_F_F_fF_F_V@F_F_@F_F_m@F_F_o@F_F_s@F_F_pF_ F_qF_ F_rF_ F_tF_ F_t@F_F_CZF_ F_J(F_F_xF_F_zF_F_F_F_{F_F_}F_F_`af -)a GF_@F_F_hl ]6a&N,P16s&N%6a&N,ZZ9?6s&N9?, 6a&N,Z GF_kF_F_AF_F_DF_F_M F_F_F_F_EF_F_FF_F_GF_ F_dfF_!F_IF_F_AJF_F_QtF_F_@@CF_K@CF_F_eF_^jF_{F_F_e(jF_k(F_F_g(F_m^Ok;r2 NS1mF܉ u3}Zs&'% &'% /$&'% /$/$&'% /$/$&'% /$/$&'% /$/$&'% &'% &'% /$&'% /$/$&'% /$/$&'% /$/$&'% /$/$&'% 3[d@ u3[d@,KGZZ u3}Zs⤘⤘⤘⤉ u3}ZsZMCbAZZZI FI FI FI FZZI FI F/$⤉ uZZI FI FI F          ߢ(a N~ ]#"Single Player | Trade Opportunity} ]10Are you sure you want to trade %old% for %new%?| ]-,You have been offered a trade for %player%.{ ],+Are you sure you want to cancel the trade?z ]BACKy ]$#This player is available for tradeb S'Y%x*M+\+],*`,B-b-h-w-L.[._.~.w.C/C.CWF_F_F_F_RF_F_F_F_F_F_r(]F_F_F_YF_F_D@F_F_TF_F_dF_F_[F_F_`F_F_aF_F_F_F_\ F_F_F_F_[ F_3F_g@F_F_f@F_F_F_F_F_F_YF_F_F_F_^bF_F_o3F_F_C F_F_F_CF_HF_F_n F_F_F_F_F_F_K@F_F_o@F_F_F_ F_F_F_@H: GF_AU>T6 GF_` U2\ GF_UwG F_F_F_aF_F_JF_F_^DF_FDF_GDF_HDF_NF_F_~J F_F_OF_F_PF_F_QF_F_RF_F_]F_F_C F_F_TF_F_n+eF_ZF_F_s BDF_q(@F_F_t/F_`F_F_~F_F_aF_ F_dF_ F_s@F_m2F_F_F_V)@F_F_S@F_F_zF_hF_eF_VKF_F_N @F_F_kY.`)F_H,/F_F_F_Kh/F_q@F_F_c,@F_F_i1F_F_FF_F_@F_X1F_BF_F_|BF_F_yBF_F_ZF_F_B@F_N1F_F_F_[*@F_|)F_{ uPyF_J@F_F_V-F_F_O@F_F_K F_F_H/KF_a-@uPF_@+@F_s*F_}bF_F_ycF_F_HF_F_lF_ F_RF_,qyVlMd2 J, q,ǰ N["[@[[[ [[XNMUT2MidGameFontx=YUT2003Fonts.FontEurostile17UT2003Fonts.FontEurostile14UT2003Fonts.FontEurostile11UT2003Fonts.FontEurostile11UT2003Fonts.FontEurostile9UT2003Fonts.FontNeuzeit9UT2003Fonts.FontSmallTextF_F_eF_F_KF_F_LF_F_aF_F_NF_F_F.F_F_MF_F_F_F_YF_F__F_F_nm h/F_F_F_F_F_F_F_dF_F_F_F_YF_F_\F_F_pF_F_^F_F_`F_F_F_F_n-s@c/d w=*=c( GF_cF_F_fF_F_lF_F_\@F_F_F_F_F_KF_YkF_F_kF_F_mF_F_CF_ F_JL@hF_{AF_F_k}@F_e.F_xF_F_wF_F_RLk{&F_}@F_l.F_F_F_@F_F_F_F_yF_F_aGF_F_F_}.@F_F/F_m@@WLF_@F_F_| F_F_F_~VtG_ Bp e] A] A] A] A] A] AQJQJQJQJP Nl i F_F_b F_,F_@ F_F_FF_F_GF_F_F_F_TF_F_F_F_T[F_F_@F_F_]F_t}Vx<`2 Mj#tIZIm?5&'% qYIm?5&'% Im?5 uIm?5L> uIm?5L>Im?5&'% Im?5Im?5Z N'YIRJR$>$>F_F_F_t|V}$>F_F_[F_F_lF_F_T.F_F_F_F_E@F_C0F_XF_F_UF_F_H.F_F_h@F_F_Z@F_F_[@F_F_lBBPp1 GF__J.u]rJ.*5-w3w~*~ uJ. -o'w m *jr m   m BD$ m CM@D$w=*=u GF_O0F_F_^LAB`Qw * m *39:?9:$D$Nw=*=B GF_cF_F_`IAfa&-v EF(u*' GF_dF_F_F_F_-F_F_bFADb&-v EF(u*' GF_aEB)36K  %(bxP3b' GF_F_F_F_F_z-F_F_s-@F_F_IF_ F_F_F_WF_F_T@F_\0F_CB@F_G-F_EF_F_aK@F_F_@f`K_:z6 uvoft/u Z! ߢ(a Z NR= Frag Limit'Y!g&j&t&x&M'c'I(n(B)J)G*a*^dfhdOeOF_F_Y-@F_Y-F_B /F_h@F_F_@F_n0F_ ^LAw(#[- K!S rA* K ppA: K v  !R `rA* K ppppA(AW ): K v  !Dv Tv%***K  !Bv  v XK vA GF_H/dF_K@F_F_@F_F_}0F_F_^@F_F_D)0"rR M++rec,-'c,-c,c,p"ppSTARTE.ut2?quickstart=true?TeamScreen=false?savegame=c, X('( GF_@F_YF_d/dF_4HE-! 4E-H-H. %j. &R.,m. ,m%.Laddershots.TeamDMShot e.,ER)D)Ee)D) GF_@F_F_gJBEA( GF_jF_ F_tF_F_F_F_F_F_F_IF_NF_F_F_F_E@F_F_S,PttVm>i2 T:TtI u3}Z uZ NIS'Y hRiRjRkR$>$>F_F_@F_F_@F_F_P,F_F_^TTuT#rT*f*^* .WTD$Qw=*=u GF_pfB`9/ GF_VF_SF_jF_F_x@F_F_@F_F_@F_F_@F_F_t+F_F_mF_F_UeF_g F_F_yF_F_M F_F_l@F_F_qF_F_F_F_DF_F_K3@G F_E3@F_I3F_v@F_F_sF_F_Z F_F_Q@F_F_AF_F_ctJYdycY=w*r* \Gw*fszwfs*rZ *A?Z fsu9?, uL>%Uu9?%AA9?,YwZ *A?A9?,YA9?&Z **gR%N>L=Y>C\egR&Q>L=Y>CxcgSYCd@zC^\9?,2lSYC,a@zDy6@62,a$2\9?,pQYCE@,D6@62E9=,-tpQYC,K@,zD6@62,K$ GfvJe:w6 ~*ft/u! ߢ(a! NR] Score LimitF_F_m3r*qH_Lu;wS*S r*SFS iS L-(ZS 7HLVu&VLru&rL-'&ZLVS HVS Hr9?,Lr%HVLVL-'% GF_F_F_|@F_F_@F_F__*@F_F_u3F_F_RF_F_x@F_F_jo X{F_A @XqF_y3F_F_vF_F_sF_F_ }iOR15OOR7Mk%Qk%RQk7MkHQkMk- QkPiOOuOOaW{h`iOi`iO|OOaW{hLiOiLiAiOihO9?,AiFiAi9?,9?,6OC6OC6O6OCOhO9=,9=,9=,9=,O OAi6OCDih9?,fiOh9?,O$O4a CFiCFiCCO$.-.-.-S \cXw.*S ppm.lcS PO9=,9=,9=,9=,OuOOaS {h\OFO9?,{h9?,hAi9?,\9?,O aS (w.* w.*O$ 9=,$ 9=,O9?Li;OCFi@?DiO al(S fBOaS {h\O&O9?,{hDiOaS O9=,9=,$9=,OuOO%CFi@?DiLiO)a.(S eB.OaS {h\O-O9?,{hDiLiO aS (O|OS hBOaS {h\O9O9?,{h9?,h9?,\OaS S ]GO9=,9=,9=,9=,OuOOaS {h\OFO9?,{h9?,hAi9?,\9?,O aS (OPi GF_AiF_F_XL4]Mm3wk*k jL4OkFsL4P9D9?OmFsCqiQP GF_@F_h F_zF_F_sF_F_]N4q[ lwk*pvkN4Oklk%k \pvCx\PN4P%P%POmPOmrk*O%Cx\CqiQP GF_KTp\ wk*Xk ^nHk%TpTp9?k9?kk O%TpTp9?P9?OmFsTp? GF_hF_F_^ F_>F_F_F_Tf@F_F_j)F_F_|F_F_\4F_F_Z F_F_w@F_F_{(dBUiARB"--noR7INR-0B&I0B&a0B&K0B%I0B%a0B,I0B,a-w*m Bg-w*0B&H0B&S0B%H0B%S0B,H0B,S- 6[eS0Be0Ba0BpltR%gwl*wl*6HBl6CBl0BB-6sQ%0Bd~>`GB GF_F_F_F_F_q@F_F_s@F_F_C@F_F_F_"JE\ |"@" NN] NoBackgroundH] UT2MenuFontH  UT2MenuFontH  UT2MenuFontH  UT2MenuFontH  UT2MenuFontE*EEEErrrrrV"VVVF_F_~@F_F_@F_F_U)@F_F_F_F_@F_F_snY.F_nF_F_AF_fZD` E_5|&f4 NN] ListBoxRF] SmallListBoxRF LargeListBoxV" V V V F_F_u F_,F_R)@F_F_DF_F_nF_F_HF_F_|4F_F_f)q/S.rU'- wZ *}>/L?}//L}A<}?/L<L/&aZ }LCC/0}A?/L/P/p/apP \P }/P//apP \P }T9?}p}P pp9DT/apP \// $$$/L}A<}?/L<L/&a }LDD//0}A?/L/# ff?}ff?L//j/9?}A?}P ?/Lu=L'w*w*%/// ap'lQ/-0/%K0/,K0/,KB/{0/{,@a/!q $.6[Z.e=?0/Z0/_0/s0/E6sQ%0/ZB/QB/Nn/V- w*w*B/Z$- zJ/R^?/V zJ/z4?/Gw w*w*/u//9=,9=,$9=,/$adkSkdkdk>//9?/|//aWP Sk/=B/9?,Pdk/{.?/ al(/u//DB/9?,Pdk/{.?Sk/a(w/ GF_Uf@F_F_^Y.F_SkF_F_YT> GF_HdF_F_`F_RF_F_UWJT*Ew*w*@%&L@&q u 6sN9D\6@62E9C9?,9?,\9?,d?6@62E$6@62E9=,t 6sQ9Dxs -tPvr 6sZ9Dn -Z6@62,S9C9?,9?,n F ?6@62,S9C9?,n F ?6@62,S$U GF_WF_F_o(F_F_}wdF_FkjF_}F_F_OjF_h/F_a#F_jF_F_o'@F_Z(F_F_F_S mxn( --w6H%y*0m%yQw6H&y*0m&ylBm%NBm&N GF_dIF_F_b#F_FpF_@F_B(F_KF_D DF_F_KF_BZDF_FBKs7Zg2 t ZZ N]SpinnerButton6AP$Wt)F_F_P)@F_x'F_W@F_qHF_@F_F_F_KF_R|KF_@F_F_@F_F_F_F_F_F_KF_F_@F_F_F_kF_g'pF_@F_F_IF_F_@F_F_wF_F_@F_F_M@F_F_@F_n&F_m&F_ F_w&@F_F_b&@F_F_@F_E7F_Q@F_F_Y&tF_VN@dF_[@dF_] F_F_QF_F_^@dF_F_yF_@F_F_q%@dF_F_F_C@F_F_F_F_d%gdcbaLIkVF_onGf9 C,  2%%3& GF_fF_XmMx2I2 &e)÷!X$ʘʌ CSMʘm`Uʘ ʘʘʘ*t%[*t%[ʘʘʘʘʘ     ʘ,KG NHYW'Y?SUTUUUVUWUXUYUZU[U\U]U^U_U`UaUbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqU$>$E?F_F_ciF_F_F_F_l@F_F_rF_F_@F_F_F_F_nF_rF_F_F_O%F_F_t@F_F_F_F_F_F_\F_F_H%F_F_@F_\GF_B@F_F_NDF_F_l=D%q^@'D%' GF_@F_I%F_g$WF_` }$!` $~$rC*Cc,a EC 'DqEC DSECDAECDDQcL?.,.&-(.&.&Jy%E.&.&)D] .,.&J]E.,.&)Dq GF_| F_F_H@F_F_F_F_^@F_F_CF_F_^F_F_T%F_F_M@F_F_gF_F_F_F_j F_F_t$F_F_t F_F_KF_F_r$F_F_jmcp$!Gjmp${$!-a-c(D-@ %  GF_SzF_CzF_ZF_ F_Cm@F_F_TF_F_VF_F_WF_F_XF_F_\F_ F_F@CF_MF_ F_@IF_F_F_w#B ,{ GF_]IF_yF_F_aIF_F_F_OF_F_R$F_F_@F_M$F_g@F_K$F_J$@F_F_iF_ F_@F_F_m@dF_XOdF_BG@F_DGFq6uI2 oA1FX-̟ZZZZZZZZZ NS R dbVP$Wo)F_F_F_F_F_F_x@F_F_F_F_j9F_F_BF_F_XqF_F_aF_ F_@F_w$>F_F_@F_F_zF_F_e#F_F_|F_F_@F_F_CF_F_vbDRO #Ag%7gAw %7w v GF_F_F_d#gMm F_C:F_F_F_F_F@F_F_GF_F_{ F_F_\@F_F_BF_F_@F_F_af=m#. &a.,,a.,Z.,c.,U.,V.,S., |., Q ., P ., w. , d.,.,C.,_.,EIDL GF_F_F_J@F_F_4J:P!8'P ] Q 4PD#c y SPc kGorgeEc&D`Pcd|-(|-E(EU)D`EV)D`ES)D`E|)D`EQ )D`EP )D`E_)D`a-E(d-E(EZ&D`Z  GF_J#F_F_D#F_F_`F_F_xF_"F_}@F_U:F_AF@F_F_`@F_F_@F_F_z"F_F_XF_F_wEF_F_@F_F_uEF_F_`:@F_F_\F_F_K@F_p"F_^F_F_g"@F_flHg b-f4 NN]SquareMenuButtonRF  MedHeaderHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontH UT2SmallHeaderFontH UT2HeaderFontH UT2HeaderFontH UT2HeaderFontH UT2HeaderFontHUT2HeaderFontE,,,,F_F_`F_F_@F_F_F_F_{@F_F_F_F_mj:lOqB U9?,d-sk--rj-tW U9?,doN xngxmu x-ubcc-b_ppppppp?GameSpeed=9Uq?WeaponStay=9T-s?Translocator=9T-r?FriendlyFireScale=9Ut_pppppp_?GoalScore=9So?TimeLimit=9Sn?MaxLives=9Sm-ub_pp_?AllowThrowing=9T-ub_ GF_F_F_@F_F_Q"@F_F_k@F_tMNC;Z2 fmFtI u3}Zs u3}ZsZ u3}Zs  䶉 u3}Zs⤘ZZI FI FZZI FI F⤉ u3}Zs⤘⤘⤉ u3}Zs&'% &'% /$&'% /$/$&'% /$/$&'% /$/$&'% /$/$&'% &'% &'% /$/$&'% /$/$&'% /$/$&'% /$/$&'%       u3}Zsʘʘʘʉ u3}Zsʘ3[d@ u3[d@,KGZ u3}Zsʌ/$⤘Z       &'% &'%  ND] RoundButtonC] NoBackgroundB]<;This action will empty your current roster. Are you sure?A]('Are you ready to enter the tournament?@]Statsb y'Y%x*M+\+],*`,B-b-h-w-L.[._.~.w.C/C.BW$?CSF_F_rF_nF_uF_F_F_"F_F_F_n@F_F_uF_F_:F_F_@F_F_q:K `: 2Rc,-A -\irK U-\(R[cIrK V-\(RGcIZ <rK S7 "KXInterface.GUIQuestionPagem .I ]m `_#$0$ Em E Dc'rK | "KXInterface.GUIQuestionPagem .I ]m `W#$0$ Em E Dd'rK Q curK P cPrK _^U-\-A ' GF_~ F_|F_xD@F_F_OF_rF_F_F_|F_F_zF_F_}F_F_c!F_F_F_F_C F_F_b!F_tKNp9Y2 D YtI u u u     Nw"y'Y%mQnQoQpQqQrQsQtQuQvQwQxQyQzQ{Q|Q}Q~Q$?F_F_ F_F_g!F_F_D@F_F_[ F_F_F F_F_Q;F_F_O @F_F_x F_F_R!F_F_D<F_F_@F_[;F_G P^JONMLKIHzI"MEi Q D"" NN] RosterButtonE*EEE,,,,,V"VVVF_F_S @F_F_X @F_F_U F_F_V @F_F_@F_F_@F_F_XF_F_Q[F_F_c F_F_@@F_F_o F_F_\ F_F_Yh@F_F_BE] x#D+9:] 9:)9:\ 9:$h'] \ o  GF_z@@F_F_m @F_F_XbF_F_F_F_b F_F_d F_F_GF_|F_ DECE_ GF_E@F_F_Hb@F_F_bF_F_n F_F_EEg"7em%Aem%7em GF_F_F_F_F_AEF_F_P u}F_g;F_F_DF_F_n F_F_zF_F_F_F_g F_F_M F_F_IF_F_c F_F_F_F_e F_qINW2 | gq,ǰ NNMUT2DefaultFontw x=YUT2003Fonts.FontNeuzeit9F_F_iy@F_F_} F_cF_D F_F_E!F_F_~ F_F_JF_F_Z@F_F_A!F_F_F_F_D!F_F_A<@F_tJNd9X2 H!>tIZ NIS'Y iQjQkQlQ$>$>F_F_^@F_F_F_F_I!@F_F_F@F_F_F!F_F_F_F_J!F_F_N!F_F_M!F_KF_F_F_W@F_F_S!@F_F_T!@F_F_U!@F_F_V!@F_F_W!@F_F_nZF_F_Y!@F_F_@F_F_Z!@F_F_F_F__!F_F__F_F_F_F_@F_F_L F_F_B F_F_h!F_F_{jF_F_WEF_F_hF_F_Q!F_F_F_F_^F_F_m!@F_F_n!@F_F_o!@F_F_p!@F_F_r!@F_F_u!@F_F_v!@F_F_t!F_F_lF_F_l@F_F_y!@F_}O$>F_F_Y"F_F_nE@F_F_U"@F_F_ sY v.:%:7K:K-&K-K-rKv[:`: ``,  uaTestxZt9D>ZS9D?Zg9D9?,ZU9D?9?gx9?`?9?g9?Stt9D>ZS9D?Zx9?`?9?g9?StE9?`?9?g9?StS9D?Zx9?`?9?g9?StdtdaTestxZt9D>ZS9D?Zg9D9?,Zx9?`9?g9?StdtdaTestxZt9D>ZS9D?Zg9D9?,Zx9?19?`9?g9?StdtdaTestxZt9D>ZS9D?Zg9D9?,Z9?``9D9?&9?g9?St``9D9?gSt[``&5d,D@@@D@S9D?+?9?U9?`9?t9?SDZ-9?`9?U9?Ste9D9?,Zt9Dp?M9D?9?tt9D9?,M^9D9?M=9?tT9D9?M?9?tF9D9?M0?9?tO9D9?MP?9?t$b(?:%j:`)9?M9?eSt:m9?t9?S:$$t9?e9?`&9?St9?SO9D9?e?ZaUd ZaWe Z9?^9?O a[&'"9?T?d 9?O aU'"9?F?e 9?O aW'`% Xbfff?9?T^:% :`:F:a:FxZ xBmXbDm:FBmx: ' [`[F[a[FxZ' xBmXbDm:FBmx Bm9?%-Vb'td&aDmxZ xXbtd,aDmxZ xXbtd,Gm:% :`:F:a:FxZ xXb:F:F9DXbx9?}:F: ] [`[F[a[FxZ] xXb[F[F9DXbx9?}[F$&?9?e,I 9D9?e?9?SZ:%z :`p :[-9?^9?St9?:9?I a:F':  -Vbtd:%:`~:[-9?T9?St9?:9?I P:- aC'~%a9S9D:': :%8:`.:[-9?F9?St9?:9?I %a9S9D:':[`B St`I $b(?)9?M9?eSt`m9?t9?S$%B St[I 9?^9?B |-VbGma[F'-Vbtd9?T9?B [- aC'=%a9S9D['9?F9?B %a9S9D['~R`[^StI 9:9:$ a^b Z"9?O?b 9?O a^':%:7:M::JmdeStI [`Oqd G F_T"F_F_iF_F_V"@F_F_^"@F_F_`F_F_P"@F_F_F_F_cF_F_c:Z"x-e-Z" Q-c\cIU-E-c-eV-E-cU-U-EV-V-E GF_C"F_F_Y @F_F_b@F_F_`"F_F_F_F_@F_F_BF_F_d"F_F_F_F_b"F_F_@F_F_q"@F_F_i"F_F_F_F_qh@F_F_DF_F_@F_F_fMF_F_o"F_F_F_F_tEo{' GF_lh@F_F_xE@F_F_r"@F_F_w"F_F_@F_{EF_u"@F_F_WF_F_nzF_F_x"@F_F_~EF_F_kF_F_}"F_F_KF_F_@F_@FJIDu>n2 )"t J% ZBd?Bd?Bd?,KG  k䶉 u3}k k k  nL ߢ(a u3} NK$@J]Ver.'YNSSSTSF_F_~"@F_BFF_{"F_F_F_F_B#@F_EFF_F_F_nF_F_RMF_F_F_F_kDF_F_Lz@F_F_bF_F_L#F_F_F_F_LF_F_F_F_L:F_F_HF_F_N#F_F_T#F_F_PF@F_F_yF_F_@NF_F_H@F_F_mF_F_L F_F_fwF_F_VFF_F_[#F_F_Z#F_F_F_BF_W#@F_F_@F_F_l#fb 4 GF_F_F_QRSFGF_`FF_F_} @F_F_A@F_F_uFF_F_gnF_F_j#$F_F_bdg 3X)d GF_wF_ F_a F_F_\"F_F_iFF_F_bF_F_rF_F_i#F_F_F_F_F_IF_t#F_F_Ah +X GF_F_NF_F_F_o#F_F_pFF_F_VF_F_z#F_KF_y#@F_F_WNL w GF_E$F_F_t F_F_LF_F_F_F_G$F_F_H=F_F_N$F_P F_tF_F_h@F_F_]C GF_I$F_F_K$N GF_F_F_@$@F_F_Q$F_F_Q F_F_[$@F_F_l@dF_B@F_F_O$@F_F_T$@F_F_F_F_V$@F_F_V9F_F_W$F_F_S=@F_F_@xWF__$F_F_@@dF_OF_F_[CF_l$F_F_N9F_F_F_F_c$F_F_}zF_z@F_{8F_NWF_@F_F_@F_F_GF_F_u F_F_J @F_F_PG@F_F_NF_F_{$F_F_]=F_F_HF_F_F_F_TN@dF_u$@dF_e8@F_F_@F_F_F_F_C@F_F_F_F_J@F_F_|$@F_F_F_F_~$F_F_Y@F_F_B%F_F_F_F_XF_F_d=F_F_h=F_F_bF_F_@%F_F_F_F_H8L8I GF_K%@F_F_@F_F_jMF_F_vF_F_FDF_F_@F_F_rF_F_GDj F_F_F_R%F_F_X%F_F_kcRQPF_CDF_F_V%F_F_F_F_W%F_F_@F_F_r%@F_F_}C@F_F_Ax=wU%z='R7C%Qgametype]&$aD-bQstandardtrue$D-aQpasswordfalse$D-`Qfreespace0$D-_Qcurrentplayers0$9:DL 9:$Qstatstrue$AA9:DL 9:$Qstatsfalse$w~DD.|w%n DDn DDw&9:DMb9:$Qmutator$F 9:DMb9:$ {n Qmutatorn $FF9:DMb9:$ {n Qmutatorn $w~Dkb.w%n Dkbn Dkbw&59:DMb9:$9:DZb9:$ {n Qmutatorn $559:DZb9:$ {n Qmutatorn $]D-^cQnobotstrue$9:D`b9:$Qweaponstaytrue$9:D`b9:$Qweaponstayfalse$9:D_b9:$Qtransloctrue$--9:D_b9:$Qtranslocfalse$Deb%Dgb,DgbDebQgamespeed9U9?DebB$Qgamespeed9U9?DgbB${DDn DD, Qcustomn $Cv$Q ^Gw GF_\F_JF_mGF_F_^%F_JF_`%F_JF_a%F_JF__%F_F_cljhF_eiF_JF_e%F_JF_OF_ F_f%F_JF_g%@F_F_h%F_JF_l%F_F_uF_F_j%F_JF_rG@F_F_i%@F_F_m%F_JF_`@dF_S@F_F_lF_F_s%F_F_JF_F_j7@F_F_u%F_F_t%F_F_]@F_F_a7@F_F_F_F_x%F_F_{%F_F_y%@F_F_~%@F_F_|%F_F_@&@F_F_xGF_F_P @F_F_B&F_F_D&F_F_Z7F_F_[7@F_F_E&F_F_X7F_F_H&@F_F_%@F_F_U7F_F_N&F_F_F_F_K&@F_F_|GF_F_P&F_F_O7@F_F_O&@F_F_Q&@F_F_zGd l#Ms b2Ud %dd 7UZ{6d UDUP7ppd Ud 7p GF_S&@F_F_IF_F_~GF_F_V&@F_F_X&F_F_U@dF_b@F_F_C@tF_Z&F_F_^&F_F__&F_F_o F_F_e&@F_F_F_F_c&F_F_l&@F_F_KHF_B*$d<<$wH<$u?$>F_F_f&F_F_h&F_B*$Gu>$@?$y=>$_a>F_F__y6L t GF_o&@F_F_M@F_F_SC GF_z@F_F_E F_F_r&F_F_qF_B*$Gu>$z<$y=>$_a>F_F_i&F_F_u&F_F_zF_= Game Speed+L*] TextLabel$V)=$>$?$BF_F_}#F_F_MHF_F_b`^]F_~&F_F_m6F_F_HF_F_\%F_F_N>K>bE U' GF_U#@F_F_F_F_B'F_F_j6F_F_F_F_E'F_F_PNMLJHF_C'F_F_H'F_F_a6F_F_F_F_K'F_Y$HBj$HC ]87This option controls how fast the game will be played.$X=$>$>$WM')C'M'~ D'M'`Ef'M'_J'M'{F_F_I'@F_F_m@F_F_F_bhF_Q't\OBAt2 S'gtI ߢ(a uZ u NbIS^'YASBSCS$>$>F_F_U'@F_F_@F_F_R'@F_@aF_X'F_xCF_F_Y'F_@F_F_@F_F_['F_~@F_F_F_F_a'F_*%$fff?] Weapon Stay^E'c']E ]<;When enabled, weapons will always be available for pickup.$PU>$L=$>$ #=F_F_RF_F_F_F_e'F_F_LF_F_O@F_F_F_F_j'F_F_s'SIF_s lZ= ' GF_S@F_q'F_F_F_Z(Q 8i  GF_UF_F_ZYXWF_QF_F_z'F_F_BdZ4( GF_}'DMe50  GF_F_F_f>F_F_eGF_pL{LU 4  GF_A(@F_F_Bv@KF_M|F_"F_@F_F_nTIc&R--nppp(9S9DU-Z %)ppp(9UU-Z %) GF_o>F_F_E(F_F_F_F_Q(@F_F_guK*%$fff?]Include Translocator^E'I(]E ],+Enable this option to allow Translocators.$33>$L=$>$ #=F_F_F_KF_v_ F_nF_F_yLpF_ZF_F_L(F_F_S(@F_F_^(@F_CnI:eJa2 T(^ -CngK'* N] VertGripF_F_@F_F_Y(F_F_Vx5N6_ GF_F_F_V|F_F_l5U4 (%w * -m{P GF_\(F_F_xF_F_X H_1?:9:H,  9:H,  9:I&C)`'( GF__(@F_F_`(@F_F_h(@F_F_M@F_Rnl0sK_2 b(?RnidZ NF_F_t5jF_d(jF_e5F_F_i(@F_F_Y@F_F_ig@F_F_XF_F_m(F_F_XF_] FriendlyFire+L*] TextLabel$t ?$L=$>$ #=F_F_V@F_F_XBDF_s(@F_F_a]F_t(@F_F_x(@F_F_F_F_u(F_F_y(@F_F_~(@F_F_}>F_F_UxLUm GF_A)F_F_^)Y.F_H)@F_F_@F_zXJH;t2 T@)`z-soZ&'% &'% &'% &'% &'% &'% &'% &'% &'% &'% &'% ZZk uZZnLZnLZnLZnL&'% ZZk uZ u u u u&'% ZM&'% &'% ZM&'% u&'% &'% &'% &'% &'% &'% &'% ZnLZnL&'% ZnLZnL&'% &'% &'% &'% &'% &'% &'% &'% &'% ZnLZnLZZnLZnLZnLZnL&'% &'% &'% &'% &'% &'% &'% &'% &'% ҽnLҽҽҽZnLnL&"nLnLnL&&"nLnL&&"nLnL&&"nLnL&nLnLnLnL""&'% u3}VhVhVhVh u3} u u u&'% &'% &'% &'% &'% &'% &'% &'% &'% &'% &'% Z&'%  Nu*d:i6;=] Movement7 < 9 > F_;S=] Forward7] MoveForward< 9 > F_;S=] Backward7] MoveBackward< 9 > F_;S=] Strafe Left7= StrafeLeft< 9 > F_;S=] Strafe Right7] StrafeRight< 9 > F_;S=]Jump7]Jump< 9 > F_;S=]Walk7] Walking< 9 > F_;S=]Crouch7]Duck< 9 > F_;S=]Strafe Toggle7]Strafe< 9 > F_;=] Looking7 < 9 > F_;S=] Turn Left7] TurnLeft< 9 > F_;S== Turn Right7] TurnRight< 9 > F_;S=] Look Up7]LookUp< 9 > F_;S=] Look Down7] LookDown< 9 > F_;S=] Center View7= CenterView< 9 > F_;=] Weapons7 < 9 > F_;S=]Fire7]Fire< 9 > F_;S=] Alt-Fire7] AltFire< 9 > F_;S=] Throw Weapon7] ThrowWeapon< 9 > F_;S=] Best Weapon7]SwitchToBestWeapon< 9 > F_;S=] Next Weapon7= NextWeapon< 9 > F_;S=] Prev Weapon7= PrevWeapon< 9 > F_;S=] Last Weapon7]SwitchToLastWeapon< 9 > F_;=]Weapon Selection7 < 9 > F_;S=] Super Weapon7MSwitchWeapon 0< 9 > F_;S== Shield Gun7MSwitchWeapon 1< 9 > F_;S=]Assault Rifle7MSwitchWeapon 2< 9 > F_;S=] Bio-Rifle7MSwitchWeapon 3< 9 > F_;S=] Shock Rifle7MSwitchWeapon 4< 9 > F_;S=] Link Gun7MSwitchWeapon 5< 9 > F_;S=] Minigun7MSwitchWeapon 6< 9 > F_;S=] Flak Cannon7MSwitchWeapon 7< 9 > F_;S=]Rocket Launcher7MSwitchWeapon 8< 9 > F_;S=]Lightning Rifle7MSwitchWeapon 9< 9 > F_;S=] Translocator7]SwitchWeapon 10< 9 > F_;=]Communication7 < 9 > F_;S=]Say7]Talk< 9 > F_;S=] Team Say7] TeamTalk< 9 > F_;S=] Speech Menu7]SpeechMenuToggle< 9 > F_;=]Taunts7 < 9 > F_;S=]Pelvic Thrust7]taunt pthrust< 9 > F_;S=] Ass Smack7Mtaunt asssmack< 9 > F_;S== Throat Cut7]taunt throatcut< 9 > F_;=]Hud7 < 9 > F_;S=] Grow Hud7] GrowHud< 9 > F_;S== Shrink Hud7] ShrinkHud< 9 > F_;=]Miscellaneous7 < 9 > F_;S=]Pause7]Pause< 9 > F_;S== Screenshot7]shot< 9 > F_;S=]Menu7] ShowMenu< 9 > F_;S== ScoreBoard7= ShowScores< 9 > F_;S=]ScoreBoard Toggle7] ScoreToggle< 9 > F_;S=] In Game Chat7= InGameChat< 9 > F_;S=] Server Info7= ServerInfo< 9 > F_8iq6 MovementForward Backward Strafe Left Strafe RightJumpWalkCrouchStrafe ToggleLooking Turn Left Turn RightLook Up Look Down Center ViewWeaponsFire Alt-Fire Throw Weapon Best Weapon Next Weapon Prev Weapon Last WeaponWeapon Selection Super Weapon Shield GunAssault Rifle Bio-Rifle Shock Rifle Link GunMinigun Flak CannonRocket LauncherLightning Rifle TranslocatorCommunicationSay Team Say Speech MenuTauntsPelvic Thrust Ass Smack Throat CutHud Grow Hud Shrink HudMiscellaneousPause ScreenshotMenu ScoreBoardScoreBoard Toggle In Game Chat Server InfoP][p]] Perform this action k$ A'YmSnSoSpSqSrSsStS$>$p=?F_F_F_j$HC ];:This option controls how much damage you do to teammates.$?$L=$>$ #=$WB))C'B)~ D'B)`Ef'B)_J'B){F_F_R@F_F_(F_ F_F_F_G)F_F_ZF_F_L)@F_F_F_Y"j"c*%$333?= Goal Score^E'J)]E ]/.The game will end when this threshold is met.$PU>$ ?$>$ #=F_F_I)F_F_M)@F_F_@]@F_F_@F_F_r q p n m F_nMF_F_gzF_F__F_F_kF_D?@F_F_@F_F_n` GF_])F_F_F_F_iF_F_tL Y.qF_X(F_F_B utsroMTGTyUvUF_@F_F_F_F_b)F_F_cF_F_d)F_F_wLiLS GF_mF_F_nF_F_Y?Ln)F_^F_YXF_dF_>F_O F_F_q)F_F_@F_F_fS4|~ GF_B*F_F_t)F_F_y)@F_F_c?F_F__uBq%M %&(XHX%pOnPreDraw called9SXtimes: c<( GF_F_F_})F_qqV\2 )V{Zq,ǰ NN]UT2HeaderFontx=YXUT2003Fonts.FontEurostile14UT2003Fonts.FontEurostile17UT2003Fonts.FontEurostile21F_F_A*F_F_N F_F_F_F_X|F_F_Y*F_Y"j"*%$333?= Time Limit^E'G*]E ]43The game will end after this many minutes of play.$33>$ ?$>$ #=F_F_Qnn)a#r*] I %I 7rI 6sJI &I *6sC9DNr%?7&6sD9D&K6sD%6sD9D%-BnCn9?BnDBnJ46sJ, 6XJ=6aJ,6 J,Z^6XJQ8>6aJ,6 J,( GF_X*@F_F_B4F_F_O*F_F_P*F_F_Q*F_F_3F_F_|)rBU |&J %&(AEA%pOnDraw called9SAtimes: c<( GF_F_F_}3F_F_S*F_F_T*@F_F_~@F_F_F_F_kB@F_R*F_@F_F_]*@F_F_e*@F_F_F_Y"j"*%$333?] Max Lives^E'a*]E ]@?If this value is not 0, you will only respawn this many times.$/3 ?$ ?$>$ #=F_F_`*F_qcOn2 d*''tq,ǰ NN]UT2SmallHeaderFontx=YqUT2003Fonts.FontNeuzeit8UT2003Fonts.FontEurostile9UT2003Fonts.FontEurostile12UT2003Fonts.FontEurostile14F_F_n*@F_F_\{DcF_f*DF_g*DF_h*DF_i*DqISm2 l*q,ǰ NN] UT2SmallFontx=YlUT2003Fonts.FontNeuzeit9UT2003Fonts.FontNeuzeit11UT2003Fonts.FontNeuzeit11UT2003Fonts.FontNeuzeit14F_F_J\DF_Q+@F_F_k3F_F_[@( GF_uF_F_q*[5) GF_ktF_F_t*F_B*$>$q=?$W>$<3?F_F_J@F_F_y*@F_F_c3@F_F_s*M ) GF_tzBj fbdSL"= CharButton ]-,Choose a teammate to play in the next match$@?$˝;$ę+?${.>$W*)A'*}PC'*~ D'*`Ef'*_E'*nEzE'*pE{E'*oE|E'*wExE'*tE~E'*mEF_F_mB@F_}*F__3F_F_F_F_}*pBg5* GF_N@F_]! No Game Profile => No MatchData+L*4] UT2LargeFont$$=$L?$=F_qsVj2 N+gbkq,ǰ NN]UT2ServerListFontx=YjUT2003Fonts.FontNeuzeit9UT2003Fonts.FontNeuzeit9UT2003Fonts.FontNeuzeit9UT2003Fonts.FontNeuzeit11F_F_T3F_F_U+@F_F_F_F_R+F_F_Ww G "F_V+@F_F_X+@F_F_R*lBrK'J %& ]G]%pOnRender called9S]times: c< GF_m@F_F__ F_F_q?F_F_d+F_@$ #=}$>^E'\+]E ]Team members profile$[D>$<$?$(>6F_F_F_F_swF_F_^+@F_CnH2\2 `+lk#CngK'* N`F"F_F_|2F_F_y2F_F_t?F_F_F_F_geF_F_F_x F_F_H+jBl* GF_j+F_F_F_KF_s+@F_F_q@F_F_i@F_F_y eF_p+F_F_r+F_dF_w?F_F_F_BF_x @F_F_@F_F_f+F_F_w+F_F_@ F_F_l+F_F_@F_F_y+F_F_z+@F_F_F_F_F_F_+F_F_F_F_wDh . GF_z@F_F_T@F_@,F_y?F_F_T/|}?[z|;-?^֤X֤X֤X-?^-?^-?^-?^-?^֤Xk k 䶉 u3}֤X֤X-?^-?^-?^-?^-?^-?^ NRF_F_V2F_F_F_F_D,/F_x+@F_F_F_F_|F_F_F_F_M,F_F_kF_F_@F_[,F_@F_F_aBPF_B@F_F_EPF_F_F_{1F_F_F_F_Y,F_F_M~_BI(6P_B6P`B GF_cuP^E'],]E$>$<$?$@s>CS6F_F_[]B`/ GtuVj>h2 _,DO1tIZ NIS'Y dReRfRgR$>$>F_B*$=?$<$#?${>>F_F_d,@F_F_w1@F_F_\,uPtvVg>g2 f,&p:tI ߢ(a uZ u NbIS^'YaRbRcR$>$>F_F_h,@F_F_@F_F_F_F_F_F_F_F_m,F_F_F_F_F_F_F_F_@F_F_F_F_r,F_F_f1F_F__uPF_F_F_~@F_F_F+F_F_-EcF_a/KF_Y1F_F_V1F_F_F_F_~,F_F_@F_fbL"= CharButton ]Select teammate$iB>$0?$>$>$WB-)A'B-}PC'B-~ D'B-`Ef'B-_E'B-nEzE'B-pE{E'B-oE|E'B-wExE'B-tE~E'B-mEF_F_@-F_F_^,OBt0 GF_H-F_F_C-@F_F_D-HBmz0 GF_F_F_DyF_F_I-@F_F_F_F_F_F_L-F_F_MyuPF_@}m(uE}<z}e-(e-E(re-'e-E'RGL> GF_XtF_F_P-F_F_U-@F_F_Cs0]@5w * -P5-pmC&P-pm( GF_@F_F_F_F_X-F_F_F_F_Y S GF_} uPF_vF_F_j0uPF_]-uPF_tuPF_x@F_b0F_Ir@uP]DRAFT ]! Add this character to your team$X?$X?$>$Ga=ff'b-_F_F_C@uPF_|+F_F_f-F_F_F_F_r@F_] RELEASE ]&%Remove this character from your team$X?$YN?$>$Ga=ff'h-_F_F_cq@Hd w=*=H( GF_m-F_F_@F_F_@F_F_F_F_y-~@c!w=*=( GF_AAF_F_mF_F_nK V{F_|-@F_F_t-@F_F_c0@F_]CLEAR]SquareMenuButton ]Clear your team roster${n?$=$Ga=ff'w-_F_F_F_F_fCAA#c!w=*=A( GF_JF_qzVc2 {-wpRq,ǰ NN] UT2MenuFontx=YlUT2003Fonts.FontNeuzeit9UT2003Fonts.FontNeuzeit11UT2003Fonts.FontNeuzeit11UT2003Fonts.FontNeuzeit14F_F_@F_F_G-DBn0 GF_hF_F_~-F_F_A.@F_F_B.@F_F_@F_rS]Footer${n?$=$\B?$Ga=F_F_Q0F_F_OF_F_w F_F_G.F_F_N0F_F_F_F_F_]PLAY]SquareMenuButton ]! Enter tournament with this team${n?$Ga?$=$Ga=ff'L._F_F_K.F_F_F_F_`F_F_O.F_F_]ABj1( GF_UF_F_F_F_F_F_UAF_F_V.F_mb ]Select teammate$N>$?$ ף=$ ף=ff'[._F_F_F_F_QF_mb ]Select teammate$N>$^?$ ף=$ ף=ff'_._F_F_j.F_F_^.F_F_S.|Ai$^2( GF_a.F_F_c.F_F_G/vAZ O GF_d.F_F_O @F_p/F_F_F_o/@F_h F_alA[.33( GF_k.@F_h F_r@F_F_ScQ8 G.F_F_F_q.F_F__AF_F_EF_F_t.F_F_u.F_^E'w.]E$9=?$p'?$p>$xA>CS6F_F_GF_z.F_F_zF_F_v.F_F_x.GF_K@F_D/]Choose Teammate+L*4]UT2HeaderFont$-=$?$̼>$2=F_F_A/hcqV^2 @/Ѓq,ǰ NN] UT2LargeFontx=YXUT2003Fonts.FontEurostile24UT2003Fonts.FontEurostile29UT2003Fonts.FontEurostile37F_F_GLhr]! Single Player | Draft your team]Header$u=$8BF_F_F/fAP 23 GF_yzYF_l.iAS 1x3 GF_XmAdN^ GF_q F_F_H/F_F_@GF_L/F_F_IF_F_F_JhAc>r2 N/IJ%Bd? ZBd? ZBd? ZBd? ZzmBd?Bd?Bd?Bd?zmBd?ddzmBd?Bd?Bd?Bd?Bd? ZzmBd?Bd?Bd?zmBd?Bd?Bd?zmBd?Bd?Bd?Bd?zm!!Bd?!!!Bd?!Bd? ZBd? ZBd? ZBd? ZBd?zmBd?Bd?zmddBd?zmBd? ZBd?zmBd?zmBd?zmBd?Bd?zm!Bd?!Bd?ZBd?Bd?nLnLnLnLnLBd?nLnLZk zmzmzmzm/$zmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzmzm!Q0珛!Q0珛nLnLkk  N^] Any Servers^Only Stats Servers^No Stats Serversr>] Any Mutatorsr>  No Mutatorsr> This Mutatorr>Not This Mutatort>] Any Serverst>Only Weapon Stay Serverst>No Weapon Stay Serverss>] Any Serverss>Only Translocator Serverss>No Translocator Servers'Y#bNjNdNeNfNgNhNiNcNiejekelemeneoepeF_F_n F_F_Q/yl[3x.%i}(w.%F%.%B%.%Fz.&(%w s,s, . ,-yl%g%wg,mzc,q"ppppppSupportedResolution WIDTH=9S6zgH HEIGHT=9S6ygH BITDEPTH=9Ss1ylggg%gyl.%1.pp9S6zgHx9S6ygHg~g%g,zc,q"ppppppSupportedResolution WIDTH=9S6zgH HEIGHT=9S6ygH BITDEPTH=9Ss1.%1.pp9S6zgHx9S6ygHg.% &x GF_0E/K/!a0K/L/I%KI7EI&D]I.& .%w .& .&w .&a'[,E. ,,E. ,, E. ,  GF_W)P/`g 1@%@&@, GF_R/m @p jrrm %M{ G.%& Gr.%& LF rm &|c,3"get ini:Engine.Engine.RenderDevice Use16bittrue.m &%w .m &&w [ggrm ,m c,"ISFULLSCREEN. m A9K[ GF_F_F_@F_F_f _/T/] f  GF_S/X/T} GF_Y/F_F_@F_F_W/j ]P -P |rj %rj &rj ,,-'ywj %[Mrj ,c,'"GAMMA9U.7,UM rj ,c,,"BRIGHTNESS9U.7,UMMrj , c,*"CONTRAST9U.7, U GF_} F_F_Z/]/] YH.%i}(ez.&(%w HpHx16wHpHx32. ,-HpHfHpHw,-( #Kxinterface.UT2VideoChangeOK.~  h f H' GF_^/F_F_HF_F_c/F)a "rF%N } TUT-DMErF&N } TUT-DOMirF,N } TUT-CTFrF,N } TUT-BR(wc,*c,-'c,-c,c,p"ppSTART} .ut2?quickstart=true?TeamScreen=false?savegame=c,c,="pSTART} .ut2?quickstart=true?TeamScreen=false X(' GF_\/a/){-y-y, --y, --ym-y. , % . , % ' GF_b/F_F_F_F_Ve/Ap7,DV-A-A -r-r-u-u---@-@%o%.LadderShots.TeamDMShot &o%.LadderShots.DOMShot ,o%.LadderShots.CTFShot ,o%.LadderShots.BRShot - ^-T%o%.LadderShots.TeamDMMoneyShot &o%.LadderShots.DOMMoneyShot ,o%.LadderShots.CTFMoneyShot ,o%.LadderShots.BRMoneyShot  t-r%o%.LadderShots.TeamDMMoneyShot -u&o%.LadderShots.DOMMoneyShot -,o%.LadderShots.CTFMoneyShot A-@,o%.LadderShots.BRMoneyShot  GF_l// GUIImageList is simply a GUIImage that has its current image selected from an array // It rotates using mouse wheel/arrow keys class GUIImageList extends GUIImage; // Native; var() editinline array MatNames; var() array Materials; var() editconst int CurIndex; var() bool bWrap; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); OnKeyEvent=internalKeyEvent; } function AddMaterial(string MatName, out Material Mat) { local int i; if (Mat != None) { i = Materials.Length; Materials[i]=Mat; MatNames[i]=MatName; } } function string GetCurMatName() { if (CurIndex >= 0 && CurIndex < Materials.Length) return MatNames[CurIndex]; return ""; } function SetIndex(int index) { if (index >= 0 && index < Materials.Length) { CurIndex = index; Image = Materials[index]; } else { Image = None; CurIndex = -1; } } function bool internalKeyEvent(out byte Key, out byte State, float delta) { if ( State != 3 ) return false; switch ( Key ) { case 0x25: // Up/Left/MouseWheelUp case 0x26: case 0x64: case 0x68: case 0xEC: PrevImage(); return true; case 0x27: // Down/Right/MouseWheelDn case 0x28: case 0x62: case 0x66: case 0xED: NextImage(); return true; case 0x24: // Home case 0x67: FirstImage(); return true; case 0x23: // End case 0x61: LastImage(); return true; } return false; } function PrevImage() { if (CurIndex < 1) { if (bWrap) SetIndex(Materials.Length - 1); } else SetIndex(CurIndex - 1); } function NextImage() { if (CurIndex < 0) SetIndex(0); else if ((CurIndex + 1) >= Materials.Length) { if (bWrap) SetIndex(0); } else SetIndex(CurIndex + 1); } function FirstImage() { if (Materials.Length > 0) SetIndex(0); } function LastImage() { if (Materials.Length > 0) SetIndex(Materials.Length - 1); } F_0f/y.! !0y.z.z%z,zo. z,zh.. z,&zO . z,,zN .z,,z%O ; &O ; ,O ; ,O ; z%z,zN Qn.zO ;z= GF_h/ 4F_Z(/* ==================================================================== Class: UT2K4UI.GUIImage GUIImage - A graphic image used by the menu system. It encapsulates Material. Written by Joe Wilcox (c) 2002, Epic Games, Inc. All Rights Reserved Notes about draw styles: Some things to know about using ISTY_Stretched - If X1, X2, Y1, and Y2 are all -1, draws normally. If specify values for any of those (i.e. you are drawing only a portion of another texture), the image is scaled instead of streched. In effect, it is the same as ISTY_Scaled, with one exception: If using ImageAlign other than IMGA_Left, then position calculation is done based from the original material's size with ISTY_Stretched, whereas it is done with size of the GUIImage with ISTY_Scaled. ImageAlign is ignored if ImageStyle is ISTY_Bound. ===================================================================*/ class GUIImage extends GUIComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() Material Image; // The Material to Render var() Material DropShadow; // The Materinal used for a drop shadow var() color ImageColor; // What color should we set var() eImgStyle ImageStyle; // How should the image be displayed var() EMenuRenderStyle ImageRenderStyle; // How should we display this image var() eImgAlign ImageAlign; // If ISTY_Justified, how should image be aligned var() int X1,Y1,X2,Y2; // If set, it will pull a subimage from inside the image var() int DropShadowX; // Offset for a drop shadow var() int DropShadowY; // Offset for a drop shadow var() float BorderOffsets[4]; // How thick is the border (in percentage) // Only used for ISTY_PartialScaled // Essentially, ISTY_PartialScaled means the material is stretched if the bounds are larger than the material // and scaled if the bounds are smaller than the material // X3 and Y3 are used to specify how far into each side (must be symmetric) of the image // will be stretched *instead of* scaled if the material is smaller than the bounds // This is mainly used for textures which contain combinations of gradients and detailed borders or bevels, // where the gradient should be scaled to maintain color distribution, but the border needs to maintain a // minimum size. Also used to preserve "bevelled" appearance of materials (editbox) var() float X3, Y3; event string AdditionalDebugString() { return " IS:"$GetEnum(enum'EImgStyle', ImageStyle); } F_i/ 3F_j/ 2F_k/ 1F_o 0F_Vm.\ r^6@m.\6@k.6-kba9:^`9:\`a GF_F_F_F_ F_aF_F_F_ F_F_ F_H'// ====================================================================================================== // GUILabel - A text label that get's displayed. By default, it // uses the default font, however you can override it if you wish. // // By default, labels will never be focused, since bAcceptsInput is false // for GUILabel. This means that GUILabel will never be put into the MSAT_Focused // state (thus changing the color of the text to FocusedTextColor) unless the GUILabel // is associated with a component that manually sets the label's state, such as a GUIMenuOption. // // The easiest way to override this default behavior, if desired, is by setting StyleName to "TextLabel". // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002 - 2003, Epic Games, Inc. All Rights Reserved // ====================================================================================================== class GUILabel extends GUIComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() localized string Caption; // The text to display var() eTextAlign TextAlign; // How is the text aligned in it's bounding box var() color TextColor; // The Color to display this in. var() color FocusedTextColor; // The Color to display this in. var() EMenuRenderStyle TextStyle; // What canvas style to use var() string TextFont; // The Font to display it in var() bool bTransparent; // Draw a Background for this label var() bool bMultiLine; // Will cut content to display on multiple lines when too long var() eTextAlign VertAlign; // Vertical alignment (only if bMultiLine) - Left = Top var() color BackColor; // Background color for this label var() color ShadowColor; // Shadow Color var() float ShadowOffsetX; // if > 0 draw shadow var() float ShadowOffsetY; // if > 0 draw shadow var() color HilightColor; // Shadow Color var() float HilightOffsetX; // if > 0 draw shadow var() float HilightOffsetY; // if > 0 draw shadow F_u/LY.| ]Y%KY,ArLYU]YKYK.L(wS*S`]Kc,SSINGLEPLAYER couldn't save profile package! GF_Vl/Op)cw-nEVQ,D\ w $Kxinterface.UT2LoadingWeapons.M heV-O-O-n_* GF_w/W e a Sra * W RLs-a t-W  1LL 9S a W  1LL 9S a W  1LL 9S a W  1LL 9S a W  1L GF_0t/Y.!;'k0Y.V.V.%o. ,C.,,oA - GF_x/Pn ^ RM P^  1MM 9S P^  1MM 9S P^  1MM 9S P^  1MM 9S P^  1M^   GF_{/SGSSrS* TR %7Rp%R3%R H%RzwA*A-_c,sR| $l6R Rp~6R Rp.&%7zllkI$^ axPlayersl(n R RpTH%*I ^kTR GF_v/IU KI%IVXV C IX9=VIXI GF_F_F_D0z/q ;Ge GF_y/}/T VBT-k'V_V3%E-m'-k(' GF_~/F_F_F_F_|/@0_d7 -mU -m(' GF_A0F_F_F_F_VkR.ct -VJR.O.-m' GF_@F_F_L0BdBSwB*E%pE7BEV EBER~V7B GF_B0F0A  V%' V I %'c  &V  &' GF_G0F_F_ F_F_A// ==================================================================== // The GUIList is a basic list component. // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIList extends GUIVertList Native; #exec OBJ LOAD FILE=InterfaceContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() eTextAlign TextAlign; // How is text Aligned in the control var() editconstarray editconst array Elements; var() editconstarray editconst array SelectedElements; // Used to easily support drag-n-drop between the same list var() color OfficialColor; // Used to signify items standard in UT2003 var() color Official2004Color; // Used to signify items standard in UT2004 var() color BonusPackColor; // Used to signify items standard in BonusPacks native final function SortList(); function Sort() { Super.Sort(); SortList(); } // Used by SortList. delegate int CompareItem(GUIListElem ElemA, GUIListElem ElemB) { return StrCmp(ElemA.Item, ElemB.Item); } // Accessor function for the items. // Functions for manipulating entire list elements function Add(string NewItem, optional Object obj, optional string Str, optional bool bSection) { local int NewIndex; local GUIListElem E; if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" ) return; E.Item = NewItem; E.ExtraData = Obj; E.ExtraStrData = Str; E.bSection = bSection; if (bSorted && Elements.Length > 0) { while (NewIndex < Elements.Length && CompareItem(Elements[NewIndex], E) < 0) NewIndex++; } else NewIndex = Elements.Length; Elements.Insert(NewIndex, 1); Elements[NewIndex] = E; ItemCount = Elements.Length; if (Elements.Length == 1 && bInitializeList) SetIndex(0); else if ( bNotify ) CheckLinkedObjects(Self); if (MyScrollBar != None) MyScrollBar.AlignThumb(); } function AddElement( GUIListElem NewElem ) { Add( NewElem.Item, NewElem.ExtraData, NewElem.ExtraStrData ); } function Replace(int i, string NewItem, optional Object obj, optional string Str, optional bool bNoSort) { if ( !IsValidIndex(i) ) Add(NewItem,Obj,Str); else { if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" ) return; Elements[i].Item = NewItem; Elements[i].ExtraData = obj; Elements[i].ExtraStrData = Str; if ( bSorted && !bNoSort ) Sort(); SetIndex(Index); } } function Insert(int i, string NewItem, optional Object obj, optional string Str, optional bool bNoSort, optional bool bSection ) { if ( !IsValidIndex(i) ) Add(NewItem,Obj,Str, bSection); else { if ( !bAllowEmptyItems && NewItem == "" && Obj == None && Str == "" ) return; Elements.Insert(i,1); Elements[i].Item=NewItem; Elements[i].ExtraData=obj; Elements[i].ExtraStrData=Str; Elements[i].bSection=bSection; ItemCount = Elements.Length; if ( bSorted && !bNoSort ) Sort(); SetIndex(Index); if (MyScrollBar != None) MyScrollBar.AlignThumb(); } } function InsertElement( int i, GUIListElem NewElem, optional bool bNoSort ) { Insert( i, NewElem.Item, NewElem.ExtraData, NewElem.ExtraStrData, bNoSort ); } event Swap(int IndexA, int IndexB) { local GUI.GUIListElem elem; if ( IsValidIndex(IndexA) && IsValidIndex(IndexB) ) { elem = Elements[IndexA]; Elements[IndexA] = Elements[IndexB]; Elements[IndexB] = elem; if (bSorted) Sort(); if ( bNotify ) CheckLinkedObjects(Self); } } function LoadFrom(GUIList Source, optional bool bClearFirst) { local string t1,t2; local object t; local int i; if (bClearfirst) Clear(); for (i=0;i 0) return Elements[0].Item; return ""; } return Elements[Index].Item; } function object GetObject() { if ( !IsValid() ) return none; return Elements[Index].ExtraData; } function string GetExtra() { if ( !IsValid() ) return ""; return Elements[Index].ExtraStrData; } function bool IsSection() { if ( !IsValid() ) return false; return Elements[Index].bSection; } // Arbitrary list Item function string GetItemAtIndex(int i) { if (!IsValidIndex(i)) return ""; return Elements[i].Item; } function object GetObjectAtIndex(int i) { if (!IsValidIndex(i)) return None; return Elements[i].ExtraData; } function string GetExtraAtIndex(int i) { if (!IsValidIndex(i)) return ""; return Elements[i].ExtraStrData; } function GetAtIndex(int i, out string ItemStr, out object ExtraObj, out string ExtraStr) { if (!IsValidIndex(i)) return; ItemStr = Elements[i].Item; ExtraObj = Elements[i].ExtraData; ExtraStr = Elements[i].ExtraStrData; } // ===================================================================================================================== // ===================================================================================================================== // Assignment functions // ===================================================================================================================== // ===================================================================================================================== function SetItemAtIndex(int i, string NewItem) { if (!IsValidIndex(i)) return; Elements[i].Item = NewItem; if ( bNotify ) CheckLinkedObjects(Self); } function SetObjectAtIndex(int i, Object NewObject) { if (!IsValidIndex(i)) return; Elements[i].ExtraData = NewObject; if ( bNotify ) CheckLinkedObjects(Self); } function SetExtraAtIndex(int i, string NewExtra) { if (!IsValidIndex(i)) return; Elements[i].ExtraStrData = NewExtra; if ( bNotify ) CheckLinkedObjects(Self); } function RemoveItem(string Item) { local int i; // Work through array. If we find it, remove it (will reduce Elements.Length). // If we don't, move on to next one. while( i < Elements.Length) { if(Item ~= Elements[i].Item) Elements.Remove(i, 1); else i++; } ItemCount = Elements.Length; SetIndex(-1); if (MyScrollBar != None) MyScrollBar.AlignThumb(); } function RemoveObject(Object Obj) { local int i; while (i < Elements.Length) { if (Obj == Elements[i].ExtraData) Elements.Remove(i, 1); else i++; } ItemCount = Elements.Length; SetIndex(-1); if (MyScrollBar != None) MyScrollBar.AlignThumb(); } function RemoveExtra(string Str) { local int i; while (i < Elements.Length) { if (Str ~= Elements[i].ExtraStrData) Elements.Remove(i, 1); else i++; } ItemCount = Elements.Length; SetIndex(-1); if (MyScrollBar != None) MyScrollBar.AlignThumb(); } // ===================================================================================================================== // ===================================================================================================================== // Search functions // ===================================================================================================================== // ===================================================================================================================== function string Find(string Text, optional bool bExact, optional bool bExtra) { local int i; i = FindIndex(Text, bExact, bExtra); if (i != -1) { SetIndex(i); return Elements[i].Item; } return ""; } function int FindExtra(string Text, optional bool bExact) { return FindIndex(Text, bExact, True); } function int FindItemObject(Object Obj) { return FindIndex("",,,Obj); } function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object TestObject) { local int i; if (TestObject != None) { for (i = 0; i < Elements.Length; i++) if ( TestObject == Elements[i].ExtraData ) return i; } else if (Test != "") { if (bExtra) { for (i = 0; i < Elements.Length; i++) if ( (bExact && Elements[i].ExtraStrData == Test) || (!bExact && Elements[i].ExtraStrData ~= Test) ) return i; } else { for ( i = 0; i < Elements.Length; i++) if ( (bExact && Elements[i].Item == Test) || (!bExact && Elements[i].Item ~= Test) ) return i; } } return -1; } // ===================================================================================================================== // ===================================================================================================================== // Drag-n-drop interface // ===================================================================================================================== // ===================================================================================================================== // Called on the drop source when when an Item has been dropped. bAccepted tells it whether // the operation was successful or not. function InternalOnEndDrag(GUIComponent Accepting, bool bAccepted) { local int i; // log(Name@"InternalOnEndDrag Accepting:"$Accepting@"bAccepted:"$bAccepted); if (bAccepted && Accepting != None) { GetPendingElements(); if ( Accepting != Self ) { for ( i = 0; i < SelectedElements.Length; i++ ) RemoveElement(SelectedElements[i]); } bRepeatClick = False; } // Simulate repeat click if the operation was a failure to prevent InternalOnMouseRelease from clearing // the SelectedItems array // This way we don't lose the items we clicked on if (Accepting == None) bRepeatClick = True; SetOutlineAlpha(255); if ( bNotify ) CheckLinkedObjects(Self); } // Called on the drop target when the mouse is released - Sender is always DropTarget function bool InternalOnDragDrop(GUIComponent Sender) { local array NewItem; local int i; // log(Name@"InternalOnDragDrop Sender:"$ Sender); if (Controller.DropTarget == Self) { if (Controller.DropSource != None && GUIList(Controller.DropSource) != None) { NewItem = GUIList(Controller.DropSource).GetPendingElements(); // Special case for drag-n-drop between the same list. if ( Controller.DropSource == Self ) { for ( i = NewItem.Length - 1; i >= 0; i-- ) RemoveElement(NewItem[i],,True); } if ( !IsValidIndex(DropIndex) ) DropIndex = ItemCount; for (i = NewItem.Length - 1; i >= 0; i--) Insert(DropIndex, NewItem[i].Item, NewItem[i].ExtraData, NewItem[i].ExtraStrData); SetIndex(DropIndex); return true; } } return false; } function ClearPendingElements() { Super.ClearPendingElements(); if ( SelectedItems.Length == 0 ) SelectedElements.Remove(0, SelectedElements.Length); } function array GetPendingElements(optional bool bGuarantee) { local int i; if ( (DropState == DRP_Source && Controller.DropSource == Self) || bGuarantee ) { if ( SelectedElements.Length == 0 ) { for (i = 0; i < SelectedItems.Length; i++) if (IsValidIndex(SelectedItems[i])) SelectedElements[SelectedElements.Length] = Elements[SelectedItems[i]]; if ( SelectedElements.Length == 0 && IsValid() ) { SelectedElements.Length = SelectedElements.Length + 1; GetAtIndex(Index, SelectedElements[0].Item, SelectedElements[0].ExtraData, SelectedElements[0].ExtraStrData); } } return SelectedElements; } } F_E0J0{ D V%'| V b| V&'c| | &V | &' GF_K0F_F_| F_F_P0`e`Sr`* l;`Ab `eX%X,Xx-b XXO-b XXU-b XXo-b XXB -(b XXxe6X`RpXO;6X`RpEXU&DF_XU)&`aX`EXU&DYR %R X`XB -'EXB &DYXxGXB GXB c̬?XxGXB GXS GF_I0_R 3.wb *_RhhMLK9:K 9:$K e-~-KNa R6A M6A L6A K9?,eKAa R6A M6A L6A K_aK('B( GF_F_F_RF_F_AWI.f wS*S"\I.gR c,SSINGLEPLAYER couldn't save profile package!e' GF_t F_F_F_F_R0F_F_u)U0S0|c! e GF_fW0yZf dGee G GF_F_F_f Y0V0]O 2rS*((z%S(f  GF_M0cEa rK* cV{wc* wcb b cr b  t b  wb *wr *wr *K*Kr Kr  K r   7K7r vl%vl7r vlKvlr vl8K$wt *wt *K*Kt K?t  7K7t vl%|vl7t vlKvlt vl0Ft   6FK ?FK$pCould not find graphic for weapon: 9Vb C^VY-yc9:c&. , A-yc GF_0Z0j!95j ] Q 0jz-T-E(G-E(J%,J,EJU&DF_JUa'e%e @JU. ceeEJU&DYEJx)Dr J_y GF_`-C f#deR%R,C .R,R`-C Rx.&C RO. ,C RU.,C RB .,C Ro. ,C RH. &l. ,I.,,T.,R.,G.,  GF_K// ==================================================================== // Class: UT2K4UI.GUIListBase // // Abstract GUIList list box component. // // Written by Joe Wilcox // Made abstract by Jack Porter // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIListBase extends GUIComponent Native Abstract; #exec OBJ LOAD FILE=InterfaceContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() bool bSorted; // Should we sort this list var() bool bHotTrack; // Use the Mouse X/Y to always hightlight something var() bool bHotTrackSound; // Whether to make the mouse over sound when hottracking var() bool bDrawSelectionBorder; // Should we draw a selection border around the selected item var() bool bVisibleWhenEmpty; // List is still drawn when there are no items in it. var() bool bNotify; // Used to abort OnChange notification in list var() bool bInitializeList; // If true, set index to 0 when adding first item var() bool bMultiSelect; // allow multiple selections (where implemented) var() bool bAllowEmptyItems; var() noexport GUIScrollBarBase MyScrollBar; // Styles var(Style) string SelectedStyleName; // Name of the style to use for the selected item var(Style) string SectionStyleName; // Name of the style to use for header items var(Style) string OutlineStyleName; var(Style) noexport GUIStyles SelectedStyle; var(Style) noexport GUIStyles SectionStyle; var(Style) noexport GUIStyles OutlineStyle; // Used for outlining a pending drag-n-drop var() ETextAlign SectionJustification; var() Material SelectedImage; // Image to use when displaying var() color SelectedBKColor; // Color for a selection background var() noexport editconst int Top,Index; // Pointers in to the list var() noexport editconst const int ItemsPerPage; // # of items per Page. Is set natively var() noexport editconst const float ItemHeight; // Size of each row. Subclass should set in PreDraw. var() noexport editconst const float ItemWidth; // Width of each row.. Subclass should set in PreDraw. var() noexport editconst int ItemCount; // # of items in this list // Drag-n-drop // You must set these to enable drag-n-drop var() noexport editconst array SelectedItems; var() noexport editconst int LastSelected; // Last selected item var() noexport editconst int LastPressX, LastPressY; // Last position of mouse press var() noexport editconst int DropIndex; // Indicates the insertion position for the drag-n-drop operation var() noexport editconst int MightRemove; // Indicates an item that will be de-selected unless a drag operation begins var() noexport editconstarray array LinkedObjects; // Objects state is changed based on whether this list has a valid index // Not yet implemented (drag-n-drop) // This will eventually allow you to auto-scroll a list while holding the cursor // on the top or bottom item of the target list when moving items delegate OnScrollBy(GUIComponent Sender); // Owner-draw. delegate OnDrawItem(Canvas Canvas, int Item, float X, float Y, float W, float HT, bool bSelected, bool bPending); delegate OnAdjustTop(GUIComponent Sender); // Called when hot tracking, and a new item is highlighted delegate OnTrack(GUIComponent Sender, int LastIndex); delegate CheckLinkedObjects( GUIListBase List ) { if ( IsValid() ) EnableLinkedObjects(); else DisableLinkedObjects(); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController,MyOwner); if (SectionStyleName != "" && SectionStyle == None) SectionStyle = MyController.GetStyle(SectionStyleName,FontScale); if (SelectedStyleName != "" && SelectedStyle == None) SelectedStyle = MyController.GetStyle(SelectedStyleName,FontScale); if (OutlineStyleName != "" && OutlineStyle == None) OutlineStyle = MyController.GetStyle(OutlineStyleName,FontScale); } function Sort(); // Add in a bit function int SilentSetIndex(int NewIndex) { local int i; bNotify = False; i = SetIndex(NewIndex); bNotify = True; return i; } // Should be subclassed event int CalculateIndex(optional bool bRequireValidIndex) { return -1; } function int SetIndex(int NewIndex) { if ( !IsValidIndex(NewIndex) ) Index = -1; else Index = NewIndex; if ( index >= 0 && ItemsPerPage > 0 ) { if ( Index < Top ) SetTopItem(Index); else if ( Index >= Top + ItemsPerPage ) SetTopItem(Index - ItemsPerPage + 1); else if ( bNotify ) CheckLinkedObjects(Self); } else { if ( bNotify ) CheckLinkedObjects(Self); if ( Top >= ItemCount ) Home(); } IndexChanged(self); return Index; } function IndexChanged(GUIComponent Sender) { if ( bNotify ) OnChange(Sender); LastSelected = Index; } function ClearPendingElements() { // log(Name@"ClearPendingElements()"); if (bRepeatClick) { bRepeatClick = False; return; } SelectedItems.Remove(0, SelectedItems.Length); DropIndex = -1; } function Clear() { Top = 0; ItemCount=0; SetIndex(-1); MyScrollBar.AlignThumb(); } function MakeVisible(float Perc) { SetTopItem(int((ItemCount-ItemsPerPage) * Perc)); } function SetTopItem(int Item) { //log("GUIListBase::SetTopItem"@Item@"ItemsPerPage:"$ItemsPerPage); Top = Item; if (Top+ItemsPerPage>=ItemCount) Top = ItemCount - ItemsPerPage; if (Top<0) Top=0; if ( bNotify ) CheckLinkedObjects(Self); OnAdjustTop(Self); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); } function int AddLinkObject( GUIComponent NewObj, optional bool bNoCheck ) { local int i; if ( NewObj != None ) { if ( !bNoCheck ) { for (i = 0; i < LinkedObjects.Length; i++) if ( LinkedObjects[i] == NewObj ) return i; } i = LinkedObjects.Length; LinkedObjects[i] = NewObj; return i; } return -1; } function InitLinkObjects( array NewObj, optional bool bNoCheck ) { local int i; if ( !bNoCheck ) { for (i = NewObj.Length - 1; i >= 0; i--) if ( NewObj[i] == None ) NewObj.Remove(i,1); } LinkedObjects = NewObj; if ( bNotify ) CheckLinkedObjects(Self); } function EnableLinkedObjects() { local int i; for (i = 0; i < LinkedObjects.Length; i++) if ( LinkedObjects[i] != None ) EnableComponent(LinkedObjects[i]); } function DisableLinkedObjects() { local int i; for (i = 0; i < LinkedObjects.Length; i++) if ( LinkedObjects[i] != None ) DisableComponent(LinkedObjects[i]); } function bool IsValid() { if (Index < 0 || Index >= ItemCount) return false; return true; } function bool IsValidIndex( int i ) { if ( i < 0 || i >= ItemCount ) return false; return true; } event string AdditionalDebugString() { return " SelectedItems:"@ SelectedItems.Length; } function string GetItemAtIndex( int idx ) { return ""; } // Specify true for bGuarantee to receive the selected item if there are no "pending" items function array GetPendingItems(optional bool bGuarantee) { local int i; local array Items; if ( (DropState == DRP_Source && Controller.DropSource == Self) || bGuarantee ) { for ( i = 0; i < SelectedItems.Length; i++ ) if ( IsValidIndex(SelectedItems[i]) ) Items[Items.Length] = GetItemAtIndex(SelectedItems[i]); if ( Items.Length == 0 && IsValid() ) Items[0] = GetItemAtIndex(Index); } return Items; } function bool InternalOnKeyEvent( out byte Key, out byte KeyState, float Delta ) { local int i; local Interactions.EInputKey iKey; if ( ItemsPerPage == 0 || ItemsPerPage == 0 ) return false; iKey = EInputKey(Key); if ( KeyState == 3 && ikey == IK_MouseWheelUp ) { WheelUp(); return true; } if ( KeyState == 3 && ikey == IK_MouseWheelDown ) { WheelDown(); return true; } if ( KeyState != 1 ) return false; switch ( iKey ) { case IK_Up: if ( Up() ) return true; break; case IK_Down: if ( !Controller.ShiftPressed && Down() ) return true; break; case IK_Left: if ( MoveLeft() ) return true; break; case IK_Right: if ( MoveRight() ) return true; break; case IK_Home: Home(); return true; case IK_End: End(); return true; case IK_PageUp: PgUp(); return true; case IK_PageDown: PgDn(); return true; case IK_A: if ( Controller.CtrlPressed && bMultiSelect ) { SelectedItems.Length = ItemCount; for ( i = 0; i < ItemCount; i++ ) SelectedItems[i] = i; return true; } } return false; } function bool Up() { return false; } function bool Down() { return false; } function bool MoveRight() { return false; } function bool MoveLeft() { return false; } function WheelUp(); function WheelDown(); function PgUp(); function PgDn(); function Home(); function End(); // We've received a mouse press in the drop source function InternalOnMousePressed(GUIComponent Sender, bool IsRepeat) { local int i, j, k, NewIndex; if ( !IsInClientBounds() || ItemsPerPage == 0 ) return; // If not holding down the mouse if (!IsRepeat && ItemCount > 0) { // log(Name@"InternalOnMousePressed"); NewIndex = CalculateIndex(True); if ( NewIndex == -1 ) return; LastPressX = Controller.MouseX; LastPressY = Controller.MouseY; // If we had an Item selected, go ahead and add it to the drag-n-drop list if ( Controller.CtrlPressed && bMultiSelect && SelectedItems.Length == 0 && NewIndex != Index ) SelectedItems[SelectedItems.Length] = Index; // If shift is pressed, do shift selection if ( Controller.ShiftPressed && IsMultiSelect() ) { if ( LastSelected == -1 ) LastSelected = 0; // If not pressing Ctrl, clear out the SelectedItems array if ( !Controller.CtrlPressed ) for ( j = SelectedItems.Length - 1; j >= 0; j-- ) if ( SelectedItems[j] != Index ) SelectedItems.Remove(j,1); for ( j = Min(LastSelected, NewIndex); j <= Max(LastSelected, NewIndex); j++ ) { for ( k = 0; k < SelectedItems.Length; k++ ) { if ( j == SelectedItems[k] ) break; if ( j < SelectedItems[k] ) { SelectedItems.Insert(k, 1); SelectedItems[k] = j; break; } } if ( k == SelectedItems.Length ) SelectedItems[k] = j; } return; } else { LastSelected = NewIndex; if ( IsMultiSelect() ) Index = NewIndex; } // Find out if the this index is already in our selected list for (i = 0; i < SelectedItems.Length; i++) if (SelectedItems[i] == NewIndex) break; // If it was found, remove it (allows toggling an Item's selectedness) // don't remove it immediately, but set MightRemove. This way, if the user drags // the selected Item, instead of releasing the mouse, we won't deselect it. if (i < SelectedItems.Length) MightRemove = i; else if (Controller.CtrlPressed && bMultiSelect) { for ( i = 0; i < SelectedItems.Length; i++ ) if ( NewIndex < SelectedItems[i] ) { SelectedItems.Insert(i, 1); SelectedItems[i] = NewIndex; break; } if ( i == SelectedItems.Length ) SelectedItems[i] = NewIndex; } else if (SelectedItems.Length > 0 && MightRemove == -1) SelectedItems.Remove(0, SelectedItems.Length); } } // Called on both the source and target when mouse is released. function InternalOnMouseRelease(GUIComponent Sender) { // log(Name@"InternalOnMouseRelease Sender:"$Sender.Name); if ( MightRemove >= 0 && MightRemove < SelectedItems.Length ) SelectedItems.Remove(MightRemove, 1); MightRemove = -1; // Stop here if we aren't doing a multi-selection if ( !IsMultiSelect() ) ClearPendingElements(); } // Called when mouse is pressed and user begins to move mouse while items are selected. function bool InternalOnBeginDrag(GUIComponent Sender) { if ( Controller == None ) return false; // Must move the mouse more than 3 pixels in order to begin a drag operation // to account for accidentally moving the mouse a little while clicking if ( (Abs(LastPressX - Controller.MouseX) < 3) && (Abs(LastPressY - Controller.MouseY) < 3) ) return false; // log(Name@"InternalOnBeginDrag"); MightRemove = -1; if ( SelectedItems.Length == 0 ) CheckDragSelect(); // Assign the offset that native rendering will use to draw the hovering selection UpdateOffset(ClientBounds[0], ClientBounds[1], ClientBounds[2], ClientBounds[3]); SetOutlineAlpha(128); return true; } // Find out if we were clicking on any Item - if so, add it to SelectedItems function CheckDragSelect() { local int i; i = CalculateIndex(True); if ( i < 0 ) return; SetIndex(i); SelectedItems[SelectedItems.Length] = i; } function bool InternalOnRightClick( GUIComponent Sender ) { if ( bDropSource && bMultiSelect && SelectedItems.Length > 0 ) Controller.bIgnoreNextRelease = True; return true; } // Called on the drop source when when an Item has been dropped. bAccepted tells it whether // the operation was successful or not. // Should be subclassed function InternalOnEndDrag(GUIComponent Accepting, bool bAccepted); // Called on the drop target when the mouse is released - Sender is always DropTarget // Should be subclassed function bool InternalOnDragDrop(GUIComponent Sender) { return false; } // Called on whatever component the data is being dragged over function InternalOnDragOver(GUIComponent Sender) { local int NewIndex; if ( Controller == None ) return; if (Controller.DropTarget == Self) { NewIndex = CalculateIndex(True); if (NewIndex == -1) { DropIndex = -1; return; } // Remove any items that were selected in this list if ( Controller.DropSource != Self && SelectedItems.Length > 0 ) SelectedItems.Remove(0, SelectedItems.Length); DropIndex = NewIndex; } } function InternalOnDragEnter(GUIComponent Sender) { /* Uncomment to add special mouse cursor MouseCursorIndex = -- "OK to drop here" mouse cursor -- ; */ SetOutlineAlpha(255); } function InternalOnDragLeave(GUIComponent Sender) { /* Uncomment to add special mouse cursor MouseCursorIndex = -- "Cannot drop here" mouse cursor --; */ SetOutlineAlpha(128); if (DropIndex >= 0) DropIndex = -1; } event bool IsMultiSelect() { if ( Controller == None ) return false; return bDropSource && bMultiSelect && DropState != DRP_Source && (Controller.CtrlPressed || Controller.ShiftPressed) && OnMultiSelect(Self); } function SetOutlineAlpha(int NewAlpha) { local int i; if (OutlineStyle == None) return; for (i = 0; i < 5; i++) OutlineStyle.ImgColors[i].A = NewAlpha; } F_F_ F_X0r]%rr%EC&Prr,-Eo-c,--E --E rr,}bV{. ,-}b$}b$}b GF_F_F_F_F_F_ F_F_F_F_F_d0 5F_g0 8F_f0uPF_c-uPF_ 4F_F_F_h0F_F_Z-uPF_q0i0s  @' GF_t// ==================================================================== // Class: XInterface.GUIHorzScrollZone // Parent: XInterface.GUIComponent // // Scrollzone implementation for horizontal lists. // ==================================================================== class GUIHorzScrollZone extends GUIScrollZoneBase; function bool InternalOnClick(GUIComponent Sender) { local float perc; if (!IsInBounds()) return false; perc = ( Controller.MouseX - ActualLeft() ) / ActualWidth(); OnScrollZoneClick(perc); return true; } F_Aclass GUIHorzScrollButton extends GUIScrollButtonBase; var() bool LeftButton; function InitComponent(GUIController MyController, GUIComponent MyOwner) { if (bIncreaseButton) ImageIndex = 3; Super.Initcomponent(MyController, MyOwner); } F_@F_F_yF_F_o0F_F_u0p0W4 |Ey17y% M.A=:QA C~xInterface.Tab_SPProfileLoad '' GF_F_F_F_F_r0F_F_|0t0t JZz' GF_ORyQ-!;OQ-P-}.yWE}&DyGE})DISXt bRy}SmwXt*}e%XtrL GF_F_F_w0F_F_Xz0-/}-a GF_F_F_y0~A46} I -~' GF_B1x0u Zk' GF_F_F_w// ==================================================================== // Class: XInterface.GUIHorzScrollBar // Parent: XInterface.GUIScrollBarBase // // Scrollbar assembly for horizontal lists. // ==================================================================== class GUIHorzScrollBar extends GUIScrollBarBase; // Record location you grabbed the grip function GripPressed( GUIComponent Sender, bool IsRepeat ) { if ( !IsRepeat ) GrabOffset = Controller.MouseX - MyGripButton.ActualLeft(); } function bool GripPreDraw( GUIComponent Sender ) { local float NewPerc; if ( MyGripButton.MenuState != MSAT_Pressed ) return false; // Calculate the new Grip Top using the mouse cursor location. NewPerc = FClamp( (Controller.MouseX - GrabOffset - MyScrollZone.ActualLeft()) / (MyScrollZone.ActualWidth() - GripSize), 0.0, 1.0 ); UpdateGripPosition(NewPerc); return false; } function ZoneClick(float Delta) { if ( Controller.MouseX < MyGripButton.Bounds[0] ) MoveGripBy(-BigStep); else if ( Controller.MouseX > MyGripButton.Bounds[2] ) MoveGripBy(BigStep); return; } F_F_F_ON-M-!ZOM-L-i.Wi}-~r-MywP-Ba-N- GF_0F_F_K1A1w [P' GF_RD1F/iF GF_F_F_C1K-34i 3K- GF_F_F_wH1K@iK GF_F_F_OJ-kJ$ikJ--I--Dy GF_F1F_F_S1J1| ![u' GF_@F_F_MF-.T!i.F-C-@- GF_@F_F_k// ==================================================================== // Class: UT2K4UI.GUIListBox // // The GUIListBoxBase is a wrapper for a GUIList and it's ScrollBar // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIListBox extends GUIListBoxBase native; var GUIList List; // For Quick Access; function InitBaseList(GUIListBase LocalList) { if ((List == None || List != LocalList) && GUIList(LocalList) != None) List = GUIList(LocalList); List.OnClick=InternalOnClick; List.OnClickSound=CS_Click; List.OnDblClick=InternalOnDblClick; List.OnChange=InternalOnChange; Super.InitBaseList(LocalList); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); if (DefaultListClass != "") { List = GUIList(AddComponent(DefaultListClass)); if (List == None) { log(Class$".InitComponent - Could not create default list ["$DefaultListClass$"]"); return; } } if (List == None) { Warn("Could not initialize list!"); return; } InitBaseList(List); } function bool InternalOnClick(GUIComponent Sender) { List.InternalOnClick(Sender); OnClick(Self); return true; } function bool InternalOnDblClick(GUIComponent Sender) { // List.InternalOnDblClick(Sender); // OnDblClick(Self); return true; } function InternalOnChange(GUIComponent Sender) { if (Controller != None && Controller.bCurMenuInitialized) OnChange(Self); } function int ItemCount() { return List.ItemCount; } function bool MyOpen(GUIContextMenu Menu) { return HandleContextMenuOpen(self, Menu, Menu.MenuOwner); } function bool MyClose(GUIContextMenu Sender) { return HandleContextMenuClose(Sender); } F_xF_F_M1,BY!iB,~, GF_P1F_F_U1R1} )zU9U9pRz\9\9qZU9xxGame.UT2003GameProfile Vc,xGameProfileZwV*V*-z( |EyB%BB7y8|ByZ-z'BB-z "KXInterface.GUIQuestionPagef .I ]f +`f ng,profZ$$'Vc,xGameProfileZ_wV*VU9V\9V9VZ%V[IV9?Q Sc,VV Uc,Zc,-'tc, ZSINGLEPLAYER couldn't save profile package!.A=:QA C~xInterface.Tab_SPProfileLoad '.A=N CJ'dc,M"pSTART ut2-intro.ut2?quickstart=true?TeamScreen=False?savegame=Z X( "KXInterface.GUIQuestionPagef .I ]f `h,$$'' GF_Q1},r^si r}, GF_\1@xW mU9p\9qQ && gm[ kc,Z{ GF_@F_F_T1|,sci s|, GF_@F_F_F_F_W1[1(h iI GF_@F_F_d1T  k u FFt'T %rT 7tI.T t Ze 9ST IT  GF_Z1^1{mV i{ GF_F_F_]1`1Yr iY GF_@F_F__1w,&x i&w,-~ GF_@F_F_vv,a i a-v, GF_h1b1ybb 9VZ% GF_f3// ==================================================================== // Class: UT2K4UI.GUIHorzList // Parent: UT2K4UI.GUIListBase // // // ==================================================================== class GUIHorzList extends GUIListBase Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) event int CalculateIndex(optional bool bRequireValidIndex) { local int i, NewIndex; i = Top + ((Controller.MouseX - ClientBounds[0]) / ItemWidth); if ( i >= ItemCount && bRequireValidIndex ) i = -1; NewIndex = Min( i, ItemCount - 1 ); return NewIndex; } function bool InternalOnClick(GUIComponent Sender) { local int NewIndex; if ( !IsInClientBounds() || ItemsPerPage == 0 ) return false; NewIndex = CalculateIndex(); SetIndex(NewIndex); return true; } function bool InternalOnKeyType(out byte Key, optional string Unicode) { // Add code to jump to next line with Char return false; } function WheelUp() { if (MyScrollBar!=None) GUIHorzScrollBar(MyScrollBar).WheelUp(); else { if (!Controller.CtrlPressed) ScrollLeft(); else PgUp(); } } function WheelDown() { if (MyScrollBar!=None) GUIHorzScrollBar(MyScrollBar).WheelDown(); else { if (!Controller.CtrlPressed) ScrollRight(); else PgDn(); } } function bool MoveLeft() { if ( (ItemCount<2) || (Index==0) ) return true; Index = max(0,Index-1); if ( (IndexTop+ItemsPerPage) ) { Top = Index; MyScrollBar.AlignThumb(); } return true; } function bool MoveRight() { if ( (ItemCount<2) || (Index==ItemCount-1) ) return true; Index = min(Index+1,ItemCount-1); if (Index=Top+ItemsPerPage) { Top = Index-ItemsPerPage+1; MyScrollBar.AlignThumb(); } return true; } function ScrollLeft() { MoveLeft(); } function ScrollRight() { MoveRight(); } function Home() { if (ItemCount<2) return; SetIndex(0); Top = 0; MyScrollBar.AlignThumb(); } function End() { if (ItemCount<2) return; Top = ItemCount - ItemsPerPage; if (Top<0) Top = 0; SetIndex(ItemCount-1); MyScrollBar.AlignThumb(); } function PgUp() { if (ItemCount<2) return; Index -= ItemsPerPage; // Adjust to bounds if (Index < 0) Index = 0; // If new index if (Top + ItemsPerPage <= Index) // If index is forward but not visible, jump to it Top = Index; else if (Index + ItemsPerPage < Top) // Item is way too far Top = Index; else if (Index < Top) // Item is 1 page or less away SetTopItem(Top - ItemsPerPage); SetIndex(Index); MyScrollBar.AlignThumb(); } function PgDn() { if (ItemCount<2) return; // Select item 1 page away from current selection Index += ItemsPerPage; // Adjust to bounds if (Index >= ItemCount) Index = ItemCount-1; if (Index < Top) // If item is still before Top Item, go to it Top = Index; else if (Index - Top - ItemsPerPage >= ItemsPerPage) // Too far away SetTopItem(Index); else if (Index - Top >= ItemsPerPage) // Just 1 page away SetTopItem(Top + ItemsPerPage); SetIndex(Index); MyScrollBar.AlignThumb(); } F_@F_F_Ots,!FOs,r,_.Wa-u,-Bz -t GF_m1t,z] pd,p09St,, GF_F_F_fk1((_( GF_@F_F_j1p,&- _ &p, GF_o1rCN ;rrU8zU9pU9ssrr\sz\9q\9[r GF_l1o,a2MwP-o, GF_\q1iG\AQ Ce*.CA==SAQ.CA== kA GF_nk,m=_-g-k, GF_0s1l,!!0U..`,WUN,U-y 'EU)DC\..`,W\N,E\)DCQ ..`,W[.,Z.G, 0l,m,' ^-T[|UNLOCKDUP;[ |DUP,~[,~[,~[, ~Z, ~Z, ~Z% gcQ . gmQ a' @ GF_p1j,lB_-U-j, GF_u1 22F_r1i,z GU_-e+-i, GF_U 1F_g,F_F_v1F_F_B/// ==================================================================== // Class: UT2K4UI.GUIListBoxBase // // The GUIListBoxBase is a wrapper for a GUIList and it's ScrollBar // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIListBoxBase extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // Styles var() string SelectedStyleName; // For propagating selected style to the list var() string SectionStyleName; // For propagating section style to the list var() string OutlineStyleName; // For propagating outline styles to the list var() string DefaultListClass; var automated GUIScrollBarBase MyScrollBar; var() editconst GUIListBase MyList; var() bool bVisibleWhenEmpty; // List box is visible when empty. var() bool bSorted; var() bool bInitializeList; // Propagated to list function InitComponent(GUIController MyController, GUIComponent MyOwner) { local bool bTemp; // Delay propagation until InitBaseList bTemp = PropagateVisibility; PropagateVisibility = False; Super.InitComponent(MyController, MyOwner); PropagateVisibility = bTemp; } function InitBaseList(GUIListBase LocalList) { MyList = LocalList; LocalList.bNeverScale = True; LocalList.StyleName = StyleName; LocalList.bVisibleWhenEmpty = bVisibleWhenEmpty; LocalList.MyScrollBar = MyScrollBar; LocalList.bInitializeList = bInitializeList; LocalList.bSorted = bSorted; LocalList.FontScale = FontScale; MyScrollBar.bTabStop = false; MyScrollBar.SetList(LocalList); SetVisibility(bVisible); SetHint(Hint); } function SetHint(string NewHint) { local int i; Super.SetHint(NewHint); for (i=0;i=0 && ImageIndex < MyController.ImageList.Length) Graphic=MyController.ImageList[ImageIndex]; } function SetChecked(bool bNewChecked) { if (bCheckBox) { bChecked = bNewChecked; OnChange(Self); } } function bool InternalOnClick(GUIComponent Sender) { if (bCheckBox) bChecked = !bChecked; OnChange(Self); return true; } F_N2G2DU.A=9QA CX*xInterface.Tab_SPProfileNew '' GF_}F_F_csN,!'ccN,M,aSnEa&DU a-{'a-a(ak$Ea)Da EaB,Dn az,$SnqEE}&DK E}pDk }MM}{ { }-_ -U,EaDDo ECr)DJCr~abEQ GF_K2F_F_S2M2H  "KXInterface.GUIQuestionPageUfI}.I h}+`}nt+profU$0$ E}E DJ ' GF_@o cs iL-ep9WListDeactivate Edit.bPendingFocus: 9T}-of}-oZ  GF_O2wwn l< a.-ep9WInvalidate Who:9VwwHwww ] }u*Z  GF_P2R2k x) H-e稨9WEditPressed MyListBox.bVisible:9TSn-}-_  -J,Sn- -i#'JZ   GF_J,F_F_c2K,J 9:K,,|fIswS*zS|c,*c, |pSINGLEPLAYER Tab_SPProfileLoad::ButtonClick() failed to delete GameProfile |dO GF_Q2F,a Y-e9WListClick>-Ea )F,}u*Z ' GF_]F_F_F_F_uZ G!-e9WHideListBoxCw]SVw *Cre, VvSnqEaaQa fES, GF_lY2J H-ep9WShowListBox MyListBox.bVisible:9TSn-CqtSSnaESn-Sn-Cre, VvCre, VvSn-au*a\a ' GF_Z2F_F_F_F_X2\2U unSa &aIk-U, -E-~S,}9C&P GF_F_F_[2^2K _X -E}9S,UU-U, -~S,}9C&P GF_F_F_]2^&Xhpa fE^=-U,-x p% } &^S,}9 GF_U2F_F_eb2I}( GF_@F_F_k2`2QCjfI]xGame.UT2003GameProfile N c,]GameProfilej>wN *c,N N Uc,j&N %}N C@'8}N CJ'd' GF_a2e2( # I GF_@F_F_d2g2{uC`aI>|`}(a{* GF_`F_F_ZZ// ==================================================================== // Class: UT2K4UI.GUIMultiComponent // // MenuOptions combine a label and any other component in to 1 single // control. The Label is left justified, the control is right. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIMenuOption extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var(Option) editconst bool bIgnoreChange; // Don't want an OnChange event var(Option) bool bValueReadOnly; // Value of this option cannot be modified by input var(Option) bool bAutoSizeCaption; // Extend CaptionWidth if caption is too long var(Option) bool bHeightFromComponent; // Get the Height of this component from the Component var(Option) bool bFlipped; // Draw the Component to the left of the caption var(Option) bool bSquare; // Use the Height for the Width var(Option) bool bVerticalLayout; // Layout controls vertically var(Option) eTextAlign LabelJustification; // How do we justify the label var(Option) eTextAlign ComponentJustification; // How do we justify the label var(Option) float CaptionWidth; // How big should the Caption be var(Option) float ComponentWidth; // How big should the Component be (-1 = 1-CaptionWidth) var(Option) localized string Caption; // Caption for the label var(Option) string ComponentClassName; // Name of the component to spawn var(Option) string LabelFont; // Name of the Font for the label var(Option) string LabelStyleName; // The Style for the label var(Option) Color LabelColor; // Color for the label var(Option) editconst noexport GUILabel MyLabel; // Holds the label var(Option) editconst noexport GUIComponent MyComponent; // Holds the component function InitComponent(GUIController MyController, GUIComponent MyOwner) { if (bVerticalLayout) StandardHeight *= 2; Super.Initcomponent(MyController, MyOwner); // Create the two components MyLabel = GUILabel(AddComponent("XInterface.GUILabel")); if (MyLabel==None) { log("Failed to create "@self@" due to problems creating GUILabel"); return; } if (bFlipped) { if (LabelJustification==TXTA_Left) LabelJustification=TXTA_Right; else if (LabelJustification==TXTA_Right) LabelJustification=TXTA_Left; if (ComponentJustification==TXTA_Left) ComponentJustification=TXTA_Right; else if (ComponentJustification==TXTA_Right) ComponentJustification=TXTA_Left; } MyLabel.Caption = Caption; if ( LabelStyleName == "" ) { MyLabel.TextColor = LabelColor; MyLabel.TextFont = LabelFont; } else MyLabel.Style = Controller.GetStyle(LabelStyleName,MyLabel.FontScale); MyLabel.FontScale = FontScale; MyLabel.TextAlign = LabelJustification; MyLabel.IniOption = IniOption; MyLabel.bNeverScale = True; if (ComponentClassName == "") return; MyComponent = AddComponent(ComponentClassName); // Check for errors if (MyComponent == None) { log("Could not create requested menu component"@ComponentClassName); return; } SetHint(Hint); MyComponent.IniOption = IniOption; if (bHeightFromComponent && !bVerticalLayout) WinHeight = MyComponent.WinHeight; else MyComponent.WinHeight = WinHeight; MyComponent.OnChange = InternalOnChange; MyComponent.bTabStop = true; MyComponent.TabOrder = 1; MyComponent.bNeverScale = True; MyComponent.bNeverFocus = bNeverFocus; SetFriendlyLabel(MyLabel); if ( MenuState == MSAT_Disabled ) { MenuState = MSAT_Blurry; DisableMe(); } } // Used for MultiOptionLists function SetComponentValue(coerce string NewValue, optional bool bNoChange); function string GetComponentValue() { return ""; } // Reset component to default state function ResetComponent() { SetComponentValue(IniDefault); } function SetReadOnly( bool bValue ) { bValueReadOnly = bValue; } function SetHint(string NewHint) { Super.SetHint(NewHint); MyLabel.SetHint(NewHint); MyComponent.SetHint(NewHint); } function SetCaption(string NewCaption) { Caption = NewCaption; MyLabel.Caption = NewCaption; } // This is the function that the GUIMultiOptionList will call when this component has been clicked on, // since it overrides the component's OnClick() delegate // Return false to prevent the GUIMultiOptionList from passing the OnClick notification upwards function bool MenuOptionClicked(GUIComponent Sender) { return true; } function InternalOnChange(GUIComponent Sender) { if (Controller != None && Controller.bCurMenuInitialized) { if ( !bIgnoreChange ) OnChange(Self); } bIgnoreChange = False; } function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender); function CenterMouse() { if ( MyComponent != None ) MyComponent.CenterMouse(); else Super.CenterMouse(); } function SetFriendlyLabel( GUILabel NewLabel ) { Super.SetFriendlyLabel(NewLabel); if ( MyComponent != None ) MyComponent.SetFriendlyLabel(NewLabel); } F_f2j2Y!DaaI>|a}(aY GF_a@F_F_q2ecex efIzeE&J&N&,m`%.InterfaceContent.pEmptySlot a%*O&P&Q&R&]& Sc, GameProfileeOrS* _ SE&SJ&SN$&9DS%cm`%6_a%.S O&9SS P&9SS Q&9SS R&9SS ]&9SS  GF_i2}+3&a 3}+ GF_@F_F_l2o2K+a  GF_F_F_n2{+.0Q!a1{+z+y+ GF_r2bON  |EbfRs%rs7bf1sbs5cSwc*fkcc GF_fs2yD O GF_\u2i=Q\AQ Cn*.CA== kA GF_p2u+B5a|u+f+ GF_0fv+!30v+w+d.%f.&EftDD E.,J.,N.,O.,P.,Q.,`. ,a. , R.,].,@ Sw@ *fk@ dw.*@ *.*@ a %}N C@'}N CJ'O GF_jHclass GUIMultiColumnList extends GUIVertList native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) struct native init MultiColumnSortData { var() editconst const string SortString; // Set by GetSortString() var() editconst const int SortItem; // Should be the index into your array for the corresponding SortString cppstruct { FMultiColumnSortData( INT InSortItem = INDEX_NONE, const TCHAR* InString = TEXT("") ); } }; // There should always be the same number of ColumnHeadings as InitColumnPerc var() localized array ColumnHeadings; var() array InitColumnPerc; var() localized array ColumnHeadingHints; // Set natively, for speed var const array SortData; // Filled with results of GetSortString() var const array InvSortData; // Used for keeping same item selected after sorting var() const editconst array ColumnWidths; // sorting stuff var() float CellSpacing; var() int SortColumn; // Column that is currently used for sorting ( -1 for no sorting ) var() bool NeedsSorting; // Will automatically sort when this is true var() bool SortDescending; // Used by native sorting to determine which direction to sort var() bool ExpandLastColumn; // If true & columns widths do not add up to 100%, last column will be stretched // notification delegate OnColumnSized(int column); native final function int GetListIndex( int YourArrayIndex ); native final function ChangeSortOrder(); native final function SortList(); native final function UpdatedItem( int YourArrayIndex ); // should be called when we update an item's data native final function RemovedItem( int YourArrayIndex ); // must be called when we add an item to the list. // If your data is contained in a single array, but is represented as multiple multicolumn lists, // pass in your array index (see UT2K4Tab_PlayerLoginControls for an example of this) native final function AddedItem(optional int YourArrayIndex); delegate string GetSortString( int YourArrayIndex ); function int CurrentListId() { if (Index < 0) return -1; return SortData[Index].SortItem; } event OnSortChanged() { if (SortData.Length <= 0) return; ChangeSortOrder(); // resort list SortList(); // remap the selection item back again to keep the same item selected if ( IsValid() ) Index = InvSortData[Index]; } function Clear() { SortData.Remove(0,SortData.Length); InvSortData.Remove(0,InvSortData.Length); Super.Clear(); } function RemovedCurrent() { if ( IsValid() ) { RemovedItem(CurrentListId()); SetIndex(Index); } } function ResolutionChanged( int ResX, int ResY ) { if ( !bInit ) bInit = True; Super.ResolutionChanged(ResX,ResY); } event InitializeColumns(Canvas C) { local int i; local float AW; if ( bDebugging ) log(Name@"#### InitializeColumns ActualWidth() = "@ActualWidth()@"WinWidth:"$WinWidth); AW = ActualWidth(); for(i=0; i= Bounds[2] ) Width = 0; if (Left + Width >= Bounds[2]) Width = Bounds[2] - Left; if ( Width < 0 ) Width = 0; } function Sort() { SortList(); } function Dump() { local int i; log("Dumping multicolumn list contents '"$Name$"'"); for ( i = 0; i < SortData.Length; i++ ) { if ( i < InvSortData.Length ) log(" " $ i $ ")" @ "'" $ SortData[i].SortString $ "'" @ SortData[i].SortItem @ "InvSortData:"$InvSortData[i]); else log(" " $ i $ ")" @ "'" $ SortData[i].SortString $ "'" @ SortData[i].SortItem @ "InvSortData: Invalid"); } } F_t2b+r:a xb+ GF_D3]}$g S!wg *U--]U-E-]U-w-]!-],g 7g   UeuPlayerPictures.aDOM!hg A,,g UeupSinglePlayerThumbs.h GF_@F_F_w2a+s?Pa C a+ GF_,//==================================================================== // Parent: GUIListBoxBase // Class: UT2K4UI.GUIMultiColumnListBox // Date: 05-01-2003 // // Base class for listboxes which use multiple columns for showing data. // // Updated by Ron Prestenback // TODO: Update all panels that use this component to save the header column perc's // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIMultiColumnListBox extends GUIListBoxBase native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var Automated GUIMultiColumnListHeader Header; var() bool bDisplayHeader; var() editconst GUIMultiColumnList List; var() array HeaderColumnPerc; var() localized array ColumnHeadings; var() bool bFullHeightStyle; function InitBaseList(GUIListBase LocalList) { if ((List == None || List != LocalList) && GUIMultiColumnList(LocalList) != None) List = GUIMultiColumnList(LocalList); if ( ColumnHeadings.Length > 0 ) List.ColumnHeadings = ColumnHeadings; Header.MyList = List; Super.InitBaseList(LocalList); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if (DefaultListClass!="") { List = GUIMultiColumnList(AddComponent(DefaultListClass)); if (List==None) { log(Class$".InitComponent - Could not create default list ["$DefaultListClass$"]"); return; } } if (List == None) { Warn("Could not initialize list!"); return; } InitBaseList(List); if (bFullHeightStyle) List.Style=None; } function InternalOnLoadIni(GUIComponent Sender, string S) { local int i; if (GUIMultiColumnList(Sender) != None) { if (HeaderColumnPerc.Length == GUIMultiColumnList(Sender).InitColumnPerc.Length) GUIMultiColumnList(Sender).InitColumnPerc = HeaderColumnPerc; else { if (GUIMultiColumnList(Sender).InitColumnPerc.Length == 0) GUIMultiColumnList(Sender).InitColumnPerc.Length = HeaderColumnPerc.Length; for (i = 0; i < HeaderColumnPerc.Length && i < GUIMultiColumnList(Sender).InitColumnPerc.Length; i++) GUIMultiColumnList(Sender).InitColumnPerc[i] = HeaderColumnPerc[i]; } } } function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender) { if (GUIMultiColumnList(NewComp) != None) { GUIMultiColumnList(NewComp).OnColumnSized = InternalOnColumnSized; NewComp.IniOption = "@Internal"; NewComp.OnLoadINI = InternalOnLoadIni; } Super.InternalOnCreateComponent(NewComp, Sender); } function InternalOnColumnSized(int Column) { HeaderColumnPerc[Column] = List.ColumnWidths[Column] / ActualWidth(); } F_F_F_z2_+kD$ak_+-^+-sw GF_L F_F_~2F_F_@F_F_dB3FS1a GF_F_F_A3]+aXp}-_ -]+ GF_J32@M*^S%w^*Jw^*. ^-'^,^^,L .*^wL *L #~L a ^L *F^"A^^C^^' GF_nF_F_o// ==================================================================== // Class: UT2K4UI.GUIFont // // GUIFont is used to give a single pipeline for handling fonts at // multiple resolutions while at the same time supporting resolution // independant fonts (for browsers, etc). // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIFont extends GUI Abstract Native; var(Menu) string KeyName; var(Menu) bool bFixedSize; // If true, only FontArray[0] is used var(Menu) bool bScaled; // This font is scaled var(Menu) int NormalXRes; // If Scaled, this is it's default resolution var(Menu) int FallBackRes; // If the Resolution is <= this value, it will use the fallback font. var(Menu) localized array FontArrayNames; // Holds all of the names of the fonts var(Menu) array FontArrayFonts; // Holds all of the fonts native event Font GetFont(int XRes); // Returns the font for the current resolution // Dynamically load font. static function Font LoadFontStatic(int i) { if( i>=default.FontArrayFonts.Length || default.FontArrayFonts[i] == None ) { default.FontArrayFonts[i] = Font(DynamicLoadObject(default.FontArrayNames[i], class'Font')); if( default.FontArrayFonts[i] == None ) Log("Warning: "$default.Class$" Couldn't dynamically load font "$default.FontArrayNames[i]); } return default.FontArrayFonts[i]; } function Font LoadFont(int i) { if( i>=FontArrayFonts.Length || FontArrayFonts[i] == None ) { FontArrayFonts[i] = Font(DynamicLoadObject(FontArrayNames[i], class'Font')); if( FontArrayFonts[i] == None ) Log("Warning: "$Self$" Couldn't dynamically load font "$FontArrayNames[i]); } return FontArrayFonts[i]; } F_F_F_oj// ==================================================================== // Class: XInterface.GUIEditBox // // GUIEditBox - The basic text edit control. I've merged Normal // edit, restricted edit, numeric edit and password edit in to 1 control. // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIEditBox extends GUIButton Native; #exec OBJ LOAD FILE=InterfaceContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() string TextStr; // Holds the current string var() string AllowedCharSet; // Only Allow these characters var() bool bMaskText; // Displays the text as a * var() bool bIntOnly; // Only Allow Interger Numeric entry var() bool bFloatOnly; // Only Allow Float Numeric entry var() bool bIncludeSign; // Do we need to allow a -/+ sign var() bool bConvertSpaces; // Do we want to convert Spaces to "_" var() int MaxWidth; // Holds the maximum width (in chars) of the string - 0 = No Max var() eTextCase TextCase; // Controls forcing case, etc var() int BorderOffsets[4]; // How far in from the edit is the edit area var() bool bReadOnly; // Can't actually edit this box var() bool bAlwaysNotify; // If true, send OnChange event when receive SetText(), even if text is identical var int CaretPos; // Where is the cursor within the string var int FirstVis; // Position of the first visible character; var int LastSizeX; // Used to detect resolution changes var int LastCaret,LastLength; // Used to make things quick var bool bAllSelected; var byte LastKey; var() float DelayTime; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if ( bIntOnly || bFloatOnly ) { AllowedCharSet = "0123456789"; if (bFloatOnly) AllowedCharSet $= "."; } bAllSelected=true; } event SetText(string NewText) { local bool bChanged; bChanged = bAlwaysNotify || TextStr != NewText; TextStr = NewText; CaretPos=len(TextStr); if (bChanged) TextChanged(); bAllSelected=true; } function DeleteChar() { if (CaretPos==len(TextStr)) return; else if (CaretPos==Len(TextStr)-1) { TextStr = left(TextStr,CaretPos); CaretPos=len(TextStr); } else TextStr = left(TextStr,CaretPos)$Mid(TextStr,CaretPos+1); TextChanged(); } function bool InternalOnKeyType(out byte Key, optional string Unicode) { local string temp,st; if (bReadOnly) return false; if (UniCode!="") st = Unicode; else st = chr(Key); // Handle cut/paste/copy keys if (key<32) { if (!Controller.CtrlPressed || key == 9) return false; // old code captured any keys under 32 switch (key) { case 3: // ctrl-c, copy to console PlayerOwner().CopyToClipboard(TextStr); bAllSelected=true; break; case 22: // ctrl-v, paste at position if ( (TextStr=="") || ( CaretPos==len(TextStr) ) ) // At the end of the string, just add { if (bAllSelected) TextStr=""; TextStr = ConvertIllegal(TextStr$PlayerOwner().PasteFromClipboard()); CaretPos=len(TextStr); } else { // We are somewhere inside the string, insert. temp = ConvertIllegal(left(TextStr,CaretPos)$PlayerOwner().PasteFromClipboard()$Mid(TextStr,CaretPos)); TextStr = temp; } break; case 24: // ctrl-x, clear and copy PlayerOwner().CopyToClipboard(TextStr); TextStr=""; CaretPos=0; } TextChanged(); return true; } if(bAllSelected) { TextStr=""; CaretPos=0; bAllSelected=false; } if ( (AllowedCharSet=="") || ( (bIncludeSign) && ( (st=="-") || (st=="+") ) && (TextStr=="") ) || (InStr(AllowedCharSet,St)>=0) ) { if ( (MaxWidth==0) || (Len(TextStr)0) { if ( bAllSelected ) { TextStr = ""; CaretPos = 0; bAllSelected = False; TextChanged(); } else { CaretPos--; DeleteChar(); } } return true; } if ( Key==0x2E ) // Delete key { if(bAllSelected) { TextStr=""; CaretPos = 0; bAllSelected=false; TextChanged(); } else DeleteChar(); return true; } //if ( (Key==0x64 || Key==0x25) && (State==1) ) // Left Arrow if ( Key==0x25 ) // Left Arrow { if(bAllSelected) { CaretPos = 0; bAllSelected=false; } else if (CaretPos>0) CaretPos--; return true; } //if ( (Key==0x66 || Key==0x27) && (State==1) ) // Right Arrow if (Key==0x27) // Right Arrow { if(bAllSelected) { CaretPos = len(TextStr); bAllSelected=false; } else if ( CaretPos 0) return Left(retval,MaxWidth); return retval; } function string GetText() { return TextStr; } function TextChanged() { OnChange(Self); } function InternalActivate() { CaretPos = Len(TextStr); bAllSelected = True; } function InternalDeactivate() { CaretPos = 0; bAllSelected = False; } F_F_*F_AP3Vq_ AVWpwS*nVSDVain7paHi. ,D%uppInterfaceContent.SPMenu.Lock9SDaV,. W,%upInterfaceContent.SPMenu.BarCornerLeftao. W,%upInterfaceContent.SPMenu.BarCornerRighta. W,%upInterfaceContent.SPMenu.BarHorizontalazaHi&% GF_HG F_oG F_BG F_cM3S+!2IcS+R+;{oT+ boSmEID_ GF_W class GUIMultiColumnListHeader extends GUIComponent native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() GUIMultiColumnList MyList; var() editconst const int SizingCol; var() editconst const int ClickingCol; var GUIStyles BarStyle; var string BarStyleName; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local eFontScale x; Super.InitComponent(MyController, MyOwner); if (BarStyleName!="") BarStyle = Controller.GetStyle(BarStyleName,x); } F_fS3]y4]%L],i]b &]i][ ,]]]%],i]` ,]i]\ ,]]S}-(q&, b q,,` q,,\ q,,[ }(wS*S}X&b X,` X,[ X,\ ,S%SINGLEPLAYER Opening Championship.}'@U GF_fU_Z gwW* 7H%((rJ*(B%lB7HbrBHJnBlB/9:U,% 9:P+&Rn'n%n7H&nnRGnH('b9:U,' 9:P+&Rn`'n4n7Hn%]RnGnH(`'( GF_^// ==================================================================== // Class: UT2K4UI.GUIMultiComponent // // GUIMultiComponents are collections of components that work together. // When initialized, GUIMultiComponents transfer all of their components // to the to the GUIPage that owns them. // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIMultiComponent extends GUIComponent Abstract Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var(Menu) editinlinenotify export array Controls; // An Array of Components that make up this Control var(State) noexport editconst GUIComponent FocusedControl; // Which component inside this one has focus var(Menu) noexport editconstarray array Components; // An Array of Controls that can be tabbed to // Animation var() noexport editconst int AnimationCount; // Every time a component begins an animation frame, this is increased var() bool PropagateVisibility; // Does changes to visibility propagate down the line var() bool bOldStyleMenus; // Is this a UT2003 menu or UT2004 var(State) bool bDrawFocusedLast; // Draw focused control last (focused control will always appear on top) // If true, empty Controls array when InitializeControls() is called // (Generally required in order to use automated components when subclassing classes that have Controls members // defined in default properties) var() bool bAlwaysAutomate; delegate bool HandleContextMenuOpen(GUIComponent Sender, GUIContextMenu Menu, GUIComponent ContextMenuOwner) { return true; } delegate bool HandleContextMenuClose(GUIContextMenu Sender) { return true; } delegate bool NotifyContextSelect(GUIContextMenu Sender, int ClickIndex) { return false; } delegate OnCreateComponent(GUIComponent NewComponent, GUIComponent Sender); // Hook to allow setting of component properties before initialization // Adds all 'automated' GUIComponent subobjects to the Controls array (only if Controls array is empty). native final function InitializeControls(); // Re-orders all controls with bTabStop = True, according to TabOrder, from lowest to highest native final function RemapComponents(); // Returns the index into the Components array of GUIComponent Who native final function int FindComponentIndex(GUIComponent Who); // Stub function InternalOnShow(); function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.InitComponent(MyController, MyOwner); InitializeControls(); // Build the Controls array for (i=0;i NewCompClass; local GUIComponent NewComp; if ( Controller != None ) NewCompClass = Controller.AddComponentClass(ComponentClass); else NewCompClass = class(DynamicLoadObject(ComponentClass,class'class')); if (NewCompClass != None) { NewComp = new(None) NewCompClass; if (NewComp!=None) { NewComp = AppendComponent(NewComp, SkipRemap); return NewComp; } } log(Name@"could not create component"@ComponentClass,'AddComponent'); return none; } // This function allows you to append a component that has already been initialized // Be very careful about how you handle the focus chain event GUIComponent InsertComponent(GUIComponent NewComp, int Index, optional bool SkipRemap) { if (Index < 0 || Index >= Controls.Length) return AppendComponent(NewComp); Controls.Insert(Index, 1); Controls[Index] = NewComp; if (!SkipRemap) RemapComponents(); return NewComp; } event GUIComponent AppendComponent(GUIComponent NewComp, optional bool SkipRemap) { local int index; // Attempt to add it sorted in to the array. The Controls array is sorted by // Render Weight. while (Index0) { for (i=0;i0) { for (i=Components.Length-1;i>=0;i--) { if (Components[i].FocusLast(Sender)) return true; } } for (i=Controls.Length-1;i>=0;i--) { if ( Controls[i].FocusLast(Sender) ) return true; } if ( bAcceptsInput && Super.CanAcceptFocus() ) { Super.SetFocus(None); return true; } return false; } event bool NextControl(GUIComponent Sender) { local int Index; Index = FindComponentIndex(Sender); if ( Index >= 0 ) { // Find the next possible component while (++Index=0) { if (Components[Index].FocusLast(None)) return true; } if ( Super.PrevControl(self) ) return true; return FocusLast(none); } singular function EnableMe() { local int i; Super.EnableMe(); for ( i = 0; i < Controls.Length; i++ ) EnableComponent(Controls[i]); } singular function DisableMe() { local int i; Super.DisableMe(); for ( i = 0; i < Controls.Length; i++ ) DisableComponent(Controls[i]); } event SetVisibility(bool bIsVisible) { local int i; Super.SetVisibility(bIsVisible); if ( !PropagateVisibility ) return; for (i=0;i 0 ) bAnimating = True; if ( MenuOwner != None ) MenuOwner.BeginAnimation( Animating ); } event EndAnimation( GUIComponent Animating, EAnimationType Type ) { AnimationCount--; if ( AnimationCount <= 0 ) { bAnimating = False; AnimationCount = 0; } if ( MenuOwner != None ) MenuOwner.EndAnimation( Animating, Type ); if ( Animating == Self ) OnEndAnimation(Animating, Type); } function LevelChanged() { local int i; Super.LevelChanged(); for ( i = 0; i < Controls.Length; i++ ) Controls[i].LevelChanged(); } function CenterMouse() { local int i; if ( FocusedControl != None ) { FocusedControl.CenterMouse(); return; } for ( i = 0; i < Components.Length; i++ ) { if ( Components[i].CanAcceptFocus() ) { Components[i].CenterMouse(); return; } } Super.CenterMouse(); } function DebugTabOrder() { local int i; CheckInvalidTabOrder(); CheckDuplicateTabOrder(); for ( i = 0; i < Controls.Length; i++ ) Controls[i].DebugTabOrder(); } function CheckInvalidTabOrder() { local int i; for ( i = 0; i < Components.Length; i++ ) if ( Components[i].TabOrder == -1 ) log(GetMenuPath()@"Component["$i$"] ("$Components[i].GetMenuPath()$") has no tab order assigned!"); } function CheckDuplicateTabOrder() { local int i, j; local array TabOrders; local bool bDup; for ( i = 0; i < Components.Length; i++ ) { bDup = false; if ( Components[i].TabOrder == -1 ) continue; for ( j = 0; j < TabOrders.Length; j++ ) { if ( Components[i].TabOrder == TabOrders[j].X2 ) { log(GetMenuPath()@"Dulicate tab order ("$Components[i].TabOrder$") - components "$TabOrders[j].X1$" ("$Components[TabOrders[j].X1].GetMenuPath()$") & "$i$" ("$Components[i].GetMenuPath()$")"); bDup = True; } } if ( !bDup ) { j = TabOrders.Length; TabOrders.Length = j + 1; TabOrders[j].X1 = j; TabOrders[j].X2 = Components[i].TabOrder; } } } F_\b Nih.,,K . &m. ,U.,}. ,N%N,7b b M&NFM=[L?i>9?NNeN%N,7` ` M,Nof4>[L?i>9?NNN%PN,7\ \ M,N;?[L?i>9?NNN%N,7[ [ M,NY\?[L?i>9?NNWh^y GF_U3F_F_BF_F_F_F_V// ==================================================================== // Class: Engine.GUIController // // The GUIController is a simple FILO menu stack. You have 3 things // you can do. You can Open a menu which adds the menu to the top of the // stack. You can Replace a menu which replaces the current menu with the // new menu. And you can close a menu, which returns you to the last menu // on the stack. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIController extends BaseGUIController DependsOn(GUI) Config(User) Abstract Native; #exec OBJ LOAD FILE=InterfaceContent.utx // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) const DoCounter = 1; var const int FONT_NUM; var const int STYLE_NUM; var const int CURSOR_NUM; struct native ProfileStruct { var string ProfileName; var float ProfileSeconds; }; struct native eOwnageMap { var int RLevel; var string MapName; var string MapDesc; var string MapURL; }; var array Profilers; var const floatbox MouseCursorBounds; var editinline Array MouseCursorOffset; // Only X,Y used, between 0 and 1. 'Hot Spot' of cursor material. var editinline export protected array MenuStack; // Holds the stack of menus var protected Array PersistentStack; // Holds the set of pages which are persistent across close/open var editinline protected Array FontStack; // Holds all the possible fonts var protected Array StyleStack; // Holds all of the possible styles var editinline protected Array MouseCursors; // Holds a list of all possible mouse var array ImageList; // List of various images struct native AutoLoadMenu { var string MenuClassName; var bool bPreInitialize; }; struct native init RestoreMenuItem { var() string MenuClassName; var() string Param1, Param2; }; var Array DefaultStyleNames; // Holds the name of all styles to use var Array StyleNames; // Holds the name of all styles to use var config array AutoLoad; // Any menu classes in here will be automatically loaded var array RestoreMenus; struct native DesignModeHint { var() localized string Key, Description; }; var array DesignModeHints; // List of commands for design mode var config float MenuMouseSens; var float MouseX,MouseY; // Where is the mouse currently located var float LastMouseX, LastMouseY; var float DblClickWindow; // How long do you have for a double click var float LastClickTime; // When did the last click occur var float ButtonRepeatDelay; // The amount of delay for faking button repeats var float RepeatDelta; // Data var var float RepeatTime; // How long until the next repeat; var float CursorFade; // How visible is the cursor var float FastCursorFade; // How visible is the cursor var globalconfig int MaxSimultaneousPings; // Upper limit to number of open connections (for server pinging only - not does include game channels) var int FastCursorStep; // Are we fading in or out var const int ResX, ResY; // Current resolution var int LastClickX, LastClickY; // Who was the active component var int CursorStep; // Are we fading in or out var const private pointer Designer; // GUI design editor window reference // Sounds var sound MouseOverSound; var sound ClickSound; var sound EditSound; var sound UpSound; var sound DownSound; var sound DragSound; var sound FadeSound; var GUIPage ActivePage; // Points to the currently active page var GUIComponent FocusedControl; // Top most Focused control var GUIComponent ActiveControl; // Which control is currently active var deprecated GUIComponent SkipControl; // This control should be skipped over and drawn at the end var GUIComponent MoveControl; // Used for visual design // Drag - n - Drop support var GUIComponent DropSource; // Source component for a drag-n-drop operation currently in progress var GUIComponent DropTarget; // Target component for a drag-n-drop operation currently in progress var GUIContextMenu ContextMenu; // Used for Right Click menus var GUIToolTip MouseOver; var Material WhiteBorder; var string GameResolution; var transient string LastGameType; // Used for some places where we need to know the last gametype selected // Menu types var config string RequestDataMenu; // Menu for single item data entry var config string ArrayPropertyMenu; // Menu for editing static array playinfo properties var config string DynArrayPropertyMenu; // Menu for editing dynamic array playinfo properties var config string FilterMenu; // Menu for configuring server browser filters var config string MapVotingMenu; // Menu that appears for map voting var config string KickVotingMenu; var config string MatchSetupMenu; var config string EditFavoriteMenu; var array MainMenuOptions; // Menu classes that will be displayed on the main menu var globalconfig string DesignerMenu; // Menu for in-game GUI designer var byte RepeatKey; // Used to determine what should repeat var bool bIgnoreNextRelease; // Used to make sure discard errant releases. var bool ShiftPressed; // Shift key is being held var bool AltPressed; // Alt key is being held var bool CtrlPressed; // Ctrl key is being held var bool bModulateStackedMenus; // If true, all menus except the topmost will be greyed var globalconfig bool bQuietMenu; var globalconfig bool bNoToolTips; // Do not display mouse-over tool-tips var globalconfig bool bDesignModeToolTips; // Whether tooltips are displayed while in design mode var globalconfig bool bAutoRefreshBrowser; // Auto refresh server browser when returning from the game or another menu var globalconfig bool bModAuthor; // Allows bDesign Mode var globalconfig bool bExpertMode; // Display all advanced settings var globalconfig bool bDesignMode; // Are we in design mode; var bool bInteractiveMode; // All input goes to design mode var globalconfig bool bHighlightCurrent; // Highlight the current control being edited var globalconfig bool bDrawFullPaths; // Display full menu paths in design mode var bool MainNotWanted; // Prevents main menu from being opened when last menu is closed and isn't bAllowedAsLast var bool bCurMenuInitialized; // Has the current Menu Finished initialization var bool bForceMouseCheck; // HACK var bool bIgnoreUntilPress; // HACK //??? var bool bSnapCursor; // Snap cursor to first component when page is opened var float RenderDelta, LastRenderTime; // Used for timing var config bool bFixedMouseSize; // Keep the mouse from scaling var const byte KeyDown[255]; // Bit mask of keys currently held down var array > RegisteredClasses; var bool bECEEdition; // Set to true if this is the ECE edition delegate bool OnNeedRawKeyPress(byte NewKey); delegate AddBuddy( optional string NewBuddyName ); // ===================================================================================================================== // ===================================================================================================================== // Utility functions for the UI // ===================================================================================================================== // ===================================================================================================================== native event GUIFont GetMenuFont(string FontName); // Finds a given font in the FontStack native event GUIStyles GetStyle(string StyleName, out GUI.eFontScale FontScale); // Find a style on the stack native final function string GetCurrentRes(); // Returns the current res as a string // Attempts to set the render device to the class specified by NewRenderDevice - returns whether change was successful native final function bool SetRenderDevice( string NewRenderDevice ); native private final function ResetDesigner(); native final function ResetInput(); native final function GetProfileList(string Prefix, out array ProfileList); native final function ResetKeyboard(); native final function GetOGGList(out array OGGFiles); native final function PlayInterfaceSound( GUIComponent.EClickSound SoundType ); native final function SetMoveControl( GUIComponent C ); native function Profile(string ProfileName); // Used by a demo manager native function GetDEMList(out array DEMFiles); native function bool GetDEMHeader(string DemoName, out string MapName, out string GameType, out int ScoreLimit, out int TimeLimit, out int ClientSide, out string RecordedBy, out string Timestamp, out String ReqPackages); // Used by Ownage Maps native function GetOwnageList(out array RLevel, out array MNames, out array MDesc, out array mURL); native function SaveOwnageList(array Maps); // deprecated -- Use CacheManager/xUtil instead native final function GetWeaponList(out array > WeaponClass, out array WeaponDesc); native final function GetMapList( string Prefix, GUIList list, optional bool bDecoText ); // URL stuff native function LaunchURL(string URL); // Firewall stuff native function bool CheckFirewall(); native function bool AuthroizeFirewall(); native function bool CheckForECE(); function string LoadDecoText(string PackageName, string DecoTextName) { local int i; local DecoText Deco; local string DecoText; if (InStr(DecoTextName, ".") != -1) { if (PackageName == "") Divide(DecoTextName, ".", PackageName, DecoTextName); else DecoTextName = Mid(DecoTextName, InStr(DecoTextName, ".") + 1); } Deco = class'xUtil'.static.LoadDecoText(PackageName, DecoTextName); if (Deco == None) return ""; for (i = 0; i < Deco.Rows.Length; i++) { if (DecoText != "") DecoText $= "|"; DecoText $= Deco.Rows[i]; } return DecoText; } final function GetTeamSymbolList(out array SymbolNames, optional bool bNoSinglePlayer) { // Moved to CacheManager so GameInfo can access this class'CacheManager'.static.GetTeamSymbolList(SymbolNames, bNoSinglePlayer); } // -- deprecated function GUIPage TopPage() { return ActivePage; } // ===================================================================================================================== // ===================================================================================================================== // Initialization // ===================================================================================================================== // ===================================================================================================================== event InitializeController() { local int i; local class NewStyleClass; PrecachePlayerRecords(); for (i=0;i(DynamicLoadObject(DefaultStyleNames[i],class'class')); if (NewStyleClass != None) if (!RegisterStyle(NewStyleClass)) log("Could not create requested style"@DefaultStyleNames[i]); } for (i=0;i(DynamicLoadObject(StyleNames[i],class'class')); if (NewStyleClass != None) if (!RegisterStyle(NewStyleClass)) log("Could not create requested style"@StyleNames[i]); } for (i=0;i StyleClass, optional bool bTemporary) { local GUIStyles NewStyle; local int i,index; Index = -1; if (StyleClass != None) { for (i = 0; i < StyleStack.Length; i++) { if (StyleStack[i].Class == StyleClass) { log("Style already registered '"$StyleClass$"'"); return true; } if (StyleStack[i].KeyName == StyleClass.Default.KeyName) Index = i; } NewStyle = new(None) StyleClass; if (NewStyle != None) { // Dynamic Array Auto Sizes StyleStack. if (Index<0) { // if ( bModAuthor ) // log("Registering Style"@NewStyle,'ModAuthor'); StyleStack[StyleStack.Length] = NewStyle; } else { if ( bModAuthor ) log("Replacing Style"@StyleStack[Index].KeyName@"with"@NewStyle,'ModAuthor'); StyleStack[Index].Controller = none; StyleStack[Index] = NewStyle; } NewStyle.Controller = self; NewStyle.Initialize(); NewStyle.bTemporary = bTemporary; return true; } } return false; } //event class AddComponentClass(string ClassName) { return None; } event class AddComponentClass(string ClassName) { local int i; local class Cls; for ( i = 0; i < RegisteredClasses.Length; i++ ) if ( string(RegisteredClasses[i]) ~= ClassName ) return RegisteredClasses[i]; Cls = class(DynamicLoadObject(ClassName,class'Class')); if ( Cls != None ) RegisteredClasses[RegisteredClasses.Length] = Cls; return Cls; } // ===================================================================================================================== // ===================================================================================================================== // Menu manipulation // ===================================================================================================================== // ===================================================================================================================== event GUIPage FindPersistentMenuByName( string MenuClass ) { local int i; if ( MenuClass == "" ) return None; for ( i = 0; i < PersistentStack.Length; i++ ) if ( MenuClass ~= string(PersistentStack[i].Class) ) return PersistentStack[i]; return None; } event int FindMenuIndexByName( string MenuClass ) { local int i; if ( MenuClass == "" ) return -1; for ( i = 0; i < MenuStack.Length; i++ ) if ( MenuClass ~= string(MenuStack[i].Class) ) return i; return -1; } event int FindMenuIndex( GUIPage Menu ) { local int i; if ( Menu == None ) return -1; for ( i = 0; i < MenuStack.Length; i++ ) if ( MenuStack[i] == Menu ) return i; return -1; } event int FindPersistentMenuIndex( GUIPage Menu ) { local int i; if ( Menu == None ) return -1; for ( i = 0; i < PersistentStack.Length; i++ ) if ( Menu == PersistentStack[i] ) return i; return -1; } function GUIPage FindPersistentMenuByClass( class PageClass ) { local int i; if ( PageClass == None ) return None; for ( i = 0; i < PersistentStack.Length; i++ ) if ( ClassIsChildOf(PersistentStack[i].Class, PageClass) ) return PersistentStack[i]; return None; } function GUIPage FindMenuByClass( class PageClass ) { local int i; if ( PageClass == None ) return None; for ( i = 0; i < MenuStack.Length; i++ ) if ( ClassIsChildOf(MenuStack[i].Class,PageClass) ) return MenuStack[i]; return None; } // CreateMenu - Attempts to Create a menu. Returns none if it can't event GUIPage CreateMenu(string NewMenuName) { local class NewMenuClass; local GUIPage NewMenu; local int i; // Big hack here - If the menu we are creating is XInterface.UT2MainMenu then // Pull the actual main menu from native code if (NewMenuName ~= "XInterface.UT2MainMenu") NewMenuName = GetMainMenuClass(); // Load the menu's package if needed NewMenuClass = class(AddComponentClass(NewMenuName)); if (NewMenuClass != None) { // If it's persistent, try to find an instance in the PersistentStack. if( NewMenuClass.default.bPersistent ) { for( i=0;i 0 ) { if ( bModAuthor ) log("Cannot open menu until menu initialization is complete!",'ModAuthor'); return false; } NewMenu = CreateMenu(NewMenuName); if (NewMenu!=None) { // do not allow the same menu to be duplicated in the stack if ( FindMenuIndex(NewMenu) != -1 ) { bCurMenuInitialized = True; return false; } NewMenu.ParentPage = ActivePage; ResetFocus(); PushMenu( MenuStack.Length, NewMenu, Param1, Param2 ); if ( NewMenu.bDisconnectOnOpen ) ConsoleCommand("DISCONNECT"); return true; } log("Could not open menu"@NewMenuName); return false; } event AutoLoadMenus() { local GUIPage NewMenu; local int i; super.AutoLoadMenus(); for ( i=0; i < AutoLoad.Length; i++ ) { NewMenu = CreateMenu(AutoLoad[i].MenuClassName); if ( NewMenu == None ) { log("Could not auto-load"@AutoLoad[i].MenuClassName); continue; } if ( AutoLoad[i].bPreInitialize ) NewMenu.InitComponent(Self, None); } } // ================================================ // Replaces a menu in the stack. returns true if success event bool ReplaceMenu(string NewMenuName, optional string Param1, optional string Param2, optional bool bCancelled) { local GUIPage NewMenu; if ( ActivePage == None || MenuStack.Length == 0 ) return OpenMenu(NewMenuName, Param1, Param2); if ( bModAuthor ) log(Class@"ReplaceMenu ["$NewMenuName$"] ("$Param1$") ("$Param2$")",'ModAuthor'); if ( !bCurMenuInitialized && MenuStack.Length > 0 ) { if ( bModAuthor ) log("Cannot replace menu until menu initialization is complete!",'ModAuthor'); return false; } NewMenu = CreateMenu(NewMenuName); if (NewMenu != None) { NewMenu.ParentPage = ActivePage.ParentPage; ResetFocus(); // Remove the old menu PopMenu( -1, ActivePage, bCancelled ); // Add this menu to the stack and give it focus PushMenu( MenuStack.Length - 1, NewMenu, Param1, Param2 ); return true; } return false; } // Initialize a new menu and add to the stack at the specified point. protected event PushMenu( int Index, GUIPage NewMenu, optional string Param1, optional string Param2 ) { if ( NewMenu == None ) { log("Call to GUIController.PushMenu() with invalid NewMenu!!!"); return; } SetControllerStatus(true); if ( Index >= 0 ) { MenuStack[Index] = NewMenu; ActivePage = NewMenu; } CloseOverlays(); ResetInput(); if (NewMenu.Controller == None) NewMenu.InitComponent(Self, None); NewMenu.CheckResolution(false,Self); // Pass along the event NewMenu.Opened(NewMenu); NewMenu.MenuState = MSAT_Focused; NewMenu.PlayOpenSound(); bCurMenuInitialized = true; NewMenu.HandleParameters(Param1, Param2); bForceMouseCheck = true; NewMenu.OnOpen(); } protected event PopMenu( int Index, GUIPage CurMenu, optional bool bCancelled ) { CloseOverlays(); // Close out the current page CurMenu.Closed( CurMenu, bCancelled ); if ( Index >= 0 && Index + 1 < MenuStack.Length && MenuStack[Index + 1] != None ) MenuStack[Index + 1].ParentPage = CurMenu.ParentPage; CurMenu.ParentPage = None; // Free all object references CurMenu.Free(); // Sanity check - something may have changed the order of the menustack between // now and the original call to CloseMenu()/RemoveMenu() if ( Index < 0 ) return; if ( Index >= MenuStack.Length || MenuStack[Index] != CurMenu ) Index = FindMenuIndex(CurMenu); if ( Index >= 0 && Index < MenuStack.Length ) MenuStack.Remove( Index, 1 ); } function bool RemoveMenuAt( int Index, optional bool bCancelled ) { if ( Index < 0 || Index >= MenuStack.Length ) return False; return RemoveMenu(MenuStack[Index], bCancelled); } // Close a menu that isn't the top menu event bool RemoveMenu( GUIPage Menu, optional bool bCancelled ) { if ( MenuStack.Length == 0 ) { log("GUIController.RemoveMenu() - Attempting to close a non-existing menu page"); return false; } if ( Menu == None || Menu == ActivePage ) return CloseMenu(bCancelled); if ( bModAuthor ) log(Class@"RemoveMenu ["$Menu.Name$"]",'ModAuthor'); if ( !bCurMenuInitialized ) { if ( bModAuthor ) log("Cannot remove menu until initialization is complete!",'ModAuthor'); return false; } if ( !Menu.OnCanClose(bCancelled) ) return false; ResetInput(); Menu.PlayCloseSound(); // Play the closing sound PopMenu( FindMenuIndex(Menu), Menu, bCancelled ); // Gab the next page on the stack if ( MenuStack.Length == 0 ) // Pass control back to the previous menu { if ( !Menu.bAllowedAsLast && !MainNotWanted ) return OpenMenu(GetMainMenuClass()); ActivePage = None; SetControllerStatus(false); } VerifyStack(); bForceMouseCheck = true; return true; } event bool CloseMenu( optional bool bCancelled ) // Close the top menu. returns true if success. { if ( MenuStack.Length == 0 || ActivePage == None ) { log("Attempting to close a non-existing menu page"); return false; } if ( bModAuthor ) log(Class@"CloseMenu ["$ActivePage.Name$"]",'ModAuthor'); if ( !bCurMenuInitialized ) { if ( bModAuthor ) log("Cannot close menu until initialization is complete!",'ModAuthor'); return false; } if ( !ActivePage.OnCanClose(bCancelled) ) return false; ResetInput(); ActivePage.PlayCloseSound(); // Play the closing sound PopMenu( FindMenuIndex(ActivePage), ActivePage, bCancelled ); ActivePage.CheckResolution(True,Self); // Gab the next page on the stack bCurMenuInitialized=false; if ( MenuStack.Length > 0 ) // Pass control back to the previous menu { ActivePage = MenuStack[MenuStack.Length-1]; ActivePage.MenuState = MSAT_Focused; ResetFocus(); ActivePage.FocusFirst(None); if ( !ActivePage.bNeverFocus ) ActivePage.OnActivate(); } else { if (!ActivePage.bAllowedAsLast && !MainNotWanted) { ActivePage = none; return OpenMenu(GetMainMenuClass()); } ActivePage = None; SetControllerStatus(false); } bCurMenuInitialized=true; if ( ActivePage != None ) ActivePage.OnReopen(); bForceMouseCheck = true; return true; } event CloseAll(bool bCancel, optional bool bForced) { local int i; if ( bModAuthor ) { log(Name@"CloseAll bCancel:"$bCancel@"Forced:"$bForced@"(Currently"@MenuStack.Length@"menus open)",'ModAuthor'); for ( i = 0; i < MenuStack.Length; i++ ) { if ( MenuStack[i] == None ) log(" Menu["$i$"]: None",'ModAuthor'); else log(" Menu["$i$"]:"$MenuStack[i].Name,'ModAuthor'); } } // Close the current menu manually before we clean up the stack. if ( bForced ) MainNotWanted = True; if ( MenuStack.Length > 0 ) SaveRestorePages(); if( MenuStack.Length >= 0 ) CloseMenu(bCancel); MainNotWanted = False; for ( i = MenuStack.Length - 1;i >= 0; i-- ) PopMenu(i, MenuStack[i], bCancel); //log("GUIController::CloseAll - After Menu closing "@GameResolution); if (GameResolution != "") { Console(Master.Console).DelayedConsoleCommand("SETRES"@GameResolution); GameResolution=""; } ActivePage=None; SetControllerStatus(false); } function int Count() { return MenuStack.Length; } function SaveRestorePages() { local int i; local string Param1, Param2, MenuClass; // First, clear any current entries RestoreMenus.Remove( 0, RestoreMenus.Length ); for ( i = MenuStack.Length - 1; i >= 0; i-- ) { if ( MenuStack[i] != None ) { if ( MenuStack[i].bRestorable ) { MenuClass = string(MenuStack[i].Class); Param1 = ""; Param2 = ""; if ( MenuStack[i].GetRestoreParams(Param1, Param2) ) { RestoreMenus.Insert(0, 1); RestoreMenus[0].MenuClassName = MenuClass; RestoreMenus[0].Param1 = Param1; RestoreMenus[0].Param2 = Param2; } } } } } function PerformRestore() { local int i, idx; if ( bModAuthor ) log("Restoring previously open menus ("$RestoreMenus.Length$" menus to restore)",'ModAuthor'); for ( i = 0; i < RestoreMenus.Length; i++ ) { idx = FindMenuIndexByName(RestoreMenus[i].MenuClassName); if ( idx == -1 ) OpenMenu(RestoreMenus[i].MenuClassName, RestoreMenus[i].Param1, RestoreMenus[i].Param2); } RestoreMenus.Remove(0, RestoreMenus.Length); } function SetControllerStatus(bool On) { local bool bWasActive; if ( bActive && !On && ViewportOwner != None && ViewportOwner.Actor != None ) ViewportOwner.Actor.UnpressButtons(); bWasActive = bActive; bActive = On; bVisible = On; bRequiresTick=On; if ( bActive && !bWasActive && ViewportOwner != None && ViewportOwner.Actor != None ) ViewportOwner.Actor.UnpressButtons(); ViewportOwner.bShowWindowsMouse = On && ViewportOwner.bWindowsMouseAvailable; if (On) bIgnoreUntilPress = true; else { ResetDesigner(); ViewportOwner.Actor.ConsoleCommand("toggleime 0"); } PurgeComponentClasses(); } event ChangeFocus(GUIComponent Who) { if ( Who != None ) Who.SetFocus(None); return; } function ResetFocus() { MoveControl = None; if (ActiveControl!=None) { ActiveControl.MenuStateChange(MSAT_Blurry); ActiveControl = None; } if ( FocusedControl != None ) FocusedControl.LoseFocus(None); RepeatKey=0; RepeatTime=0; } event MoveFocused(GUIComponent C, int bmLeft, int bmTop, int bmWidth, int bmHeight, float ClipX, float ClipY, float Val) { if ( C.bScaleToParent && C.MenuOwner != None ) { ClipX = C.MenuOwner.ActualWidth(); ClipY = C.MenuOwner.ActualHeight(); } if (bmLeft!=0) { if ( C.WinLeft < 2.0 && C.WinLeft > -2.0 && !C.bNeverScale ) C.WinLeft += (Val/ClipX) * bmLeft; else C.WinLeft += Val*bmLeft; } if (bmTop!=0) { if ( C.WinTop < 2.0 && C.WinTop > -2.0 && !C.bNeverScale ) C.WinTop += (Val/ClipY) * bmTop; else C.WinTop += Val*bmTop; } if (bmWidth!=0) { if (C.WinWidth < 2.0 && C.WinWidth > -2.0 && !C.bNeverScale) C.WinWidth += (Val/ClipX) * bmWidth; else C.WinWidth += Val*bmWidth; } if (bmHeight!=0) { if (C.WinHeight <= 2.0) C.WinHeight += (Val/ClipX) * bmHeight; else C.WinHeight += Val*bmHeight; } } function bool HasMouseMoved( optional float ErrorMargin ) { return Abs(MouseX - LastMouseX) > Abs(ErrorMargin) || Abs(MouseY - LastMouseY) > Abs(ErrorMargin); } event bool CanShowHints() { if ( bNoToolTips ) return false; if ( ActivePage != None && ActivePage.bCaptureMouse ) return false; if ( DropSource != None || DropTarget != None ) return false; if ( !bDesignModeToolTips && bDesignMode && bHighlightCurrent ) return false; return true; } event bool NeedsMenuResolution() { local int i; for ( i = MenuStack.Length - 1; i >= 0; i-- ) { if ( MenuStack[i] != None && MenuStack[i].bRequire640x480 ) return true; if ( !MenuStack[i].bRenderWorld ) break; } return false; } event SetRequiredGameResolution(string GameRes) { GameResolution = GameRes; } event NotifyLevelChange() { local int i; if ( bModAuthor ) log(Class@"NotifyLevelChange()",'ModAuthor'); ResetDesigner(); if ( bActive && ViewportOwner.Actor != None && ViewportOwner.Actor.Level != None && ViewportOwner.Actor.Level.IsPendingConnection() ) SaveRestorePages(); for (i = MenuStack.Length - 1; i >= 0 && MenuStack.Length != 0; i--) { // Menus might start closing other menus during NotifyLevelChange, so always check for None if (MenuStack[i] != None) { // If menu is in persistent stack, skip notification here. if ( MenuStack[i].bPersistent ) continue; if ( MenuStack[i].NotifyLevelChange() ) RemoveMenu(MenuStack[i], True); } } for (i = PersistentStack.Length - 1; i >= 0; i--) { if (PersistentStack[i] != None && PersistentStack[i].NotifyLevelChange()) { if ( PersistentStack[i].IsOpen() ) RemoveMenu( PersistentStack[i], True); else PersistentStack[i].Free(); if ( !PersistentStack[i].bPersistent ) PersistentStack.Remove(i,1); } } PurgeObjectReferences(); VerifyStack(); if ( MenuStack.Length > 0 ) RestoreMenus.Remove(0,RestoreMenus.Length); } // ===================================================================================================================== // ===================================================================================================================== // Menu-stack maintenance & cleanup // ===================================================================================================================== // ===================================================================================================================== function CloseOverlays() { MouseOver = None; ContextMenu = None; } function VerifyStack() { local int i; for ( i = 0; i < MenuStack.Length; i++ ) { if ( MenuStack[i] == None || (MenuStack[i].Controller == None && bCurMenuInitialized) ) { MenuStack.Remove(i--, 1); continue; } if ( i > 0 ) MenuStack[i].ParentPage = MenuStack[i-1]; } ConsolidateMenus(); } function PurgeObjectReferences() { local class OriginalStyle; local int i; // Remove any temporary (i.e. mod-defined) styles for ( i = 0; i < STYLE_NUM; i++ ) { if ( StyleStack[i] == None ) { OriginalStyle = class(DynamicLoadObject(DefaultStyleNames[i],class'Class')); if ( !RegisterStyle(OriginalStyle) ) { log("Could not restore default style "$i$" ("$DefaultStyleNames[i]$")"); continue; } } if ( StyleStack[i].bTemporary ) { OriginalStyle = class(DynamicLoadObject(DefaultStyleNames[i],class'Class')); if ( !RegisterStyle(OriginalStyle) ) { log("Could not restore default style "$i$" ("$DefaultStyleNames[i]$")"); StyleStack[i] = None; } } } if (StyleStack.Length > STYLE_NUM) StyleStack.Remove(STYLE_NUM, StyleStack.Length - STYLE_NUM); if (FontStack.Length > FONT_NUM) FontStack.Remove(FONT_NUM, FontStack.Length - FONT_NUM); if (MouseCursors.Length > CURSOR_NUM) MouseCursors.Remove(CURSOR_NUM, MouseCursors.Length - CURSOR_NUM); PurgeComponentClasses(); } // Should be overridden function PurgeComponentClasses(); // This is used to remove any duplicate clases from the menu stack (keeping the topmost one) function ConsolidateMenus() { local int i, j; for ( i = MenuStack.Length - 1; i >= 0; i-- ) { for ( j = 0; j < i; j++ ) { if ( MenuStack[i].Class == MenuStack[j].Class ) { MenuStack[j+1].ParentPage = MenuStack[j].ParentPage; MenuStack.Remove(j,1); break; } } } } // ===================================================================================================================== // ===================================================================================================================== // Main menu classes - should be overridden in child classes // ===================================================================================================================== // ===================================================================================================================== static event Validate(); native static final function string GetMainMenuClass(); // Returns GameEngine.MainMenuClass static function string GetSinglePlayerPage(); static function string GetServerBrowserPage(); static function string GetMultiplayerPage(); static function string GetInstantActionPage(); static function string GetModPage(); static function string GetSettingsPage(); static function string GetQuitPage(); // ===================================================================================================================== // ===================================================================================================================== // Keybind management // ===================================================================================================================== // ===================================================================================================================== // SetKeyBind( "Space", "Jump" ); return true if successful final function bool SetKeyBind( string BindKeyName, string BindKeyValue ) { ViewportOwner.Actor.ConsoleCommand("set Input" @ BindKeyName @ BindKeyValue ); return true; } final function bool KeyNameFromIndex( byte iKey, out string KeyName, out string LocalizedKeyName ) { KeyName = ViewportOwner.Actor.ConsoleCommand("KEYNAME" @ iKey); LocalizedKeyName = ViewportOwner.Actor.ConsoleCommand("LOCALIZEDKEYNAME" @ iKey); return KeyName != ""; } // GetCurrentBind( "Space", CommandBoundToSpace ); return true if successful final function bool GetCurrentBind( string BindKeyName, out string BindKeyValue ) { if ( BindKeyName != "" ) { BindKeyValue = ViewportOwner.Actor.ConsoleCommand("KEYBINDING" @ BindKeyName); return BindKeyValue != ""; } return false; } // GetAssignedKeys( "Jump", ArrayOfKeysThatPerformJump ); return true if successful final function bool GetAssignedKeys( string BindAlias, out array BindKeyNames, out array LocalizedBindKeyNames ) { local int i, iKey; local string s; BindKeyNames.Length = 0; LocalizedBindKeyNames.Length = 0; s = ViewportOwner.Actor.ConsoleCommand("BINDINGTOKEY" @ "\"" $ BindAlias $ "\""); if ( s != "" ) { Split(s, ",", BindKeyNames); for ( i = 0; i < BindKeyNames.Length; i++ ) { iKey = int(ViewportOwner.Actor.ConsoleCommand("KEYNUMBER" @ BindKeyNames[i])); if ( iKey != -1 ) LocalizedBindKeyNames[i] = ViewportOwner.Actor.ConsoleCommand("LOCALIZEDKEYNAME" @ iKey); } } return BindKeyNames.Length > 0; } // SearchBinds( "switchweapon ", ArrayofAliasesThatBeginWithSwitchWeapon ); return true if successful final function bool SearchBinds( string BindAliasMask, out array BindAliases ) { local string s; BindAliases.Length = 0; s = ViewportOwner.Actor.ConsoleCommand("FINDKEYBINDS" @ "\"" $ BindAliasMask $ "\""); if ( s != "" ) Split(s, ",", BindAliases); return BindAliases.Length > 0; } final function bool KeyPressed( EInputKey iKey ) { return KeyDown[iKey] != 0; } /** show a Question menu, when the page succesfully opens it returns the handle to it. by default the btnOk is used */ function GUIQuestionPage ShowQuestionDialog(string Question, optional byte Buttons, optional byte defButton) { local GUIQuestionPage QPage; if (Buttons == 0) Buttons = 1; if (OpenMenu(QuestionMenuClass)) { QPage = GUIQuestionPage(TopPage()); QPage.SetupQuestion(Question, Buttons, defButton); return QPage; } return none; } F_U@F_V3F_exrU>K%uK7Hk|KHJxr稨A tab with the captionxralready exists.*KrN*e  LQI+wN* we *wN*b.AFN'we *b.cEI+'2rb*Could not create panel for9Ve *]wbA*YbACY rY*Could not create tab for9Ve *Y ! Y{:bAYC-UwbA-k(bAA &bFlippedTabButtonbSmbAQ{YwYwbQbAJ{xrxrbnEbA)D@ bA}bbA~bA-w'bi7HHbA7H&--B+GbA'bqEb* GF_F_*F_F_*F_F_*F_F_*F_f`3c yac %8c 7W ic W %c c q%,W ^wS*X%W  GF_e F_F_\W d i h.,,K . %m. ,d %d ,7W W M%d FM=[L?i>9?d d ?y GF_l// ==================================================================== // Class: UT2K4UI.GUIComponent // // GUIComponents are the most basic building blocks of menus. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIComponent extends GUI Abstract Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // Variables var(Menu) noexport editconst GUIPage PageOwner; // Callback to the GUIPage that contains this control var(Menu) noexport editconst GUIComponent MenuOwner; // Callback to the Component that owns this one var(State) noexport GUIComponent FocusInstead; // Who should get the focus instead of this control if bNeverFocus var(State) noexport eMenuState MenuState; // Used to determine the current state of this component var(State) editconst noexport eMenuState LastMenuState; // The previous MenuState of this component var(State) noexport eDropState DropState; // Used to determine the current drop state of this component var(Style) eFontScale FontScale; // If this component has a style, which size font should be applied to the style // RenderStyle and MenuColor are usually pulled from the Parent menu, unless specificlly overridden var() string IniOption; // Points to the INI option to load for this component var() string IniDefault; // The default value for a missing ini option var(Style) string StyleName; // Name of my Style var() localized string Hint; // The hint that gets displayed for this component var() noexport GUILabel FriendlyLabel; // My state is projected on this objects state. var(Menu) float WinTop,WinLeft; // Where does this component exist (in world space) - Grr.. damn Left() var(Menu) float WinWidth,WinHeight; // Where does this component exist (in world space) - Grr.. damn Left() var() float RenderWeight; // Used to determine sorting in the controls stack var(Style) int MouseCursorIndex; // The mouse cursor to use when over this control var(Menu) int TabOrder; // Used to figure out tabbing var() int Tag; // Free (can be used for anything) var() bool bDebugging; var(Menu) bool bTabStop; // Does a TAB/Shift-Tab stop here var() bool bFocusOnWatch; // If true, watching focuses var(Menu) bool bBoundToParent; // Use the Parents Bounds for all positioning var(Menu) bool bScaleToParent; // Use the Parent for scaling var(State) noexport bool bHasFocus; // Does this component currently have input focus var(State) bool bVisible; // Is this component currently visible var(State) bool bAcceptsInput; // Does this control accept input var() bool bCaptureTabs; // If true, OnKeyEvent() is called for tab presses, overriding default behavior (NextControl()/PrevControl()) var(State) bool bCaptureMouse; // Control should capture the mouse when pressed var(State) bool bNeverFocus; // This control should never fully receive focus var(State) bool bRepeatClick; // Whether this component should receive OnClick() events when the mouse button is held down var(State) bool bRequireReleaseClick; // If True, this component wants the click on release even if it's not active var() bool bMouseOverSound; // Should component bleep when mouse goes over it var() bool bDropSource; // Can this component act as a drag-n-drop source var() bool bDropTarget; // Can this component act as a drag-n-drop target var(State) noexport bool bPendingFocus; // Big big hack for ComboBoxes.. var() bool bInit; // Can be used by any component as an "initialization" hook var() bool bNeverScale; // Do not treat position/dimension values in the -2.0 to 2.0 range as scaled values // useful for internally managed components (GUIComboBox's list, button, etc.) /* This property is solely for the benefit of mod authors, to indicate components which will be skipped by the native rendering code if the component doesn't have a valid style. Mod authors: changing the value of this property in your subclasses will cause your menus to crash the game */ var const noexport bool bRequiresStyle; var() editconst const noexport bool bPositioned; // Whether this component has been positioned yet (first Pre-Render) var() editconst noexport bool bAnimating; // If true, all input/focus/etc will be ignored var() editconst noexport const bool bTravelling, bSizing; // Travelling is true when animating position, Sizing is true when animating dimensions var() editconst noexport const array MotionFrame, SizeFrame; // Notes about the Top/Left/Width/Height : This is a somewhat hack but it's really good for functionality. If // the value is < 2, then the control is considered to be scaled. If they are >= 2 they are considered to be normal world coords. // If bNeverScale is set, then values between -2/2 will also be considered actual values // 0 = 0, 1 = 100%, 2 = 2px var(Menu) editconst const noexport float Bounds[4]; // Internal normalized positions in world space var(Menu) editconst const noexport float ClientBounds[4]; // The bounds of the actual client area (minus any borders) // Timer Support var() bool bTimerRepeat; var() noexport editconst const int TimerIndex; // For easier maintenance var() float TimerCountdown; var() float TimerInterval; var noexport const float MouseOffset[4]; // Used natively for drawing outlines var() editconst GUIContextMenu ContextMenu; var() editconst GUIToolTip ToolTip; // Used for Saving the last state before drawing natively var noexport const color WhiteColor; // Style holds a pointer to the GUI style of this component. var(Style) noexport GUIStyles Style; // My GUI Style var(Style) enum EClickSound { CS_None, CS_Click, CS_Edit, CS_Up, CS_Down, CS_Drag, CS_Fade, CS_Hover, CS_Slide, } OnClickSound; var() enum EParentScaleType // Used to bound/scale in one dimension only { SCALE_All, SCALE_X, SCALE_Y, } BoundingType, ScalingType; var(Menu) bool bStandardized; var(Menu) float StandardHeight; // FOR TESTING var editconst const noexport int PreDrawCount, DrawCount; var editconst noexport int OnRenderCount, OnRenderedCount, OnPreDrawCount, OnDrawCount; // Delegates Delegate OnArrival(GUIComponent Sender, EAnimationType Type); // Called when an animating component arrives at a spot Delegate OnEndAnimation( GUIComponent Sender, EAnimationType Type ); // Called immediately after the component arrives at the last keypoint // Drawing delegates return true if you want to short-circuit the default drawing code // Called for all components, but natively, only ContextMenus do not perform native PreDraw if delegate returns false // Bounds/ClientBounds are updated just before the call to OnPreDraw(). // If you modify the positions of the component, you can force an immediate refresh of the Bounds by returning true from OnPreDraw /* Delegate bool OnPreDraw(canvas Canvas); // Called from the GUIComponent's native PreDraw function. Delegate bool OnDraw(canvas Canvas); // Called the moment the native Draw function is called on a component Delegate OnRender(canvas Canvas); // Called immediately after a component's native Super.Draw is called Delegate OnRendered(canvas Canvas); // Called immediately after a component has finished rendering. */ // The "default" versions of these delegates are only called if GUI.Counter > 0 Delegate bool OnPreDraw(canvas Canvas) { if ( Counter < 1 ) return false; OnPreDrawCount++; if ( OnPreDrawCount > Counter ) log("OnPreDraw called"@OnPreDrawCount@"times: "$GetMenuPath()); return false; } Delegate bool OnDraw(canvas Canvas) { if ( COUNTER < 1 ) return false; OnDrawCount++; if ( OnDrawCount > Counter ) log("OnDraw called"@OnDrawCount@"times: "$GetMenuPath()); return false; } Delegate OnRender(canvas Canvas) { if ( COUNTER < 1 ) return; OnRenderCount++; if ( OnRenderCount > Counter ) log("OnRender called"@OnRenderCount@"times: "$GetMenuPath()); } Delegate OnRendered(canvas Canvas) { if ( COUNTER < 1 ) return; OnRenderedCount++; if ( OnRenderedCount > Counter ) log("OnRendered called"@OnRenderedCount@"times:"@GetMenuPath()); } Delegate OnActivate(); // Called when the component gains focus Delegate OnDeActivate(); // Called when the component loses focus Delegate OnWatch(); // Called when the component is being watched Delegate OnHitTest(float MouseX, float MouseY); // Called when Hit test is performed for mouse input Delegate OnMessage(coerce string Msg, float MsgLife); // When a message comes down the line Delegate OnHide(); Delegate OnShow(); // Called just before OnHover() // Controller assigns the value of its MouseOver property to the result of this function delegate GUIToolTip OnBeginTooltip() { if ( ToolTip != None ) return ToolTip.EnterArea(); else if ( MenuOwner != None ) return MenuOwner.OnBeginTooltip(); return None; } // Called on the current ActiveControl when the mouse is moved over a new component // This is called before OnBeginTooltip is called on the new control // Return false if the tooltip will remain visible after leaving this control delegate bool OnEndTooltip() { if ( ToolTip != None ) return ToolTip.LeaveArea(); else if ( MenuOwner != None ) return MenuOwner.OnEndTooltip(); return true; } Delegate OnInvalidate(GUIComponent Who); // Called when the background is clicked // Return true to override default behavior // Called on both the active control & active page delegate bool OnHover( GUIComponent Sender ) { return false; } // -- Input event delegates Delegate bool OnClick(GUIComponent Sender); // The mouse was clicked on this control Delegate bool OnDblClick(GUIComponent Sender); // The mouse was double-clicked on this control Delegate bool OnRightClick(GUIComponent Sender); // Return false to prevent context menu from appearing Delegate OnMousePressed(GUIComponent Sender, bool bRepeat); // Sent when a mouse is pressed (initially) Delegate OnMouseRelease(GUIComponent Sender); // Sent when the mouse is released. Delegate OnTimer(GUIComponent Sender); // Called from Timer() Delegate OnChange(GUIComponent Sender); // Called when a component changes it's value Delegate bool OnKeyType(out byte Key, optional string Unicode) // Key Strokes { return false; } Delegate bool OnKeyEvent(out byte Key, out byte State, float delta) { return false; } delegate bool OnDesignModeKeyEvent( Interactions.EInputKey Key, Interactions.EInputAction State ) { return false; } Delegate bool OnCapturedMouseMove(float deltaX, float deltaY) { return false; } Delegate OnLoadINI(GUIComponent Sender, string s); // Do the actual work here Delegate string OnSaveINI(GUIComponent Sender); // Do the actual work here // drag-n-drop // Called when mouse is released over the DropSource to detemine whether OnClick() should be called delegate bool OnMultiSelect( GUIComponent Sender ) { return true; } delegate bool OnBeginDrag(GUIComponent Sender) // Called on the source component when a drag & drop operation begins { return bDropSource; } delegate OnEndDrag(GUIComponent Sender, bool bAccepted); // Called on the target component when data is dropped // DropStateChange() will be called on the source - DRP_Accept if it returns true, DRP_Reject if it returns false delegate bool OnDragDrop(GUIComponent Sender) { return false; } delegate OnDragEnter(GUIComponent Sender); // Called on the target component when the mouse enters the components bounds delegate OnDragLeave(GUIComponent Sender); // Called on a target component when the mouse leaves the components bounds delegate OnDragOver(GUIComponent Sender); // Called when the mouse is moved inside a target's bounds native(812) final function PlayerController PlayerOwner(); native(813) function final SetTimer(float Interval, optional bool bRepeat); native(814) function final KillTimer(); // Auto-positioning - accounts for bBoundToParent & bScaleToParent native(815) final function AutoPosition( array Components, float LeftBound, float UpperBound, float RightBound, float LowerBound, float LeftPad, float UpperPad, float RightPad, float LowerPad, optional int NumberOfColumns, optional float ColumnPadding ); native(816) final function AutoPositionOn( array Components, GUIComponent Frame, float LeftPadPerc, float UpperPadPerc, float RightPadPerc, float LowerPadPerc, optional int NumberOfColumns, optional float ColumnPadding ); native(817) final function UpdateOffset(float PosX, float PosY, float PosW, float PosH); //native(818) final function DrawSpriteWidget(Canvas C, float ResScaleX, float ResScaleY, out HudBase.SpriteWidget Widget); //native(819) final function DrawNumericWidget(Canvas C, float ResScaleX, float ResScaleY, out HudBase.NumericWidget Widget, out HudBase.DigitSet Digit); // The ActualXXXX functions are not viable until after the first pre-render so don't // use them in inits native(820) final function float ActualWidth( optional coerce float Val, optional bool bForce ); native(821) final function float ActualHeight( optional coerce float Val, optional bool bForce ); native(822) final function float ActualLeft( optional coerce float Val, optional bool bForce ); native(823) final function Float ActualTop( optional coerce float Val, optional bool bForce ); native(824) final function float RelativeLeft( optional coerce float RealLeft, optional bool bForce ); native(825) final function float RelativeTop( optional coerce float RealTop, optional bool bForce ); native(826) final function float RelativeWidth( optional coerce float RealWidth, optional bool bForce ); native(827) final function float RelativeHeight( optional coerce float RealHeight, optional bool bForce ); event ResolutionChanged( int ResX, int ResY ); function SetPosition( float NewLeft, float NewTop, float NewWidth, float NewHeight, optional bool bForceRelative ) { if ( bDebugging && (Controller == None || Controller.bModAuthor) ) log(Name$".SetPosition( "$NewLeft$","@NewTop$","@NewWidth$","@NewHeight$","@bForceRelative,'ModAuthor'); if ( bForceRelative ) { WinLeft = RelativeLeft(NewLeft); WinTop = RelativeTop(NewTop); WinWidth = RelativeWidth(NewWidth); WinHeight = RelativeHeight(NewHeight); } else { WinLeft = NewLeft; WinTop = NewTop; WinWidth = NewWidth; WinHeight = NewHeight; } if ( bDebugging && bForceRelative && (Controller == None || Controller.bModAuthor) ) log(Name@"SetPosition() Current L:"$WinLeft$"("$Bounds[0]$") T:"$WinTop$"("$Bounds[1]$") W:"$WinWidth$"("$Bounds[0]+Bounds[2]$") H:"$WinHeight$"("$Bounds[1]+Bounds[3]$")",'ModAuthor'); } // For debugging native(828) final function string GetMenuPath(); // Used only for design mode - performs raw hit detection, without regard to properties that affect // hit detection (bAcceptsInput, MenuState, etc.) native(829) final function bool SpecialHit( optional bool bForce ); event string AdditionalDebugString() { return ""; } event Timer() { OnTimer(Self); } event Opened(GUIComponent Sender) // Called when the Menu Owner is opened { LoadIni(); if ( ToolTip != None ) { ToolTip.InitComponent( Controller, Self ); SetToolTipText( Hint ); } } event Closed(GUIComponent Sender, bool bCancelled) // Called when the Menu Owner is closed { if (!bCancelled) SaveIni(); } event Free() // This control is no longer needed { MenuOwner = None; PageOwner = None; Controller = None; FocusInstead = None; FriendlyLabel = None; Style = None; if ( ToolTip != None ) ToolTip.Free(); ToolTip = None; } function string LoadINI() { local string s; if ( (PlayerOwner()==None) || (INIOption=="") ) return ""; if ( IniOption ~= "@Internal" ) { OnLoadIni(Self,""); return ""; } s = PlayerOwner().ConsoleCommand("get"@IniOption); if (s=="") s = IniDefault; OnLoadINI(Self,s); return s; } function SaveINI(optional string Value) { if (PlayerOwner()==None) return; OnSaveINI(Self); } // Take a string and strip out colour codes static function string StripColorCodes(string InString) { local int CodePos; CodePos = InStr(InString, Chr(27)); // while(CodePos != -1 && CodePos < Len(InString)-3) // ignore colour codes at the end of the string while ( CodePos != -1 ) // do not ignore color codes at the end of the word, or they aren't stripped { InString = Left(InString, CodePos)$Mid(InString, CodePos+4); CodePos = InStr(InString, Chr(27)); } return InString; } static function string MakeColorCode(color NewColor) { // Text colours use 1 as 0. if(NewColor.R == 0) NewColor.R = 1; if(NewColor.G == 0) NewColor.G = 1; if(NewColor.B == 0) NewColor.B = 1; return Chr(0x1B)$Chr(NewColor.R)$Chr(NewColor.G)$Chr(NewColor.B); } // Functions event MenuStateChange(eMenuState Newstate) { //log("MenuStateChange:"$NewState@Self.Name); if ( MenuState != MSAT_Watched ) LastMenuState = MenuState; bPendingFocus = false; MenuState = NewState; switch (MenuState) { case MSAT_Focused: if ( !bNeverFocus ) { bHasFocus = true; break; } MenuState = MSAT_Blurry; case MSAT_Blurry: bHasFocus = false; if ( LastMenuState != MSAT_Blurry && LastMenuState != MSAT_Disabled ) OnDeActivate(); break; case MSAT_Watched: if (bFocusOnWatch) { SetFocus(None); return; } OnWatch(); break; case MSAT_Disabled: if (Controller.ActiveControl == Self) Controller.ActiveControl = None; if (Controller.FocusedControl == Self) LoseFocus(None); break; } if ( FriendlyLabel != None ) FriendlyLabel.MenuState = MenuState; } event bool IsMultiSelect() { if ( Controller == None ) return false; return bDropSource && DropState != DRP_Source && Controller.CtrlPressed && OnMultiSelect(Self); } event DropStateChange(eDropState NewState) { if (Controller == None) return; // log( Name$".DropStateChange Current:"$GetEnum(enum'eDropState',DropState)@"New:"$GetEnum(enum'eDropState',NewState) // @"DropSource:"$Controller.DropSource == Self@"DropTarget:"$Controller.DropTarget==Self); switch (NewState) { case DRP_None: // might be DropTarget with DropState == DRP_Source if we are mousing over the DropSource if ( Controller.DropTarget == Self ) { OnDragLeave(Self); Controller.DropTarget = None; // If this component is also the DropSource, do not alter the DropState if ( Controller.DropSource == Self ) return; } else if (Controller.DropSource == Self) { UpdateOffset(0,0,0,0); Controller.DropSource = None; } break; case DRP_Source: // Don't alter the drop state if component didn't want to begin a drag operation if ( !OnBeginDrag(Self) ) return; Controller.DropSource = Self; Controller.PlayInterfaceSound(CS_Drag); break; case DRP_Target: Controller.DropTarget = Self; if (DropState == DRP_None) OnDragEnter(Self); break; case DRP_Accept: Controller.PlayInterfaceSound(CS_Up); if ( Controller.DropSource != None ) Controller.DropSource.OnEndDrag(Self, True); Controller.DropTarget = None; NewState = DRP_None; break; case DRP_Reject: Controller.PlayInterfaceSound(CS_Down); if ( Controller.DropSource != None ) Controller.DropSource.OnEndDrag(Self, False); Controller.DropTarget = None; NewState = DRP_None; break; } DropState = NewState; } event InitComponent(GUIController MyController, GUIComponent MyOwner) { Controller = MyController; MenuOwner = MyOwner; PageOwner = OwnerPage(); if (Style==None) Style = Controller.GetStyle(StyleName, FontScale); } function bool IsInBounds() // Script version of PerformHitTest { return ( (Controller.MouseX >= Bounds[0] && Controller.MouseX<=Bounds[2]) && (Controller.MouseY >= Bounds[1] && Controller.MouseY <=Bounds[3]) ); } function bool IsInClientBounds() { return ( (Controller.MouseX >= ClientBounds[0] && Controller.MouseX<=ClientBounds[2]) && (Controller.MouseY >= ClientBounds[1] && Controller.MouseY <=ClientBounds[3]) ); } event bool CanAcceptFocus() { return MenuState != MSAT_Disabled && bVisible && !bNeverFocus; } event SetFocus(GUIComponent Who) { if (Who==None) { if (bNeverFocus) { if (FocusInstead != None) FocusInstead.SetFocus(Who); return; } bPendingFocus = true; if (Controller.FocusedControl!=None) { if (Controller.FocusedControl == Self) // Already Focused return; else Controller.FocusedControl.LoseFocus(Self); } MenuStateChange(MSAT_Focused); Controller.FocusedControl = self; OnActivate(); } else MenuStateChange(MSAT_Focused); if (MenuOwner!=None) MenuOwner.SetFocus(self); } event LoseFocus(GUIComponent Sender) { if (Controller!=None) Controller.FocusedControl = None; if (MenuState != MSAT_Disabled) MenuStateChange(MSAT_Blurry); if (MenuOwner!=None) MenuOwner.LoseFocus(Self); } event bool FocusFirst(GUIComponent Sender) // Focus your first child, or yourself if no childrean { if ( !bTabStop || !CanAcceptFocus() ) return false; SetFocus(None); return true; } event bool FocusLast(GUIComponent Sender) // Focus your last child, or yourself { if ( !bTabStop || !CanAcceptFocus() ) return false; SetFocus(None); return true; } event bool NextControl(GUIComponent Sender) { if (MenuOwner!=None) return MenuOwner.NextControl(Self); return false; } event bool PrevControl(GUIComponent Sender) { if (MenuOwner!=None) return MenuOwner.PrevControl(Self); return false; } event bool NextPage() { if (MenuOwner != None) return MenuOwner.NextPage(); return false; } event bool PrevPage() { if (MenuOwner != None) return MenuOwner.PrevPage(); return false; } // Force control to use same area as its MenuOwner. function FillOwner() { WinLeft = 0.0; WinTop = 0.0; WinWidth = 1.0; WinHeight = 1.0; bScaleToParent = true; bBoundToParent = true; } event SetVisibility( coerce bool bIsVisible) { bVisible = bIsVisible; if (bVisible) OnShow(); else OnHide(); } function CenterMouse() { local PlayerController PC; local float MidX, MidY; PC = PlayerOwner(); if ( PC != None ) { MidX = ActualLeft() + ActualWidth() / 2; MidY = ActualTop() + ActualHeight() / 2; PC.ConsoleCommand("SETMOUSE" @ MidX @ MidY); } } event Hide() { SetVisibility(false); } event Show() { SetVisibility(true); } function SetFocusInstead( GUIComponent InFocusComp ) { if ( InFocusComp != None ) bNeverFocus = true; FocusInstead = InFocusComp; } function SetFriendlyLabel(GUILabel NewLabel) { FriendlyLabel = NewLabel; } function SetHint(string NewHint) { Hint = NewHint; SetToolTipText(Hint); } function SetToolTipText( string NewToolTipText ) { if ( ToolTip != None ) ToolTip.SetTip( NewToolTipText ); } function SetTooltip( GUIToolTip InTooltip ) { if ( ToolTip != None ) ToolTip.LeaveArea(); ToolTip = InToolTip; if ( ToolTip != None ) ToolTip.InitComponent( Controller, Self ); } function PadLeft( out string Src, int StrLen, optional string PadStr ) { if ( PadStr == "" ) PadStr = " "; while ( Len(Src) < StrLen ) Src = PadStr $ Src; } function PadRight( out string Src, int StrLen, optional string PadStr ) { if ( PadStr == "" ) PadStr = " "; while ( Len(Src) < StrLen ) Src = Src $ PadStr; } final function DebugFocus( GUIComponent Who, bool bLose ) { return; if ( Controller != None && Controller.CtrlPressed ) { if ( bLose ) { if ( Who == None ) log(Name@"losing focus chain down"); else log(Name@"losing focus of"@Who); } else { if ( Who == None ) log(Name@"sending focus chain down"); else log(Name@"setting focus to"@Who); } } } final function DebugFocusPosition( GUIComponent Who, bool Last ) { return; if ( Controller.CtrlPressed ) { if ( Last ) { if ( Who == None ) log(Name@"FocusLast going down"); else log(Name@"FocusLast call from"@Who); } else { if ( Who == None ) log(Name@"FocusFirst going down"); else log(Name@"FocusFirst call from"@Who); } } } event GUIPage OwnerPage() { local GUIComponent C; if ( PageOwner != None ) return PageOwner; C = Self; while ( C != None ) { if ( GUIPage(C) != None ) return GUIPage(C); C = C.MenuOwner; } Warn( "OwnerPage not found!" ); return None; } // By default, we don't care which components are animating // Input is disabled while bAnimating event BeginAnimation( GUIComponent Animating ) { bAnimating = True; if ( MenuOwner != None ) MenuOwner.BeginAnimation(Animating); } event EndAnimation( GUIComponent Animating, EAnimationType Type ) { bAnimating = False; if ( MenuOwner != None ) MenuOwner.EndAnimation( Animating, Type ); if ( Animating == Self ) OnEndAnimation(Animating, Type); } // If you short circuit these functions (by modifying the animation arrays directly) // you must call BeginAnimation() on the owning page for each frame function Animate( float NewLeft, float NewTop, optional float Time ) { local int i; i = MotionFrame.Length; MotionFrame.Length = i + 1; MotionFrame[i].X = NewLeft; MotionFrame[i].Y = NewTop; MotionFrame[i].Z = Time; if ( i < 1 ) BeginAnimation(Self); } function Resize( float NewWidth, float NewHeight, optional float Time ) { local int i; i = SizeFrame.Length; SizeFrame.Length = i + 1; SizeFrame[i].X = NewWidth; SizeFrame[i].Y = NewHeight; SizeFrame[i].Z = Time; if ( i < 1 ) BeginAnimation(Self); } function DAnimate( float NewLeft, float NewTop, float NewWidth, float NewHeight, optional float PositionTime, optional float DimensionTime ) { Animate( NewLeft, NewTop, PositionTime ); Resize( NewWidth, NewHeight, DimensionTime ); } function KillAnimation() { if ( MotionFrame.Length > 0 ) { MotionFrame.Remove( 0, MotionFrame.Length ); EndAnimation( Self, AT_Position ); } if ( SizeFrame.Length > 0 ) { SizeFrame.Remove( 0, SizeFrame.Length ); EndAnimation( Self, AT_Dimension ); } } final function EnableComponent(GUIComponent Comp) { if ( Comp == None ) return; Comp.EnableMe(); } final function DisableComponent(GUIComponent Comp) { if ( Comp == None ) return; Comp.DisableMe(); } function EnableMe() { if ( MenuState != MSAT_Disabled ) return; MenuStateChange(MSAT_Blurry); } function DisableMe() { if ( MenuState == MSAT_Disabled ) return; MenuStateChange(MSAT_Disabled); } function LevelChanged() { if ( ToolTip != None ) ToolTip.Free(); } function DebugTabOrder(); F_F_*F_F_F_hT Q#!v*rJ*G LQy*qwJ* wG*DT }{rJ*d.cEy*'d.AFJ'rd*Could not create panel9VG*T Jz*T QewT }ddAT diB-o*GdA'QdqETFDDhEd* GF_g3|*u.|* ' GF_F_F_f Af3]rS*(f  GF_S F_F_F_*F_sF_F_GF_F_j3F_F_q3l3BUCs.CA==s`ss GF_B1// ==================================================================== // Class: UT2K4UI. UT2NumericEdit // // A Combination of an EditBox and 2 spinners // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUINumericEdit extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var Automated GUIEditBox MyEditBox; var Automated GUISpinnerButton MySpinner; var() string Value; var() bool bLeftJustified; var() int MinValue; var() int MaxValue; var() int Step; var() bool bReadOnly; function InitComponent(GUIController MyController, GUIComponent MyOwner) { if ( MinValue < 0 ) MyEditBox.bIncludeSign = True; Super.InitComponent(MyController, MyOwner); MyEditBox.OnChange = EditOnChange; MyEditBox.SetText(Value); MyEditBox.OnKeyEvent = EditKeyEvent; MyEditBox.OnDeActivate = CheckValue; CalcMaxLen(); MyEditBox.INIOption = INIOption; MyEditBox.INIDefault = INIDefault; MySpinner.bNeverFocus = True; MySpinner.FocusInstead = MyEditBox; MySpinner.OnPlusClick = SpinnerPlusClick; MySpinner.OnMinusClick = SpinnerMinusClick; SetReadOnly(bReadOnly); SetHint(Hint); } function CalcMaxLen() { local int digitcount,x; digitcount=1; x=10; while (x <= MaxValue) { digitcount++; x*=10; } MyEditBox.MaxWidth = DigitCount; } function SetValue(int V) { if (vMaxValue) v=MaxValue; MyEditBox.SetText( string(Clamp(V, MinValue, MaxValue)) ); } function bool SpinnerPlusClick(GUIComponent Sender) { SetValue(int(Value) + Step); return true; } function bool SpinnerMinusClick(GUIComponent Sender) { SetValue(int(Value) - Step); return true; } function bool EditKeyEvent(out byte Key, out byte State, float delta) { if ( (key==0xEC) && (State==3) ) { SpinnerPlusClick(none); return true; } if ( (key==0xED) && (State==3) ) { SpinnerMinusClick(none); return true; } return MyEditBox.InternalOnKeyEvent(Key,State,Delta); } function EditOnChange(GUIComponent Sender) { Value = string(Clamp(int(MyEditBox.TextStr), MinValue, MaxValue)); OnChange(Self); } function SetHint(string NewHint) { local int i; Super.SetHint(NewHint); for (i=0;i Timers; // List of components with Active Timers // if last on the stack. var() EMenuRenderStyle BackgroundRStyle; // Delegates delegate OnOpen() { if ( Controller != None && Controller.bSnapCursor ) CenterMouse(); } delegate OnReOpen(); delegate OnClose(optional bool bCancelled); delegate bool OnCanClose(optional Bool bCancelled) { return true; } event Closed(GUIComponent Sender, bool bCancelled) { Super.Closed(Sender, bCancelled); OnClose(bCancelled); } //================================================= // PlayOpenSound / PlayerClosedSound function PlayOpenSound() { PlayerOwner().PlayOwnedSound(OpenSound,SLOT_Interface,1.0); } function PlayCloseSound() { PlayerOwner().PlayOwnedSound(CloseSound,SLOT_Interface,1.0); } //================================================= // InitComponent is responsible for initializing all components on the page. function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); FocusFirst(none); } //================================================= // CheckResolution - Tests to see if this menu requires a resoltuion of at least 640x480 and if so, switches function CheckResolution(bool Closing, GUIController InController) { local string CurrentRes; local string Xstr, Ystr; local int ResX, ResY; if ( InController == None ) return; if ( InController.ResX == 0 || InController.ResY == 0 ) { CurrentRes = PlayerOwner().ConsoleCommand("GETCURRENTRES"); if ( Divide(CurrentRes, "x", Xstr, Ystr) ) { ResX = int(Xstr); ResY = int(Ystr); } } else { ResX = InController.ResX; ResY = InController.ResY; CurrentRes = InController.ResX $ "x" $ InController.ResY; } if (!Closing) { if ( InController != None && ResX < 640 && ResY < 480 && bRequire640x480 ) { if ( InController.bModAuthor ) log(Name$".CheckResolution() - menu requires 640x480. Currently at "$CurrentRes,'ModAuthor'); InController.GameResolution = CurrentRes; Console(InController.Master.Console).DelayedConsoleCommand("TEMPSETRES 640x480"); } return; } if ( !bRequire640x480 || InController.GameResolution == "" ) return; if ( CurrentRes != InController.GameResolution ) { if ( !InController.NeedsMenuResolution() ) { if ( InController.bModAuthor ) log(Name$".CheckResolution() - restoring menu resolution to standard value:"@InController.GameResolution,'ModAuthor'); Console(InController.Master.Console).DelayedConsoleCommand("SETRES"@InController.GameResolution); InController.GameResolution = ""; } else if ( InController.bModAuthor ) log(Name$".CheckResolution() - not restoring resolution to standard value: ParentMenu would abort.",'ModAuthor'); } } event ChangeHint(string NewHint) { SetHint(NewHint); } event SetFocus(GUIComponent Who) { if (Who==None) return; Super.SetFocus(Who); } event HandleParameters(string Param1, string Param2); // Should be subclassed function bool GetRestoreParams( out string Param1, out string Param2 ); // Params will be used when page is reopened // Should be subclassed - general purpose function to workaround menuclass dependancy // Not called from anywhere - call it only if you need it function HandleObject( Object Obj, optional Object OptionalObj_1, optional Object OptionalObj_2 ); function string GetDataString() { return ""; } function SetDataString(string Str); // If !bPersistent, return true for GUIController to close this menu at level change // If bPersistent, return true to be removed from persistent stack at level change (will also be closed if open) function bool NotifyLevelChange() { LevelChanged(); return true; } event Free() // This control is no longer needed { local int i; if ( !bPersistent ) { for ( i = 0; i < Timers.Length; i++ ) Timers[i]=None; Super.Free(); } } final function bool IsOpen() { if ( Controller == None ) return false; return Controller.FindMenuIndex(Self) != -1; } function bool AllowOpen(string MenuClass) { return true; } F_lF_*F_bM*@ x0.i.M*ri*(Gi'' GF_C4N*M"l *lGP*lc̸=lr=lVQ*El)Dm EltDBl ! 7lilN*O*l GF_iF_F_h isc,ws*r V * V sAlY V Y a l ~ls ~ GF_c@4E4c`1s7H,c)rJ*^%]^BFJJ&]^7H^%G^H' GF_^F_F_F_*F_i-D4H4H2~7H,i-1rJ*g7H&hgBFJJ&hg%g7H&GgH' GF_gF_F_J4@*C-5N }wN *M %M 7N w.>M N *.>M N |@*A*M  GF_M4Q dQ }wQ *O %O 7Q yw.>O Q *.>O Q yO .C}=d GF_F_F_F_F_P4K4} f5wA*wA=*.A=aw=*=a/!G .=* GF_pvF_F_F_F_u)O4S"c, GF_F_F_Q4F_F_V[4epXf$!V-e-e{* GF_fF_F_V4F_F_`4X4{,2 -V'f.&(g.3,of.,(c,Namef'c,Characterg'|f&l Tf1Tf0 {TfUfc,TeamTf'c,X?9Jc, Teamc,"setnamefc,"changecharactergz.,(&m c,Q ,z.,(,m c, Q z.,(,m c,Q %c,Q &c,R?9?.!, x-V(' GF_F_F_S^4^$o7 Rh%fodCAqXjj Rh,fodCAqX  GF_F_F_a4l)Z,rl,.3,oUUrl,.3,e' GF_[k_]W -P nr_&r_,r_,r_, -V'Fr_,. ,%.3,z.,,.^ a.,yd.3,[ .&(-Z (a|[ Nothing |[ |[ Player-Z '`%`7dp -Z |6`dp[ -Z '`h-Z .&&.3,om.3,|c,sm $;-dv-V'r_, c,-. , -c,b GF_t@F_F_p4p @;rp &.p &c, Namerp ,rc,*rc,*sc, Teamsp9Sc,Ufs|s1., &&l ., &%l rp ,q9D  qq,., &&m q.,&,m q%.,&,m ., &%m rp ,tc,Character.3p kt. ,%.3,z.,,.^ a.,yrp , .!, {9Dc,  GF_F_F_m4F_F_{4n4k P-dhV' GF_F_F_q4F_F_}ls4j -d-dQ-dv,-(., JC),-', -(., JRh*' GF_JF_F_J~4^$o7 Sh&fodCAqXjj Sh,fodCAqX  GF_F_F_A5LRt?-dLJ@@HDAhAa J6]H6]D6]ALah('B( GF_K5kvR k.,G_.6k r_*pppCould not load mesh: 6k For player: 6k `.6k r`*pppCould not load body material: 6k For player: 6k a.6k |ra*pppCould not load head material: 6k For player: 6k h _%h`&hah a!n ? GF_0m F)!jr0F)G)Z%KZ7EZ&D]Z., .%m ., .&m .,.,m .,.,m .,a'., .%l ., .&l .,a'E.,i&DyC~-T., |DUP.,|DUPUNLOCK. ,%.3,z.,,.^ a.,yhc,a Lha+c, h$h-S'h fff?hQ.-d(., JR.&_-y '.&_N,.!, ]V,. , Ac,-or.tc,Zf*,-( GF_L// ==================================================================== // Class: XInterface.GUIPanel // // The GUI panel is a visual control that holds components. All // components who are children of the GUIPanel are bound to the panel // by default. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIPanel extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var(Panel) Material Background; Delegate bool OnPostDraw(Canvas Canvas); function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i ButtonNames; // Buttons Names: Ok, Cancel, Retry, Continue, Yes, No, Abort, Ignore. Clamped [0,7]. var array Buttons; var GUIButton DefaultButton, CancelButton; delegate OnButtonClick(byte bButton); delegate bool NewOnButtonClick(byte bButton) { return true; } function InitComponent(GUIController pMyController, GUIComponent MyOwner) { Super.Initcomponent(pMyController, MyOwner); lMessage=GUILabel(Controls[1]); ParentPage.InactiveFadeColor=class'Canvas'.static.MakeColor(128,128,128,255); } function bool InternalOnPreDraw(Canvas C) { local float XL, YL; local int i; local array MsgArray; // Organize the layout for the Label and the Buttons Top if (lMessage.TextFont != "") C.Font = Controller.GetMenuFont(lMessage.TextFont).GetFont(C.SizeX); C.TextSize("W", XL, YL); C.WrapStringToArray(lMessage.Caption, MsgArray, lMessage.ActualWidth(), "|"); YL *= MsgArray.Length; if (lMessage.Style != None) YL += lMessage.Style.BorderOffsets[1] + lMessage.Style.BorderOffsets[3]; // transform YL to a % lMessage.WinHeight = (YL +1 )/ C.SizeY; WinHeight = (YL + Buttons[0].ActualHeight() + 60) / C.SizeY ; WinTop = (C.SizeY - ActualHeight())/2; lMessage.WinTop = WinTop + 20; for (i = 0; i= ButtonNames.Length ) { log("GUIQuestionPage.AddButton() button mask was larger than button name array!"); return None; } btn = GUIButton(AddComponent("XInterface.GUIButton")); if ( btn == None ) return None; btn.Tag = idesc; btn.TabOrder = Components.Length; btn.Caption = ButtonNames[cnt]; btn.OnClick = ButtonClick; Buttons[Buttons.Length] = btn; return btn; } function LayoutButtons(byte ActiveButton) { local int i; local float left, colw, btnw; // Simply center the button(s) colw = 1/(Buttons.Length + 1); btnw = colw * 0.66; left = colw - btnw/2; for (i = 0; i 0 ) Buttons.Remove(0,Buttons.Length); RemapComponents(); } F__@F_F_k5Cju5F_F_F_w5s5loQy-Vo--mr--lt--YYCZ--Xp-YqK^Nxckxdix-Vo--Wq-_x(Bz(]}(-xb\c-b - q-  w( B {( - F-  Gx M.H  ]`a(Me_pp_?GameStats=9T-mMy_pp_?BalanceTeams=9T-l-X_p_?LAN=-V-W_pp_?MinPlayers=9S^_pppp_?MaxPlayers=9Sc?MaxSpectators=9Sd^_p_?bAutoNumBots=True{B {]_pppp_?AdminName=B?AdminPassword=]{__pp_?GamePassword=_-YY_pp_?PlayersMustBeReady=9T-YYL-xb_pp_?AllowBehindview=9T-xb_pp_?difficulty=9SY_ GF_0W([(!;0[(\(o. ,o A-Vp. ,p A-Xq. ,qA - r. ,r A-mt. ,t A-lCZ. ,CZ A-YYq.,x%\x,q.x lix#qa'q 3Yo. , o A-Vq. , q A-WN.!, N {^k.!, k {ci.!, i {dw.,w& x.,x &_z.,z &B{.,{& }.,} &]F. ,FA - G.!,G{  \c. ,\c A-xb-df'z_-y '}_-y 'x_-y ' GF_F_F_{5r'_rNf -P U.r'IJzU URUbHR GF_xF_F_A6z5z^_ -P xyYvkMShx%bCMC GF_F_F_@F_n'F_IF_F_5F_F_I6@6mM6OF%O %'IO IOF&OJII&O I&' GF_wF_F_C6F_F_quK c,e($? GF_F6MPH c,d($? GF_\// ==================================================================== // Class: UT2K4UI.GUIComboBox // // A Combination of an EditBox, a Down Arrow Button and a ListBox // // Written by Michel Comeau // Updated by Ron Prestenback // (c) 2002, 2003 Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIComboBox extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() bool bReadOnly; var() bool bValueReadOnly; var() bool bIgnoreChangeWhenTyping; // If not read-only, only accept OnChange when Enter is pressed var() bool bShowListOnFocus; var() int MaxVisibleItems; var() editconst int Index; var() editconst string TextStr; var() editconst GUIList List; var Automated GUIEditBox Edit; var Automated GUIScrollButtonBase MyShowListBtn; var Automated GUIListBox MyListBox; delegate OnShowList(); // Called when the list is shown delegate OnHideList(); // Called when the list is hidden function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); List = MyListBox.List; List.OnChange = ItemChanged; List.bHotTrack = true; List.bHotTrackSound = false; List.OnClickSound = CS_Click; List.OnClick = InternalListClick; List.OnInvalidate = InternalOnInvalidate; List.TextAlign = TXTA_Left; MyListBox.Hide(); Edit.OnChange = TextChanged; Edit.OnMousePressed = InternalEditPressed; Edit.INIOption = INIOption; Edit.INIDefault = INIDefault; Edit.bReadOnly = bReadOnly; List.OnDeActivate = InternalListDeActivate; MyShowListBtn.OnClick = ShowListBox; MyShowListBtn.FocusInstead = List; SetHint(Hint); } function SetHint(string NewHint) { Super.SetHint(NewHint); MyShowListBtn.SetHint(NewHint); Edit.SetHint(NewHint); } function bool InternalOnKeyEvent(out byte Key, out byte State, float Delta) { local Interactions.EInputKey iKey; if ( State == 3 ) { iKey = EInputKey(Key); if (iKey == IK_Down && Controller.ShiftPressed) { ShowListBox(Self); return true; } if ( iKey == IK_Enter && !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping && TextStr != Edit.GetText() ) { TextStr = Edit.TextStr; OnChange(self); } } return false; } function InternalListDeActivate() { if ( bDebugging ) log(Name@"ListDeactivate Edit.bPendingFocus: "$Edit.bPendingFocus); if (!Edit.bPendingFocus) HideListBox(); } function InternalOnInvalidate(GUIComponent Who) { if ( bDebugging ) log(Name@"Invalidate Who:"$Who); if ( Who != Controller.ActivePage ) return; Edit.SetFocus(None); HideListBox(); } function InternalEditPressed(GUIComponent Sender, bool bRepeat) { if ( bDebugging ) log(Name@"EditPressed MyListBox.bVisible:"@MyListBox.bVisible); if ( Edit.bReadOnly && !bRepeat ) { if ( !MyListBox.bVisible ) { Controller.bIgnoreNextRelease = true; ShowListBox(Self); } else HideListBox(); } return; } function bool InternalListClick(GUIComponent Sender) { if ( bDebugging ) log(Name@"ListClick"); if ( !bValueReadOnly ) List.InternalOnClick(Sender); Edit.SetFocus(none); HideListBox(); return true; } function string InternalOnSaveIni(GUIComponent Sender) { return OnSaveIni(Sender); } function InternalOnLoadIni(GUIComponent Sender, string S) { OnLoadIni(Sender, S); } function HideListBox() { if ( bDebugging ) log(Name@"HideListBox"); OnHideList(); if ( Controller != None ) MyShowListBtn.Graphic = Controller.ImageList[7]; MyListBox.Hide(); List.SilentSetIndex( List.FindIndex(TextStr) ); } event SetVisibility(bool bIsVisible) { local bool bTemp; Super(GUIComponent).SetVisibility(bIsVisible); bTemp = bDebugging; bDebugging = False; HideListBox(); MyShowListBtn.SetVisibility(bIsVisible); Edit.SetVisibility(bIsVisible); bDebugging = bTemp; } function bool ShowListBox(GUIComponent Sender) { if ( bDebugging ) log(Name@"ShowListBox MyListBox.bVisible:"$MyListBox.bVisible); OnShowList(); MyListBox.SetVisibility(!MyListBox.bVisible); if (MyListBox.bVisible) MyShowListBtn.Graphic = Controller.ImageList[2]; else MyShowListBtn.Graphic = Controller.ImageList[7]; if (MyListBox.bVisible) { List.SetFocus(none); List.SetTopItem(List.Index); } return true; } function ItemChanged(GUIComponent Sender) { Index = List.Index; SetText(List.Get()); if ( !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping ) { TextStr = Edit.TextStr; OnChange(Self); } } function TextChanged(GUIComponent Sender) { if ( bValueReadOnly ) Edit.TextStr = TextStr; else if ( bReadOnly || !bIgnoreChangeWhenTyping ) { TextStr = Edit.TextStr; OnChange(self); } } function SetText(string NewText, optional bool bListItemsOnly) { local int i; i = List.FindIndex(NewText); if ( (bReadOnly || bListItemsOnly) && i < 0 ) return; Edit.SetText(NewText); TextStr = Edit.TextStr; } function SetExtra(string NewExtra, optional bool bListItemsOnly) { local int i; i = FindExtra(NewExtra); if (( bReadOnly || bListItemsOnly ) && i < 0 ) return; Edit.SetText( List.GetItemAtIndex(i) ); } function string Get() { return Edit.GetText(); } function string GetText() { return Get(); } function object GetObject() { local string temp; temp = List.Get(); if ( temp~=Edit.GetText() ) return List.GetObject(); return none; } function string GetExtra() { local string temp; temp = List.Get(); if ( temp~=Edit.GetText() ) return List.GetExtra(); return ""; } function SetIndex(int I) { List.SetIndex(i); } function int GetIndex() { return List.Index; } function AddItem(string Item, Optional object Extra, Optional string Str) { List.Add(Item,Extra,Str); } function RemoveItem(int Item, optional int Count) { List.Remove(Item, Count); } function string GetItem(int index) { return List.GetItemAtIndex(index); } function object GetItemObject(int index) { return List.GetObjectAtIndex(index); } function string find(string Text, optional bool bExact, optional bool bExtra) { return List.Find(Text,bExact, bExtra); } function int FindExtra(string Text, optional bool bExact) { return List.FindExtra(Text, bExact); } function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object Obj) { return List.FindIndex(Test, bExact, bExtra, Obj); } function int ItemCount() { return List.ItemCount; } function ReadOnly(bool b) { Edit.bReadOnly = b; } function InternalOnMousePressed(GUIComponent Sender, bool bRepeat) { if (!bRepeat) { if ( bDebugging ) log(Name@"MousePressed"); ShowListBox(Sender); } } function Clear() { List.Clear(); if ( bReadOnly ) Edit.SetText(""); // Set my values directly, in case component's state prevented OnChange() events from being passed upwards TextStr = ""; Index = -1; } function CenterMouse() { if ( MyShowListBtn != None ) MyShowListBtn.CenterMouse(); else Super.CenterMouse(); } function SetFriendlyLabel( GUILabel NewLabel ) { Super.SetFriendlyLabel(NewLabel); if ( Edit != None ) Edit.SetFriendlyLabel(NewLabel); if ( MyShowListBtn != None ) MyShowListBtn.SetFriendlyLabel(NewLabel); if ( MyListBox != None ) MyListBox.SetFriendlyLabel(NewLabel); } function LoseFocus(GUIComponent Sender) { if ( bDebugging ) log(Name@"LoseFocus Sender:"$Sender); Super.LoseFocus(Sender); } function bool FocusFirst( GUIComponent Sender ) { if ( Edit != None ) { HideListBox(); Edit.SetFocus(None); return true; } if ( bAcceptsInput ) { Super(GUIComponent).SetFocus(None); return true; } return false; } function bool FocusLast( GUIComponent Sender ) { if ( Edit != None ) { HideListBox(); Edit.SetFocus(None); return true; } if ( bAcceptsInput ) { Super(GUIComponent).SetFocus(None); return true; } return false; } F_M6E6n=j6OF%O %'wO w%OJww&O w&' GF_F_F_4d'afp rR* Rv%Rz%rc,"GETCURRENTRESrxcbn9Jcl9JbnRvlRzrpp9SRvx9SRz-d'wR* n l-NR-cFpp9W.CheckResolution() - menu requires 640x480. Currently at r!NFRGr.RMTEMPSETRES 640x480 -NzRG m{rRGRi R-cFp9W.CheckResolution() - restoring menu resolution to standard value:RG!NF.RMSETRESRGRGmmR-cFp9W.CheckResolution() - not restoring resolution to standard value: ParentMenu would abort.!NF GF_J6F_F_P6L6o0jfOF%'ojO(OR_o' GF_F_F_N6F_F_T6O6p%[oF%'Ojo(oR' GF_F_F_Q6F_F_Z6R6uQ6OF%O %'o1OIo_O|O &_o' GF_Zd@un r@* Z@ GF_F_F_V6F_F_Y6@F_F_@F_F_[6W6t D6oF%o %'O1oIo|o &' GF_]6T'v  GF_4BL'!%4L'K'B.& GF_`6yHzy Q.py.LevelSummary bwQ*N;QQ%.py.Screenshot rQ%*rQ*rQ*Q% Q%QI~y-'I%HyEHy}yI&wQ*. ,;p9SQ-9SQplayers. ,;lX aXMapsH,zlXwQ*lXQ)lXNo Description Available![. ,;s ^lX rzlXlXm&wQ*{Q. ,;Author:Q. ,;s ^lX GF_@F_F_\6J')zrJ',@B(5z@'7Kw7Kw&7Kw&Kw@KQ7KwKb M(' GF_c6^6eQhyY% GF_@F_F_@F_F_f6b6M hyY, GF_F_F_4F'!K4F'E'.&_y0123456789.: GF_i6d6y 9KhyY, GF_@F_F_e6D') rD',_ (5z_ 'M~_ :iM%x_ Nax_ ML_ M&N9JL6Dx6DN6DN&6DUnknownD ~D M(' GF_l6g6F> hyY, GF_DF_F_@F_F_n6k6k hyY& GF_y@F_F_p6hz ~%{~|D%yty}&~}&y~ GF_@F_F_w6o6lr;  GF_tp// ==================================================================== // Class: UT2K4UI.GUICircularList // Parent: UT2K4UI.GUIListBase // // // ==================================================================== class GUICircularList extends GUIListBase Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() bool bCenterInBounds; // Center the list in the bounding box var() bool bFillBounds; // If true, the list will take up the whole bounding box var() bool bIgnoreBackClick; // If true, will ignore any click on back region var() bool bAllowSelectEmpty; // If true, allows selection of empty slots var() int FixedItemsPerPage; // There are a fixed number of items in the list var() bool bWrapItems; // If itemcount < ItemsPerPage, should items be wrapped? function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); // Sanity if (bFillBounds) bCenterInBounds=false; if (!bAllowSelectEmpty && ItemCount == 0) Index = -1; } function float CalculateOffset(float MouseX) { local float x,x1,x2,Width,xMod; local int i; x1 = ClientBounds[0]; x2 = ClientBounds[2]; if ( (MouseXx2) ) return -1.0; width = x2-x1; if ( (bCenterInBounds) && (ItemsPerPage*ItemWidth=x1) && (MouseX<=x2) ) return (MouseX-x1) / ItemWidth; else return -1; } if ( (bFillBounds) && (ItemsPerPage*ItemWidth=x) && (MouseX<=x+ItemWidth) ) return i; i++; x+= ItemWidth+xmod; } return -1; } return (MouseX-x1)/ItemWidth; } event int CalculateIndex( optional bool bRequireValidIndex ) { local int i, NewIndex; i = (Top + CalculateOffset(Controller.MouseX)) % ItemCount; if ( bRequireValidIndex && !IsValidIndex(i) ) i = -1; NewIndex = Min( i, ItemCount - 1 ); return NewIndex; } function bool InternalOnClick(GUIComponent Sender) { local int NewIndex; if ( ( !IsInClientBounds() ) || (ItemsPerPage==0) ) return false; // Get the Col NewIndex = CalculateIndex(True); // Keep selected index in range if (NewIndex < 0 && bIgnoreBackClick) return false; // check if allowed to go out of range if ( !bAllowSelectEmpty && !IsValidIndex(NewIndex) ) return false; SetIndex(NewIndex); return true; } function WheelUp() { MoveLeft(); } function WheelDown() { MoveRight(); } function bool MoveLeft() { local int last; if (ItemCount<2) return true; Last = Index; if (Index==0) Index=ItemCount-1; else Index--; if (Last==Top) Top=Index; OnChange(self); return true; } function bool MoveRight() { local int last; if (ItemCount<2) return true; Last = Index; Index++; if (Index==ItemCOunt) Index = 0; if (Last==(Top+ItemsPerPage-1)%ItemCount) { Top++; if (Top==ItemCount) Top=0; } OnChange(self); return true; } function Home() { if (ItemCount<2) return; SetIndex(0); Top = 0; OnChange(self); } function End() { if (ItemCount<2) return; Top = ItemCount - ItemsPerPage; if (Top<0) Top = 0; SetIndex(ItemCount-1); } function PgUp() { local int moveCount, Last; if (ItemCount<2) return; for(moveCount=0; moveCount 0) { NewIndex = CalculateIndex( True ); if (NewIndex == -1 && bIgnoreBackClick) return; LastPressX = Controller.MouseX; LastPressY = Controller.MouseY; if (NewIndex >= ItemCount) NewIndex = ItemCount - 1; // If we had an Item selected, go ahead and add it to the drag-n-drop list if ( Controller.CtrlPressed && bMultiSelect && SelectedItems.Length == 0 && NewIndex != Index ) SelectedItems[SelectedItems.Length] = Index; // If shift is pressed, do shift selection if ( Controller.ShiftPressed && IsMultiSelect() ) { if ( LastSelected == -1 ) LastSelected = 0; // If not pressing Ctrl, clear out the SelectedItems array if ( !Controller.CtrlPressed ) for ( j = SelectedItems.Length - 1; j >= 0; j-- ) if ( SelectedItems[j] != Index ) SelectedItems.Remove(j,1); for ( j = Min(LastSelected, NewIndex); j <= Max(LastSelected, NewIndex); j++ ) { for ( k = 0; k < SelectedItems.Length; k++ ) if ( SelectedItems[k] == j ) break; if ( k == SelectedItems.Length ) SelectedItems[k] = j; } return; } else { LastSelected = NewIndex; if ( IsMultiSelect() ) Index = NewIndex; } // Find out if the this index is already in our selected list for (i = 0; i < SelectedItems.Length; i++) if (SelectedItems[i] == NewIndex) break; // If it was found, remove it (allows toggling an Item's selectedness) // don't remove it immediately, but set MightRemove. This way, if the user drags // the selected Item, instead of releasing the mouse, we won't deselect it. if (i < SelectedItems.Length) MightRemove = i; else if (Controller.CtrlPressed && bMultiSelect) SelectedItems[i] = NewIndex; else if (SelectedItems.Length > 0 && MightRemove == -1) SelectedItems.Remove(0, SelectedItems.Length); } } // Find out if we were clicking on any Item - if so, add it to SelectedItems function CheckDragSelect() { local int i; i = CalculateIndex(True); if (i < 0 && bIgnoreBackClick) return; if (i >= ItemCount) i = ItemCount - 1; SetIndex(i); SelectedItems[SelectedItems.Length] = i; } // Called on whatever component the data is being dragged over function InternalOnDragOver(GUIComponent Sender) { local int NewIndex; if (Controller.DropTarget == Self) { NewIndex = CalculateIndex(True); // Keep selected index in range if (NewIndex == -1 && bIgnoreBackClick) return; if (NewIndex >= ItemCount) { DropIndex = -1; return; } if (Controller.DropSource != Self && SelectedItems.Length > 0) SelectedItems.Remove(0, SelectedItems.Length); DropIndex = NewIndex; } } F_TF_F_kF// ==================================================================== // Class: XInterface.GUIScrollBarBase // Parent: XInterface.GUIMultiComponent // // Base class for scroll bar assemblies // ==================================================================== class GUIScrollBarBase extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() EOrientation Orientation; var() int Step; // How many elements to consider a single line var float GripPos; // Where in the ScrollZone is the grip - Set Natively var float GripSize; // How big is the grip - Set Natively var float GrabOffset; // distance from top of button that the user started their drag. Set natively. var() int MinGripPixels; // Minimum size (in pixels) to draw the grip. var GUIListBase MyList; // The list this Scrollbar is attached to // only to be used when MyList == none var() int BigStep; // big step, by default one page var() int ItemCount; // total number of items var() int ItemsPerPage; // number of visible items per page var int CurPos; // current possition var Automated GUIScrollZoneBase MyScrollZone; var Automated GUIScrollButtonBase MyIncreaseButton; var Automated GUIScrollButtonBase MyDecreaseButton; var Automated GUIGripButtonBase MyGripButton; delegate PositionChanged(int NewPos); function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if (MyList != none) { ReFocus(MyList); BigStep = MyList.ItemsPerPage * Step; ItemCount = MyList.ItemCount; CurPos = MyList.Top; } MyScrollZone.bNeverScale = True; MyIncreaseButton.bNeverScale = True; MyDecreaseButton.bNeverScale = True; MyGripButton.bNeverScale = True; } function SetList( GUIListBase List ) { MyList = List; Refocus(List); if ( List != None ) { BigStep = List.ItemsPerPage; ItemCount = List.ItemCount; CurPos = MyList.Top; } else { BigStep = 0; ItemCount = 0; CurPos = 0; } } function UpdateGripPosition(float NewPos) { if (MyList != none) { MyList.MakeVisible(NewPos); ItemCount = MyList.ItemCount; } GripPos = NewPos; CurPos = (ItemCount-ItemsPerPage)*GripPos; PositionChanged(CurPos); } delegate MoveGripBy(int items) { local int NewItem; if (MyList != none) { NewItem = MyList.Top + items; ItemCount = MyList.ItemCount; if (MyList.ItemCount > 0) { MyList.SetTopItem(NewItem); AlignThumb(); } } CurPos += items; if (CurPos < 0) CurPos = 0; if (CurPos > ItemCount-ItemsPerPage) CurPos = ItemCount-ItemsPerPage; if (MyList == none) if (ItemCount > 0) AlignThumb(); PositionChanged(CurPos); } function bool DecreaseClick(GUIComponent Sender) { WheelUp(); return true; } function bool IncreaseClick(GUIComponent Sender) { WheelDown(); return true; } function WheelUp() { if (!Controller.CtrlPressed) MoveGripBy(-Step); else MoveGripBy(-BigStep); } function WheelDown() { if (!Controller.CtrlPressed) MoveGripBy(Step); else MoveGripBy(BigStep); } delegate AlignThumb() { local float NewPos; if (MyList != none) { BigStep = MyList.ItemsPerPage * Step; if (MyList.ItemCount==0) NewPos = 0; else NewPos = float(MyList.Top) / float(MyList.ItemCount-MyList.ItemsPerPage); } else { if (ItemCount==0) NewPos = 0; else NewPos = CurPos / float(ItemCount-ItemsPerPage); } GripPos = FClamp(NewPos, 0.0, 1.0); } function Refocus(GUIComponent Who) { local int i; if (Who != None && Controls.Length > 0) for (i=0;i StringElements; native final function string GetWordUnderCursor(); delegate OnEndOfLine(); function Dump() { local int i; for (i = 0; i < StringElements.Length; i++) log(Name@"ScrollText Elements["$i$"]:"$StringElements[i]); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if(bNoTeletype) EndScrolling(); } function SetContent(string NewContent, optional string sep) { if (sep == "") Separator = default.Separator; else Separator = sep; Content = NewContent; bNewContent = true; if(bNoTeletype) EndScrolling(); else Restart(); } function Stop() { bStopped = true; ScrollState = STS_None; TimerInterval = 0; } function Restart() { VisibleLines = 0; VisibleChars = 0; if (InitialDelay <= 0.0) { ScrollState = STS_None; SetTimer(0.001, true); } else { ScrollState = STS_Initial; SetTimer(InitialDelay, true); } bStopped = false; } function bool SkipChar() { if (ItemCount > 0 && !bStopped && VisibleLines >= 0 && VisibleLines < ItemCount) { if (VisibleChars == Len(StringElements[VisibleLines])) { if (VisibleLines+1 < ItemCount) { VisibleLines++; VisibleChars = 0; TimerInterval = EOLDelay; ScrollState = STS_EOL; OnEndOfLine(); return true; } } else { VisibleChars++; TimerInterval = CharDelay; ScrollState = STS_Char; return true; } } return false; } event Timer() { if (ItemCount == 0) { if (!bNewContent) TimerInterval=0; return; } if (ScrollState == STS_Repeat) { Restart(); } else if (ScrollState == STS_EOL) { if (!SkipChar()) { if (bRepeat) { if (RepeatDelay > 0) { TimerInterval = RepeatDelay; ScrollState = STS_Repeat; } else Restart(); } else { bStopped = true; ScrollState = STS_None; TimerInterval = 0; } } } else if (ScrollState == STS_None) { ScrollState = STS_Initial; SetTimer(CharDelay, true); } else { if (!SkipChar()) { ScrollState=STS_EOL; TimerInterval=EOLDelay; OnEndOfLine(); } } } function bool InternalOnClick(GUIComponent Sender) { local bool retval; if(bClickText) { ClickedString = GetWordUnderCursor(); return true; } retval = Super.InternalOnClick(Sender); if (retval) EndScrolling(); return retval; } function bool InternalOnKeyType(out byte Key, optional string Unicode) { //local bool retval; // retval = Super.InternalOnKeyType(Key, Unicode); // if (retval) EndScrolling(); // return retval; return false; } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { local bool retval; retval = Super.InternalOnKeyEvent(Key, State, delta); if (retval) EndScrolling(); return retval; } function EndScrolling() { bStopped = true; if(MyScrollBar != None) MyScrollBar.AlignThumb(); KillTimer(); } function bool IsValid() { return true; } F_F_F_\T//==================================================================== // Parent: GUIListBoxBase // Class: UT2K4UI.GUIScrollTextBox // Date: 05-01-2003 // // ListBox container for a scrolling text list // // Updated by Ron Prestenback // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIScrollTextBox extends GUIListBoxBase native; var GUIScrollText MyScrollText; var(GUIScrollText) bool bRepeat; // Should the sequence be repeated ? var(GUIScrollText) bool bNoTeletype; // Dont do the teletyping effect at all var(GUIScrollText) bool bStripColors; // Strip out IRC-style colour characters (^C) var(GUIScrollText) float InitialDelay; // Initial delay after new content was set var(GUIScrollText) float CharDelay; // This is the delay between each char var(GUIScrollText) float EOLDelay; // This is the delay to use when reaching end of line var(GUIScrollText) float RepeatDelay; // This is used after all the text has been displayed and bRepeat is true var(GUIScrollText) eTextAlign TextAlign; // How is text Aligned in the control var(GUIScrollText) string Separator; // Propagate to GUIScrollText var() string ESC, COMMA; // fake const's event Created() { ESC = Chr(3); COMMA = Chr(44); } function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender) { if (GUIScrollText(NewComp) != None && Sender == Self) GUIScrollText(NewComp).bNoTeleType = bNoTeleType; Super.InternalOnCreateComponent(NewComp, Sender); } function InitBaseList(GUIListBase LocalList) { if ((MyScrollText == None || MyScrollText != LocalList) && GUIScrollText(LocalList) != None) MyScrollText = GUIScrollText(LocalList); Super.InitBaseList(LocalList); MyScrollText.Separator = Separator; MyScrollText.InitialDelay = InitialDelay; MyScrollText.CharDelay = CharDelay; MyScrollText.EOLDelay = EOLDelay; MyScrollText.RepeatDelay = RepeatDelay; MyScrollText.TextAlign = TextAlign; MyScrollText.bRepeat = bRepeat; MyScrollText.bNoTeletype = bNoTeletype; MyScrollText.OnAdjustTop = InternalOnAdjustTop; } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if (DefaultListClass != "") { MyScrollText = GUIScrollText(AddComponent(DefaultListClass)); if (MyScrollText == None) { log(Class$".InitComponent - Could not create default list ["$DefaultListClass$"]"); return; } } if (MyScrollText == None) { Warn("Could not initialize list!"); return; } InitBaseList(MyScrollText); } function SetContent(string NewContent, optional string sep) { MyScrollText.SetContent(NewContent, sep); } function Restart() { MyScrollText.Restart(); } function Stop() { MyScrollText.Stop(); } function InternalOnAdjustTop(GUIComponent Sender) { MyScrollText.EndScrolling(); } function bool IsNumber(string Num) { if ( Num > Chr(47) && Num < Chr(58) ) return true; return false; } function string StripColors(string MyString) { local int EscapePos, RemCount, LenFromEscape; EscapePos = InStr(MyString, ESC); // Chr(3) == ^C while(EscapePos != -1) { LenFromEscape = Len(MyString) - (EscapePos + 1); // how far after the escape character the string goes on for // Now we have to work out how many characters follow the ^C and should be removed. This is rather unpleasant..! for (RemCount = 0; RemCount < LenFromEscape && RemCount < 7; RemCount++) { if ( Mid(MyString, EscapePos+RemCount, 1) == ESC || IsNumber(Mid(MyString, EscapePos + RemCount, 1)) || Mid(MyString, EscapePos + RemCount, 1) == COMMA ) RemCount++; else break; } /* RemCount = 1; // strip the ctrl-C regardless if( LenFromEscape >= 1 && IsNumber(Mid(MyString, EscapePos+1, 1)) ) // If a digit follows the ctrl-C, strip that { RemCount = 2; // # if( LenFromEscape >= 3 && Mid(MyString, EscapePos+2, 1) == Chr(44) && IsNumber(Mid(MyString, EscapePos+3, 1)) ) // If we have a comma and another digit, strip those { RemCount = 4; // #,# if( LenFromEscape >= 4 && IsNumber(Mid(MyString, EscapePos+4, 1)) ) // if there is another digit after that, strip it RemCount = 5; // #,## } else if( LenFromEscape >= 2 && IsNumber(Mid(MyString, EscapePos+2, 1)) )// if there is a second digit, strip that { RemCount = 3; // ## if( LenFromEscape >= 4 && Mid(MyString, EscapePos+3, 1) == Chr(44) && IsNumber(Mid(MyString, EscapePos+4, 1)) ) // If we have a comma and another digit, strip those { RemCount = 5; // ##,# if( LenFromEscape >= 5 && IsNumber(Mid(MyString, EscapePos+5, 1)) ) // if there is another digit after that, strip it RemCount = 6; // ##,## } } } */ MyString = Left(MyString, EscapePos)$Mid(MyString, EscapePos+RemCount); EscapePos = InStr(MyString, Chr(3)); } return MyString; } function AddText(string NewText) { local string StrippedText; if(NewText == "") return; if(bStripColors) StrippedText = StripColors(NewText); else StrippedText = NewText; if ( MyScrollText.NewText != "" ) MyScrollText.NewText $= MyScrollText.Separator; MyScrollText.NewText $= StrippedText; } F_4Md&!M4d&c&_. &\ P $$$9=, GF_F_F_|6F_F_{6J HZY{_pJ  i_pLJ J aWa&o J (_;R_c4|o 9?7Rw_A*o 9?&_AS,_AS_ro 9?&9?J ro %mc59?,<9?J V9?J c59?,_VV9?,W%W7mWmVV9?,(o WE|DF_( GF_C7}6Y .YiF%'|ji(iR GF_a&F_F_F_F_A7F_F_H7B7X "Y|F%'ij|(|R GF_rF_F_@F_F_~6\&`4|w_*_;\&.-IrSs9=9:b,s9=9:b, s9=9:b&s9=9:b,@s9=9:b,s9=9:b,p&s9=9:b,s9=9:b,KW& GF_D7F_F_L7G7aOri *r%'|71iI iYi |r&|_i_' GF_pF_F_F7}s` R9:}%*w$J9>9:w9:}|w9=9:w&|7TGUIQuestionPage.AddButton() button mask was larger than button name array!*Y .cEXInterface.GUIButtonrY **Y g9:}Y sn7nmY J|TEY )D`7mmY Y  GF_I7F_F_P7K7}p| *p%'q]|I-{qX %-X i#|]i xX q|A1i xX  i D X i |X &-X ai71|I |Y| |p&|_i_' GF_J7N7K3 a?9?7m&ka(?lak9?,c %c 7mc mGlc mckc mr2/=c mV?la9>c mg9:N7c mu*c I GF_c F_F_b @F_F_Q7R&]mb %gb 7H]|6b HR&6 b Hb  GF_V7XX TrX|] |YCx|IrXi] iYCxiI] {] @ ^] zC,-(,-' GF_F_F_M7L&`Q Y.L&g\ P\ PCE L9=YCKuS9=YQM9>Y,,@' GF_R7F_F_YF_F_Y7T7V :zC'pLaunch: C KC' GF_S7v n%Q {V &%V p%V <{V &%aBV %v V G& GF_F_F_\7I&T KaI&' GF_F_F_@F_F_]7F&R }F&' GF_`7C&O P %P 7H~|6P HC&|k6P H}* P  GF_i@F_F_4}%! *4}%{%E,)DJ GF_h7vS yzvl~v,@l%ivvpivlvv}vl&i GF_H @F_F__7c7J) Kxinterface.joetestB' GF_d7F_F_F_F_b7f7^' GF_g7F_F_F_F_k7z%x mH %gH 7H]|6H Hz%6 H HH  GF_4\w%! R4w%u%\.,%uJppThis is a simple test of multiline splitting that should be happening very easily but i will debug to be sure that whatever the length is set at it wont bug., , JppJBut more importantly i must also handle having more than just 1 line of text and see how this is dealt with., JpppJI wonder how this would be dealt with if i wasnt taking care of it and if Joe wasnt going to do it., , JpJBah, We'll see later since no one seems to reply to my messages.\ ^J -h#( GF_G @F_F_p7v%K u mG %gG 7H]|6G Hv%6G HG  GF_A@F_F_i7n7G U' GF_o7F_F_F_F_r7l7lY& p%piFqK i xp{q{{AAppA,qAqp{AdAAp?Mutator=AdbA GF_tR// ==================================================================== // Class: UT2K4UI.GUISlider // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // Sliders will not be drawn if both MinValue & MaxValue are both 0 // ==================================================================== class GUISlider extends GUIComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() float MinValue, MaxValue; var() float Value; var() float MarkerWidth; var() bool bIntSlider; var() bool bShowMarker; var() bool bShowCaption; var() bool bDrawPercentSign; var() bool bReadOnly; var() bool bShowValueTooltip; // Show the current value as a tooltip while dragging var() material FillImage; var() string CaptionStyleName, BarStyleName; var GUIStyles CaptionStyle; var GUIStyles BarStyle; // Return true to prevent caption from being drawn delegate bool OnPreDrawCaption( out float X, out float Y, out float XL, out float YL, out ETextAlign Justification ); delegate string OnDrawCaption() { if (bIntSlider) return "("$int(Value)$ Eval(bDrawPercentSign, " %", "") $ ")"; return "("$Value$Eval(bDrawPercentSign, " %", "") $ ")"; } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); CaptionStyle = Controller.GetStyle(CaptionStyleName,FontScale); BarStyle = Controller.GetStyle(BarStyleName,FontScale); } function bool InternalCapturedMouseMove(float deltaX, float deltaY) { local float Perc; if ( bReadOnly ) return true; if ( (Controller.MouseX >= Bounds[0]) && (Controller.MouseX<=Bounds[2]) ) { Perc = FClamp( ((Controller.MouseX - (ActualLeft() + (MarkerWidth/2))) / (ActualWidth()-MarkerWidth)), 0.0, 1.0 ); Value = ((MaxValue - MinValue) * Perc) + MinValue; if (bIntSlider) Value = round(Value); } else if (Controller.MouseX < Bounds[0]) Value = MinValue; else if (Controller.MouseX > Bounds[2]) Value = MaxValue; Value = FClamp(Value,MinValue,MaxValue); if ( bShowValueTooltip ) ToolTip.SetTip( GetValueString() ); return true; } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if ( bReadOnly ) return false; if ( (Key==0x25) && (State==1) ) // Left { if (bIntSlider) Adjust(-1); else Adjust(-0.01); return true; } if ( (Key==0x27) && (State==1) ) // Right { if (bIntSlider) Adjust(1); else Adjust(0.01); return true; } return false; } function float SetValue(float NewValue) { Value = FClamp(NewValue, MinValue, MaxValue); if (bIntSlider) Value = Round(Value); return Value; } function Adjust(float amount) { local float Perc; Perc = (Value-MinValue) / (MaxValue-MinValue); Perc += amount; Perc = FClamp(Perc,0.0,1.0); Value = FClamp( ((MaxValue - MinValue) * Perc) + MinValue, MinValue, MaxValue ); OnChange(self); } function bool InternalOnClick(GUIComponent Sender) { if ( bShowValueToolTip ) RevertTooltipToNormal(); OnChange(self); return true; } function InternalOnMousePressed(GUIComponent Sender,bool RepeatClick) { if ( bShowValueTooltip ) ModifyTooltipForDragging(); InternalCapturedMouseMove(0,0); } function InternalOnMouseRelease(GUIComponent Sender) { InternalCapturedMouseMove(0,0); } function SetReadOnly(bool b) { bReadOnly = b; } event float GetMarkerPosition() { local float Perc; Perc = (Value - MinValue) / (MaxValue - MinValue); return ActualLeft() + ((ActualWidth() - MarkerWidth) * Perc); } function CenterMouse() { if ( PlayerOwner() != None ) PlayerOwner().ConsoleCommand( "SETMOUSE" @ GetMarkerPosition() @ (ActualTop() + ActualHeight() / 2) ); } function string GetValueString() { local string ValueStr; if ( bIntSlider ) ValueStr = string( int(Value) ); else ValueStr = string(Value); if ( bDrawPercentSign ) ValueStr @= "%"; return ValueStr; } function ModifyTooltipForDragging() { ToolTip.bTrackMouse = True; ToolTip.bTrackInput = False; ToolTip.bMultiLine = False; ToolTip.HideToolTip = HideToolTip; ToolTip.LeaveArea = ToolTipLeaveArea; SetTooltipText( GetValueString() ); ShowToolTip(); } function RevertTooltipToNormal() { ToolTip.bTrackMouse = ToolTip.default.bTrackMouse; ToolTip.bTrackInput = ToolTip.default.bTrackInput; ToolTip.bMultiLine = ToolTip.default.bMultiLine; ToolTip.HideToolTip = None; ToolTip.LeaveArea = None; ToolTip.LeaveArea(); SetTooltipText( Hint ); } function ShowToolTip() { Controller.MouseOver = ToolTip.InternalEnterArea(); ToolTip.SetVisibility(True); } function HideToolTip() { if ( MenuState != MSAT_Pressed ) { log("HideToolTip MenuState:"$GetEnum(enum'EMenuState', MenuState)); ToolTip.SetVisibility(False); } } function bool ToolTipLeaveArea() { return False; } F_0dk%!N0k%l%|.&E|tDR i.,EitDT @ .,,Hc,a Hwmc,u%mu7HU|6uHxgame.mutzoominstagib3|6uHunrealgame.mutlowgravujAHu&u%u7H|916uH 6 uHutM|%@ ^|YCx|Ii%@ ^iYCxiI@ ^NonezC,-(,-'hduShK{uO uuSh  GF_a // ==================================================================== // Class: UT2K4UI.UT2SpinnerButton // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUISpinnerButton extends GUIButton Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) delegate bool OnPlusClick(GUIComponent Sender) { return false; } delegate bool OnMinusClick(GUIComponent Sender) { return false; } function bool InternalOnClick(GUIComponent Sender) { local float x,y; x = Controller.MouseX - ActualLeft(); y = Controller.MouseY - ActualTop(); if (y <= (ActualHeight()/2) ) return OnPlusClick(Sender); else return OnMinusClick(Sender); } F_W// ==================================================================== // Class: UT2K4UI.GUISplitter // // GUISplitters allow the user to size two other controls (usually Panels) // // Written by Jack Porter // Updated by Ron Prestenback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUISplitter extends GUIPanel native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) enum EGUISplitterType { SPLIT_Vertical, SPLIT_Horizontal, }; var() EGUISplitterType SplitOrientation; var() float SplitPosition; // 0.0 - 1.0 var() bool bFixedSplitter; // Can splitter be moved? var() bool bDrawSplitter; // Draw the actual splitter bar var() float SplitAreaSize; // size of splitter thing var() string DefaultPanels[2]; // Names of the default panels var() GUIComponent Panels[2]; // Quick Reference var() float MaxPercentage; // How big can any 1 panel get delegate OnReleaseSplitter(GUIComponent Sender, float NewPosition); // Notification that finished resizing splitter function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); if (DefaultPanels[0]!="") { Panels[0] = AddComponent(DefaultPanels[0], DefaultPanels[1] != ""); if (DefaultPanels[1]!="") Panels[1] = Addcomponent(DefaultPanels[1]); } } event GUIComponent AppendComponent(GUIComponent NewComp, optional bool SkipRemap) { OnCreateComponent(NewComp, Self); Controls[Controls.Length] = NewComp; NewComp.InitComponent(Controller, Self); NewComp.bBoundToParent = true; NewComp.bScaleToParent = true; if (!SkipRemap) RemapComponents(); return NewComp; } native function SplitterUpdatePositions(); F_A4// ==================================================================== // Class: UT2K4UI.GUIStyles // // The GUIStyle is an object that is used to describe common visible // components of the interface. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIStyles extends GUI Abstract Native noteditinlinenew; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var(Style) const string KeyName; // This is the name of the style used for lookup // If the desired keyname is one of these, FontScale will be adjusted // For backwards compatibility - 0 - Smaller 1 - Larger var(Style) const string AlternateKeyName[2]; /* Each style contains 5 values for each font, per size Small 0 - 4 Medium 5 - 9 Large 10 - 14 */ var(Style) noexport string FontNames[15]; // Holds the names of the 5 fonts to use var(Style) noexport GUIFont Fonts[15]; // Holds the fonts for each state var(Style) noexport color FontColors[5]; // This array holds 1 font color for each state var(Style) noexport color FontBKColors[5]; // This holds the Background Colors for each state var(Style) noexport color ImgColors[5]; // This array holds 1 image color for each state var(Style) noexport EMenuRenderStyle RStyles[5]; // The render styles for each state var(Style) noexport Material Images[5]; // This array holds 1 material for each state (Blurry, Watched, Focused, Pressed, Disabled) var(Style) noexport eImgStyle ImgStyle[5]; // How should each image for each state be drawed var(Style) noexport float ImgWidths[5]; // -1 if full image var(Style) noexport float ImgHeights[5]; // -1 if full image var(Style) noexport int BorderOffsets[4]; // How thick is the border var(style) noexport bool bTemporary; // This style should be cleaned up // the OnDraw delegate Can be used to draw. Return true to skip the default draw method delegate bool OnDraw(Canvas Canvas, eMenuState MenuState, float left, float top, float width, float height); delegate bool OnDrawText(Canvas Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text, eFontScale FontScale); native static final function Draw(Canvas Canvas, eMenuState MenuState, float left, float top, float width, float height); native static final function DrawText(Canvas Canvas, eMenuState MenuState, float left, float top, float width, float height, eTextAlign Align, string Text, eFontScale FontScale); native static final function TextSize(Canvas Canvas, eMenuState MenuState, string Text, out float XL, out float YL, eFontScale FontScale); event Initialize() { local int i; // Preset all the data if needed for ( i = 0; i < ArrayCount(FontNames) && i < ArrayCount(Fonts); i++) { if (FontNames[i] != "") Fonts[i] = Controller.GetMenuFont(FontNames[i]); } } F_y F_F_v7F_F_{7w7m' 6fF%f %'y f y fF&fJy y &f y &' GF_x F_F_y7F_F_~7z7n 6fF%f %'x f x %fJx x &f x &' GF_F_F_|7F_F_A8}7o} [fF%'jjf(fR' GF_F_F_7F_F_E8@8pr; [jF%'fjj(jR' GF_F_F_B8F_F_4LdS%!Je4S%R%.%T.&ESDD-fRp%R`%R\Ra%Rb%-f' GF_J8C8ug5 6fF%f %'j1fIf|f &' GF_F_F_JjHH V -d -d'R^%Rm%Rj%Zc,Re%Rh%Rf%?gBFc* cFc]&iiFcV)diRFcFc* cFc]&jiFcV)giRFcFc* cFc]&hiFcV)ciRFcSkBRei GF_G8^R I^Dq.&qU^V)^ GF_F8F_F_K8I8t\(6jF%j %'f1jIj|j &' GF_O8J%vX GF_@F_F_@F_F_I%C%D8wQ.&X%hX7QH.JXQH}WXs -C% GF_P8M8l1 GF_0jA%!70A%B%j.%f.& GF_P// ==================================================================== // GUITabButton - A Tab Button has an associated Tab Control, and // TabPanel. // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUITabButton extends GUIButton Native; var bool bForceFlash; // Lets you get a tab to flash even if its not focused var bool bActive; // Is this the active tab var GUITabPanel MyPanel; // This is the panel I control // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) event SetFocus(GUIComponent Who) { } function bool ChangeActiveState(bool IsActive, bool bFocusPanel) { if ( MyPanel == None) return false; if ( IsActive ) { if ( !CanShowPanel() ) return false; MyPanel.ShowPanel(true); if ( bFocusPanel ) { if ( !MyPanel.FocusFirst(None) ) { MyPanel.ShowPanel(bActive); return false; } bActive = true; return true; } bActive = true; return true; } MyPanel.ShowPanel(false); bActive = false; return true; } function bool CanShowPanel() { // Only return false if tabbutton is disabled, but allow it if only !bVisible if ( MenuState == MSAT_Disabled || MyPanel == None ) return false; return MyPanel.CanShowPanel(); } F_p9// ==================================================================== // Class: UT2K4UI.GUICharacterListTeam // Parent: UT2K4UI.GUICharacterList // // Specialized version of charlist that allows manual addition/ // removal of players. // author: capps 8/25/02 // ==================================================================== class GUICharacterListTeam extends GUICharacterList; function InitList() { ItemCount = 0; } /** Include only those players described with Menu=s */ function InitListInclusive(string s) { local int i,j; local array AllPlayerList; class'xUtil'.static.GetPlayerList(AllPlayerList); // Filter out to only characters with the 's' menu setting j=0; for(i=0; i menus, optional string Race) { local int i,j; local array AllPlayerList; local string menulist; menulist = ";"$JoinArray(menus, ";")$";"; class'xUtil'.static.GetPlayerList(AllPlayerList); // Filter out to only characters without the 's' menu setting j=0; for(i=0; i AllPlayerList; class'xUtil'.static.GetPlayerList(AllPlayerList); // Filter out to only characters without the 's' menu setting j=0; for(i=0; i menus, optional string Race) { local int i,j; local array AllPlayerList; local string menulist; menulist = ";"$JoinArray(menus, ";")$";"; class'xUtil'.static.GetPlayerList(AllPlayerList); // Filter out to only characters without the 's' menu setting j=0; for(i=0; i PlayerTeam, int numchars) { local int i; if ( PlayerTeam.Length < numchars ) { Log("GUICharacterListTeam::ResetList() could not reset list; invalid team."); return; } for ( i=0; i < numchars; i++ ) { PlayerList[i] = PlayerTeam[i]; } ItemCount = numchars; } /** populate the player list based on default player names */ function PopulateList(array PlayerNames) { local int i, j; local array PRlist; PlayerList.length = PlayerNames.length; class'xUtil'.static.GetPlayerList(PRlist); for (i = 0; i < PlayerNames.length; i++) { for (j = 0; j < PRlist.length; j++) { if (PlayerNames[i] ~= PRlist[j].DefaultName) { PlayerList[i] = PRlist[j]; break; } } } ItemCount = PlayerNames.length; } F_]// ==================================================================== // GUITabControl - This control has a number of tabs // // Written by Joe Wilcox // (c) 2003, Epic Games, Inc. All Rights Reserved // // Updated by Ron Prestenback // ==================================================================== class GUITabControl extends GUIMultiComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() bool bFillSpace; // Tab buttons should be resized if cumulative width is smaller than WinWidth var() bool bDockPanels; // If true, associated panels will dock vertically with this control var() bool bDrawTabAbove; // If true, tabs are drawn above the tab panels var() bool bFillBackground; var() color FillColor; var() float FadeInTime; var() float TabHeight; var() string BackgroundStyleName; var() Material BackgroundImage; var() editconst noexport array TabStack; var() editconst noexport GUITabButton ActiveTab, PendingTab; var() editconst noexport GUIStyles BackgroundStyle; var() editconst noexport GUIBorder MyFooter; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if (BackgroundStyleName != "") BackgroundStyle = Controller.GetStyle(BackgroundStyleName,FontScale); OnKeyEvent = InternalOnKeyEvent; } event Opened( GUIComponent Sender ) { local int i; Super.Opened(Sender); for ( i = 0; i < TabStack.Length; i++ ) { if ( TabStack[i] != None ) TabStack[i].Opened(Self); } if ( !bInit && bVisible && ActiveTab != None && ActiveTab.MyPanel != None ) ActivateTab(ActiveTab, True); bInit = false; } event Closed( GUIComponent Sender, bool bCancelled ) { local int i; Super.Closed(Sender,bCancelled); for ( i = 0; i < TabStack.Length; i++ ) if ( TabStack[i] != None ) TabStack[i].Closed(Sender,bCancelled); } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { local int i,aTabIndex, StartIndex; if ( (FocusedControl!=None) || (TabStack.Length<=0) ) return false; if (ActiveTab == None) return false; for(i=0;i NewPanelClass; local GUITabButton NewTabButton; local GUITabPanel NewTabPanel; local int i; // Make sure this doesn't exist first for (i=0;i(Controller.AddComponentClass(PanelClass)); if ( (ExistingPanel!=None) || (NewPanelClass != None) ) { if (ExistingPanel != None) NewTabPanel = GUITabPanel(AppendComponent(ExistingPanel,True)); else if (NewPanelClass != None) NewTabPanel = GUITabPanel(AddComponent(PanelClass,True)); if (NewTabPanel == None) { log("Could not create panel for"@NewPanelClass); return None; } if (NewTabPanel.MyButton != None) NewTabButton = NewTabPanel.MyButton; else { NewTabButton = new class'GUITabButton'; if (NewTabButton==None) { log("Could not create tab for"@NewPanelClass); return None; } NewTabButton.InitComponent(Controller, Self); NewTabButton.Opened(Self); NewTabPanel.MyButton = NewTabButton; if (!bDrawTabAbove) { NewTabPanel.MyButton.bBoundToParent = False; NewTabPanel.MyButton.Style = Controller.GetStyle("FlippedTabButton",NewTabPanel.FontScale); } } NewTabPanel.MyButton.Hint = Eval(InHint != "", InHint, NewTabPanel.Hint); NewTabPanel.MyButton.Caption = Eval(InCaption != "", InCaption, NewTabPanel.PanelCaption); NewTabPanel.MyButton.OnClick = InternalTabClick; NewTabPanel.MyButton.MyPanel = NewTabPanel; NewTabPanel.MyButton.FocusInstead = self; NewTabPanel.MyButton.bNeverFocus = true; NewTabPanel.InitPanel(); // Add the tab to controls TabStack[TabStack.Length] = NewTabPanel.MyButton; if ( (TabStack.Length==1 && bVisible) || (bForceActive) ) ActivateTab(NewTabPanel.MyButton,true); else NewTabPanel.Hide(); return NewTabPanel; } return none; } function GUITabPanel InsertTab(int Pos, string Caption, string PanelClass, optional GUITabPanel ExistingPanel, optional string InHint, optional bool bForceActive) { local class NewPanelClass; local GUITabPanel NewTabPanel; local GUITabButton NewTabButton; if (ExistingPanel == None) NewPanelClass = class(Controller.AddComponentClass(PanelClass)); if ( ExistingPanel != None || NewPanelClass != None) { if (ExistingPanel != None) NewTabPanel = GUITabPanel(AppendComponent(ExistingPanel,True)); else if (NewPanelClass != None) NewTabPanel = GUITabPanel(AddComponent(PanelClass,True)); if (NewTabPanel == None) { log("Could not create panel for"@NewPanelClass); return None; } if (NewTabPanel.MyButton != None) NewTabButton = NewTabPanel.MyButton; else { NewTabButton = new class'GUITabButton'; if (NewTabButton==None) { log("Could not create tab for"@NewPanelClass); return None; } NewTabButton.InitComponent(Controller, Self); NewTabButton.Opened(Self); NewTabPanel.MyButton = NewTabButton; } NewTabPanel.MyButton.Caption = Caption; NewTabPanel.MyButton.Hint = InHint; NewTabPanel.MyButton.OnClick = InternalTabClick; NewTabPanel.MyButton.MyPanel = NewTabPanel; NewTabPanel.MyButton.FocusInstead = self; NewTabPanel.MyButton.bNeverFocus = true; NewTabPanel.InitPanel(); TabStack.Insert(Pos, 1); TabStack[Pos] = NewTabPanel.MyButton; if (TabStack.Length==1 || bForceActive) ActivateTab(NewTabPanel.MyButton,true); else NewTabPanel.Hide(); return NewTabPanel; } return None; } function GUITabPanel ReplaceTab(GUITabButton Which, string Caption, string PanelClass, optional GUITabPanel ExistingPanel, optional string InHint, optional bool bForceActive) { local class NewPanelClass; local GUITabPanel NewTabPanel, OldTabPanel; if (ExistingPanel==None) NewPanelClass = class(Controller.AddComponentClass(PanelClass)); if ( (ExistingPanel!=None) || (NewPanelClass != None) ) { OldTabPanel = Which.MyPanel; if (ExistingPanel==None) NewTabPanel = GUITabPanel(AddComponent(PanelClass, True)); else NewTabPanel = GUITabPanel(AppendComponent(ExistingPanel, True)); if (NewTabPanel==None) { log("Could not create panel"@NewPanelClass); return none; } Which.Caption = Caption; Which.Hint = InHint; Which.MyPanel = NewTabPanel; NewTabPanel.MyButton = Which; // Init new panel NewTabPanel.InitPanel(); // Make sure to notify old tab - so use ActivateTab if ( bForceActive ) ActivateTab(NewTabPanel.MyButton, True); else NewTabPanel.Hide(); // Notify old panel RemoveComponent(OldTabPanel); OldTabPanel.Free(); return NewTabPanel; } return none; } function RemoveTab(optional string Caption, optional GUITabButton who) { local int i; local bool bActive; local GUITabPanel OldPanel; if ( (caption=="") && (Who==None) ) return; if (Who==None) i = TabIndex(Caption); else i = TabIndex(Who.Caption); if (i < 0) return; OldPanel = TabStack[i].MyPanel; bActive = TabStack[i] == ActiveTab; TabStack[i].OnClick = None; TabStack[i].Free(); TabStack.Remove(i, 1); RemoveComponent(OldPanel,True); OldPanel.Free(); if (bActive) LostActiveTab(); } function bool LostActiveTab() { local int i; if (!Controller.bCurMenuInitialized) return false; for (i = 0; i < TabStack.Length; i++) if (ActivateTab(TabStack[i],true)) return true; return false; } event MakeTabActive(GUITabButton Who) { if (ActiveTab!=None) ActiveTab.ChangeActiveState(false,false); PendingTab = None; ActiveTab = Who; OnChange(Who); } function bool ActivateTab(GUITabButton Who, bool bFocusPanel) { if (Who == none || PendingTab != None || !Who.CanShowPanel()) // null or not selectable return false; Who.bForceFlash = False; if (Who==ActiveTab) // Same Tab, just accept { if ( ActiveTab.ChangeActiveState(True, bFocusPanel) ) return true; return false; } PendingTab = Who; if ( PendingTab.ChangeActiveState(True, bFocusPanel) ) { if (PendingTab.MyPanel.FadeInTime==0.0 || TabStack.Length<2) MakeTabActive(Who); else { FadeInTime = PendingTab.MyPanel.FadeInTime; if (!Controller.bQuietMenu) PlayerOwner().PlayOwnedSound(Controller.FadeSound,SLOT_Interface,1.0); } return true; } PendingTab = None; return false; } function bool ActivateTabByName(string tabname, bool bFocusPanel) { local int i; i = TabIndex(TabName); if (i < 0 || i >= TabStack.Length) return false; return ActivateTab(TabStack[i], bFocusPanel); } function bool ActivateTabByPanel( GUITabPanel Panel, bool bFocusPanel ) { local int i; if ( Panel == None || !Panel.CanShowPanel() ) return false; for ( i = 0; i < TabStack.Length; i++ ) if ( TabStack[i] != None && TabStack[i].MyPanel == Panel ) return ActivateTab(TabStack[i], bFocusPanel); return false; } function bool InternalTabClick(GUIComponent Sender) { local GUITabButton But; But = GUITabButton(Sender); if (But==None) return false; ActivateTab(But,true); return true; } event bool NextPage() { local int i; // If 1 or no tabs in the stack, then query parents if (TabStack.Length < 2) return Super.NextPage(); if (ActiveTab == None) i = 0; else { i = TabIndex(ActiveTab.Caption) + 1; if ( i >= TabStack.Length ) i = 0; } return ActivateTab(TabStack[i], true); } event bool PrevPage() { local int i; if (TabStack.Length < 2) return Super.PrevPage(); if (ActiveTab == None) i = TabStack.Length - 1; else { i = TabIndex(ActiveTab.Caption) - 1; if ( i < 0 ) i = TabStack.Length - 1; } return ActivateTab(TabStack[i], true); } event bool NextControl(GUIComponent Sender) { if (Sender != None) { Super(GUIComponent).SetFocus(None); return true; } else { if ( Super(GUIComponent).NextControl(Self) ) return true; else FocusFirst(None); return true; } return false; } event bool PrevControl(GUIComponent Sender) { if ( Sender != None ) { Super(GUIComponent).SetFocus(None); return true; } else { if ( Super(GUIComponent).PrevControl(Self) ) return true; else FocusLast(None); } return false; } function int TabIndex(string TabName) { local int i; for (i = 0; i < TabStack.Length; i++) if (TabStack[i].Caption ~= TabName) return i; return -1; } function GUITabPanel FindPanelClass( class PanelClass ) { local int i; if ( PanelClass == None ) return None; for ( i = 0; i < TabStack.Length; i++ ) { if ( TabStack[i] != None && TabStack[i].MyPanel != None && ClassIsChildOf(TabStack[i].MyPanel.Class, PanelClass) ) return TabStack[i].MyPanel; } return None; } function GUITabPanel BorrowPanel(string Caption) { local int i; if (Caption == "") return None; i = TabIndex(Caption); if (i < 0) return None; return TabStack[i].MyPanel; } function SetVisibility(bool bIsVisible) { Super.SetVisibility(bIsVisible); if (ActiveTab != None) ActiveTab.ChangeActiveState(bIsVisible, False); } function InternalOnActivate() { if (ActiveTab == None) LostActiveTab(); } function bool FocusFirst(GUIComponent Sender) { if ( ActiveTab != None && ActiveTab.MyPanel != None && ActiveTab.MyPanel.CanAcceptFocus() && ActiveTab.MyPanel.FocusFirst(None) ) return true; else if (!Super.FocusFirst(Sender)) Super(GUIComponent).SetFocus(None); return true; } function bool FocusLast(GUIComponent Sender) { if ( ActiveTab != None && ActiveTab.MyPanel != None && ActiveTab.MyPanel.CanAcceptFocus() && ActiveTab.MyPanel.FocusLast(None) ) return true; else if ( !Super.FocusLast(Sender) ) Super(GUIComponent).SetFocus(None); return true; } function CenterMouse() { if ( ActiveTab != None ) ActiveTab.CenterMouse(); else Super.CenterMouse(); } event Free() { local int i; for ( i = 0; i < TabStack.Length; i++ ) { if ( TabStack[i] != None ) TabStack[i].Free(); } Super.Free(); } function LevelChanged() { local int i; for ( i = 0; i < TabStack.Length; i++ ) { if ( TabStack[i] != None ) TabStack[i].LevelChanged(); } Super.LevelChanged(); } F_F_F_T8F_F_lW Bl.&i .,g .,d .,i .Normali .Centeri .Stretchedi .Scaledi .Boundg .Blurryg .Watchedg .Focusedg .Pressedg .Disabledd %.PlayerPictures.cEgyptFemaleBAd ".InterfaceContent.Menu.bg07d .PlayerPictures.Galacticd &.InterfaceContent.Menu.CO_Finald ).InterfaceContent.BorderBoxF_PulseEPlayerPictures.cEgyptFemaleBA GF_V8X8G);r i I;zr Normallz $azr Centerlz $zr Stretchedlz $zr Scaledlz $zr Boundlz $ GF_r F_F_`8U8A V#.E ]g' GF_W8[8I:o g I;zo Blurryl?$bzo Watchedl?$zo Focusedl?$zo Pressedl?$zo Disabledl?$ GF_o F_F_F_F_Z8^8JIEd I GF_F_F_]8y$ON'l-r(.yy$-a GF_d8\8RFj -P -z S-bL-z ~D$]~D$CgN GF__8x$ES[leQx$ GF_F_F_a8w$QX.w$  GF_g8b8@ 1 -P -U x-bm-U SA(SD$~D$SD$~D$ GF_F_F_F_F_i8f8p (C1 -P fp Kb GF_F_F_p8h8_E -P \vIbH\ GF_Zl8Gck `(k ;NormalG$ ]StretchedG$ |ScaledG$ BoundG$ JustifiedG$ PartialScaledG$  GF_k F_F_FF_F_Xo8IrZ(<zrTopLeftu$bzrCenteru$zrBottomRightu$ GF_rF_F_t8m8z `_ -P F}YvhF&]hF%bChC GF_n8r8JAY[(>[ fEYEY GF_YF_F_q8j$E^{%_Rj$xw%*F;pp9S%wx9S%x GF_v8[ Hz[  e .p[ .LevelSummary ewe *j;e yj;[ T %.p[ .Screenshot rT %*re *re *T % T %e D~[ ->D%C[ \C[ }[ D&. ,;p9Se -9Se playersjX aXMapsCzjXjXe . , ;v ^jX 3zjXjXJ${{e . , ;Author:e . , ;v ^jX GF_z8i$vnvR }Ei$vv_v3% GF_@F_F_F_F_~8x8e h}Y% GF_@F_F_F_F_4d d$! z4d$c$z.,w )KXInterface.UT2LoadingWeaponsArena.P he GF_M9|8y9Kh}Y, GF_@F_F_}8A9)<B zY  M(' GF_B9F_F_F_F_D9F_F_E9@F_F_F9@F_F_G9F_F_H9F_F_I9F_F_J9F_F_K9F_F_F_F_C9b$)k=8rb$& axinterface.UT2MainMenu' GF_Q98MSh}Y, GF_F_F_T@F_F_@F_F_S9P9Fh}Y, GF_@F_F_W9R9kh}Y& GF_F_HF_4O9Z$! 4Z$W$T. &Z. ,\. ,%M.H,&M.H,,M.H,,M.H,,M.H,  GF_z@F_F_`9Ahj|%{A~~A|D~%zAAtzA~AA}A~&|Y$z| GF_U9Y9PT%6Z;6\;pp6 -  %Mo9? &Mo9? ,Mo9? ,Mo9?  GF_Z9F_F_@F_F_@F_F_X9]9Q& M(' GF_^9F_F_F_F_U$Eq.% ^GU$., ^GO$.,J@$. &%y# GF_~g[9lheh~xbppppp?Difficulty=9Sf?bAutoNumBots=9T-U ?NumBots=9Sh GF_0M$P$!&@0P$Q$~.!&}.,v.,T . ,v.,,p .,x. ,S. , j. , Ev&D_EvtDA }%c,GameInfo}Q |{Q |ppQ ||c,~|xDoubleDom%}.h|, |}c,GameInfo}Q |!}ia_cA]}a'vk_z\"zv k\v3%HvI}%},p .}i}p a'p 3f~ {hS A-z x A-U T-U SA(SD$~D$SD$-z ~D$~D$ GF_e// ==================================================================== // GUITabButton - A Tab Button has an associated Tab Control, and // TabPanel. // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUITabPanel extends GUIPanel native abstract; var(Panel) localized string PanelCaption; var(Panel) bool bFillHeight; // If true, the panel will set it's height = Top - ClipY var(Panel) float FadeInTime; var noexport GUITabButton MyButton; function Refresh(); // this function is used by all tab panels function InitPanel(); // Should be Subclassed function OnDestroyPanel(optional bool bCancelled) // Always call Super.OnDestroyPanel() { MyButton = None; } event Free() { OnDestroyPanel(True); Super.Free(); } function ShowPanel(bool bShow) // Show Panel should be subclassed if any special processing is needed { if ( Controller != None && Controller.bModAuthor ) log("# # # #"@MyButton.Caption@"ShowPanel() "@bShow,'ModAuthor'); SetVisibility(bShow); } function bool CanShowPanel() // Subclass this function to change selection behavior of the tab { return true; } F_F_F_e9)i M(' GF_f9F_F_F_F_c9F_F_k9g9l !}x !KXInterface.UT2BotInfoPage.Z h3PGzGyGG' GF_4^v#!\4v#t#.,Jppp.,J(9S^)c-?' GF_F_F_s9t)J$rt,GoEErt,Ge' GF_ji9J -sc, "exit^.,Jppp.,J(9S^)^%~, GF_l9n9S(Lc,."start http://www.unrealtournament.com/-s'c-?'' GF_o9F_F_F_F_m9q9~0c, "exit' GF_r9F_F_F_F_v9q#Xs-B -B ( b.q#0rb* ebIn{eG ke  GF__ F_F_t9F_F_{9u9k lbF%'_ b A_ %'-B 'b |_ &_ bb 3_ ' GF_k F_F_Lf// ==================================================================== // Class: UT2K4UI.GUICharacterList // Parent: UT2K4UI.GUIHorzList // // // ==================================================================== class GUICharacterList extends GUICircularList Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() array PlayerList; var() bool bLocked; var() Material DefaultPortrait; // Image used for unused entries var() array SelectedElements; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); InitList(); } function InitList() { local int i; local array AllPlayerList; class'xUtil'.static.GetPlayerList(AllPlayerList); // Filter out 'duplicate' characters - only used in single player for(i=0; i=0) && (Index = 0 && i < PlayerList.Length; } function Add(string NewItem, optional Object obj) { return; // GUICharacterLists can not be modifed at runtime } function Remove(int i, optional int Count) { return; // GUICharacterLists can not be modifed at runtime } function Clear() { return; // GUICharacterLists can not be modifed at runtime } function Find(string Text, optional bool bExact) { local int i; for (i=0;i 0 ) { Index--; OnChange(Self); } return true; } else return Super.MoveLeft(); } function bool MoveRight() { if (bLocked) { if (Index GetPendingElements( optional bool bGuarantee ) { local int i; if ( (DropState == DRP_Source && Controller.DropSource == Self) || bGuarantee ) { if ( SelectedElements.Length == 0 ) { for (i = 0; i < SelectedItems.Length; i++) if (ValidIndex(SelectedItems[i])) SelectedElements[SelectedElements.Length] = PlayerList[SelectedItems[i]]; if ( SelectedElements.Length == 0 && IsValid() ) SelectedElements[0] = PlayerList[Index]; } return SelectedElements; } } function bool InternalOnBeginDrag(GUIComponent Sender) { if ( Super.InternalOnBeginDrag(Sender) ) { SelectedElements = GetPendingElements(); return true; } return false; } // Called on the drop source when when an Item has been dropped. bAccepted tells it whether // the operation was successful or not. function InternalOnEndDrag(GUIComponent Accepting, bool bAccepted) { // Pending items were dropped somewhere - list cannot be modified at runtime if (bAccepted && Accepting != None) bRepeatClick = False; // If the drag-n-drop wasn't accepted, set bRepeatClick to True so that ClearPendingElements() // won't clear the SelectedItems array - we may want to retry to drag-n-drop if (Accepting == None) bRepeatClick = True; SetOutlineAlpha(255); if ( bNotify ) CheckLinkedObjects(Self); } // Cannot add to CharacterList at runtime function bool InternalOnDragDrop(GUIComponent Sender) { InternalOnMouseRelease(Sender); return false; } F_p// ==================================================================== // Class: UT2K4UI.GUIButton // // GUIButton - The basic button class // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIButton extends GUIComponent Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) var() eTextAlign CaptionAlign; var() editconst GUIStyles CaptionEffectStyle; var() string CaptionEffectStyleName; var() localized string Caption; var() struct native PaddingPercent { var() float HorzPerc, VertPerc; } AutoSizePadding; // Padding (space) to insert around caption if autosizing // When multiple buttons should be the same size, set this value to the longest caption of the group // and all buttons will be sized using this caption instead var() string SizingCaption; var() bool bAutoSize; // Size according to caption size. var() bool bAutoShrink; // Reduce size of button if bAutoSize & caption is smaller than WinWidth var() bool bWrapCaption; // Wrap the caption if its too long - ignored if bAutoSize = true var() bool bUseCaptionHeight; // Get the Height from the caption function InitComponent(GUIController MyController, GUIComponent MyOwner) { local eFontScale x; Super.InitComponent(MyController, MyOwner); if (CaptionEffectStyleName!="") CaptionEffectStyle = Controller.GetStyle(CaptionEffectStyleName,x); } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if ((key==0x0D || Key == 0x20) && State==1) // ENTER or Space Pressed { OnClick(self); return true; } return false; } F_w9F_F_~9z9i ^F%'k ^ Ak %'-B '^ |k &k ^^ 3k ' GF_F_F_|9F_F_A:}9g >IDbF,-B 'b1n;' GF_F_F_9F_F_E:@:f ID^F,-B '^1n;' GF_AF_F_D:@F_F__#@F_F_H:B:`]sU%Gzn;GIp-VAG|c,sA $ GF_m // ==================================================================== // Base class for header / footer bars // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUITitleBar extends GUIBorder Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) var GUITabControl DockedTabs; // Set this to a Tab control and that control will be centered undeneath var() ePageAlign DockAlign; // How to Align the tabs.. only Left, Center and right work var() bool bUseTextHeight; // Should this control scale to the text height var() bool bDockTop; // If True, dock the control ON TOP of this one var const Material Effect; // obsolete F_L@F_F_K:G:lg `%{-]Q c,a Y7Q %AQ %7Q ^F%L%L^FLQ ^ xLLu`^F-Y'-Y(Q bQ aT c,a T7T %AT %7T bF%L%LbFLT b xLLp`bF-['-[(T bT a>-YXpX?RedTeam=xgame.TeamRedConfiguredx-[XpX?BlueTeam=xgame.TeamBlueConfiguredU c,a 7U %AU %7U K^F%L%5L^FLU ^ xLL`^FU bU aXpX?DMTeam=xgame.DMRosterConfiguredXppX?MinPlayers=9S`X GF_Jclass GUIVertGripButton extends GUIGripButtonBase; function InitComponent(GUIController MyController, GUIComponent MyComponent) { Super(GUIButton).InitComponent(MyController, MyComponent); } F_KO#L09:O#,' GF_O:P#\5EI-]-P#^RbR7-]|c,a H%H7|^1H|Hb|a{c,a H%(H7{b1H{H{azc,a H%H7z^1HzHSza,--],--],--], --], --],--] GF_M:F_F_N:F_F_F_F_VP:Lp&F+V-L -L-V'(-V( GF_0^K#!0K#L#^.&b.,U. ,G.3, E#., n. , U%Gzn;GI GF_|'class GUIVertList extends GUIListBase Native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) delegate float GetItemHeight(Canvas C); function CenterMouse() { local PlayerController PC; local float X, Y; if ( IsValid() ) { PC = PlayerOwner(); if ( PC != None ) { SetTopItem(Index); X = ActualLeft() + ActualWidth() / 2; Y = (Index - Top) * ItemHeight; PC.ConsoleCommand("SETMOUSE" @ X @ Y); } return; } Super.CenterMouse(); } event int CalculateIndex( optional bool bRequireValidIndex ) { local int i, NewIndex; // Figure out which Item we're clicking on i = Top + ((Controller.MouseY - ClientBounds[1]) / ItemHeight); if ( i >= ItemCount && bRequireValidIndex ) i = -1; NewIndex = Min( i, ItemCount - 1 ); return NewIndex; } function bool InternalOnClick(GUIComponent Sender) { local int NewIndex; if ( !IsInClientBounds() || ItemsPerPage==0 ) return false; // Get the Row.. NewIndex = CalculateIndex(); SetIndex(NewIndex); return true; } function bool InternalOnKeyType(out byte Key, optional string Unicode) { // Add code to jump to next line with Char return false; } function WheelUp() { if (MyScrollBar!=None) GUIVertScrollBar(MyScrollBar).WheelUp(); else { if (!Controller.CtrlPressed) Up(); else PgUp(); } } function WheelDown() { if (MyScrollBar!=None) GUIVertScrollBar(MyScrollBar).WheelDown(); else { if (!Controller.CtrlPressed) Down(); else PgDn(); } } function bool Up() { if ( (ItemCount<2) || (Index==0) ) return true; SetIndex(Max(0,Index-1)); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); return true; } function bool Down() { if ( (ItemCount<2) || (Index==ItemCount-1) ) return true; SetIndex( Min(Index+1, ItemCount - 1) ); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); return true; } function Home() { if (ItemCount<2) return; SetIndex(0); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); } function End() { if (ItemCount<2) return; SetIndex(ItemCount-1); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); } function PgUp() { if (ItemCount<2) return; SetIndex( Max(0, Index - ItemsPerPage) ); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); } function PgDn() { if (ItemCount<2) return; SetIndex( Min(Index + ItemsPerPage, ItemCount - 1) ); if ( MyScrollBar != None ) MyScrollBar.AlignThumb(); } F_Nud[a uc,wu*}%}7u}T }u}6Z~T7u GF_o// ==================================================================== // Class: XInterface.GUIVertScrollBar // Parent: Xinterface.GUIScrollBarBase // // Custom scrollbar for vertical lists // ==================================================================== class GUIVertScrollBar extends GUIScrollBarBase; // Record location you grabbed the grip function GripPressed( GUIComponent Sender, bool IsRepeat ) { if ( !IsRepeat ) GrabOffset = Controller.MouseY - MyGripButton.ActualTop(); } function bool GripPreDraw( GUIComponent Sender ) { local float NewPerc; if ( MyGripButton.MenuState != MSAT_Pressed ) return false; // Calculate the new Grip Top using the mouse cursor location. NewPerc = FClamp( (Controller.MouseY - GrabOffset - MyScrollZone.ActualTop()) / (MyScrollZone.ActualHeight() - GripSize), 0.0, 1.0 ); UpdateGripPosition(NewPerc); return true; } function ZoneClick(float Delta) { if ( Controller.MouseY < MyGripButton.Bounds[1] ) MoveGripBy(-BigStep); else if ( Controller.MouseY > MyGripButton.Bounds[3] ) MoveGripBy(BigStep); return; } F_Wclass GUIVertScrollButton extends GUIScrollButtonBase; function InitComponent(GUIController MyController, GUIComponent MyOwner) { if (bIncreaseButton) { StyleName="VertDownButton"; ImageIndex = 7; } Super.Initcomponent(MyController, MyOwner); } F_@F_F_G // ==================================================================== // Class: XInterface.GUIVertScrollZone // Parent: XInterface.GUIScrollZoneBase // // Scrollzone implementation for vertical lists. // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class GUIVertScrollZone extends GUIScrollZoneBase; function bool InternalOnClick(GUIComponent Sender) { local float perc; if (!IsInBounds()) return false; perc = ( Controller.MouseY - ActualTop() ) / ActualHeight(); OnScrollZoneClick(perc); return true; } F_R:X:Po[ TcLTGI-\c,sT| $[6L~6L.&%a$^ axPlayers[TLadx' GF_TF_F_Z:|]@ 7 -P wc,* r|t{t-c,?c,c,br|vbc,M"pset ini:Engine.Engine.RenderDevice ReduceMouseLag 9Tvb-Ur|wc,-w-c,br|fc,8"pset PlayerInput bInvertMouse 9Tf- -f- r|EE- $ ${r|Sc,L"set ini:Engine.Engine.ViewportManager UseJoystick9TS-r|b bxc,<"pset PlayerInput MouseSensitivity 9Ubx r|pb pbxc,B"pset PlayerInput MouseSmoothingStrength 9Upbx r|ob obxc,?"pset PlayerInput MouseAccelThreshold 9Uobx r|nb nbxc,;"pset PlayerInput DoubleClickTime 9Unbx r|Q ]Qx bZr|Pc,-P-c,-c,QP-O-N-M- br|Oc,-O-c,-c,QP-O-N-M- br|Nc,- N-c,-c,QP-O-N-M- b4r|Mc,- M-c,-c,QP-O-N-M- b GF_0t|"!!U0|"}"K%KK7EK&D]Kt. &t)Ac,9?&w. ,wAc,-f. ,fA -E. ,EA9: %S. ,SHA9Kc,9"get ini:Engine.Engine.ViewportManager UseJoystickvb. ,hcc,9"get ini:Engine.Engine.RenderDevice ReduceMouseLagvb A9Khcb.Db,b{ Q.Db, Q{ ]P. , PA -O. , OA -N. , NA - M. ,MA - pb.Db,pb{ ob.Db,ob{ nb.Db,nb{  GF_ml"n"!Amn"o"N t;l"u -( GF_W:Z`s]ZprZZGzZIZ pckZIPZ GF_@F_F_\:]\z](pc,wp*s%sp,y|sp]'sD( GF_ha:]:lE-\. ,-bpph?AutoAdjust=9T-\ GF_sF_F_m\h"!Mmh"i"N t;f". , A-\ GF_ma"c"!Amc"d"N t;a"u -( GF_^:d:QB\c,E7\\,(`%`\,~z`\(`L' GF_\F_F_md_"!Am_"`"N t;du -( GF_@F_F_i:f:^ n( 'pp(9S9DW Uj) GF_@F_F_hh:Z i 'pp(9S9DB Uj) GF__@F_F_m:qZYu. , u%6Hq& f{u-q% GF_lclass HudBase extends HUD config(user) native; // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) // (cpptext) enum EScaleMode { SM_None, SM_Up, SM_Down, SM_Left, SM_Right }; struct native DigitSet { var Material DigitTexture; var IntBox TextureCoords[11]; // 0-9, 11th element is negative sign }; struct native SpriteWidget { var Material WidgetTexture; var ERenderStyle RenderStyle; var IntBox TextureCoords; var float TextureScale; var EDrawPivot DrawPivot; var float PosX, PosY; var int OffsetX, OffsetY; var EScaleMode ScaleMode; var float Scale; var Color Tints[2]; }; struct native NumericWidget { var ERenderStyle RenderStyle; var int MinDigitCount; var float TextureScale; var EDrawPivot DrawPivot; var float PosX, PosY; var int OffsetX, OffsetY; var Color Tints[2]; var int bPadWithZeroes; var transient int Value; }; var() transient int TeamIndex; var() transient ERenderStyle PassStyle; // For debugging. struct native HudLocalizedMessage { // The following block of variables are set when the message is entered; // (Message being set indicates that a message is in the list). var class Message; var String StringMessage; var int Switch; var PlayerReplicationInfo RelatedPRI, RelatedPRI2; var Object OptionalObject; var float EndOfLife; var float LifeTime; // The following block of variables are cached on first render; // (StringFont being set indicates that they've been rendered). var Font StringFont; var Color DrawColor; var EDrawPivot DrawPivot; var LocalMessage.EStackMode StackMode; var float PosX, PosY; var float DX, DY; var bool Drawn; }; var() transient HudLocalizedMessage LocalMessages[8]; var() class VoteMenuClass; // hook for mod authors // targeting var Material TargetMaterial; var transient bool bShowTargeting; var transient Vector TargetingLocation; var transient float TargetingSize; // instruction var() string InstructionText; var() string InstructionKeyText; var() float InstructTextBorderX; var() float InstructTextBorderY; var() float InstrDelta; var() float InstrRate; var() localized string InstructionFontName; var() font InstructionFontFont; var bool bUsingCustomHUDColor; var() bool DoCropping; var bool bIsCinematic; var byte FontsPrecached; var globalconfig bool bHideWeaponName; var() float CroppingAmount; var() Material CroppingMaterial; var string LastWeaponName; var float WeaponDrawTimer; var color WeaponDrawColor; var() localized String text; var() localized String LevelActionLoading, LevelActionPaused; var() localized String LevelActionFontName; var localized string WonMatchPrefix, WonMatchPostFix, WaitingToSpawn, AtMenus; var localized string YouveWonTheMatch, YouveLostTheMatch, NowViewing,ScoreText; var localized string InitialViewingString; var Material LocationDot; var color DamageFlash[4]; var float DamageTime[4]; var() byte Emphasized[4]; var() array Crosshairs; var globalconfig color CustomHUDColor; var globalconfig bool bUseCustomWeaponCrosshairs; // Derived HUDs override UpdateHud to update variables before rendering; // NO draw code should be in derived DrawHud's; they should instead override // DrawHudPass[A-D] and call their base class' DrawHudPass[A-D] (This cuts // down on render state changes). simulated function UpdateHud(); simulated function DrawHudPassA (Canvas C); // Alpha Pass simulated function DrawHudPassB (Canvas C); // Additive Pass simulated function DrawHudPassC (Canvas C); // Alpha Pass simulated function DrawHudPassD (Canvas C); // Alternate Texture Pass simulated function PrecacheFonts(Canvas C) { FontsPrecached++; C.Font = GetConsoleFont(C); C.SetPos(0,0); C.DrawText("<>_Aa1"); C.Font = GetFontSizeIndex(C,-2); C.SetPos(0,0); C.DrawText("Aa1"); C.Font = GetFontSizeIndex(C,-4); C.SetPos(0,0); C.DrawText("Aa1"); C.Font = GetFontSizeIndex(C,MessageFontOffset); C.SetPos(0,0); C.DrawText("Aa1"); C.Font = GetFontSizeIndex(C,1 + MessageFontOffset); C.SetPos(0,0); C.DrawText("Aa1"); C.Font = GetFontSizeIndex(C,2 + MessageFontOffset); C.SetPos(0,0); C.DrawText("Aa1"); C.Font = GetFontSizeIndex(C,3 + MessageFontOffset); C.SetPos(0,0); C.DrawText("Aa1"); } function PostBeginPlay() { Super.PostBeginPlay(); if (CustomHUDColorAllowed()) SetCustomHUDColor(); } function bool CustomHUDColorAllowed() { return false; } function SetCustomHUDColor(); /* DisplayHit() Directions are 0 = top 1 = bottom 2 = right 3 = left */ function DisplayHit(vector HitDir, int Damage, class damageType) { local int i; local vector X,Y,Z; local byte Ignore[4]; local rotator LookDir; local float NewDamageTime,Forward,Left; LookDir = PawnOwner.Rotation; LookDir.Pitch = 0; GetAxes(LookDir, X,Y,Z); HitDir.Z = 0; HitDir = Normal(HitDir); Forward = HitDir Dot X; Left = HitDir Dot Y; if ( Forward > 0 ) { if ( Forward > 0.7 ) Emphasized[0] = 1; Ignore[1] = 1; } else { if ( Forward < -0.7 ) Emphasized[1] = 1; Ignore[0] = 1; } if ( Left > 0 ) { if ( Left > 0.7 ) Emphasized[3] = 1; Ignore[2] = 1; } else { if ( Left < -0.7 ) Emphasized[2] = 1; Ignore[3] = 1; } NewDamageTime = 5 * Clamp(Damage,20,30); for ( i=0; i<4; i++ ) if ( Ignore[i] != 1 ) { DamageFlash[i].R = 255; DamageTime[i] = NewDamageTime; } } function DrawDamageIndicators(Canvas C) { if ( DamageTime[0] > 0 ) { C.SetPos(0,0); C.DrawColor = DamageFlash[0]; C.DrawColor.A = DamageTime[0]; if ( Emphasized[0] == 1 ) C.DrawTile( Texture'HudContent.HUD', C.ClipX, 0.15*C.ClipY, 395, 219, 21, -10); else C.DrawTile( Texture'HudContent.HUD', C.ClipX, 0.05*C.ClipY, 395, 219, 21, -10); } else Emphasized[0] = 0; if ( DamageTime[1] > 0 ) { C.DrawColor = DamageFlash[1]; C.DrawColor.A = DamageTime[1]; if ( Emphasized[1] == 1 ) { C.SetPos(0,0.85*C.ClipY); C.DrawTile( Texture'HudContent.HUD', C.ClipX, 0.15*C.ClipY, 395, 209, 21, 10); } else { C.SetPos(0,0.9*C.ClipY); C.DrawTile( Texture'HudContent.HUD', C.ClipX, 0.1*C.ClipY, 395, 209, 21, 10); } } else Emphasized[1] = 0; if ( DamageTime[2] > 0 ) { C.SetPos(0,0); C.DrawColor = DamageFlash[2]; C.DrawColor.A = DamageTime[2]; if ( Emphasized[2] == 1 ) C.DrawTile( Texture'HudContent.HUD', 0.15*C.ClipX, C.ClipY, 404, 182, 12, 21); else C.DrawTile( Texture'HudContent.HUD', 0.05*C.ClipX, C.ClipY, 404, 182, 12, 21); } else Emphasized[2] = 0; if ( DamageTime[3] > 0 ) { C.DrawColor = DamageFlash[3]; C.DrawColor.A = DamageTime[3]; if ( Emphasized[3] == 1 ) { C.SetPos(0.85*C.ClipX,0); C.DrawTile( Texture'HudContent.HUD', 0.15*C.ClipX, C.ClipY, 416, 182, -12, 21); } else { C.SetPos(0.95*C.ClipX,0); C.DrawTile( Texture'HudContent.HUD', 0.05*C.ClipX, C.ClipY, 416, 182, -12, 21); } } else Emphasized[3] = 0; } simulated function Tick(float deltaTime) { local int i; for ( i=0; i<4; i++ ) if ( DamageTime[i] > 0 ) { DamageTime[i] -= 120 * DeltaTime; if ( DamageTime[i] < 1 ) DamageTime[i] = 0; } } simulated function DrawHeadShotSphere() // Dave@Psyonix { local coords CO; local Pawn P; local vector HeadLoc; foreach DynamicActors(class'Pawn', P) { if (P != None && P.HeadBone != '') { CO = P.GetBoneCoords(P.HeadBone); HeadLoc = CO.Origin + (P.HeadHeight * P.HeadScale * CO.XAxis); P.DrawDebugSphere(HeadLoc, P.HeadRadius * P.HeadScale, 10, 0, 255, 0); } } } simulated function DrawHud (Canvas C) { if ( FontsPrecached < 2 ) PrecacheFonts(C); Super.DrawHud(C); UpdateHud(); if( bShowTargeting ) DrawTargeting(C); PassStyle = STY_Alpha; DrawDamageIndicators(C); DrawHudPassA(C); PassStyle = STY_Additive; DrawHudPassB(C); PassStyle = STY_Alpha; DrawHudPassC(C); PassStyle = STY_None; DrawHudPassD(C); DisplayLocalMessages(C); DrawWeaponName(C); DrawVehicleName(C); // DrawHeadShotSphere(); } native simulated function DrawSpriteWidget (Canvas C, out SpriteWidget W); native simulated function DrawNumericWidget (Canvas C, out NumericWidget W, out DigitSet D); simulated function ClearMessage( out HudLocalizedMessage M ) { M.Message = None; M.StringFont = None; } simulated function Message( PlayerReplicationInfo PRI, coerce string Msg, name MsgType ) { local Class LocalMessageClass; switch( MsgType ) { case 'Say': if ( PRI == None ) return; Msg = PRI.PlayerName$": "$Msg; LocalMessageClass = class'SayMessagePlus'; break; case 'TeamSay': if ( PRI == None ) return; Msg = PRI.PlayerName$"("$PRI.GetLocationName()$"): "$Msg; LocalMessageClass = class'TeamSayMessagePlus'; break; case 'CriticalEvent': LocalMessageClass = class'CriticalEventPlus'; LocalizedMessage( LocalMessageClass, 0, None, None, None, Msg ); return; case 'DeathMessage': LocalMessageClass = class'xDeathMessage'; break; default: LocalMessageClass = class'StringMessagePlus'; break; } AddTextMessage(Msg,LocalMessageClass,PRI); } simulated function LocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject, optional String CriticalString) { local int i; local PlayerReplicationInfo HUDPRI; if( Message == None ) return; if( bIsCinematic && !ClassIsChildOf(Message,class'ActionMessage') ) return; if( CriticalString == "" ) { if ( (PawnOwner != None) && (PawnOwner.PlayerReplicationInfo != None) ) HUDPRI = PawnOwner.PlayerReplicationInfo; else HUDPRI = PlayerOwner.PlayerReplicationInfo; if ( HUDPRI == RelatedPRI_1 ) CriticalString = Message.static.GetRelatedString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); else CriticalString = Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); } if( bMessageBeep && Message.default.bBeep ) PlayerOwner.PlayBeepSound(); if( !Message.default.bIsSpecial ) { if ( PlayerOwner.bDemoOwner ) { for( i=0; i= ArrayCount(TextMessages) || TextMessages[i].Text == "" ) break; if ( i > 0 && TextMessages[i-1].Text == CriticalString ) return; } AddTextMessage( CriticalString, Message,RelatedPRI_1 ); return; } i = ArrayCount(LocalMessages); if( Message.default.bIsUnique ) { for( i = 0; i < ArrayCount(LocalMessages); i++ ) { if( LocalMessages[i].Message == None ) continue; if( LocalMessages[i].Message == Message ) break; } } else if ( Message.default.bIsPartiallyUnique || PlayerOwner.bDemoOwner ) { for( i = 0; i < ArrayCount(LocalMessages); i++ ) { if( LocalMessages[i].Message == None ) continue; if( ( LocalMessages[i].Message == Message ) && ( LocalMessages[i].Switch == Switch ) ) break; } } if( i == ArrayCount(LocalMessages) ) { for( i = 0; i < ArrayCount(LocalMessages); i++ ) { if( LocalMessages[i].Message == None ) break; } } if( i == ArrayCount(LocalMessages) ) { for( i = 0; i < ArrayCount(LocalMessages) - 1; i++ ) LocalMessages[i] = LocalMessages[i+1]; } ClearMessage( LocalMessages[i] ); LocalMessages[i].Message = Message; LocalMessages[i].Switch = Switch; LocalMessages[i].RelatedPRI = RelatedPRI_1; LocalMessages[i].RelatedPRI2 = RelatedPRI_2; LocalMessages[i].OptionalObject = OptionalObject; LocalMessages[i].EndOfLife = Message.static.GetLifetime(Switch) + Level.TimeSeconds; LocalMessages[i].StringMessage = CriticalString; LocalMessages[i].LifeTime = Message.static.GetLifetime(Switch); } static function color GetTeamColor(byte TeamNum) { return Default.BlackColor; } function GetLocalStatsScreen() { if ( (PlayerOwner != None) && (TeamPlayerReplicationInfo(PlayerOwner.PlayerReplicationInfo) != None) && (TeamPlayerReplicationInfo(PlayerOwner.PlayerReplicationInfo).LocalStatsScreenClass != None) ) LocalStatsScreen = spawn(TeamPlayerReplicationInfo(PlayerOwner.PlayerReplicationInfo).LocalStatsScreenClass, Owner); } simulated function LayoutMessage( out HudLocalizedMessage Message, Canvas C ) { local int FontSize; FontSize = Message.Message.static.GetFontSize( Message.Switch, Message.RelatedPRI, Message.RelatedPRI2, PlayerOwner.PlayerReplicationInfo ); FontSize += MessageFontOffset; Message.StringFont = GetFontSizeIndex(C,FontSize); Message.DrawColor = Message.Message.static.GetColor( Message.Switch, Message.RelatedPRI, Message.RelatedPRI2 ); Message.Message.static.GetPos( Message.Switch, Message.DrawPivot, Message.StackMode, Message.PosX, Message.PosY ); C.Font = Message.StringFont; C.TextSize( Message.StringMessage, Message.DX, Message.DY ); } simulated function GetScreenCoords(float PosX, float PosY, out float ScreenX, out float ScreenY, out HudLocalizedMessage Message, Canvas C ) { ScreenX = (PosX * HudCanvasScale * C.ClipX) + (((1.0f - HudCanvasScale) * 0.5f) * C.ClipX); ScreenY = (PosY * HudCanvasScale * C.ClipY) + (((1.0f - HudCanvasScale) * 0.5f) * C.ClipY); switch( Message.DrawPivot ) { case DP_UpperLeft: break; case DP_UpperMiddle: ScreenX -= Message.DX * 0.5; break; case DP_UpperRight: ScreenX -= Message.DX; break; case DP_MiddleRight: ScreenX -= Message.DX; ScreenY -= Message.DY * 0.5; break; case DP_LowerRight: ScreenX -= Message.DX; ScreenY -= Message.DY; break; case DP_LowerMiddle: ScreenX -= Message.DX * 0.5; ScreenY -= Message.DY; break; case DP_LowerLeft: ScreenY -= Message.DY; break; case DP_MiddleLeft: ScreenY -= Message.DY * 0.5; break; case DP_MiddleMiddle: ScreenX -= Message.DX * 0.5; ScreenY -= Message.DY * 0.5; break; } } simulated function DrawMessage( Canvas C, int i, float PosX, float PosY, out float DX, out float DY ) { local float FadeValue; local float ScreenX, ScreenY; if ( !LocalMessages[i].Message.default.bFadeMessage ) C.DrawColor = LocalMessages[i].DrawColor; else { FadeValue = (LocalMessages[i].EndOfLife - Level.TimeSeconds); C.DrawColor = LocalMessages[i].DrawColor; C.DrawColor.A = LocalMessages[i].DrawColor.A * (FadeValue/LocalMessages[i].LifeTime); } C.Font = LocalMessages[i].StringFont; GetScreenCoords( PosX, PosY, ScreenX, ScreenY, LocalMessages[i], C ); C.SetPos( ScreenX, ScreenY ); DX = LocalMessages[i].DX / C.ClipX; DY = LocalMessages[i].DY / C.ClipY; if ( LocalMessages[i].Message.default.bComplexString ) { LocalMessages[i].Message.static.RenderComplexMessage( C, LocalMessages[i].DX, LocalMessages[i].DY, LocalMessages[i].StringMessage, LocalMessages[i].Switch, LocalMessages[i].RelatedPRI, LocalMessages[i].RelatedPRI2, LocalMessages[i].OptionalObject ); } else { C.DrawTextClipped( LocalMessages[i].StringMessage, false ); } LocalMessages[i].Drawn = true; } simulated function DisplayLocalMessages( Canvas C ) { local float PosX, PosY, DY, DX; local int i, j; local float FadeValue; local Plane OldCM; OldCM=C.ColorModulate; C.Reset(); C.ColorModulate = OldCM; // Pass 1: Layout anything that needs it and cull dead stuff. for( i = 0; i < ArrayCount(LocalMessages); i++ ) { if( LocalMessages[i].Message == None ) break; LocalMessages[i].Drawn = false; if( LocalMessages[i].StringFont == None ) LayoutMessage( LocalMessages[i], C ); if( LocalMessages[i].StringFont == None ) { log( "LayoutMessage("$LocalMessages[i].Message$") failed!", 'Error' ); for( j = i; j < ArrayCount(LocalMessages) - 1; j++ ) LocalMessages[j] = LocalMessages[j+1]; ClearMessage( LocalMessages[j] ); i--; continue; } if( LocalMessages[i].Message.default.bFadeMessage ) { FadeValue = (LocalMessages[i].EndOfLife - Level.TimeSeconds); if( FadeValue <= 0.0 ) { for( j = i; j < ArrayCount(LocalMessages) - 1; j++ ) LocalMessages[j] = LocalMessages[j+1]; ClearMessage( LocalMessages[j] ); i--; continue; } } } // Pass 2: Go through the list and draw each stack: for( i = 0; i < ArrayCount(LocalMessages); i++ ) { if( LocalMessages[i].Message == None ) break; if( LocalMessages[i].Drawn ) continue; PosX = LocalMessages[i].PosX; PosY = LocalMessages[i].PosY; if( LocalMessages[i].StackMode == SM_None ) { DrawMessage( C, i, PosX, PosY, DX, DY ); continue; } for( j = i; j < ArrayCount(LocalMessages); j++ ) { if( LocalMessages[j].Drawn ) continue; if( LocalMessages[i].PosX != LocalMessages[j].PosX ) continue; if( LocalMessages[i].PosY != LocalMessages[j].PosY ) continue; if( LocalMessages[i].DrawPivot != LocalMessages[j].DrawPivot ) continue; if( LocalMessages[i].StackMode != LocalMessages[j].StackMode ) continue; DrawMessage( C, j, PosX, PosY, DX, DY ); switch( LocalMessages[j].StackMode ) { case SM_Up: PosY -= DY; break; case SM_Down: PosY += DY; break; } } } } simulated function CreateKeyMenus() // create vote/speech menus here { if ( (PlayerController(Owner).PlayerReplicationInfo != None) && PlayerController(Owner).PlayerReplicationInfo.bOnlySpectator ) return; if( VoteMenuClass != None ) VoteMenu = Spawn(VoteMenuClass,self); } function Draw2DLocationDot(Canvas C, vector Loc,float OffsetX, float OffsetY, float ScaleX, float ScaleY) { local rotator Dir; local float Angle, Scaling; local Actor Start; if ( PawnOwner == None ) Start = PlayerOwner; else Start = PawnOwner; Dir = rotator(Loc - Start.Location); Angle = ((Dir.Yaw - PlayerOwner.Rotation.Yaw) & 65535) * 6.2832/65536; C.Style = ERenderStyle.STY_Alpha; C.SetPos(OffsetX * C.ClipX + ScaleX * C.ClipX * sin(Angle), OffsetY * C.ClipY - ScaleY * C.ClipY * cos(Angle)); Scaling = 24*C.ClipX*HUDScale/1600; C.DrawTile(LocationDot, Scaling, Scaling,340,432,78,78); } simulated function SetTargeting( bool bShow, optional Vector TargetLocation, optional float Size ) { bShowTargeting = bShow; if( bShow ) { TargetingLocation = TargetLocation; if( Size != 0.0 ) TargetingSize = Size; } } simulated function DrawTargeting( Canvas C ) { local int XPos, YPos; local vector ScreenPos; local vector X,Y,Z,Dir; local float RatioX, RatioY; local float tileX, tileY; local float Dist; local float SizeX; local float SizeY; SizeX = TargetingSize * 96.0; SizeY = TargetingSize * 96.0; if( !bShowTargeting ) return; ScreenPos = C.WorldToScreen( TargetingLocation ); RatioX = C.SizeX / 640.0; RatioY = C.SizeY / 480.0; tileX = sizeX * RatioX; tileY = sizeY * RatioX; GetAxes(PlayerOwner.Rotation, X,Y,Z); Dir = TargetingLocation - PawnOwner.Location; Dist = VSize(Dir); Dir = Dir/Dist; if ( (Dir Dot X) > 0.6 ) // don't draw if it's behind the eye { XPos = ScreenPos.X; YPos = ScreenPos.Y; C.Style = ERenderStyle.STY_Additive; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; C.DrawColor.A = 255; C.SetPos(XPos - tileX*0.5, YPos - tileY*0.5); C.DrawTile( TargetMaterial, tileX, tileY, 0.0, 0.0, 256, 256); //--- TODO : Fix HARDCODED USIZE //log("Drawing passtarget focus1"); } } simulated function SetCropping( bool Active ) { DoCropping = active; } simulated function DrawInstructionGfx(Canvas C) { local float CropHeight; //log("DrawInstructionGfx"); DrawCrosshair(C); DrawTargeting(C); if( DoCropping ) { // todo: lerp the crop height CropHeight = (C.SizeY * CroppingAmount) * 0.5; C.SetPos(0, 0); C.DrawTile( Texture'Engine.BlackTexture', C.SizeX, CropHeight, 0.0, 0.0, 64, 64 ); C.SetPos( 0, C.SizeY-CropHeight ); C.DrawTile( Texture'Engine.BlackTexture', C.SizeX, CropHeight, 0.0, 0.0, 64, 64 ); } DrawInstructionText(C); DrawInstructionKeyText(C); } simulated function DrawInstructionText(Canvas C) { if( InstructionText == "" ) return; C.Font = LoadInstructionFont(); C.SetOrigin( InstructTextBorderX, InstructTextBorderY ); C.SetClip( C.SizeX-InstructTextBorderX, C.SizeY ); C.SetPos(0,0); C.DrawText( InstructionText ); C.SetOrigin(0.0, 0.0); C.SetClip( C.SizeX, C.SizeY ); } simulated function DrawInstructionKeyText(Canvas C) { local float strX; local float strY; if( InstructionKeyText == "" ) return; C.Font = LoadInstructionFont(); C.SetOrigin( InstructTextBorderX, InstructTextBorderY ); C.SetClip( C.SizeX-InstructTextBorderX, C.SizeY ); C.StrLen( InstructionKeyText, strX, strY ); C.SetOrigin( InstructTextBorderX, C.SizeY-strY-InstructTextBorderY ); C.SetClip( C.SizeX-InstructTextBorderX, C.SizeY ); C.SetPos(0,0); C.DrawText( InstructionKeyText ); C.SetOrigin(0.0, 0.0); C.SetClip( C.SizeX, C.SizeY ); } simulated function SetInstructionText( string text ) { InstructionText = text; } simulated function SetInstructionKeyText( string text ) { InstructionKeyText = text; } simulated function font LoadInstructionFont() { if( InstructionFontFont == None ) { InstructionFontFont = Font(DynamicLoadObject(InstructionFontName, class'Font')); if( InstructionFontFont == None ) Log("Warning: "$Self$" Couldn't dynamically load font "$InstructionFontName); } return InstructionFontFont; } simulated function DrawWeaponName(Canvas C) { local string CurWeaponName; local float XL,YL, Fade; if (bHideWeaponName) return; if (WeaponDrawTimer>Level.TimeSeconds) { C.Font = GetMediumFontFor(C); C.DrawColor = WeaponDrawColor; Fade = WeaponDrawTimer - Level.TimeSeconds; if (Fade<=1) C.DrawColor.A = 255 * Fade; C.Strlen(LastWeaponName,XL,YL); C.SetPos( (C.ClipX/2) - (XL/2), C.ClipY*0.8-YL); C.DrawText(LastWeaponName); } if ( PawnOwner==None || PawnOwner.PendingWeapon==None ) return; CurWeaponName = PawnOwner.PendingWeapon.GetHumanReadableName(); if (CurWeaponName!=LastWeaponName) { WeaponDrawTimer = Level.TimeSeconds+1.5; WeaponDrawColor = PawnOwner.PendingWeapon.HudColor; } LastWeaponName = CurWeaponName; } function DrawVehicleName(Canvas C); /* called when viewing a Matinee cinematic */ simulated function DrawCinematicHUD(Canvas C) { Super.DrawCinematicHUD(C); if (SubTitles != None) DrawIntroSubtitles(C); else if (bHideHUD) DisplayLocalMessages(C); } simulated function DrawIntroSubtitles( Canvas C ) { local String CurrentSubTitles; local float XL, YL, YO; local Array OutArray; local int i; CurrentSubTitles = SubTitles.GetSubTitles(); if ( CurrentSubTitles == "" ) return; C.DrawColor = WhiteColor; C.Style = ERenderStyle.STY_Alpha; C.Font = GetFontSizeIndex( C, -1 ); C.WrapStringToArray(CurrentSubTitles, OutArray, C.ClipX*0.75); C.StrLen( OutArray[i], XL, YL ); YO = FMin(C.ClipY*0.9 - YL*0.5*OutArray.Length, C.ClipY - (OutArray.Length+1.1)*YL); for (i=0; i 57 ) return false; if ( Asc(Left(Test,1)) < 48 && !(bAllowDecimal && Left(Test,1) == ".") ) return false; Test = Mid(Test,1); } return true; } // Join together array elements into a single string static final function string JoinArray(array StringArray, optional string delim, optional bool bIgnoreBlanks) { local int i; local string s; if (delim == "") delim = ","; for (i = 0; i < StringArray.Length; i++) { if ((StringArray[i] != "") || (!bIgnoreBlanks)) { if (s != "") s $= delim; s $= StringArray[i]; } } return s; } // Temp for profiling native function Profile(string ProfileName); native function GetModList(out array ModDirs, out array ModTitles); native function string GetModValue(string ModDir, string ModKey); native function material GetModLogo(string ModDir); F_n:F_F_@"P ^Suc,1ru* -u-\B7cpP %CP ,{P u9fc B&f9D9?f9?BG%GfcPG\cIcPP ucIP Z-\-u GF_t:p:TU Gj v:OIu>+s:;j h-őzVGBzVGBJ u- =1- =1J- =1- =1 uzVGB- =1- =1 uzVGBJ[X! [X! 8fzVGB uzVGB uhΉ uzVGBJΉ uzVGBJ[X! [X! ʁ)[X! u u- =1ҽ i N\Z _Z""p" "F_$33>$?$ #<""$?*F_[j_ ]gZ _Z"p"" "F_$>$?$C <""F$?*F_g _Z"""P "F_$>$?$C <""F$?*<<dF_g _Z"""P "F_$>$?$C <""F$?*d<$?$C <""F$?*F_F_F_F_u:D@%0rD,. D A9Kx!hrD,. DA -rD,. DA vrD,. DAc,VrD,. DA 9?%JrD,. DA -rD,z -{%{ &.D&{wZ{rD, .7DU9<6 :rD,.7DU9<6 xrD,.7DU9<6 rD,.7DU9<6 . , NLc, GF_0ws!!0s!t!l%Kl7El&D]ll%l,.,.lwlR.,a' -,-( GF_c=class HudBBombingRun extends HudBTeamDeathMatch; struct FBombWidget { var EFlagState BombState; var SpriteWidget Widgets[4]; }; var() SpriteWidget BombBG; var() FBombWidget BombWidget; var() Sound PassTargetLocked; #exec OBJ LOAD File=IndoorAmbience.uax var transient xBombFlag BombFlag; var transient xBombDelivery MyBombDelivery; simulated function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(1.0, True); } simulated function TeamScoreOffset() { ScoreTeam[1].OffsetX = 120; if ( ScoreTeam[1].Value < 0 ) ScoreTeam[1].OffsetX += 90; if( abs(ScoreTeam[1].Value) > 9 ) ScoreTeam[1].OffsetX += 90; } simulated function ShowPointBarBottom(Canvas C) { } simulated function ShowPointBarTop(Canvas C) { } simulated function ShowPersonalScore(Canvas C) { } // Alpha Pass ================================================================================== simulated function ShowTeamScorePassA(Canvas C) { local vector Pos; Super.ShowTeamScorePassA(C); LTeamHud[0].OffsetX=-40; LTeamHud[1].OffsetX=-40; LTeamHud[2].OffsetX=-40; RTeamHud[0].OffsetX=40; RTeamHud[1].OffsetX=40; RTeamHud[2].OffsetX=40; TeamSymbols[0].OffsetX = -290; TeamSymbols[1].OffsetX = 290; TeamSymbols[0].OffsetY = 80; TeamSymbols[1].OffsetY = 80; TeamSymbols[0].TextureScale = 0.09; TeamSymbols[1].TextureScale = 0.09; ScoreTeam[0].OffsetX = -200; ScoreTeam[1].OffsetX = 120; DrawSpriteWidget (C, BombBG); DrawSpriteWidget (C, BombWidget.Widgets[BombWidget.BombState]); if ( BombFlag == None ) ForEach DynamicActors(Class'xBombFlag', BombFlag) break; if ( (PawnOwner != None) && (BallLauncher(PawnOwner.Weapon) != None) ) { if ( (MyBombDelivery == None) || (MyBombDelivery.Team == PlayerOwner.PlayerReplicationInfo.Team.TeamIndex) ) ForEach DynamicActors(Class'xBombDelivery', MyBombDelivery) if ( MyBombDelivery.Team != PlayerOwner.PlayerReplicationInfo.Team.TeamIndex ) break; if ( MyBombDelivery == None ) return; Pos = MyBombDelivery.Location; } else if ( BombFlag != None ) { if ( Pawn(BombFlag.Base) != None ) Pos = BombFlag.Base.Location; else Pos = BombFlag.Location; } else if ( PlayerOwner.GameReplicationInfo != None ) Pos = PlayerOwner.GameReplicationInfo.FlagPos; C.DrawColor = GoldColor; Draw2DLocationDot(C, Pos, 0.5 - 0.0075*HUDScale, 0.044*HUDScale, 0.034*HUDScale, 0.046*HUDScale); } function Timer() { Super.Timer(); if ( PawnOwnerPRI == None ) return; // offsets returned in Y can be the same for xBombHUDMessage if ( BombFlag != None && BombFlag.HolderPRI != None && BombFlag.HolderPRI.Team != PawnOwnerPRI.Team) PlayerOwner.ReceiveLocalizedMessage( class'xBombHUDMessage', 1 ); else if ( PawnOwnerPRI.HasFlag != None ) PlayerOwner.ReceiveLocalizedMessage( class'xBombHUDMessage', 0 ); } simulated function UpdateTeamHud() { local GameReplicationInfo GRI; local int i; local int TeamOffset; local int Index; if ((PawnOwnerPRI != none) && (PawnOwnerPRI.Team != None)) TeamOffset = Clamp (PawnOwnerPRI.Team.TeamIndex, 0, 1); else TeamOffset = 0; GRI = PlayerOwner.GameReplicationInfo; if (GRI == None) return; for (i = 0; i < 2; i++) { if (GRI.Teams[i] == None) continue; Index = (i + TeamOffset) % ArrayCount(ScoreTeam); ScoreTeam[Index].Value = Min (GRI.Teams[i].Score, 999); // max display capability if (GRI.TeamSymbols[i] == None) continue; TeamSymbols[Index].WidgetTexture = GRI.TeamSymbols[i]; } if ( PlayerOwner.PlayerReplicationInfo.Team == None ) BombWidget.BombState = GRI.FlagState[0]; else BombWidget.BombState = GRI.FlagState[PlayerOwner.PlayerReplicationInfo.Team.TeamIndex]; Super.UpdateTeamHUD(); } j }:pHB>w:Kj h-ʼn u u uzVGB u u u- =1 uzVGBJ uDҽʁ)ҽʁ) u u- =1 u- =1 i NlZ _Z""p" "F_$>$?$""$?*F_l _Z""p" "F_$>$?$""$?*F_[ jGg gZ _Z""a"B "F_$R>$?$""F$?*<<<$?$""F$?*<<<$?$""F$?*<<<$?$""F$?*<<<$?$"D"F$?*ddF_g _Z""a" "F_$R>$?$"D"F$?*ddF_g _Z""a" "F_$R>$?$"D"F$?*ddF_g _Z""a"C "F_$R>$?$"D"F$?*ddF_F_BHZ aU`Z"""Z "@F_$R>$?$""F$?*<<<$?$"D"F$?*  F_DGZ aU`Z"\"" "F_$33>$?$""H$?*  F_DG aU`Z"\"" "F_$33>$?$"8"H$?*  F_oGZ aU`Z"\" " "?F_$ff>$?$""*$?*  F_oG aU`Z"\" " "?F_$ff>$?$""*$?*  F_MQZ _Z""" "F_$k>$$"_" $?*F_MQ _Z""" "F_$k>$$"_" $?*2@2F_MQ _Z""" "F_$k>$$"_" $?*2@2F_MQ _Z""" "F_$k>$$""$?*F_F_F_|:<] -P r<&iset ini:Engine.Engine.ViewportManager TextureDetailz.<(%1OUltraLow{%z.<(&1OLow{& z.<(,1OLower{,Dz.<(,1ONormal{,~z.<(,1OHigher{,z.<(,1OHigh{,z.<(,1OUltraHigh{,c,"piTerrainOc,"piWorldOc,"piRendermapOc,"piLightmapOc, "flush{z-L 'z{ $r<,iset ini:Engine.Engine.ViewportManager TextureDetailFz.<(%1OUltraLow{%{z.<(&1OLow{&z.<(,1OLower{,z.<(,1ONormal{,(z.<(,1OHigher{,`z.<(,1OHigh{,z.<(,1OUltraHigh{,c, "piWeaponSkinOc, "piPlayerSkinOc, "flush{{-L '{{ r<,z.<(,1c,@"set ini:Engine.Engine.RenderDevice HighDetailActors Truec,E"set ini:Engine.Engine.RenderDevice SuperHighDetailActors Truec,O${,z.<(,1c,@"set ini:Engine.Engine.RenderDevice HighDetailActors Truec,F"set ini:Engine.Engine.RenderDevice SuperHighDetailActors Falsec,O${,z.<(,1c,A"set ini:Engine.Engine.RenderDevice HighDetailActors Falsec,F"set ini:Engine.Engine.RenderDevice SuperHighDetailActors Falsec,O${,{[ -L '[ { r<,4z.<(,1c,$pz.<(,1c,$z.<(,1c,$c,c,c,b  r<,c,>"pset UnrealPawn bPlayerShadows 9T. <- -. <-  . <--L ' " r<,c,;"pset UnrealPawn bBlobShadow 9T. <- -. <-   r<,-p. <--p-p'c,%"set<M9T-p . <--L '  r<,  z.<(,1c,@z > z.<(,1c,?z z z.<(,1c,c,c,c,b c,3"set<M9T. <- . <--L 'U -L  -Qd !KXInterface.UT2PerformWarn-H c,-!z.&(,1"z.,(,1"z.,(,1"z.,(,1. ,-. ,-. ,-. ,-. , -"z., (,1. , -. , -c, s -H ' GF_@F_F_RF_F_y:F_F_:{:T6 GF_L5class HudBCaptureTheFlag extends HudBTeamDeathMatch; #exec Texture Import File=textures\FlagIcons.tga Name=S_FlagIcon Mips=Off Alpha=1 DXT=5 struct FFlagWidget { var EFlagState FlagState; var SpriteWidget Widgets[4]; }; var() SpriteWidget SymbolGB[2]; var() FFlagWidget FlagWidgets[2]; var Actor RedBase, BlueBase; var SpriteWidget NewFlagWidgets[2]; var SpriteWidget FlagDownWidgets[2]; var SpriteWidget FlagHeldWidgets[2]; simulated function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(1.0, True); } simulated function ShowPointBarBottom(Canvas C) { } simulated function ShowPointBarTop(Canvas C) { } simulated function ShowPersonalScore(Canvas C) { } simulated function TeamScoreOffset() { ScoreTeam[1].OffsetX = 180; if ( ScoreTeam[1].Value < 0 ) ScoreTeam[1].OffsetX += 90; if( abs(ScoreTeam[1].Value) > 9 ) ScoreTeam[1].OffsetX += 90; //if( abs(ScoreTeam[1].Value) > 99 ) // ScoreTeam[1].OffsetX -= 90; } // Alpha Pass ================================================================================== simulated function ShowTeamScorePassA(Canvas C) { local CTFBase B; local int i; Super.ShowTeamScorePassA(C); DrawSpriteWidget (C, SymbolGB[0]); DrawSpriteWidget (C, SymbolGB[1]); LTeamHud[0].OffsetX=-95; LTeamHud[1].OffsetX=-95; LTeamHud[2].OffsetX=-95; RTeamHud[0].OffsetX=95; RTeamHud[1].OffsetX=95; RTeamHud[2].OffsetX=95; TeamSymbols[0].TextureScale = 0.09; TeamSymbols[1].TextureScale = 0.09; TeamSymbols[0].OffsetX = -480; TeamSymbols[1].OffsetX = 480; TeamSymbols[0].OffsetY = 90; TeamSymbols[1].OffsetY = 90; ScoreTeam[0].OffsetX = -270; ScoreTeam[1].OffsetX = 180; ScoreTeam[0].OffsetY = 75; ScoreTeam[1].OffsetY = 75; if ( RedBase == None ) { ForEach DynamicActors(Class'CTFBase', B) { if ( B.IsA('xRedFlagBase') ) RedBase = B; else BlueBase = B; } } if ( RedBase != None ) { C.DrawColor = RedColor; Draw2DLocationDot(C, RedBase.Location,0.5 - 0.04*HUDScale, 0.0365*HUDScale, 0.0305*HUDScale, 0.0405*HUDScale); } if ( BlueBase != None ) { C.DrawColor = BlueColor; Draw2DLocationDot(C, BlueBase.Location,0.5 + 0.026*HUDScale, 0.0365*HUDScale, 0.0305*HUDScale, 0.0405*HUDScale); } DrawSpriteWidget (C, NewFlagWidgets[0]); DrawSpriteWidget (C, NewFlagWidgets[1]); if ( PlayerOwner.GameReplicationInfo == None ) return; for (i = 0; i < 2; i++) { if ( PlayerOwner.GameReplicationInfo.FlagState[i] == EFlagState.FLAG_HeldEnemy ) DrawSpriteWidget (C, FlagHeldWidgets[i]); else if ( PlayerOwner.GameReplicationInfo.FlagState[i] == EFlagState.FLAG_Down ) DrawSpriteWidget (C, FlagDownWidgets[i]); } } function Timer() { Super.Timer(); if ( (PawnOwnerPRI == None) || (PlayerOwner.IsSpectating() && (PlayerOwner.bBehindView || (PlayerOwner.ViewTarget == PlayerOwner))) ) return; if ( PawnOwnerPRI.HasFlag != None ) PlayerOwner.ReceiveLocalizedMessage( class'CTFHUDMessage', 0 ); if ( (PlayerOwner.GameReplicationInfo != None) && (PlayerOwner.GameReplicationInfo.FlagState[PlayerOwner.PlayerReplicationInfo.Team.TeamIndex] == EFlagState.FLAG_HeldEnemy) ) PlayerOwner.ReceiveLocalizedMessage( class'CTFHUDMessage', 1 ); } simulated function UpdateTeamHud() { Super.UpdateTeamHUD(); } F_dxa!Stb&C ^Ga! GF_D;\@=r\&/zUltraLowz%HzLowz&dzLowerz,zNormalz,zHigherz,zHighz,zUltraHighz,.\&z1r\,(zUltraLow{%AzLow{&]zLower{,zzNormal{,zHigher{,zHigh{,zUltraHigh{,.\&{1r\,-}9Kc,;"get ini:Engine.Engine.RenderDevice HighDetailActors-|9Kc,@"get ini:Engine.Engine.RenderDevice SuperHighDetailActors-|[ ,-}[ ,[ ,.\&[ 1r\,A9:c,9:$.\&,19:c,9:$.\&,1.\&,1r\,. \A - r\,. \A9Kr\, 9Dc, b%.\&,1 &.\&,1 ,.\&,1 r\,. \A -. \ A9K GF_~:U{&@|-Q|-EQdPc GF_@;`!c'?<9:`!,c,FU GF_k#exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=Crosshairs.utx #EXEC OBJ LOAD FILE=LastManStanding.utx class HudBDeathMatch extends HudBase config(User); var() DigitSet DigitsBig; var() SpriteWidget LHud1[4]; var() SpriteWidget LHud2[4]; var() SpriteWidget RHud1[4]; var() SpriteWidget RHud2[4]; const WEAPON_BAR_SIZE = 9; var() SpriteWidget WeaponBarAmmoFill[WEAPON_BAR_SIZE]; var() SpriteWidget WeaponBarTint[WEAPON_BAR_SIZE]; var() SpriteWidget WeaponBarTrim[WEAPON_BAR_SIZE]; var() SpriteWidget WeaponBarIcon[WEAPON_BAR_SIZE]; var() class BaseWeapons[WEAPON_BAR_SIZE]; var() SpriteWidget AmmoIcon; var() SpriteWidget ScoreBg[4]; var() SpriteWidget Adrenaline[5]; var() SpriteWidget HealthIcon; var() NumericWidget AdrenalineCount; var() NumericWidget ComboCount; var() NumericWidget HealthCount; var() NumericWidget AmmoCount; var() NumericWidget ShieldCount; var() NumericWidget mySpread; var() NumericWidget myRank; var() NumericWidget myScore; var() SpriteWidget ShieldIconGlow; var() SpriteWidget ShieldIcon; var() SpriteWidget AdrenalineIcon; var() SpriteWidget ReloadingTeamTint; var() SpriteWidget ReloadingTrim; var() SpriteWidget ReloadingFill; var() SpriteWidget UDamageTeamTint; var() SpriteWidget UDamageTrim; var() SpriteWidget UDamageFill; var() Font LevelActionFontFont; var() Color LevelActionFontColor; var() float LevelActionPositionX, LevelActionPositionY; var() float CurrentWeaponPositionX, CurrentWeaponPositionY; var() Texture LogoTexture; var() float LogoScaleX; var() float LogoScaleY; var() float LogoPosX; var() float LogoPosY; var() float testLerp; var() float comboTime; var() float accumData[4]; var() float growScale[4]; var() float growTrace[4]; var() int pulse[5]; var() bool ArmorGlow; var() bool Displaying; var() bool growing; var() bool LowHealthPulse; var() bool TeamLinked; var() bool AdrenalineReady; var bool bRealSmallWeaponBar; var float OldHUDScale; var() float TransRechargeAmount; var transient float CurHealth, LastHealth, CurShield, LastShield, CurEnergy, CurAmmoPrimary, pulseHealthIcon,pulseArmorIcon; var transient float MaxShield, MaxEnergy, MaxAmmoPrimary; var transient int CurScore, CurRank, ScoreDiff; var int OldRemainingTime; var sound CountDown[10]; var sound LongCount[6]; var PlayerReplicationInfo NamedPlayer; var float NameTime; var Material Portrait; var float PortraitTime; var float PortraitX; var array MySceneManagers; simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'InterfaceContent.HUD.SkinA'); Level.AddPrecacheMaterial(Material'XGameShaders.ScreenNoise'); Level.AddPrecacheMaterial(Material'InterfaceContent.BorderBoxA1'); } function PostBeginPlay() { local SceneManager SM; Super.PostBeginPlay(); foreach AllActors(class'SceneManager',SM) { MySceneManagers.Length = MySceneManagers.Length+1; MySceneManagers[MySceneManagers.Length-1] = SM; } if ( CustomCrosshairsAllowed() ) SetCustomCrosshairs(); } function bool CustomCrosshairsAllowed() { return true; } function bool CustomCrosshairColorAllowed() { return true; } function bool CustomHUDColorAllowed() { return true; } // TODO Add support for custom crosshair scale to menus function SetCustomCrosshairs() { local int i; local array CustomCrosshairs; class'CacheManager'.static.GetCrosshairList(CustomCrosshairs); Crosshairs.Length = CustomCrosshairs.Length; for (i = 0; i < CustomCrosshairs.Length; i++) { Crosshairs[i].WidgetTexture = CustomCrosshairs[i].CrosshairTexture; Crosshairs[i].TextureCoords.X1 = 0; Crosshairs[i].TextureCoords.X2 = 64; Crosshairs[i].TextureCoords.Y1 = 0; Crosshairs[i].TextureCoords.Y2 = 64; Crosshairs[i].TextureScale = 0.75; Crosshairs[i].DrawPivot = DP_MiddleMiddle; Crosshairs[i].PosX = 0.5; Crosshairs[i].PosY = 0.5; Crosshairs[i].OffsetX = 0; Crosshairs[i].OffsetY = 0; Crosshairs[i].ScaleMode = SM_None; Crosshairs[i].Scale = 1.0; Crosshairs[i].RenderStyle = STY_Alpha; } if ( CustomCrosshairColorAllowed() ) SetCustomCrosshairColors(); } function SetCustomCrosshairColors() { local int i, j; for (i = 0; i < Crosshairs.Length; i++) for (j = 0; j < 2; j++) Crosshairs[i].Tints[j] = CrosshairColor; } function SetCustomHUDColor() { local int i,j; if ( (CustomHUDColor.R == 0) && (CustomHUDColor.G == 0) && (CustomHUDColor.B == 0) && (CustomHUDColor.A == 0) ) return; bUsingCustomHUDColor = true; for ( j=0; j<2; j++ ) { ReloadingTeamTint.Tints[j] = CustomHUDColor; UDamageTeamTint.Tints[j] = CustomHUDColor; for ( i=1; i<3; i++ ) { LHUD1[i].Tints[j] = CustomHUDColor; LHUD2[i].Tints[j] = CustomHUDColor; RHUD1[i].Tints[j] = CustomHUDColor; RHUD2[i].Tints[j] = CustomHUDColor; Adrenaline[i].Tints[j] = CustomHUDColor; ScoreBg[i].Tints[j] = CustomHUDColor; } for ( i=0; i<9; i++ ) WeaponBarTint[i].Tints[j] = CustomHUDColor; } } function CheckCountdown(GameReplicationInfo GRI) { if ( (GRI == None) || (GRI.RemainingTime == 0) || (GRI.RemainingTime == OldRemainingTime) || (GRI.Winner != None) ) return; OldRemainingTime = GRI.RemainingTime; if ( OldRemainingTime > 300 ) return; if ( OldRemainingTime > 30 ) { if ( OldRemainingTime == 300 ) PlayerOwner.PlayAnnouncement(LongCount[0],1,true); else if ( OldRemainingTime == 180 ) PlayerOwner.PlayAnnouncement(LongCount[1],1,true); else if ( OldRemainingTime == 120 ) PlayerOwner.PlayAnnouncement(LongCount[2],1,true); else if ( OldRemainingTime == 60 ) PlayerOwner.PlayAnnouncement(LongCount[3],1,true); return; } if ( OldRemainingTime == 30 ) PlayerOwner.PlayAnnouncement(LongCount[4],1,true); else if ( OldRemainingTime == 20 ) PlayerOwner.PlayAnnouncement(LongCount[5],1,true); else if ( (OldRemainingTime <= 10) && (OldRemainingTime > 0) ) PlayerOwner.PlayAnnouncement(CountDown[OldRemainingTime - 1],1,true); } simulated function Tick(float deltaTime) { local Material NewPortrait; Super.Tick(deltaTime); if ( (Level.TimeSeconds - LastPlayerIDTalkingTime < 0.1) && (PlayerOwner.GameReplicationInfo != None) ) { if ( (PortraitPRI == None) || (PortraitPRI.PlayerID != LastPlayerIDTalking) ) { PortraitPRI = PlayerOwner.GameReplicationInfo.FindPlayerByID(LastPlayerIDTalking); if ( PortraitPRI != None ) { NewPortrait = PortraitPRI.GetPortrait(); if ( NewPortrait != None ) { if ( Portrait == None ) PortraitX = 1; Portrait = NewPortrait; PortraitTime = Level.TimeSeconds + 3; } } } else PortraitTime = Level.TimeSeconds + 0.2; } else LastPlayerIDTalking = 0; if ( PortraitTime - Level.TimeSeconds > 0 ) PortraitX = FMax(0,PortraitX-3*deltaTime); else if ( Portrait != None ) { PortraitX = FMin(1,PortraitX+3*deltaTime); if ( PortraitX == 1 ) { Portrait = None; PortraitPRI = None; } } pulseNumber(0, HealthCount, 0.26, 0.05, deltaTime, 0.25, 0,255,CurHealth, LastHealth); pulseNumber(1, ShieldCount, 0.26, 0.05, deltaTime, 0.25, 0,255,CurShield, LastShield); ArmorPulse(deltaTime,255,0,ShieldIconGlow,TeamIndex,250); if(CurHealth < 50) LowHealth(deltaTime,255,0,LHud2[3],TeamIndex,1000); else LHud2[3].Tints[TeamIndex].A = 50; if(CurHealth < 25) pulseWidget(deltaTime, 255, 0, HealthIcon, TeamIndex, 2, 2000); else HealthIcon.Tints[TeamIndex].A = 255; if(AdrenalineReady) pulseWidget(deltaTime, 255, 0, Adrenaline[4], TeamIndex, 2, 1000); else Adrenaline[4].Tints[TeamIndex].A = 0; } simulated function pulseWidget(float deltaTime, float max, float min, out SpriteWidget sprite, int tIndex, int pIndex, float pRate) { local float accum; accum = deltaTime * pRate; if(sprite.Tints[tIndex].A < min) accumData[pIndex] += accum; else accumData[pIndex] -= accum; if(accumData[pIndex] < min) accumData[pIndex] = max; sprite.Tints[tIndex].A = accumData[pIndex]; } simulated function pulseNumber(int gIndex, out NumericWidget number, float nScale, float growSpeed, float deltaTime, float oScale ,float test1,float test2, float first, float last) { local float growAccum; growAccum = deltaTime * growSpeed; testLerp = test1 + (deltaTime * 2) *(test2 - test1); if(growing) { growScale[gIndex] -= growAccum; growTrace[gIndex] += testLerp; if(growTrace[gIndex] > 255) growTrace[gIndex] = 255; if (first < last) { growTrace[gIndex] = 0; growScale[gIndex] = nScale; } if(growScale[gIndex] < oScale) growScale[gIndex] = oScale; if(growScale[gIndex] < oScale && growTrace[gIndex] ==255) growing = false; number.Tints[TeamIndex].B = growTrace[gIndex]; number.TextureScale = growScale[gIndex]; } else if (first < last) { growTrace[gIndex] = 0; growScale[gIndex] = nScale; growing = true; } else { growScale[gIndex] = oScale; } } simulated function ArmorPulse(float deltaTime, float max, float min, out SpriteWidget sprite, int tIndex, float pRate) { local int accum; accum = deltaTime * pRate; if(ArmorGlow) pulseArmorIcon += accum; else pulseArmorIcon -= accum; if(pulseArmorIcon<= min) { pulseArmorIcon= min; ArmorGlow = true; } else if(pulseArmorIcon >= max) { pulseArmorIcon= max; ArmorGlow = false; } sprite.Tints[tIndex].A = pulseArmorIcon; sprite.Tints[tIndex].B = pulseArmorIcon; } simulated function LowHealth(float deltaTime, float max, float min, out SpriteWidget sprite, int tIndex,float pRate) { local int accum; accum = deltaTime * pRate; if(LowHealthPulse) pulseHealthIcon += accum; else pulseHealthIcon -= accum; if(pulseHealthIcon<= min) { pulseHealthIcon= min; LowHealthPulse = true; } else if(pulseHealthIcon >= max) { pulseHealthIcon= max; LowHealthPulse = false; } sprite.Tints[tIndex].A = pulseHealthIcon; } ////////////////////////////////////////// simulated function UpdateRankAndSpread(Canvas C) { local int i; if ( (Scoreboard == None) || !Scoreboard.UpdateGRI() ) return; for( i=0 ; i 1 ) mySpread.Value = Min (PawnOwnerPRI.Score - PlayerOwner.GameReplicationInfo.PRIArray[1].Score, 999); else mySpread.Value = 0; } else mySpread.Value = Min (PawnOwnerPRI.Score - PlayerOwner.GameReplicationInfo.PRIArray[0].Score, 999); if( bShowPoints ) { DrawNumericWidget (C, myScore, DigitsBig); if ( C.ClipX >= 640 ) DrawNumericWidget (C, mySpread, DigitsBig); DrawNumericWidget (C, myRank, DigitsBig); } if(myRank.Value > 9) { myRank.TextureScale = 0.12; myRank.OffsetX = 240; myRank.OffsetY = 90; } else { myRank.TextureScale = 0.18; myRank.OffsetX = 150; myRank.OffsetY = 40; } } simulated function CalculateHealth() { LastHealth = CurHealth; CurHealth = PawnOwner.Health; } simulated function CalculateShield() { LastShield = CurShield; if( PawnOwner.IsA ('XPawn') ) { MaxShield = XPawn(PawnOwner).ShieldStrengthMax; CurShield = Clamp (XPawn(PawnOwner).ShieldStrength, 0, MaxShield); } else { MaxShield = 100; CurShield = 0; } } simulated function CalculateEnergy() { if ( PawnOwner.Controller == None ) { MaxEnergy = PlayerOwner.AdrenalineMax; CurEnergy = Clamp (PlayerOwner.Adrenaline, 0, MaxEnergy); } else { MaxEnergy = PawnOwner.Controller.AdrenalineMax; CurEnergy = Clamp (PawnOwner.Controller.Adrenaline, 0, MaxEnergy); } AdrenalineCount.Value = CurEnergy; } simulated function CalculateAmmo() { MaxAmmoPrimary = 1; CurAmmoPrimary = 1; if ( (PawnOwner != none) && (PawnOwner.Weapon != none) ) PawnOwner.Weapon.GetAmmoCount(MaxAmmoPrimary,CurAmmoPrimary); } simulated function CalculateScore() { ScoreDiff = CurScore; CurScore = PawnOwnerPRI.Score; } simulated function string GetScoreText() { return ScoreText; } simulated function string GetScoreValue(PlayerReplicationInfo PRI) { return ""$int(PRI.Score); } simulated function string GetScoreTagLine() { return InitialViewingString; } simulated function DrawSpectatingHud (Canvas C) { local string InfoString; local plane OldModulate; local float xl,yl,Full, Height, Top, TextTop, MedH, SmallH,Scale; local GameReplicationInfo GRI; local int i; DisplayLocalMessages (C); // Hack for tutorials. if (MySceneManagers.Length>0) { for (i=0;i Level.TimeSeconds - 0.4 ) { if ( LastPickupTime > Level.TimeSeconds - 0.2 ) CHTexture.TextureScale *= (1 + 5 * (Level.TimeSeconds - LastPickupTime)); else CHTexture.TextureScale *= (1 + 5 * (LastPickupTime + 0.4 - Level.TimeSeconds)); } OldScale = HudScale; HudScale=1; OldW = C.ColorModulate.W; C.ColorModulate.W = 1; DrawSpriteWidget (C, CHTexture); C.ColorModulate.W = OldW; HudScale=OldScale; CHTexture.TextureScale = NormalScale; DrawEnemyName(C); } function DrawEnemyName(Canvas C) { local actor HitActor; local vector HitLocation,HitNormal,ViewPos; if ( PlayerOwner.bBehindView || bNoEnemyNames || (PawnOwner.Controller == None) ) return; ViewPos = PawnOwner.Location + PawnOwner.BaseEyeHeight * vect(0,0,1); HitActor = trace(HitLocation,HitNormal,ViewPos+1200*vector(PawnOwner.Controller.Rotation),ViewPos,true); if ( (Pawn(HitActor) != None) && (Pawn(HitActor).PlayerReplicationInfo != None) && (HitActor != PawnOwner) && ( (PawnOwner.PlayerReplicationInfo.Team == None) || (PawnOwner.PlayerReplicationInfo.Team != Pawn(HitActor).PlayerReplicationInfo.Team)) ) { if ( (NamedPlayer != Pawn(HitActor).PlayerReplicationInfo) || (Level.TimeSeconds - NameTime > 0.5) ) { DisplayEnemyName(C, Pawn(HitActor).PlayerReplicationInfo); NameTime = Level.TimeSeconds; } NamedPlayer = Pawn(HitActor).PlayerReplicationInfo; } } function DisplayEnemyName(Canvas C, PlayerReplicationInfo PRI) { PlayerOwner.ReceiveLocalizedMessage(class'PlayerNameMessage',0,PRI); } function SetSmallWeaponBar() { local int i; bRealSmallWeaponBar = bSmallWeaponBar; if ( bSmallWeaponBar ) { LHud1[0].TextureCoords.Y2 = 893; LHud1[1].TextureCoords.Y2 = 893; LHud1[0].PosY = 0.89; LHud1[1].PosY = 0.89; LHud1[0].TextureScale = 0.25; LHud1[1].TextureScale = 0.25; LHud2[1].PosY = 0.88; LHud2[0].PosY = 0.88; LHud1[3].PosY = 0.88; LHud2[3].PosY = 0.88; HealthIcon.PosY = 0.88; HealthCount.PosY = 0.88; LHud2[1].PosX = -0.03; LHud2[0].PosX = -0.03; LHud1[3].PosX = -0.03; LHud2[3].PosX = -0.03; HealthIcon.PosX = -0.03; HealthCount.PosX = -0.03; UDamageTrim.TextureScale = 0.27; UDamageTeamTint.TextureScale = 0.27; UDamageFill.TextureScale = 0.27; UDamageTrim.PosX = -0.005; UDamageTeamTint.PosX = -0.005; UDamageFill.PosX = -0.005; UDamageTrim.PosY = 0.88; UDamageTeamTint.PosY = 0.88; UDamageFill.PosY = 0.88; RHud1[0].TextureCoords.Y2 = 893; RHud1[1].TextureCoords.Y2 = 893; RHud1[0].PosY = 0.89; RHud1[1].PosY = 0.89; RHud1[0].TextureScale = 0.25; RHud1[1].TextureScale = 0.25; RHud2[1].PosY = 0.88; RHud2[0].PosY = 0.88; RHud1[3].PosY = 0.88; RHud2[3].PosY = 0.88; AmmoIcon.PosY = 0.88; AmmoCount.PosY = 0.88; RHud2[1].PosX = 1.03; RHud2[0].PosX = 1.03; RHud1[3].PosX = 1.03; RHud2[3].PosX = 1.03; AmmoIcon.PosX = 1.03; AmmoCount.PosX = 1.03; ReloadingTrim.TextureScale = 0.27; ReloadingTeamTint.TextureScale = 0.27; ReloadingFill.TextureScale = 0.27; ReloadingTrim.PosX = 1.005; ReloadingTeamTint.PosX = 1.005; ReloadingFill.PosX = 1.005; ReloadingTrim.PosY = 0.88; ReloadingTeamTint.PosY = 0.88; ReloadingFill.PosY = 0.88; } else { // reset to defaults for ( i=0; i<4; i++ ) { LHUD1[i].PosX = Default.LHUD1[i].PosX; LHUD1[i].PosY = Default.LHUD1[i].PosY; LHUD2[i].PosX = Default.LHUD2[i].PosX; LHUD2[i].PosY = Default.LHUD2[i].PosY; RHUD1[i].PosX = Default.RHUD1[i].PosX; RHUD1[i].PosY = Default.RHUD1[i].PosY; RHUD2[i].PosX = Default.RHUD2[i].PosX; RHUD2[i].PosY = Default.RHUD2[i].PosY; ShieldCount.PosY = Default.ShieldCount.PosY; ShieldIcon.PosY = Default.ShieldIcon.PosY; ShieldIconGlow.PosY = Default.ShieldIconGlow.PosY; } LHUD1[0].TextureScale = Default.LHUD1[0].TextureScale; LHud1[0].TextureCoords = Default.LHud1[0].TextureCoords; RHUD1[0].TextureScale = Default.RHUD1[0].TextureScale; RHUD1[0].TextureCoords = Default.RHud1[0].TextureCoords; LHUD1[1].TextureScale = Default.LHUD1[1].TextureScale; LHud1[1].TextureCoords = Default.LHud1[1].TextureCoords; RHUD1[1].TextureScale = Default.RHUD1[1].TextureScale; RHUD1[1].TextureCoords = Default.RHud1[1].TextureCoords; HealthIcon.PosY = Default.HealthIcon.PosY; HealthCount.PosY = Default.HealthCount.PosY; HealthIcon.PosX = Default.HealthIcon.PosX; HealthCount.PosX = Default.HealthCount.PosX; UDamageTrim.TextureScale = Default.UDamageTrim.TextureScale; UDamageTeamTint.TextureScale = Default.UDamageTeamTint.TextureScale; UDamageFill.TextureScale = Default.UDamageFill.TextureScale; UDamageTrim.PosX = Default.UDamageTrim.PosX; UDamageTeamTint.PosX = Default.UDamageTeamTint.PosX; UDamageFill.PosX = Default.UDamageFill.PosX; UDamageTrim.PosY = Default.UDamageTrim.PosY; UDamageTeamTint.PosY = Default.UDamageTeamTint.PosY; UDamageFill.PosY = Default.UDamageFill.PosY; AmmoIcon.PosY = Default.AmmoIcon.PosY; AmmoCount.PosY = Default.AmmoCount.PosY; AmmoIcon.PosX = Default.AmmoIcon.PosX; AmmoCount.PosX = Default.AmmoCount.PosX; ReloadingTrim.TextureScale = Default.ReloadingTrim.TextureScale; ReloadingTeamTint.TextureScale = Default.ReloadingTeamTint.TextureScale; ReloadingFill.TextureScale = Default.ReloadingFill.TextureScale; ReloadingTrim.PosX = Default.ReloadingTrim.PosX; ReloadingTeamTint.PosX = Default.ReloadingTeamTint.PosX; ReloadingFill.PosX = Default.ReloadingFill.PosX; ReloadingTrim.PosY = Default.ReloadingTrim.PosY; ReloadingTeamTint.PosY = Default.ReloadingTeamTint.PosY; ReloadingFill.PosY = Default.ReloadingFill.PosY; } SetHUDScale(); } function SetHUDScale() { local int i; local float NewPosX,NewPosY; OldHUDScale = HUDScale; if ( bSmallWeaponBar ) { HudScale *= 0.67; NewPosY = Default.WeaponBarTint[0].PosY + (1 - HUDScale) * 0.043; } else NewPosY = Default.WeaponBarTint[0].PosY; for( i=0; i (0.1 * i) ) { C.SetPos( 0.5 * BlockSize, PosY ); C.SetDrawColor( 28.3 * i, 255 - 28.3 * i, 0, 255 ); C.DrawTile( Tex, BlockSize, BlockSize, 0, 0, Tex.USize, Tex.VSize ); PosY -= 1.2 * BlockSize; } } } // Alpha Pass ================================================================================== simulated function DrawHudPassA (Canvas C) { local class AmmoClass; ShowPointBarBottom(C); if ( bSmallWeaponBar != bRealSmallWeaponBar ) SetSmallWeaponBar(); if ( HUDScale != OldHUDScale ) SetHUDScale(); if( bShowPersonalInfo ) { DrawSpriteWidget (C, LHud1[1]); DrawSpriteWidget (C, LHud2[1]); DrawSpriteWidget (C, Adrenaline[1] ); DrawSpriteWidget (C, LHud1[0]); DrawSpriteWidget (C, LHud2[0]); DrawSpriteWidget (C, LHud1[3]); DrawSpriteWidget (C, LHud2[3]); } if ( bShowWeaponBar && (PawnOwner.Weapon != None) ) DrawWeaponBar(C); if( bShowWeaponInfo && (PawnOwner.Weapon != None) ) { DrawSpriteWidget (C, RHud1[1]); DrawSpriteWidget (C, RHud2[1]); DrawSpriteWidget (C, RHud1[0]); DrawSpriteWidget (C, RHud2[0]); DrawSpriteWidget (C, RHud1[3]); DrawSpriteWidget (C, RHud2[3]); if ( PawnOwner.Weapon.bShowChargingBar ) { ReloadingFill.Scale = PawnOwner.Weapon.ChargeBar(); DrawSpriteWidget (C, ReloadingFill); DrawSpriteWidget (C, ReloadingTeamTint); DrawSpriteWidget (C, ReloadingTrim); } AmmoClass = PawnOwner.Weapon.GetAmmoClass(0); if( (AmmoClass != None) && (AmmoClass.Default.IconMaterial != None) ) { AmmoIcon.WidgetTexture = AmmoClass.Default.IconMaterial; AmmoIcon.TextureCoords = AmmoClass.Default.IconCoords; DrawSpriteWidget (C, AmmoIcon); } } if( bShowPersonalInfo && (ShieldCount.Value > 0) ) DrawSpriteWidget (C, ShieldIconGlow); if( Level.TimeSeconds - LastVoiceGainTime < 0.333 ) DisplayVoiceGain(C); } simulated function ShowPointBarTop(Canvas C) { if( bShowPoints ) { DrawSpriteWidget (C, ScoreBG[0]); DrawSpriteWidget (C, ScoreBG[3]); } } simulated function ShowPointBarBottom(Canvas C) { if( bShowPoints ) { DrawSpriteWidget (C, ScoreBG[2]); DrawSpriteWidget (C, ScoreBG[1]); } } // Alpha Pass ================================================================================== simulated function DrawHudPassC (Canvas C) { local float PortraitWidth,PortraitHeight, XL, YL, Abbrev, SmallH, NameWidth; local string PortraitString; // portrait if ( bShowPortrait && (Portrait != None) ) { PortraitWidth = 0.125 * C.ClipY; PortraitHeight = 1.5 * PortraitWidth; C.DrawColor = WhiteColor; C.SetPos(-PortraitWidth*PortraitX + 0.025*PortraitWidth,0.5*(C.ClipY-PortraitHeight) + 0.025*PortraitHeight); C.DrawTile( Portrait, PortraitWidth, PortraitHeight, 0, 0, 256, 384); C.SetPos(-PortraitWidth*PortraitX,0.5*(C.ClipY-PortraitHeight)); C.Font = GetFontSizeIndex(C,-2); PortraitString = PortraitPRI.PlayerName; C.StrLen(PortraitString,XL,YL); if ( XL > PortraitWidth ) { C.Font = GetFontSizeIndex(C,-4); C.StrLen(PortraitString,XL,YL); if ( XL > PortraitWidth ) { Abbrev = float(len(PortraitString)) * PortraitWidth/XL; PortraitString = left(PortraitString,Abbrev); C.StrLen(PortraitString,XL,YL); } } C.DrawColor = C.static.MakeColor(160,160,160); C.SetPos(-PortraitWidth*PortraitX + 0.025*PortraitWidth,0.5*(C.ClipY-PortraitHeight) + 0.025*PortraitHeight); C.DrawTile( Material'XGameShaders.ModuNoise', PortraitWidth, PortraitHeight, 0.0, 0.0, 512, 512 ); C.DrawColor = WhiteColor; C.SetPos(-PortraitWidth*PortraitX,0.5*(C.ClipY-PortraitHeight)); C.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxA1', 1.05 * PortraitWidth, 1.05*PortraitHeight); C.DrawColor = WhiteColor; C.SetPos(C.ClipY/256-PortraitWidth*PortraitX + 0.5 * (PortraitWidth - XL),0.5*(C.ClipY+PortraitHeight) + 0.06*PortraitHeight); if ( PortraitPRI != None ) { if ( PortraitPRI.Team != None ) { if ( PortraitPRI.Team.TeamIndex == 0 ) C.DrawColor = RedColor; else C.DrawColor = TurqColor; } C.DrawText(PortraitString,true); } } // Screen ShowPointBarTop(C); if( bShowPersonalInfo ) { DrawSpriteWidget (C, Adrenaline[0]); DrawSpriteWidget (C, Adrenaline[3]); DrawSpriteWidget (C, Adrenaline[4]); DrawNumericWidget (C, AdrenalineCount, DigitsBig); DrawSpriteWidget (C, AdrenalineIcon); if( PawnOwner.IsA ('XPawn') && (XPawn(PawnOwner).UDamageTime > Level.TimeSeconds) ) { UDamageFill.Scale = FMin((XPawn(PawnOwner).UDamageTime - Level.TimeSeconds) * 0.0333,1); DrawSpriteWidget (C, UDamageFill); DrawSpriteWidget (C, UDamageTeamTint); DrawSpriteWidget (C, UDamageTrim); } DrawSpriteWidget (C, HealthIcon); if( ShieldCount.Value > 0 ) { DrawSpriteWidget (C, ShieldIcon); DrawNumericWidget (C, ShieldCount, DigitsBig); } DrawNumericWidget (C, HealthCount, DigitsBig); } UpdateRankAndSpread(C); if( bShowWeaponInfo && (PawnOwner != None) && (PawnOwner.Weapon != None) ) { DrawNumericWidget (C, AmmoCount, DigitsBig); if ( bSmallWeaponBar ) PawnOwner.Weapon.NewDrawWeaponInfo(C, 0.87*C.ClipX); else PawnOwner.Weapon.NewDrawWeaponInfo(C, 0.705*C.ClipX); } if ( (PawnOwner != PlayerOwner.Pawn) && (PawnOwner != None) && (PawnOwner.PlayerReplicationInfo != None) ) { // draw viewed player name C.Font = GetMediumFontFor(C); C.SetDrawColor(255,255,0,255); C.StrLen(PawnOwner.PlayerReplicationInfo.PlayerName,NameWidth,SmallH); NameWidth = FMax(NameWidth, 0.15 * C.ClipX); if ( C.ClipX >= 640 ) { C.Font = GetConsoleFont(C); C.StrLen("W",XL,SmallH); C.SetPos(79*C.ClipX/80 - NameWidth,C.ClipY * 0.68); C.DrawText(NowViewing,false); } C.Font = GetMediumFontFor(C); C.SetPos(79*C.ClipX/80 - NameWidth,C.ClipY * 0.68 + SmallH); C.DrawText(PawnOwner.PlayerReplicationInfo.PlayerName,false); } DrawCrosshair(C); } simulated function DrawWeaponBar( Canvas C ) { local int i; local Weapon Weapons[WEAPON_BAR_SIZE]; local Inventory Inv; local Weapon W, PendingWeapon; local int Count; local float RealHUDScale; local float NewPosX,NewPosY, SavedPosY, AddPosX; if (PawnOwner.PendingWeapon != None) PendingWeapon = PawnOwner.PendingWeapon; else PendingWeapon = PawnOwner.Weapon; // fill: for( Inv=PawnOwner.Inventory; Inv!=None; Inv=Inv.Inventory ) { W = Weapon( Inv ); Count++; if ( Count > 100 ) break; if( W == None ) continue; if( W.IconMaterial == None ) continue; if ( W.InventoryGroup == 0 ) Weapons[8] = W; else if ( W.InventoryGroup < 10 ) Weapons[W.InventoryGroup-1] = W; } if ( PendingWeapon != None ) { if ( PendingWeapon.InventoryGroup == 0 ) Weapons[8] = PendingWeapon; else if ( PendingWeapon.InventoryGroup < 10 ) Weapons[PendingWeapon.InventoryGroup-1] = PendingWeapon; } if ( bSmallWeaponBar ) { RealHUDScale = HUDScale; HudScale *= 0.67; SavedPosY = Default.WeaponBarTint[0].PosY + (1 - HUDScale) * 0.043; } // Draw: for( i=0; i 0 ) return; NewPortrait = PRI.GetPortrait(); if ( NewPortrait == None ) return; if ( Portrait == None ) PortraitX = 1; Portrait = NewPortrait; PortraitTime = Level.TimeSeconds + 3; PortraitPRI = PRI; } simulated function Message( PlayerReplicationInfo PRI, coerce string Msg, name MsgType ) { Super.Message(PRI,Msg,MsgType); if ( PRI != None && (MsgType == 'Say') || (MsgType == 'TeamSay') ) DisplayPortrait(PRI); } simulated function font LoadLevelActionFont() { if( LevelActionFontFont == None ) { LevelActionFontFont = Font(DynamicLoadObject(LevelActionFontName, class'Font')); if( LevelActionFontFont == None ) Log("Warning: "$Self$" Couldn't dynamically load font "$LevelActionFontName); } return LevelActionFontFont; } F_A;]!d(fc9:]!,c,-c, M GF_0Qd^!!w0^!_!_%K_7E_&D]_c,_%_,.&._1_k_%_,.,._1_a_%"_,.&._1__%a_,.,._1_).&a'.,a'.,.,1.,.,1.,.,1.,a'_,E_,.,._1_ .,a'_,_,., ._1_e., a' Gj Z;dH|>)E;0Gj h-ŏ3}ɢɢɢɢI՟I՟I՟zVGBJI՟J u u3}ɢɢɢɢI՟I՟ uzVGBI՟JI՟zVGBI՟I՟ uzVGBI՟JI՟zVGBҽI՟ҽI՟ i NlZ _Z""p" "F_$>$?$""$?*F_l _Z""p" "F_$>$?$""$?*F__jIY gZ _Z"N"" "7F_$?$?$Q8=""$?*F_g _Z"N"" "7F_$?$?$Q8=""$?*<<dF_g _Z"N"" "7F_$?$?$Q8=""$?*d< 9 ) ScoreTeam[1].OffsetX += 90; } simulated function UpdateTeamHud() { local NavigationPoint N; if (DP1 == None || DP2 == None) { for (N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint) { if (!N.IsA('xDomPoint')) continue; if (N.IsA('xDomPointA') && DP1 == None) DP1 = xDomPoint(N); else DP2 = xDomPoint(N); } } // Point A state if (!DP1.bControllable) Points[0].PointState = PS_Disabled; else if (DP1.ControllingTeam == None) Points[0].PointState = PS_Neutral; else if ( PlayerOwner.PlayerReplicationInfo.Team == None ) { if ( DP1.ControllingTeam.TeamIndex == 0 ) Points[0].PointState = PS_HeldFriendly; else Points[0].PointState = PS_HeldEnemy; } else if (DP1.ControllingTeam == PawnOwnerPRI.Team) Points[0].PointState = PS_HeldFriendly; else Points[0].PointState = PS_HeldEnemy; // Point B state if (!DP2.bControllable) Points[1].PointState = PS_Disabled; else if (DP2.ControllingTeam == None) Points[1].PointState = PS_Neutral; else if ( PlayerOwner.PlayerReplicationInfo.Team == None ) { if ( DP2.ControllingTeam.TeamIndex == 0 ) Points[1].PointState = PS_HeldFriendly; else Points[1].PointState = PS_HeldEnemy; } else if (DP2.ControllingTeam == PawnOwnerPRI.Team) Points[1].PointState = PS_HeldFriendly; else Points[1].PointState = PS_HeldEnemy; Super.UpdateTeamHUD(); } function Timer() { local NavigationPoint N; Super.Timer(); if ((PlayerOwner == None) || (PawnOwner == None) || (PawnOwnerPRI == None)) return; if (DP1 == None || DP2 == None) { for (N = Level.NavigationPointList; N != None; N = N.NextNavigationPoint) { if (!N.IsA ('xDomPoint')) continue; if (N.IsA('xDomPointA')) DP1 = xDomPoint(N); else DP2 = xDomPoint(N); } } if (DP1.ControllingTeam == DP2.ControllingTeam) { if (DP1.ControllingTeam != None) { if (PawnOwnerPRI.Team.TeamIndex == DP1.ControllingTeam.TeamIndex) PlayerOwner.ReceiveLocalizedMessage (class'xDomMessage', 0); else PlayerOwner.ReceiveLocalizedMessage (class'xDomMessage', 1); } } } F_@F_F_xX;A`b rAW "KXInterface.GUIQuestionPage_.I ]c_nW!newQc_ncoldZI_`c$0$ E_E Dk'}qrA| rASl "KXInterface.GUIQuestionPage_.I ]_`U!$0$ E_E Dl'}xAU' GF__;nM :3n7{j Sa76nn{j a6nn{j9:r  J r a76nn{j76nn{j76nn{j&76Wn{j76Wn{j&76yn{j76yn{j&a76nn{j&a6nn{j9:r a6Wn{jc,"KeyName9Rr a6yn{jc,!"LOCALIZEDKEYNAME9Rr c,;"SET Inputa6Wn{j6tn{jUn GF__F_F_`;eU0Hke%e7{j(Q ]bE(Q G z %z 76ne{jzG G pEez G ppG , Eez z z(Qpp\!G Z! ]bE(Q GF_b; J w/D %D 7{j~ 76nD {j&x~ %n~ 6nD {j9: KD ~ ~ 1D  GF_\;{ kpm9:{ ,e c,稨SINGLEPLAYER Teammate in spot9SZ isZ e Z e Q稨SINGLEPLAYER Teammate in spot9SZ is -now-Z e c,e .C ]\ b  M GF_c;H Ks-MH 7{jq 76nH {jq 6nH {j% c,)"SET Inputq 6WH {jA6nH {jq &A6WH {jq &A6yH {jq & GF_e;y I  ,c ( c (&v-6qc {j( 3c  c ( 3y  GF_a;u l  9:u , M GF_h;v H |*g ( gg %]-6qg {j( 3g  g ( 3v  GF_d;r ]E.3r DEGN-\c,sE| $h 6D~6D.&%a$^ axPlayersh TDad GF_s F_F_l;G G BW%'9:G ,  9:K,a*'A9:G , 9:K, Rh%,d% Rh,,dK( %"" Rh%,d% Rh,,dK( &U( '9:K&<9:G ,% 9:G ,d 9:G ,' 9:G ,fu%u&u%U( 'n ( -s (_G Kq ( n -6q( {j( n H n I n U(  GF_F F_F_D F_F_@"f;U Tt c,Rw6U  1ww U  1ww 9S U  1ww 9S U  1ww 9S U  1ww 9S U  1w}RzcGw6zH} 1ww z} 1ww 9S z} 1ww 9S z} 1ww 9S z} 1ww 9S z} 1w GF_n;vF  A 7{j i Rh%,d% Rh,,d-@' y -LH-@ Rh%,d% Rh,,du%@@ Rh%,d% Rh,,du&-@'-@( w ( 7{j$-6q( {j( 3w-@/-L( w( 3wmw( U( w( -6qA {jv %&a9?,v D v$$$J$vYa%  ,&a%&a9?,F ??(AwUMv$%&aY!D ,&a%&aF $6TA {j(SmF(AVUMv?&c6D &c4F $6TA {j(Sm(ATUMv?,c6D ,c4F $EA %(Sm(ATUMv?,c6D ,c4F $EA &(Sm-j -6qA {jou%A9D,c6B9D,c4u&A9D,c6B9D,c4-LR%NMv$9?AD 9?BF R%NMv$9?AD 9?BF UA  GF_@F_F_{;UEU7{j*-6qU{jPUY G[???nG76nU{jG6yU{j GF_I// ==================================================================== // (C) 2002, Epic Games // ==================================================================== class ExtendedConsole extends Console; #exec OBJ LOAD FILE=MenuSounds.uax #exec OBJ LOAD FILE=InterfaceContent.utx // Visible Console stuff var globalconfig int MaxScrollbackSize; var array Scrollback; var int SBHead, SBPos; // Where in the scrollback buffer are we var bool bCtrl, bAlt, bShift; var bool bConsoleHotKey; var float ConsoleSoundVol; var localized string AddedCurrentHead; var localized string AddedCurrentTail; var localized string ServerFullMsg; ////// Speech Menu var float SMLineSpace; var enum ESpeechMenuState { SMS_Main, SMS_VoiceChat, // List of voice chat groups on the server SMS_Ack, SMS_FriendFire, SMS_Order, SMS_Other, SMS_Taunt, SMS_TauntAnim, SMS_PlayerSelect, SMS_VoiceChatChannel // List of options for this channel (public & private) } SMState; // These are put together using the menu and sent to the 'Speech' exec command. var name SMType; var int SMIndex; var string SMCallsign; var int SMOffset; var string SMNameArray[48]; var int SMIndexArray[48]; var int SMArraySize; var config float SMOriginX; var config float SMOriginY; var float SMMargin, SMTab; var localized string SMStateName[10]; var localized string SMChannelOptions[3]; var array VoiceChannels; var localized string SMAllString; var localized string SMMoreString; var sound SMOpenSound; var sound SMAcceptSound; var sound SMDenySound; var config EInputKey LetterKeys[10]; var EInputKey NumberKeys[10]; var config bool bSpeechMenuUseLetters; var config bool bSpeechMenuUseMouseWheel; var bool bSpeechMenuLocked; var int HighlightRow; ////// End Speech Menu struct StoredPassword { var config string Server, Password; }; struct ServerFavorite { var() config int ServerID; var() config string IP; var() config int Port; var() config int QueryPort; var() config string ServerName; }; var() protected config array Favorites; var config array SavedPasswords; var config string PasswordPromptMenu; var string LastConnectedServer, LastURL; struct ChatStruct { var string Message; var int team; }; var array ChatMessages; var config string ChatMenuClass; var transient GUIPage ChatMenu; var bool bTeamChatOnly; var transient UT2MusicManager MusicManager; // Obsolete var config string StatsPromptMenuClass; // Menu that appears when connecting to a stats enabled server var config string MusicManagerClassName; var config string WaitingGameClassName; var config string NeedPasswordMenuClass; // Menu that appears when connecting to a passworded server var config string ServerInfoMenu; // Menu that appears when press F2 delegate OnChat(string Msg, int TeamIndex); function OnStatsClosed(optional bool bCancelled) { if ( bCancelled ) return; OnStatsConfigured(); } function OnStatsConfigured() { // DelayedConsoleCommand("reconnect"); ViewportOwner.GUIController.CloseAll(false); ViewportOwner.Actor.ClientTravel(LastURL,TRAVEL_Absolute,false); } event ConnectFailure(string FailCode,string URL) { local string Error, Server; local int i,Index; LastURL = URL; Server = Left(URL,InStr(URL,"/")); i = instr(FailCode," "); if (i>0) { Error = Right(FailCode,len(FailCode)-i-1); FailCode = Left(FailCode,i); } log("Connect Failure: "@FailCode$"["$Error$"] ("$URL$")",'Debug'); if(FailCode == "NEEDPW") { for(Index = 0;Index < SavedPasswords.Length;Index++) { if(SavedPasswords[Index].Server == Server) { ViewportOwner.Actor.ClearProgressMessages(); ViewportOwner.Actor.ClientTravel(URL$"?password="$SavedPasswords[Index].Password,TRAVEL_Absolute,false); return; } } LastConnectedServer = Server; if ( ViewportOwner.GUIController.OpenMenu(NeedPasswordMenuClass, URL, FailCode) ) return; } else if(FailCode == "WRONGPW") { ViewportOwner.Actor.ClearProgressMessages(); for(Index = 0;Index < SavedPasswords.Length;Index++) { if(SavedPasswords[Index].Server == Server) { SavedPasswords.Remove(Index,1); SaveConfig(); } } LastConnectedServer = Server; if ( ViewportOwner.GUIController.OpenMenu(NeedPasswordMenuClass, URL, FailCode) ) return; } else if(FailCode == "NEEDSTATS") { ViewportOwner.Actor.ClearProgressMessages(); if ( ViewportOwner.GUIController.OpenMenu(StatsPromptMenuClass, "", FailCode) ) { GUIController(ViewportOwner.GUIController).ActivePage.OnReopen = OnStatsConfigured; return; } } else if ( FailCode == "LOCALBAN" ) { ViewportOwner.Actor.ClearProgressMessages(); ViewportOwner.GUIController.OpenMenu(class'GameEngine'.default.DisconnectMenuClass,Localize("Errors","ConnectionFailed","Engine"),class'AccessControl'.default.IPBanned); return; } else if ( FailCode == "SESSIONBAN" ) { ViewportOwner.Actor.ClearProgressMessages(); ViewportOwner.GUIController.OpenMenu(class'GameEngine'.default.DisconnectMenuClass,Localize("Errors","ConnectionFailed","Engine"),class'AccessControl'.default.SessionBanned); return; } else if ( FailCode == "SERVERFULL" ) { ViewportOwner.Actor.ClearProgressMessages(); ViewportOwner.GUIController.OpenMenu(class'GameEngine'.default.DisconnectMenuClass,ServerFullMsg); return; } else if ( FailCode == "CHALLENGE" ) { ViewportOwner.Actor.ClearProgressMessages(); ViewportOwner.Actor.ClientNetworkMessage("FC_Challege",""); return; } log("Unhandled connection failure! FailCode '"$FailCode@"' URL '"$URL$"'"); ViewportOwner.Actor.ProgressCommand("menu:"$class'GameEngine'.default.DisconnectMenuClass,FailCode,Error); } event NotifyLevelChange() { Super.NotifyLevelChange(); if ( VoiceChannels.Length > 0 ) VoiceChannels.Remove(0, VoiceChannels.Length); } ////// End Speech Menu exec function CLS() { SBHead = 0; ScrollBack.Remove(0,ScrollBack.Length); } function PostRender( canvas Canvas ); // Subclassed in state function Chat(coerce string Msg, float MsgLife, PlayerReplicationInfo PRI) { local int index; Message(Msg,MsgLife); // For compatibility Index = ChatMessages.Length; ChatMessages.Length = Index+1; ChatMessages[Index].Message = Msg; if ( (PRI != None) && (PRI.Team!=None) ) ChatMessages[Index].Team = PRI.Team.TeamIndex; else ChatMessages[Index].Team = 2; if ( (!bTeamChatOnly) || (PRI == None) || (PRI.Team==None) || (PRI.Team == ViewportOwner.Actor.PlayerReplicationInfo.Team) ) { OnChat(Msg, ChatMessages[Index].team); OnChatMessage(Msg); } if (ChatMessages.Length>100) ChatMessages.Remove(0,1); } delegate OnChatMessage(string Msg); event Message( coerce string Msg, float MsgLife) { if (ScrollBack.Length==MaxScrollBackSize) // if full, Remove Entry 0 { ScrollBack.Remove(0,1); SBHead = MaxScrollBackSize-1; } else SBHead++; ScrollBack.Length = ScrollBack.Length + 1; Scrollback[SBHead] = Msg; Super.Message(Msg,MsgLife); } event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { if (Key==ConsoleHotKey) { if(Action==IST_Release) ConsoleOpen(); return true; } return Super.KeyEvent(Key,Action,Delta); } function PlayConsoleSound(Sound S) { if(ViewportOwner == None || ViewportOwner.Actor == None || ViewportOwner.Actor.Pawn == None) return; ViewportOwner.Actor.ClientPlaySound(S);//,true,ConsoleSoundVol); } //----------------------------------------------------------------------------- // State used while typing a command on the console. event NativeConsoleOpen() { ConsoleOpen(); } exec function ConsoleOpen() { UnPressButtons(); TypedStr = ""; TypedStrPos = 0; bCtrl = False; bAlt = False; bShift = False; GotoState('ConsoleVisible'); PlayConsoleSound(SMOpenSound); } exec function ConsoleClose() { TypedStr=""; TypedStrPos = 0; bCtrl = False; bAlt = False; bShift = False; if( GetStateName() == 'ConsoleVisible' ) { PlayConsoleSound(SMDenySound); GotoState( '' ); } } exec function ConsoleToggle() { log("console toggle"); UnPressButtons(); if( GetStateName() == 'ConsoleVisible' ) ConsoleClose(); else ConsoleOpen(); } state ConsoleVisible { function bool KeyType( EInputKey Key, optional string Unicode ) { local PlayerController PC; if (bIgnoreKeys || bConsoleHotKey) return true; if (ViewportOwner != none) PC = ViewportOwner.Actor; if (bCtrl && PC != none) { if (Key == 3) //copy { PC.CopyToClipboard(TypedStr); return true; } else if (Key == 22) //paste { TypedStr $= PC.PasteFromClipboard(); TypedStrPos += Len(PC.PasteFromClipboard()); return true; } else if (Key == 24) // cut { PC.CopyToClipboard(TypedStr); TypedStr=""; TypedStrPos = 0; return true; } } if( Key>=0x20 ) { if( Unicode != "" ) TypedStr = Left(TypedStr, TypedStrPos) $ Unicode $ Right(TypedStr, Len(TypedStr) - TypedStrPos); else TypedStr = Left(TypedStr, TypedStrPos) $ Chr(Key) $ Right(TypedStr, Len(TypedStr) - TypedStrPos); TypedStrPos++; return( true ); } return( true ); } function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local string Temp; local int i; if ( Action == IST_Release ) { if ( Key == ConsoleHotKey ) { if ( bConsoleHotKey ) ConsoleClose(); return True; } switch ( Key ) { case IK_Ctrl: bCtrl = False; break; case IK_Alt: bAlt = False; break; case IK_Shift: bShift = False; break; case IK_Escape: if ( TypedStr != "" ) { TypedStr = ""; TypedStrPos = 0; HistoryCur = HistoryTop; } else ConsoleClose(); return True; default: return True; } } else if ( Action == IST_Press ) { bIgnoreKeys = False; if ( Key == ConsoleHotKey ) { bConsoleHotKey = True; return True; } switch ( Key ) { case IK_Ctrl: bCtrl = True; break; case IK_Alt: bAlt = True; break; case IK_Shift: bShift = True; break; case IK_Escape: return True; case IK_Enter: if( TypedStr!="" ) { // Print to console. History[HistoryTop] = TypedStr; HistoryTop = (HistoryTop+1) % ArrayCount(History); if ( ( HistoryBot == -1) || ( HistoryBot == HistoryTop ) ) HistoryBot = (HistoryBot+1) % ArrayCount(History); HistoryCur = HistoryTop; // Make a local copy of the string. Temp=TypedStr; TypedStr=""; TypedStrPos=0; if( !ConsoleCommand( Temp ) ) Message( Localize("Errors","Exec","Core"), 6.0 ); Message( "", 6.0 ); } return true; case IK_Up: if ( HistoryBot >= 0 ) { if (HistoryCur == HistoryBot) HistoryCur = HistoryTop; else { HistoryCur--; if (HistoryCur<0) HistoryCur = ArrayCount(History)-1; } TypedStr = History[HistoryCur]; TypedStrPos = Len(TypedStr); } return true; case IK_Down: if ( HistoryBot >= 0 ) { if (HistoryCur == HistoryTop) HistoryCur = HistoryBot; else HistoryCur = (HistoryCur+1) % ArrayCount(History); TypedStr = History[HistoryCur]; TypedStrPos = Len(TypedStr); } return True; case IK_Backspace: if( TypedStrPos > 0 ) { TypedStr = Left(TypedStr,TypedStrPos-1)$Right(TypedStr, Len(TypedStr) - TypedStrPos); TypedStrPos--; } return true; case IK_Delete: if ( TypedStrPos < Len(TypedStr) ) TypedStr = Left(TypedStr,TypedStrPos)$Right(TypedStr, Len(TypedStr) - TypedStrPos - 1); return true; case IK_Left: i = TypedStrPos - 1; if ( bCtrl ) while ( i > 0 && Mid(TypedStrPos,i,1) != " " ) i--; TypedStrPos = Max(0, i); return true; case IK_Right: i = TypedStrPos + 1; if ( bCtrl ) while ( i <= Len(TypedStr) && Mid(TypedStr,i,1) != " " ) i++; TypedStrPos = Min(Len(TypedStr), i); return true; case IK_Home: TypedStrPos = 0; return true; case IK_End: TypedStrPos = Len(TypedStr); return true; case IK_PageUp: case IK_MouseWheelUp: if (SBPos=ScrollBack.Length) SBPos = ScrollBack.Length-1; } return true; case IK_PageDown: case IK_MouseWheelDown: if (SBPos>0) { if (bCtrl) SBPos-=5; else SBPos--; if (SBPos<0) SBPos = 0; } } } return True; } function BeginState() { SBPos = 0; bVisible= true; bIgnoreKeys = true; bConsoleHotKey = false; HistoryCur = HistoryTop; bCtrl = false; } function EndState() { bVisible = false; bCtrl = false; bConsoleHotKey = false; } function PostRender( canvas Canvas ) { local float fw,fh; local float yclip,y; local int idx; Canvas.Font = class'HudBase'.static.GetConsoleFont(Canvas); yclip = canvas.ClipY*0.5; Canvas.StrLen("X",fw,fh); Canvas.SetPos(0,0); Canvas.SetDrawColor(255,255,255,200); Canvas.Style=4; Canvas.DrawTileStretched(material'ConsoleBack',Canvas.ClipX,yClip); Canvas.Style=1; Canvas.SetPos(0,yclip-1); Canvas.SetDrawColor(255,255,255,255); Canvas.DrawTile(texture 'InterfaceContent.Menu.BorderBoxA',Canvas.ClipX,2,0,0,64,2); Canvas.SetDrawColor(255,255,255,255); Canvas.SetPos(0,yclip-5-fh); Canvas.DrawTextClipped("(>"@Left(TypedStr, TypedStrPos)$chr(4)$Eval( TypedStrPos < Len(TypedStr), Mid(TypedStr, TypedStrPos), "_"), true); idx = SBHead - SBPos; y = yClip-y-5-(fh*2); if (ScrollBack.Length==0) return; Canvas.SetDrawColor(255,255,255,255); while (y>fh && idx>=0) { Canvas.SetPos(0,y); Canvas.DrawText(Scrollback[idx],false); idx--; y-=fh; } } } //---------------------------------------------------------------------------------------------------------------// //---------------------------------------------------------------------------------------------------------------// //---------------------------------------------------------------------------------------------------------------// delegate OnExecAddFavorite( ServerFavorite Fav ); exec function AddCurrentToFavorites() { local string address, ipString, portString; local int colonPos, portNum; local ServerFavorite NewFav; if( ViewportOwner == None || ViewportOwner.Actor == None ) return; // Get current network address address = ViewportOwner.Actor.GetServerNetworkAddress(); if(address == "") return; // Parse text to find IP and possibly port number colonPos = InStr(address, ":"); if(colonPos < 0) { // No colon - assume port 7777 ipString = address; portNum = 7777; } else { // Parse out port number ipString = Left(address, colonPos); portString = Mid(address, colonPos+1); portNum = int(portString); } NewFav.IP = ipString; NewFav.Port = portNum; NewFav.QueryPort = portNum + 1; if ( AddFavorite( NewFav ) ) ViewportOwner.Actor.ClientMessage(AddedCurrentHead@address@AddedCurrentTail); OnExecAddFavorite( NewFav ); } static function bool InFavorites( ServerFavorite Fav ) { local int i; if ( Fav.IP == "" ) return false; if ( Fav.Port == 0 ) Fav.Port = 7777; if ( Fav.QueryPort == 0 ) Fav.QueryPort = Fav.Port + 1; for ( i = 0; i < default.Favorites.Length; i++ ) { if ( Fav.IP == default.Favorites[i].IP && Fav.Port == default.Favorites[i].Port && Fav.QueryPort == default.Favorites[i].QueryPort ) return true; } return false; } // Returns true only if this was a new server static function bool AddFavorite( ServerFavorite NewFav ) { local int i; local bool bNew; if ( NewFav.IP == "" ) return false; if ( NewFav.Port == 0 ) NewFav.Port = 7777; if ( NewFav.QueryPort == 0 ) NewFav.QueryPort = NewFav.Port + 1; bNew = True; for ( i = 0; i < default.Favorites.Length; i++ ) { if ( NewFav.IP == default.Favorites[i].IP && NewFav.Port == default.Favorites[i].Port && NewFav.QueryPort == default.Favorites[i].QueryPort ) { if ( NewFav.ServerName ~= default.Favorites[i].ServerName ) return false; bNew = False; break; } } default.Favorites[i] = NewFav; StaticSaveConfig(); return bNew; } static function bool RemoveFavorite( string IP, int Port, int QueryPort ) { local int i; for ( i = 0; i < default.Favorites.Length; i++ ) { if ( default.Favorites[i].IP == IP && default.Favorites[i].Port == Port && default.Favorites[i].QueryPort == QueryPort ) { default.Favorites.Remove(i,1); StaticSaveConfig(); return true; } } return false; } static function GetFavorites( out array List ) { List = default.Favorites; } static function SaveFavorites() { // TODO: Add bDirty tracking, to only save if favorites have actually been modified StaticSaveConfig(); } //---------------------------------------------------------------------------------------------------------------// //---------------------------------------------------------------------------------------------------------------// //---------------------------------------------------------------------------------------------------------------// exec function SpeechMenuToggle() { // Don't show speech menu if no voice pack type if( ViewportOwner.Actor.PlayerReplicationInfo.bOnlySpectator || (ViewportOwner.Actor.PlayerReplicationInfo.VoiceType == None) ) return; GotoState('SpeechMenuVisible'); } state SpeechMenuVisible { exec function SpeechMenuToggle() { GotoState(''); } function bool KeyType( EInputKey Key, optional string Unicode ) { if (bIgnoreKeys) return true; return false; } function class GetVoiceClass() { if(ViewportOwner == None || ViewportOwner.Actor == None || ViewportOwner.Actor.PlayerReplicationInfo == None) return None; return class(ViewportOwner.Actor.PlayerReplicationInfo.VoiceType); } // JTODO: Bubble sort. Sorry. But I already wrote the GUIList sort today and its late. function SortSMArray() { local int i,j, tmpInt; local string tmpString; for(i=0; i SMNameArray[j]) { tmpString = SMNameArray[i]; SMNameArray[i] = SMNameArray[j]; SMNameArray[j] = tmpString; tmpInt = SMIndexArray[i]; SMIndexArray[i] = SMIndexArray[j]; SMIndexArray[j] = tmpInt; } } } } // Rebuild the array of options based on the state we are now in. function RebuildSMArray() { local int i, index; local class tvp; local GameReplicationInfo GRI; local PlayerReplicationInfo MyPRI; local VoiceChatReplicationInfo VRI; local UnrealPlayer up; local name GameMesgGroup; local Pawn TauntPawn; local bool bShowJoin, bShowLeave, bShowTalk; SMArraySize = 0; SMOffset=0; tvp = GetVoiceClass(); if(tvp == None) return; //Log("TVP:"$tvp$" NumTaunts:"$tvp.Default.numTaunts); switch (SMState) { case SMS_Main: if ( VoiceChatAllowed() ) { SMNameArray[SMArraySize] = SMStateName[1]; SMIndexArray[SMArraySize] = 1; SMArraySize++; } if ( ViewportOwner.Actor.PlayerReplicationInfo != None && !ViewportOwner.Actor.PlayerReplicationInfo.bOnlySpectator ) { for(i=2; i<7; i++) { SMNameArray[SMArraySize] = SMStateName[i]; SMIndexArray[SMArraySize] = i; SMArraySize++; } if ( (ViewportOwner.Actor.Pawn != None) && !ViewportOwner.Actor.Pawn.IsA('RedeemerWarhead') ) { SMNameArray[SMArraySize] = SMStateName[7]; SMIndexArray[SMArraySize] = 7; SMArraySize++; } } if ( SMArraySize == 0 ) GotoState(''); break; case SMS_Taunt: for(i=0; i 9) SMOffset += 9; return; } // Previous page on the same level if(keyIn == -2) { SMOffset = Max(SMOffset - 9, 0); return; } // Otherwise - we have selected something! selectIndex = SMOffset + keyIn - 1; if(selectIndex < 0 || selectIndex >= SMArraySize) // discard - out of range selections. return; switch ( SMState ) { case SMS_Order: SMIndex = SMIndexArray[selectIndex]; EnterState(SMS_PlayerSelect); break; case SMS_VoiceChat: SMIndex = SMIndexArray[selectIndex]; EnterState(SMS_VoiceChatChannel); break; case SMS_VoiceChatChannel: VRI = ViewportOwner.Actor.VoiceReplicationInfo; if (VRI == None) return; // Perform the action selected switch ( SMIndex ) { case 0: // Join Channel ViewportOwner.Actor.Join(SMNameArray[selectIndex],""); break; case 1: // Leave Channel ViewportOwner.Actor.Leave(SMNameArray[selectIndex]); break; case 2: ViewportOwner.Actor.Speak(SMNameArray[selectIndex]); break; } // Add confirmation PlayConsoleSound(SMAcceptSound); CloseSpeechMenu(); break; case SMS_PlayerSelect: if(SMNameArray[selectIndex] == SMAllString) ViewportOwner.Actor.Speech(SMType, SMIndex, ""); else ViewportOwner.Actor.Speech(SMType, SMIndex, SMNameArray[selectIndex]); PlayConsoleSound(SMAcceptSound); CloseSpeechMenu(); // Close menu after message break; case SMS_TauntAnim: up = UnrealPlayer(ViewportOwner.Actor); if ( Vehicle(up.Pawn) != None ) TauntPawn = Vehicle(up.Pawn).Driver; else TauntPawn = up.Pawn; up.Taunt( TauntPawn.TauntAnims[ SMIndexArray[selectIndex] ] ); PlayConsoleSound(SMAcceptSound); CloseSpeechMenu(); break; default: ViewportOwner.Actor.Speech(SMType, SMIndexArray[selectIndex], ""); PlayConsoleSound(SMAcceptSound); CloseSpeechMenu(); } } ////////////////////////////////////////////// function string NumberToString(int num) { local EInputKey key; local string s; if(num < 0 || num > 9) return ""; if(bSpeechMenuUseLetters) key = LetterKeys[num]; else key = NumberKeys[num]; s = ViewportOwner.Actor.ConsoleCommand( "LOCALIZEDKEYNAME"@string(int(key)) ); return s; } function DrawNumbers( canvas Canvas, int NumNums, bool IncZero, bool sizing, out float XMax, out float YMax ) { local int i; local float XPos, YPos; local float XL, YL; XPos = Canvas.ClipX * (SMOriginX+SMMargin); YPos = Canvas.ClipY * (SMOriginY+SMMargin); Canvas.SetDrawColor(128,255,128,255); for(i=0; i SMArraySize ) return false; if ( SMIndexArray[i] != ViewportOwner.Actor.ActiveRoom.ChannelIndex ) return false; return true; } function bool IsMember(int i) { if ( SMState != SMS_VoiceChatChannel ) return false; if ( ViewportOwner.Actor == None || ViewportOwner.Actor.VoiceReplicationInfo == None || ViewportOwner.Actor.PlayerReplicationInfo == None ) return false; return ViewportOwner.Actor.VoiceReplicationInfo.IsMember(ViewportOwner.Actor.PlayerReplicationInfo, SMIndexArray[i]); } ////////////////////////////////////////////// function int KeyToNumber(EInputKey InKey) { local int i; for(i=0; i<10; i++) { if(bSpeechMenuUseLetters) { if(InKey == LetterKeys[i]) return i; } else { if(InKey == NumberKeys[i]) return i; } } return -1; } function bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local int input, NumNums; NumNums = Min(SMArraySize - SMOffset, 10); // While speech menu is up, dont let user use console. Debateable. //if( KeyIsBoundTo( Key, "ConsoleToggle" ) ) // return true; //if( KeyIsBoundTo( Key, "Type" ) ) // return true; if (Action == IST_Press) { bIgnoreKeys=false; if ( Key == IK_Ctrl ) bCtrl = True; else if ( Key == IK_Alt ) bAlt = True; else if ( key == IK_Shift ) bShift = True; } if ( Action == IST_Release ) { if ( bAlt ) { if ( Key == IK_Left ) // extra mouse buttons - only tested this on logitech mx500 :\ { HandleInput(-1); return True; } else if ( Key == IK_Right ) { input = HighlightRow + 1; if(input == 10) input = 0; HighlightRow=0; HandleInput(input); return True; } } } if( Action != IST_Press ) return false; if( Key==IK_Escape) { HandleInput(-1); return true ; } // If 'letters' mode is on, convert input input = KeyToNumber(Key); if(input != -1) { HandleInput(input); return true; } // Keys below are only used if bSpeechMenuUseMouseWheel is true if(!bSpeechMenuUseMouseWheel) return false; if( Key==IK_MouseWheelUp ) { // If moving up on the top row, and there is a previous page if(HighlightRow == 0 && SMOffset > 0) { HandleInput(-2); HighlightRow=9; } else { HighlightRow = Max(HighlightRow - 1, 0); } return true; } else if( Key==IK_MouseWheelDown ) { // If moving down on the bottom row (the 'MORE' row), act as if we hit it, and move highlight to top. if(HighlightRow == 9) { HandleInput(0); HighlightRow=0; } else { HighlightRow = Min(HighlightRow + 1, NumNums - 1); } return true; } else if( Key==IK_MiddleMouse ) { input = HighlightRow + 1; if(input == 10) input = 0; HighlightRow=0; HandleInput(input); return true; } return false; } function Font MyGetSmallFontFor(canvas Canvas) { local int i; for(i=1; i<8; i++) { if ( class'HudBase'.default.FontScreenWidthSmall[i] <= Canvas.ClipX ) return class'HudBase'.static.LoadFontStatic(i-1); } return class'HudBase'.static.LoadFontStatic(7); } function PostRender( canvas Canvas ) { local float XL, YL; local int SelLeft, i; local float XMax, YMax; Canvas.Font = class'UT2MidGameFont'.static.GetMidGameFont(Canvas.ClipX); // Update which font to use. // Figure out max key name size XMax = 0; YMax = 0; for(i=0; i<10; i++) { Canvas.TextSize(NumberToString(i)$"- ", XL, YL); XMax = Max(XMax, XL); YMax = Max(YMax, YL); } SMLineSpace = YMax * 1.1; SMTab = XMax; SelLeft = SMArraySize - SMOffset; // First we figure out how big the bounding box needs to be XMax = 0; YMax = 0; DrawNumbers( canvas, Min(SelLeft, 9), SelLeft > 9, true, XMax, YMax); DrawCurrentArray( canvas, true, XMax, YMax); Canvas.TextSize(SMStateName[SMState], XL, YL); XMax = Max(XMax, Canvas.ClipX*(SMOriginX+SMMargin) + XL); YMax = Max(YMax, (Canvas.ClipY*SMOriginY) - (1.2*SMLineSpace) + YL); // XMax, YMax now contain to maximum bottom-right corner we drew to. // Then draw the box XMax -= Canvas.ClipX * SMOriginX; YMax -= Canvas.ClipY * SMOriginY; Canvas.SetDrawColor(255,255,255,255); Canvas.SetPos(Canvas.ClipX * SMOriginX, Canvas.ClipY * SMOriginY); Canvas.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxD', XMax + (SMMargin*Canvas.ClipX), YMax + (SMMargin*Canvas.ClipY)); // Draw highlight if(bSpeechMenuUseMouseWheel) { Canvas.SetDrawColor(255,255,255,128); Canvas.SetPos( Canvas.ClipX*SMOriginX, Canvas.ClipY*(SMOriginY+SMMargin) + ((HighlightRow - 0.1)*SMLineSpace) ); Canvas.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxD', XMax + (SMMargin*Canvas.ClipX), 1.1*SMLineSpace ); } // Then actually draw the stuff DrawNumbers( canvas, Min(SelLeft, 9), SelLeft > 9, false, XMax, YMax); DrawCurrentArray( canvas, false, XMax, YMax); // Finally, draw a nice title bar. Canvas.SetDrawColor(255,255,255,255); Canvas.SetPos(Canvas.ClipX*SMOriginX, (Canvas.ClipY*SMOriginY) - (1.5*SMLineSpace)); Canvas.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxD', XMax + (SMMargin*Canvas.ClipX), (1.5*SMLineSpace)); Canvas.SetDrawColor(255,255,128,255); Canvas.SetPos(Canvas.ClipX*(SMOriginX+SMMargin), (Canvas.ClipY*SMOriginY) - (1.2*SMLineSpace)); Canvas.DrawText(SMStateName[SMState]); if (SMState == SMS_VoiceChatChannel) DrawMembers(Canvas, XMax, YMax); } function DrawMembers(Canvas Canvas, float XMax, float YMax) { local array Members; local int i; local float XPos, YPos, XL, YL; local GameReplicationInfo GRI; local string CurrentPlayer; GRI = ViewportOwner.Actor.GameReplicationInfo; if ( GRI == None ) return; if (HighlightRow >= 0 && HighlightRow < SMArraySize) { Members = ViewportOwner.Actor.VoiceReplicationInfo.GetChannelMembersAt( SMIndexArray[SMOffset + HighlightRow] ); Canvas.SetDrawColor(255,255,175,220); // XPos = (Canvas.ClipX * (SMOriginX+SMMargin)) + SMTab; // YPos = Canvas.ClipY * (SMOriginY+SMMargin); XPos = XMax + (SMMargin * Canvas.ClipX * 2.25)/* + SMTab*/; YPos = Canvas.ClipY*(SMOriginY+SMMargin) + ((HighlightRow + 0.1)*SMLineSpace); for(i=0; i 0 && PInfo.Settings.Length > 0 ) { PInfo.Dump(group); break; } } } // For debugging CacheRecords exec function DumpRecords(string Type) { DumpCacheRecords(Type); } final private function AddMessage(string Mesg) { log(Mesg); Message(Mesg,0); } final function DumpCacheRecords(optional string CacheType) { local int i; local string Margin; local array CRecs; local array WRecs; local array MRecs; local array MutRecs; local array GRecs; local array ARecs; local array VRecs; if ( CacheType == "" || CacheType ~= "Crosshair" ) { class'CacheManager'.static.GetCrosshairList(CRecs); AddMessage(" ================ Cached crosshair records ================ "); for (i = 0; i < CRecs.Length; i++) { AddMessage(CRecs[i].RecordIndex$")"@CRecs[i].FriendlyName@CRecs[i].CrosshairTexture); } AddMessage(""); } if ( CacheType == "" || CacheType ~= "GameType" ) { class'CacheManager'.static.GetGameTypeList(GRecs); AddMessage(" ================ Cached gametype records ================ "); for (i = 0; i < GRecs.Length; i++) { for (Margin="";Len(Margin) Recs; local int i, j; local bool bShowAll; local class GameClass; local array Hints; class'CacheManager'.static.GetGameTypeList(Recs); bShowAll = param == ""; for ( i = 0; i < Recs.Length; i++ ) { GameClass = class(DynamicLoadObject( Recs[i].ClassName, class'Class' )); if ( GameClass != None ) { Hints = GameClass.static.GetAllLoadHints(!bShowAll); if ( Hints.Length > 0 ) { log( Recs[i].GameName @ "Loading Hints -" ); for ( j = 0; j < Hints.Length; j++ ) log(" "$j$") "$Hints[j] ); log(""); } } } } exec function DebugTabOrder() { if ( GUIController(ViewportOwner.GUIController) != None && GUIController(ViewportOwner.GUIController).ActivePage != None ) { log("Searching for components with invalid tab order..."); GUIController(ViewportOwner.GUIController).ActivePage.DebugTabOrder(); } } F_p>class HudBTeamDeathMatch extends HudBDeathMatch; var() NumericWidget ScoreTeam[2]; var() NumericWidget totalLinks; var() NumericWidget Score; var() SpriteWidget LTeamHud[3]; var() SpriteWidget RTeamHud[3]; var() SpriteWidget TeamSymbols[2]; var() int Links; var() Color CarrierTextColor1; var() Color CarrierTextColor2; var() Color CarrierTextColor3; var() String CarriersName, CarriersLocation; var() float CNPosX, CNPosY; var localized string LinkEstablishedMessage; simulated function DrawSpectatingHud (Canvas C) { Super.DrawSpectatingHud(C); if ( (PlayerOwner == None) || (PlayerOwner.PlayerReplicationInfo == None) || !PlayerOwner.PlayerReplicationInfo.bOnlySpectator ) return; UpdateRankAndSpread(C); ShowTeamScorePassA(C); ShowTeamScorePassC(C); UpdateTeamHUD(); } simulated function Tick(float deltaTime) { Super.Tick(deltaTime); if (Links >0) { TeamLinked = true; pulseWidget(deltaTime, 255, 0, RHud2[3], TeamIndex, 1, 2000); } else { TeamLinked = false; RHud2[3].Tints[TeamIndex].A = 255; } } simulated function showLinks() { local Inventory Inv; Inv = PawnOwner.FindInventoryType(class'LinkGun'); if (Inv != None) Links = LinkGun(Inv).Links; else Links = 0; } simulated function drawLinkText(Canvas C) { text = LinkEstablishedMessage; C.Font = LoadLevelActionFont(); C.DrawColor = LevelActionFontColor; C.DrawColor = LevelActionFontColor; C.Style = ERenderStyle.STY_Alpha; C.DrawScreenText (text, 1, 0.81, DP_LowerRight); } simulated function UpdateRankAndSpread(Canvas C) { // making sure that the Rank and Spread dont get drawn in other gametypes } simulated function DrawHudPassA (Canvas C) { Super.DrawHudPassA (C); UpdateRankAndSpread(C); ShowTeamScorePassA(C); if( bShowWeaponInfo ) { if (Links >0) DrawNumericWidget (C, totalLinks, DigitsBig); totalLinks.value = Links; } } simulated function ShowTeamScorePassA(Canvas C) { if ( bShowPoints ) { DrawSpriteWidget (C, LTeamHud[2]); DrawSpriteWidget (C, LTeamHud[1]); DrawSpriteWidget (C, LTeamHud[0]); DrawSpriteWidget (C, RTeamHud[2]); DrawSpriteWidget (C, RTeamHud[1]); DrawSpriteWidget (C, RTeamHud[0]); } } simulated function ShowTeamScorePassC(Canvas C) { if ( bShowPoints ) { if (TeamSymbols[0].WidgetTexture != None) DrawSpriteWidget (C, TeamSymbols[0]); if (TeamSymbols[1].WidgetTexture != None) DrawSpriteWidget (C, TeamSymbols[1]); TeamScoreOffset(); DrawNumericWidget (C, ScoreTeam[0], DigitsBig); DrawNumericWidget (C, ScoreTeam[1], DigitsBig); } } simulated function TeamScoreOffset() { ScoreTeam[1].OffsetX = 80; if ( ScoreTeam[1].Value < 0 ) ScoreTeam[1].OffsetX += 90; if( abs(ScoreTeam[1].Value) > 9 ) ScoreTeam[1].OffsetX += 90; } simulated function ShowPersonalScore(Canvas C) { DrawNumericWidget (C, Score, DigitsBig); } // Alpha Pass ================================================================================== simulated function DrawHudPassC (Canvas C) { Super.DrawHudPassC (C); if (Links >0) drawLinkText(C); if( bShowPoints ) ShowPersonalScore(C); ShowTeamScorePassC(C); } // Alternate Texture Pass ====================================================================== simulated function UpdateTeamHud() { local GameReplicationInfo GRI; local int i; Score.Value = Min (CurScore, 999); // drawing limitation GRI = PlayerOwner.GameReplicationInfo; if (GRI == None) return; for (i = 0; i < 2; i++) { if (GRI.Teams[i] == None) continue; ScoreTeam[i].Value = Min (GRI.Teams[i].Score, 999); // max space in hud if (GRI.TeamSymbols[i] != None) TeamSymbols[i].WidgetTexture = GRI.TeamSymbols [i]; } } simulated function UpdateHud() { UpdateTeamHUD(); showLinks(); Super.UpdateHud(); } }};e7G2 q;DZ}B<ZnL N]y'Y MQNQOQPQQQ$?F_F_s;F_F_t;@F_F_u;@F_F_v;F_F_w;F_F_x;F_F_y;F_F_z;F_F_W F_F_hhek*%e%e7{jQ76ne{j%A6ne{j%76ne{j76We{j%A6We{j%76We{j76ye{j%A6ye{j%76ye{je,66Te{jegy(16Te{jev%Yhc,+ Xinterface.GUIUserKeyBindingvY{YhUhVhYh wUh*e%e7UhXh@B6dheUhXh6cheUhXh-6aheUhXheYhc,+ Xinterface.GUIUserKeyBindingvge%"e,pc,"KEYNAME9Se^ c,!"LOCALIZEDKEYNAME9Se{pJc,"KEYBINDINGp{Jv%v7{j|6tv{jJ{76nv{j{6nv{je{6Wv{jp{6yv{j^ r%r{qr6nv{jq{6nv{jJvr{rve` GF_4r;@!!A4@!E!c,j.&_-y ' GF_o // ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class JoeTest extends TestPageBase; #exec OBJ LOAD FILE=InterfaceContent.utx function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); Controls[2].OnClick=OnClick1; } function bool OnClick1(GUIComponent Sender) { Controller.OpenMenu("xinterface.joetestB"); return true; } function bool OnClick2(GUIComponent Sender) { // Controller.CloseMenu(false); return true; } F_E<@Jg 2T v 6n@{jU v 6W@{jV v 6y@{jv 6n@{jy 6n@{jv 6W@{jy 6W@{jv 6y@{jy 6y@{jy 6n@{jT y 6W@{jU y 6y@{jV  GF__|;G!oiW G! GF_F_F_@F_F_;N )%HrN ,}.&(%u.tc,wu*7uO7uO&6u7uO&uOuz6[ 7uO&uO.&(ubc,4jppW ?password=.&($( X(rN , axinterface.UT2MainMenu' GaGF_F_uF_F_X_}qJ }& },,d9},0 },Z,2H}, ,-W},,(t}, },,#},! },(,},` },o,, GF_0HkO!!&Y0O!J!(.%E(EDF (x.f!(|.*E()DaE(&DXE(IDG (-{'(k$E(rDO R *bRoundButton(Sm GF_O// ==================================================================== // Class: XInterface.JoeTestPanelA // Parent: XInterface.GUITabPanel // // // ==================================================================== class JoeTestPanelA extends TestPanelBase; function InitPanel() { } aJF_F_@F_F_O// ==================================================================== // Class: XInterface.JoeTestPanelA // Parent: XInterface.GUITabPanel // // // ==================================================================== class JoeTestPanelB extends TestPanelBase; function InitPanel() { } F_@F_F_class DrawOpText extends DrawOpBase; var localized string Text; var string FontName; // Font to use var int MaxLines; // In case a multiline is too tall. /** set to true to wrap text on "|" */ var bool bWrapText; var byte VertAlign; function Draw(Canvas Canvas) { local Font Fnt; local int i; local float X, Y, XL, YL, TextHeight, StrHeight, StrWidth; local array Lines; Super.Draw(Canvas); if (FontName != "") { Fnt = GetFont(FontName, Canvas.SizeX); if (Fnt != None) Canvas.Font = Fnt; } Canvas.FontScaleX = 0.9; Canvas.FontScaleY = 0.9; X = Lft * Canvas.SizeX; Y = Top * Canvas.SizeY; XL = Width * Canvas.SizeX; YL = Height * Canvas.SizeY; Canvas.StrLen(Text, StrWidth, StrHeight); if (bWrapText) Canvas.WrapStringToArray(Text, Lines, XL, "|"); else Lines[0] = Text; TextHeight = StrHeight * Lines.length; switch ( VertAlign ) { case 1: // Center Y = Y + (YL - TextHeight) / 2; break; case 2: // Bottom Y = Y + YL - TextHeight; break; } for ( i = 0; i < Lines.Length; i++ ) { Canvas.StrLen(Lines[i], StrWidth, StrHeight); switch ( Justification ) { case 0: // left Canvas.SetPos(X, Y); break; case 1: // center Canvas.SetPos(X + (XL - StrWidth) / 2, Y); break; case 2: // right Canvas.SetPos(X + XL - StrWidth, Y); break; } Canvas.DrawText(Lines[i]); Y += StrHeight; } } F_t// XInterface.LadderButton // // A button that displays a gfx button with a map picture in it. // The button is meant to be used by/for singleplayer ladders. //////////////////////////////////////////////////////////////////// class LadderButton extends GUIGFXButton; var MatchInfo MatchInfo; var int MatchIndex; var int LadderIndex; function SetState(int Rung) { local string NewStyleName; if (MatchInfo == None) return; // Set our state based on Rung // We Also set our Graphic if (Rung < MatchIndex) // Match out of reach { Graphic = Material(DynamicLoadObject("SinglePlayerThumbs."$MatchInfo.LevelName$"_G", class'Material', true)); MenuState = MSAT_Disabled; NewStyleName="LadderButton"; } else { Graphic = Material(DynamicLoadObject("SinglePlayerThumbs."$MatchInfo.LevelName, class'Material', true)); MenuState = MSAT_Blurry; if (Rung == MatchIndex) NewStyleName="LadderButton"; else NewStyleName="LadderButtonHi"; } if (!(NewStyleName ~= StyleName)) { StyleName = NewStyleName; Style = Controller.GetStyle(StyleName,FontScale); if (Style == None) { Log("NewStyle IS None"); } } } F_F_F_iclass ListTest extends TestPageBase; //var GUIList TheList; //var GUIStringCollection Col1, Col2; var GUIScrollText tScroll; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local string newText; Super.InitComponent(MyController, MyOwner); tScroll=GUIScrollTextBox(Controls[0]).MyScrollText; newText = "This is a simple test of multiline splitting that should be happening very easily but i will debug to be sure that whatever the length is set at it wont bug."$Chr(10)$Chr(10); newText = newText$"But more importantly i must also handle having more than just 1 line of text and see how this is dealt with."$Chr(10); newText = newText$"I wonder how this would be dealt with if i wasnt taking care of it and if Joe wasnt going to do it."$Chr(10)$Chr(10); newText = newText$"Bah, We'll see later since no one seems to reply to my messages."; tScroll.SetContent(newText); // TheList=GUIList(Controls[0]); // Col1=GUIStringCollection(GUIListCollection(Controls[1]).MyCollection); // Col2=GUIStringCollection(GUIListCollection(Controls[2]).MyCollection); // Col2.bMultiSelect=true; Controller.bDesignMode = false; } function bool AddClick(GUIComponent Sender) { // TheList.Add("Simple Item Text"); // Col1.AddItem("Simple Item Text"@Col1.Count()); // Col2.AddItem("Simple Item Text"@Col1.Count()); return true; } F_S<r]   -P rr,c,M"pset ini:Engine.Engine.AudioDevice MusicVolume 9U.7rU rr,c,M"pset ini:Engine.Engine.AudioDevice SoundVolume 9U.7rUc,"stopsoundsc,a  lrr,c, 9C.7,Uc,bc,CT!f$' rr,u.r(uzu,sc,6"set ini:Engine.Engine.AudioDevice UseEAX falsec,:"set ini:Engine.Engine.AudioDevice Use3DSound falsec,@"set ini:Engine.Engine.AudioDevice CompatibilityMode true[Rzu%sc,6"set ini:Engine.Engine.AudioDevice UseEAX falsec,:"set ini:Engine.Engine.AudioDevice Use3DSound falsec,A"set ini:Engine.Engine.AudioDevice CompatibilityMode false[Xzu&sc,6"set ini:Engine.Engine.AudioDevice UseEAX falsec,9"set ini:Engine.Engine.AudioDevice Use3DSound truec,A"set ini:Engine.Engine.AudioDevice CompatibilityMode false !KXInterface.UT2PerformWarn[[zu,sc,5"set ini:Engine.Engine.AudioDevice UseEAX truec,9"set ini:Engine.Engine.AudioDevice Use3DSound truec,A"set ini:Engine.Engine.AudioDevice CompatibilityMode false !KXInterface.UT2PerformWarnc,"SOUND_REBOOT{c,{c,Nonec,Mc,$ ,rr, c,3"setrM9T. r- rr, {wc,*c,-. r- -. r-  rr, c,T. r- *rr, c,-. r-c,b <rr,u.r(zu%I-L(-J(-N(zu&I-L'-J(-N(zu,I-L'-J'-N(-L'-J'-N'c,--Lc,--Jc,--Nc,b e rr, -L. r-c,- -Lc,bc,C"set ini:Engine.Engine.AudioDevice LowQualitySound9T-Lc,"SOUND_REBOOTb {c,{c,Nonec,Mc,$  rr,c, 9=.rKc,b  rrqh qhY  w.c,*.c,qhY GF_@F_F_Q<F_F_U<R,'s >,'s >,'s >U GF_phDTn7 [r.D* .%6^G.%yI|.DJ GF_j<Ej 稨StaticAddFavorite:E9SF9SG{ 7j7j{ &6F{ jE6H{ jF6L{ jG6K{ jUnknown G F_dg<a#Sv., ^Ga# GF_m<s~7t%ct7jYz6Ftj6s6Htj6s t' qsy GF_i<P|] GF_k<~d8wO*O$vukuM~uFU.fW$QUAl~ kwr*r\uy GF_q<ji 6 s6[jj6s6Fjj6s6Hjj6s6Ljj6s6Kjj GF_l<RnW fbku-z W<Ubxinterface.Tab_InstantActionBotConfigra GF_n<c#D8)wPh*Phas -c# GQ=L6p<9cH i smwvgbF_F_v<py 7j7'#p%p7'#6[pj6 p'#6Fpj6p'#6Hpj6p'#6Lpj6p'#6Kpj6p'#p GF_jpJ J Y DFRxJ %J 7RpV01J RJ RJ xJ  pV_pKc,a LpKa+c, pK*pV3%pEp-n'p* M GF_yF_F_s<F_F_F_F_y<t GF_@|<uTp ~G9:B9:$B+TuB6M 6M $M {B+TuB6M 6M $M  GF_Dclass DrawOpImage extends DrawOpBase DependsOn(GUI); var Material Image; var byte ImageStyle; var float SubX, SubY, SubXL, SubYL; // coordinates on Image var deprecated bool bStretch; // Stretch the picture; function Draw(Canvas Canvas) { local float X, Y, XL, YL, U, V, UL, VL; if ( Image == None ) return; Canvas.Style = RenderStyle; Canvas.DrawColor = DrawColor; X = Lft * Canvas.SizeX; Y = Top * Canvas.SizeY; if ( Width < 0 ) XL = Image.MaterialUSize(); else XL = Width * Canvas.SizeX; if ( Height < 0 ) YL = Image.MaterialVSize(); else YL = Height * Canvas.SizeY; U = FMax(0, SubX); V = FMax(0, SubY); if ( SubXL < 0 ) UL = Image.MaterialUSize(); else UL = SubXL; if ( SubYL < 0 ) VL = Image.MaterialVSize(); else VL = SubYL; if ( Justification == 1 ) { X -= XL / 2; Y -= YL / 2; } else if ( Justification == 2 ) { X -= XL; Y -= YL; } Canvas.SetPos(X,Y); switch ( ImageStyle ) { case 0: // Normal (scaled to fit) Canvas.DrawTile( Image, XL, YL, U, V, UL, VL ); break; case 1: // Stretched Canvas.DrawTileStretched(Image,XL,YL); break; case 2: // Bound Canvas.DrawTileClipped( Image, XL, YL, U, V, UL, VL ); break; } //Log("DrawOpImage.Draw Called"); } F_jepJ  "DFed ef$p%p7ed ez:.ped *9Vped z 9Vped ez#&ped p2e* M GF_t~<We 63wB*yBHBaB* GF_{<x#eex#c-> GF_<H` BH GF_VA=qpOV-qK-qpAJ: Resuming pings'^pAJ: Cancelling pings's GF_4pB$!S4B$E$Pc,,u*,D$ GF_AG=UI"!'\'^ GF_F_F_s @=D=` GF_F_F_C=F$L /*9:F$, 9:G$&-p'',( GF_B=F_F_N=F=d AwQL !Kxinterface.Browser_OpenIP.e hD' GF_I=F_F_F_F_E=K=T +50-p Kxinterface.UT2QuitPage( GF_L=F_F_F_F_J=V `42}ArV , &Kxinterface.UT2SinglePlayerMain|rV , Kxinterface.ServerBrowserrV , )Kxinterface.UT2MultiplayerHostPagerV , 'Kxinterface.UT2InstantActionPage?rV , "Kxinterface.UT2SettingsPagexrV , Kxinterface.UT2QuitPage' GF_` jL$!ug` L$I$ED~D~rB*Bc,a EB'DAEB'DD'Rt%t7ji tk' qkt.&.&JT$E.,.&)De .,.&JX$E.,.&)Dd .,.&JV$.,.&-(QcL?%'s &'s ף>,'s >,'s >,'s > GF_F_F_`$F_F_;class MapListCaptureTheFlag extends MapList config; F_@F_`$F_v@F_c=M6T=W%cH i smwvgbF_F_F_F_U=F_F_[=V=` i? c1Q %Q 7w'AwQ &Q7wb' GF_F_F_X=F_F_4fa$!4a$l$EID_ESDD%rV%c?%VT?V%G&VTW?Y&G??v,VT?Y,G??vX,V&V,G,G,V&V,G??vX,V,V,G,G,V,V,G&G,VTW?Y,G&Gu &u ,u cvu rYu ,-c,- gwc,*"wc,*,-(9:c,9:$.,JR$.,J[$9:c,9:$ V ,-',-( GF_\=Y=^ `O SN #Kxinterface.Browser_AddBuddy.k hK' GF_]%`=oUHD'Ro7w7Coo%o7w6 Ibuddy6 Iow6 I$oCIo7Cv$Q ^Gwc-( GF_F_F_Z=_=V ]+ i c, !zi '^~i :U^%[i ba[i ^Di ^&b9JD\ %\ 7 kjz6F\  kj[!6H\  kjb'\ ( GF_i F_F_}a=q$q?}q$' GF_@wL!@Lt$}-J\.L%&Y%\%\YY!L\Q.Y%.%.%YQoQ7w%'s =&'s >,'s >,'s >,'s >E.,.&)Dq.,.&J].,.&-'E.,.&)D^ .,.&J}$E.,.&)D` .,.&J|$Qc?-J' GF_@F_F_7class MapListDeathMatch extends MapList config; F_F_F_F_F_^=E%_ &#-f 9:E%,-f(' GF_e=F_F_i=F_F_j=F_F_F_F_f=F%DRbc,Cwb*wb*bx(s -F% GF_m=g=] '[' GF_o=xS'SxH%x U$Q$^GppY&9SC V& q$Q ^G} $Q ^G~ $Q ^G $Q ^GO&  GF_k={ )^!<r{ , Kxinterface.UT2QuitPager{ ,c,"DISCONNECTwc,*c,Bc,' Mr{ & M9r{ , "Kxinterface.UT2SettingsPager{ ,,-c,T Mr{ ,,-c,"ADDCURRENTTOFAVORITES Mr{ , Kxinterface.ServerBrowser' GF_r=M%D2'DM%v/9:v9:$P GF_F_F_Fclass DrawOpBase extends Object; var float Top, Lft, Height, Width; // Location/size is always range 0.0 to 1.0 var byte RenderStyle; // Render Style to use for this particular Image var byte Justification; // 0 - Left/Top 1 - Centered 2 - Right/Bottom var Color DrawColor; // Color to set Canvas to. function SetPos(float T, float L) { Top = T; Lft = L; } function SetSize(float H, float W) { Height = H; Width = W; } function Draw(Canvas Canvas) { Canvas.SetPos(Lft * Canvas.SizeX, Top * Canvas.SizeY); Canvas.Style = RenderStyle; Canvas.DrawColor = DrawColor; } simulated function Font GetFont(string FontClassName, float ResX) { local Font fnt; fnt = GetGUIFont(FontClassName, ResX); if ( fnt == None ) fnt = Font(DynamicLoadObject(FontClassName, class'Font')); if ( fnt == None ) log(Name$" - FONT NOT FOUND '"$FontClassName$"'",'Error'); return fnt; } simulated function Font GetGUIFont( string FontClassName, float ResX ) { local class FntCls; local GUIFont Fnt; FntCls = class(DynamicLoadObject(FontClassName, class'Class',True)); if (FntCls != None) Fnt = new(None) FntCls; if ( Fnt == None ) return None; return Fnt.GetFont(ResX); } F_s=P%A7'AP%rO%49:r9:$P GF_t=Pm'F 7'#Q?^GppppS&(9S'F /9S7'#)Q>^GK&9S7'#%9S'W~% GF_u=HCH GF_@v=kT~G9:r9:$C+Tkr6C 6C $C {C+Tkr6C 6C $C  GF_tw=W 0-wC*CHCaC* GF_V]%hp^V-h-hV-TpAJ: Initial refreshU-T'pAJ: Resuming pings'^pAJ: Cancelling pings's GF_]&o%Qz6 Oo%6 Oi%6 Og%x7C7Cx&xCO GW>N6y=WcH i smwvgbF_F_F_F_z=F_F_={=J W ' _ D' GF_F_F_}=F_F_C>~=F QS '`'' GF_F_F_4`|&!#@4|&~&h.&.%Th`.eh6U[%xinterface.Tab_MultiplayerHostMain r%'E`MDdH`Fo.fhUSH Qo.rh7Ub&xinterface.Tab_InstantActionMutators e&n.Xh?Ul&xinterface.Tab_MultiplayerHostServerSettings o&EnwDRm.Th8Uzxinterface.Tab_InstantActionBotConfig Kwm*m\`yh-B'Rn-Vn-W GF_@>F_F_@'B>B K'`(' GF_F_F_A>F>\?) M'' GF_G>F_F_F_F_E>I>gGro`lopoolopool{n] opomloponl`O%&z`OIb`O%'z`Ox%S`oIS`Ox%S`OICp?Game=`e{ppSCo=n-Vc,4"ppRELAUNCH { -server -log=Server.log]c,jp{?Listen$( X(' GF_J>F_F_{F_F_D>F_F_F_F_L>F_F_M>W?. M'' GF_H>ATk [r.A* .%6^G.%yI|.AJ GF_@F_F_dO>\'Ssm ., ^G\' GF_P>F_F_Q>Py  GF_S>dy`Fo.fh$QoAS Qvwm*m\`y GF_R>F_F_T>p'Reh fzb-p'h<Uzxinterface.Tab_InstantActionBotConfigmK GF_=class MapListDoubleDomination extends MapList config; F_Y>F_F_Z>@F_F_[>@F_F_\>F_F_]>F_F_^>F_F__>F_F_`>F_F_F_F_4X>w'! 4w'z'c,j GC?O6b>dcH i smwvgbF_F_h>l]<rl,D-b. ,- xrl,D-a. ,- rl,D-`. ,- rl,D-_. ,- rl,Z.,(DzZ%n DL $izZ&n DL $zZ,n DL $ rl,DD.,Y rl,DD.,( rl, Z., (YzZ%FbDMb$~zZ&FbDMb$zZ,FbDMb$zZ,FbDMb$p>  rl, D-^c. , - rl, Z., (`zZ%]bD`b$zZ&]bD`b$zZ,]bD`b$ Jrl, Z., (zZ%\bD_b$G$zZ&\bD_b$GGzZ,\bD_b$ rl, Z., (zZ%FbDZb$zZ,FbDZb$zZ,FbDZb$p> +rl,Dkb.,Y rl,r.!,x%.!,{%Deb.!,x  rl,.!,x,.!,{,Dgb.!,xDb GF_a>{')!?:r{'& axinterface.ServerBrowser' GF_H @F_F_F_F__d>~'o+8. ,;pp~'|A(c,j GF_ijk|Y/;rk,. ,AD-b,vrk,. ,AD-a,rk,. ,AD-`,rk,. ,AD-_,.rk,.,&9:DL n ,rk,H %H 7jzDD6H j.,&6H j H G,rk,.,&DD,2rk, ., &9:DMbFbp>,mrk, . , AD-^c,rk, ., &9:D`b]b,rk, ., &9:D_b\b,9rk, ., &9:DZbFbp>,rk,H %H 7jzDkb6H j.,&6H j H R,rk,.!,{Deb,,rk,.!,{Dgb GF_F_F_k>)f M(' GF_l>F_F_F_F_C() korC(&Xc, "aXInterface.UT2DemoQuitPagelc, "exit M(' GF_i>F_F_F_F_q>n>WT  M'' GF_0O/P(!Q0P(L(-c E.%.%)DW., .%n ., .&n .,.,n .,a'  j.,  .%Fb.,  .&Fb., .,Fb., .,Fb., a'.,  .%Fb., .,Fb., .,Fb., a'n%dn7j.,'.6nj*6nj.,'.6nj*6njn.,a'.,  .%]b.,  .&]b., .,]b., a'.,  .%\b.,  .&\b., .,\b., a'.!,]V, .!,]V, n,n,En}DEn&D]nO/.&.%E.,.%)DNC-c' GF_@F_F_F_F_s>F_F_x>t>~A Ch' GF_F_F_v>F_F_{>w>b{O [-h(u -(C_Cv$n ^Gwc-(' GF_F_F_y>F_F_|>z>Wu  M'' GF_t~>WjR 0-wC*CHCaC* GF_F_F_>z(SLz( G$n ^GU)c-d(D-hDH' l$n ^G}c-d( $n ^G~c-d(DH(Cv$ $n ^GDH(c-d(  GF_@?D)}4D) /$-I'F^(,  H$u -' i$-h'u -' q$ y$ $  GF_0A?K)!0K)I)n.,.&n ^GdCc,a EC D}EC DSF.,%E.%.&)DWE.&.&)Dbu .,.&Eu )D~~-Iu -(-h(Cv$n ^Gwc-(,-k(. ,;UT2004O)c,  GF_jCJ9n ^Gd GF_F@F_F_;class MapListTeamDeathMatch extends MapList config; F_d@F_F_y// ==================================================================== // Class: XInterface.moCheckBox // Combines a label and check box button. // ==================================================================== class moCheckBox extends GUIMenuOption; var(Option) string CheckStyleName; var(Option) noexport editconst GUICheckBoxButton MyCheckBox; var(Option) noexport editconst deprecated bool bChecked; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local GUIStyles S; Super.Initcomponent(MyController, MyOwner); MyCheckBox = GUICheckBoxButton(MyComponent); MyCheckBox.OnChange = ButtonChecked; MyCheckBox.OnClick = InternalClick; S = Controller.GetStyle(CheckStyleName,MyCheckBox.FontScale); if ( S != none ) MyCheckBox.Graphic = S.Images[0]; } function SetComponentValue(coerce string NewValue, optional bool bNoChange) { if ( bNoChange ) bIgnoreChange = True; Checked(NewValue); bIgnoreChange = False; } function string GetComponentValue() { return string(IsChecked()); } function ResetComponent() { MyCheckBox.SetChecked(False); } function bool IsChecked() { return MyCheckBox.bChecked; } function bool Checked(coerce bool C) { MyCheckBox.SetChecked(C); return true; } function ButtonChecked(GUIComponent Sender) { if ( Sender == MyCheckBox ) InternalOnChange(Self); } private function bool InternalClick(GUIComponent Sender) { if ( bValueReadOnly ) return true; return MyCheckBox.InternalOnClick(Sender); } F_4G(Z)!. 4Z)])xc, z9?6x6x%c,a+xi.&.%Tii0UG(xinterface.Tab_VideoSettings Q('i0US(xinterface.Tab_DetailSettings ^(i/U_(xinterface.Tab_AudioSettings `(l.^i0Uh(xinterface.Tab_PlayerSettings i(f.hi1UYxinterface.Tab_NetworkSettings q(i1Us(xinterface.Tab_ControlSettings t(i0Ux(xinterface.Tab_IForceSettings y(k.Ii,U~(xinterface.Tab_WeaponPref H)i-U@]xinterface.Tab_HudSettings C]i.UL)xinterface.Tab_GameSettings M)i.UD]xinterface.Tab_SpeechBinder H] GF_F_F_Q3// ==================================================================== // Class: UT2K4UI.GUIMoComboBox // // Written by Joe Wilcox // Updated by Ron Prestenback // (c) 2002, 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class moComboBox extends GUIMenuOption; var(Option) bool bReadOnly; var(Option) bool bAlwaysNotify; // Always pass OnChange events, even when selecting currently selected item var(Option) editconst noexport GUIComboBox MyComboBox; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyComboBox = GUIComboBox(MyComponent); MyComboBox.Edit.bAlwaysNotify = bAlwaysNotify; SetReadOnly(bValueReadOnly); ReadOnly(bReadOnly); } function SetComponentValue(coerce string NewValue, optional bool bNoChange) { local int i; i = FindIndex(NewValue,,True); if (i != -1) { if ( bNoChange ) bIgnoreChange = True; SetIndex(i); bIgnoreChange = False; } } function string GetComponentValue() { return GetExtra(); } function int ItemCount() { return MyComboBox.ItemCount(); } function SetIndex(int I) { MyComboBox.SetIndex(i); } function SilentSetIndex(int i) { bIgnoreChange = True; MyComboBox.SetIndex(i); bIgnoreChange = False; } function int GetIndex() { return MyComboBox.GetIndex(); } function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object Obj) { return MyComboBox.FindIndex(Test, bExact, bExtra, Obj); } function string Find(string Test, optional bool bExact, optional bool bExtra) { return MyComboBox.Find(Test,bExact,bExtra); } function int FindExtra(string Test, optional bool bExact) { return MyComboBox.FindExtra(Test, bExact); } function AddItem(string Item, optional object Extra, optional string Str) { MyComboBox.AddItem(Item,Extra,str); } function RemoveItem(int item, optional int Count) { MyComboBox.RemoveItem(item, Count); } function string GetItem(int index) { return MyComboBox.GetItem(index); } function object GetItemObject(int index) { return MyComboBox.GetItemObject(index); } function string GetText() { return MyComboBox.Get(); } function object GetObject() { return MyComboBox.GetObject(); } function string GetExtra() { return MyComboBox.GetExtra(); } function SetText(string NewText, optional bool bListItemsOnly) { MyComboBox.SetText(NewText, bListItemsOnly); } function SetExtra(string NewExtra, optional bool bListItemsOnly) { MyComboBox.SetExtra(NewExtra, bListItemsOnly); } function ReadOnly(bool b) { MyComboBox.ReadOnly(b); } function SetReadOnly(bool b) { Super.SetReadOnly(b); MyComboBox.bValueReadOnly = b; } function ResetComponent() { local bool bTemp; bTemp = bIgnoreChange; bIgnoreChange = True; MyComboBox.List.Clear(); bIgnoreChange = bTemp; } function bool FocusFirst(GUIComponent Sender) { local bool bResult; bResult = Super.FocusFirst(Sender); // Hackilicious if ( bResult && MyComboBox != None ) MyComboBox.HideListBox(); return bResult; } F_sclass Browser_ServersList extends GUIMultiColumnList; #exec OBJ LOAD file=..\Textures\ServerIcons.utx #exec Texture Import File=textures\UTClassicIcon.tga Name=S_UTClassic Mips=Off Alpha=1 var() array Servers; var Browser_ServerListPageBase MyPage; var Browser_RulesList MyRulesList; var Browser_PlayersList MyPlayersList; var GUIStyles SelStyle; var array OutstandingPings; var int UseSimultaneousPings; var int PingStart; var int NumReceivedPings; var int NumPlayers; var() array Icons; var() localized array IconDescriptions; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; // let rules/players know about us MyPlayersList.MyServersList = Self; MyRulesList.MyServersList = Self; // set delegates OnDrawItem = MyOnDrawItem; OnChange = MyOnChange; OnDblClick = MyOnDblClick; Super.Initcomponent(MyController, MyOwner); SelStyle = Controller.GetStyle("SquareButton",FontScale); if( Controller.MaxSimultaneousPings == 0 ) { i = class'Player'.default.ConfiguredInternetSpeed; if (i<=2600) UseSimultaneousPings = 10; else if (i<=5000) UseSimultaneousPings = 15; else if (i<=10000) UseSimultaneousPings = 20; else UseSimultaneousPings = 35; } else UseSimultaneousPings = Controller.MaxSimultaneousPings; } function Clear() { PingStart = 0; StopPings(); Servers.Remove(0,Servers.Length); ItemCount = 0; Super.Clear(); } function CopyServerToClipboard() { local string URL; if( Index >= 0 ) { URL = PlayerOwner().GetURLProtocol()$"://"$Servers[SortData[Index].SortItem].IP$":"$string(Servers[SortData[Index].SortItem].Port); PlayerOwner().CopyToClipboard(URL); } } function Connect(bool Spectator) { local string URL; if( Index >= 0 ) { URL = PlayerOwner().GetURLProtocol()$"://"$Servers[SortData[Index].SortItem].IP$":"$string(Servers[SortData[Index].SortItem].Port); if( Spectator ) URL = URL $ "?SpectatorOnly=1"; if( MyPage.ConnectLAN ) URL = URL $ "?LAN"; Controller.CloseAll(false); PlayerOwner().ClientTravel( URL, TRAVEL_Absolute, false ); } } function AddFavorite( ServerBrowser Browser ) { if( Index >= 0 ) Browser.OnAddFavorite( Servers[SortData[Index].SortItem] ); } function bool MyOnDblClick(GUIComponent Sender) { Connect(false); return true; } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if( Super.InternalOnKeyEvent(Key, State, delta) ) return true; if( State==1 ) { switch(Key) { case 0x0D: //IK_Enter Connect(false); return true; break; case 0x74: //IK_F5 MyPage.RefreshList(); return true; break; case 0x43: // IK_C if(Controller.CtrlPressed) { // Ctrl-C on the server list copies selected server to clipboard. CopyServerToClipboard(); return true; } break; } } return false; } function MyOnReceivedServer( GameInfo.ServerResponseLine s ) { local int i; i = Servers.Length; Servers.Length=i+1; Servers[i] = s; if( Servers[i].Ping == 0 ) Servers[i].Ping = 9999; ItemCount++; AddedItem(); } function MyPingTimeout( int listid, ServerQueryClient.EPingCause PingCause ) { local int i; if(listid >= Servers.Length) return; if( Servers[listid].Ping == 9999 ) { Servers[listid].Ping = 10000; UpdatedItem(listid); } // remove from the outstanding ping list for( i=0;i=0 && listid == SortData[Index].SortItem ) MyOnChange(None); // continue pinging if( PingCause == PC_AutoPing ) { NumReceivedPings++; NumPlayers += s.CurrentPlayers; NeedsSorting = True; AutoPingServers(); } } function RePingServers() { InvalidatePings(); AutoPingServers(); } function MyQueryFinished( MasterServerClient.EResponseInfo ResponseInfo, int Info ) { if( ResponseInfo == RI_Success ) { RePingServers(); } } function InvalidatePings() { local int i; StopPings(); PingStart = 0; NumReceivedPings=0; NumPlayers=0; for( i=0;i= 0 ) MyOnChange( Self ); } function MyOnChange(GUIComponent Sender) { MyRulesList.Clear(); MyPlayersList.Clear(); if( Index >= 0 ) { // when changing selected servers, get their rules if( Sender != None ) MyPage.PingServer( SortData[Index].SortItem, PC_Clicked, Servers[SortData[Index].SortItem] ); MyRulesList.ItemCount = Servers[SortData[Index].SortItem].ServerInfo.Length; MyRulesList.ListItem = SortData[Index].SortItem; MyPlayersList.ItemCount = Servers[SortData[Index].SortItem].PlayerInfo.Length; MyPlayersList.ListItem = SortData[Index].SortItem; SetTimer( 5, false ); } else { MyRulesList.ItemCount = 0; MyPlayersList.ItemCount = 0; } } function int RemoveCurrentServer() { local int OldItem; if( Index >= 0 ) { OldItem = SortData[Index].SortItem; Servers.Remove( OldItem, 1 ); ItemCount--; MyRulesList.ItemCount = 0; MyPlayersList.ItemCount = 0; // tell sort lists. RemovedCurrent(); return OldItem; } return -1; } function MyOnDrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth, DrawX; local float IconPosX, IconPosY; local string Ping; local int k, flags, checkFlag; // Draw the selection border if( bSelected ) SelStyle.Draw(Canvas,MSAT_Pressed, X, Y-2, W, H+2 ); ////////////////////////////////////////////////////////////////////// // Here we get the flags for this server. // Passworded 1 << 30 // Stats 1 << 29 // LatestVersion 1 << 28 // Listen Server 1 << 27 // Instagib 1 << 26 // Standard 1 << 25 // UT CLassic 1 << 24 // flags are encoded at the top of MaxPlayers flags = Servers[SortData[i].SortItem].MaxPlayers; //flags = (1 << 30) | (1 << 29) | (1 << 28) | (1 << 27) | (1 << 26) | (1 << 25); // For testing ////////////////////////////////////////////////////////////////////// GetCellLeftWidth( 0, CellLeft, CellWidth ); IconPosX = CellLeft; IconPosY = Y; // First flag is in the second to most sig bit (dont want to mess with sign bit). Then we work down. checkFlag = 1 << 30; // While we still have icon, and we can fit another one in. for(k=0; (k> 1; } GetCellLeftWidth( 1, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, Servers[SortData[i].SortItem].ServerName, FontScale ); GetCellLeftWidth( 2, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, Servers[SortData[i].SortItem].MapName, FontScale ); GetCellLeftWidth( 3, CellLeft, CellWidth ); if( Servers[SortData[i].SortItem].CurrentPlayers>0 || Servers[SortData[i].SortItem].MaxPlayers>0 ) Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(Servers[SortData[i].SortItem].CurrentPlayers)$"/"$string((Servers[SortData[i].SortItem].MaxPlayers&255)), FontScale ); GetCellLeftWidth( 4, CellLeft, CellWidth ); if( Servers[SortData[i].SortItem].Ping == 9999 ) Ping = "?"; else if( Servers[SortData[i].SortItem].Ping == 10000 ) Ping = "N/A"; else Ping = string(Servers[SortData[i].SortItem].Ping); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, Ping, FontScale ); // GetCellLeftWidth( 4, CellLeft, CellWidth ); // Style.DrawText( Canvas, MenuState, X+CellLeft, Y, CellWidth, H, TXTA_Left, SortData[i].SortString, FontScale ); } function string GetSortString( int i ) { local string s, t; switch( SortColumn ) { case 0: case 1: s = Left(caps(Servers[i].ServerName), 8); break; case 2: s = Left(caps(Servers[i].MapName), 8); break; case 3: s = string(Servers[i].CurrentPlayers); while(Len(s) < 4 ) s = "0"$s; t = string((Servers[i].MaxPlayers&255)); while(Len(t) < 4 ) t = "0"$t; s = s $ t; break; case 4: s = string(Servers[i].Ping); while(Len(s) < 5 ) s = "0"$s; break; default: s = string(Servers[i].Ping); while(Len(s) < 5 ) s = "0"$s; break; } return s; } F_u// ==================================================================== // Class: UT2K4UI.moEditBox // Parent: UT2K4UI.GUIMenuOption // // // ==================================================================== class moEditBox extends GUIMenuOption; var(Option) bool bMaskText; var(Option) bool bReadOnly; var(Option) editconst noexport GUIEditBox MyEditBox; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyEditBox = GUIEditBox(MyComponent); ReadOnly(bReadOnly||bValueReadOnly); MaskText(bMaskText); } function SetComponentValue(coerce string NewValue, optional bool bNoChange) { if ( bNoChange ) bIgnoreChange = True; SetText(NewValue); bIgnoreChange = False; } function string GetComponentValue() { return GetText(); } function string GetText() { return MyEditBox.GetText(); } function SetText(string NewText) { MyEditBox.SetText(NewText); } function ReadOnly(bool b) { SetReadOnly(b); } function SetReadOnly(bool b) { Super.SetReadOnly(b); MyEditBox.bReadOnly = b; } function IntOnly(bool b) { MyEditBox.bIntOnly=b; } function FloatOnly(bool b) { MyEditBox.bFloatOnly = b; } function MaskText(bool b) { MyEditBox.bMaskText = b; } F_F?rTI# [r.r* .%6^G.%yI|.rJ GF_x~QF_dK?a)SQ ., ^Ga) GF_woE GF_M?yPXf iy.&fwyJ*wyJ}*yJ}` GF_0ryc)!,Nd0c)b)a{%Zp%PvcE%Zp{&Zpa{&Zp&PvcE&Zp GF_O?R?X `. B=E(.&J CD[ M'' GF_S?F_F_F_F_Q?U?Ek :5fZ.& NY'(7' GF_V?F_F_F_F_Tjg)D0wkK*kKak*iwlh*lhalh*mc, 6m9Dzc,a+mf` l{*k_*s -g) GF_ZpLF_|ZLF_W// ==================================================================== // Class: UT2K4UI.moNumericEdit // Parent: UT2K4UI.GUIMenuOption // // // ==================================================================== class moNumericEdit extends GUIMenuOption; var(Option) int MinValue, MaxValue, Step; var(Option) editconst noexport GUINumericEdit MyNumericEdit; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyNumericEdit = GUINumericEdit(MyComponent); MyNumericEdit.MinValue = MinValue; MyNumericEdit.MaxValue = MaxValue; MyNumericEdit.Step = Step; MyNumericEdit.CalcMaxLen(); MyNumericEdit.OnChange = InternalOnChange; MyNumericEdit.SetReadOnly(bValueReadOnly); } function SetComponentValue(coerce string NewValue, optional bool bNoChange) { if ( bNoChange ) bIgnoreChange = True; SetValue(NewValue); bIgnoreChange = False; } function string GetComponentValue() { return string(GetValue()); } function SetValue(coerce int V) { MyNumericEdit.SetValue(v); } function int GetValue() { return int(MyNumericEdit.Value); } function Setup(coerce int NewMin, coerce int NewMax, coerce int NewStep) { MinValue = NewMin; MaxValue = NewMax; Step = NewStep; MyNumericEdit.MinValue = MinValue; MyNumericEdit.MaxValue = MaxValue; MyNumericEdit.Step = Step; MyNumericEdit.MyEditBox.bIncludeSign = NewMin < 0; MyNumericEdit.CalcMaxLen(); SetValue( Clamp(GetValue(), NewMin, NewMax) ); } function SetReadOnly(bool b) { Super.SetReadOnly(b); MyNumericEdit.SetReadOnly(b); } F_}~QF_F_F_a?]?FH GF_`F_>F_F_F_s}`?]B-*w * -PC&P GF_orclass Browser_ServerListPageMS extends Browser_ServerListPageBase; var() string GameType; var() MasterServerClient MSC; var() bool bStarted; var localized string QueryFinHead; var localized string QueryFinTail; var localized string PingRecvString; var localized string MustUpgradeString; var localized string RefreshFinHead, RefreshFinMid, RefreshFinTail; var localized string RePingServersCaption; var localized string RefreshCaption; function AddQueryTerm(string Key, string GameType, MasterServerClient.EQueryType QueryType) { local MasterServerClient.QueryData QD; local int i; //Log("["$Key$"] ["$GameType$"] ["$QueryType$"]"); QD.Key = Key; QD.Value = GameType; QD.QueryType = QueryType; i = MSC.Query.Length; MSC.Query.Length = i + 1; MSC.Query[i] = QD; } function RefreshList() { local int dotPos; local string TmpString; MyServersList.Clear(); // Build query MSC.Query.Length = 0; AddQueryTerm("gametype", GameType, QT_Equals); // Add any extra filtering to the query if(Browser.bOnlyShowStandard) AddQueryTerm("standard", "true", QT_Equals); if(Browser.bOnlyShowNonPassword) AddQueryTerm("password", "false", QT_Equals); if(Browser.bDontShowFull) AddQueryTerm("freespace", "0", QT_GreaterThan); if(Browser.bDontShowEmpty) AddQueryTerm("currentplayers", "0", QT_GreaterThan); if(Browser.StatsServerView == SSV_OnlyStatsEnabled) AddQueryTerm("stats", "true", QT_Equals); else if(Browser.StatsServerView == SSV_NoStatsEnabled) AddQueryTerm("stats", "false", QT_Equals); // MUTATOR 1 // Send only the stuff to the right of the dot... dotPos = InStr(Browser.DesiredMutator, "."); if(dotPos < 0) TmpString = Browser.DesiredMutator; else TmpString = Mid(Browser.DesiredMutator, dotPos + 1); if(Browser.ViewMutatorMode == VMM_NoMutators) AddQueryTerm("mutator", "", QT_Equals); // Empty string indicates 'no mutators please' else if(Browser.ViewMutatorMode == VMM_ThisMutator && TmpString != "") AddQueryTerm("mutator", TmpString, QT_Equals); else if(Browser.ViewMutatorMode == VMM_NotThisMutator && TmpString != "") AddQueryTerm("mutator", TmpString, QT_NotEquals); // MUTATOR2 dotPos = InStr(Browser.DesiredMutator2, "."); if(dotPos < 0) TmpString = Browser.DesiredMutator2; else TmpString = Mid(Browser.DesiredMutator2, dotPos + 1); if( Browser.ViewMutatorMode != VMM_AnyMutators ) { if(Browser.ViewMutator2Mode == VMM_ThisMutator && TmpString != "") AddQueryTerm("mutator", TmpString, QT_Equals); else if(Browser.ViewMutator2Mode == VMM_NotThisMutator && TmpString != "") AddQueryTerm("mutator", TmpString, QT_NotEquals); } if(Browser.bDontShowWithBots) AddQueryTerm("nobots", "true", QT_Equals); if(Browser.WeaponStayServerView == WSSV_OnlyWeaponStay) AddQueryTerm("weaponstay", "true", QT_Equals); else if(Browser.WeaponStayServerView == WSSV_NoWeaponStay) AddQueryTerm("weaponstay", "false", QT_Equals); if(Browser.TranslocServerView == TSV_OnlyTransloc) AddQueryTerm("transloc", "true", QT_Equals); else if(Browser.TranslocServerView == TSV_NoTransloc) AddQueryTerm("transloc", "false", QT_Equals); // If not entire range (and valid), add game speed query if( (Browser.MinGamespeed != 0 || Browser.MaxGamespeed != 200) && Browser.MaxGamespeed >= Browser.MinGamespeed ) { // Master Server stores game speed as 1 = 100% etc AddQueryTerm("gamespeed", string(float(Browser.MinGamespeed)/100.0), QT_GreaterThanEquals); AddQueryTerm("gamespeed", string(float(Browser.MaxGamespeed)/100.0), QT_LessThanEquals); } if(Browser.CustomQuery != "") { TmpString = Left(Browser.CustomQuery, 32); // Only send 32 chars max AddQueryTerm("custom", TmpString, QT_Equals); } MSC.StartQuery(CTM_Query); StatusBar.SetCaption(StartQueryString); } function ShowPanel(bool bShow) { Super.ShowPanel(bShow); if( bShow ) { if( !bStarted ) { Log(MyButton.Caption$": Initial refresh"); RefreshList(); bStarted = True; } else { // Resume pings Log(MyButton.Caption$": Resuming pings"); MyServersList.AutoPingServers(); } } else { // Pause pings Log(MyButton.Caption$": Cancelling pings"); MyServersList.StopPings(); } } function OnCloseBrowser() { if( MSC != None ) { MSC.CancelPings(); MSC.Destroy(); MSC = None; } } function PingServer( int listid, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s ) { if( PingCause == PC_Clicked ) MSC.PingServer( listid, PingCause, s.IP, s.QueryPort, QI_RulesAndPlayers, s ); else MSC.PingServer( listid, PingCause, s.IP, s.QueryPort, QI_Ping, s ); } function CancelPings() { MSC.CancelPings(); } // Caught for status bar updating function UpdateStatusPingCount() { if(MyServersList.NumReceivedPings < MyServersList.Servers.Length) { StatusBar.SetCaption(PingRecvString@"("$MyServersList.NumReceivedPings$"/"$MyServersList.Servers.Length$")"); } else { StatusBar.SetCaption(RefreshFinHead@MyServersList.Servers.Length@RefreshFinMid@MyServersList.NumPlayers@RefreshFinTail); } } function MyReceivedPingInfo( int ServerID, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s ) { MyServersList.MyReceivedPingInfo(ServerID, PingCause, s); if(PingCause == PC_AutoPing) UpdateStatusPingCount(); } function MyPingTimeout( int listid, ServerQueryClient.EPingCause PingCause ) { MyServersList.MyPingTimeout(listid, PingCause); if(PingCause == PC_AutoPing) UpdateStatusPingCount(); } // We have list of servers from master server and are going to start pinging function MyQueryFinished( MasterServerClient.EResponseInfo ResponseInfo, int Info ) { MyServersList.MyQueryFinished(ResponseInfo, Info); switch( ResponseInfo ) { case RI_Success: StatusBar.SetCaption(QueryFinHead$MSC.ResultCount$QueryFinTail); break; case RI_AuthenticationFailed: StatusBar.SetCaption(AuthFailString); break; case RI_ConnectionFailed: StatusBar.SetCaption(ConnFailString); break; case RI_ConnectionTimeout: StatusBar.SetCaption(ConnTimeoutString); break; case RI_MustUpgrade: StatusBar.SetCaption(MustUpgradeString); break; } } function bool MyRePing(GUIComponent Sender) { MyServersList.RePingServers(); return true; } function bool MyRefreshClick(GUIComponent Sender) { Super.RefreshClick(Sender); return true; } function InitComponent(GUIController C, GUIComponent O) { Super.InitComponent(C, O); if( MSC == None ) { MSC = PlayerOwner().Level.Spawn( class'MasterServerClient' ); MSC.OnReceivedServer = MyServersList.MyOnReceivedServer; MSC.OnQueryFinished = MyQueryFinished; MSC.OnReceivedPingInfo = MyReceivedPingInfo; MSC.OnPingTimeout = MyPingTimeout; } StatusBar.WinWidth = 0.8; GUIButton(GUIPanel(Controls[1]).Controls[6]).bVisible = false; GUIButton(GUIPanel(Controls[1]).Controls[1]).Caption = RePingServersCaption; GUIButton(GUIPanel(Controls[1]).Controls[1]).OnClick = MyRePing; // Set up REFRESH button GUIButton(GUIPanel(Controls[1]).Controls[7]).Caption = RefreshCaption; GUIButton(GUIPanel(Controls[1]).Controls[7]).OnClick = MyRefreshClick; } F_F_F_e?{))4 $ ){)C)`' GF_~ t}~)!E~ ~)}){lm.cElmr*ppp9V.InitComponent - Could not create default list [lm] r*Could not initialize list! kE GF_~ H~U*!,~ U*S*{lmS.{cElmrS*ppp9V.InitComponent - Could not create default list [lm] rS*Could not initialize list! kES-lSA* GF_F_F_i?g?ee up GF_j?_`[ u_ GF_k?r[( ur GF_l?^*^V u^^*]* GF_~ x}b*!?~ b*`*{lmu.ycElmru*ppp9V.InitComponent - Could not create default list [lm] ru*Could not initialize list! kEu GF_}class ScoreBoardDeathMatch extends ScoreBoard; const MAXPLAYERS=32; var() localized string RankText; var() localized string PlayerText; var() localized string PointsText; var() localized string TimeText; var() localized string PingText; var() localized string PLText; var() localized string DeathsText; var() localized string AdminText; var() localized string NetText; var() localized string FooterText; var localized string MatchIDText; var localized string OutText; var localized string OutFireText; var localized string ReadyText,NotReadyText; var localized string SkillLevel[8]; // all accesses are clamped (0,7) var PlayerReplicationInfo PRIArray[MAXPLAYERS]; var float FPHTime; // gamestats var() localized String MaxLives, FragLimit, FPH, GameType,MapName, Restart, Continue, Ended, TimeLimit, Spacer; var() Material BoxMaterial; simulated function UpdatePrecacheMaterials() { UpdatePrecacheFonts(); } function UpdatePrecacheFonts(); function DrawTitle(Canvas Canvas, float HeaderOffsetY, float PlayerAreaY, float PlayerBoxSizeY) { local string titlestring,scoreinfostring,RestartString; local float TitleXL,ScoreInfoXL,YL; if ( Canvas.ClipX < 512 ) return; TitleString = GetTitleString(); ScoreInfoString = GetDefaultScoreInfoString(); Canvas.StrLen(TitleString, TitleXL, YL); Canvas.DrawColor = HUDClass.default.GoldColor; if ( UnrealPlayer(Owner).bDisplayLoser ) ScoreInfoString = class'HUDBase'.default.YouveLostTheMatch; else if ( UnrealPlayer(Owner).bDisplayWinner ) ScoreInfoString = class'HUDBase'.default.YouveWonTheMatch; else if ( PlayerController(Owner).IsDead() ) { RestartString = GetRestartString(); if ( Canvas.ClipY - HeaderOffsetY - PlayerAreaY >= 2.5 * YL ) { Canvas.StrLen(RestartString,ScoreInfoXL,YL); Canvas.SetPos(0.5*(Canvas.ClipX-ScoreInfoXL), Canvas.ClipY - 2.5 * YL); Canvas.DrawText(RestartString,true); } else ScoreInfoString = RestartString; } Canvas.StrLen(ScoreInfoString,ScoreInfoXL,YL); Canvas.SetPos(0.5*(Canvas.ClipX-TitleXL), ((HeaderOffsetY-PlayerBoxSizeY) - YL)*0.5 ); Canvas.DrawText(TitleString,true); Canvas.SetPos(0.5*(Canvas.ClipX-ScoreInfoXL), Canvas.ClipY - 1.5 * YL); Canvas.DrawText(ScoreInfoString,true); } function String GetTitleString() { local string titlestring; if ( Level.NetMode == NM_Standalone ) { if ( Level.Game.CurrentGameProfile != None ) titlestring = SkillLevel[Clamp(Level.Game.CurrentGameProfile.BaseDifficulty,0,7)]; else titlestring = SkillLevel[Clamp(Level.Game.GameDifficulty,0,7)]; } else if ( (GRI != None) && (GRI.BotDifficulty >= 0) ) titlestring = SkillLevel[Clamp( GRI.BotDifficulty,0,7)]; return titlestring@GRI.GameName$MapName$Level.Title; } function String GetRestartString() { local string RestartString; RestartString = Restart; if ( PlayerController(Owner).PlayerReplicationInfo.bOutOfLives ) RestartString = OutFireText; else if ( Level.TimeSeconds - UnrealPlayer(Owner).LastKickWarningTime < 2 ) RestartString = class'GameMessage'.Default.KickWarning; return RestartString; } function String GetDefaultScoreInfoString() { local String ScoreInfoString; if ( GRI == None ) return ""; if ( GRI.MaxLives != 0 ) ScoreInfoString = MaxLives@GRI.MaxLives; else if ( GRI.GoalScore != 0 ) ScoreInfoString = FragLimit@GRI.GoalScore; if ( GRI.TimeLimit != 0 ) ScoreInfoString = ScoreInfoString@spacer@TimeLimit$FormatTime(GRI.RemainingTime); else ScoreInfoString = ScoreInfoString@spacer@FooterText@FormatTime(GRI.ElapsedTime); return ScoreInfoString; } function ExtraMarking(Canvas Canvas, int PlayerCount, int OwnerOffset, int XPos, int YPos, int YOffset); 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, LongestNameLength; local string playername[MAXPLAYERS], LongestName; local bool bNameFontReduction; local font ReducedFont; 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 FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( LongestNameLength > 0 ) { bNameFontReduction = true; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) { Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+2); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+3); } ReducedFont = Canvas.Font; } 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; Canvas.DrawColor = HUDClass.default.GoldColor; Canvas.SetPos(NameXPos, OwnerPos); if ( bNameFontReduction ) Canvas.Font = ReducedFont; Canvas.DrawText(playername[OwnerOffset],true); if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.SetPos(ScoreXPos, OwnerPos); if ( GRI.PRIArray[OwnerOffset].bOutOfLives ) Canvas.DrawText(OutText,true); else Canvas.DrawText(int(GRI.PRIArray[OwnerOffset].Score),true); Canvas.SetPos(DeathsXPos, OwnerPos); Canvas.DrawText(int(GRI.PRIArray[OwnerOffset].Deaths),true); ExtraMarking(Canvas, PlayerCount, OwnerOffset, NameXPos, PlayerBoxSizeY + BoxSpaceY, BoxTextOffsetY); 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= PlayerCount) && PRIArray[OwnerOffset].bAdmin ) { Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*PlayerCount + BoxTextOffsetY); Canvas.DrawText(AdminText,true); } } Canvas.DrawColor = HUDClass.default.CyanColor; Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction); Canvas.StrLen("Test", XL, YL); BoxTextOffsetY = HeaderOffsetY + 0.5*PlayerBoxSizeY; bHaveHalfFont = ( YL < 0.5 * PlayerBoxSizeY); // if game hasn't begun, draw ready or not ready if ( !GRI.bMatchHasBegun ) { bDrawPL = PlayerBoxSizeY > 3 * YL; for ( i=0; i 3 * YL; bDrawPL = PlayerBoxSizeY > 4 * YL; } if ( ((FPHTime == 0) || (!UnrealPlayer(Owner).bDisplayLoser && !UnrealPlayer(Owner).bDisplayWinner)) && (GRI.ElapsedTime > 0) ) FPHTime = GRI.ElapsedTime; for ( i=0; i= PlayerCount) && !PRIArray[OwnerOffset].bAdmin && !PRIArray[OwnerOffset].bOutOfLives ) { if ( bDrawFPH ) { Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - 1.5 * YL); Canvas.DrawText(PingText@Min(999,4*PRIArray[OwnerOffset].Ping),true); Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - 0.5 * YL); Canvas.DrawText(FPH@Min(999,3600*PRIArray[OwnerOffset].Score/FMax(1,FPHTime - PRIArray[OwnerOffset].StartTime)),true); Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY + 0.5 * YL); Canvas.DrawText(FormatTime(Max(0,FPHTime - PRIArray[OwnerOffset].StartTime)),true); } else if ( bHaveHalfFont ) { Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - YL); Canvas.DrawText(PingText@Min(999,4*PRIArray[OwnerOffset].Ping),true); Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(FormatTime(Max(0,FPHTime - PRIArray[OwnerOffset].StartTime)),true); } else { Canvas.SetPos(NetXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY - 0.5*YL); Canvas.DrawText(PingText@Min(999,4*PRIArray[OwnerOffset].Ping),true); } } } F_n F_F_n-u?Z+MSn D@Z+<n %9n nmD*'Hn-'D* GF_4p)[+!"4[+d+F.%`.,s.,.,TFp).>F-U~xinterface.Tab_SPProfileLoad 'd.>F*U_*xinterface.Tab_SPTutorials dAQX+^ .>F.UJxinterface.Tab_SPLadderQualify ^ AQQ+] .>F+U@xinterface.Tab_SPLadderTeam ] AQU+-m'dF-B'^ -E(] -E( GF_l F_F_y-x?c+A79cl D@c+Ll %Ll 7nmIl nmf*'Xy-'f* GF__s?k+o;_k+s+x c,wx *^ -E'&x %] -E'FG] A'FG^ A'{x sx  GF_hF_F_f~?q+DZO7nm%h7nm&Oh%Ehnm Dq+'hh7&h%h Dq+'h^-E_^*'( GF_iF_F_v?{? ga-c, GF_F_F_z?lsrY pSINGLEPLAYER UT2SinglePlayerMain detected special event of lwc,*c,c,-c,yzlDRAFT 'KXInterface.UT2SP_DraftEventPagem.[ ]mm%.Laddershots.TeamDMShot ' ~lTRADE%Vl,}l (KXInterface.UT2SP_PlayerTradePage\.S ]\ UV E~lCOMPLETE%k{l,CHAMP (KXInterface.UT2SP_LadderEventPagem.[ ]9zl,TDM Y-r' Ymj; Amm%.Laddershots.TeamDMMoneyShot 'c,s  $hzl,CTF Y-' Ymj; Amm%.Laddershots.CTFMoneyShot 'c,s  $hzl,DOM Y-u' Ymj; Amm%.Laddershots.DOMMoneyShot 'c,s  $hhzl,BR Y-@' Ymj; Amm%.Laddershots.BRMoneyShot 'c,s  $B ^-T' ^-`'c,-(c,m"pSTART endgame.ut2?quickstart=true?TeamScreen=false?savegame=c, X(  ~lOPENED% (KXInterface.UT2SP_LadderEventPagem.[ ]c,s $>zl,TDMmj; ^ mm%.Laddershots.TeamDMShot ' zl,CTFmj; ^ mmTUT-CTFmm%.Laddershots.CTFShot ' pzl,DOMmj; ^ mmTUT-DOMmm%.Laddershots.DOMShot '  zl,BRmj; ^ mmTUT-BRmm%.Laddershots.BRShot '  zl,CHAMPmj; ^ mm%.Laddershots.ChampionshipShot ' GF_]class Browser_ServerListPageLAN extends Browser_ServerListPageBase; var LANQueryClient LQC; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); GUIButton(GUIPanel(Controls[1]).Controls[6]).bVisible = false; GUIButton(GUIPanel(Controls[1]).Controls[7]).bVisible = false; StatusBar.WinWidth=1.0; if( LQC == None ) { LQC = PlayerOwner().Level.Spawn( class'LANQueryClient' ); LQC.OnReceivedPingInfo = MyReceivedPingInfo; LQC.OnPingTimeout = MyServersList.MyPingTimeout; } // Change server list spacing a bit (no icons) MyServersList.InitColumnPerc[0]=0.0; MyServersList.InitColumnPerc[1]=0.47; MyServersList.InitColumnPerc[2]=0.25; MyServersList.InitColumnPerc[3]=0.13; MyServersList.InitColumnPerc[4]=0.15; RefreshList(); } function OnCloseBrowser() { if( LQC != None ) { LQC.Destroy(); LQC = None; } } function MyReceivedPingInfo( int ServerID, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s ) { local int i; if( ServerID < 0 ) { for( i=0;i (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { BoxSpaceY = 0.125 * YL; if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( MaxPlayerCount > (Canvas.ClipY - 1.5 * HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( (Canvas.ClipY >= 600) && (MaxPlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY)) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( MaxPlayerCount > (Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; } } } } } } MaxPlayerCount = Min(MaxPlayerCount, 1+(Canvas.ClipY - HeadFoot)/(PlayerBoxSizeY + BoxSpaceY) ); if ( FontReduction > 2 ) MaxScaling = 3; else MaxScaling = 2.125; PlayerBoxSizeY = FClamp((1+(Canvas.ClipY - 0.67 * MessageFoot))/MaxPlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); bDisplayMessages = (MaxPlayerCount < (Canvas.ClipY - MessageFoot)/(PlayerBoxSizeY + BoxSpaceY)); RedPlayerCount = Min(RedPlayerCount,MaxPlayerCount); BluePlayerCount = Min(BluePlayerCount,MaxPlayerCount); if ( RedOwnerOffset >= RedPlayerCount ) RedPlayerCount -= 1; if ( BlueOwnerOffset >= BluePlayerCount ) BluePlayerCount -= 1; HeaderOffsetY = 1.5*YL + IconSize; // draw title Canvas.Style = ERenderStyle.STY_Normal; DrawTitle(Canvas, HeaderOffsetY, (MaxPlayerCount+1)*(PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY); if ( GRI != None ) { // draw red team MainFont = Canvas.Font; for (i=0; i<32; i++ ) PRIArray[i] = RedPRI[i]; DrawTeam(0,RedPlayerCount,RedOwnerOffset,Canvas, FontReduction,BoxSpaceY,PlayerBoxSizeY,HeaderOffsetY); // draw blue team Canvas.Font = MainFont; for (i=0; i<32; i++ ) PRIArray[i] = BluePRI[i]; DrawTeam(1,BluePlayerCount,BlueOwnerOffset,Canvas, FontReduction,BoxSpaceY,PlayerBoxSizeY,HeaderOffsetY); } if ( Level.NetMode != NM_Standalone ) DrawMatchID(Canvas,FontReduction); } function DrawTeam(int TeamNum, int PlayerCount, int OwnerOffset, Canvas Canvas, int FontReduction, int BoxSpaceY, int PlayerBoxSizeY, int HeaderOffsetY) { local int i, OwnerPos, NetXPos, NameXPos, BoxTextOffsetY, ScoreXPos, ScoreYPos, BoxXPos, BoxWidth, LineCount,NameY; local float XL,YL,IconScale,ScoreBackScale,ScoreYL,MaxNamePos,LongestNameLength, oXL, oYL; local string PlayerName[MAXPLAYERS], OrdersText, LongestName; local font MainFont, ReducedFont; local bool bHaveHalfFont, bNameFontReduction; local int SymbolUSize, SymbolVSize, OtherTeam, LastLine; BoxWidth = 0.47 * Canvas.ClipX; BoxXPos = 0.5 * (0.5 * Canvas.ClipX - BoxWidth); BoxWidth = 0.5 * Canvas.ClipX - 2*BoxXPos; BoxXPos = BoxXPos + TeamNum * 0.5 * Canvas.ClipX; NameXPos = BoxXPos + 0.05 * BoxWidth; ScoreXPos = BoxXPos + 0.55 * BoxWidth; NetXPos = BoxXPos + 0.76 * BoxWidth; bHaveHalfFont = HaveHalfFont(Canvas, FontReduction); // draw background box Canvas.Style = ERenderStyle.STY_Alpha; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(BoxXPos, HeaderOffsetY); Canvas.DrawTileStretched( TeamBoxMaterial[TeamNum], BoxWidth, PlayerCount * (PlayerBoxSizeY + BoxSpaceY)); // draw team header IconScale = Canvas.ClipX/4096; ScoreBackScale = Canvas.ClipX/1024; if ( GRI.TeamSymbols[TeamNum] != None ) { SymbolUSize = GRI.TeamSymbols[TeamNum].USize; SymbolVSize = GRI.TeamSymbols[TeamNum].VSize; } else { SymbolUSize = 256; SymbolVSize = 256; } ScoreYPos = HeaderOffsetY - SymbolVSize * IconScale - BoxSpaceY; Canvas.DrawColor = 0.75 * HUDClass.default.WhiteColor; Canvas.SetPos(BoxXPos, ScoreYPos - BoxSpaceY); Canvas.DrawTileStretched( Material'InterfaceContent.ScoreBoxA', BoxWidth, HeaderOffsetY + BoxSpaceY - ScoreYPos); Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = TeamColors[TeamNum]; Canvas.SetPos((0.25 + 0.5*TeamNum) * Canvas.ClipX - (SymbolUSize + 32) * IconScale, ScoreYPos); if ( GRI.TeamSymbols[TeamNum] != None ) Canvas.DrawIcon(GRI.TeamSymbols[TeamNum],IconScale); MainFont = Canvas.Font; Canvas.Font = HUDClass.static.LargerFontThan(MainFont); Canvas.StrLen("TEST",XL,ScoreYL); if ( ScoreYPos == 0 ) ScoreYPos = HeaderOffsetY - ScoreYL; else ScoreYPos = ScoreYPos + 0.5 * SymbolVSize * IconScale - 0.5 * ScoreYL; Canvas.SetPos((0.25 + 0.5*TeamNum) * Canvas.ClipX + 32*IconScale,ScoreYPos); Canvas.DrawText(int(GRI.Teams[TeamNum].Score)); Canvas.Font = MainFont; Canvas.DrawColor = HUDClass.default.WhiteColor; IconScale = Canvas.ClipX/1024; if ( PlayerCount <= 0 ) return; // draw lines between sections if ( TeamNum == 0 ) Canvas.DrawColor = HUDClass.default.RedColor; else Canvas.DrawColor = HUDClass.default.BlueColor; if ( OwnerOffset >= PlayerCount ) LastLine = PlayerCount+1; else LastLine = PlayerCount; for ( i=1; i FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( LongestNameLength > 0 ) { bNameFontReduction = true; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) { Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+2); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+3); } ReducedFont = Canvas.Font; } for ( i=0; i MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[OwnerOffset] = left(playername[OwnerOffset], MaxNamePos/XL * len(PlayerName[OwnerOffset])); } if ( Canvas.ClipX < 512 ) NameY = 0.5 * YL; else if ( !bHaveHalfFont ) NameY = 0.125 * YL; Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL; Canvas.DrawColor = HUDClass.default.WhiteColor; if ( OwnerOffset == -1 ) { for ( i=0; i= 0 ) { if ( OwnerOffset >= PlayerCount ) { OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*PlayerCount + BoxTextOffsetY; // draw extra box Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(BoxXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY)*PlayerCount); Canvas.DrawTileStretched( TeamBoxMaterial[TeamNum], BoxWidth, PlayerBoxSizeY); Canvas.Style = ERenderStyle.STY_Normal; if ( PRIArray[OwnerOffset].HasFlag != None ) { Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos - 48*IconScale, OwnerPos - 16*IconScale); Canvas.DrawTile( FlagIcon, 64*IconScale, 32*IconScale, 0, 0, 256, 128); } } else OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*OwnerOffset + BoxTextOffsetY; Canvas.DrawColor = HUDClass.default.GoldColor; Canvas.SetPos(NameXPos, OwnerPos-0.5*YL+NameY); if ( bNameFontReduction ) Canvas.Font = ReducedFont; Canvas.DrawText(playername[OwnerOffset],true); if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.SetPos(ScoreXPos, OwnerPos); if ( PRIArray[OwnerOffset].bOutOfLives ) Canvas.DrawText(OutText,true); else Canvas.DrawText(int(PRIArray[OwnerOffset].Score),true); } // draw flag icons Canvas.DrawColor = HUDClass.default.WhiteColor; if ( TeamNum == 0 ) OtherTeam = 1; if ( (GRI.FlagState[OtherTeam] != EFlagState.FLAG_Home) && (GRI.FlagState[OtherTeam] != EFlagState.FLAG_Down) ) { for ( i=0; i= 0) && (Canvas.ClipX >= 512) ) { BoxTextOffsetY = HeaderOffsetY + 0.5*PlayerBoxSizeY + NameY; Canvas.DrawColor = HUDClass.default.CyanColor; if ( FontReduction > 3 ) bHaveHalfFont = false; if ( Canvas.ClipX >= 1280 ) Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+2); else Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+1); Canvas.StrLen("Test", XL, YL); for ( i=0; i= ScoreXPos - NameXPos ) OrdersText = "("$PRIArray[i].GetCallSign()$") "$TeamPlayerReplicationInfo(PRIArray[i]).Squad.GetShortOrderStringFor(TeamPlayerReplicationInfo(PRIArray[i])); } Canvas.DrawText(OrdersText,true); } if ( bHaveHalfFont || !PRIArray[i].bBot ) { Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY + LineCount*YL); Canvas.DrawText(PRIArray[i].GetLocationName(),true); } } if ( OwnerOffset >= PlayerCount ) { Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(PRIArray[OwnerOffset].GetLocationName(),true); } } if ( Level.NetMode == NM_Standalone ) return; Canvas.Font = MainFont; Canvas.StrLen("Test",XL,YL); BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL; DrawNetInfo(Canvas,FontReduction,HeaderOffsetY,PlayerBoxSizeY,BoxSpaceY,BoxTextOffsetY,OwnerOffset,PlayerCount,NetXPos); } F_VF_F_C@MT)%r.M* k.M GF_H@F_F_I@Lk)wc,*.,`^G.,yI|c,|LJ.,2^G.,yI|LJ GF_J@F_F_K@n,~ %T+s.n,( GF_L@F_F_M@b *+^ d GF_O@Vd2S,/5wF*wFJ*kFJB-m Vc,|rV*-Z(-Z{%V-ZrR *R .>F'UOxinterface.Tab_SPRoster R AQV+,,wR *F fOR * GF_N@F_F_Q@F_F_R@@F_F_]Lclass Browser_ServerListPageFavorites extends Browser_ServerListPageBase; struct FavoritesServerInfo { var() config int ServerID; var() config string IP; var() config int Port; var() config int QueryPort; var() config string ServerName; }; var() config array Favorites; var localized string RemoveFavoriteCaption; var localized string AddIPCaption; var localized string RePingCaption; var ServerQueryClient SQC; var GUIButton MyAddIPButton; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local GameInfo.ServerResponseLine Server; Super.Initcomponent(MyController, MyOwner); Browser.OnAddFavorite = MyAddFavorite; if( SQC == None ) { SQC = PlayerOwner().Level.Spawn( class'ServerQueryClient' ); SQC.OnReceivedPingInfo = MyServersList.MyReceivedPingInfo; SQC.OnPingTimeout = MyServersList.MyPingTimeout; } MyServersList.Clear(); for( i=0;i= 0 ) { default.Favorites.Remove(i,1); SaveFavorites(); } return true; } function SaveFavorites() { local int i; default.Favorites.Length = MyServersList.Servers.Length; for( i=0;i Buddies; var GUISplitter MainSplit; var GUISplitter BudSplit; var Browser_BuddyList MyBuddyList; var localized string AddBuddyCaption; var localized string RemoveBuddyCaption; var bool BuddyInitialized; function InitComponent(GUIController C, GUIComponent O) { Super.InitComponent(C, O); if( !BuddyInitialized ) { MainSplit = GUISplitter(Controls[0]); // Set one half of the buddy splitter to be the servers panel BudSplit.Controls[1] = MainSplit.Controls[0]; // Set the buddy splitter as one half of the main splitter MainSplit.Controls[0] = BudSplit; // Init the budsplit BudSplit.InitComponent(C, MainSplit); } MyBuddyList = Browser_BuddyList( GUIMultiColumnListBox(GUIPanel(BudSplit.Controls[0]).Controls[0]).Controls[0] ); MyBuddyList.MyBuddyPage = self; MyBuddyList.ItemCount = Buddies.Length; // Change server list spacing a bit MyServersList.InitColumnPerc[0]=0.1; MyServersList.InitColumnPerc[1]=0.25; MyServersList.InitColumnPerc[2]=0.15; MyServersList.InitColumnPerc[3]=0.125; MyServersList.InitColumnPerc[4]=0.125; // This page has a REFRESH LIST button GUIButton(GUIPanel(Controls[1]).Controls[6]).OnClick=MyRefreshClick; GUIButton(GUIPanel(Controls[1]).Controls[6]).Caption=RefreshCaption; GUIButton(GUIPanel(Controls[1]).Controls[6]).bVisible=true; // take over the "Add Favorite" button for "Add Buddy". GUIButton(GUIPanel(Controls[1]).Controls[7]).OnClick=AddBuddyClick; GUIButton(GUIPanel(Controls[1]).Controls[7]).Caption=AddBuddyCaption; // add "Remove Buddy" button GUIButton(GUIPanel(Controls[1]).Controls[4]).OnClick=RemoveBuddyClick; GUIButton(GUIPanel(Controls[1]).Controls[4]).Caption=RemoveBuddyCaption; StatusBar.WinWidth=0.6; BuddyInitialized = True; } function bool MyRefreshClick(GUIComponent Sender) { Super.MyRefreshClick(Sender); return true; } function RefreshList() { local int i; local MasterServerClient.QueryData QD; MyServersList.Clear(); // Construct query containing all buddy names i = Buddies.Length; MSC.Query.Length = i; for(i=0; i= Buddies.Length) return true; Buddies.Remove(MyBuddyList.Index, 1); MyBuddyList.ItemCount = Buddies.Length; SaveConfig(); return true; } F_S@@F_F_V@@F_F_W@F_cF_X@F_cF_Y@F_F_oF_F_[@F_F_\@F_F_F_F_]@F_F__@F_F_F_F_e@PMj> )P)R G7F_DS-W-!;DW-X-j;S-H;U- GF_F_F_k@Ki+> )K)O G6F_@c@x)J;rxR axInterface.UT2DraftTeamG@x GF_F_F_F_F_O-f@j@m GF_@F_F_n@I_h= )I)J G5F_F_F_4ve-! 4e-f-c,j GF_Vt@Lgg= )@)H G4F_i-`Oe?GVc?r?-b'-k' GF_m@g-),rg-& "KXInterface.UT2SettingsPageq.F ] wq*Ek.&qEkNqY'Bk. ,qfwBk*Bk-BkA',qfu*' M(' GF_F_F_qF_F_F_F_p@c 2 HE}c,,}c,, MCvY GF_v@F_F_w@F_F_x@F_F_y@F_F_z@F_F_{@F_F_F_F_4u@j-!$ 4j-m-c,j GF_F_F_}@F_F_|@o-)&!ro-& M(' GF_F_F_F_F__@r-o)8. ,;ppr-||-c,j GF_@AF_F_F_F_DAF_F_F_F_GAF_F_jeJeAe&. ,;pp@.9SeA.]. ,;B.e%c-c,J"set ini:Engine.Engine.RenderDevice Use16bit9T~cx16c,"setresc M' GF_JAdf +7zd g LF\c,3"get ini:Engine.Engine.RenderDevice Use16bitz\truecpgx16cpgx329Kc,"ISFULLSCREENcpcfcpcwc,J"set ini:Engine.Engine.RenderDevice Use16bit9T~dx16c,"setresdh~dx[dhZdh&#9J[9JZc,"tempsetres 640x480c-( $axinterface.UT2DeferChangeRes Gd}d,4 G GF_F_F_F_F_PAMAK~\q Rh%a Rh,a5 Sh&a Sh,a GF_F_F_dOAA[q Rh%d Rh,d5 Sh&d Sh,d GF_fK// ==================================================================== // Written by Jack Porter // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class ServerBrowser extends UT2K3GUIPage; #exec OBJ LOAD FILE=InterfaceContent.utx var Browser_Page MOTDPage; var Browser_Page DMServerListPage; var Browser_Page TDMServerListPage; var Browser_Page CTFServerListPage; var Browser_Page BRServerListPage; var Browser_Page DomServerListPage; var Browser_Page CustomServerListPage; var Browser_Page FavoritesPage; var Browser_Page LANPage; var Browser_Page PrefsPage; var Browser_Page BuddiesPage; var Browser_Page IRCPage; var bool bCreatedQueryTabs; var bool bCreatedStandardTabs; var localized string MutantTypeName, InvasionTypeName, LMSTypeName; var localized string MutantType, InvasionType, LMSType; // Filtering options var() config bool bOnlyShowStandard; var() config bool bOnlyShowNonPassword; var() config bool bDontShowFull; var() config bool bDontShowEmpty; var() config bool bDontShowWithBots; var() config string DesiredMutator; var() config string DesiredMutator2; var() config string CustomQuery; var() config int MinGamespeed, MaxGamespeed; var() config enum EViewMutatorMode { VMM_AnyMutators, VMM_NoMutators, VMM_ThisMutator, VMM_NotThisMutator } ViewMutatorMode, ViewMutator2Mode; var() config enum EStatsServerView { SSV_Any, SSV_OnlyStatsEnabled, SSV_NoStatsEnabled, } StatsServerView; var() config enum EWeaponStayServerView { WSSV_Any, WSSV_OnlyWeaponStay, WSSV_NoWeaponStay, } WeaponStayServerView; var() config enum ETranslocServerView { TSV_Any, TSV_OnlyTransloc, TSV_NoTransloc, } TranslocServerView; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); GUITitleBar(Controls[0]).DockedTabs = GUITabControl(Controls[1]); // delegates OnClose = InternalOnClose; // Add pages if(!bCreatedStandardTabs) { AddBrowserPage(MOTDPage); AddBrowserPage(PrefsPage); AddBrowserPage(IRCPage); AddBrowserPage(LANPage); AddBrowserPage(FavoritesPage); bCreatedStandardTabs=true; } } // Do we have the bonus pack installed? function bool HaveBonusPack() { local Object Test; Test = DynamicLoadObject("BonusPack.xMutantGame", class'Class'); if(Test == None) return false; Test = DynamicLoadObject("SkaarjPack.Invasion", class'Class'); if(Test == None) return false; return true; } // See if we have any custom game types (is this too slow?) function bool HaveCustomGameTypes() { local string Entry, Desc; local int Index; // Find other game types from .int files, and create tabs Index = 0; PlayerOwner().GetNextIntDesc("GameInfo",Index,Entry,Desc); while (Entry != "") { Desc = Entry$"|"$Desc; // If its not a standard game type, we have a custom one. if ( !class'Browser_ServerListPageMSCustom'.static.IsStandardGameType(Desc) ) return true; Index++; PlayerOwner().GetNextIntDesc("GameInfo", Index, Entry, Desc); } // No custom game types found return false; } function MOTDVerified(bool bMSVerified) { local Browser_ServerListPageMS NewPage; if( bCreatedQueryTabs ) return; bCreatedQueryTabs = true; AddBrowserPage(BuddiesPage); // Create tabs for 'standard' game types AddBrowserPage(DMServerListPage); AddBrowserPage(TDMServerListPage); if(!PlayerOwner().Level.IsDemoBuild()) AddBrowserPage(DomServerListPage); AddBrowserPage(CTFServerListPage); AddBrowserPage(BRServerListPage); if( HaveBonusPack() ) { NewPage = new(None) class'Browser_ServerListPageMS'; NewPage.GameType = InvasionType; NewPage.PageCaption = InvasionTypeName; AddBrowserPage(NewPage); NewPage = new(None) class'Browser_ServerListPageMS'; NewPage.GameType = LMSType; NewPage.PageCaption = LMSTypeName; AddBrowserPage(NewPage); NewPage = new(None) class'Browser_ServerListPageMS'; NewPage.GameType = MutantType; NewPage.PageCaption = MutantTypeName; AddBrowserPage(NewPage); } if( HaveCustomGameTypes() ) AddBrowserPage(CustomServerListPage); } function AddBrowserPage( Browser_Page NewPage ) { local GUITabControl TabC; NewPage.Browser = Self; TabC = GUITabControl(Controls[1]); TabC.AddTab(NewPage.PageCaption,"", NewPage); } delegate OnAddFavorite( GameInfo.ServerResponseLine Server ); function InternalOnClose(optional Bool bCanceled) { local int i; local GUITabControl TabC; TabC = GUITabControl(Controls[1]); for( i=0;i AnimNames; var float CurrentTime; var float NextAnimTime; simulated event PostBeginPlay() { local int i; if ( !bPlayCrouches ) { for ( i = AnimNames.Length - 1; i >= 0; i++ ) { if ( AnimNames[i] == 'Crouch' ) AnimNames.Remove(i,1); } } } function Tick(float Delta) { local rotator NewRot; NewRot = Rotation; NewRot.Yaw += Delta * SpinRate/Level.TimeDilation; SetRotation(NewRot); CurrentTime += Delta/Level.TimeDilation; // If desired, play some random animations if(bPlayRandomAnims && CurrentTime >= NextAnimTime) { PlayNextAnim(); } } event AnimEnd( int Channel ) { Super.AnimEnd(Channel); PlayAnim(AnimNames[0], 1.0/Level.TimeDilation, 0.25/Level.TimeDilation); } function PlayNextAnim() { local name NewAnimName; if(Mesh == None || AnimNames.Length == 0) return; NewAnimName = AnimNames[Rand(AnimNames.Length)]; while ( NewAnimName == 'Crouch' && !bPlayCrouches ) NewAnimName = AnimNames[Rand(AnimNames.Length)]; PlayAnim(NewAnimName, 1.0/Level.TimeDilation, 0.25/Level.TimeDilation); NextAnimTime = CurrentTime + AnimChangeInterval; } F_F_F_{GF_F_F_i{aAN/8 G,F_@F_F_x'// ==================================================================== // Class: XInterface.ServerListPage // Parent: XInterface.GUITabPanel // // // ==================================================================== class Browser_ServerListPageBase extends Browser_Page; // Internal var Browser_ServersList MyServersList; var bool ConnectLAN; var GUITitleBar StatusBar; var bool bInitialized; function InitComponent(GUIController MyController, GUIComponent MyOwner) { if( !bInitialized ) { MyServersList = Browser_ServersList(GUIMultiColumnListBox(GUIPanel(GUISplitter(Controls[0]).Controls[0]).Controls[0]).Controls[0]); MyServersList.MyPage = Self; MyServersList.MyRulesList = Browser_RulesList (GUIMultiColumnListBox(GUIPanel(GUISplitter(GUISplitter(Controls[0]).Controls[1]).Controls[0]).Controls[0]).Controls[0]); MyServersList.MyPlayersList = Browser_PlayersList(GUIMultiColumnListBox(GUIPanel(GUISplitter(GUISplitter(Controls[0]).Controls[1]).Controls[1]).Controls[0]).Controls[0]); MyServersList.MyRulesList.MyPage = Self; MyServersList.MyRulesList.MyServersList = MyServersList; MyServersList.MyPlayersList.MyPage = Self; MyServersList.MyPlayersList.MyServersList = MyServersList; StatusBar = GUITitleBar(GUIPanel(Controls[1]).Controls[5]); } StatusBar.SetCaption(ReadyString); Super.Initcomponent(MyController, MyOwner); if( !bInitialized ) { GUIButton(GUIPanel(Controls[1]).Controls[0]).OnClick=BackClick; GUIButton(GUIPanel(Controls[1]).Controls[1]).OnClick=RefreshClick; GUIButton(GUIPanel(Controls[1]).Controls[2]).OnClick=JoinClick; GUIButton(GUIPanel(Controls[1]).Controls[3]).OnClick=SpectateClick; GUIButton(GUIPanel(Controls[1]).Controls[4]).OnClick=AddFavoriteClick; } bInitialized = True; } // functions function RefreshList() { } function PingServer( int i, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s ) { } function CancelPings() { } // delegates function bool BackClick(GUIComponent Sender) { Controller.CloseMenu(true); return true; } function bool RefreshClick(GUIComponent Sender) { RefreshList(); return true; } function bool JoinClick(GUIComponent Sender) { MyServersList.Connect(false); return true; } function bool SpectateClick(GUIComponent Sender) { MyServersList.Connect(true); return true; } function bool AddFavoriteClick(GUIComponent Sender) { MyServersList.AddFavorite(Browser); return true; } F_@5class Browser_RulesList extends GUIMultiColumnList; var Browser_ServerListPageBase MyPage; var Browser_ServersList MyServersList; var int listitem; var localized string TrueString; var localized string FalseString; var localized string ServerModeString; var localized string DedicatedString; var localized string NonDedicatedString; var localized string AdminNameString; var localized string AdminEmailString; var localized string PasswordString; var localized string GameStatsString; var localized string GameSpeedString; var localized string MutatorString; var localized string BalanceTeamsString; var localized string PlayersBalanceTeamsString; var localized string FriendlyFireString; var localized string GoalScoreString; var localized string TimeLimitString; var localized string MinPlayersString; var localized string TranslocatorString; var localized string WeaponStayString; function InitComponent(GUIController MyController, GUIComponent MyOwner) { OnDrawItem = MyOnDrawItem; OnKeyEvent = InternalOnKeyEvent; Super.Initcomponent(MyController, MyOwner); } function MyOnDrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; GetCellLeftWidth( 0, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, LocalizeRules(MyServersList.Servers[listitem].ServerInfo[i].Key), FontScale ); GetCellLeftWidth( 1, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, LocalizeRules(MyServersList.Servers[listitem].ServerInfo[i].Value), FontScale ); } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if( Super.InternalOnKeyEvent(Key, State, delta) ) return true; if( State==1 ) { switch(Key) { case 0x0D: //IK_Enter MyServersList.Connect(false); return true; break; case 0x74: //IK_F5 MyPage.RefreshList(); return true; break; } } return false; } function string LocalizeRules( string code ) { switch( caps(code) ) { case "TRUE": return TrueString; case "FALSE": return FalseString; case "SERVERMODE": return ServerModeString; case "DEDICATED": return DedicatedString; case "NON-DEDICATED": return NonDedicatedString; case "ADMINNAME": return AdminNameString; case "ADMINEMAIL": return AdminEmailString; case "PASSWORD": return PasswordString; case "GAMESTATS": return GameStatsString; case "GAMESPEED": return GameSpeedString; case "MUTATOR": return MutatorString; case "BALANCETEAMS": return BalanceTeamsString; case "PLAYERSBALANCETEAMS": return PlayersBalanceTeamsString; case "FRIENDLYFIRE": return FriendlyFireString; case "GOALSCORE": return GoalScoreString; case "TIMELIMIT": return TimeLimitString; case "MINPLAYERS": return MinPlayersString; case "TRANSLOCATOR": return TranslocatorString; case "WEAPONSTAY": return WeaponStayString; } return code; } F_cAF_F_@F_F_rclass Browser_Prefs extends Browser_Page; var GUITitleBar StatusBar; var localized string ViewStatsStrings[3]; var localized string MutatorModeStrings[4]; var localized string WeaponStayStrings[3]; var localized string TranslocatorStrings[3]; var bool bIsInitialised; var array MutatorRecords; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.InitComponent(MyController, MyOwner); if(bIsInitialised) return; GUIButton(GUIPanel(Controls[0]).Controls[0]).OnClick=BackClick; // Set options for stats server viewing moComboBox(Controls[5]).AddItem(ViewStatsStrings[0]); moComboBox(Controls[5]).AddItem(ViewStatsStrings[1]); moComboBox(Controls[5]).AddItem(ViewStatsStrings[2]); moComboBox(Controls[5]).ReadOnly(true); // Load mutators into combobox class'xUtil'.static.GetMutatorList(MutatorRecords); moComboBox(Controls[9]).AddItem(MutatorModeStrings[0]); moComboBox(Controls[9]).AddItem(MutatorModeStrings[1]); moComboBox(Controls[9]).AddItem(MutatorModeStrings[2]); moComboBox(Controls[9]).AddItem(MutatorModeStrings[3]); moComboBox(Controls[9]).ReadOnly(true); moComboBox(Controls[13]).AddItem(MutatorModeStrings[0]); moComboBox(Controls[13]).AddItem(MutatorModeStrings[2]); moComboBox(Controls[13]).AddItem(MutatorModeStrings[3]); moComboBox(Controls[13]).ReadOnly(true); for(i=0; i 200 ) moNumericEdit(Controls[16]).SetValue( 200 ); Browser.MaxGamespeed = moNumericEdit(Controls[16]).GetValue(); } Browser.SaveConfig(); } F_gAF_F_F_F_jAF_F_kAF_F_nAF_F_oAF_F_pAF_F_qAF_F_f}F_F_g}F_n^BX tAzns NN] ArrowLeft,,,,,eeeeeF_F_F_F_F_F_uAF_F_jmu i GF_rq3{_Eq ) q %  %^ \   \  &-@CGqDF-@CGqDFAXR  GF_wAF_F_F_F_zAF_F_v].j \9D9? ]. GF_F_F_}AU.\U.3  E%%Y-@CGqDFCrZ wb*b Cx\ GF_~A@F_F_@BF_F_F_F_d@F_}-F_F_F_FBF_F_bF_F_F_F_GBF_F_p@F_D-F_KBF_F_LB@F_F_F_F_F_F_xclass Browser_PlayersList extends GUIMultiColumnList; var Browser_ServerListPageBase MyPage; var Browser_ServersList MyServersList; var int listitem; function InitComponent(GUIController MyController, GUIComponent MyOwner) { OnDrawItem = MyOnDrawItem; OnKeyEvent = InternalOnKeyEvent; Super.Initcomponent(MyController, MyOwner); } function MyOnDrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; GetCellLeftWidth( 0, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, MyServersList.Servers[listitem].PlayerInfo[i].PlayerName, FontScale ); GetCellLeftWidth( 1, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(MyServersList.Servers[listitem].PlayerInfo[i].Score), FontScale ); if( MyServersList.Servers[listitem].PlayerInfo[i].StatsID != 0 ) { GetCellLeftWidth( 2, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(MyServersList.Servers[listitem].PlayerInfo[i].StatsID), FontScale ); } GetCellLeftWidth( 3, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(MyServersList.Servers[listitem].PlayerInfo[i].Ping), FontScale ); } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if( Super.InternalOnKeyEvent(Key, State, delta) ) return true; if( State==1 ) { switch(Key) { case 0x0D: //IK_Enter MyServersList.Connect(false); return true; break; case 0x74: //IK_F5 MyPage.RefreshList(); return true; break; } } return false; } F_MBF_F_vFFFH"wb*.{bFE? -VjEo GF_uRBESH"wb*.{bEE? -V]E} GF_xSBkjaAO,  %'3% &Jwb*b Cx\' GF_uTBj]k]", &'3 &&Xwb*b Cx\' GF_sUBAu6, 3%3wb*b Cx\ GF_oVBf~A=, 3&:wb*b Cx\ GF_tWBoD, 3%  Awb*b Cx\ GF_aXB}h K, 3  &Hwb*b Cx\ GF_F_F_iclass Browser_Page extends UT2K3TabPanel; var ServerBrowser Browser; var localized string StartQueryString; var localized string AuthFailString; var localized string ConnFailString; var localized string ConnTimeoutString; var localized string QueryCompleteString; var localized string RefreshCompleteString; var localized string ReadyString; var localized string PageCaption; function OnCloseBrowser(); F_BF_h F_ZBF_F_O// ==================================================================== // Class: XInterface.STY_ArrowLeft // Parent: XInterface.STY_RoundButton // // Used in the player selection menu / circular lists // ==================================================================== class STY_ArrowLeft extends STY_RoundButton; F_`B@F_h F_aB@F_h F_F_F_F_F_OCdBo I GF_@F_F_[,I,13Y6-g zI, rx+* zl+ 6PmI,6@mx+6l ml+-6[m-q-`A 7-%jn7-CQ,Ijn-m%jnjn7-@-jn&jn-m7-$7-&-g3%88-@CGqDFVwb*b Cx\ GF_bBF_F_C|@F_h+F_F_F_EgnW (_Eg1klq^-g zk rl* zq 6Pg-k6@g-l6l g-q-`A -vu 3  GF_hB@F_F_W@F_W+F_F_F_gB@F_H+F_iBoQ j ._Eo1tQR-Yd-g zt rQ* zR @-o&6Po-t6@o-Q6l o-R-6[o--Y7--`A -xu 3 wb*b Cx\ GF_F_F_oBF_F_F_F_qBF_F_CGJ }z_EG _EE^G-G-E-E-^f-`Au z-@CGqDF GF_F_F_tBF_F_aJwx"'_Ew6Pw- GF_@F_F_wBvC *x&_Ev*6@v- GF_F_F_zBuD 2'_Eu6l u- GF_@F_F_}B] E :W_E]  z)6P] -y)6@] -t)6l ] - GF_^F_DCF_BCF_sBgjt-j)Rn%qn7g-gE nnCw1nCwn GnGCZ FCM>ns NN= ArrowRight,,,,,eeeeeF_F_Q// ==================================================================== // Class: XInterface.STY_ArrowRight // Parent: XInterface.STY_RoundButton // // Used in the player selection menu / circular lists // ==================================================================== class STY_ArrowRight extends STY_RoundButton; |JC[ HCr2|"@ NN] BindBoxErrrrrF_F_SF_u// ==================================================================== // Class: XInterface.STY_BindBox // Parent: XInterface.STY_NoBackground // // // ==================================================================== class STY_BindBox extends STY_NoBackground; fMC] KCr!f4 NN= CharButtonEE,,,,F_F_ECS)|__&$_ES) A-S)_7-S)7-k-`A -~u 3 wb*b Cx\  GF_~// ==================================================================== // Class: XInterface.STY_CharButton // Parent: XInterface.STY_SquareButton // // Background of character lists // ==================================================================== class STY_CharButton extends STY_SquareButton; EZC_ NCtE_5|& NN] ComboListBox,,,,F_F_v~R+7-% A-%7-%v GF_cBL{IF2gE/-L{ 7-%6P%-6P - GF_@F_F_PCSC{ ! gE*6@ - GF_F_F_RCUCY"gE6l  - GF_@F_F_lzGkp%NTfEG-R)-gzHT3T6PT- GF_ICh/F_WCh/F_T@F_F_E// ==================================================================== // Class: XInterface.STY_ListBox // Parent: XInterface.STY_SquareButton // // Background style for the actual combo area of the listbox // i.e. when the menu is not expanded (I think ?) // ==================================================================== class STY_ComboListBox extends STY_ListBox; F_wh/F_[Cf^Ca ]C\pf4 NN]FooterEF_F_A// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Bottom bar in the primary browser GUI // ==================================================================== class STY_Footer extends STY_SquareButton; fbCb _Cz9Of4 NN]HeaderH]UT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2HeaderFontHUT2HeaderFontHUT2HeaderFontHUT2HeaderFontH UT2HeaderFontVF_F_Cclass Browser_OpenIP extends UT2K3GUIPage; var moEditBox MyIpAddress; var Browser_ServerListPageFavorites MyFavoritesPage; function InitComponent(GUIController pMyController, GUIComponent MyOwner) { Super.InitComponent(pMyController, MyOwner); MyIpAddress = moEditBox(Controls[1]); MyIpAddress.MyEditBox.AllowedCharSet="0123456789.:"; } function bool InternalOnClick(GUIComponent Sender) { local GameInfo.ServerResponseLine S; local string address, ipString, portString; local int colonPos, portNum; if(Sender == Controls[4]) { address = MyIpAddress.GetText(); if(address == "") return true; // Parse text to find IP and possibly port number colonPos = InStr(address, ":"); if(colonPos < 0) { // No colon ipString = address; portNum = 7777; } else { ipString = Left(address, colonPos); portString = Mid(address, colonPos+1); portNum = int(portString); } S.IP = ipString; S.Port = portNum; S.QueryPort = portNum+1; S.ServerName = "Unknown"; MyFavoritesPage.MyAddFavorite(S); } Controller.CloseMenu(false); return true; } F_\// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Top bar in the primary browser GUI (background for tab controls) // ==================================================================== class STY_Header extends STY_SquareButton; F_.class STY_LadderButton extends GUIStyles; F_eC50F_fC48F_gC68F_hC3F_iC128F_jC64F_lC32F_jmzl'!@ "jml'j'-BZp GF_mC16F_oC8F_kC`'^G Sz~XX%X~p(`'-p'J-BZpPr GF_pC4F_wC2F_nC_X~ -D 'I$^ GF_qCr_ Ms %`%1II$c-o:'BI$c-I'-D ( GF_rCtCip % -D  s % s `}s ^s &s `%^GI$CuZ'`^HI$'( GF_F_F_jsCJ #%!-p^ <9:I9:$r9:I9:$i-rF9?%^FI$r-D 'I$^9:I9:$I$c-H'iI$^GCuZ GF_guCZ')B-scrcBd'-~gZ'8-~p-~ GF_S1F_~F_F_G'EDCBA@F_FvC&E< p( GF_{&\[Z^BDd |C^e\ NN]LadderButtonActive,,,, F_F_F_F_l @DgB8gq!F_ GF_YzCY%_5-kYY%W%V%+-kp-k GF_ @^ ˢ-(-x( GF_ r_ >-'-'-x(XX%M$'C!tX  GF_;class STY_LadderButtonActive extends STY_LadderButton; F_kF_F_g HDQ_QAQ JE9DQaIbY%bY, Qapm9bY- twa9?9Da9DtI9?9DI9DwbYK]Ǐ?mau GZaImQu , u , 'aIpQ'aIQa9:pntwa9?9Da9DQYRtI9?9DI9D9?9DQW?]waQYIQWQ9=,9=,9=,9=,Q0QYQWQC aRQIRQj-M[Q9=,9=,9=,$QNQYQWR9?XX=]Q3 aRQ̌?]mQu , u , (aIpQ(aIQ9=,9=,9=,9=,Q>QYQW?]Q3 aRQ?]Q9=,9=,$9=,QEQYRQW?]Qa9:pn9:p9:$ gGQaI GF_Cpk,-D '&wb*b Cx\c. GF_F F_F_@Bj F_RDN%uCsF &^F ,T9?F  g$ N% gy=F &F  gy=, GF_o1class Browser_MOTD extends Browser_Page; var MasterServerClient MSC; var String MOTD; var GUIScrollTextBox MOTDTextBox; var GUIButton UpgradeButton; var bool MustUpgrade; var bool GotMOTD; var GUITitleBar StatusBar; var float ReReadyPause; var localized string VersionString; event Timer() { StatusBar.SetCaption(ReadyString); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); StatusBar = GUITitleBar(GUIPanel(Controls[1]).Controls[3]); StatusBar.SetCaption(ReadyString); MSC = PlayerOwner().Level.Spawn( class'MasterServerClient' ); MSC.OnReceivedMOTDData = MyReceivedMOTDData; MSC.OnQueryFinished = MyQueryFinished; MOTDTextBox = GUIScrollTextBox(Controls[0]); GUIButton(GUIPanel(Controls[1]).Controls[0]).OnClick=BackClick; GUIButton(GUIPanel(Controls[1]).Controls[1]).OnClick=RefreshClick; UpgradeButton = GUIButton(GUIPanel(Controls[1]).Controls[2]); UpgradeButton.OnClick=UpgradeClick; if( !GotMOTD ) { UpgradeButton.bVisible = false; MustUpgrade = false; MSC.StartQuery(CTM_GetMOTD); StatusBar.SetCaption(StartQueryString); SetTimer(0, false); // Stop it going back to ready from a previous timer! } Controls[2].bBoundToParent=false; GUILabel(Controls[2]).Caption = "UT2004"@VersionString@PlayerOwner().Level.EngineVersion; } function MyReceivedMOTDData( MasterServerClient.EMOTDResponse Command, string Data ) { switch( Command ) { case MR_MOTD: GotMOTD = true; MOTDTextBox.SetContent(Data, Chr(13)); break; case MR_OptionalUpgrade: UpgradeButton.bVisible = true; break; case MR_MandatoryUpgrade: MustUpgrade = true; UpgradeButton.bVisible = true; break; case MR_NewServer: break; case MR_IniSetting: break; case MR_Command: break; } } function MyQueryFinished( MasterServerClient.EResponseInfo ResponseInfo, int Info ) { switch( ResponseInfo ) { case RI_Success: StatusBar.SetCaption(QueryCompleteString); SetTimer(ReReadyPause, false); if( !MustUpgrade ) Browser.MOTDVerified(true); break; case RI_AuthenticationFailed: StatusBar.SetCaption(AuthFailString); SetTimer(ReReadyPause, false); break; case RI_ConnectionFailed: StatusBar.SetCaption(ConnFailString); SetTimer(ReReadyPause, false); Browser.MOTDVerified(false); // try again MSC.StartQuery(CTM_GetMOTD); break; case RI_ConnectionTimeout: StatusBar.SetCaption(ConnTimeoutString); Browser.MOTDVerified(false); SetTimer(ReReadyPause, false); break; } } function OnCloseBrowser() { if( MSC != None ) { MSC.CancelPings(); MSC.Destroy(); MSC = None; } } // delegates function bool BackClick(GUIComponent Sender) { Controller.CloseMenu(true); return true; } function bool RefreshClick(GUIComponent Sender) { MustUpgrade = false; UpgradeButton.bVisible = false; MSC.Stop(); MSC.StartQuery(CTM_GetMOTD); StatusBar.SetCaption(StartQueryString); SetTimer(0, false); return true; } function bool UpgradeClick(GUIComponent Sender) { MSC.LaunchAutoUpdate(); return true; } F_@F_Q%F_oXF_F_F_F_KDF_F_F_^UDe PDa^e\ NNMLadderButtonHi, , , , F_F_F_F__ [_dxKZGZ, |9:|9:$-(I9:d9:$-x'|d9:d9:$-B'||9:d9:$-c'9:|9:$-B9:d9:$%K'9:d9:$'oXXX&oX, oX%XX%KoX' 9:|9:$()9:d9:$K'oX_:dVoXKoX'c-M[(9:d9:$XX% Z%KXX, XXXX&%'F9:d9:$XX, K%XX%XXXX&Z&'FF9:d9:$oXXX&2oX, oX%XX%KoX'( GF_VDe py^e YRm[e WRFZ, Gj Zj Fe ^[-o$E9:p9:$ kGZj e $9=,$9=,B#z,KFZj e $$$9=,Be 9=,9=,9=,9=,de 9=,9=,9=,9=,e aj ~(e aj ~ECN9?9DN9D^EK9?9DK9D[C[]j l GF_\$WF_7class STY_LadderButtonHi extends STY_LadderButton; F_^_cmK~ QcYRScWRc$9=,$9=,C%9C]$cQS-Ocapm9C&-(#c apm9C&-@C{9?9D{9DQ@|9?9D|9DSCS]Cf-_$cQS-Ocapm9%-(QmcQS-Oc aS (caS @C{9?9D{9DQ@|9?9D|9DSC GF_XDyKbq8yXX%m 29:p9:$y&~ g&nW!F_dhFM$0 ,nW!I M$0 ,nW!J M$0 ,nW!vM$0 ,nW!hM$0 ,nW!t M$0 -,nW!F_M$0  [y%YGZ, Z,  ~yZZ, % IZy&I% IG p $zIYM$5 $zIYM$ 5 $ Gu)rGu* z \%IVI~ &`VI~ ,~SI~ tXGF5 J$ zI~R TWz6TWzI~tXGF5 $J.w.J*Qt.JQtJJ t IYQttXGF5 TWIYtXGF GF_YDm+oQtY p $GFN 1$M$'N B$ M$'N M$' GF_\DH$Mn1pH$XX%p.-N$tX GF_S// ==================================================================== // Class: XInterface.STY_ListBox // Parent: XInterface.STY_SquareButton // // Background style for the actual "list" area of a listbox // ==================================================================== class STY_ListBox extends STY_SquareButton; buDf [Dab- NN]MidGameButtonHMUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontHUT2MidGameFontH UT2MidGameFontH UT2MidGameFontH UT2MidGameFontH UT2MidGameFontH UT2MidGameFontHUT2MidGameFontF_F_]D+piNqG%Z%xr'rx* p z$chFG~&nGY&Gew*$-+,+,G~+nGY+G+ew*&a/!AVG~,nGY,GwG%q!F_n c$+%Z+x 9:+x0&-P{+xG~+x8G~+x GY+G+Vn $+%+x {+x G~+x G~+x GY+G+oVn $+%+x r{+xG~+xG~+x GY+G+Vn $+%+, r+x@ *ax,@ +ek{axG~axG~axGYaG+n $ve+%+,0r+x *V+x!F_+xv{+xG~+xG~+xGY+G+n $ r*r*r* Nn}z&G~R G+%+7N0N- r+N*rn*0+Nnc+Nn+N-G~+NG+n $r*r* X.(rX*rX* fw.X*Xq.XzXqX+%+7XqG~+%,Xq GY+G+Vn Q $ r*r*r*r*ppppVoiceChatChannel not displaying. ViewportOwner:9VActor:9VMyPRI:9VVRI:9V!GH @qnem@q]F+% +7em +em _Fn-p' +em KFn'-n' -m'+L  -pG~,zqGY,G -mG~%zqGY%GN -nG~&zqGY&Gn k$  r*r*r*9WNo VoiceReplicationInfo so not generating VoiceChat menu!GH @qn9:$ &nzzqz %em@q]F+% +7em +em _Fn+em KFn'G~+emfQGY+emG+\ h &em@q]F+% +7em +em _Fn+em KFn'G~+emfQGY+emG+ h e,em@q]F+%b+7emX+em _FnG~+emfQGY+emG+ h n  GF_dDvVJKv%vG&Kv&KGtv~K~zv~v~K~K~z{vYvYKYKY{K'v GF_@F_F_|aD_) GF_F_F_N @ 77g% w#`4gE  w  GF_F_F_jDcDr>IkBr*r*r** GF_@W V # gEb]H3  GF_F_F_fD@F_F_gDF_F_EH#H}Z  -K(4-N`4gE  w -\$`%s`7F&R`F`D`Fc4R( GF_ MhDx 6I -'( GF_RF_F_mD~ChuGF_Vz'GXN-$r* q!h GF_@O{;5#r*r* O OzO `~O:`%jOaajO`VO`&a9JV6^bj6Kba6xba&#_ bf K!OI!CxSb GF_iDW"C`%aP%QPW"P7F`PFPuP7F_PF_`_9?,`,d_`_,d_,d`_9?%_ GF_g qDX_w5X g |XCX?XaXk"DXX9=,9=,9=,$X$X XCX$XC9?&X9=,9=,9=,9=,X/a X@B@X9=,9=,9=,9=,XC9?,DX=app(>,ʖ}_'\X JACA9?,D9?,7D% X9=,9=,9=,9=,AD \%XAXa\D(\AD: GF_ rD^ k5-(-x(-H( GF_ wD_ ba45J%-'-'-H(-x( GF_fF_F_sDF_F_M// ==================================================================== // Class: XInterface.STY_MidGameMenuButton // Parent: XInterface.STY_SquareMenuButton // // Style for the mid-game menus // ==================================================================== class STY_MidGameButton extends STY_SquareMenuButton; F_jmo!!Fjm!j!EEDLr bSquareButtonSm GF__ zD[x&9:R9:$49:[9:2-Hj'[ K$-x( [$-B( k$-c( ${%j' '9:R9:$-(9:[9:-H''[ $-x' $-B' $-c' $' $ {9D9?&9?, 9D9?&9?,f%"fwOErrorsExecCore@w@' a$&_%$AA%,&}' $(%9D9?&9?,}' $ %p&}' O$.M}p}&' $%{&-x{%{9S{& {k%{' $'{&-x{}{{& {}{' $$%' /$#}' 4$! $J7D&a-xJ,hJJ7DJ7D&' $" $J%-xJ,JJ%J% ' GF_XF_F_vD@ L?-x r-NM@ $B C 9?,b!L 9?,C%Z c A?UM@ ?Z C c L $c!owSm GF_ ~x l4"w--H'5w*X-x wX*r9:~,X C:'9:~,aBXJ:}XJ:'9:~,X C:%'r9:~, 5{zppz}ipp9:~}'' GF_|DpDX9GF_ }DL]!7console togglewQ.a!Xj4h GF_ ~DjM% I%-x(-B(-c(Fa!XtY q!F_ GF_ Dh@RBwQ%-x(-B(-c(q!XtX  GF_ @Eh ; h GF__ z t0bBr*r*r*  sz  GF_F_F_D{a wd)7DG AD%&X G &0X 7D7D&X Da a m  GF_F_F_l |.X %AD%7D GF_ GE~P p i ^ J^ ~^ /~~~ m~%j~}~~&~~~pppppConnect Failure: ~[j] (^ )!_Tz~NEEDPW_%T_7OJz6u_OJj.jpp^ ?password=6[ _O$( _zJKI^ ~ =z~WRONGPWj_%_7Oz6u_OJAO_&b_zJ:KI^ ~ z~NEEDSTATSjKU~E.]o'DY Nz~LOCALBANjJK OErrorsConnectionFailedEngine  z~SESSIONBANjJK OErrorsConnectionFailedEngine  ;z~SERVERFULLjK ^ z~CHALLENGEjbTFC_Challege pppUnhandled connection failure! FailCode '~' URL '^ ''j pmenu: ~j GF_jmf k ! )EEDLEID_jmk n  GF_{Y <X(ji $( GF_@F_p F_FEEL C%wsAOUME?w~sL$6J 6` G#SmC&wsAQUME?w~sL$9S6J 6` G#Smj6 J 6` G#%C,wsAQUME?w~sL$9S6 J 6` G#SmC,wsAQUME?w~sL$9S6J 6` G#Sm GF_q// ==================================================================== // Class: XInterface.STY_NoBackground // Parent: XInterface.GUIStyles // // // ==================================================================== class STY_NoBackground extends GUIStyles; "LEh KEU~" NN]PageE*EEEF_F_Q// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // General default page // Used as base to establish font colors // ==================================================================== class STY_Page extends GUIStyles; F_.class STY_RosterButton extends GUIStyles; F_LF_F_K!F_F_JF_F_B// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Normal push buttons (OK, Cancel, Apply) // ==================================================================== class STY_RoundButton extends GUIStyles; F_@F_F_YIEI _$iYI F g!'d9:F &I H$ G`('d a$tf U'd ( Gn[Ej TE]ns NN]RoundScaledButtoneeeeeF_F_ XE[!m 5G[! GF_XF_F_F_F_ fVEi 'sX7.&nX%GwX.*X.-N'dX.-l5nX( GF_F_F_\EDy!7Rh^hDSh`hD GF_U// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Used by scrollboxes and spinners (up/down, +/-) // ==================================================================== class STY_RoundScaledButton extends STY_RoundButton; F_]EKUC{^K-bwK=*MK=c4k!K=c5I%KG@KGK-uKG^M9?IKG^9?IJ%rKV@KVK-uKV^k!9?JKV^9?J)K% Kc@KcK-uKc^M9?K)Kc^9?KL%tKr@Kr^M9?LKr^9?L GF__Eey[j#**wg*gD$g*Ewm *m B*s#$p# GF_F_F_dE^EG]y w^E*^Eu*  GF_E F_F_dA]`;twA*}q%}q7nyr}qnAppStyle already registered '9VA''z}qnpLApLt}q}qE * AwE *t%7nnE ^7-cF稨Replacing StyletnpLwith9VE !NFtn *tnE E  E UE -^-F'( GF_ fEG g 87ujRG %G 7`"G ` w*]Could not create requested styleG `G  G %"G 7w"G w w*]Could not create requested styleG wG G %YG 7FGG FG G ) c -VA_ GF_ hEz!XTn-cF稨pp9WCloseAll bCancel:9T-z!Forced:9T-b(Currently9S7.menus open)!NFb %b 7.rb .*pp Menu[9Sb ]: None!NFppp Menu[9Sb ]:9Wb .!NFb y-b-]F''7.%VR?7.%M-z!-]F(b 7.&b %dQb b .-z!b V{G.MSETRESGG]*h( GF_ `V hvIQ- -V  w*w*wQ-B---V --V - -V - -B w*w*wQ- -V - -V -X#'@A"toggleime 0MR GF_F_F_FFeEh(I5 ] GF_F_F_ S`M"h,K7.% r]*Attempting to close a non-existing menu page(-cFpp9VCloseMenu [9W]]!NF-P-cFCannot close menu until initialization is complete!!NF(]C~5Z-`(J]MdQ]]-`]a'-P(7.%]7.&.]?$e]f*]-w] CM@]-` -]F]*KJF]*h(-P'w]*] Co'Q -X'' G"lEk iE(" NN= ScrollZoneE*E,,,,F_F_fF_F_ {fK"aYb/r]* 7.%KK"J"I"-cFpppppp9VReplaceMenu [K"] (J") (I")!NF-P 7.%-cFCannot replace menu until menu initialization is complete!!NF(fyK"]wf*f\ ]\ edQ]-fSR7.&fJ"I"'( GF_g// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // What is looks like under the scrollgrab (ie: the % area) // TODO: WTF ^^^^^^ // ==================================================================== class STY_ScrollZone extends GUIStyles; F_jmyO"!)EEDLEID_jmO"Y" GF_AF_F_ rEdK;RM-cFpppppp9VOpenMenu [d] (X") (P")!NFsw]*s] x^d(-P 7.%-cFCannot open menu until menu initialization is complete!!NF(AydmwA*A-P'(A\ ]eSR7.AX"P"kA-Fk"DISCONNECT'Could not open menud( GF_mEcL&C%}JAUUMc?}\JZ$Y6`6P~ #SmC&}JAUUMc?}\JZ$Y6`6P~ #Sm GF_[ F_F_A^yK}.|^XInterface.UT2MainMenu^JF[ LQ^Tw[ *[ -^k%k7A rkA [ h kA khFrh *h * [ rh *Could not create requested menu^*FF[ -^k7A 7A k&kA h -P(h ppCould not DLO menu '^'* GF_F_F_sEF_F_ZF_F_|E\ , GF_KF_F_Br@F_F_Xs"a 2Q~r".7zs"r".s"r"Qr"r"~r".&Ar  s"r"~rAr*Br%Br7Ar{@raB@r|aB@rBrArBr@r GF_YpEY_/iYYXz"'d9:X&Y H$ ~ `('d a$tyU'd ( GF_@F_F_Jv"gZ, )v")u" GF_DFy"N0)y")x")nz GF_F_F_zEUYEU TRUEl! (FALSEm! =SERVERMODEn! QDEDICATEDo! iNON-DEDICATEDp! }ADMINNAMEr! ADMINEMAILv! PASSWORDy! GAMESTATS{! GAMESPEED|! MUTATOR}! BALANCETEAMS~! PLAYERSBALANCETEAMSD" +FRIENDLYFIREF" ?GOALSCOREG" STIMELIMITH" hMINPLAYERSL" TRANSLOCATORM" WEAPONSTAYc U GF_@F_F_@F_F_F_F_@F_F__@#YT0 )@#)~" GF_@F_F_yEC#C !4 c+C#-B# GF_@F_F_C class Browser_BuddyList extends GUIMultiColumnList; var Browser_ServerListPageBuddy MyBuddyPage; var GUIStyles SelStyle; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); OnDrawItem = MyOnDrawItem; SelStyle = Controller.GetStyle("SquareButton",FontScale); } function MyOnDrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; if( bSelected ) SelStyle.Draw(Canvas, MSAT_Pressed, X, Y-2, W, H+2 ); GetCellLeftWidth( 0, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, MyBuddyPage.Buddies[i], FontScale ); } F_F_F_qGFD  G$F_@F_F_NFKFX* GF_F_"F_QFI#bm* )I#)Lz G F_jm#R#! kGi~ EEDLE&D]EtD` jmR#T#S bSquareButtonSm %y y( D , yD ,y'D ,D ,#D   GF_F_qF_cS#i))S# G F_GF_F_@OFR7 *E %sA#%7#%@ GF_geY#`L %L ppppc,://66@ g#:9S66@ g#-Y#L pL ?SpectatorOnly=1x -t'L pL ?LAN X(c,jL $( GF_oF_F_UFF_F_TF^#_ [ 74 %^# C~I6@ g# GF_\#F_F_WFZF` af `(' GF_[FF_F_F_F_YYF}_g Y}|e#'}9:|&} ?$ `('} X$tx U'} z$Cw -V{>'} ( GF_PF_"_Fl ^F?S" NN]ServerBrowserGridH]UT2ServerListFontHUT2ServerListFontHUT2ServerListFontHUT2ServerListFontHUT2ServerListFontE*EEE_*____,,,,,V"VVVF_F_Y// ==================================================================== // Class: XInterface.STY_ServerBrowserGrid // // // ==================================================================== class STY_ServerBrowserGrid extends GUIStyles; F_F_F_\Fg#q h} 7#7#} &} #g#X6} #%6} #'l# GF_B@F_F_H@F_F_aFi Di 7# M6i #'6i #'|i a %a 7xa xi Axa &a T9:n#9:$F -N'^ GF_vF_F_F_F_nF_F_dF`AI`%E % `#rxE xx`x7#n6x#'xx0x`E `x%x7xxx`Axx&x|` %`6@ g]*F9:r#9:$F W6r-N'^ GF_fFF_F_p#F_F_jFF_F_gFF_F_hF[W\^ GF_mF{#S9:{#9:$[ GF_lFF_F_F_F_nF^ \h`sE %F %W%^ %]^ 7#6^ #'|^ ^ " GF_kFF_F_qFY^bYE Y7#7xD 6Y#'U%U7xvUxYUNU7xx TY$Y#U7x7xU&UxYY 7x%F 7# GF_rFF_F_|#F_F_sFsAx%7xx H GF_jvFJ %] GF_wFM/]!.iRkR  %kwM/*x .T6@ g$6@ g#i766@ g#iP6@ gk766@ g#k` 6@ gc-@(+i%k% G"|Fm yF* " NN]ServerBrowserGridHeaderE*EEE,,, ,V"VVVF_F_xF{Fd 9i` %i6@ gA#i&i%k%W i GF_iF_F_]// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class STY_ServerBrowserGridHeader extends GUIStyles; F_zFE LT!?-D$S-NME $ v 9?,C$t 9?,[j66@qg#C%RPVjR\jv Xj&,Wj%Wj7ZjVjRP[jXj%Yj9?,9D9?9DRPVjE E 9=,9=,9=,9=,E Vj\jE 3aWjZjYj`AYj?pAVj9?,XjXj&WjC&RPAFUME ?Rv Pt $66@qg#SmC,RPAFUME ?Rv Pt $6 6@qg#SmC,RP.66@qg#%66@qg#%ApUME ?Rv Pt $pp9S66@qg#/9S66@qg#,SmC,RPq66@qg#'F?66@qg#'FN/AF9S66@qg#A0UME ?Rv Pt $FSm GF_F_F_F_F_.@F_FF_F_F_Vv@F_AGF_@F_F_F_"F_F_qF_n@F_EG"LGn GGw" NN]SliderCaptionH] UT2MenuFontF_F_b#}FR b &,kg$ % .&v6R #,b R,v6 R #,b ,v9S6R #}v,vp0voi 9S6R #,}i ,i p0i vpvi b #,v9S6R # }v,vp0vb v9S6R #_}v,vp0v>bv GF_@F_F_v@F_F_N class Browser_AddBuddy extends UT2K3GUIPage; var moEditBox MyNewBuddy; var Browser_ServerListPageBuddy MyBuddyPage; function InitComponent(GUIController pMyController, GUIComponent MyOwner) { Super.InitComponent(pMyController, MyOwner); MyNewBuddy = moEditBox(Controls[1]); } function bool InternalOnClick(GUIComponent Sender) { local string buddyName; if(Sender == Controls[4]) { buddyName = MyNewBuddy.GetText(); if(buddyName == "") return true; MyBuddyPage.Buddies.Length = MyBuddyPage.Buddies.Length + 1; MyBuddyPage.Buddies[MyBuddyPage.Buddies.Length - 1] = buddyName; MyBuddyPage.MyBuddyList.ItemCount = MyBuddyPage.Buddies.Length; MyBuddyPage.SaveConfig(); } Controller.CloseMenu(false); return true; } F_u// ==================================================================== // Class: XInterface.STY_SliderCaption // Parent: XInterface.GUIStyles // // // ==================================================================== class STY_SliderCaption extends GUIStyles; F_MdV8r* 7}% d7}}bd!b -Cd7}}/ad?>^{e$ GF_Kbd!*~y6y9Db9?Qa+y{b{-S {^V GF_F_F_m$@F_F_BIF_XGn$H PJ %GJ 7@=z6J @n$J @J m$ GnqGo SG>ns NN] SquareBarE*EEEE,,F_F_F_F_PBh )A%ac ,aABA Bc S c A-c9? dnS U S 9? dn9?,AU c U BA Bc BAdn-a9? dnS U S 9? dn9? Z%v Av c Bv Bv dn9?ZZv dnU EBAdn GF_F_F_v F_F_[GvI -%v N&v N,v N,v N%t  y&t  y,t  y,t  yD{>E>9?,z$XInterface.UT2HeaderFontKc%j$DE?KwXInterface.UT2HeaderFontK_cKcN$DL=E>KwXinterface.UT2HeaderFontK_c%Kcy $D ?E>KwXinterface.UT2HeaderFontK__%W&*W,DEcWj$DE?wXInterface.UT2HeaderFontC9SW&vCpC%KcC$D=E>KwXinterface.UT2HeaderFontuW&vW&tK_cC9SW&tCpC%KcC$D?E>KwXinterface.UT2HeaderFont W&tW&vK_cWg GF_SF_F_@F_F_]GG%RSQ@%p =cL>a<9?,7Y #<x p 9?,ecIHz?x | ?9?7Yp aa@6\$Fi{|xGame.xDeathmatch!G%%dS[ ף<e9?,x 9?,_\idS[eIx e9?,x 9?,_\6\9=,g% g7YA6H gYdA[| cp dZ%[| cp | | p ag GF_@F_F_bGY M l: Y|,=9?|9?,9?&YY %}Y YY yY yY DR&y y@? 9=,$$' GF_A_G)dnK  %(Z xP'?Z %-](^-@_EZ (3Z ' GF_`GF_F_Z F_F_@F_F_dGa N \s %\Nw|,a %a wa &\a NNa 5R%N\\= $@$@9=, GF_eGsO R+ t| sltcs$=?wXInterface.UT2LargeFont GF_jGm P Bm QInterfaceContent.Backgrounds.bg10irm *m QInterfaceContent.Backgrounds.bg11wm *dm ??_ $$$ GF_v^GFyw lF GF_uhGE~ gF GF_kGk:Gcl$??wXInterface.UT2LargeFont GF_NnwN.P rN*N-(UT2SP_LadderLoading::init() could not find GameProfile or not in a ladder game.k |N"ANN"r|*UT2SP_LadderLoading::init() could not find MatchInfo.k n| yanry*UT2SP_LadderLoading::init() could not find Enemy UnrealTeamInfo data.k  b2@O N M I  G F_@F_F_Z%F_F_sfA *, 3%%C&P GF_cF_F_tcfo , f%yf &a N % &U oa fC&P GF_D// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Generic bar used to display most popup dialogs / menus // Background... (Mid-Game Menu, for example) // ==================================================================== class STY_SquareBar extends STY_RoundButton; F_F_F_pGge, g%g &_  O  %9?_9? &9?%gC&P GF_vGn%Q] .n%  GF_C F_]F_{GA&cS eC KA&|%x%C Vt%s%C `@&C LlC  GF_@F_F_jF_]F_EHF_PpM&!PM&N&l GF_}GJ&PI=jKJ&H&E&jVD&B&j GF_Y F_]F_GT&K=aWY * ]7a a Y Y AQ&P&Y VT&Y  GF_oF_QF_LH`&Q3_?od`&_&^&Z&X&o|$o GF_@F_F_U&BHo33- %  6 p GF_@F_F_mDH1@  GF_EH@F_F_F_F_CHe|E'  GF_F_F_vFHRJ~  GF_IHOkPz%z_-w&\zO6zp zzC&P |O6zp zzC&P z GF_k F_QF_VHv&d&pk * Q7a a k k v&k Au&i&k Vh&f&k  GF_LF_F_JHOHzkj6 p GF_F_F_pQHIx* 6 p GF_@F_F_xSHG  p GF_@F_F_{UHy lG  GF_@F_F_a z&W>L%;L7a La mz&L G F_F_P F_YH| FpAnnouncerNames.6 p._}.F r}*pCould not find player name sound for: 6 p} GF_}F_F_|F_F_P// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Edit boxes...base class for all other boxes / buttons // ==================================================================== class STY_SquareButton extends GUIStyles; F_Ha@W5@y |9?@ D{9?@C@$@@9=,9=,9=,@@Rah9?@9?@9?h9?hw9?g|Y'v9?g{X'G_'9?@w?I['9?@v?@GI@$@<agwv9?g9?gW @V'R'Q'|?{?|endgame.ut2|ut2-intro.ut2z,TUT W @R'bh|{ G F_cHZ W pZ $Z |=Z P'Z C'Z B'Z yN'I'H'l| GF__Hu lF GF_CP gF GF_chfy.%-i  &C&P+c GF_U&l % GF_aHO'y j b2dM%m%lm7dbz6mdO'MpmdmM % GF_SBwp B7Sh.BS mrh*pBS not found for Vignette!{  G F_eH{Jc-r* r* r* rj* rT*{w{*}{a/!s {a/!r j.{T.{{{Y`rjT`wj*Kj c %` c & GF_I @I[rj* rT*@w@*P@a/!s @a/!r  rj*j.@T.@@@,j-6S%R$rj*6S%R$Ur*Cj%6S%R$R6S%R$rj6S%R$6S%R$T-6S&R$rT*6S&R$Ar*/T%6S&R$>6S&R$trT6S&R$6S&R$I  GF_@F_F_mi'|> b2@Q%u %u 7@{6u @i'4zO&{O{6u @OQpu @u Q % GF_S kHx@vS x0x%z0x&z6z%N6z&N6z,N6z%P,d6z&P,d6z,P,d6Q%yQ=6Q&yQ=6z%y 6z&y6y %y,Z6y &y,Z6\M9:6S%R6y%RQ8=6\M9:6S&R6y&RQ8=0x9:6S%R6y%R0x9:6S&R6y&Rwj*xRxj ? #==#<T%=~wT*xRxT ?<=#<T%= GF_NkzbNka?' GF_G// ==================================================================== // Class: XInterface.STY_SquareMenuButton // Parent: XInterface.STY_SquareButton // // General all around buttons // ==================================================================== class STY_SquareMenuButton extends STY_SquareButton; "HJp mHGj" NN] TabButtonH]UT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontHUT2SmallHeaderFontE*EEE, , , , F_F_@F_F_gw~i [7wWGUICharacterListTeam::ResetList() could not reset list; invalid team. Q%QWQpQwQbW GF_I rHI. I  GF_@F_F_sHJt Ur*>W*-r ~w* c %w*A9:9:$ c & GF_S |w@3:S w0w%s0w&s6z%N6z&N6z,N6z%P,_6z&P,_6z,P,_6Q%yQ=6Q&yQ=6z%y 6z&y6y %y,Z6y &y,Z6a%N6a&N,6 %N,K6 &N,KrZ*/a9 SvSa/!o ZSaS10wZ*wRwZ ? #==#<T%=awa*w Rwa ?<=#<T%=0w%Cp0w&Cpr* bo%7bo,9:bo9:$0wboq|--9:bo9:$0wbok|bo GF_~xH) 6K  %([xP3[' GF_yHF_F_[F_F_wH}HE,( GF_~HF_F_H@F_F_F_F_v|HF1H"wb*.obFE? -VuEo GF_uEIE>H"wb*.obEE? -VPE} GF_Euk lF GF_GIPp gF GF_sHIAu2, 3%%b Cx\ GF_oIIf`V,  2%%3&b Cx\ GF_tJIo ,   , % %P   t    \ 3 b Cx\ GF_aKI} ,   7  &T     \   \ 3 b Cx\ GF_NksbNka?' GF_I PI[Iy Ew*w*g%&Lg%[mr[* W%<W,rW[*2f9D9?Wg9?,6sfN9DW[ rW[*26HfyW[Wtwr*6vg%[6vg[I  GF_QIJf r* xwj*wj*(wj c &w* c % GF_S sz@0S z6z%N6z&N6z,N6z%P,(6z&P,(6z,P,(6z%y6z&y"6y %y,P6y &y,P6Q%yQ=6Q&yQ=6a%N86a&N,x0zH(0z9:6vg6J(gIrj*/a9 jHH10w*w.*r~ *1~ /a9 ~ ~ 10r~ * {~  vwj*_w.j*{j s{j w*{ zRz{?;X94=C =j<= GF_@F_F_aI| {mO 7U| zS.-nUaUU GF_dB(D(!.~QdD(E(@( b'SmM| bBvSm GF_XI\I{9B -Y' Rh%d Rh,de Rhc6Cv9?,c4Cv?USzez-nUaU Rh%dUz Rh,dUSUUzS=-X~ eaR' GF_]IF_F_^IF_F_eF_F_NkH(bNka?' GF_[If_R  -Y(L9:f,% 9:j&?-nFJF #'9:f,' 9:j&-nF?F #<'( GF_juF_YI TqIh Y GF_eIF_F_F_F_VIN(Fx }ZUzSzZN(ZZ?USzZzzSC&P GF_Q[lSB CQl!] %g l5-DRlxl GF_omIoUS]oono@oZ-J] %Bo\6s\]  GF_F_F_H*tIkInO GF_fIoI) -XHSC&P' GF_pIF_F_F_F_nIrI~ "-X{R{ GF_sIF_F_F_F_vIWg A4|aU(W{=WlWlW$Wya?)\O?$ GF_zICh 7KC f AwC*] .CH] % GF_yINF_wINF_F_F_z{Igd&kqzgI] %-Z'pQgC,S@&Dn-Z(6@62,S9=, GF_ZNuR'wZuMr*r*- nu@uxuI GF_U(wF_|IwF_}I@wF_~I@wF_IwF_BJF_F_F_F_@JwF_EJwF_v// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Style content for all GUI tabs // ==================================================================== class STY_TabButton extends GUIStyles; "MJq IJi" NN= TextButtonH]UT2HeaderFontHUT2HeaderFontHUT2HeaderFontHUT2HeaderFontHUT2HeaderFontE*EEE,,,F_F_^x`KJu GF_F_F_JJQr  r}*(|-Q#](}p'r-k(h}f*} p-_(-_''-_''}p(-_(' GF_i// ==================================================================== // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // // Plain old button // ==================================================================== class STY_TextButton extends GUIStyles; "UJr NJ" NN] TextLabelRFMSmallTextLabelRFLargeTextLabelE*EEEEF_F_LJPJ]? 29:?9:$ r}*(}] GF_F_F_zRJ[w~Pz[o(VMw[* V!S  V!R W[ GF_TJZWo0x % WZz/rW* ErZ *A?Z Wu9?,Z GF_y F_F_Yg xQ9=9:9:$w*y n9:9:$9:9:$y ky zy (g {=g lg $b[g g g g yy H,D,$g b[' GF_i// ==================================================================== // Class: XInterface.STY_TextLabel // Parent: XInterface.GUIStyles // // Generic text label / box // ==================================================================== class STY_TextLabel extends GUIStyles; F_h// ==================================================================== // Class: XInterface.Tab_AudioSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_AudioSettings extends UT2K3TabPanel; #exec OBJ LOAD FILE=PickupSounds.uax #exec OBJ LOAD FILE=AnnouncerMale2K4.uax var localized string AudioModes[4], VoiceModes[4], AnnounceModes[3]; var moComboBox APack; var config APackInfo BonusPackInfo[4]; // Mod authors, do put anything in here since it // will be overwritten by the bonus pack. Use PackInfo instead var config array PackInfo; var bool binitialized; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local string DefPack; Super.Initcomponent(MyController, MyOwner); bInitialized = false; for (i=0;i Binds; var array BindKeyNames; var array BindLocalizedKeyNames; }; var GUIListBox MyListBox; var Color BkColor; const DefaultBindings=54; // # of default bindings there are var array Bindings; // Holds the array of key bindings var localized array Labels; // fixed-length array for localization. accesses clamped to [0,74] var bool bSetNextKeyPress; var int NewIndex, NewSubIndex; var GUIStyles SelStyle; var int row, HackIndex; // Hacky Hacky var localized string Header,Footer; var float SectionLabelMargin; var bool bListInitialised; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyListBox = GUIListBox(Controls[0]); MyListBox.List.OnDrawItem = DrawBinding; MyListBox.List.SelectedBkColor = BkColor; MyListBox.List.SelectedImage=None; MyListbox.List.OnClick=GetNewKey; MyListBox.List.OnChange=ListChange; MyListBox.List.OnKeyEvent = ListOnKeyEvent; MyListBox.List.bHotTrack=true; MyListBox.List.OnClickSound=CS_None; MyListBox.List.OnAdjustTop = MyOnAdjustTop; SelStyle = Controller.GetStyle("RoundButton",MyListBox.List.FontScale); } function ShowPanel(bool bShow) { Super.ShowPanel(bShow); if(bShow) { if(!bListInitialised) { InitBindings(); MyListBox.List.Index=1; HackIndex=1; bListInitialised = true; } } } function int Weight(int i) { if ( (i==0x01) || (i==0x02) ) return 100; if ( (i>=0x30) && (i<=0x5A) ) return 50; if (i==0x20) return 45; if (i==0x04) return 40; if (i==0xEC || i==0xED) return 35; if (i>=0x21 && i<=0x28) return 30; if (i>=0x60 && i<=0x6F) return 30; return 25; } function Swap(int index, int a, int b) { local int TempInt; local string TempStrA, TempStrB; TempInt = Bindings[Index].Binds[a]; TempStrA = Bindings[Index].BindKeyNames[a]; TempStrB = Bindings[Index].BindLocalizedKeyNames[a]; Bindings[Index].Binds[a] = Bindings[Index].Binds[B]; Bindings[Index].BindKeyNames[a] = Bindings[Index].BindKeyNames[b]; Bindings[Index].BindLocalizedKeyNames[a] = Bindings[Index].BindLocalizedKeyNames[b]; Bindings[Index].Binds[b] = TempInt; Bindings[Index].BindKeyNames[b] = TempStrA; Bindings[Index].BindLocalizedKeyNames[b] = TempStrB; } function AddToBindings(string Alias, string KeyLabel, bool bSectionLabel) { local int At; At = Bindings.Length; Bindings.Length = Bindings.Length + 1; Bindings[At].bIsSectionLabel = bSectionLabel; Bindings[At].KeyLabel = KeyLabel; Bindings[At].Alias = Alias; MyListBox.List.Add(Bindings[At].KeyLabel); } function InitBindings() { local int i,j,k,index; local string KeyName, Alias, LocalizedKeyName; local string UserKeyClass; local class Key; // Clear them all. for (i=0;i0) Bindings[i].Binds.Remove(0,Bindings[i].Binds.Length); if (Bindings[i].BindKeyNames.Length>0) Bindings[i].BindKeyNames.Remove(0,Bindings[i].BindKeyNames.Length); if (Bindings[i].BindLocalizedKeyNames.Length>0) Bindings[i].BindLocalizedKeyNames.Remove(0,Bindings[i].BindLocalizedKeyNames.Length); // Set the Localized name if (i(DynamicLoadObject(UserKeyClass,class'Class')); if (Key!=None) { for (i=0;i= bindings.Length ) return ""; if (Bindings[Index].bIsSectionLabel) return ""; if (Index==NewIndex && Bind==NewSubIndex) return "???"; if (Bind>=Bindings[Index].Binds.Length) return ""; return Bindings[Index].BindLocalizedKeyNames[Bind]; } function DrawBinding(Canvas Canvas, int Item, float X, float Y, float W, float H, bool bSelected, bool bPending) { local int x1,w1; local bool InBindArea; //local emenustate ems; if (Item>=Bindings.Length) return; if (Controller.MouseX >= controls[2].Bounds[0] && Controller.MouseX <=Controls[3].Bounds[2]) { InBindArea=true; } if ( (Controller.HasMouseMoved()) && (!bSetNextKeyPress) ) { if (InBindArea) { if ( ( Controller.MouseX >= Controls[2].Bounds[0] ) && ( Controller.MouseX <= Controls[2].Bounds[2] ) ) Row = 0; else if ( (Controller.MouseX>=Controls[3].Bounds[0]) && (Controller.MouseX<=Controls[3].Bounds[2]) ) Row = 1; InBindArea=true; } if ( InBindArea && (MyListBox.List.Index != HackIndex) && (MyListBox.List.Index= Controls[2].Bounds[0] ) && ( Controller.MouseX <= Controls[2].Bounds[2] ) ) RemoveExistingKey(MyListBox.List.Index,0); else if ( (Controller.MouseX>=Controls[3].Bounds[0]) && (Controller.MouseX<=Controls[3].Bounds[2]) ) RemoveExistingKey(MyListBox.List.Index,1); UpdateHint(MyListBox.List.Index); return true; } // -- WARNING.. really big hack here if ( (State==1) && (Key==0x25 || Key==0x64 || Key==0x27 || Key ==0x66) ) { if (row==0) row = 1; else row = 0; UpdateHint(MyListBox.List.Index); return true; } OldIndex = MyListBox.List.Index; result = MyListBox.List.InternalOnKeyEvent(Key,State,delta); if (MyListBox.List.Index!=OldIndex) { if (Bindings[MyListBox.List.Index].bIsSectionLabel) { if (MyListBox.List.Index0) { if (!Bindings[cindex].bIsSectionLabel) { MyListBox.List.SetIndex(cIndex); return; } cindex--; } MyListBox.List.SetIndex(OldIndex); } function SearchDown(int OldIndex) { local int cindex; cindex = MyListBox.List.Index; while (cindex=Bindings.Length) || (SubIndex>=Bindings[Index].Binds.Length) || (Bindings[Index].Binds[SubIndex] <0) ) return; // Clear the bind PlayerOwner().ConsoleCommand("SET Input"@Bindings[Index].BindKeyNames[SubIndex]); // Clear the entry Bindings[Index].Binds.Remove(SubIndex,1); Bindings[Index].BindKeyNames.Remove(SubIndex,1); Bindings[Index].BindLocalizedKeyNames.Remove(SubIndex,1); } function RemoveAllOccurance(byte NewKey) { local int i,j; for (i=0;i=0;j--) { if (Bindings[i].Binds[j]==NewKey) { RemoveExistingKey(i,j); } } } } function UpdateHint(int index) { local int i; local string t; if (Index<0 || Index>=Bindings.Length) { MyListBox.List.Hint =""; Controller.ActivePage.SetHint(MyListBox.List.Hint); return; } else { t = ""; for (i=0;i= Bindings.Length) return; if ( (SubIndex=Bindings[Index].Binds.Length) { Bindings[Index].Binds.Length = Bindings[Index].Binds.Length + 1; Bindings[Index].BindKeyNames.Length = Bindings[Index].BindKeyNames.Length + 1; Bindings[Index].BindLocalizedKeyNames.Length = Bindings[Index].BindLocalizedKeyNames.Length + 1; SubIndex = Bindings[Index].Binds.Length-1; } Bindings[Index].Binds[SubIndex] = NewKey; Bindings[Index].BindKeyNames[SubIndex] = PlayerOwner().ConsoleCommand("KeyName"@NewKey); Bindings[Index].BindLocalizedKeyNames[SubIndex] = PlayerOwner().ConsoleCommand("LOCALIZEDKEYNAME"@NewKey); PlayerOwner().ConsoleCommand("SET Input"@Bindings[Index].BindKeyNames[SubIndex]@Bindings[Index].Alias); UpdateHint(Index); } function bool GetNewKey(GUIComponent Sender) { local int SubIndex; if ( ( Controller.MouseX >= Controls[2].Bounds[0] ) && ( Controller.MouseX <= Controls[2].Bounds[2] ) ) SubIndex = 0; else if ( (Controller.MouseX>=Controls[3].Bounds[0]) && (Controller.MouseX<=Controls[3].Bounds[2]) ) SubIndex = 1; else return true; NewIndex = MyListBox.List.Index; NewSubIndex = SubIndex; bSetNextKeyPress=true; Controller.OnNeedRawKeyPress = RawKey; Controller.Master.bRequireRawJoystick=true; PlayerOwner().ClientPlaySound(Controller.EditSound); PlayerOwner().ConsoleCommand("toggleime 0"); return true; } function bool RawKey(byte NewKey) { if (NewKey!=0x1B) AddNewKey(NewIndex, NewSubIndex, NewKey); NewIndex = -1; NewSubIndex = -1; bSetNextKeyPress=false; Controller.OnNeedRawKeyPress = none; Controller.Master.bRequireRawJoystick=false; PlayerOwner().ClientPlaySound(Controller.ClickSound); return true; } function ListChange(GUIComponent Sender) { UpdateHint(MyListBox.List.Index); } function MyOnAdjustTop(GUIComponent Sender) { if( MyListBox.List.Index < MyListBox.List.Top ) MyListBox.List.SetIndex( MyListBox.List.Top ); else if( MyListBox.List.Index >= MyListBox.List.Top + MyListBox.List.ItemsPerPage ) MyListBox.List.SetIndex( MyListBox.List.Top + MyListBox.List.ItemsPerPage ); } function bool ResetClicked(GUIComponent Sender) { Controller.ResetKeyboard(); InitBindings(); return true; } F_PE)I +$!-X-a-E)C&P GF_J// ==================================================================== // Class: XInterface.Tab_DetailSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_DetailSettings extends UT2K3TabPanel; var config bool bExpert; var localized string DetailLevels[7]; var bool bPlayedSound; // bit hacky - but needed to know if we are increasing detail var int prevWorldDetail, prevTextureDetail, prevCharDetail; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i prevTextureDetail) goingUp = true; prevTextureDetail = newDetail; } else if (Sender==Controls[2]) { t = "set ini:Engine.Engine.ViewportManager TextureDetail"; if(moComboBox(Sender).GetText() == DetailLevels[0]) { v = "UltraLow"; newDetail = 0; } else if(moComboBox(Sender).GetText() == DetailLevels[1]) { v = "Low"; newDetail = 1; } else if(moComboBox(Sender).GetText() == DetailLevels[2]) { v = "Lower"; newDetail = 2; } else if(moComboBox(Sender).GetText() == DetailLevels[3]) { v = "Normal"; newDetail = 3; } else if(moComboBox(Sender).GetText() == DetailLevels[4]) { v = "Higher"; newDetail = 4; } else if(moComboBox(Sender).GetText() == DetailLevels[5]) { v = "High"; newDetail = 5; } else if(moComboBox(Sender).GetText() == DetailLevels[6]) { v = "UltraHigh"; newDetail = 6; } PlayerOwner().ConsoleCommand(t$"WeaponSkin"@v); PlayerOwner().ConsoleCommand(t$"PlayerSkin"@v); PlayerOwner().ConsoleCommand("flush"); if(newDetail > prevCharDetail) goingUp = true; prevCharDetail = newDetail; } else if (Sender==Controls[3]) { if(moComboBox(Sender).GetText() == DetailLevels[6]) { PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice HighDetailActors True"); PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice SuperHighDetailActors True"); PlayerOwner().Level.DetailChange(DM_SuperHigh); newDetail = 6; } else if(moComboBox(Sender).GetText() == DetailLevels[4]) { PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice HighDetailActors True"); PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice SuperHighDetailActors False"); PlayerOwner().Level.DetailChange(DM_High); newDetail = 4; } else if(moComboBox(Sender).GetText() == DetailLevels[3]) { PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice HighDetailActors False"); PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice SuperHighDetailActors False"); PlayerOwner().Level.DetailChange(DM_Low); newDetail = 3; } if(newDetail > prevWorldDetail) goingUp = true; prevWorldDetail = newDetail; } else if (Sender==Controls[4]) { if (moComboBox(Sender).GetText()==DetailLevels[2]) PlayerOwner().Level.default.PhysicsDetailLevel=PDL_Low; else if (moComboBox(Sender).GetText()==DetailLevels[3]) PlayerOwner().Level.default.PhysicsDetailLevel=PDL_Medium; else if (moComboBox(Sender).GetText()==DetailLevels[4]) PlayerOwner().Level.default.PhysicsDetailLevel=PDL_High; PlayerOwner().Level.PhysicsDetailLevel = PlayerOwner().Level.default.PhysicsDetailLevel; PlayerOwner().Level.SaveConfig(); } else if (Sender==Controls[5]) { PlayerOwner().ConsoleCommand("set UnrealPawn bPlayerShadows "$moCheckBox(Sender).IsChecked()); class'UnrealPawn'.default.bPlayerShadows = moCheckBox(Sender).IsChecked(); class'UnrealPawn'.static.StaticSaveConfig(); if( moCheckBox(Sender).IsChecked() ) goingUp = true; } else if (Sender==Controls[14]) { PlayerOwner().ConsoleCommand("set UnrealPawn bBlobShadow "$moCheckBox(Sender).IsChecked()); class'UnrealPawn'.default.bBlobShadow = moCheckBox(Sender).IsChecked(); class'UnrealPawn'.static.StaticSaveConfig(); } else if (Sender==Controls[7]) { b = moCheckBox(Sender).IsChecked(); b = b!=true; PlayerOwner().ConsoleCommand("set"@Sender.INIOption@b); if( moCheckBox(Sender).IsChecked() ) goingUp = true; } else if (Sender==Controls[10]) { if (moComboBox(Sender).GetText()==DetailLevels[4]) PlayerOwner().Level.default.DecalStayScale=2; else if (moComboBox(Sender).GetText()==DetailLevels[3]) PlayerOwner().Level.default.DecalStayScale=1; else if (moComboBox(Sender).GetText()==DetailLevels[2]) PlayerOwner().Level.default.DecalStayScale=0; PlayerOwner().Level.DecalStayScale=PlayerOwner().Level.default.DecalStayScale; PlayerOwner().Level.SaveConfig(); } else { PlayerOwner().ConsoleCommand("set"@Sender.INIOption@moCheckBox(Sender).IsChecked()); if( moCheckBox(Sender).IsChecked() ) goingUp = true; } // If we have increased the detail level, show paranoid warning if (goingUp && !bExpert) Controller.OpenMenu("XInterface.UT2PerformWarn"); // Check if we are maxed out (and mature-enabled)! if( !bPlayedSound && !PlayerOwner().bNoMatureLanguage && moComboBox(Controls[1]).GetText() == DetailLevels[6] && moComboBox(Controls[2]).GetText() == DetailLevels[6] && moComboBox(Controls[3]).GetText() == DetailLevels[6] && moComboBox(Controls[4]).GetText() == DetailLevels[4] && moCheckBox(Controls[5]).IsChecked() && moCheckBox(Controls[6]).IsChecked() && moCheckBox(Controls[7]).IsChecked() && moCheckBox(Controls[8]).IsChecked() && moCheckBox(Controls[9]).IsChecked() && moComboBox(Controls[10]).GetText() == DetailLevels[4] && moCheckBox(Controls[11]).IsChecked() && moCheckBox(Controls[12]).IsChecked() ) { PlayerOwner().ClientPlaySound(sound'AnnouncerMale2K4.HolyShit_F'); bPlayedSound = true; } } F_YJ\J)4+(-X-a-aC&P' GF_]JF_F_F_F_R F_F_cJ_Jp hO5--r* c #?R ae)d)c9?99 c'w.R *w.R * wR Ur*6w.R wr.R s?sF_J.R sr.R  GF_tU// ==================================================================== // Class: XInterface.Tab_DetailSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_GameSettings extends UT2K3TabPanel; var localized string CrosshairNames[15]; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i 0); else if (Sender==Controls[7]) moCheckBox(Sender).Checked(class'xGame.xDeathMessage'.default.bNoConsoleDeathMessages); else if (Sender==Controls[8]) { if (!class'HUD'.default.bCrosshairShow ) i = 0; else i = class'HUD'.default.CrosshairStyle +1; moComboBox(Sender).SetText(CrosshairNames[i]); SetCrossHairGraphic(i); } else if (Sender==Controls[12]) GUISlider(Sender).Value = Class'HUD'.Default.CrossHairColor.R; else if (Sender==Controls[14]) GUISlider(Sender).Value = Class'HUD'.Default.CrossHairColor.G; else if (Sender==Controls[16]) GUISlider(Sender).Value = Class'HUD'.Default.CrossHairColor.B; else if (Sender==Controls[18]) { GUISlider(Sender).Value = Class'HUD'.Default.CrossHairColor.A; GUIImage(Controls[9]).ImageColor=PlayerOwner().MyHud.CrossHairColor; } } function string InternalOnSaveINI(GUIComponent Sender); // Do the actual work here function InternalOnChange(GUIComponent Sender) { local bool b; if (!Controller.bCurMenuInitialized) return; if (Sender==Controls[2]) PlayerOwner().ConsoleCommand("set"@Sender.INIOption@moCheckBox(Sender).IsChecked()); else if (Sender==Controls[3]) { PlayerOwner().ConsoleCommand("set Pawn bWeaponBob "$moCheckBox(Sender).IsChecked()); class'Pawn'.default.bWeaponBob = moCheckBox(Sender).IsChecked(); class'Pawn'.static.StaticSaveConfig(); } else if (Sender==Controls[4]) { class'GameInfo'.default.bLowGore = moCheckBox(Sender).IsChecked(); class'GameInfo'.static.StaticSaveConfig(); } else if (Sender==controls[5]) { if( !moCheckBox(Sender).IsChecked() ) PlayerOwner().SetDodging( false ); else PlayerOwner().SetDodging( true ); } else if (Sender==Controls[6]) { if ( moCheckBox(Sender).IsChecked() ) class'GameInfo'.Default.AutoAim = 0.5; else class'GameInfo'.Default.AutoAim = 0; class'GameInfo'.static.StaticSaveConfig(); } else if (Sender==Controls[7]) { Log("xgame bNoConsoleDeathMessages was="$class'xgame.xdeathmessage'.default.bNoConsoleDeathMessages); b = moCheckBox(Sender).IsChecked(); class'XGame.xDeathMessage'.default.bNoConsoleDeathMessages=b; Log("xgame bNoConsoleDeathMessages now="$class'xgame.xdeathmessage'.default.bNoConsoleDeathMessages); class'XGame.xDeathMessage'.static.StaticSaveConfig(); Log("xgame bNoConsoleDeathMessages then="$class'xgame.xdeathmessage'.default.bNoConsoleDeathMessages); } else if (Sender==Controls[8]) { SetCrossHairGraphic(moComboBox(Sender).GetIndex()); if (moComboBox(Sender).GetText() == "Hidden") { PlayerOwner().MyHud.bCrosshairShow = false; PlayerOwner().MyHud.SaveConfig(); return; } PlayerOwner().MyHud.bCrosshairShow = true; PlayerOwner().MyHud.CrosshairStyle = moComboBox(Sender).GetIndex()-1; PlayerOwner().MyHud.SaveConfig(); } else if (Sender==Controls[12]) { PlayerOwner().MyHud.CrossHairColor.R = GUISlider(Sender).Value; PlayerOwner().MyHud.SaveConfig(); GUIImage(Controls[9]).ImageColor=PlayerOwner().MyHud.CrossHairColor; } else if (Sender==Controls[14]) { PlayerOwner().MyHud.CrossHairColor.G = GUISlider(Sender).Value; PlayerOwner().MyHud.SaveConfig(); GUIImage(Controls[9]).ImageColor=PlayerOwner().MyHud.CrossHairColor; } else if (Sender==Controls[16]) { PlayerOwner().MyHud.CrossHairColor.B = GUISlider(Sender).Value; PlayerOwner().MyHud.SaveConfig(); GUIImage(Controls[9]).ImageColor=PlayerOwner().MyHud.CrossHairColor; } else if (Sender==Controls[18]) { PlayerOwner().MyHud.CrossHairColor.A = GUISlider(Sender).Value; PlayerOwner().MyHud.SaveConfig(); GUIImage(Controls[9]).ImageColor=PlayerOwner().MyHud.CrossHairColor; } } function SetCrossHairGraphic(int Index) { local GUIImage img; Img = GUIImage(Controls[9]); Img.Image = class'HudBDeathMatch'.default.Crosshairs[Index - 1].WidgetTexture; Img.bVisible = (Index!=0); } F_Pm)x)!$-vvRo,Px)B* GF_~cwF - -R w*w*wl wlwl7{p c xl Em {r*. r*p9V custom crosshair texture not found!@m%{6H@mwlxlEmwlwl%7{&h6Qwl{Jr6H@m*@mwl{6Q@mEm|%|,|62@mxl|b.>L>6Q@m9?&9?,.6Q@m9?&9?,>\[?a[6c6c?0c@m6ca[\[6Q@mhp c GF_fJq 2$g+KK9D GF_PC*!X C*X| GF_gJr 2\F ?n ?Yw*w*TF n  GF_hJs 0Mr*vP9?9D%9DvvP9?9D%9Dv6s{9DP GF_jJt c/{cxba/!q Q.x9?9D.%9DQxQBx GF_PF*!:'-vvOVertDownButtonRo,PF*Y* GF_H*u .$e\\9? GF_b_ eoSr_ *_ %_ xw_ * x_ xx, (x,x,l%_ $'&x,l&_ $'&x,xl,_ $'&&x,<l,_ $' Qx,l,_ $'zx,l,_ $'x,  x%lx&Y+$' GF_\KLh3 ? K  K  K  GF_L // ==================================================================== // Class: XInterface.Tab_IABombingRun // Parent: XInterface.Tab_InstantActionBaseRules // // // ==================================================================== class Tab_IABombingRun extends Tab_InstantActionBaseRules; var localized string GoalScoreText; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyGoalScore.MyLabel.Caption = GoalScoreText; MyMaxLives.bVisible = false; } f[Kb:y6 wJ$ft/u! ߢ(a! NR]Capture LimitF_F_V j~Z rV * }jV e.ppSinglePlayerThumbs.V _G '?$M LadderButtone.pSinglePlayerThumbs.V  '?$jV M LadderButtonM LadderButtonHiW|M OOM A bOSmWrA*NewStyle IS None GF_g+ F_F_DKed%F__ eF_HKF_F_IKF_F_JKF_F_^F_F_MKF_F_eF_X 9~+!-$VX ~++K-g-Uy0123456789K-UaBy.-^' GF_NKA,&>%P-z-~r {9A,9A,v}9E-zK -^' GF_QKgJxv}9 oLv}9&99vv}9o9p9v9v&K  GF_SKhE[5  -_ (%{VKKVK4K9:hj9:h, h -V 9:h, (h $c, C:9-^'b 9$z9v}9-^99 p9c,J:v}96| pp9vc,J:9v9|b _$c, C:99v% K '-^9v%-^(zy3-n+zK- zK+ z9~yK%N%}9N>-y )zK  zK? zK\K_z9v}99p9Kv}9|pp9vK9v9|vK '( GF_WK@F_F_|F_F_](TKH_-_  9:D &(k9:H,iv%\-^9v%-^(K ivg'9:H,.-^9v%-^(K g'9:H,%-^v%-^(v%v'09:H,'-^v}9-^(..v}9v'O9:H,$v%-^('t9:H,#v}9-^('9:H,A -V-^''( GF_P // ==================================================================== // Class: XInterface.Tab_IACaptureTheFlag // Parent: XInterface.Tab_InstantActionBaseRules // // // ==================================================================== class Tab_IACaptureTheFlag extends Tab_InstantActionBaseRules; var localized string GoalScoreText; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyGoalScore.MyLabel.Caption = GoalScoreText; MyMaxLives.bVisible = false; } F_ 9F_^KF_F_F_F_ZKs +S%n}sSnEsS&^{y~yE%E-y )zE  zE? zE\E_WpWESN%WNW GF_v // ==================================================================== // Class: XInterface.Tab_IADeathMatch // Parent: XInterface.Tab_InstantActionBaseRules // // // ==================================================================== class Tab_IADeathMatch extends Tab_InstantActionBaseRules; var config bool LastAutoAdjustSkill; var localized string GoalScoreText; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyGoalScore.MyLabel.Caption = GoalScoreText; moCheckBox(Controls[15]).Checked(LastAutoAdjustSkill); } function string Play() { LastAutoAdjustSkill = moCheckBox(Controls[15]).IsChecked(); SaveConfig(); return Super.Play()$"?AutoAdjust="$LastAutoAdjustSkill; } F_S@F_F_ cKk-n|wZRk- GF_ eKl-lwZTl- GfhK[:{6 dK3ft/u! ߢ(a! NR] Score LimitF_F_mKsK bWjzR sz=sr \s-9?sr 9?ssaRp-ms)r 9?sm\s-9?sr 9?sssaRss&9?s9?s GF_X // ==================================================================== // Class: XInterface.Tab_IADoubleDomination // Parent: XInterface.Tab_InstantActionBaseRules // // // ==================================================================== class Tab_IADoubleDomination extends Tab_InstantActionBaseRules; var localized string GoalScoreText; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyGoalScore.MyLabel.Caption = GoalScoreText; MyMaxLives.bVisible = false; } F__KlK(, 9 GF_@F_F_rK~L NVzT ~z=~r \~-9?~r 9?~~~aT~~&9?~9?~ GF_oKVF_fVu@L|6 qK%uvo NF_F_ vKBi=SwBsB-l[9?BM(?BB1a 9?B[BBB"9?B[B1a 9?B[BBL BK B GF_|vtK)? A(i Rhc6c4Cyvii' GF_uKF_F_iF_F_ wKx-{4cS-l-x- GF_ yKGsOcPBdPB1-L UG  NQ9?G DF.9?GCOcQNdQ YH.G.w N aw w w aw Y?W9D6UX9D6UG$6G9=,6G9=,6G9=,6G9=,G09?WO?9?XN?G&ag'ONCC GF_ {KTyM>-L-T;-TNT.;UPU GF_|KERKjr*Y$YQ9Pf.Y [9?9D9?6Q6 @9?E$Epd.Ea.E[c.E^.E[dAE9?@E&a{ddCCBB GF_ CLdJZ=w.*.- WwE* aE GF_|v~K)? A(I Shc7c5CyviI' GF_KF_F_IF_F_O// ==================================================================== // Class: XInterface.Tab_IATeamDeathMatch // Parent: XInterface.Tab_InstantActionBaseRules // // // ==================================================================== class Tab_IATeamDeathMatch extends Tab_IADeathMatch; zELY:}2 TAL]z-soZ u3} Z u3}Zs u3}Zs u3}Zs u Z u Z u u Z= Z= Z== u Z=DbI( uDbI(==DbI( uDbI(==DbI( uDbI(==DbI( uDbI(=ZDbI(Z u Z u u Z Z Z Z u u Z u u Z Z Z Z u u Z u u Z Z Z Z u u Z u u Z Z Z Z unL Z u3}Zs Z u Z= Z= Z u u ZDbI(=DbI(Z Z u Z u Z u Z uDbI(=DbI(=DbI(= N'Y)fOgOhOiOjOkOlOtenOuepOqOrOsOtOuOvewexeye$>$p=?F_F_FLxO|?T[xxy xT[T%T,cr6MT$*-6xT$(r6t T$*R T$xIr6t T$*ppLayoutMessage(9V6MT$) failed!!{ FT.F,&F$F&$FQF$T6MT$-J6HT$JFTF,&F$F&$FQF$TT>T%T,*r6MT$*A-6xT$d6IT$c6yT$9:6K T$9:$^xTdcHvFTF,-6xF$6IT$6IF$-6yT$6yF$Y9:6iT$9:6iF$9:6K T$9:6K F$^xFdcHv6K F$ $cv $cv FT GFe1LIJ2 DL<.FX-̟uUuUuUuUuUuUuUoF.jZoF.jZZ NP$WDL)F_F_pc// ==================================================================== // Class: XInterface.Tab_IForceSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_IForceSettings extends UT2K3TabPanel; var moCheckBox AutoAim; var moCheckBox AutoSlope; var moCheckBox InvertMouse; var moCheckBox MouseSmooth; var moCheckBox MouseLag; var moCheckBox UseJoystick; var moFloatEdit MouseSens; var moFloatEdit MenuSens; var moCheckBox ifWeapon; var moCheckBox ifPickup; var moCheckBox ifDamage; var moCheckBox ifGUI; var moFloatEdit MouseSmoothStr; var moFloatEdit MouseThreshold; var moFloatEdit DoubleClick; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local string s; Super.Initcomponent(MyController, MyOwner); for (i=0;i0); UseJoystick = moCheckBox(Controls[5]); UseJoystick.Checked(bool(PlayerOwner().ConsoleCommand("get ini:Engine.Engine.ViewportManager UseJoystick"))); MouseLag = moCheckBox(Controls[19]); s = PlayerOwner().ConsoleCommand("get ini:Engine.Engine.RenderDevice ReduceMouseLag"); MouseLag.Checked(bool(s)); MouseSens = moFloatEdit(Controls[7]); MouseSens.SetValue(class'PlayerInput'.default.MouseSensitivity); MenuSens = moFloatEdit(Controls[9]); MenuSens.SetValue(Controller.MenuMouseSens); ifWeapon = moCheckBox(Controls[11]); ifWeapon.Checked(class'PlayerController'.default.bEnableWeaponForceFeedback ); ifPickup = moCheckBox(Controls[12]); ifPickup.Checked(class'PlayerController'.default.bEnablePickupForceFeedback ); ifDamage = moCheckBox(Controls[13]); ifDamage.Checked(class'PlayerController'.default.bEnableDamageForceFeedback ); ifGUI = moCheckBox(Controls[14]); ifGUI.Checked(class'PlayerController'.default.bEnableGUIForceFeedback ); MouseSmoothStr = moFloatEdit(Controls[16]); MouseSmoothStr.SetValue(class'PlayerInput'.Default.MouseSmoothingStrength); MouseThreshold = moFloatEdit(Controls[17]); MouseThreshold.SetValue(class'PlayerInput'.Default.MouseAccelThreshold); DoubleClick = moFloatEdit(Controls[18]); DoubleClick.SetValue(class'PlayerInput'.Default.DoubleClickTime); } function InternalOnChange(GUIComponent Sender) { if (!Controller.bCurMenuInitialized) return; if (PlayerOwner().Level.Game !=None && Sender==AutoAim) { if ( AutoAim.IsChecked() ) PlayerOwner().Level.Game.AutoAim = 1.0; else PlayerOwner().Level.Game.AutoAim = 0; PlayerOwner().Level.Game.SaveConfig(); } if (Sender==MouseLag) PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice ReduceMouseLag "$MouseLag.IsChecked()); if (Sender==AutoSlope) { PlayerOwner().bSnapToLevel = AutoSlope.IsChecked(); PlayerOwner().SaveConfig(); } if (Sender==InvertMouse) { PlayerOwner().ConsoleCommand("set PlayerInput bInvertMouse "$InvertMouse.IsChecked()); class'PlayerInput'.default.bInvertMouse = InvertMouse.IsChecked(); class'PlayerInput'.static.StaticSaveConfig(); } if (Sender==MouseSmooth) { if ( MouseSmooth.IsChecked() ) class'PlayerInput'.default.MouseSmoothingMode = 1; else class'PlayerInput'.default.MouseSmoothingMode = 0; } if (Sender==UseJoystick) { PlayerOwner().ConsoleCommand("set ini:Engine.Engine.ViewportManager UseJoystick"@UseJoystick.IsChecked()); } if (Sender==MouseSens) { class'PlayerInput'.default.MouseSensitivity = MouseSens.GetValue(); PlayerOwner().ConsoleCommand("set PlayerInput MouseSensitivity "$MouseSens.GetValue()); class'PlayerInput'.static.StaticSaveConfig(); } if (Sender==MouseSmoothStr) { class'PlayerInput'.default.MouseSmoothingStrength = MouseSmoothStr.GetValue(); PlayerOwner().ConsoleCommand("set PlayerInput MouseSmoothingStrength "$MouseSmoothStr.GetValue()); class'PlayerInput'.static.StaticSaveConfig(); } if (Sender==MouseThreshold) { class'PlayerInput'.default.MouseAccelThreshold = MouseThreshold.GetValue(); PlayerOwner().ConsoleCommand("set PlayerInput MouseAccelThreshold "$MouseThreshold.GetValue()); class'PlayerInput'.static.StaticSaveConfig(); } if (Sender==DoubleClick) { class'PlayerInput'.default.DoubleClickTime = DoubleClick.GetValue(); PlayerOwner().ConsoleCommand("set PlayerInput DoubleClickTime "$DoubleClick.GetValue()); class'PlayerInput'.static.StaticSaveConfig(); } if (Sender==MenuSens) { Controller.MenuMouseSens = MenuSens.GetValue(); Controller.SaveConfig(); } if (Sender==ifWeapon) { PlayerOwner().bEnableWeaponForceFeedback = ifWeapon.IsChecked(); PlayerOwner().bForceFeedbackSupported = PlayerOwner().ForceFeedbackSupported ( ifWeapon.IsChecked() || ifPickup.IsChecked() || ifDamage.IsChecked() || ifGUI.IsChecked() ); class'PlayerController'.SaveConfig(); } if (Sender==ifPickup) { PlayerOwner().bEnablePickupForceFeedback = ifPickup.IsChecked(); PlayerOwner().bForceFeedbackSupported = PlayerOwner().ForceFeedbackSupported ( ifWeapon.IsChecked() || ifPickup.IsChecked() || ifDamage.IsChecked() || ifGUI.IsChecked() ); class'PlayerController'.SaveConfig(); } if (Sender==ifDamage) { PlayerOwner().bEnableDamageForceFeedback = ifDamage.IsChecked(); PlayerOwner().bForceFeedbackSupported = PlayerOwner().ForceFeedbackSupported ( ifWeapon.IsChecked() || ifPickup.IsChecked() || ifDamage.IsChecked() || ifGUI.IsChecked() ); class'PlayerController'.SaveConfig(); } if (Sender==ifGUI) { PlayerOwner().bEnableGUIForceFeedback = ifGUI.IsChecked(); PlayerOwner().bForceFeedbackSupported = PlayerOwner().ForceFeedbackSupported ( ifWeapon.IsChecked() || ifPickup.IsChecked() || ifDamage.IsChecked() || ifGUI.IsChecked() ); class'PlayerController'.SaveConfig(); } } F_ML@^XF;\A6ME$-@6jE$E6HE$@6jE$6@9C9<66jE$E6ME$@6t E$P {.v.FGE$@@FGu.6~E$@t.6}E$@)6ME$-6ME${sT@6~E$6}E$6lE$6o E$6eE$6OE$6r$E$F@a6lE$(-6xE$' GF_HLhF_phPF_U4// ==================================================================== // Class: XInterface.Tab_InstantActionBaseRules // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_InstantActionBaseRules extends UT2K3TabPanel; var config float LastFriendlyFire; var config bool LastWeaponStay; var config bool LastTranslocator; var config float LastGameSpeed; var config int LastGoalScore; var config int LastTimeLimit; var config int LastMaxLives; var Config bool bLastWeaponThrowing; var GUISlider MyGameSpeed; var moCheckBox MyWeaponStay; var moCheckBox MyTranslocator; var GUISlider MyFriendlyFire; var moNumericEdit MyGoalScore; var moNumericEdit MyTimeLimit; var moNumericEdit MyMaxLives; var moCheckBox MyWeaponThrowing; var moCheckBox MyBrightSkins; var localized string PercentText; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int NewGameSpeed; Super.Initcomponent(MyController, MyOwner); MyGameSpeed=GUISlider(Controls[4]); MyWeaponStay=moCheckBox(Controls[5]); MyTranslocator=moCheckBox(Controls[6]); MyFriendlyFire=GUISlider(Controls[8]); MyGoalScore=moNumericEdit(Controls[9]); MyTimeLimit=moNumericEdit(Controls[10]); MyMAxLives=moNumericEdit(Controls[11]); NewGameSpeed = int(LastGameSpeed * 100); MyGameSpeed.Value = Clamp(NewGameSpeed,50,200); MyWeaponStay.Checked(LastWeaponStay); MyFriendlyFire.Value = LastFriendlyFire * 100; MyTranslocator.Checked(LastTranslocator); MyGoalScore.SetValue(LastGoalScore); MyTimeLimit.SetValue(LastTimeLimit); MyMaxLives.SetValue(LastMaxLives); MyGameSpeed.OnDrawCaption = InternalGameSpeedDraw; MyFriendlyFire.OnDrawCaption = InternalFriendlyFireDraw; Controls[4].FriendlyLabel = GUILabel(Controls[3]); Controls[8].FriendlyLabel = GUILabel(Controls[7]); MyWeaponThrowing = moCheckBox(Controls[12]); MyWeaponThrowing.Checked(bLastWeaponThrowing); MyBrightSkins = moCheckBox(Controls[13]); MyBrightSkins.Checked(class'dmmutator'.default.bBrightSkins); } function string Play() { local string url; LastGameSpeed = MyGameSpeed.Value / 100; LastWeaponStay = MyWeaponStay.IsChecked(); LastTranslocator = MyTranslocator.IsChecked(); LastFriendlyFire = MyFriendlyFire.Value/100; LastGoalScore = MyGoalScore.GetValue(); LastTimeLimit = MyTimeLimit.GetValue(); LastMaxLives = MyMaxLives.GetValue(); bLastWeaponThrowing = MyWeaponThrowing.IsChecked(); SaveConfig(); url = "?GameSpeed="$LastGameSpeed$"?WeaponStay="$LastWeaponStay$"?Translocator="$LastTranslocator$"?FriendlyFireScale="$LastFriendlyFire; url = url$"?GoalScore="$LastGoalScore$"?TimeLimit="$LastTimeLimit$"?MaxLives="$LastMAxLives; if (bLastWeaponThrowing) URL=URL$"?AllowThrowing="$bLastWeaponThrowing; return url; } function string InternalGameSpeedDraw() { return "("$int(MyGameSpeed.Value)@PercentText$")"; } function string InternalFriendlyFireDraw() { return "("$int(MyFriendlyFire.Value)@PercentText$")"; } function BrightOnchange(GUIComponent Sender) { class'dmmutator'.default.bBrightSkins = MyBrightSkins.IsChecked(); class'dmmutator'.static.StaticSaveConfig(); } F_KLhF_A}hF_|hF_QLI/P $6q I/G??Go H/G??G6it $ $q 6~t? $q 6~t $q 6~to 6}t? 6$q 6~to 6}t g$q 6~t?o 6}t $o 6}t $o 6}t? $q 6~t?o 6}t?  GF_GkF_Df// ==================================================================== // Class: XInterface.Tab_InstantActionBotConfig // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_InstantActionBotConfig extends UT2K3TabPanel; var GUIListBox MyRedTeam; var GUIListBox MyBlueTeam; var GUIImage MyPortrait; var GUICharacterList MyBotList; var GUIButton MyBotMaker; var GUILabel MyBotName; var bool bIgnoreListChange; var bool bTeamGame; var bool bPlaySounds; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyRedTeam = GUIListBox(Controls[1]); MyBlueTeam = GUIListBox(Controls[8]); MyPortrait = GUIImage(Controls[4]); MyBotList = GUICharacterList(Controls[9]); MyBotMaker = GUIButton(Controls[10]); MyBotName = GUILabel(Controls[11]); MyPortrait.Image = MyBotList.GetPortrait(); MyBotName.Caption = MyBotList.GetName(); } function ShowPanel(bool bShow) { Super.ShowPanel(bShow); if(bShow) bPlaySounds = true; else bPlaySounds = false; } function SetupBotLists(bool bIsTeam) { local int i; local TeamRedConfigured tRed; local TeamBlueConfigured tBlue; local DMRosterConfigured tDM; bTeamGame = bIsTeam; MyRedTeam.List.Clear(); MyBLueTeam.List.Clear(); if (bTeamGame) { tRed = PlayerOwner().Spawn(class'TeamRedConfigured'); for (i=0;i0) tRed.Characters.Remove(0,tRed.Characters.Length); if (MyRedTeam.ItemCount() > 0) { for (i=0;i0) tBlue.Characters.Remove(0,tBlue.Characters.Length); if (MyBlueTeam.ItemCount()>0) { for (i=0;i0) tDM.Characters.Remove(0,tDM.Characters.Length); if (MyRedTeam.ItemCount() > 0) { for (i=0;i // ==================================================================== class Tab_InstantActionMain extends UT2K3TabPanel; var config string LastGameType; // Stores the last known settings var config string LastMap; var config int LastBotSkill, LastBotCount; var config bool LastUseMapBots, LastUseCustomBots; var GUIListBox MyMapList; var moComboBox MyGameCombo; var GUIImage MyMapImage; var GUIScrollTextBox MyMapScroll; var moComboBox MyBotSkill; var moCheckBox MyUseMapBots; var moCheckBox MyUseCustomBots; var moNumericEdit MyBotCount; var GUILabel MyMapName; var localized string DifficultyLevels[8]; var localized string MessageNoInfo; delegate OnChangeGameType(); delegate OnChangeCustomBots(); function InitComponent(GUIController MyController, GUIComponent MyOwner) { local string Entry, Desc; local int index; Super.Initcomponent(MyController, MyOwner); MyBotCount = moNumericEdit(Controls[1]); MyGameCombo = moComboBox(Controls[2]); MyMapList = GUIListBox(Controls[3]); MyMapImage = GUIImage(Controls[4]); MyMapScroll = GUIScrollTextBox(Controls[5]); MyBotSkill = moComboBox(Controls[7]); MyUseMapBots = moCheckBox(Controls[8]); MyUseCustomBots = moCheckBox(COntrols[9]); MyMapName = GUILabel(Controls[12]); MyMapList.List.OnChange = MapListChange; MyMapList.List.OnDblClick = MapListDblClick; Index = 0; PlayerOwner().GetNextIntDesc("GameInfo",Index,Entry,Desc); while (Entry != "") { Desc = Entry$"|"$Desc; if ( ! ((PlayerOwner().Level.IsDemoBuild()) && (InStr (Desc, "xDoubleDom" ) >= 0) ) ) { MyGameCombo.AddItem(ParseDescStr(Desc,2),,Desc); // if ( (LastGameType=="") || (LastGameType~=Entry) ) // { // MyGameCombo.SetText(ParseDescStr(Desc,2)); // LastGameType=Entry; // } } Index++; PlayerOwner().GetNextIntDesc("GameInfo", Index, Entry, Desc); } MyGameCombo.MyComboBox.List.SortList(); SelectGameType(LastGameType); MyGameCombo.ReadOnly(true); // Load Maps for the current GameType ReadMapList(GetMapPrefix()); // Set the original map if ( (LastMap=="") || (MyMapList.List.Find(LastMap)=="") ) MyMapList.List.SetIndex(0); ReadMapInfo(MyMapList.List.Get()); for(index = 0;index < 8;index++) MyBotSkill.AddItem(DifficultyLevels[index]); MyBotSkill.ReadOnly(True); MyBotSkill.SetIndex(LastBotSkill); MyBotCount.SetValue(LastBotCount); MyUseCustomBots.Checked(LastUseCustomBots); MyUseMapBots.Checked(LastUseMapBots); if(LastUseMapBots) { MyUseCustomBots.Checked(false); MyUseCustomBots.MenuStateChange(MSAT_Disabled); MyBotCount.MenuStateChange(MSAT_Disabled); } else { MyUseCustomBots.MenuStateChange(MSAT_Blurry); if(LastUseCustomBots) MyBotCount.MenuStateChange(MSAT_Disabled); else MyBotCount.MenuStateChange(MSAT_Blurry); } } function SelectGameType(string GameType) { local int i; local GUIList List; local string desc; List = MyGameCombo.MyComboBox.List; for (i=0;i GameClass) function ReadMapList(string MapPreFix) { MyMapList.List.Clear(); Controller.GetMapList(MapPrefix,MyMapList.List); MyMapList.List.SortList(); MyMapList.List.SetIndex(0); } function ReadMapInfo(string MapName) { local LevelSummary L; local string mName,mDesc; local int p; if(MapName == "") return; L = LevelSummary(DynamicLoadObject(MapName$".LevelSummary", class'LevelSummary')); if ( L != none ) MyMapName.Caption = L.Title; else MyMapName.Caption = MapName; MyMapImage.Image = Material(DynamicLoadObject(MapName$".Screenshot", class'Material')); if (MyMapImage.Image==None) { if (L == none || L.ScreenShot==None) MyMapImage.Image = material'InterfaceContent.Menu.NoLevelPreview'; else MyMapImage.Image = L.Screenshot; } p = instr(MapName,"-"); if (p<0) mName = MapName; else mName = Right(MapName,Len(MapName)-p-1); GUILabel(Controls[14]).Caption = ""$L.IdealPlayerCountMin@"-"@L.IdealPlayerCountMax@"players"; mDesc = Controller.LoadDecoText("XMaps",mName); if (mDesc=="") mDesc = L.Description; else { GUILabel(Controls[13]).Caption = ""; MyMapScroll.SetContent(mDesc); return; } if (mDesc=="") mDesc = MessageNoInfo; if (L.Author!="") GUILabel(Controls[13]).Caption = "Author:"@L.Author; else GUILabel(Controls[13]).Caption = ""; MyMapScroll.SetContent(mDesc); } function GameTypeChanged(GUIComponent Sender) { local string Desc; if (!Controller.bCurMenuInitialized) return; // Load Maps for the current GameType Desc = MyGameCombo.GetExtra(); ReadMapList(ParseDescStr(Desc,1)); LastGameType = ParseDescStr(Desc,0); SaveConfig(); OnChangeGameType(); } function MapListChange(GUIComponent Sender) { if (!Controller.bCurMenuInitialized) return; LastMap = MyMapList.List.Get(); SaveConfig(); ReadMapInfo(LastMap); } function BotSkillChanged(GUIComponent Sender) { if (!Controller.bCurMenuInitialized) return; LastBotSkill=MyBotSkill.GetIndex(); SaveConfig(); } function ChangeMapBots(GUIComponent Sender) { if(!Controller.bCurMenuInitialized) return; LastUseMapBots = MyUseMapBots.IsChecked(); SaveConfig(); if(LastUseMapBots) { MyUseCustomBots.Checked(false); MyUseCustomBots.MenuStateChange(MSAT_Disabled); MyBotCount.MenuStateChange(MSAT_Disabled); } else { MyUseCustomBots.MenuStateChange(MSAT_Blurry); MyBotCount.MenuStateChange(MSAT_Blurry); } } function ChangeCustomBots(GUIComponent Sender) { if(!Controller.bCurMenuInitialized) return; LastUseCustomBots = MyUseCustomBots.IsChecked(); SaveConfig(); if(LastUseCustomBots) MyBotCount.MenuStateChange(MSAT_Disabled); else MyBotCount.MenuStateChange(MSAT_Blurry); OnChangeCustomBots(); } function bool MapListDblClick(GUIComponent Sender) { UT2InstantActionPage(Controller.ActivePage).PlayButtonClick(self); return true; } F_x8// ==================================================================== // Class: XInterface.Tab_InstantActionMapList // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_InstantActionMapList extends UT2K3TabPanel; var GUIListBox MyFullMapList; var GUIListBox MyCurMapList; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyFullMapList = GUIListBox(Controls[0]); MyCurMapList = GUIListBox(Controls[1]); } function string Play() { /* local TAB_InstantActionMain pMain; local MapList ML; local class MLClass; local int i; if (UT2InstantActionPage(Controller.ActivePage)==None) return ""; pMain = UT2InstantActionPage(Controller.ActivePage).pMain; MLClass = class(DynamicLoadObject(pMain.GetMapListClass(), class'class')); if (MLClass!=None) { ML = PlayerOwner().spawn(MLClass); if (ML!=None) { ML.Maps.Remove(0,ML.Maps.Length); for (i=0;i MLClass; local int i,j; MyFullMapList.List.Clear(); MyCurMapList.List.Clear(); Controller.GetMapList(MapPrefix,MyFullMapList.List); MyFullMapList.List.SetIndex(0); MLClass = class(DynamicLoadObject(MapListClass, class'class')); if (MLClass!=None) { ML = PlayerOwner().spawn(MLClass); if (ML!=None) { for (i=0;i0) { MyCurMapList.List.Swap(index,index-1); MyCurMapList.List.Index = index-1; } return true; } function bool MapDown(GUIComponent Sender) { local int index; if ( (MyCurMapList.ItemCount()==0) || (MyCurMapList.List.Index<0) ) return true; index = MyCurMapList.List.Index; if (indexW W T>-LsW Z$BSW UW Z$[ W Z$SW Z$X W OW }>W KRW  GF__LdLx /)F%F7mF~ GF_@F_F_cLM3(6Q<M%M7mFM%MmN%*F GF_F_F_eL[f 6#9:| ,([ $% !$& &$d +$h 8$k' =$' B$( G$b L$f Y$z' ^$$ k$g{' p$# }$al ' ( GF_f)fLX ! GF_F_F_kLF_F_F_F_gLk\7&F&#-t37m&43F& GF_lLzgLF%3%I;F&7m8-t3%I3F& GF_mL{t^7m%3% GF_nLl z7m%37m& GF_o@Y.F_rLY.PF_sLY.F_qY.bF_pY.F_qLY.F_F_F_{(vL[  GF_F_F_{bpF_AapF_|LF_F_}LF_KF_~LF_F_LF_F_@MF_F_AMF_F_F_F_MM@F_}'F_zLpF_EMF_F_FMF_KF_GMF_F_HMF_F_IMF_F_JMF_F_KMF_cF_s@F_F_F_F_@F_y'F_y'y&m7 )y&)}#)z#)o#)\")C" G$F_Fj// ==================================================================== // Class: XInterface.Tab_InstantActionMutators // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_InstantActionMutators extends UT2K3TabPanel; var config string LastActiveMutators; var GUIListBox MyAvailMutators; var GUIListBox MySelectedMutators; var GUIScrollTextBox MyDescBox; var xMutatorList MutList; var string MutConfigMenu; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local string t,m; Super.Initcomponent(MyController, MyOwner); MyAvailMutators=GUIListBox(Controls[1]); MyAvailMutators.List.OnDblClick=AvailDblClick; MySelectedMutators=GUIListBox(Controls[2]); MySelectedMutators.List.OnDblClick=SelectedDblClick; MyDescBox=GUIScrollTextBox(Controls[3]); MutList = PlayerOwner().Spawn(class'xMutatorList'); MutList.Init(); if( PlayerOwner().Level.IsDemoBuild()) { i = 0; while (i 0) { MyDescBox.SetContent(MyAvailMutators.List.GetExtra()); MutConfigMenu = GetMutatorConfigMenu( MyAvailMutators.List.Get() ); } else if (MySelectedMutators.List.ItemCount > 0) { MyDescBox.SetContent(MySelectedMutators.List.GetExtra()); MutConfigMenu = GetMutatorConfigMenu( MySelectedMutators.List.Get() ); } else MyDescBox.SetContent("None"); if(MutConfigMenu == "") Controls[4].bVisible = false; else Controls[4].bVisible = true; m = LastActiveMutators; t = NextMutatorInString(m); while (t!="") { SelectMutator(t); t = NextMutatorInString(m); } } // Play is called when the play button is pressed. It saves any releavent data and then // returns any additions to the URL function string Play() { local string url,t; local int i; for (i=0;i // ==================================================================== class Tab_MultiplayerHostMain extends UT2K3TabPanel; var config string LastGameType; // Stores the last known settings var config string LastMap; var moComboBox MyGameCombo; var GUIImage MyMapImage; var GUIScrollTextBox MyMapScroll; var GUIListBox MyFullMapList; var GUIListBox MyCurMapList; var GUILabel MyMapName; var localized string MessageNoInfo; delegate OnChangeGameType(); function InitComponent(GUIController MyController, GUIComponent MyOwner) { local string Entry, Desc; local int index; Super.Initcomponent(MyController, MyOwner); MyGameCombo = moComboBox(Controls[2]); MyMapImage = GUIImage(Controls[3]); MyMapScroll = GUIScrollTextBox(Controls[4]); MyFullMapList = GUIListBox(Controls[6]); MyFullMapList.List.OnDblClick=MapAdd; MyCurMapList = GUIListBox(Controls[13]); MyCurMapList.List.OnDblClick=MapRemove; MyMapName = GUILabel(Controls[14]); Index = 0; PlayerOwner().GetNextIntDesc("GameInfo",Index,Entry,Desc); while (Entry != "") { Desc = Entry$"|"$Desc; if ( ! ((PlayerOwner().Level.IsDemoBuild()) && (InStr (Desc, "xDoubleDom" ) >= 0) ) ) { MyGameCombo.AddItem(ParseDescStr(Desc,2),,Desc); /* if ( (LastGameType=="") || (LastGameType==Entry) ) { MyGameCombo.SetText(ParseDescStr(Desc,2)); LastGameType=Entry; } */ } Index++; PlayerOwner().GetNextIntDesc("GameInfo", Index, Entry, Desc); } MyGamecombo.MyComboBox.List.SortList(); SelectGameType(LastGameType); MyGameCombo.ReadOnly(true); // Load Maps for the current GameType ReadMapList(GetMapPrefix(),GetMapListClass()); // Set the original map if ( (LastMap=="") || (MyFullMapList.List.Find(LastMap)=="") ) MyFullMapList.List.SetIndex(0); Entry = MyFullMapList.List.Get(); if (Entry=="") { Entry = MyCurMapList.List.GetItemAtIndex(0); } if (Entry!="") ReadMapInfo(Entry); } // Play is called when the play button is pressed. It saves any releavent data and then // returns any additions to the URL function string Play() { /* local MapList ML; local class MLClass; local int i; MLClass = class(DynamicLoadObject(GetMapListClass(), class'class')); if (MLClass!=None) { ML = PlayerOwner().spawn(MLClass); if (ML!=None) { ML.Maps.Remove(0,ML.Maps.Length); for (i=0;i MLClass; local int i,j; MyFullMapList.List.Clear(); MyCurMapList.List.Clear(); Controller.GetMapList(MapPrefix,MyFullMapList.List); MyFullMapList.List.SortList(); MyFullMapList.List.SetIndex(0); MLClass = class(DynamicLoadObject(MapListClass, class'class')); if (MLClass!=None) { ML = PlayerOwner().spawn(MLClass); if (ML!=None) { for (i=0;i0) { MyCurMapList.List.Swap(index,index-1); MyCurMapList.List.Index = index-1; } return true; } function bool MapDown(GUIComponent Sender) { local int index; if ( (MyCurMapList.ItemCount()==0) || (MyCurMapList.List.Index<0) ) return true; index = MyCurMapList.List.Index; if (index // ==================================================================== class Tab_MultiplayerHostServerSettings extends UT2K3TabPanel; var Config bool bDedicated; var Config bool bLanPlay; var Config int BotSkill; var Config bool bPlayersMustBeReady; var Config bool bUseDefaults; var Config bool bUseCustomBots; var Config int MinPlayers; var Config int MaxPlayers; var Config int MaxSpecs; var Config bool bAllowBehindView; var Config string AdminName; var Config string AdminPass; var Config string GamePass; var Config bool bBalanceTeams; var Config bool bCollectStats; var moCheckBox MyDedicated; var moCheckBox MyLanGame; var moCheckBox MyAdvertise; var moCheckBox MyCollectStats; var moCheckBox MyBalanceTeams; var moCheckBox MyPlayersMustBeReady; var moCheckBox MyAllowBehindView; var moComboBox MyBotSkill; var moCheckBox MyUseDefaultBots; var moCheckBox MyUseCustomBots; var moNumericEdit MyMinPlayers; var moNumericEdit MyMaxPlayers; var moNumericEdit MyMaxSpecs; var moEditBox MyServerName; var moEditBox MyServerPasswrd; var moEditBox MyAdminName; var moEditBox MyAdminEmail; var moEditBox MyAdminPasswrd; var moEditBox MyMOTD1; var moEditBox MyMOTD2; var moEditBox MyMOTD3; var moEditBox MyMOTD4; var moCheckBox MyUseWebAdmin; var moNumericEdit MyWebPort; var bool bInitialized; delegate OnChangeCustomBots(bool Enable); function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int index; Super.InitComponent(MyController, MyOwner); MyDedicated = moCheckBox(Controls[2]); MyDedicated.Checked(bDedicated); MyLanGame = moCheckBox(Controls[3]); MyLanGame.Checked(bLanPlay); MyAdvertise = moCheckBox(Controls[4]); MyAdvertise.Checked(class'MasterServerUplink'.default.DoUplink); MyCollectStats = moCheckBox(Controls[5]); MyCollectStats.Checked(bCollectStats); MyBalanceTeams = moCheckBox(Controls[6]); MyBalanceTeams.Checked(bBalanceTeams); MyPlayersMustBeReady = moCheckBox(Controls[7]); MyPlayersMustBeReady.Checked(bPlayersMustBeReady); MyBotSkill = moComboBox(Controls[8]); for(index = 0;index < 8;index++) MyBotSkill.AddItem(class'Tab_InstantActionMain'.default.DifficultyLevels[index]); MyBotSkill.ReadOnly(True); MyBotSkill.SetIndex(BotSkill); MyUseDefaultBots= moCheckbox(Controls[9]); MyUseDefaultBots.Checked(bUseDefaults); MyUseCustomBots = moCheckbox(Controls[10]); MyUseCustomBots.Checked(bUseCustomBots); MyMinPlayers = moNumericEdit(Controls[11]); MyMinPlayers.SetValue(MinPlayers); MyMaxPlayers = moNumericEdit(Controls[12]); MyMaxPlayers.SetValue(MaxPlayers); MyMaxSpecs = moNumericEdit(Controls[13]); MyMaxSpecs.SetValue(MaxSpecs); MyServerName = moEditBox(Controls[14]); MyServerName.SetText(class'GameReplicationInfo'.default.ServerName); MyServerPasswrd = moEditBox(Controls[15]); MyServerPasswrd.SetText(GamePass); MyAdminName = moEditBox(Controls[16]); MyAdminName.SetText(AdminName); MyAdminEmail = moEditBox(Controls[17]); MyAdminEmail.SetText(class'GameReplicationInfo'.default.AdminEmail); MyAdminPasswrd = moEditBox(Controls[18]); MyAdminPasswrd.SetText(AdminPass); // MyMOTD1 = moEditBox(Controls[19]); MyMOTD1.SetText(class'GameReplicationInfo'.default.MOTDLine1); // MyMOTD2 = moEditBox(Controls[20]); MyMOTD2.SetText(class'GameReplicationInfo'.default.MOTDLine2); // MyMOTD3 = moEditBox(Controls[21]); MyMOTD3.SetText(class'GameReplicationInfo'.default.MOTDLine3); // MyMOTD4 = moEditBox(Controls[22]); MyMOTD4.SetText(class'GameReplicationInfo'.default.MOTDLine4); MyUseWebAdmin = moCheckBox(Controls[23]); MyUseWebAdmin.Checked(class'WebServer'.default.benabled); MyWebPort = moNumericEdit(Controls[24]); MyWebPort.SetValue(class'WebServer'.default.ListenPort); MyAllowBehindview = moCheckBox(Controls[25]); MyAllowBehindView.Checked(bAllowBehindView); bInitialized = true; MyAdminName.MyEditBox.bConvertSpaces = true; MyAdminPasswrd.MyEditBox.bConvertSpaces = true; MyServerPasswrd.MyEditBox.bConvertSpaces = true; } function string Play() { local string url; local string gc; local Tab_MultiplayerHostMain pMain; bDedicated = MyDedicated.IsChecked(); bCollectStats = MyCollectStats.IsChecked(); bBalanceTeams = MyBalanceTeams.IsChecked(); bPlayersMustBeReady = MyPlayersMustBeReady.IsChecked(); bLanPlay = MyLanGame.IsChecked(); BotSkill = MyBotSkill.GetIndex(); MinPlayers = MyMinPlayers.GetValue(); MaxPlayers = MyMaxPlayers.GetValue(); MaxSpecs = MyMaxSpecs.GetValue(); bUseDefaults = MyUseDefaultBots.IsChecked(); bUseCustomBots = MyUseCustomBots.IsChecked(); GamePass = MyServerPasswrd.GetText(); AdminName = MyAdminName.GetText(); AdminPass = MyAdminPasswrd.GetText(); bAllowBehindView = MyAllowBehindview.IsChecked(); SaveConfig(); class'MasterServerUplink'.default.DoUplink = MyAdvertise.IsChecked(); class'MasterServerUplink'.Static.StaticSaveConfig(); class'GameReplicationInfo'.default.ServerName = MyServerName.GetText(); class'GameReplicationInfo'.default.AdminName = AdminName; class'GameReplicationInfo'.default.AdminEmail = MyAdminEmail.GetText(); // class'GameReplicationInfo'.default.MOTDLine1 = MyMOTD1.GetText(); // class'GameReplicationInfo'.default.MOTDLine2 = MyMOTD2.GetText(); // class'GameReplicationInfo'.default.MOTDLine3 = MyMOTD3.GetText(); // class'GameReplicationInfo'.default.MOTDLine4 = MyMOTD4.GetText(); // class'GameReplicationInfo'.static.StaticSaveConfig(); class'WebServer'.Default.bEnabled = MyUseWebAdmin.IsChecked(); class'WebServer'.Default.ListenPort = MyWebPort.GetValue(); class'WebServer'.static.StaticSaveConfig(); pMain = UT2MultiplayerHostPage(Controller.ActivePage).pMain; gc = pMain.GetGameClass(); url = url$"?GameStats="$bCollectStats; if ( pMain.GetIsTeamGame() ) url = url$"?BalanceTeams="$bBalanceTeams; if (bLanPlay) Url=URL$"?LAN"; if (!bUseDefaults) { if(!bUseCustomBots) Url=URL$"?MinPlayers="$MinPlayers; Url=Url$"?MaxPlayers="$MaxPlayers$"?MaxSpectators="$MaxSpecs; } else Url=Url$"?bAutoNumBots=True"; if ( (AdminName!="") && (AdminPass!="") ) URL=URL$"?AdminName="$AdminName$"?AdminPassword="$AdminPass; if (GamePass!="") URL=URL$"?GamePassword="$GamePass; if (bPlayersMustBeReady) URL=URL$"?PlayersMustBeReady="$bPlayersMustBeReady; if (bAllowBehindView) URL=URL$"?AllowBehindview="$bAllowBehindView; URL = URL$"?difficulty="$BotSkill; return url; } function UseMapOnChange(GUIComponent Sender) { if (!bInitialized) return; if(!MyUseDefaultBots.IsChecked()) { MyUseCustomBots.MenuStateChange(MSAT_Blurry); MyMaxPlayers.MenuStateChange(MSAT_Blurry); MyMaxSpecs.MenuStateChange(MSAT_Blurry); if(MyUseCustomBots.IsChecked()) MyMinPlayers.MenuStateChange(MSAT_Disabled); else MyMinPlayers.MenuStateChange(MSAT_Blurry); OnChangeCustomBots(MyUseCustomBots.IsChecked()); } else { MyUseCustomBots.MenuStateChange(MSAT_Disabled); MyMinPlayers.MenuStateChange(MSAT_Disabled); MyMaxPlayers.MenuStateChange(MSAT_Disabled); MyMaxSpecs.MenuStateChange(MSAT_Disabled); OnChangeCustomBots(False); } } function UseCustomOnChange(GUIComponent Sender) { if (!bInitialized) return; if(MyUseCustomBots.IsChecked()) MyMinPlayers.MenuStateChange(MSAT_Disabled); else MyMinPlayers.MenuStateChange(MSAT_Blurry); OnChangeCustomBots(MyUseCustomBots.IsChecked()); } function bool UseCustomBots() { return !MyUseDefaultBots.IsChecked() && MyUseCustomBots.IsChecked(); } F_sF_F_aF_F_SMF_F_NMi!o8a /)i!)Q!)M!)F!)D!)A!)~ )} )iy G$F_TMF_F_XF_F_WMF_F_XJ// ==================================================================== // Class: XInterface.Tab_OnlineSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_NetworkSettings extends UT2K3TabPanel; var localized string NetSpeedText[4]; var localized string StatsURL; var localized string EpicIDMsg; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i // ==================================================================== class Tab_PlayerSettings extends UT2K3TabPanel; var localized string HandNames[4]; var localized string TeamNames[2]; var config bool bUnlocked; // whether the boss characters have been unlocked var bool bChanged; // Used for character (not just weapons!) var SpinnyWeap SpinnyDude; // MUST be set to null when you leave the window var vector SpinnyDudeOffset; var bool bRenderDude; var localized string ShowBioCaption; var localized string Show3DViewCaption; var string OriginalTeam; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i Btns) { local int Rung; Rung = GetProfile().LadderRung[ladder]; if (Rung < 0 || Rung >= Btns.Length) { return false; } if (GetProfile().FindFirstUnfinishedLadder() == ladder) Btns[Rung].OnClick(Btns[Rung]); else ShowMatchInfo(Btns[Rung].MatchInfo); return true; } // send DoShowMatchInfo to all ladder pages, keeps the images selected function bool ShowMatchInfo(MatchInfo MI) { local GUITabControl TC; local int i; local bool retval; retval = true; TC = MyTabControl(); if ( MI != None && TC != None ) { for (i = 0; i Buttons) { local int Rung; local GUIComponent Ctrl; Ctrl = Controls[index]; if (GetProfile() != None) Rung = GetProfile().LadderRung[ladder]; else Rung = -1; // Reset Lock & Bars pictures if (Rung == -1) { Ctrl.bVisible=false; } else if (Rung >= Buttons.Length) { Ctrl.WinTop = Controls[index-1].WinTop; Ctrl.WinHeight = Controls[index-1].WinHeight; Ctrl.bVisible = true; return 1; } else { Ctrl.WinTop = Buttons[Rung].WinTop + Buttons[Rung].WinHeight/2; Ctrl.WinHeight = Buttons[0].WinTop - Ctrl.WinTop; Ctrl.bVisible = true; } return 0; } function bool CanShowPanel() { if ( GetProfile() == none ) return false; return super.CanShowPanel(); } function Material DLOMaterial(string MaterialFullName) { return Material(DynamicLoadObject(MaterialFullName, class'Material', true)); } F_ F_F_F_F_eMF_F_G#L%EJj %>j ,4j G#L%y=j j y=, G XkM^3H2 iMJX$ N'Y!DUCUEUFUGUHUIUJUKULUMUNUOUPUQURU$>$E?F_F_j F_F_p class Tab_SPLadderQualify extends Tab_SPLadderBase; var array DMButtons; function InitPanel() { local int i; ScrollInfo=GUIScrollTextBox(Controls[4]); MapPicHolder=GUIImage(Controls[0]); MapNameLabel=GUILabel(Controls[3]); // Create DMButtons Array for (i=0; i<6; i++) DMButtons[DMButtons.Length] = NewLadderButton(0, i, 0.050195, 0.799215 - 0.128333 * i); OnProfileUpdated(); } function OnProfileUpdated() { local int i; for (i=0; i TDMButtons; var array DOMButtons; var array BRButtons; var array CTFButtons; var array LockIndexes; var GUIGfxButton ChampButton; var GUIImage ChampBorder; function InitPanel() { local int i; ScrollInfo=GUIScrollTextBox(Controls[4]); MapPicHolder=GUIImage(Controls[1]); MapNameLabel=GUILabel(Controls[3]); ChampButton=GUIGfxButton(Controls[29]); ChampBorder=GUIImage(Controls[30]); // Create TDMButtons Array for (i=0; i<6; i++) TDMButtons[TDMButtons.Length] = NewLadderButton(1, i, 0.050195, 0.799215 - 0.128333 * i); for (i=0; i<5; i++) DOMButtons[DOMButtons.Length] = NewLadderButton(2, i, 0.176172, 0.799215 - 0.128333 * i); for (i=0; i<5; i++) BRButtons[BRButtons.Length] = NewLadderButton(4, i, 0.733789, 0.799215 - 0.128333 * i); for (i=0; i<6; i++) CTFButtons[CTFButtons.Length] = NewLadderButton(3, i, 0.860742, 0.799215 - 0.128333 * i); ScrollInfo.SetContent(""); OnProfileUpdated(); } function OnProfileUpdated() { local int i; for (i=0; i<6; i++) { UpdateLadderButton(TDMButtons[i], 1, i); UpdateLadderButton(CTFButtons[i], 3, i); } for (i=0; i<5; i++) { UpdateLadderButton(DOMButtons[i], 2, i); UpdateLadderButton(BRButtons[i], 4, i); } ChampBorder.bVisible=false; // Set the Yellow Bars and the Lock picture for completed ladders SetYellowBar(1, 12, TDMButtons); SetYellowBar(2, 20, DOMButtons); SetYellowBar(4, 24, BRButtons); SetYellowBar(3, 16, CTFButtons); SetChampionship(false); // Figure out which map info to display, always display lowest uncompleted ladder's next map if (GetProfile() != None) { GetProfile().ChampBorderObject = ChampBorder; if (!SetActiveMatch(1, TDMButtons) && !SetActiveMatch(2, DOMButtons) && !SetActiveMatch(3, CTFButtons) && !SetActiveMatch(4, BRButtons)) { if (GetProfile().LadderRung[5] >= 0) { Log ( "SINGLEPLAYER Opening Championship." ); SetChampionship(true); // turn on button ChampMatch(ChampButton); // and select it } } } // Else Display a No Picture avail (default picture) } function int SetYellowBar(int ladder, int index, out array Buttons) { local int Rung, lockindex; local string HiStr; Super.SetYellowBar(ladder, index, Buttons); if (GetProfile() != None) { Rung = GetProfile().LadderRung[ladder]; lockindex = ladder; // Reset Lock pictures with the bars going to them HiStr = ""; if (Rung == Buttons.Length) HiStr = "Hi"; GUIImage(Controls[4+lockindex]).Image = DLOMaterial("InterfaceContent.SPMenu.Lock"$lockindex$HiStr); if (ladder < 3) GUIImage(Controls[index-2]).Image = DLOMaterial("InterfaceContent.SPMenu.BarCornerLeft"$HiStr); else GUIImage(Controls[index-2]).Image = DLOMaterial("InterfaceContent.SPMenu.BarCornerRight"$HiStr); GUIImage(Controls[index-3]).Image = DLOMaterial("InterfaceContent.SPMenu.BarHorizontal"$HiStr); } if (HiStr == "Hi") return 1; else return 0; } // received click from the championship button function bool ChampMatch (GUIComponent Sender) { local LadderButton LButton; local GameProfile GP; GP = GetProfile(); if (GP != None ) { if ( GP.ChampBorderObject != none ) GUIImage(GP.ChampBorderObject).bVisible=true; GP.CurrentMenuRung = GP.LadderRung[5]; GP.CurrentLadder = 5; LButton=LadderButton(GP.NextMatchObject); if ( LButton != none ) { LButton.SetState(GP.LadderRung[LButton.LadderIndex]); LButton = none; } ShowMatchInfo( GP.GetMatchInfo ( GP.CurrentLadder, GP.CurrentMenuRung ) ); MatchUpdated(GP.CurrentLadder, GP.CurrentMenuRung); } return true; } // function SetChampionship(bool bEnable) { local MatchInfo MI; local GameProfile GP; GP = GetProfile(); if (GP != None ) { ChampButton.bVisible=bEnable; ChampButton.bAcceptsInput=bEnable; ChampButton.bNeverFocus=!bEnable; if ( bEnable ) { // completed or not? if ( GP.LadderRung[5] >= GP.GameLadder.default.ChampionshipMatches.Length ) { ChampButton.Graphic = DLOMaterial("PlayerPictures.aDOM"); // show trophy } else { // show thumb MI = GP.GetMatchInfo( 5, GP.LadderRung[5] ); ChampButton.Graphic = DLOMaterial("SinglePlayerThumbs."$MI.LevelName); } } } } F_F_F_Jclass Tab_SPPanelBase extends UT2K3TabPanel; function OnProfileUpdated(); function OnMatchUpdated(int iLadder, int iMatch); function GameProfile GetProfile() { return PlayerOwner().Level.Game.CurrentGameProfile; } function GUITabControl MyTabControl() { if (MyButton != None && MyButton.MenuOwner != None) return GUITabControl(MyButton.MenuOwner); if ( MenuOwner != None && MenuOwner.IsA('GUITabControl') ) // in case button hasn't been set up yet return GUITabControl(MenuOwner); return None; } // Report to every page that the profile was updated. function ProfileUpdated() { local GUITabControl TC; local int i; TC = MyTabControl(); if (TC != None) { for (i = 0; i 0) MyTabControl().ActivateTabByName(class'UT2SinglePlayerMain'.default.TabNameLadder, true); else MyTabControl().ActivateTabByName(class'UT2SinglePlayerMain'.default.TabNameQualification, true); } } UpdateList(); } function InitPanel() { Super.InitPanel(); MyButton.Hint = class'UT2SinglePlayerMain'.default.TabHintProfileLoad; UT2SinglePlayerMain(MyButton.MenuOwner.MenuOwner).ResetTitleBar(MyButton); } function OnProfileUpdated() { UpdateList(); } // update the profile listing by rechecking disk, needed after create or delete function UpdateList() { local array profilenames; local int i; local GameProfile GP; Controller.GetProfileList("",profilenames); lbProfiles.List.Clear(); for ( i=0; i profileclass; local string profilename; local GameProfile GP; profilename = lbProfiles.List.Get(); profileclass = class(DynamicLoadObject("xGame.UT2003GameProfile", class'Class')); GP = PlayerOwner().Level.Game.LoadDataObject(profileclass, "GameProfile", profilename); if ( GP != none ) { PlayerOwner().Level.Game.CurrentGameProfile = GP; GP.Initialize(PlayerOwner().Level.Game, profilename); if (GP.LadderRung[1] >= 0) { // player has unlocked main ladder MyTabControl().ActivateTabByName(class'UT2SinglePlayerMain'.default.TabNameLadder, true); } else { MyTabControl().ActivateTabByName(class'UT2SinglePlayerMain'.default.TabNameQualification, true); } ProfileUpdated(); } return true; } function DeleteConfirm(byte bButton) { local string profilename; if (bButton == QBTN_Yes) { profilename = lbProfiles.List.Get(); if ( GetProfile() != none && GetProfile().PackageName == profilename) { PlayerOwner().Level.Game.CurrentGameProfile = none; } if (!PlayerOwner().Level.Game.DeletePackage(profilename)) { Log("SINGLEPLAYER Tab_SPProfileLoad::ButtonClick() failed to delete GameProfile "$profilename); } ProfileUpdated(); UpdateList(); } } //////////////////////////////////////////// // Delete the selected profile // function bool DeleteClick(GUIComponent Sender) { local GUIQuestionPage Page; local string profilename; if (Controller.OpenMenu("XInterface.GUIQuestionPage")) { profilename = lbProfiles.List.Get(); Page=GUIQuestionPage(Controller.TopPage()); Page.SetupQuestion(Page.Replace(DeleteMessage, "prof", Caps(profilename)), QBTN_YesNo, QBTN_No); Page.OnButtonClick = DeleteConfirm; } return true; } ////////////////////////////////////////////////// // Activate the New Profile MenuPage. // function bool NewProfileClick(GUIComponent Sender) { GUITabControl(MyButton.MenuOwner).ReplaceTab(MyButton, class'UT2SinglePlayerMain'.default.TabNameProfileNew, "xInterface.Tab_SPProfileNew", , , true); return true; } function InternalOnChange(GUIComponent Sender) { UpdateStats(); } function bool DoubleClickList(GUIComponent Sender) { return LoadClick(Sender); } // when expose menu, might have come from the profile-create screen, so update the list function ShowPanel(bool bShow) { Super.ShowPanel(bShow); if ( bShow ) { // just started game, no profiles exist, jump to create new if ( lbProfiles.List.ItemCount == 0 ) { UpdateStats(); // sets everything to empty NewProfileClick(butNew); return; } } } F_iv// ==================================================================== // Single player menu for establishing profile. // author: capps 8/26/02 // ==================================================================== /////////// // TODO // draw team picture in blue class Tab_SPProfileNew extends Tab_SPPanelBase; var GUIEditBox ePlayerName; var GUIEditBox eTeamName; var GUIComboBox cDifficulty; var GUICharacterListTeam clPlayerSkins; var GUIImageList iTeamSymbols; var localized string DefaultName, DefaultTeamName; var string DefaultCharacter, TeamSymbolPrefix; var int DefaultTeamSymbol; var int CurrentTeamSymbolNum; // currently displayed team symbol number var localized string Err_ProfileExists; var localized string Err_CantCreateProfile; const MINSYMBOL = 1; const MAXSYMBOL = 22; function InitComponent(GUIController pMyController, GUIComponent MyOwner) { local int i; ePlayerName = GUIEditBox(GUIMenuOption(Controls[2]).MyComponent); ePlayerName.MaxWidth=16; // as per polge, check Tab_PlayerSettings if you change this ePlayerName.bConvertSpaces=true; ePlayerName.OnClick=PlayerOnClick; eTeamName = GUIEditBox(GUIMenuOption(Controls[3]).MyComponent); eTeamName.MaxWidth=16; eTeamName.OnClick=PlayerOnClick; cDifficulty = GUIComboBox(GUIMenuOption(Controls[4]).MyComponent); clPlayerSkins = GUICharacterListTeam(Controls[6]); iTeamSymbols = GUIImageList(Controls[10]); Super.Initcomponent(pMyController, MyOwner); if (!class'Tab_PlayerSettings'.default.bUnlocked) clPlayerSkins.InitListExclusive("UNLOCK", "DUP"); else clPlayerSkins.InitListExclusive("DUP"); Controls[5].FocusInstead = clPlayerSkins; Controls[7].FocusInstead = clPlayerSkins; Controls[8].FocusInstead = clPlayerSkins; Controls[9].FocusInstead = iTeamSymbols; Controls[11].FocusInstead = iTeamSymbols; Controls[12].FocusInstead = iTeamSymbols; for (i=0; i SymbolNames; Controller.GetTeamSymbolList(SymbolNames, true); // get all usable team symbols for (i = 0; i < SymbolNames.Length; i++) { M = Material(DynamicLoadObject(SymbolNames[i], class'Material')); iTeamSymbols.AddMaterial(String(i), M); } } // update all the various boxes to show the stats of this profile function ClearStats() { // update name ePlayerName.TextStr = DefaultName; // update team name eTeamName.TextStr = DefaultTeamName; // update difficulty cDifficulty.SetText(class'xInterface.Tab_SPProfileLoad'.default.Difficulties[1]); // update character portrait clPlayerSkins.Find(DefaultCharacter); // update team symbol iTeamSymbols.FirstImage(); } function bool CreateClick(GUIComponent Sender) { local class profileclass; local string profilename; local GameProfile GP; local GUIQuestionPage Page; local array profilenames; local int i; local bool bFileExists; if ( ePlayerName.TextStr == "" ) ePlayerName.TextStr = DefaultName; if ( eTeamName.TextStr == "" ) eTeamName.TextStr = DefaultTeamName; profilename = ePlayerName.TextStr; profileclass = class(DynamicLoadObject("xGame.UT2003GameProfile", class'Class')); // test if a profile with this name already exists GP = PlayerOwner().Level.Game.LoadDataObject(profileclass, "GameProfile", profilename); if ( GP != none ) { GP = none; // it may just still be lying around in memory, un GC'd, so test if there's a file there bFileExists=false; Controller.GetProfileList("",profilenames); for ( i=0; i profilenames; // if they click back and there are no existing profiles, take them to main by closing the SP menu Controller.GetProfileList("",profilenames); if ( profilenames.Length == 0 ) Controller.CloseMenu(); GUITabControl(MyButton.MenuOwner).ReplaceTab(MyButton, class'UT2SinglePlayerMain'.default.TabNameProfileLoad, "xInterface.Tab_SPProfileLoad", , , true); return true; } function bool DefaultsClick(GUIComponent Sender) { ClearStats(); return true; } F_G// ==================================================================== // Class: XInterface.Tab_SPRoster // Parent: XInterface.GUITabPanel // Single player menu for fussing with the player roster. Choose // lineup and give orders. // author: capps 8/24/02 // ==================================================================== class Tab_SPRoster extends Tab_SPPanelBase; const MatesCount = 4; const MatesBase = 8; const MatesCtrls = 5; var array pnlMates; // 1 Panel per mate var array imgMates; // TeamMate Image button var array lblMates; // TeamMate Name display var array cboMates; // TeamMate Fight Position var array btnMates; // TeamMate Assign Button var array lblNA; // 'spot not available' var GUIListBox lboStats, lboTeamStats; var GUIImage imgPortrait; var GUILabel lblMatchData; var GUIScrollTextBox stbPlayerData; var GUICharacterListTeam cltMyTeam; var localized string MessageNoInfo, PreStatsMessage, PostStatsMessage; function Created() { local GUIPanel Pnl; local int i; for (i = 0; i i); lblMates[i].bVisible = (nummates > i); cboMates[i].bVisible = (nummates > i); lblNA[i].bVisible = !(nummates > i); btnMates[i].bVisible = false; // Dont update unnecessarily if (nummates > i) { imgMates[i].Graphic = cltMyTeam.PlayerList[GP.PlayerLineup[i]].Portrait; lblMates[i].Caption = cltMyTeam.PlayerList[GP.PlayerLineup[i]].DefaultName; cboMates[i].OnChange = None; cboMates[i].SetText(GP.GetPositionDescription(GP.PlayerLineup[i])); //Log("Mate "$i$" named "$GP.PlayerTeam[GP.PlayerLineup[i]]$" has description "$GP.GetPositionDescription(GP.PlayerLineup[i])); cboMates[i].OnChange = PositionChange; // See if we should enable the assign button if (cltMyTeam.Index != -1 && cltMyTeam.Index != GP.PlayerLineup[i]) { btnMates[i].bVisible = true; btnMates[i].OnChange = PositionChange; imgMates[i].WinLeft = btnMates[i].WinLeft + btnMates[i].WinWidth * 1.35; } else imgMates[i].WinLeft = btnMates[i].WinLeft; } } } function ReloadPortraits() { local GameProfile GP; local array PlayerRecords; local int i; GP = GetProfile(); if (GP != None) { for ( i=0; i 0 ) cltMyTeam.SetIndex(0); if (cltMyTeam.Index != -1) { // selected-bot portrait imgPortrait.Image = cltMyTeam.GetPortrait(); // selected-bot sound, only if this tab is active if (MyButton != none && MyButton.bActive){ PlayerOwner().ClientPlaySound(cltMyTeam.GetSound(),,,SLOT_Interface); } // selected-bot decotext str = Mid(cltMyTeam.PlayerList[(cltMyTeam.Index)].TextName, Max(InStr(cltMyTeam.PlayerList[(cltMyTeam.Index)].TextName, ".")+1, 0)); if (str == "") str = MessageNoInfo; stbPlayerData.SetContent(Controller.LoadDecoText("xPlayers", str)); // selected-bot stats self.BuildCharStats(cltMyTeam.PlayerList[cltMyTeam.Index], lboStats); } else { // Clear the image imgPortrait.Image = None; // clear the decotext stbPlayerData.SetContent (MessageNoInfo); // Clear the stats listbox lboStats.List.Clear(); } } function BuildCharStats ( out xUtil.PlayerRecord PR, GUIListBox box ) { local string str; box.List.Clear(); str = class'xUtil'.static.GetFavoriteWeaponFor(PR); box.List.Add(str); str = class'xUtil'.Default.AccuracyString@class'xUtil'.static.AccuracyRating(PR); box.List.Add(str); str = class'xUtil'.Default.AggressivenessString@class'xUtil'.static.AggressivenessRating(PR); box.List.Add(str); str = class'xUtil'.Default.AgilityString@class'xUtil'.static.AgilityRating(PR); box.List.Add(str); str = class'xUtil'.Default.TacticsString@class'xUtil'.static.TacticsRating(PR); box.List.Add(str); box.List.Index = -1; // to avoid highlight of first line //str = "Salary:"@class'xUtil'.static.GetSalaryFor(PR)$"M"; //box.List.Add(str); } function BuildTeamStats ( GUIListBox teambox ) { local string str; local GameProfile GP; GP = GetProfile(); if ( GP == none ) return; // team stats teambox.List.Clear(); str = PreStatsMessage@GP.TeamName@PostStatsMessage; teambox.List.Add(str); str = class'xUtil'.Default.AccuracyString@class'xUtil'.static.TeamAccuracyRating(GP); teambox.List.Add(str); str = class'xUtil'.Default.AggressivenessString@class'xUtil'.static.TeamAggressivenessRating(GP); teambox.List.Add(str); str = class'xUtil'.Default.AgilityString@class'xUtil'.static.TeamAgilityRating(GP); teambox.List.Add(str); str = class'xUtil'.Default.TacticsString@class'xUtil'.static.TeamTacticsRating(GP); teambox.List.Add(str); } // update a position function PositionChange(GUIComponent Sender) { local int lineupnum, i; local string posn; lineupnum = -1; for ( i = 0; i < 4; i++ ) { if ( Sender == cboMates[i] ) { lineupnum = i; break; } } posn = GUIComboBox(Sender).GetText(); if (GetProfile() != None) { GetProfile().SetPosition(lineupnum, posn); if (!PlayerOwner().Level.Game.SavePackage(GetProfile().PackageName)) { Log("SINGLEPLAYER couldn't save profile package!"); } } } F_{G// ==================================================================== // Class: XInterface.Tab_SPTutorials // Parent: XInterface.Tab_SPPanelBase // Single player menu for calling up tutorials. // author: capps 9/14/02 <-- great day to add a menu! // ==================================================================== class Tab_SPTutorials extends Tab_SPPanelBase; #exec OBJ LOAD File=Laddershots.utx var array TutImages; // gametype image var array TutBorders; // border for image var array TutLabels; // label for gametype var array TutButtons; // big button to overlay all that stuff var localized string SelectMessage; // hint for selection var config bool bTDMUnlocked, bDOMUnlocked, bCTFUnlocked, bBRUnlocked; // whether these ladders have ever been unlocked const DMIndex = 0; const DOMIndex = 1; const CTFIndex = 2; const BRIndex = 3; const NumButtons = 4; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i = 0; iP9D??9?~~9D?9?,PP9D9?P9?k?z9D9?PL=9?~V9D9?P ?9?~_9D9?P\B?9?~-z~m$9?P9?Z-ks9?~9?TCaP9?J 9?5wk*kkkKke9D9?Z9?kP9?ab&@?9?P9?ea' 9?~9?Zae$kX%F>?9?k9?, P9?ewk* kP} }}aTESTNpe%e9D9?ZpSe9D9?e?9?kP?p?>?9?k9?, P9?e$a9S9Dk}P9?#T% Nk%k UT^sT&^sT5&%5^s99?z9?ZCa5?9?a$ fff?9?~J 9?,5^b33s?9?Vz5%5T5Z5a5ZN`NAm^bCm5ZAmN5dUTUZUaUZN`NAm^bCm5ZAmNiAm9?%-Wb'tm&aCmN`UN^btm,aCmN`UN^btm,Fm5% 5T5Z5Ma5ZN` N^b5Z5Z9D^bN9?}5Z5p UTUZUMaUZN` N^bUZUZ9D^bN9?}UZ 9?C 9D?`  -zC 9D>`$&?9?Z,]9D9?Z?9?C?`. U5%+ 5T! 5U-9?z9?Ca9?59?]a5Z'5  5% 5T 5UD9?z9?Ca9?59?]?`9?C a5Z'55  -Wbtm5% 5T 5U-9?V9?Ca9?59?] 5M- aC' a9S9D5M'5 _U%"UTLCaT]$)9?P9?ZCaTks9?~9?C$wUM*.9?z9?,0P9?L9?,P4aGBPBPCCBLCaU]+9?z9?L?`9?C -WbFmaUZ'-Wbtm9?V9?L:UM- aC'_a9S9DUM'k%[h&9:[h9:$9:[h9:$5%5Tw5M*"r5Mk G9?z9?,0P9?Ca9?59?]9?,P4aGBPBPCC5U%9?]9D9?Z?9?C9?C  ;m,-z(9?X9Dm,X9Dm&aTestN`5%5TS%5M-w.5M*w.5M*S&-9?z9?Ca9?59?]9? Uppp(5M\F) .5MzF.5MU.5MJ.5MUppp(5M\F) UaUltHylt9?VzUppp(5M\F) .5MzF.5M aU'-z5M-=9?z9?Ca9?59?]9?S`a5MW '5UT-9?z9?Ca9?59?]aUMW '9:9:$ }aTestN`]9D9?Z?9?C?`mmZCa]UT_ GF_q x,A }q x,Y F+ GF_KR// ==================================================================== // Class: XInterface.Tab_VideoSettings // Parent: XInterface.GUITabPanel // // // ==================================================================== class Tab_VideoSettings extends UT2K3TabPanel; #exec OBJ LOAD FILE=InterfaceContent.utx var bool ShowSShot; struct DisplayMode { var int Width, Height; }; var DisplayMode DisplayModes[19]; var localized string BitDepthText[2]; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); for (i=0;i 0) moComboBox(Controls[0]).RemoveItem(0,moComboBox(Controls[0]).ItemCount()); if(moComboBox(Controls[1]).GetText()==BitDepthText[0]) BitDepth = 16; else BitDepth = 32; // Don't let user create non-fullscreen window bigger than highest // supported resolution, or MacOS X client crashes. --ryan. if(!moCheckBox(Controls[2]).IsChecked()) // Controls[2] == fs toggle. { HighestRes = 0; for(Index = 0;Index < ArrayCount(DisplayModes);Index++) { if (PlayerOwner().ConsoleCommand( "SupportedResolution"$ " WIDTH="$DisplayModes[Index].Width$ " HEIGHT="$DisplayModes[Index].Height$ " BITDEPTH="$BitDepth) == "1") { HighestRes = Index; // biggest resolution hardware supports. } } for(Index = 0;Index <= HighestRes;Index++) { moComboBox(Controls[0]).AddItem(DisplayModes[Index].Width$"x"$DisplayModes[Index].Height); } } else // Set dropdown for fullscreen modes... { for(Index = 0;Index < ArrayCount(DisplayModes);Index++) { if (PlayerOwner().ConsoleCommand( "SupportedResolution"$ " WIDTH="$DisplayModes[Index].Width$ " HEIGHT="$DisplayModes[Index].Height$ " BITDEPTH="$BitDepth) == "1") { moComboBox(Controls[0]).AddItem(DisplayModes[Index].Width$"x"$DisplayModes[Index].Height); } } } moComboBox(Controls[0]).SetText(CurrentSelection); } function Refresh() { InternalOnLoadINI(Controls[0],""); InternalOnLoadINI(Controls[1],""); InternalOnLoadINI(Controls[2],""); } function InternalOnLoadINI(GUIComponent Sender, string s) { local string temp; if (Sender==Controls[0]) { // Resolution if(Controller.GameResolution != "") moComboBox(Controls[0]).SetText(Controller.GameResolution); else moComboBox(Controls[0]).SetText(Controller.GetCurrentRes()); } if (Sender==Controls[1]) { if (PlayerOwner().ConsoleCommand("get ini:Engine.Engine.RenderDevice Use16bit") ~= "true") moComboBox(Sender).SetText(BitDepthText[0]); else moComboBox(Sender).SetText(BitDepthText[1]); CheckSupportedResolutions(); } else if (Sender==Controls[2]) { Temp = Sender.PlayerOwner().ConsoleCommand("ISFULLSCREEN"); moCheckBox(Sender).Checked(bool(Temp)); CheckSupportedResolutions(); } } function string InternalOnSaveINI(GUIComponent Sender); // Do the actual work here function InternalOnChange(GUIComponent Sender) { if (!Controller.bCurMenuInitialized) return; if (Sender==Controls[0] || Sender==Controls[1] || Sender==Controls[2] ) { Controls[3].bVisible=true; if(Sender != Controls[0]) CheckSupportedResolutions(); } else if (Sender==Controls[6]) PlayerOwner().ConsoleCommand("GAMMA"@GUISlider(Controls[6]).Value); else if (Sender==Controls[8]) PlayerOwner().ConsoleCommand("BRIGHTNESS"@GUISlider(Controls[8]).Value); else if (Sender==Controls[10]) PlayerOwner().ConsoleCommand("CONTRAST"@GUISlider(Controls[10]).Value); } function bool ApplyChanges(GUIComponent Sender) { local string DesiredRes; DesiredRes = moComboBox(Controls[0]).MyComboBox.Edit.GetText(); if (moComboBox(Controls[1]).GetText()==BitDepthText[0]) DesiredRes=DesiredRes$"x16"; else DesiredRes=DesiredRes$"x32"; if (moCheckBox(Controls[2]).IsChecked()) DesiredRes=DesiredRes$"f"; else DesiredRes=DesiredRes$"w"; Controls[3].bVisible=false; if ( Controller.OpenMenu("xinterface.UT2VideoChangeOK") ) UT2VideoChangeOK(Controller.TopPage()).Execute(DesiredRes); return true; } function bool InternalOnClick(GUIComponent Sender) { showsshot = !showsshot; Controls[12].bVisible = !ShowSShot; Controls[13].bVisible = !ShowSShot; if (showsshot) GUIImage(Controls[11]).Image = material'GammaSet1'; else GUIImage(Controls[11]).Image = material'GammaSet0'; return true; } F_qmclass Tab_WeaponPref extends UT2K3TabPanel; var GUIListBox MyCurWeaponList; var moCheckBox SwitchWeaponCheckBox; var GUIScrollTextBox WeaponDescriptionBox; var class MyCurWeapon; var SpinnyWeap SpinnyWeap; // MUST be set to null when you leave the window var vector SpinnyWeapOffset; var bool bWeapPrefInitialised; var bool bChanged; var bool bUseDefaultPriority; function int CompareWeaponPriority(GUIListElem ElemA, GUIListElem ElemB) { local int PA, PB; local class WA, WB; WA = class(ElemA.ExtraData); WB = class(ElemB.ExtraData); if(bUseDefaultPriority) { // PA = WA.Default.DefaultPriority; // PB = WB.Default.DefaultPriority; } else { PA = WA.Default.Priority; PB = WB.Default.Priority; } return PB - PA; } function ShowPanel(bool bShow) { if(!bWeapPrefInitialised) { MyCurWeaponList.List.CompareItem = CompareWeaponPriority; // Spawn 'please wait' screen while we DLO the weapons if ( Controller.OpenMenu("xinterface.UT2LoadingWeapons") ) UT2LoadingWeapons(Controller.TopPage()).StartLoad(self); } Super.ShowPanel(bShow); if (!bShow && bWeapPrefInitialised) WeapApply(none); } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyCurWeaponList = GUIListBox(Controls[0]); SwitchWeaponCheckBox = moCheckBox(Controls[4]); WeaponDescriptionBox = GUIScrollTextBox(Controls[5]); // Set up 'auto-switch weapon' check box SwitchWeaponCheckBox.Checked( !class'Engine.PlayerController'.default.bNeverSwitchOnPickup ); } function UpdateWeaponPriorities() { local int i; local class W; // Allocate priority values from 1 upwards for(i=0; i(MyCurWeaponList.List.GetObjectAtIndex(i)); W.default.Priority = MyCurWeaponList.List.ItemCount - i; W.static.StaticSaveConfig(); } } // Resort the weapons using their 'default' priority function bool WeapDefaults(GUIComponent Sender) { bUseDefaultPriority=true; MyCurWeaponList.List.SortList(); MyCurWeaponList.List.SetIndex(0); UpdateCurrentWeapon(); bChanged=true; bUseDefaultPriority=false; return true; } function bool WeapApply(GUIComponent Sender) { if (bChanged) UpdateWeaponPriorities(); bChanged=false; return true; } Delegate OnDeActivate() { WeapApply(Self); } function SwapWeapons(int IndexA, int IndexB) { // Swap it with the one above MyCurWeaponList.List.Swap(IndexA, IndexB); // Make 'apply' button visible bChanged=true; } function bool WeapUp(GUIComponent Sender) { local int currPos; // Can't do any sorting if only one thing in the list! if(MyCurWeaponList.List.ItemCount == 0) return true; currPos = MyCurWeaponList.List.Index; // No room to move up if(currPos == 0) return true; SwapWeapons(currPos, currPos-1); MyCurWeaponList.List.Index = currPos-1; return true; } function bool WeapDown(GUIComponent Sender) { local int currPos; if(MyCurWeaponList.List.ItemCount == 0) return true; currPos = MyCurWeaponList.List.Index; if(currPos == MyCurWeaponList.List.ItemCount - 1) return true; SwapWeapons(currPos, currPos+1); MyCurWeaponList.List.Index = currPos+1; return true; } function bool InternalDraw(Canvas canvas) { local vector CamPos, X, Y, Z, WX, WY, WZ; local rotator CamRot; if(MyCurWeapon != None) { canvas.GetCameraLocation(CamPos, CamRot); GetAxes(CamRot, X, Y, Z); if(SpinnyWeap.DrawType == DT_Mesh) { GetAxes(SpinnyWeap.Rotation, WX, WY, WZ); SpinnyWeap.SetLocation(CamPos + (SpinnyWeapOffset.X * X) + (SpinnyWeapOffset.Y * Y) + (SpinnyWeapOffset.Z * Z) + (30 * WX)); } else { SpinnyWeap.SetLocation(CamPos + (SpinnyWeapOffset.X * X) + (SpinnyWeapOffset.Y * Y) + (SpinnyWeapOffset.Z * Z)); } canvas.DrawActor(SpinnyWeap, false, true, 90.0); } return false; } function UpdateCurrentWeapon() { local class currWeap; local class pickupClass; local class attachClass; local vector Scale3D; local bool b; local int i; if(SpinnyWeap == None) return; currWeap = class(MyCurWeaponList.List.GetObject()); if(currWeap != None && currWeap != MyCurWeapon) { MyCurWeapon = currWeap; pickupClass = MyCurWeapon.default.PickupClass; attachClass = MyCurWeapon.default.AttachmentClass; if(MyCurWeapon != None) { if(pickupClass != None && pickupClass.default.StaticMesh != None) { SpinnyWeap.LinkMesh( None ); SpinnyWeap.SetStaticMesh( pickupClass.default.StaticMesh ); SpinnyWeap.SetDrawScale( pickupClass.default.DrawScale ); SpinnyWeap.SetDrawScale3D( pickupClass.default.DrawScale3D ); // Set skins array on spinnyweap to the same as the pickup class. SpinnyWeap.Skins.Length = pickupClass.default.Skins.Length; for(i=0; i currWeap; if(Sender == Controls[0]) { UpdateCurrentWeapon(); OnChange(Self); } else if(Sender == Controls[4]) { sw = !SwitchWeaponCheckBox.IsChecked(); // Set for current playercontroller PlayerOwner().bNeverSwitchOnPickup = sw; // Save for future games class'Engine.PlayerController'.default.bNeverSwitchOnPickup = sw; class'Engine.PlayerController'.static.StaticSaveConfig(); } else if (Sender==Controls[8]) { currWeap = class(MyCurWeaponList.List.GetObject()); if ( moCheckBox(Controls[8]).IsChecked() ) CurrWeap.default.ExchangeFireModes = 1; else CurrWeap.default.ExchangeFireModes = 0; CurrWeap.static.StaticSaveConfig(); } } F_uM_)Vn_)oX( GF_K$class TestGFXButtonPage extends TestPageBase; #exec OBJ LOAD FILE=InterfaceContent.utx var GUIGFXButton Btn; var GUIComboBox ImgStyle, ImgAlign, ImgSelect; function MyOnOpen() { Btn = GUIGFXButton(Controls[1]); ImgStyle = GUIComboBox(Controls[3]); ImgAlign = GUIComboBox(Controls[5]); ImgSelect = GUIComboBox(Controls[7]); // Prepare the ComboBoxes ImgStyle.AddItem("Normal"); ImgStyle.AddItem("Center"); ImgStyle.AddItem("Stretched"); ImgStyle.AddItem("Scaled"); ImgStyle.AddItem("Bound"); ImgAlign.AddItem("Blurry"); ImgAlign.AddItem("Watched"); ImgAlign.AddItem("Focused"); ImgAlign.AddItem("Pressed"); ImgAlign.AddItem("Disabled"); ImgSelect.AddItem("PlayerPictures.cEgyptFemaleBA"); ImgSelect.AddItem("InterfaceContent.Menu.bg07"); ImgSelect.AddItem("PlayerPictures.Galactic"); ImgSelect.AddItem("InterfaceContent.Menu.CO_Final"); ImgSelect.AddItem("InterfaceContent.BorderBoxF_Pulse"); SetNewImage("PlayerPictures.cEgyptFemaleBA"); } function OnNewImgStyle(GUIComponent Sender) { local string NewImgStyle; NewImgStyle = ImgStyle.Get(); if (NewImgStyle == "Normal") Btn.Position=ICP_Normal; else if (NewImgStyle == "Center") Btn.Position=ICP_Center; else if (NewImgStyle == "Stretched") Btn.Position=ICP_Stretched; else if (NewImgStyle == "Scaled") Btn.Position=ICP_Scaled; else if (NewImgStyle == "Bound") Btn.Position=ICP_Bound; } function OnNewImgAlign(GUIComponent Sender) { local string NewImgAlign; NewImgAlign = ImgAlign.Get(); if (NewImgAlign == "Blurry") Btn.MenuState = MSAT_Blurry; else if (NewImgAlign == "Watched") Btn.MenuState = MSAT_Watched; else if (NewImgAlign == "Focused") Btn.MenuState = MSAT_Focused; else if (NewImgAlign == "Pressed") Btn.MenuState = MSAT_Pressed; else if (NewImgAlign == "Disabled") Btn.MenuState = MSAT_Disabled; } function OnNewImgSelect(GUIComponent Sender) { SetNewImage(ImgSelect.Get()); } function OnNewClientBound(GUIComponent Sender) { Btn.bClientBound=GUICheckBoxButton(Sender).bChecked; } function SetNewImage(string ImageName) { Btn.Graphic=DLOTexture(ImageName); } function Material DLOTexture(string TextureFullName) { return Material(DynamicLoadObject(TextureFullName, class'Material')); } F_{Oclass TestImagePage extends TestPageBase; #exec OBJ LOAD FILE=InterfaceContent.utx var automated GUIImage i_Test; var automated moComboBox co_Style, co_Align, co_Select, co_Render; var automated GUINumericEdit nu_Width, nu_Height, nu_PortionX1, nu_PortionX2, nu_PortionY1, nu_PortionY2; var automated GUIButton b_Add; var automated GUILabel l_ImageSize; var config array Images; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); Background = Controller.DefaultPens[1]; } function bool InternalOnClick( GUIComponent Sender ) { local string S; local Material M; if ( Sender == b_Add ) { S = co_Select.GetText(); if ( co_Select.FindIndex(s) == -1 ) { M = LoadTexture(S); if ( M != None ) { co_Select.AddItem(S); Images[Images.Length] = S; SaveConfig(); SetNewImage(S); } } } return true; } function InternalOnOpen() { local int i; // Prepare the ComboBoxes co_Style.AddItem("Normal"); co_Style.AddItem("Stretched"); co_Style.AddItem("Scaled"); co_Style.AddItem("Bound"); co_Style.AddItem("Justified"); co_Style.AddItem("PartialScaled"); co_Align.AddItem("TopLeft"); co_Align.AddItem("Center"); co_Align.AddItem("BottomRight"); co_Render.AddItem("None"); co_Render.AddItem("Normal"); co_Render.AddItem("Masked"); co_Render.AddItem("Translucent"); co_Render.AddItem("Modulated"); co_Render.AddItem("Alpha"); co_Render.AddItem("Additive"); co_Render.AddItem("Subtractive"); co_Render.AddItem("Particle"); co_Render.AddItem("AlphaZ"); for ( i = 0; i < Images.Length; i++ ) co_Select.AddItem(Images[i]); SetNewImage(co_Select.MyComboBox.List.Get(True)); co_Render.SetIndex(1); co_Style.SetIndex(0); co_Align.SetIndex(0); nu_PortionX1.SetValue(-1); nu_PortionY1.SetValue(-1); nu_PortionX2.SetValue(-1); nu_PortionY2.SetValue(-1); } function InternalOnRendered(Canvas C) { if ( i_Test.bPositioned ) { nu_Width.Value = string(i_Test.ActualWidth()); nu_Height.Value = string(i_Test.ActualHeight()); OnRendered=None; } } function OnNewImgStyle(GUIComponent Sender) { local string NewImgStyle; NewImgStyle = co_Style.GetText(); switch ( NewImgStyle ) { case "Normal": i_Test.ImageStyle = ISTY_Normal; break; case "Stretched": i_Test.ImageStyle = ISTY_Stretched; break; case "Scaled": i_Test.ImageStyle = ISTY_Scaled; break; case "Bound": i_Test.ImageStyle = ISTY_Bound; break; case "Justified": i_Test.ImageStyle = ISTY_Justified; break; case "PartialScaled": i_Test.ImageStyle = ISTY_PartialScaled; break; } } function InternalOnChange( GUIComponent Sender ) { if ( Sender == co_Render ) { switch (co_Render.GetText()) { case "None": i_Test.ImageRenderStyle = MSTY_None; break; case "Normal": i_Test.ImageRenderStyle = MSTY_Normal; break; case "Masked": i_Test.ImageRenderStyle = MSTY_Masked; break; case "Translucent": i_Test.ImageRenderStyle = MSTY_Translucent; break; case "Modulated": i_Test.ImageRenderStyle = MSTY_Modulated; break; case "Alpha": i_Test.ImageRenderStyle = MSTY_Alpha; break; case "Additive": i_Test.ImageRenderStyle = MSTY_Additive; break; case "Subtractive": i_Test.ImageRenderStyle = MSTY_Subtractive; break; case "Particle": i_Test.ImageRenderStyle = MSTY_Particle; break; case "AlphaZ": i_Test.ImageRenderStyle = MSTY_AlphaZ; break; } } } function OnNewImgAlign(GUIComponent Sender) { local string NewImgAlign; NewImgAlign = co_Align.GetText(); if (NewImgAlign == "TopLeft") i_Test.ImageAlign = IMGA_TopLeft; else if (NewImgAlign == "Center") i_Test.ImageAlign = IMGA_Center; else if (NewImgAlign == "BottomRight") i_Test.ImageAlign = IMGA_BottomRight; } function OnNewImgSelect(GUIComponent Sender) { local string S; s = co_Select.GetText(); if ( co_Select.FindIndex(s) != -1 ) SetNewImage(s); } function SetNewImage(string ImageName) { i_Test.Image = LoadTexture(ImageName); if ( i_Test.Image != None ) l_ImageSize.Caption = i_Test.Image.MaterialUSize() $ "x" $ i_Test.Image.MaterialVSize(); } function Material LoadTexture(string TextureFullName) { return Material(DynamicLoadObject(TextureFullName, class'Material')); } function ResizeImage(GUIComponent Sender) { if ( Sender == nu_Width ) i_Test.WinWidth = i_Test.RelativeWidth(int(nu_Width.Value)); else i_Test.WinHeight = i_Test.RelativeHeight(int(nu_Height.Value)); } function ChangePortion(GUIComponent Sender) { switch ( Sender ) { case nu_PortionX1: i_Test.X1 = int(GUINumericEdit(Sender).Value); break; case nu_PortionX2: i_Test.X2 = int(GUINumericEdit(Sender).Value); break; case nu_PortionY1: i_Test.Y1 = int(GUINumericEdit(Sender).Value); break; case nu_PortionY2: i_Test.Y2 = int(GUINumericEdit(Sender).Value); break; } } M\H>{MJheҽҽҽҽҽҽҽҽҽҽډډډډҽҽҽҽҽډډҽҽҽҽҽҽ i x ~ $H>} $>@ $? $?A>]UT2003Fonts.FontLargeU]. . . L O A D I N G . . .T$?S$ff&?BB$9?{HR*F_F_R"~M6Y 9 T.DTT%MT7oTCwo*&o-o-o%j, jDoroTDjjCCl, l@o<roTTllT6Xjl6 u66aTestGWf@WB69?g9D>W~6o9D@W"9D?Wi9D9?,Wff?9?i9?X6?9?i9?gg9D>W9?X6?9?i9?g9?X6?9?i9?go6t6o6aTestGWg9D>W~6o9D@W9D?Wi9D9?,Wf9?X6?9?i9?go6t6o6aTestGWg9D>Wz~6o9D@W9D?Wi9D9?,Wf69?X19?X69?i9?go6t6o6aTestGWg9D>Ww~6o9D@W9D?Wi9D9?,Wf9?X69?i9?go6t6o6aTestGWg9D>WX~6o9D@Wl9D?Wi9D9?,WfXX9D9?&69?i9?go,e@@e@9D?6+?f9?X9?g9?eW-9?X6f9?gjjXllXDjj&Tll&w 9D?Wf6$t69?w 9?X&9?g9? w*|6T%qT, TMTDTDh%jD6ogw 6|T%T, TMT@Th&lT6ogw 6 9:9:$q6o G F__A'L]JSA'U#<r]*].A' xr]*ppp9W - FONT NOT FOUND 'A''!{ ] GF_A$sL q K  K%s K&s K  K A$ GF_z%class TestVignette extends Vignette; #exec OBJ LOAD FILE=InterfaceContent.utx var() config array Backgrounds; var() transient texture Background; var() Texture Logo; var() float LogoPosX, LogoPosY; var() float LogoScaleX, LogoScaleY; var() localized String LoadingFontName; var() font LoadingFontFont; var() localized String LoadingString; var() float LoadingPosX, LoadingPosY, MapPosY; var() EDrawPivot LoadingPivot; var() Color LoadingColor; simulated event Init() { local int i; Super.PreBeginPlay(); i = Rand( Backgrounds.Length ); Background = Texture( DynamicLoadObject( Backgrounds[i], class'Texture') ); if( Background == none ) log( Backgrounds[i] $" not found for Vignette", 'Error' ); } simulated function ScreenText(Canvas C, String Text, float posX, float posY, float ScaleX,float ScaleY) { C.Style = ERenderStyle.STY_Alpha; C.Font = LoadLoadingFont(); C.DrawColor = LoadingColor; C.FontScaleX = ScaleX; C.FontScaleY = ScaleY; C.DrawScreenText( Text, posX, posY, LoadingPivot ); } simulated function font LoadLoadingFont() { if( LoadingFontFont == None ) { LoadingFontFont = Font(DynamicLoadObject(LoadingFontName, class'Font')); if( LoadingFontFont == None ) Log("Warning: "$Self$" Couldn't dynamically load font "$LoadingFontName); } return LoadingFontFont; } simulated event DrawVignette( Canvas C, float Progress ) { local float ResScaleX, ResScaleY; local float PosX, PosY, DX, DY; C.Reset(); ResScaleX = C.SizeX / 640.0; ResScaleY = C.SizeY / 480.0; C.Style = ERenderStyle.STY_Alpha; C.DrawColor = C.MakeColor( 255, 255, 255 ); C.SetPos( 0, 0 ); C.DrawTile( Background, C.SizeX, C.SizeY, 0, 0, Background.USize, Background.VSize ); DX = Logo.USize * ResScaleX * LogoScaleX; DY = Logo.VSize * ResScaleY * LogoScaleY; PosX = (LogoPosX * C.SizeX) - (DX * 0.5); PosY = (LogoPosY * C.SizeY) - (DY * 0.5); C.SetPos( PosX, PosY ); C.Style = ERenderStyle.STY_Alpha; C.DrawTile( Logo, DX, DY, 0, 0, Logo.USize, Logo.VSize ); ScreenText( C, LoadingString, LoadingPosX, LoadingPosY, ResScaleX*0.5, ResScaleY*0.5 ); if (MapName~="endgame.ut2" || MapName~="ut2-intro.ut2" || caps(Left(MapName,3))=="TUT") return; ScreenText( C, MapName, LoadingPosX, MapPosY, ResScaleX, ResScaleY ); } F_]F_F_i class UT2ArenaConfig extends UT2K3GUIPage; var array > WeaponClass; var array WeaponDesc; var moComboBox WeaponCombo; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); WeaponCombo = moComboBox(Controls[4]); // Spawn 'please wait' screen while we DLO the weapons if ( Controller.OpenMenu("XInterface.UT2LoadingWeaponsArena") ) UT2LoadingWeaponsArena(Controller.TopPage()).StartLoad(self); } function bool InternalOnClick(GUIComponent Sender) { class'MutArena'.default.ArenaWeaponClassName = WeaponCombo.GetExtra(); class'MutArena'.static.StaticSaveConfig(); Controller.CloseMenu(false); return true; } F__class UT2BadCDKeyMsg extends UT2K3GUIPage; var bool bIgnoreEsc; var localized string LeaveMPButtonText; var localized string LeaveSPButtonText; var float ButtonWidth; var float ButtonHeight; var float ButtonHGap; var float ButtonVGap; var float BarHeight; var float BarVPos; function bool InternalOnClick(GUIComponent Sender) { if(Sender==Controls[1]) // OK { Controller.ReplaceMenu("xinterface.UT2MainMenu"); } return true; } F_yclass UT2BotInfoPage extends UT2K3GUIPage; var localized string NoInformation; var GUIImage BotPortrait; var GUILabel BotName, BotRace; var array Bars; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); BotPortrait=GUIImage(Controls[1]); BotName=GUILabel(Controls[3]); BotRace=GUILabel(Controls[4]); Bars[0]=GUIProgressBar(Controls[5]); Bars[1]=GUIProgressBar(Controls[6]); Bars[2]=GUIProgressBar(Controls[7]); Bars[3]=GUIProgressBar(Controls[8]); Bars[4]=GUIProgressBar(Controls[9]); } function SetupBotInfo(Material Portrait, string DecoTextName, xUtil.PlayerRecord PRE) { // Setup the Portrait from here BotPortrait.Image = PRE.Portrait; // Setup the decotext from here BotName.Caption = PRE.DefaultName; BotRace.Caption = PRE.Species.default.SpeciesName$" - "$class'XUtil'.static.GetFavoriteWeaponFor(PRE); Bars[0].Value=class'XUtil'.static.AccuracyRating(PRE); Bars[1].Value=class'XUtil'.static.AgilityRating(PRE); Bars[2].Value=class'XUtil'.static.TacticsRating(PRE); Bars[3].Value=class'XUtil'.static.AccuracyRating(PRE); } function bool OkClick(GUIComponent Sender) { Controller.CloseMenu(false); return true; } F_FNRm3, - R\%\t \M-R-9?r9?ht9?\9?KR a['\6 Ht HM-R-9?r9?ht9?t 9?KR a['R RX9DRe!RaTestM#LK9D9?h!?9?h-jL?9?h- -sq9?h9?,L\%\t <-sqR;9?r9?ht9?\9?K?LR.aѨ{9S,9:\M'R;9?r9?ht9?\9?K?LR!aѨjv9R\M'R;9?r9?ht9?\9?K?L6-jR49?r9?ht9?\9?KLR.aѨ{9S,9:\M'R-9?r9?ht9?\9?K6R;9?r9?ht9?\9?K?Lc\M- R az'uR aB'\ R9?{{{-[c9?h9?,L-sq9?h9?,LVTh9?%2.-.-%Th9?\% \t  \M-\M--sqR;9?r9?ht9?\9?K33?LR.aѨ{9S,9:\M'R;9?r9?ht9?\9?Kfff?LR!aѨjv9R\M'R;9?r9?ht9?\9?K=LR^aѨTN9S9D9?\M?Th9?\M''R;9?r9?ht9?\9?Ǩ?LR,aV%9DTh9?\M' f -[cR;9?r9?ht9?\9?K?LR.aѨ{9S,9:\M'R;9?r9?ht9?\9?K?LR^aѨTN9S9D9?\M?Th9?\M''R;9?r9?ht9?\9?K?LR,aV%9DTh9?\M' Q -jR49?r9?ht9?\9?KLR.aѨ{9S,9:\M'R-9?r9?ht9?\9?KR,aV%9DTh9?\M' R;9?r9?ht9?\9?K?LR.aѨ{9S,9:\M'\])Ht HM-HM- -[cR;9?r9?ht9?\9?K?LR.aѨ{9S,9:HM'R;9?r9?ht9?\9?K?LRYaѨTN9S9D9?HM?Th9?HM'R;9?r9?ht9?\9?K?LR,aV%9DTh9?HM') -jR49?r9?ht9?\9?KLR.aѨ{9S,9:HM'R-9?r9?ht9?\9?KR,aV%9DTh9?HM')R;9?r9?ht9?\9?K?LR.aѨ{9S,9:HM' GF__|m O r* |Q.|_GY 9?|Mq 9?|o9?%M9?wMo9?|n9?%J9?xJn9?|~Xj[BH9?%\9?wM\HtO9?%`9?x`O9:`&GM9?,MJ9?,9:`,GMMJ|GM| 0$|&aMJ~j\` V$|MJ $|&aMJ~j\`  GF_R"@ q|1%@ X9D?@ w &@ $aШ`9SM R!@ &@ M 9?,@@ aѨ`9S' GtHN_9V2 GN.tI  N'Y eQfQgQhQ$=$=$L?$L?F_F_Bclass UT2Congratulations extends UT2K3GUIPage; function SetupPage(string PageCaption, string PageMessage, string ContinueCaption, Material CongratsPic) { GUITitleBar(Controls[0]).SetCaption(PageCaption); GUITitleBar(Controls[2]).SetCaption(PageMessage); GUIButton(Controls[3]).Caption = ContinueCaption; // For localization GUIImage(Controls[1]).Image = CongratsPic; } F_B// ==================================================================== // Class: A font.. // // One of the system fonts used by the menus // // Written by Joe Wilcox // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class UT2DefaultFont extends GUIFont; #exec OBJ LOAD File=UT2003Fonts.utx F_\class UT2DeferChangeRes extends UT2K3GUIPage; function bool InternalOnClick(GUIComponent Sender) { Controller.CloseMenu(false); return true; } F_h// ==================================================================== // Class: XInterface.UT2DemoQuitPage // Parent: XInterface.GUIPage // // // ==================================================================== class UT2DemoQuitPage extends UT2K3GUIPage; #exec OBJ LOAD FILE=ExitScreen.utx var int TimeLeft; var bool bClickedBuy; // need a tick or two for the start to take place function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); GUIButton(Controls[17]).Caption = GUIButton(default.Controls[17]).Caption$"("$TimeLeft$")"; SetTimer(1,true); } event Timer() { if ( bClickedBuy ) { PlayerOwner().ConsoleCommand("exit"); } else { TimeLeft--; GUIButton(Controls[17]).Caption = GUIButton(default.Controls[17]).Caption$"("$TimeLeft$")"; if(TimeLeft <= 0) OnQuitClicked(Controls[17]); } } function bool OnBuyClicked(GUIComponent Sender) { PlayerOwner().ConsoleCommand("start http://www.unrealtournament.com/"); bClickedBuy = true; SetTimer(0.5,true); return true; } function bool OnQuitClicked(GUIComponent Sender) { PlayerOwner().ConsoleCommand("exit"); return true; } F__VRm_RW{w`Lw9?RWw`*R`Rfff?Rfff?eY 9?RIq 9?Rko9?Rin9?RRaVGF;-JRVck|H%cVgF9?7cL $IIig9?, $IIig @%@7cRa@cGF` $ReIv D$R$ekG9?,Iv s$RekGIv Ra@cIF@ GF_Y// ==================================================================== // Class: XInterface.UT2DraftTeam // Parent: XInterface.GUIPage // // Draft the team. Salary stuff commented out for UT2003. // ==================================================================== class UT2DraftTeam extends UT2K3GUIPage; var GUIListBox lboStats, lboTeamStats; var GUILabel lblMatchData, lblChoose; var GUIScrollTextBox stbPlayerData; var GUICharacterListTeam cltMyTeam; var GUICharacterListTeam cltPortrait; var GUIButton butDraft, butRelease, butClear, butEnter, butAuto; var GUIGfxButton butLeft, butRight; var GUITitleBar MyTitleBar, MyHintBar; var string ButtonStyleEnabled, ButtonStyleDisabled; var localized string ClearConfirmMessage, EnterConfirmMessage, StatsMessage; var bool bPlaySounds; // whether to play the announcer/select sounds function Created() { lblMatchData = GUILabel(Controls[1]); stbPlayerData = GUIScrollTextBox(Controls[2]); lboStats = GUIListBox(Controls[3]); cltMyTeam = GUICharacterListTeam(Controls[4]); cltPortrait = GUICharacterListTeam(Controls[6]); butDraft = GUIButton(Controls[7]); butRelease = GUIButton(Controls[8]); butClear = GUIButton(Controls[9]); butEnter = GUIButton(Controls[10]); butLeft = GUIGfxButton(Controls[11]); butRight = GUIGfxButton(Controls[12]); lblChoose = GUILabel(Controls[13]); lboTeamStats = GUIListBox(Controls[14]); MyTitleBar = GUITitleBar(Controls[15]); MyHintBar = GUITitleBar(Controls[16]); butAuto = GUIButton(Controls[17]); OnKeyEvent=MyKeyEvent; } // capture escape-hits function bool MyKeyEvent(out byte Key,out byte State,float delta) { if ( Key == 27 ) // Escape pressed { return true; } } function InitComponent(GUIController MyController, GUIComponent MyOwner) { MyController.RegisterStyle(class'STY_RosterButton'); Super.Initcomponent(MyController, MyOwner); cltPortrait.InitListInclusive("SP"); cltPortrait.Find("Gorge"); cltPortrait.OnChange=CharListChange; CharListUpdate(cltPortrait); ReloadPortraits(); butEnter.bVisible = false; butEnter.bAcceptsInput = false; butDraft.OnClick=ButtonClick; butRelease.OnClick=ButtonClick; butClear.OnClick=ButtonClick; butEnter.OnClick=ButtonClick; butLeft.OnClick=ButtonClick; butRight.OnClick=ButtonClick; butAuto.OnClick=ButtonClick; lboStats.List.bAcceptsInput=false; lboTeamStats.List.bAcceptsInput=false; cltMyTeam.OnChange=CharListChange; cltMyTeam.Index = -1; } function ReloadPortraits() { local GameProfile GP; local array PlayerRecords; local int i; GP = PlayerOwner().Level.Game.CurrentGameProfile; if (GP != None) { for ( i=0; i int(lblTeamSalary.Caption) + int(lblPlayerSalary.Caption)) { // Log("SINGLEPLAYER affordable. teamfull = "$IsTeamFull()); UpdateDraftable (true); /*} else { // Log("SINGLEPLAYER not affordable. "); // UpdateDraftable(false); //} lblPlayerSalary.Caption = "Salary:"@lblPlayerSalary.Caption$"M"; lblTeamSalary.Caption = "Team Salary:"@lblTeamSalary.Caption$"M"; lblTeamSalaryCap.Caption = "Salary Cap:"@lblTeamSalaryCap.Caption$"M"; */ } function CharListChange(GUIComponent Sender) { Super.OnChange(Sender); if ( Sender == cltMyTeam ) { if ( cltMyTeam.GetName() == "" ) { cltMyTeam.Index = -1; } else { cltPortrait.Find(cltMyTeam.GetName()); CharListUpdate(Sender); } } } function bool IsOnTeam(string botname) { local int i; local GameProfile GP; if ( botname == "" ) { return false; } GP = PlayerOwner().Level.Game.CurrentGameProfile; if ( GP != none ) { for ( i=0; i?mBm @O m aSf'@Sfma@BO m<?mI]#fwO ?m aK 'm>?mBm?O m a@' GF_A$w  GF_S$@dF_QN@dF_^$@dF_SN@dF_Zclass UT2GetPassword extends UT2K3GUIPage; var bool bIgnoreEsc; var localized string LeaveMPButtonText; var localized string LeaveSPButtonText; var float ButtonWidth; var float ButtonHeight; var float ButtonHGap; var float ButtonVGap; var float BarHeight; var float BarVPos; var string RetryURL; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(Mycontroller, MyOwner); PlayerOwner().ClearProgressMessages(); moEditBox(Controls[1]).MyEditBox.bConvertSpaces = true; } function HandleParameters(string URL,string Unused) { RetryURL = URL; } function bool InternalOnClick(GUIComponent Sender) { local ExtendedConsole MyConsole; if(Sender==Controls[2] && Len(moEditbox(Controls[1]).GetText()) > 0) // Retry { MyConsole = ExtendedConsole(PlayerOwner().Player.Console); if(MyConsole != None) { MyConsole.SavedPasswords.Length = MyConsole.SavedPasswords.Length + 1; MyConsole.SavedPasswords[MyConsole.SavedPasswords.Length - 1].Server = MyConsole.LastConnectedServer; MyConsole.SavedPasswords[MyConsole.SavedPasswords.Length - 1].Password = moEditbox(Controls[1]).GetText(); MyConsole.SaveConfig(); } PlayerOwner().ClientTravel(RetryURL$"?password="$moEditbox(Controls[1]).GetText(),TRAVEL_Absolute,false); Controller.CloseAll(false); } if(Sender==Controls[3]) // Fail { Controller.ReplaceMenu("xinterface.UT2MainMenu"); } return true; } F_{@dF_[&@dF_F_F_F_F_F_F_F_]BACK]SquareMenuButton$L>$?f'`N_F_rSp] SquareBar$?$?F_'Y`NaNkj$fff?$=F_*%$fff?]Only Standard Servers^E'cN]E2] @Internal$>$L=${>$ #=F_*%$fff?]No Passworded Servers^E'dN]E2] @Internal$= W>$L=${>$ #=F_*%$fff?]No Full Servers^E'eN]E2] @Internal$q=>$L=${>$ #=F_*%$fff?]No Empty Servers^E'fN]E2] @Internal$>$L=${>$ #=F_*%$>]Stats Servers^E'gN]E2] @INTERNAL$>$L=$\B?$ #=F_*%$^E'hN]E2] @INTERNAL$ff>$,?${>$u=F_%$>] Custom Query^E'iN]E2] @INTERNAL$@?$L=$\B?$ #=F_]Server Filtering Options:L*4]UT2HeaderFont$L=$>$R8?$fff=F_]Wow$>$>$?$@Bf'kN_F_]Damn$ ?$>$?$@Bf'lN_F_u] DAMN HOT$?$=$L?$@Bj'mNDQy'mNFQF'mNEf'mN_F_B*$;=$wH<$u?$G*>F_B*$>$wH<$u?$: ?F_] Music Volume+L*$=$c=$>$BF_j$?2]+*ini:Engine.Engine.AudioDevice MusicVolumeJ]0.5 ]-,Changes the volume of the background music.$>$=$>$WqN)C'qN~ D'qN`Ef'qN_J'qN{F_MEffects Volume+L*$=$/?$>$BF_j$?2]+*ini:Engine.Engine.AudioDevice SoundVolumeJ]0.9 ]21Changes the volume of all in game sound effects.$>$0?$>$WsN)C'sN~ D'sN`Ef'sN_J'sN{F_]Announcer Volume+L*$=$ >$>$BF_Y$?j$@t.2] @Internal ]32Changes the volume of all in game voice messages.$>$>$>$WuN)C'uN~ D'uN`Ef'uN_J'uN{G'w@F_c*%$>= Audio Mode^E'vN]E2] @InternalJ]Software 3D Audio ] Changes the audio system mode.$>$>$333?$u=G'w@Z'wTF_*%$fff?MReverse Stereo^E'wN]E2]-,ini:Engine.Engine.AudioDevice ReverseStereoJ]False ]-,Reverses the left and right audio channels.$>$=$>$ #=G'w@Z'wTF_*%$fff?] Message Beep^E'xN]E2] @InternalJ]True ]CAEnables a beep when receiving a text message from other players.$>$?$>$ #=G'w@Z'wTF_*%$fff?= Auto-Taunt^E'yN]E2] @InternalJ]True ]?>Enables your in-game player to automatically taunt opponents.$?$=$>$ #=G'w@Z'wTF_*%$fff?]Mature Taunts^E'zN]E2] @InternalJ]True ]Enables off-color commentary.$Q?$?$>$ #=G'w@Z'wTF_*%$fff?]Low Sound Detail^E'{N]E2] @InternalJ]False ]Lowers quality of sound.$!"?$=$>$ #=G'w@Z'wTF_c*] Play Voices^E'|N]E2] @InternalJ]All ].-Defines the types of voice messages to play.$;?$L>$>$u=G'w@Z'wTF_c*]Announcements^E'}N]E2] @InternalJ]All ].-Adjusts the amount of in-game announcements.$ Q?$L>$>$u=G'w@Z'wTF_B*$ ף>$wH<$u?$p?F_*MTexture Detail^E'N]E2]65ini:Engine.Engine.ViewportManager TextureDetailWorldJ]High ]10Changes how much world detail will be rendered.$=$L=$>$L=G'h@Z'hTF_*]Character Detail^E'@O]E2];:ini:Engine.Engine.ViewportManager TextureDetailPlayerSkinJ]High ]54Changes how much character detail will be rendered.$=$ ?$>$L=G'h@Z'hTF_*] World Detail^E'AO]E2] @InternalJ]High ]FDChanges the level of detail used for optional geometry and effects.$L>$L=$>$L=G'h@Z'hTF_*MPhysics Detail^E'BO]E2] @InternalJ]High ]10Changes the physics simulation level of detail.$L>$ ?$>$L=G'h@Z'hTF_*%$fff?]Character Shadows^E'CO]E2] @InternalJ]True ]Enables character shadows.$Q>$=$>$L=G'h@Z'hTF_*%$fff?]Decals^E'DO]E2]*)ini:Engine.Engine.ViewportManager DecalsJ]True ]"!Enables weapon scarring effects.$Q>$?$>$L=G'h@Z'hTF_*%$fff?]Dynamic Lighting^E'EO]E2]32ini:Engine.Engine.ViewportManager NoDynamicLightsJ]True ]Enables dynamic lights.$>$=$>$L=G'h@Z'hTF_*%$fff?] Coronas^E'FO]E2]+*ini:Engine.Engine.ViewportManager CoronasJ]True ]Enables coronas.$>$?$>$L=G'h@Z'hTF_*%$fff?]Detail Textures^E'GO]E2]/.ini:Engine.Engine.RenderDevice DetailTexturesJ]True ]Enables detail textures.$)\?$=$>$L=G'h@Z'hTF_*= Decal Stay^E'HO]E2] @InternalJ]Normal ]76Changes how long weapon scarring effects stay around.$ ?$G?$33>$u=G'h@Z'hTF_*%$fff?= Projectors^E'IO]E2].-ini:Engine.Engine.ViewportManager ProjectorsJ]True ]Enables Projectors.$(?$=$>$ #=G'h@Z'hTF_*%$fff?] Foliage^E'JO]E2].-ini:Engine.Engine.ViewportManager DecoLayersJ]True ]-,Enables grass and other decorative foliage.$(?$G?$>$ #=G'h@Z'hTF_*%$fff?]Trilinear Filtering^E'KO]E2]-,ini:Engine.Engine.RenderDevice UseTrilinearJ]False ]DBEnable trilinear filtering, recommended for high-performance PCs.$@?$=$>$ #=G'h@Z'hTF_B*$?U>$C<$%>$M?F_B*$?U>$?$9>$M?F_*%$fff?MScreen Flashes^E'NO]E2]10ini:Engine.Engine.ViewportManager ScreenFlashes ]GETurn this option off to disable screen flashes when you take damage.$m,>$L=$>$ #=G'[@F_*%$fff?= Weapon Bob^E'OO]E2] @Internal ]<;Prevent your weapon from bobbing up and down while moving.$>$L=$>$ #=G'[@F_*%$fff?] Reduce Gore^E'PO]E2]-,ini:Engine.Engine.AudioDevice ReverseStereo ]FDTurn this option On to reduce the amount of blood and guts you see.$+>$L=$>$ #=G'[@F_*%$fff?] Dodging^E'QO]E2]-,ini:Engine.Engine.AudioDevice ReverseStereo ]65Turn this option off to disable special dodge moves.$ߣ ?$L=$>$ #=G'[@F_*%$fff?] Auto Aim^E'RO]E2]-,ini:Engine.Engine.AudioDevice ReverseStereo ]RPTurn this option on to have UT2004 help you aim (not available in Multiplayer).$u=1?$L=$>$ #=G'[@F_*%$>] Crosshair^E'TO]E2] @Internal ]Please select your crosshair!$D3?>$Y ?$L>$u=G'[@F_P"""@ "@$kfQ?$>?$eb=$u=F_B*$=?$2?$Q=$>F_*%$fff?]No Console Death Messages^E'WO]E2]87ini:Engine.XGame.xDeathMessage bNoConsoleDeathMessagesJ]False ]10Turn off reporting of death messages in console$2"U?$keB=$5>$ #=G'[@F_F_32F_s class VignetteTest extends TestPageBase; // Very simple testing var UT2SP_LadderLoading Vig; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); Vig=PlayerOwner().Spawn(class'UT2SP_LadderLoading'); if (Vig != None) { Log("Vignette Created"); Vig.Init(); OnDraw = MyOnDraw; SetTimer(60, false); return; } // Failed Controller.CloseMenu(); } event Timer() { Controller.CloseMenu(); } function MyOnClose(optional bool bCancelled) { if (Vig != None) { Log("Destroying the Vignette"); Vig.Destroy(); } } function bool MyOnDraw(Canvas Canvas) { // Log("In My Own Draw"); Vig.DrawVignette(Canvas, 1.0f); return true; } }YO]Av2 ZOA}B // ==================================================================== class UT2VideoChangeOK extends UT2K3GUIPage; var Int Count; var string OrigRes; var localized string RestoreTextPre, RestoreTextPost, RestoreTextSingular; event Timer() { Count--; if (Count>1) GUILabel(Controls[4]).Caption = RestoreTextPre$Count$RestoreTextPost; else GUILabel(Controls[4]).Caption = RestoreTextSingular; if (Count<=0) { SetTimer(0); // Reset resolution here PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice Use16bit"@(InStr(OrigRes,"x16")!=-1)); PlayerOwner().ConsoleCommand("setres"@OrigRes); Controller.CloseMenu(True); } } function Execute(string DesiredRes) { local string res,bit,x,y; local int i; if (DesiredRes=="") return; res = Controller.GetCurrentRes(); bit = PlayerOwner().ConsoleCommand("get ini:Engine.Engine.RenderDevice Use16bit"); if (bit=="true") OrigRes=res$"x16"; else OrigRes=res$"x32"; if(bool(PlayerOwner().ConsoleCommand("ISFULLSCREEN"))) OrigRes=OrigRes$"f"; else OrigRes=OrigRes$"w"; PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice Use16bit"@(InStr(DesiredRes,"x16") != -1)); PlayerOwner().ConsoleCommand("setres"@DesiredRes); i = Instr(DesiredRes,"x"); x = left(DesiredRes,i); y = mid(DesiredRes,i+1); if( (int(x)<640) || (int(y)<480) ) { PlayerOwner().ConsoleCommand("tempsetres 640x480"); SetTimer(0,false); Controller.ReplaceMenu("xinterface.UT2DeferChangeRes"); Controller.GameResolution = Left(DesiredRes,Len(DesiredRes) - 4); } else Controller.GameResolution = ""; } function StartTimer() { Count=15; SetTimer(1.0,true); } function bool InternalOnClick(GUIComponent Sender) { SetTimer(0); if (Sender==Controls[2]) { PlayerOwner().ConsoleCommand("set ini:Engine.Engine.RenderDevice Use16bit"@(InStr(OrigRes,"x16")!=-1)); PlayerOwner().ConsoleCommand("setres"@OrigRes); } GUILabel(Controls[3]).Caption="Accept these settings?"; Controller.CloseMenu(Sender == Controls[2]); return true; } F_l// ==================================================================== // Class: XInterface.UT2StatusMsg // Parent: XInterface.GUIPage // // // ==================================================================== class UT2StatusMsg extends UT2K3GUIPage; var bool bIgnoreEsc; var float ButtonWidth; var float ButtonHeight; var float ButtonHGap; var float ButtonVGap; var float BarHeight; var float BarVPos; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(Mycontroller, MyOwner); PlayerOwner().ClearProgressMessages(); } function bool InternalOnClick(GUIComponent Sender) { if(Sender==Controls[1]) // OK { Controller.CloseMenu(false); // Controller.ReplaceMenu("xinterface.UT2MainMenu"); } return true; } event HandleParameters(string Param1, string Param2) { GUILabel(Controls[2]).Caption = Param1$"|"$Param2; PlayerOwner().ClearProgressMessages(); } F_a// ==================================================================== // Class: XInterface.UT2StatsPrompt // Parent: XInterface.GUIMultiComponent // // // ==================================================================== class UT2StatsPrompt extends UT2K3GUIPage; delegate OnStatsConfigured(); function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(Mycontroller, MyOwner); PlayerOwner().ClearProgressMessages(); } function bool InternalOnClick(GUIComponent Sender) { local UT2SettingsPage SettingsPage; local GUITabControl Tabs; local moCheckBox Check; if(Sender == Controls[1]) { Controller.OpenMenu("XInterface.UT2SettingsPage"); SettingsPage = UT2SettingsPage(Controller.ActivePage); assert(SettingsPage != None); Tabs = GUITabControl(SettingsPage.Controls[1]); Tabs.ActivateTabByName(SettingsPage.NetworkTabLabel,true); Check = moCheckBox(SettingsPage.pNetwork.Controls[5]); if (Check!=None && (!Check.IsChecked()) ) { Check.Checked(true); SettingsPage.pNetwork.Controls[2].SetFocus(none); } } else Controller.CloseMenu(false); return true; } function ReOpen() { if(Len(PlayerOwner().StatsUserName) >= 4 && Len(PlayerOwner().StatsPassword) >= 6) { Controller.CloseMenu(); OnStatsConfigured(); } } F_md// ==================================================================== // Class: XInterface.UT2SP_PlayerTradePage // Parent: XInterface.UT2DraftTeam // // Trade a player, similar to drafting process. // author: capps // Rearranged this so that player can only make a single swap, // and once made, that's it. // ==================================================================== class UT2SP_PlayerTradePage extends UT2DraftTeam; var localized string MessageTitle, MessageTradeConfirm, MessageTradeInfo, MessageTradeCancel, CaptionBack, MessageTradePicHint; var GUIButton butSwap; var string TradingPlayerName; function Created() { super.Created(); butSwap = GUIButton(Controls[17]); } function UpdateDraftable(bool bAffordable) { // replaced with no-op } function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); MyTitleBar.SetCaption(MessageTitle); butSwap.OnClick=ButtonClick; butEnter.bVisible=true; butEnter.bAcceptsInput=true; butClear.Caption=CaptionBack; // get rid of buttons, labels, etc. that aren't needed butLeft.bVisible=false; butLeft.bNeverFocus=true; butLeft.bAcceptsInput=false; butRight.bVisible=false; butRight.bNeverFocus=true; butRight.bAcceptsInput=false; butRelease.bVisible=false; butRelease.bNeverFocus=true; butRelease.bAcceptsInput=false; butDraft.bVisible=false; butDraft.bNeverFocus=true; butDraft.bAcceptsInput=false; lblChoose.bVisible=false; cltPortrait.bLocked=true; cltPortrait.Hint=MessageTradePicHint; cltPortrait.OnChange=MyOnChange; cltMyTeam.bIgnoreBackClick=true; cltMyTeam.bAllowSelectEmpty=false; cltMyTeam.OnChange=MyOnChange; cltMyTeam.Index=0; } // check if they want to trade at all function Initialize(string playername) { local GUIQuestionPage Page; SetPlayer(playername); MyOnChange(cltPortrait); if (Controller.OpenMenu("XInterface.GUIQuestionPage")) { Page = GUIQuestionPage(Controller.ActivePage); Page.SetupQuestion(Page.Replace(MessageTradeInfo, "player", TradingPlayerName), QBTN_CONTINUE, QBTN_CONTINUE); Page.OnButtonClick = BeginConfirm; } } function BeginConfirm(byte bButton) { bPlaySounds=true; PlayerOwner().ClientPlaySound(cltPortrait.GetSound(),,,SLOT_Interface); } function SetPlayer ( string playername ) { local array PlayerList; TradingPlayerName = playername; PlayerList[0] = class'xUtil'.static.FindPlayerRecord(playername); cltPortrait.ResetList(PlayerList, 1); cltPortrait.Index = 0; } function bool ButtonClick(GUIComponent Sender) { local GUIQuestionPage Page; local string askstr; if ( Sender==butSwap ) { // check if they're certain they want this swap if (Controller.OpenMenu("XInterface.GUIQuestionPage")) { Page = GUIQuestionPage(Controller.ActivePage); askstr = Page.Replace(MessageTradeConfirm, "new", TradingPlayerName); askstr = Page.Replace(askstr, "old", cltMyTeam.GetName()); Page.SetupQuestion(askstr, QBTN_YesNo, QBTN_No); Page.OnButtonClick = SwapConfirm; } return true; } else if ( Sender==butEnter || Sender==butClear ) { // check if they're certain they want to leave the trade screen if (Controller.OpenMenu("XInterface.GUIQuestionPage")) { Page = GUIQuestionPage(Controller.ActivePage); Page.SetupQuestion(MessageTradeCancel, QBTN_YesNo, QBTN_No); Page.OnButtonClick = CancelConfirm; } return true; } else { return super.ButtonClick(Sender); } FinishButtonClick(); return true; } // called when button hit on the swap dialog function SwapConfirm(byte bButton) { local GameProfile GP; if (bButton == QBTN_Yes) { GP = PlayerOwner().Level.Game.CurrentGameProfile; Log("SINGLEPLAYER Teammate in spot"@cltMyTeam.Index@"is"@GP.PlayerTeam[cltMyTeam.Index]); GP.PlayerTeam[cltMyTeam.Index] = TradingPlayerName; Log("SINGLEPLAYER Teammate in spot"@cltMyTeam.Index@"is -now-"@GP.PlayerTeam[cltMyTeam.Index]); // inform of the update PlayerOwner().Level.Game.SavePackage(GP.PackageName); UT2SinglePlayerMain(Controller.ActivePage.ParentPage).PassThroughProfileUpdated(); Controller.CloseMenu(); } } // called when the cancel-confirm dialog pops up function CancelConfirm(byte bButton) { if ( bButton == QBTN_Yes ) { Controller.CloseMenu(); } } function MyOnChange(GUIComponent Sender) { local xUtil.PlayerRecord PR; local string str; local GUICharacterList GCL; GCL = GUICharacterList(Sender); PR = GCL.GetRecord(); if ( bPlaySounds ) PlayerOwner().ClientPlaySound(GCL.GetSound(),,,SLOT_Interface); str = Mid(PR.TextName, Max(InStr(PR.TextName, ".")+1, 0)); stbPlayerData.SetContent(Controller.LoadDecoText("xPlayers", str)); BuildStats ( PR, lboStats, lboTeamStats ); } // overrides base function BuildStats ( out xUtil.PlayerRecord PR, GUIListBox charbox, GUIListBox teambox ) { local string str; local GameProfile GP; local xUtil.PlayerRecord PR2; GP = PlayerOwner().Level.Game.CurrentGameProfile; charbox.List.Clear(); str = PR.DefaultName; charbox.List.Add(str); str = class'xUtil'.static.GetFavoriteWeaponFor(PR); charbox.List.Add(str); str = class'xUtil'.Default.AccuracyString@class'xUtil'.static.AccuracyRating(PR); charbox.List.Add(str); str = class'xUtil'.Default.AggressivenessString@class'xUtil'.static.AggressivenessRating(PR); charbox.List.Add(str); str = class'xUtil'.Default.AgilityString@class'xUtil'.static.AgilityRating(PR); charbox.List.Add(str); str = class'xUtil'.Default.TacticsString@class'xUtil'.static.TacticsRating(PR); charbox.List.Add(str); // was team stats, include trade guy's stats instead teambox.List.Clear(); PR2 = cltPortrait.GetRecord(); str = PR2.DefaultName@StatsMessage; teambox.List.Add(str); str = class'xUtil'.static.GetFavoriteWeaponFor(PR2); teambox.List.Add(str); str = class'xUtil'.Default.AccuracyString@class'xUtil'.static.AccuracyRating(PR2); teambox.List.Add(str); str = class'xUtil'.Default.AggressivenessString@class'xUtil'.static.AggressivenessRating(PR2); teambox.List.Add(str); str = class'xUtil'.Default.AgilityString@class'xUtil'.static.AgilityRating(PR2); teambox.List.Add(str); str = class'xUtil'.Default.TacticsString@class'xUtil'.static.TacticsRating(PR2); teambox.List.Add(str); } F_wmclass UT2SP_LadderLoading extends UT2LoadingPageBase; #exec OBJ LOAD FILE=InterfaceContent.utx var UT2003GameProfile GameProf; var MatchInfo myMatchInfo; var UnrealTeamInfo EnemyTeamInfo; var Color White, Yellow, Blue, Red; var Material Box, CharFrame; var array PlayerList; var localized string StatNames[5]; var localized string LoadingMessage; // initialize data structures, then call each of the render functions in turn simulated event init() { local class UTIclass; GameProf = UT2003GameProfile(Level.Game.CurrentGameProfile); AddBackground(); // Background is the Map Faded FullScreen Shot. if ( GameProf == None || GameProf.bInLadderGame == false ) { Log("UT2SP_LadderLoading::init() could not find GameProfile or not in a ladder game."); AddLoading(); // adds loading screen return; } myMatchInfo = GameProf.GetMatchInfo(GameProf.CurrentLadder, GameProf.CurrentMenuRung); if ( myMatchInfo == None ) { Log("UT2SP_LadderLoading::init() could not find MatchInfo."); AddLoading(); // adds loading screen return; } UTIclass = class(DynamicLoadObject(myMatchInfo.EnemyTeamName,class'Class')); EnemyTeamInfo = spawn(UTIClass); if ( EnemyTeamInfo == None ) { Log("UT2SP_LadderLoading::init() could not find Enemy UnrealTeamInfo data."); AddLoading(); // adds loading screen return; } // PreLoad the Player List so we can access Player Portraits class'xUtil'.static.GetPlayerList(PlayerList); AddTitle(); // Title would be the Ladder type (or GameType). AddPlayerRoster(); AddOpponentRoster(); AddTeamCompare(); } simulated function AddLoading() { AddJustifiedText(LoadingMessage, 1, 0.0, 0.0, 1.0, 1.0).FontName = "XInterface.UT2LargeFont"; } // Todo: Get Background Texture from GameProfile ? simulated function AddBackground() { local Material Tex; Tex = DLOTexture("InterfaceContent.Backgrounds.bg10"); // Fallback texture .. should we choose another one ? if (Tex == None) Tex = DLOTexture("InterfaceContent.Backgrounds.bg11"); if (Tex != None) AddImage(Tex, 0.0, 0.0, 1.0, 1.0).DrawColor=Class'Canvas'.static.MakeColor(128,128,192); } simulated function AddTitle() { local string Title; local class GIClass; GIClass = class(DynamicLoadObject(myMatchInfo.GameType, class'Class')); Title = LoadingMessage@GIClass.default.GameName; AddJustifiedText(Title, 1, 0.0, 0.0, 0.075, 1.0).FontName = "XInterface.UT2LargeFont"; } simulated function AddPlayerRoster() { local int i, numplayers; local array Players; Players[0] = GameProf.PlayerCharacter; numplayers = myMatchInfo.NumBots / 2; // purposeful integer truncate on odd number of bots for (i = 0; i Players; numplayers = myMatchInfo.NumBots /2; if ( myMatchInfo.NumBots % 2 == 1 ) { numplayers++; // bot team get the extra player } for (i = 0; i Crew, float top, Color TeamColor, optional bool bNameUp) { local Material TSym, Portrait; local float ILeft, ISpace, ImgW, ImgH, IconBoxW, IconBoxH, IconBox2Left; local int i; //local DrawOpImage Opi; // Part 1: Get The Team Symbol TSym = DLOTexture(TeamIconName); // Precompute a couple of sizes ImgW = 0.075; ImgH = 0.2; ISpace = 0.03 + (7-Crew.Length) * 0.01; IconBoxW = ImgW * 2; IconBoxH = ImgH; IconBox2Left = 0.98 - IconBoxW; // Figure out where we will start adding them ILeft = (1.0 - (Crew.Length * (ImgW + ISpace) - ISpace)) / 2.0; TeamColor.A = 70; // Add Team Logos, only if not straight deathmatch if (myMatchInfo.GameType != "xGame.xDeathmatch") { if (TeamId == 0) AddImage(TSym, top, 0.02, IconBoxH * 2, IconBoxW * 2).DrawColor = TeamColor; else AddImage(TSym, top - IconBoxH, IconBox2Left - IconBoxW, IconBoxH * 2, IconBoxW * 2).DrawColor = TeamColor; } TeamColor.A = 255; // Add Crew Portraits for (i=0; i Team1Stat, Team2Stat; local string TxtFont, tmp; local float TopLine, LineSpc; local int i; local DrawOpText Op; Team1Stat[0] = class'xUtil'.static.TeamAccuracyRating(GameProf); Team1Stat[1] = class'xUtil'.static.TeamAggressivenessRating(GameProf); Team1Stat[2] = class'xUtil'.static.TeamAgilityRating(GameProf); Team1Stat[3] = class'xUtil'.static.TeamTacticsRating(GameProf); Team2Stat[0] = class'xUtil'.static.TeamInfoAccuracyRating(EnemyTeamInfo); Team2Stat[1] = class'xUtil'.static.TeamInfoAggressivenessRating(EnemyTeamInfo); Team2Stat[2] = class'xUtil'.static.TeamInfoAgilityRating(EnemyTeamInfo); Team2Stat[3] = class'xUtil'.static.TeamInfoTacticsRating(EnemyTeamInfo); TopLine = 0.34; LineSpc = 0.425/6; TxtFont = "XInterface.UT2HeaderFont"; Op = AddJustifiedText(StatNames[0], 1, TopLine, 0, LineSpc, 1.0); Op.FontName = "XInterface.UT2HeaderFont"; Op.DrawColor = Yellow; Op = AddJustifiedText(GameProf.TeamName, 1, TopLine, 0.05, LineSpc, 0.40); Op.FontName = "Xinterface.UT2HeaderFont"; Op.DrawColor = Blue; Op = AddJustifiedText(EnemyTeamInfo.TeamName, 1, TopLine, 0.55, LineSpc, 0.40); Op.FontName = "Xinterface.UT2HeaderFont"; Op.DrawColor = Red; for (i = 1; i<5; i++) { TopLine += LineSpc; AddJustifiedText(StatNames[i], 1, TopLine, 0, LineSpc, 1.0).FontName = "XInterface.UT2HeaderFont"; // Centered tmp = string(Team1Stat[i-1]); tmp = tmp$"%"; Op = AddJustifiedText(tmp, 1, TopLine, 0.10, LineSpc, 0.30); Op.FontName = "Xinterface.UT2HeaderFont"; if (Team1Stat[i-1] >= Team2Stat[i-1]) Op.DrawColor = Yellow; tmp = string(Team2Stat[i-1]); tmp = tmp$"%"; Op = AddJustifiedText(tmp, 1, TopLine, 0.6, LineSpc, 0.30); Op.FontName = "Xinterface.UT2HeaderFont"; if (Team2Stat[i-1] >= Team1Stat[i-1]) Op.DrawColor = Yellow; } } simulated function xUtil.PlayerRecord FindPlayerInPlayerList(string playername) { local xUtil.PlayerRecord retval; local int i; for ( i=0; i< PlayerList.length; i++ ) { if ( PlayerList[i].DefaultName == playername ) { return PlayerList[i]; } } return retval; } F_zclass UT2SP_LadderEventPage extends UT2K3GUIPage; var GUILabel lblTitle, lblCaption; var GUIImage gImage; var GUIButton btnOK, btnMap; var string TutorialName; function InitComponent(GUIController pMyController, GUIComponent MyOwner) { Super.Initcomponent(pMyController, MyOwner); lblTitle=GUILabel(Controls[0]); lblCaption=GUILabel(Controls[1]); btnOK=GUIButton(Controls[3]); gImage=GUIImage(Controls[2]); gImage.Image = Material(DynamicLoadObject("Laddershots.TeamDMShot", class'Material')); btnMap=GUIButton(Controls[5]); btnOK.OnClick=InternalOnClick; btnMap.OnClick=InternalOnClick; } function bool InternalOnClick(GUIComponent Sender) { if (Sender==btnOK) { return Controller.CloseMenu(); } else if (Sender==btnMap) { PlayerOwner().Level.Game.CurrentGameProfile.bInLadderGame=true; // so that it'll reload into SP menus PlayerOwner().Level.Game.SavePackage(PlayerOwner().Level.Game.CurrentGameProfile.PackageName); PlayerOwner().ConsoleCommand ("START"@TutorialName$".ut2?quickstart=true?TeamScreen=false?savegame="$PlayerOwner().Level.Game.CurrentGameProfile.PackageName); Controller.CloseAll(false); return true; } return false; } function SetTutorialName(string tutname) { TutorialName = tutname; if ( tutname == "" ) { btnMap.bVisible=false; btnMap.bAcceptsInput=false; } else { btnMap.bVisible=true; btnMap.bAcceptsInput=true; BtnOK.WinLeft=0.2; } } F_M // front-end for the drafting page, to explain what the heck is going on class UT2SP_DraftEventPage extends UT2SP_LadderEventPage; var localized string MessageDraft, MessageDraftTitle; function InitComponent(GUIController pMyController, GUIComponent MyOwner) { Super.Initcomponent(pMyController, MyOwner); lblCaption.Caption = MessageDraft; lblTitle.Caption = MessageDraftTitle; } function bool InternalOnClick(GUIComponent Sender) { if (Sender==btnOK) { return Controller.ReplaceMenu("xInterface.UT2DraftTeam"); } else return super.InternalOnClick(Sender); } function SetTutorialName(string tutname) { } [aOi@o2 bO2|[-EZ ߢ(a ߢ(a N} mLYou have proven your valor in the qualification round,|and won the right to form your own team for the tournament.|Draft your team from the available free agents,|then enter the ladders of the team tournament--|but only after you have proven that you are fit to lead.| ]Welcome to the TournamentF_F_.class UT2SmallHeaderFont extends GUIFont; B*$I?$wH<$u?$>F_*%$fff?]Auto-Adjust Skill^E'eO]E ]<;When enabled, bots will adjust their skill to match yours.$9[?$>$>$>F_B*$!=$wH<$l=>$"?F_*%$fff?] Auto AimD]xinterface.GUICheckBoxButton^E'gO]E ]VTEnabling this option will activate computer-assisted aiming in single player games.$k=$ y=$>$ #=XSF_*%$fff?= Auto SlopeD]xinterface.GUICheckBoxButton^E'hO]E ]LJWhen enabled, your view will automatically pitch up/down when on a slope.$v64>$y=$>$ #=F_*%$fff?] Invert MouseD]xinterface.GUICheckBoxButton^E'iO]E ]:9When enabled, the Y axis of your mouse will be inverted.$Ӥ>$ y=$>$ #=F_*%$fff?]Mouse SmoothingD]xinterface.GUICheckBoxButton^E'jO]E ]JHEnable this option to automatically smooth out movements in your mouse.$S>$ y=$>$ #=F_*%$fff?]Enable JoystickD]xinterface.GUICheckBoxButton^E'kO]E ]0/Enable this option to enable joystick support.$&?$ y=$>$ #=F_]Mouse Sensitivity (In Game)+L*$'>$? ?$73>$BXSF_]Mouse Sensitivity (Menus)+L*$ݧ>$ ?$>$BXSF_B*$\B?$wH<$u?$v>F_*%$fff?MWeapon EffectsD]xinterface.GUICheckBoxButton^E'qO]E ]76Turn this option On/Off to feel the weapons you fire.$Z?$=$>$ #=F_*%$fff?MPickup EffectsD]xinterface.GUICheckBoxButton^E'rO]E ]87Turn this option On/Off to feel the items you pick up.$n?$=$>$ #=F_*%$fff?MDamage EffectsD]xinterface.GUICheckBoxButton^E'sO]E ]65Turn this option On/Off to feel the damage you take.$Z?$Y?$>$ #=F_*%$fff?] GUI EffectsD]xinterface.GUICheckBoxButton^E'tO]E ]*)Turn this option On/Off to feel the GUI.$n?$Y?$>$ #=F_]TouchSense Force Feedback+L*$yF?$<$t?$BF_B*$d<<$H<$.=>$ {z?F_B*$/2?$${<$>$G>F_*%$l?]Dedicated Server^E'xO]E ]?>When this option is enabled, you will run a dedicated server.$u=$4f=$>$ #=F_*%$l?] Lan Game^E'yO]E ]>=Optimizes network usage for players on a local area network.$Y=$4f=$>$ #=F_*%$l?]Advertise Server^E'zO]E ]76Publishes your server to the internet server browser.$*q=>$4f=$>$ #=F_*%$l?]Collect Player Stats^E'{O]E ]GEPublishes player stats from your server on the UT2004 stats website.$*q}>$4f=$>$ #=F_*%$l?]Balance Teams^E'|O]E ]=$4f=$>$ #=F_] Bot Skill^E'}O]E ]54Choose the skill of the bots you wish to play with.$@ ?$&=$>$u=F_*%$l?]Use Map Defaults^E'~O]E ]:9Uses the map's default minimum/maximum players settings.$K\?$&=$>$ #=Q'X[ F_*%$l?]Use Custom Bots^E'O]E ]ECWhen enabled, you may use the Bot tab to choose bots to play with.$K\7?$&=$>$ #=Q'X\ F_Y"j"@*%$333?]Min player count^E'@P]E ]GEBots will join the game if there are fewer players than the minimum.$E?$=$33>$u=F_Y"j"@*%$333?]Max player count^E'AP]E ]CALimits the number of players allowed to join the server at once.$W?$=$33>$u=F_Y"j"@*%$333?]Max spectator count^E'BP]E ]FDLimits the number of spectators allowed to join the server at once.$Vfj?$=$33>$u=F_%$>] Server Name^E'CP]E ]:9The server name will be displayed in the server browser.$ y=$>$u=F_%$>]Game Password^E'DP]E ];:Players must enter the game password to join your server.$U=$>$u=F_%$>= Admin Name^E'EP]E ]98The admin name will be displayed in the server browser.$^>$>$u=F_%$>] Admin Email^E'FP]E ]CAThe admin email address will be displayed in the server browser.$>$>$u=F_%$>MAdmin Password^E'GP]E ]CAThe admin password is used to connect to the server as an admin.$%>$>$u=F_%$>]MOTD 1^E'HP]E ]?>Players see the message of the day when they join the server.$s>$>$u=F_%$>]MOTD 2^E'IP]E ]?>Players see the message of the day when they join the server.$m?$>$u=F_%$>]MOTD 3^E'JP]E ]?>Players see the message of the day when they join the server.$6&?$>$u=F_%$>]MOTD 4^E'KP]E ]?>Players see the message of the day when they join the server.$AD:?$>$u=F_*] Web Admin^E'LP]E ],+Enables remote administration via the web.$A^?$>$33S>$ #=F_Y"*%$ff&?MWeb Admin Port^E'MP]E ]10The port used to connect to the web admin site.$C\?$,?$Nb>$u=F_B*$ݵ>$^>$?$&>F_c*%$>= Connection^E'OP]E2] @InternalJ]Cable Modem/DSL ]How fast is your connection?$w=$>$u=G'h@F_%$>MStats UserName^E'PP]E2] @Internal ]+*Please select a name to use for UT Stats!$>$>$u=G'h@F_%$>MStats Password^E'QP]E2] @Internal ]:9Please select a password that will secure your UT Stats!$kf?$>$u=G'h@F_]UT2003 Global Stats+L*4]UT2HeaderFont$(D>$>$?$BF_*%$fff?] Track Stats^E'SP]E2] @InternalJ]True ]76Enable this option to join the online ranking system.$">?$!̀>$= W>$ #=G'h@F_= View Stats ]'&Click to launch the UT stats website.$">?$f ?$= W>$'ha f'TP_F_]UYour stats username or password is invalid. Your username must be at least 4 characters long, and your password must be at least 6 characters long.+L*S$^?$\>$?$C>F_""" "$L=$=$>$>F_$;=$K\=$>$r>F_+= TextButton$33>$L=$>$=F_] NoBackground$e=$L=$>$>f$WY)f'YP_F_""" "$?$=$>$>F_$>$K\=$">$㥛>F_+= TextButton$L?$L=$>$=F_] NoBackground$>$L=$>$z>f$WY)f']P_F_""" "$L=$?$>$>F_$;=$?$">$㥛>F_+= TextButton$33>$ ?$>$=F_] NoBackground$ =$ ?$>$>f$WY)f'aP_F_""" "$?$?$>$>F_$>$?$">$㥛>F_+= TextButton$L?$ ?$>$=F_] NoBackground$>$ ?$>$z>f$WY)f'eP_F_c%$>= Resolution^E'fP]E2] @INTERNALJ] 640x480 ]87Select the video resolution at which you wish to play.$O"B=$z=$>$L=G'e@Z'eTF_%$>] Color Depth^E'gP]E2] @InternalJ]false ]=