662 lines
18 KiB
Ucode
662 lines
18 KiB
Ucode
//==============================================================================
|
|
// Created on: 12/11/2003
|
|
// Description
|
|
//
|
|
// Written by Ron Prestenback
|
|
// © 2003, Epic Games, Inc. All Rights Reserved
|
|
//==============================================================================
|
|
|
|
class UT2K4Tab_BotConfigBase extends UT2K4GameTabBase;
|
|
|
|
var automated GUISectionBackground sb_Bots, sb_Red, sb_Blue;
|
|
var automated AltSectionBackground sb_PBK;
|
|
var automated GUICharacterList li_Bots;
|
|
var automated GUIImage i_Portrait;
|
|
|
|
var automated GUIVertImageListBox lb_Red, lb_Blue;
|
|
var() noexport editconst GUIVertImageList li_Red, li_Blue;
|
|
|
|
var automated GUIButton b_AddR, b_RemoveR, b_AddB, b_RemoveB,
|
|
b_Config, b_Left, b_Right, b_DoConfig;
|
|
|
|
var() bool bIgnoreListChange, bTeamGame, bPlaySounds;
|
|
var() config bool bAllowDuplicates;
|
|
var() localized string DMCaption, RedCaption;
|
|
|
|
function InitComponent(GUIController MyController, GUIComponent MyOwner)
|
|
{
|
|
Super.Initcomponent(MyController, MyOwner);
|
|
|
|
li_Red = lb_Red.List;
|
|
li_Red.bDropSource = True;
|
|
li_Red.bDropTarget = True;
|
|
li_Red.OnDragDrop = InternalOnDragDrop;
|
|
li_Red.OnBeginDrag = InternalOnBeginDrag;
|
|
li_Red.OnEndDrag = InternalOnEndDrag;
|
|
// li_Red.HandleMouseOver = InternalMouseOver;
|
|
// li_Red.AddLinkObject(b_RemoveR);
|
|
li_Red.AddLinkObject(b_Config);
|
|
li_Red.AddLinkObject(b_DoConfig);
|
|
|
|
li_Blue = lb_Blue.List;
|
|
li_Blue.bDropSource = True;
|
|
li_Blue.bDropTarget = True;
|
|
li_Blue.OnDragDrop = InternalOnDragDrop;
|
|
li_Blue.OnBeginDrag = InternalOnBeginDrag;
|
|
li_Blue.OnEndDrag = InternalOnEndDrag;
|
|
// li_Blue.HandleMouseOver = InternalMouseOver;
|
|
// li_Blue.AddLinkObject(b_RemoveB);
|
|
li_Blue.AddLinkObject(b_Config);
|
|
li_Blue.AddLinkObject(b_DoConfig);
|
|
|
|
// li_Bots.AddLinkObject(b_AddB);
|
|
// li_Bots.AddLinkObject(b_AddR);
|
|
li_Bots.AddLinkObject(b_Config);
|
|
li_Bots.AddLinkObject(b_DoConfig);
|
|
li_Bots.CheckLinkedObjects = UpdateLinks;
|
|
li_Bots.SetIndex(0);
|
|
sb_Red.ManageComponent(lb_Red);
|
|
sb_Blue.ManageComponent(lb_Blue);
|
|
sb_PBK.ManageComponent(i_Portrait);
|
|
|
|
}
|
|
|
|
function ShowPanel(bool bShow)
|
|
{
|
|
Super.ShowPanel(bShow);
|
|
|
|
// bPlaySounds = bShow;
|
|
if (bShow)
|
|
SetVis(bTeamGame);
|
|
}
|
|
|
|
function SetVis(bool bIsTeam)
|
|
{
|
|
// Team Game only
|
|
// b_AddB.SetVisibility(bIsTeam);
|
|
// b_RemoveB.SetVisibility(bIsTeam);
|
|
lb_Blue.SetVisibility(bIsTeam);
|
|
sb_Blue.SetVisibility(bIsTeam);
|
|
|
|
if ( bIsTeam )
|
|
sb_Red.Caption = RedCaption;
|
|
else sb_Red.Caption = DMCaption;
|
|
}
|
|
|
|
function SetupBotLists(bool bIsTeam)
|
|
{
|
|
local int i, j;
|
|
local class<TeamInfo> TIClass;
|
|
local array<string> Chars;
|
|
|
|
bTeamGame = bIsTeam;
|
|
|
|
li_Red.Clear();
|
|
li_Blue.Clear();
|
|
|
|
if (bTeamGame)
|
|
{
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.TeamRedConfigured",class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
TIClass.static.GetAllCharacters(Chars);
|
|
for ( i = 0; i < Chars.Length; i++ )
|
|
{
|
|
for ( j = 0; j < li_Bots.PlayerList.Length; j++ )
|
|
if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] )
|
|
li_Red.Add(li_Bots.PlayerList[j].Portrait, j);
|
|
}
|
|
}
|
|
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.TeamBlueConfigured",class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
TIClass.static.GetAllCharacters(Chars);
|
|
for ( i = 0; i < Chars.Length; i++ )
|
|
{
|
|
for ( j = 0; j < li_Bots.PlayerList.Length; j++ )
|
|
if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] )
|
|
li_Blue.Add(li_Bots.PlayerList[j].Portrait, j);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.DMRosterConfigured",class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
TIClass.static.GetAllCharacters(Chars);
|
|
for ( i = 0; i < Chars.Length; i++ )
|
|
{
|
|
for ( j = 0; j < li_Bots.PlayerList.Length; j++ )
|
|
if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] )
|
|
li_Red.Add(li_Bots.PlayerList[j].Portrait, j);
|
|
}
|
|
}
|
|
}
|
|
|
|
SetVis(bTeamGame);
|
|
|
|
}
|
|
|
|
// 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 int i;
|
|
local class<TeamInfo> TIClass;
|
|
local array<string> Characters;
|
|
local bool b1,b2;
|
|
local string url;
|
|
local int MinPlayers;
|
|
|
|
if (bTeamGame)
|
|
{
|
|
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.TeamRedConfigured", class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
Characters.Length = li_Red.ItemCount;
|
|
for ( i = 0; i < li_Red.ItemCount; i++ )
|
|
Characters[i] = li_Bots.GetNameAt(li_Red.GetItemIntAtIndex(i));
|
|
|
|
TIClass.static.SetCharacters(Characters);
|
|
TIClass.static.StaticSaveConfig();
|
|
|
|
MinPlayers += li_Red.ItemCount;
|
|
b1 = true;
|
|
}
|
|
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.TeamBlueConfigured", class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
Characters.Length = li_Blue.ItemCount;
|
|
for ( i = 0; i < li_Blue.ItemCount; i++ )
|
|
Characters[i] = li_Bots.GetNameAt(li_Blue.GetItemIntAtIndex(i));
|
|
|
|
TIClass.static.SetCharacters(Characters);
|
|
TIClass.static.StaticSaveConfig();
|
|
|
|
MinPlayers += li_Blue.ItemCount;
|
|
b2 = True;
|
|
}
|
|
|
|
if (b1)
|
|
url $= "?RedTeam=XGame.TeamRedConfigured";
|
|
|
|
if (b2)
|
|
url $= "?BlueTeam=XGame.TeamBlueConfigured";
|
|
}
|
|
else
|
|
{
|
|
TIClass = class<TeamInfo>(DynamicLoadObject("XGame.DMRosterConfigured", class'Class'));
|
|
if ( TIClass != None )
|
|
{
|
|
Characters.Length = li_Red.ItemCount;
|
|
for ( i = 0; i < li_Red.ItemCount; i++ )
|
|
Characters[i] = li_Bots.GetNameAt(li_Red.GetItemIntAtIndex(i));
|
|
|
|
TIClass.static.SetCharacters(Characters);
|
|
TIClass.static.StaticSaveConfig();
|
|
|
|
MinPlayers += li_Red.ItemCount;
|
|
}
|
|
|
|
if (MinPlayers > 0)
|
|
url $= "?DMTeam=xgame.DMRosterConfigured";
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
function CharListChange(GUIComponent Sender)
|
|
{
|
|
local sound NameSound;
|
|
|
|
i_Portrait.Image = li_Bots.GetPortrait();
|
|
sb_PBK.Caption = li_Bots.GetName();
|
|
|
|
// Play the bots name
|
|
if(bPlaySounds)
|
|
{
|
|
NameSound = li_Bots.GetSound();
|
|
PlayerOwner().ClientPlaySound(NameSound,,,SLOT_Interface);
|
|
}
|
|
}
|
|
|
|
function UpdateLinks(GUIListBase List)
|
|
{
|
|
local int MaxCount;
|
|
local bool bRedValid, bBlueValid, bMainValid;
|
|
|
|
bRedValid = li_Red.IsValid();
|
|
bBlueValid = li_Blue.IsValid();
|
|
bMainValid = li_Bots.IsValid();
|
|
|
|
// each list's linked objects overlap, so first disable the ones that are invalid
|
|
if ( !bRedValid )
|
|
li_Red.DisableLinkedObjects();
|
|
if ( !bBlueValid )
|
|
li_Blue.DisableLinkedObjects();
|
|
if ( !bMainValid )
|
|
li_Bots.DisableLinkedObjects();
|
|
|
|
// then enable the ones that are valid
|
|
if ( bRedValid )
|
|
li_Red.EnableLinkedObjects();
|
|
if ( bBlueValid )
|
|
li_Blue.EnableLinkedObjects();
|
|
if ( bMainValid )
|
|
li_Bots.EnableLinkedObjects();
|
|
|
|
if (bTeamGame)
|
|
MaxCount = 16;
|
|
else MaxCount = 32;
|
|
|
|
// if ( li_Red.ItemCount >= MaxCount )
|
|
// DisableComponent(b_AddR);
|
|
// else EnableComponent(b_AddR);
|
|
|
|
// if ( li_Blue.ItemCount >= MaxCount )
|
|
// DisableComponent(b_AddB);
|
|
// else EnableComponent(b_AddB);
|
|
}
|
|
|
|
function ListChange(GUIComponent Sender)
|
|
{
|
|
if (Sender == lb_Blue || Sender == lb_Red)
|
|
{
|
|
if ( GUIVertImageListBox(Sender).List.IsValid() )
|
|
li_Bots.SetIndex(GUIVertImageListBox(Sender).List.GetItem());
|
|
}
|
|
}
|
|
|
|
function bool InternalOnClick(GUIComponent Sender)
|
|
{
|
|
if (Sender==b_Left)
|
|
{
|
|
li_Bots.SetFocus(none);
|
|
li_Bots.PgUp();
|
|
return true;
|
|
}
|
|
|
|
if (Sender==b_Right)
|
|
{
|
|
li_Bots.SetFocus(none);
|
|
li_Bots.PgDown();
|
|
return true;
|
|
}
|
|
|
|
if (Sender == b_AddR)
|
|
{
|
|
bIgnoreListChange = True;
|
|
li_Red.Add( li_Bots.GetPortrait(), li_Bots.Index );
|
|
return true;
|
|
}
|
|
|
|
if (Sender == b_AddB)
|
|
{
|
|
bIgnoreListChange = True;
|
|
li_Blue.Add( li_Bots.GetPortrait(), li_Bots.Index );
|
|
return true;
|
|
}
|
|
|
|
if (Sender == b_RemoveR)
|
|
{
|
|
li_Red.Remove(li_Red.Index);
|
|
return true;
|
|
}
|
|
|
|
if (Sender == b_RemoveB)
|
|
{
|
|
li_Blue.Remove(li_Blue.Index);
|
|
return true;
|
|
}
|
|
|
|
if (Sender == b_Config)
|
|
{
|
|
if (Controller.OpenMenu("GUI2K4.UT2K4BotInfoPage"))
|
|
UT2K4BotInfoPage(Controller.ActivePage).SetupBotInfo(li_bots.GetPortrait(), li_Bots.GetDecoText(), li_Bots.GetRecord());
|
|
return true;
|
|
}
|
|
if (Sender == b_DoConfig)
|
|
{
|
|
if (Controller.OpenMenu("GUI2K4.UT2K4BotConfigPage"))
|
|
UT2K4BotConfigPage(Controller.ActivePage).SetupBotInfo(li_Bots.GetPortrait(), li_Bots.GetDecoText(), li_Bots.GetRecord());
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function bool InternalOnBeginDrag(GUIComponent Sender)
|
|
{
|
|
local bool Result, bTemp;
|
|
|
|
bTemp = bPlaySounds;
|
|
bPlaySounds = False;
|
|
Result = GUIListBase(Sender).InternalOnBeginDrag(Sender);
|
|
bPlaySounds = bTemp;
|
|
return Result;
|
|
}
|
|
|
|
// 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 GUIVertImageList List;
|
|
|
|
List = GUIVertImageList(Controller.DropSource);
|
|
if ( List == None )
|
|
return;
|
|
// log(Name@"InternalOnEndDrag Accepting:"$Accepting@"bAccepted:"$bAccepted);
|
|
|
|
if ( Accepting == None )
|
|
Accepting = li_Bots;
|
|
|
|
List.InternalOnEndDrag(Accepting,True);
|
|
}
|
|
|
|
function bool InternalMouseOver( GUIComponent Sender, Canvas C, out int X, out int Y, out int XL, out int YL )
|
|
{
|
|
local int idx;
|
|
local GUIVertImageList List;
|
|
|
|
List = GUIVertImageList(Sender);
|
|
if ( List == None )
|
|
return false;
|
|
|
|
idx = List.CalculateIndex(True);
|
|
if ( !List.IsValidIndex(idx) )
|
|
return false;
|
|
|
|
List.SetHint( li_Bots.GetNameAt(List.GetItemIntAtIndex(idx)) );
|
|
return false;
|
|
}
|
|
|
|
// Called on the drop target when the mouse is released - Sender is always DropTarget
|
|
function bool InternalOnDragDrop(GUIComponent Target)
|
|
{
|
|
local GUIVertImageList TList;
|
|
local GUIVertImageList SList;
|
|
|
|
local array<xUtil.PlayerRecord> AddingBots;
|
|
local int i, j, MaxCount;
|
|
local bool Result;
|
|
|
|
SList = GUIVertImageList(Controller.DropSource);
|
|
TList = GUIVertImageList(Target);
|
|
if (TList != None)
|
|
{
|
|
if ( bTeamGame )
|
|
MaxCount = 16;
|
|
else MaxCount = 31;
|
|
|
|
if ( TList.ItemCount >= MaxCount )
|
|
return false;
|
|
|
|
// Dragging from list to list
|
|
if ( SList != None )
|
|
{
|
|
j = SList.SelectedElements.Length;
|
|
while ( j > 0 && j + TList.ItemCount > MaxCount )
|
|
{
|
|
for ( i = 0; i < SList.SelectedItems.Length; i++ )
|
|
if ( SList.Elements[SList.SelectedItems[i]] == SList.SelectedElements[j - 1] )
|
|
{
|
|
SList.SelectedItems.Remove(i,1);
|
|
break;
|
|
}
|
|
|
|
SList.SelectedElements.Remove( j - 1, 1 );
|
|
j = SList.SelectedElements.Length;
|
|
}
|
|
|
|
Result = TList.InternalOnDragDrop(Target);
|
|
if (Result)
|
|
UpdateLinks(li_Bots);
|
|
|
|
return Result;
|
|
}
|
|
|
|
else if (Controller.DropSource == li_Bots)
|
|
{
|
|
AddingBots = li_Bots.GetPendingElements();
|
|
for ( i = 0; i < AddingBots.Length; i++ )
|
|
{
|
|
if ( TList.ItemCount >= MaxCount )
|
|
{
|
|
UpdateLinks(TList);
|
|
return true;
|
|
}
|
|
|
|
bIgnoreListChange = True;
|
|
for ( j = 0; j < li_Bots.PlayerList.Length; j++ )
|
|
if ( li_Bots.Playerlist[j] == AddingBots[i] )
|
|
break;
|
|
|
|
TList.Add(li_Bots.Playerlist[j].Portrait, j);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
else if (Target == li_Bots)
|
|
return li_Bots.InternalOnDragDrop(Target);
|
|
|
|
return false;
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
DMCaption="DeathMatch Team"
|
|
RedCaption="Red Team"
|
|
|
|
Begin Object class=GUIImage Name=BotConfigPortrait
|
|
WinWidth=0.2
|
|
WinHeight=0.573754
|
|
WinLeft=0.4
|
|
WinTop=0.003986
|
|
ImageColor=(R=255,G=255,B=255,A=255)
|
|
ImageRenderStyle=MSTY_Normal
|
|
ImageStyle=ISTY_Scaled
|
|
RenderWeight=1.101
|
|
DropShadow=Texture'InterfaceArt_tex.Menu.changeme_texture' //Material'2K4Menus.Controls.shadow'
|
|
DropShadowY=6
|
|
End Object
|
|
i_Portrait=BotConfigPortrait
|
|
|
|
Begin Object Class=GUISectionBackground Name=BotConfigRedBackground
|
|
WinWidth=0.358731
|
|
WinHeight=0.576876
|
|
WinLeft=0.011758
|
|
WinTop=0.008334
|
|
Caption="Red Team"
|
|
End Object
|
|
sb_Red=BotConfigRedBackground
|
|
|
|
Begin Object Class=GUISectionBackground Name=BotConfigBlueBackground
|
|
WinWidth=0.358731
|
|
WinHeight=0.576876
|
|
WinLeft=0.629743
|
|
WinTop=0.008334
|
|
Caption="Blue Team"
|
|
End Object
|
|
sb_Blue=BotConfigBlueBackground
|
|
|
|
Begin Object Class=AltSectionBackground Name=BotConfigPortraitBackground
|
|
WinWidth=0.220218
|
|
WinHeight=0.512104
|
|
WinLeft=0.392777
|
|
WinTop=0.037820
|
|
FontScale=FNS_Small
|
|
Caption=""
|
|
End Object
|
|
sb_PBK=BotConfigPortraitBackground
|
|
|
|
|
|
Begin Object class=GUISectionBackground Name=BotConfigMainBG
|
|
WinWidth=0.887501
|
|
WinHeight=0.328047
|
|
WinLeft=0.058516
|
|
WinTop=0.650734
|
|
Caption="Drag a character on to its respective team"
|
|
End Object
|
|
sb_Bots=BotConfigMainBG
|
|
|
|
Begin Object Class=GUIVertImageListBox Name=BotConfigRedList
|
|
WinWidth=0.345352
|
|
WinHeight=0.504883
|
|
WinLeft=0.014258
|
|
WinTop=0.060750
|
|
bVisibleWhenEmpty=true
|
|
bSorted=True
|
|
Hint="These are the bots that will play on the red team"
|
|
StyleName="NoBackground"
|
|
OnChange=ListChange
|
|
TabOrder=0
|
|
ImageScale=0.2
|
|
End Object
|
|
lb_Red=BotConfigRedList
|
|
|
|
// Begin Object Class=GUIVertScrollButton Name=IABotConfigRedAdd
|
|
// WinWidth=0.039648
|
|
// WinHeight=0.059297
|
|
// WinLeft=0.160115
|
|
// WinTop=0.581982
|
|
// OnClick=InternalOnClick
|
|
// Hint="Add Bot to Red Team"
|
|
// TabOrder=1
|
|
// End Object
|
|
// b_AddR=IABotConfigRedAdd
|
|
|
|
// Begin Object Class=GUIVertScrollButton Name=IABotConfigRedRemove
|
|
// WinWidth=0.039648
|
|
// WinHeight=0.059297
|
|
// WinLeft=0.078865
|
|
// WinTop=0.581982
|
|
// OnClick=InternalOnClick
|
|
// Hint="Remove Bot from Red Team"
|
|
// TabOrder=2
|
|
// bIncreaseButton=True
|
|
// End Object
|
|
// b_RemoveR=IABotConfigRedRemove
|
|
|
|
// Begin Object Class=GUIVertScrollButton Name=IABotConfigBlueAdd
|
|
// WinWidth=0.039648
|
|
// WinHeight=0.059297
|
|
// WinLeft=0.808596
|
|
// WinTop=0.581982
|
|
// OnClick=InternalOnClick
|
|
// Hint="Add Bot to Blue Team"
|
|
// TabOrder=3
|
|
// End Object
|
|
// b_AddB=IABotConfigBlueAdd
|
|
|
|
// Begin Object Class=GUIVertScrollButton Name=IABotConfigBlueRemove
|
|
// WinWidth=0.039648
|
|
// WinHeight=0.059297
|
|
// WinLeft=0.889846
|
|
// WinTop=0.581982
|
|
// OnClick=InternalOnClick
|
|
// Hint="Remove Bot from Blue Team"
|
|
// TabOrder=4
|
|
// bIncreaseButton=True
|
|
// End Object
|
|
// b_RemoveB=IABotConfigBlueRemove
|
|
|
|
Begin Object Class=GUIVertImageListBox Name=BotConfigBlueList
|
|
WinWidth=0.345352
|
|
WinHeight=0.504883
|
|
WinLeft=0.634728
|
|
WinTop=0.060750
|
|
bVisibleWhenEmpty=true
|
|
bSorted=True
|
|
Hint="These are the bots that will play on the blue team"
|
|
StyleName="NoBackground"
|
|
OnChange=ListChange
|
|
TabOrder=5
|
|
ImageScale=0.2
|
|
End Object
|
|
lb_Blue=BotConfigBlueList
|
|
|
|
Begin Object class=GUIButton Name=BotLeft
|
|
WinWidth=0.043555
|
|
WinHeight=0.084414
|
|
WinLeft=0.101953
|
|
WinTop=0.790963
|
|
bNeverFocus=true
|
|
bRepeatClick=true
|
|
OnClick=InternalOnClick
|
|
StyleName="ArrowLeft"
|
|
TabOrder=6
|
|
End Object
|
|
b_Left=BotLeft
|
|
|
|
Begin Object class=GUICharacterList Name=BotConfigCharList
|
|
WinWidth=0.724609
|
|
WinHeight=0.236758
|
|
WinLeft=0.139140
|
|
WinTop=0.714826
|
|
Hint="To add a bot, drag the portrait to the desired team's list, or use the arrow buttons above"
|
|
StyleName="CharButton"
|
|
OnChange=CharListChange
|
|
OnBeginDrag=InternalOnBeginDrag
|
|
bDropSource=True
|
|
bDropTarget=True
|
|
TabOrder=7
|
|
Index=-1
|
|
End Object
|
|
li_Bots=BotConfigCharList
|
|
|
|
Begin Object class=GUIButton Name=BotRight
|
|
WinWidth=0.043555
|
|
WinHeight=0.084414
|
|
WinLeft=0.854649
|
|
WinTop=0.790963
|
|
StyleName="ArrowRight"
|
|
bNeverFocus=true
|
|
bRepeatClick=true
|
|
OnClick=InternalOnClick
|
|
TabOrder=8
|
|
End Object
|
|
b_Right=BotRight
|
|
|
|
Begin Object Class=GUIButton Name=IABotConfigConfig
|
|
Caption="Info"
|
|
Hint="View detailed stats for this bot."
|
|
WinWidth=0.136563
|
|
WinHeight=0.049765
|
|
WinLeft=0.357306
|
|
WinTop=0.593949
|
|
OnClick=InternalOnClick
|
|
MenuState=MSAT_Disabled
|
|
TabOrder=9
|
|
End Object
|
|
b_Config=IABotConfigConfig
|
|
|
|
Begin Object Class=GUIButton Name=IABotConfigDoConfig
|
|
Caption="Edit"
|
|
Hint="Customize the AI attributes for this bot"
|
|
WinWidth=0.136563
|
|
WinHeight=0.049765
|
|
WinLeft=0.505743
|
|
WinTop=0.593949
|
|
OnClick=InternalOnClick
|
|
MenuState=MSAT_Disabled
|
|
TabOrder=10
|
|
End Object
|
|
b_DoConfig=IABotConfigDoConfig
|
|
|
|
bAllowDuplicates=True
|
|
|
|
WinTop=0.15
|
|
WinLeft=0
|
|
WinWidth=1
|
|
WinHeight=0.77
|
|
bAcceptsInput=false
|
|
|
|
bPlaySounds=False
|
|
}
|