rott/kf_sources/KFGui/Classes/KFInvWaveConfig.uc
2026-07-14 20:27:09 +07:00

285 lines
6.8 KiB
Ucode

//==============================================================================
// KFInvWaveConfig
//==============================================================================
class KFInvWaveConfig extends GUICustomPropertyPage;
var array<string> Waves;
var automated GUIImage i_Background;
var automated moNumericEdit nu_Wave;
var automated GUIMultiOptionListBox lb_Waves;
var GUIMultiOptionList li_waves;
var localized string WaveConfigTitle;
var localized string DiffHint, MaxInvaderHint;
struct WaveSquadType
{
var string SName;
var int Mask;
var moCheckBox CheckButton;
};
var int ActiveWave; // Wave currently being edited
var array<WaveSquadType> WaveSquad;
var Invasion.WaveInfo EditedWaves[16];
var moSlider sl_Diff;
var moNumericEdit nu_MaxMonster;
function string GetResult()
{
return "";
}
function InitActiveSquads()
{
local int i,l,m,j,z,n;
local byte c;
local array<string> AS;
local string S;
AS = Class'KFGameType'.Default.MonsterSquad;
l = AS.Length;
WaveSquad.Length = l;
m = 1;
z = Class'KFGameType'.default.MonsterCollection.Default.MonsterClasses.Length;
For( i=0; i<l; i++ )
{
WaveSquad[i].Mask = m;
m*=2;
c = 0;
while( Len(AS[i])>1 )
{
S = Mid(AS[i],1,1);
n = int(Left(AS[i],1));
AS[i] = Mid(AS[i],2);
for( j=0; j<z; j++ )
{
if( Class'KFGameType'.default.MonsterCollection.Default.MonsterClasses[j].MID==S )
{
S = n$":"$GetMonsterName(Class'KFGameType'.default.MonsterCollection.Default.MonsterClasses[j].MClassName);
if( Len(S)==0 )
Break;
if( c++==0 )
WaveSquad[i].SName$=S;
else WaveSquad[i].SName$=","$S;
}
}
if( Len(WaveSquad[i].SName)>75 )
{
WaveSquad[i].SName$="...";
Break;
}
}
}
}
function string GetMonsterName( string InS )
{
local Class<Monster> MC;
MC = Class<Monster>(DynamicLoadObject(InS,Class'Class'));
if( MC==None )
Return "Invalid";
else if( MC.Default.MenuName!="" )
Return MC.Default.MenuName;
Return string(MC.Name);
}
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
local int i;
Super.InitComponent(MyController, MyOwner);
li_Waves = lb_Waves.List;
li_Waves.OnChange = InternalOnChange;
li_Waves.bDrawSelectionBorder = False;
li_Waves.ItemPadding=0.15;
li_Waves.ColumnWidth=0.95;
li_Waves.bHotTrackSound = False;
sl_Diff = moSlider(li_Waves.AddItem( "XInterface.moSlider", None, "Difficulty", true ));
nu_MaxMonster = moNumericEdit(li_Waves.AddItem( "XInterface.moNumericEdit", None, "Number of monsters (X players count)", true ));
sl_Diff.Hint = DiffHint;
nu_MaxMonster.Hint=MaxInvaderHint;
for ( i = 0; i < li_Waves.NumColumns; i++ )
li_Waves.AddItem( "XInterface.GUIListSpacer" );
for( i=0; i<ArrayCount(EditedWaves); i++ )
EditedWaves[i] = Class'KFGameType'.Default.Waves[i];
sb_Main.ManageComponent(lb_Waves);
sb_Main.LeftPadding=0;
sb_Main.RightPadding=0;
sb_Main.TopPadding=0.05;
sb_Main.BottomPadding=0.05;
sb_Main.SetPosition(0.030234,0.075000,0.851640,0.565624);
InitWaveControls();
}
function InitWaveControls()
{
InitDifficulty();
InitMaxMonsters();
}
function InitDifficulty()
{
sl_Diff.Setup( 0.0, 3.0 );
sl_Diff.CaptionWidth = 0.1;
sl_Diff.ComponentWidth = -1;
sl_Diff.bAutoSizeCaption = true;
sl_Diff.ComponentJustification = TXTA_Left;
}
function InitMaxMonsters()
{
nu_MaxMonster.Setup( 1, 500, 1 );
nu_MaxMonster.CaptionWidth = 0.1;
nu_MaxMonster.ComponentWidth = 0.3;
nu_MaxMonster.bAutoSizeCaption = true;
nu_MaxMonster.ComponentJustification = TXTA_Center;
}
function SetOwner( GUIComponent NewOwner )
{
Super.SetOwner(NewOwner);
t_WindowTitle.Caption = WaveConfigTitle;
InitActiveSquads();
InitializeList();
}
function InitializeList()
{
local int i;
local moCheckBox ch;
for ( i = 0; i<WaveSquad.Length; i++ )
{
ch = moCheckbox(li_Waves.AddItem( "XInterface.moCheckbox",, WaveSquad[i].SName ));
if ( ch != None )
{
WaveSquad[i].CheckButton = ch;
ch.Tag = WaveSquad[i].Mask;
ch.bAutoSizeCaption = True;
}
}
UpdateWaveValues();
}
function string GetDataString()
{
return "";
}
function InternalOnChange(GUIComponent Sender)
{
local GUIMenuOption mo;
if ( Sender == nu_Wave )
{
ActiveWave = nu_Wave.GetValue();
UpdateWaveValues();
}
else if ( Sender == li_Waves )
{
mo = li_Waves.Get();
if ( mo == sl_Diff )
EditedWaves[ActiveWave].WaveDifficulty = sl_Diff.GetValue();
else if ( mo == nu_MaxMonster )
EditedWaves[ActiveWave].WaveMaxMonsters = nu_MaxMonster.GetValue();
if ( moCheckBox(mo) != None )
{
if ( moCheckbox(mo).IsChecked() )
EditedWaves[ActiveWave].WaveMask = EditedWaves[ActiveWave].WaveMask | mo.Tag;
else EditedWaves[ActiveWave].WaveMask = EditedWaves[ActiveWave].WaveMask & ~mo.Tag;
}
}
}
// Called when the active wave has been changed - updates all components with the correct values
function UpdateWaveValues()
{
local int i;
sl_Diff.SetComponentValue( EditedWaves[ActiveWave].WaveDifficulty, true );
nu_MaxMonster.SetComponentValue( EditedWaves[ActiveWave].WaveMaxMonsters, True );
for ( i=0; i<WaveSquad.Length; i++ )
WaveSquad[i].CheckButton.SetComponentValue( EditedWaves[ActiveWave].WaveMask & WaveSquad[i].CheckButton.Tag, True );
}
event Closed( GUIComponent Sender, bool bCancelled )
{
local byte i;
if( bCancelled )
Return;
for( i=0; i<ArrayCount(EditedWaves); i++ )
Class'KFGameType'.Default.Waves[i] = EditedWaves[i];
Class'KFGameType'.Static.StaticSaveConfig();
}
DefaultProperties
{
Begin Object Class=moNumericEdit Name=WaveNumber
Caption="Wave No."
Hint="Select the wave you'd like to configure"
WinWidth=0.220000
WinHeight=0.042857
WinLeft=0.407353
WinTop=0.092990
MinValue=0
MaxValue=15
CaptionWidth=0.1
ComponentWidth=0.3
bAutoSizeCaption=true
ComponentJustification=TXTA_Center
OnChange=InternalOnChange
RenderWeight=0.7
bBoundToParent=True
bScaleToParent=True
End Object
nu_Wave=WaveNumber
Begin Object Class=GUIMultiOptionListBox Name=WavesList
NumColumns=1
OnChange=InternalOnChange
WinWidth=0.983750
WinHeight=0.698149
WinLeft=0.007500
WinTop=0.150608
TabOrder=1
bVisibleWhenEmpty=True
bBoundToParent=True
bScaleToParent=True
// StyleName="ServerBrowserGrid"
End Object
lb_Waves=WavesList
WaveConfigTitle="Killing Floor Wave config page"
bDrawFocusedLast=False
WinWidth=0.9
WinHeight=0.7
WinLeft=0.05
WinTop=0.15
DefaultWidth=0.9
DefaultHeight=0.7
DefaultLeft=0.05
DefaultTop=0.15
DiffHint="How hard should this wave be."
MaxInvaderHint="What is the maximum number of monsters to spawn for this wave."
}