535 lines
15 KiB
Ucode
535 lines
15 KiB
Ucode
//==============================================================================
|
|
// Created on: 08/08/2003
|
|
// Description
|
|
//
|
|
// Written by Ron Prestenback
|
|
// © 2003, Epic Games, Inc. All Rights Reserved
|
|
//==============================================================================
|
|
class UT2K4BotConfigPage extends LockedFloatingWindow;
|
|
|
|
var localized string NoInformation, NoPref, DefaultString;
|
|
var GUIImage BotPortrait;
|
|
var GUILabel BotName;
|
|
|
|
var int ConfigIndex;
|
|
var xUtil.PlayerRecord ThisBot;
|
|
var bool bIgnoreChange;
|
|
|
|
var automated GUIImage i_Portrait;
|
|
var automated moSlider sl_Agg, sl_Acc, sl_Com, sl_Str, sl_Tac, sl_Rea, sl_Jumpy;
|
|
var automated moComboBox co_Weapon, co_Voice, co_Orders;
|
|
|
|
var automated GUISectionBackground sb_PicBK;
|
|
|
|
var class<CustomBotConfig> BotConfigClass;
|
|
var array<CacheManager.WeaponRecord> Records;
|
|
var localized string ResetString;
|
|
var localized string AttributesString;
|
|
|
|
function InitComponent(GUIController MyController, GUIComponent MyOwner)
|
|
{
|
|
local int i;
|
|
|
|
Super.InitComponent(MyController, MyOwner);
|
|
|
|
sb_PicBK.ManageComponent(i_Portrait);
|
|
|
|
sb_Main.SetPosition(0.350547,0.078391,0.565507,0.600586);
|
|
|
|
sb_Main.Caption=AttributesString;
|
|
|
|
sb_Main.ManageComponent(sl_Agg);
|
|
sb_Main.ManageComponent(sl_Acc);
|
|
sb_Main.ManageComponent(sl_Com);
|
|
sb_Main.ManageComponent(sl_Str);
|
|
sb_Main.ManageComponent(sl_Tac);
|
|
sb_Main.ManageComponent(sl_Rea);
|
|
sb_Main.ManageComponent(sl_Jumpy);
|
|
sb_Main.ManageComponent(co_Weapon);
|
|
sb_Main.ManageComponent(co_Voice);
|
|
sb_Main.ManageComponent(co_Orders);
|
|
|
|
|
|
class'CacheManager'.static.GetWeaponList( Records );
|
|
co_Weapon.AddItem(NoPref);
|
|
for (i=0;i<Records.Length;i++)
|
|
co_Weapon.AddItem(Records[i].FriendlyName,,Records[i].ClassName);
|
|
|
|
for ( i = 0; i < ArrayCount(class'GameProfile'.default.PositionName); i++ )
|
|
co_Orders.AddItem(class'GameProfile'.default.PositionName[i]);
|
|
|
|
co_Weapon.Onchange=ComboBoxChange;
|
|
|
|
sl_Agg.MySlider.OnDrawCaption=AggDC;
|
|
sl_Acc.MySlider.OnDrawCaption=AccDC;
|
|
sl_Com.MySlider.OnDrawCaption=ComDC;
|
|
sl_Str.MySlider.OnDrawCaption=StrDC;
|
|
sl_Tac.MySlider.OnDrawCaption=TacDC;
|
|
sl_Rea.MySlider.OnDrawCaption=ReaDC;
|
|
sl_Jumpy.MySlider.OnDrawCaption=JumpyDC;
|
|
|
|
b_OK.OnClick = OkClick;
|
|
|
|
b_Cancel.Caption=ResetString;
|
|
b_Cancel.OnClick=ResetClick;
|
|
|
|
}
|
|
|
|
function SetupBotInfo(Material Portrait, string DecoTextName, xUtil.PlayerRecord PRE)
|
|
{
|
|
local int i;
|
|
local array<string> VoicePackClasses;
|
|
local class<xVoicePack> Pack;
|
|
|
|
bIgnoreChange = true;
|
|
|
|
ThisBot = PRE;
|
|
PlayerOwner().GetAllInt("XGame.xVoicePack", VoicePackClasses);
|
|
|
|
co_Voice.MyComboBox.List.Clear();
|
|
co_Voice.AddItem(DefaultString);
|
|
for ( i = 0; i < VoicePackClasses.Length; i++ )
|
|
{
|
|
Pack = class<xVoicePack>(DynamicLoadObject( VoicePackClasses[i], class'Class'));
|
|
if ( Pack != None )
|
|
{
|
|
// Only show voices that correspond to this gender
|
|
if ( class'TeamVoicePack'.static.VoiceMatchesGender(Pack.default.VoiceGender, ThisBot.Sex) )
|
|
co_Voice.AddItem( Pack.default.VoicePackName, Pack, VoicePackClasses[i] );
|
|
}
|
|
}
|
|
|
|
// Setup the Portrait from here
|
|
i_Portrait.Image = PRE.Portrait;
|
|
// Setup the decotext from here
|
|
sb_PicBK.Caption = PRE.DefaultName;
|
|
|
|
ConfigIndex = BotConfigClass.static.IndexFor(PRE.DefaultName);
|
|
|
|
if (ConfigIndex>=0)
|
|
{
|
|
sl_Agg.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].Aggressiveness);
|
|
sl_Acc.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].Accuracy);
|
|
sl_Com.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].CombatStyle);
|
|
sl_Str.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].StrafingAbility);
|
|
sl_Tac.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].Tactics);
|
|
sl_Rea.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].ReactionTime);
|
|
sl_Jumpy.SetValue(BotConfigClass.default.ConfigArray[ConfigIndex].Jumpiness);
|
|
|
|
co_Weapon.Find(BotConfigClass.default.ConfigArray[ConfigIndex].FavoriteWeapon,,True);
|
|
co_Voice.Find(BotConfigClass.default.ConfigArray[ConfigIndex].CustomVoice,,True);
|
|
co_Orders.Find(class'GameProfile'.static.TextPositionDescription(BotConfigClass.default.ConfigArray[ConfigIndex].CustomOrders));
|
|
|
|
}
|
|
else
|
|
{
|
|
/*ifdef _RO_
|
|
sl_Agg.SetValue(float(PRE.Aggressiveness));
|
|
sl_Acc.SetValue(float(PRE.Accuracy));
|
|
sl_Com.SetValue(float(PRE.CombatStyle));
|
|
sl_Str.SetValue(float(PRE.StrafingAbility));
|
|
sl_Tac.SetValue(float(PRE.Tactics));
|
|
sl_Rea.SetValue(float(PRE.ReactionTime));
|
|
sl_Jumpy.SetValue(float(PRE.Jumpiness));
|
|
|
|
co_Weapon.Find(PRE.FavoriteWeapon,,True); */
|
|
if ( PRE.VoiceClassName != "" )
|
|
co_Voice.Find(PRE.VoiceClassName,,True);
|
|
|
|
co_Orders.SetIndex(0);
|
|
}
|
|
|
|
bIgnoreChange=false;
|
|
|
|
}
|
|
|
|
function bool OkClick(GUIComponent Sender)
|
|
{
|
|
BotConfigClass.static.StaticSaveConfig();
|
|
Controller.CloseMenu(false);
|
|
return true;
|
|
}
|
|
|
|
function bool ResetClick(GUIComponent Sender)
|
|
{
|
|
bIgnoreChange = true;
|
|
|
|
if ( ConfigIndex >= 0 )
|
|
{
|
|
class'CustomBotConfig'.default.ConfigArray.Remove(ConfigIndex,1);
|
|
class'CustomBotConfig'.static.StaticSaveConfig();
|
|
}
|
|
|
|
ConfigIndex = -1;
|
|
/*ifdef _RO_
|
|
sl_Agg.SetValue(float(ThisBot.Aggressiveness));
|
|
sl_Acc.SetValue(float(ThisBot.Accuracy));
|
|
sl_Com.SetValue(float(ThisBot.CombatStyle));
|
|
sl_Str.SetValue(float(ThisBot.StrafingAbility));
|
|
sl_Tac.SetValue(float(ThisBot.Tactics));
|
|
sl_Rea.SetValue(float(ThisBot.ReactionTime));
|
|
sl_Jumpy.SetValue(float(ThisBot.Jumpiness));
|
|
co_Weapon.Find(ThisBot.FavoriteWeapon,false,True);
|
|
*/
|
|
if ( ThisBot.VoiceClassName != "" )
|
|
co_Voice.Find(ThisBot.VoiceClassName,false,True);
|
|
|
|
else co_Voice.SetIndex(0);
|
|
|
|
co_Orders.SetIndex(0);
|
|
bIgnorechange = false;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function string DoPerc(GUISlider Control)
|
|
{
|
|
local float r,v,vmin;
|
|
|
|
vmin = Control.MinValue;
|
|
r = Control.MaxValue - vmin;
|
|
v = Control.Value - vmin;
|
|
|
|
return string(int(v/r*100));
|
|
}
|
|
|
|
|
|
|
|
function string AggDC()
|
|
{
|
|
return DoPerc(sl_Agg.MySlider) $ "%";
|
|
}
|
|
|
|
function string AccDC()
|
|
{
|
|
return sl_Acc.GetComponentValue();
|
|
}
|
|
|
|
function string ComDC()
|
|
{
|
|
return DoPerc(sl_Com.MySlider) $"%";
|
|
}
|
|
|
|
function string StrDC()
|
|
{
|
|
return sl_Str.GetComponentValue();
|
|
}
|
|
|
|
function string TacDC()
|
|
{
|
|
return sl_Tac.GetComponentValue();
|
|
}
|
|
|
|
function string ReaDC()
|
|
{
|
|
return sl_Rea.GetComponentValue();
|
|
}
|
|
|
|
function string JumpyDC()
|
|
{
|
|
return DoPerc(sl_Jumpy.MySlider) $ "%";
|
|
}
|
|
|
|
function SetDefaults()
|
|
{
|
|
/* ifdef _RO_
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CharacterName = ThisBot.DefaultName;
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].PlayerName = ThisBot.DefaultName;
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].FavoriteWeapon = ThisBot.FavoriteWeapon;
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Aggressiveness = float(ThisBot.Aggressiveness);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Accuracy = float(ThisBot.Accuracy);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CombatStyle = float(ThisBot.CombatStyle);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].StrafingAbility = float(ThisBot.StrafingAbility);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Tactics = float(ThisBot.Tactics);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].ReactionTime = float(ThisBot.ReactionTime);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Jumpiness = float(ThisBot.Jumpiness);
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CustomVoice = ThisBot.VoiceClassName;
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CustomOrders = POS_Auto;
|
|
*/
|
|
}
|
|
|
|
function SliderChange(GUIComponent Sender)
|
|
{
|
|
local moSlider S;
|
|
|
|
if ( moSlider(Sender) != None )
|
|
S = moSlider(Sender);
|
|
|
|
if ( bIgnoreChange || S == None )
|
|
return;
|
|
|
|
ValidateIndex();
|
|
if (S == sl_Agg)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Aggressiveness = S.GetValue();
|
|
|
|
else if (S == sl_Acc)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Accuracy = S.GetValue();
|
|
|
|
else if (S == sl_Com)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CombatStyle = S.GetValue();
|
|
|
|
else if (S == sl_Str)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].StrafingAbility = S.GetValue();
|
|
|
|
else if (S == sl_Tac)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Tactics = S.GetValue();
|
|
|
|
else if (S == sl_Rea)
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].ReactionTime = S.GetValue();
|
|
|
|
else if ( S == sl_Jumpy )
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].Jumpiness = S.GetValue();
|
|
}
|
|
|
|
function ComboBoxChange(GUIComponent Sender)
|
|
{
|
|
if (bIgnorechange || moComboBox(Sender) == None)
|
|
return;
|
|
|
|
ValidateIndex();
|
|
if ( Sender == co_Weapon )
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].FavoriteWeapon = co_Weapon.GetExtra();
|
|
|
|
else if ( Sender == co_Voice )
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CustomVoice = co_Voice.GetExtra();
|
|
|
|
else if ( Sender == co_Orders )
|
|
BotConfigClass.default.ConfigArray[ConfigIndex].CustomOrders = class'GameProfile'.static.EnumPositionDescription(co_Orders.GetText());
|
|
}
|
|
|
|
function ValidateIndex()
|
|
{
|
|
// Look to see if this is a new entry
|
|
if (ConfigIndex==-1)
|
|
{
|
|
ConfigIndex = BotConfigClass.Default.ConfigArray.Length;
|
|
BotConfigClass.Default.ConfigArray.Length = ConfigIndex+1;
|
|
SetDefaults();
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
Begin Object class=GUISectionBackground name=PicBK
|
|
WinWidth=0.290820
|
|
WinHeight=0.638294
|
|
WinLeft=0.026150
|
|
WinTop=0.078391
|
|
End Object
|
|
sb_PicBK=PicBK
|
|
|
|
Begin Object class=GUIImage Name=imgBotPic
|
|
WinWidth=0.246875
|
|
WinHeight=0.822510
|
|
WinLeft=0.079861
|
|
WinTop=0.116031
|
|
ImageRenderStyle=MSTY_Normal
|
|
ImageStyle=ISTY_Scaled
|
|
RenderWeight=0.11
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
i_Portrait=imgBotPic
|
|
|
|
Begin Object class=moSlider Name=BotAggrSlider
|
|
Caption="Aggressiveness"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.107618
|
|
MinValue=0
|
|
MaxValue=1
|
|
Hint="Configures the aggressiveness rating of this bot."
|
|
LabelStyleName="TextLabel"
|
|
SliderCaptionStyleName="TextLabel"
|
|
OnChange=SliderChange
|
|
TabOrder=0
|
|
bHeightFromComponent=False
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotAccuracySlider
|
|
Caption="Accuracy"
|
|
SliderCaptionStyleName="TextLabel"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.177603
|
|
MinValue=-2
|
|
MaxValue=2
|
|
Hint="Configures the accuracy rating of this bot."
|
|
OnChange=SliderChange
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=1
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotCStyleSlider
|
|
Caption="Combat Style"
|
|
SliderCaptionStyleName="TextLabel"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.247588
|
|
MinValue=0
|
|
MaxValue=1
|
|
Hint="Adjusts the combat style of this bot."
|
|
OnChange=SliderChange
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=2
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotStrafeSlider
|
|
Caption="Strafing Ability"
|
|
SliderCaptionStyleName="TextLabel"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.317573
|
|
MinValue=-2
|
|
MaxValue=2
|
|
Hint="Adjusts the strafing ability of this bot."
|
|
OnChange=SliderChange
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=3
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotTacticsSlider
|
|
Caption="Tactics"
|
|
SliderCaptionStyleName="TextLabel"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.387558
|
|
MinValue=-2
|
|
MaxValue=2
|
|
Hint="Adjusts the team-play awareness ability of this bot."
|
|
OnChange=SliderChange
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=4
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotReactionSlider
|
|
Caption="Reaction Time"
|
|
SliderCaptionStyleName="TextLabel"
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.457542
|
|
MinValue=-2
|
|
MaxValue=2
|
|
Hint="Adjusts the reaction speed of this bot."
|
|
OnChange=SliderChange
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=5
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moSlider Name=BotJumpy
|
|
WinWidth=0.598438
|
|
WinHeight=0.037500
|
|
WinLeft=0.345313
|
|
WinTop=0.527528
|
|
Caption="Jumpiness"
|
|
Hint="Controls whether this bot jumps a lot during the game."
|
|
MinValue=0
|
|
MaxValue=1
|
|
OnChange=SliderChange
|
|
LabelStyleName="TextLabel"
|
|
SliderCaptionStyleName="TextLabel"
|
|
TabOrder=6
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moComboBox Name=BotWeapon
|
|
WinWidth=0.598438
|
|
WinHeight=0.055469
|
|
WinLeft=0.345313
|
|
WinTop=0.647967
|
|
Caption="Preferred Weapon"
|
|
Hint="Select which weapon this bot should prefer."
|
|
CaptionWidth=0.5
|
|
bReadOnly=true
|
|
ComponentJustification=TXTA_Left
|
|
bHeightFromComponent=False
|
|
LabelStyleName="TextLabel"
|
|
TabOrder=7
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moComboBox Name=BotVoice
|
|
WinWidth=0.598438
|
|
WinHeight=0.055469
|
|
WinLeft=0.345313
|
|
WinTop=0.718011
|
|
Caption="Voice"
|
|
Hint="Choose which voice this bot uses."
|
|
CaptionWidth=0.5
|
|
bReadOnly=True
|
|
ComponentJustification=TXTA_Left
|
|
LabelStyleName="TextLabel"
|
|
OnChange=ComboBoxChange
|
|
TabOrder=8
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
Begin Object class=moComboBox Name=BotOrders
|
|
WinWidth=0.598438
|
|
WinHeight=0.055469
|
|
WinLeft=0.345313
|
|
WinTop=0.791159
|
|
Caption="Orders"
|
|
Hint="Choose which role this bot will play in the game."
|
|
CaptionWidth=0.5
|
|
bReadOnly=True
|
|
ComponentJustification=TXTA_Left
|
|
LabelStyleName="TextLabel"
|
|
OnChange=ComboBoxChange
|
|
TabOrder=9
|
|
bScaleToParent=True
|
|
bBoundToParent=True
|
|
End Object
|
|
|
|
sl_Agg=BotAggrSlider
|
|
sl_Acc=BotAccuracySlider
|
|
sl_Com=BotCStyleSlider
|
|
sl_Str=BotStrafeSlider
|
|
sl_Tac=BotTacticsSlider
|
|
sl_Rea=BotReactionSlider
|
|
sl_Jumpy=BotJumpy
|
|
co_Weapon=BotWeapon
|
|
co_Voice=BotVoice
|
|
co_Orders=BotOrders
|
|
|
|
WinWidth=0.921875
|
|
WinHeight=0.759115
|
|
WinLeft=0.043945
|
|
WinTop=0.123958
|
|
|
|
DefaultString="Default"
|
|
NoPref="No Preference"
|
|
|
|
BotConfigClass=class'CustomBotConfig'
|
|
NoInformation="No Information Available!"
|
|
ResetString="Reset"
|
|
AttributesString="Attributes"
|
|
}
|