//============================================================================== // Created on: 12/11/2003 // Description // // Written by Ron Prestenback // © 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class UT2K4Tab_MutatorBase extends UT2K4GameTabBase; var config string LastActiveMutators; var automated GUISectionBackground sb_Avail, sb_Active, sb_Description; var automated GUIListBox lb_Avail, lb_Active; var automated GUIScrollTextBox lb_MutDesc; var automated GUIButton b_Config, b_Add,b_AddAll,b_Remove,b_RemoveAll; //var automated GUILabel l_AvailTitle,l_ActiveTitle; //var automated GUIImage i_Shadow, i_Shadow2, i_Shadow3; var CacheManager.GameRecord CurrentGame; var array MutatorList; var string MutConfigMenu; var localized string GroupConflictText, ThisText, TheseText, ContextItems[3]; var bool bIsMultiplayer; //are we setting up mutators for a multiplayer game? delegate OnChangeMutators( string ActiveMutatorString ); function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); // Setup the lists if (lb_Avail.List != None) { lb_Avail.List.OnDragDrop = RemoveMutatorDrop; lb_Avail.List.bInitializeList = False; lb_Avail.List.bDropSource = True; lb_Avail.List.bDropTarget = True; } if (lb_Active.List != None) { lb_Active.List.OnDragDrop = AddMutatorDrop; lb_Active.List.bInitializeList = False; lb_Active.List.bDropSource = True; lb_Active.List.bDropTarget = True; } // Setup the listbox context menus if ( lb_Avail.ContextMenu != None ) { lb_Avail.ContextMenu.OnSelect = ContextClick; lb_Avail.ContextMenu.OnOpen = lb_Avail.MyOpen; lb_Avail.ContextMenu.OnClose = lb_Avail.MyClose; } if ( lb_Active.ContextMenu != None ) { lb_Active.ContextMenu.OnSelect = ContextClick; lb_Active.ContextMenu.OnOpen = lb_Active.MyOpen; lb_Active.ContextMenu.OnClose = lb_Active.MyClose; } lb_Avail.List.OnDblClick=AvailDblClick; lb_Active.List.OnDblClick=SelectedDblClick; // Setup the listbox notification for disabling buttons lb_Avail.List.CheckLinkedObjects = InternalCheckObj; lb_Avail.List.AddLinkObject( b_Add, True ); lb_Active.List.CheckLinkedObjects = InternalCheckObj; lb_Active.List.AddLinkObject( b_Remove, True ); // Setup initial button states manually lb_Active.List.DisableLinkedObjects(); lb_Avail.List.DisableLinkedObjects(); InternalCheckObj(None); sb_Avail.ManageComponent(lb_Avail); sb_Active.ManageComponent(lb_Active); sb_Description.ManageComponent(lb_MutDesc); } function ShowPanel( bool bShow ) { local string s; Super.ShowPanel(bShow); if ( bShow && bInit ) bInit = False; if ( !bShow && !bInit ) { s = BuildActiveMutatorString(); if ( s != LastActiveMutators ) { LastActiveMutators = s; OnChangeMutators( LastActiveMutators ); SaveConfig(); } } } // Called when a new gametype has been selected - remove any mutators which affect physics if // this gametype doesn't allow them function SetCurrentGame( CacheManager.GameRecord CurrentGame ) { local int i; local string m, t; local class GameClass; if ( MutatorList.Length > 0 ) m = BuildActiveMutatorString(); else m = LastActiveMutators; class'CacheManager'.static.GetMutatorList(MutatorList); GameClass = class(DynamicLoadObject(CurrentGame.ClassName, class'Class')); if ( GameClass != None ) { for ( i = MutatorList.Length - 1; i >= 0; i-- ) if ( !GameClass.static.AllowMutator(MutatorList[i].ClassName) ) MutatorList.Remove(i,1); } // Disable the list's OnChange() delegate lb_Active.List.bNotify = False; lb_Avail.List.bNotify = False; lb_Active.List.Clear(); lb_Avail.List.Clear(); for (i=0;i 0 && Controller.bCurMenuInitialized ) lb_MutDesc.SetContent(GUIList(List).GetExtra()); } else List.DisableLinkedObjects(); } if ( lb_Active.List.ItemCount > 0 ) { EnableComponent(b_Config); EnableComponent(b_RemoveAll); } else { DisableComponent(b_Config); DisableComponent(b_RemoveAll); } if ( lb_Avail.List.ItemCount > 0 ) EnableComponent(b_AddAll); else DisableComponent(b_AddAll); } // Play is called when the play button is pressed. It saves any relevant data and then // returns any additions to the URL function string Play() { local string URL; local bool b; if ( !class'LevelInfo'.static.IsDemoBuild() ) { URL = BuildActiveMutatorString(); b = URL != LastActiveMutators || URL != default.LastActiveMutators; if ( URL != "") { LastActiveMutators = URL; URL = "?Mutator=" $ URL; } else LastActiveMutators=""; if ( b ) SaveConfig(); } return url; } // Builds a comma-delimited string consisting of the selected mutators function string BuildActiveMutatorString() { local string Str, Result; local int i; for ( i = 0; i < lb_Active.List.ItemCount; i++ ) { Str = ResolveMutator(lb_Active.List.GetItemAtIndex(i)); if ( Str != "" ) { if ( Result != "" ) Result $= ","; Result $= Str; } } return Result; } // Finds the classname for a mutator based on its friendly name function string ResolveMutator(string FriendlyName) { local int i; for (i=0;i MutClassNames; local int i; MutClassNames.Length = lb_Active.List.ItemCount; for (i = 0; i < lb_Active.List.ItemCount; i++) MutClassNames[i] = ResolveMutator(lb_Active.List.GetItemAtIndex(i)); if (Controller.OpenMenu(MutConfigMenu)) { MutatorConfigMenu(Controller.ActivePage).ActiveMuts = MutClassNames; MutatorConfigMenu(Controller.ActivePage).bIsMultiplayer = bIsMultiplayer; MutatorConfigMenu(Controller.ActivePage).Initialize(); } return true; } function ListChange(GUIComponent Sender) { if (Sender == lb_Avail) { lb_Active.List.SilentSetIndex(-1); InternalCheckObj(lb_Active.List); } else if (Sender == lb_Active) { lb_Avail.List.SilentSetIndex(-1); InternalCheckObj(lb_Avail.List); } else lb_MutDesc.SetContent(""); } // Called each time a mutator is added - ensures that only one mutator from each group is active function bool AddingGroup(string Group) { local int i; local GUIListElem Element; local bool bConflict; if (Group == "") return false; for ( i = lb_Active.List.ItemCount - 1; i >= 0; i-- ) { if ( GetGroupFor(lb_Active.List.GetItemAtIndex(i)) ~= Group) { lb_Active.List.GetAtIndex( i, Element.item, Element.ExtraData, Element.ExtraStrData ); lb_Avail.List.AddElement(Element); lb_Active.List.RemoveSilent( i, 1); SetFooterCaption(GroupConflictText, 2.0); bConflict = True; } } return bConflict; } function string GetGroupFor(string FriendlyName) { local int i; for (i=0;i PendingElements; local array Groups; if ( !lb_Avail.List.IsValid() ) return true; PendingElements = lb_Avail.List.GetPendingElements(True); lb_Avail.List.bNotify = False; for ( i = PendingElements.Length - 1; i >= 0 ; i-- ) { gName = GetGroupFor(PendingElements[i].Item); // Remove any elements from the pending list that are in the same group - the first one of the group stays for ( j = 0; j < Groups.Length; j++ ) { if ( Groups[j] ~= gName ) { PendingElements.Remove(i, 1); break; } } if ( j == Groups.Length ) Groups[j] = gName; lb_Avail.List.RemoveElement(PendingElements[i],, True); AddingGroup(gName); lb_Active.List.AddElement( PendingElements[i] ); } lb_Avail.List.bNotify = True; lb_Avail.List.ClearPendingElements(); lb_Avail.List.SetIndex(lb_Avail.List.Index); // to check if button states should change if ( lb_Avail.List.bSorted ) lb_Avail.List.Sort(); return true; } function bool AddMutatorDrop(GUIComponent Sender) { local array PendingElements; local array Groups; local string gName; local int i, j; if ( Controller == None || Controller.DropSource != lb_Avail.List ) return false; if ( !lb_Avail.List.IsValid() ) return true; PendingElements = lb_Avail.List.GetPendingElements(); for ( i = PendingElements.Length - 1; i >= 0 ; i-- ) { gName = GetGroupFor(PendingElements[i].Item); // Remove any elements from the pending list that are in the same group - the first one of the group stays for ( j = 0; j < Groups.Length; j++ ) { if ( Groups[j] ~= gName ) { RemovePendingMutator(PendingElements[i]); PendingElements.Remove(i, 1); break; } } if ( j == Groups.Length ) Groups[j] = gName; AddingGroup(gName); } return lb_Active.List.InternalOnDragDrop(Sender); } function bool RemoveMutatorDrop( GUIComponent Sender ) { if ( Controller == None || Controller.DropSource != lb_Active.List ) return false; return lb_Avail.List.InternalOnDragDrop(Sender); } function RemovePendingMutator( GUIListElem Elem, optional GUIList List ) { local int i, Index; if ( List == None ) List = lb_Avail.List; Index = List.FindIndex(Elem.item); if ( Index == -1 ) { log("RemovePendingMutator() not executed. Item not found in available list:"$Elem.Item@Elem.ExtraStrData); return; } for (i = 0; i < List.SelectedItems.Length; i++) { if (List.SelectedItems[i] == Index) { List.SelectedItems.Remove(i,1); break; } } for ( i = 0; i < List.SelectedElements.Length; i++ ) { if ( List.SelectedElements[i] == Elem ) { List.SelectedElements.Remove(i, 1); return; } } } function bool RemoveMutator(GUIComponent Sender) { local int i; local array PendingElements; if ( !lb_Active.List.IsValid() ) return true; PendingElements = lb_Active.List.GetPendingElements(True); lb_Active.List.bNotify = False; for ( i = 0; i < PendingElements.Length; i++ ) { lb_Active.List.RemoveElement(PendingElements[i],, True); lb_Avail.List.AddElement(PendingElements[i]); } lb_Active.List.bNotify = True; lb_Active.List.ClearPendingElements(); return true; } function bool AddAllMutators(GUIComponent Sender) { local int i; local array Elem; Elem = lb_Avail.List.Elements; lb_Avail.List.Clear(); for ( i = 0; i < Elem.Length; i++ ) { AddingGroup(GetGroupFor(Elem[i].Item)); lb_Active.List.AddElement(Elem[i]); } return true; } function bool RemoveAllMutators(GUIComponent Sender) { lb_Avail.List.LoadFrom(lb_Active.List,false); lb_Active.List.Clear(); return true; } function ContextClick(GUIContextMenu Sender, int Index) { local array MutClassNames, MutNames; local int i; if ( Sender == lb_Avail.ContextMenu ) { if ( Index == 1 ) { MutNames = lb_Avail.List.GetPendingItems(True); for (i = 0; i < MutNames.Length; i++) MutClassNames[i] = ResolveMutator(MutNames[i]); if (Controller.OpenMenu(MutConfigMenu)) { MutatorConfigMenu(Controller.ActivePage).ActiveMuts = MutClassNames; MutatorConfigMenu(Controller.ActivePage).Initialize(); } } else if (Index == 0) AddMutator(None); } else if ( Sender == lb_Active.ContextMenu ) { if ( Index == 1 ) { MutNames = lb_Active.List.GetPendingItems(True); for (i = 0; i < MutNames.Length; i++) MutClassNames[i] = ResolveMutator(MutNames[i]); if (Controller.OpenMenu(MutConfigMenu)) { MutatorConfigMenu(Controller.ActivePage).ActiveMuts = MutClassNames; MutatorConfigMenu(Controller.ActivePage).Initialize(); } } else if ( Index == 0 ) RemoveMutator(None); } } function bool ContextMenuOpen(GUIComponent Sender, GUIContextMenu Menu, GUIComponent InMenuOwner) { local array Items; if ( GUIListBox(InMenuOwner) != None && GUIList(Sender) != None ) { Items = GUIList(Sender).GetPendingItems(True); if ( Items.Length == 1 ) { if ( InMenuOwner == lb_Avail ) Menu.ContextItems[0] = Repl(ContextItems[0], "%text%", ThisText); else Menu.ContextItems[0] = Repl(ContextItems[1], "%text%", ThisText); Menu.ContextItems[1] = Repl(ContextItems[2], "%text%", ThisText); } else { if ( InMenuOwner == lb_Avail ) Menu.ContextItems[0] = Repl(ContextItems[0], "%text%", TheseText); else Menu.ContextItems[0] = Repl(ContextItems[1], "%text%", TheseText); Menu.ContextItems[1] = Repl(ContextItems[2], "%text%", TheseText); } return true; } return false; } defaultproperties { Begin Object Class=GUIContextMenu Name=RCMenu End Object ContextItems(0)="Add %text%" ContextItems(1)="Remove %text%" ContextItems(2)="Configure %text%" MutConfigMenu="GUI2K4.MutatorConfigMenu" ThisText="This Mutator" TheseText="These Mutators" GroupConflictText="Unable to add multiple mutators from the same mutator group!" Begin Object Class=GUISectionBackground Name=AvailBackground WinWidth=0.380859 WinHeight=0.547697 WinLeft=0.025156 WinTop=0.036614 Caption="Available Mutators" LeftPadding=0.0025 RightPadding=0.0025 TopPadding=0.0025 BottomPadding=0.0025 End Object sb_Avail=AvailBackground Begin Object Class=GUISectionBackground Name=ActiveBackground WinWidth=0.380859 WinHeight=0.547697 WinLeft=0.586876 WinTop=0.036614 Caption="Active Mutators" LeftPadding=0.0025 RightPadding=0.0025 TopPadding=0.0025 BottomPadding=0.0025 End Object sb_Active=ActiveBackground Begin Object Class=GUISectionBackground Name=DescriptionBackground WinWidth=0.942969 WinHeight=0.291796 WinLeft=0.025976 WinTop=0.610678 Caption="Mutator Details" LeftPadding=0.0025 RightPadding=0.0025 TopPadding=0.0025 BottomPadding=0.0025 End Object sb_Description=DescriptionBackground Begin Object Class=GUIListBox Name=IAMutatorAvailList WinWidth=0.378955 WinHeight=0.501446 WinLeft=0.026108 WinTop=0.144937 bVisibleWhenEmpty=true OnChange=ListChange bSorted=True Hint="These are the available mutators." TabOrder=0 ContextMenu=RCMenu HandleContextMenuOpen=ContextMenuOpen StyleName="NoBackground" End Object lb_Avail=IAMutatorAvailList Begin Object Class=GUIListBox Name=IAMutatorSelectedList WinWidth=0.378955 WinLeft=0.584376 WinHeight=0.501446 WinTop=0.144937 bVisibleWhenEmpty=true OnChange=ListChange bSorted=True Hint="These are the current selected mutators." TabOrder=5 ContextMenu=RCMenu StyleName="NoBackground" End Object lb_Active=IAMutatorSelectedList Begin Object Class=GUIScrollTextBox Name=IAMutatorScroll WinWidth=0.938254 WinHeight=0.244296 WinLeft=0.028333 WinTop=0.648595 CharDelay=0.0025 EOLDelay=0.5 bNeverFocus=true StyleName="NoBackground" bTabStop=False bVisibleWhenEmpty=True End Object lb_MutDesc=IAMutatorScroll Begin Object Class=GUIButton Name=IAMutatorConfig Caption="Configure Mutators" Hint="Configure the selected mutators" WinWidth=0.239063 WinHeight=0.054648 WinLeft=0.729492 WinTop=0.933490 bVisible=false OnClick=MutConfigClick TabOrder=6 End Object b_Config=IAMutatorConfig Begin Object Class=GUIButton Name=IAMutatorAdd Caption="Add" Hint="Adds the selection to the list of mutators to play with." WinWidth=0.145000 WinHeight=0.050000 WinLeft=0.425 WinTop=0.194114 OnClickSound=CS_Up OnClick=AddMutator TabOrder=1 End Object b_Add=IAMutatorAdd Begin Object Class=GUIButton Name=IAMutatorRemove Caption="Remove" Hint="Removes the selection from the list of mutators to play with." WinWidth=0.145000 WinHeight=0.050000 WinLeft=0.425 WinTop=0.424322 OnClickSound=CS_Down OnClick=RemoveMutator TabOrder=4 End Object b_Remove=IAMutatorRemove Begin Object Class=GUIButton Name=IAMutatorAll Caption="Add All" Hint="Adds all mutators to the list of mutators to play with." WinWidth=0.145000 WinHeight=0.050000 WinLeft=0.425 WinTop=0.259218 OnClickSound=CS_Up OnClick=AddAllMutators TabOrder=2 End Object b_AddAll=IAMutatorAll Begin Object Class=GUIButton Name=IAMutatorClear Caption="Remove All" Hint="Removes all mutators from the list of mutators to play with." WinWidth=0.145000 WinHeight=0.050000 WinLeft=0.425 WinTop=0.360259 OnClick=RemoveAllMutators OnClickSound=CS_Down TabOrder=3 End Object b_RemoveAll=IAMutatorClear WinTop=0.15 WinLeft=0 WinWidth=1 WinHeight=0.77 bAcceptsInput=false }