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

160 lines
5.7 KiB
Ucode

class PlayInfo extends object
native;
cpptext
{
void ReturnFilteredSettings( TArray<FPlayInfoData>& PIData, const FString& GroupName );
UBOOL NeedsValidation( const UProperty* Prop ) const;
UBOOL ValidateRange( const UProperty* Prop, FString& NewVal, FString& DataRange ) const;
}
enum EPlayInfoType
{
PIT_Check,
PIT_Select,
PIT_Text,
PIT_Custom
};
struct native init PlayInfoData
{
var const Property ThisProp; // Pointer to property
var const class<Info> ClassFrom; // Which class was this Property from
var const string SettingName; // Name of the class member
var const string DisplayName; // Display Name of the control (from .INT/.INI File ?)
var const string Description; // Description of what the property does
var const string Grouping; // Grouping for this parameter
var const string Data; // Extra Data (like Gore Level Texts)
var const string ExtraPriv; // Extra Privileges Required to set this parameter
var const string Value; // Value of the setting
var const EPlayInfoType RenderType; // Type of rendered control
var const byte SecLevel; // Sec Level Required to set this param. (Read from Ini file afterwards)
var const byte Weight; // Importance of the setting compared to others in its group
var const bool bMPOnly; // This setting should only appear in multi-player context
var const bool bAdvanced; // This setting is an advanced property (only displayed when user sets bExpertMode in GUIController)
// Internal flags (set natively)
var const bool bGlobal; // globalconfig property
var const bool bStruct; // Property is a struct
var const int ArrayDim; // -1: Not array, 0: dynamic array, >1: Static array
};
var const array<PlayInfoData> Settings;
var const array<class<Info> > InfoClasses;
var const array<int> ClassStack;
var const array<string> Groups;
var const string LastError;
native(700) final function bool Clear();
native(701) final function bool AddClass(class<Info> AddingClass);
native(702) final function bool RemoveClass(class<Info> RemovingClass);
native(703) final function bool PopClass();
native(704) final function bool AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced);
native(705) final function bool SaveSettings(); // Saves stored settings to ini file
native(706) final function bool StoreSetting(int index, coerce string NewVal, optional string RangeData); // Only validates and sets Settins[index].Value to passed value
native(707) final function bool GetSettings(string GroupName, out array<PlayInfoData> GroupSettings); // rjp
native(708) final function int FindIndex(string SettingName);
// 0 = Grouping, 1 = Weight, 2 = RenderType, 3 = DisplayName, 4 = SettingName, 5 = SecLevel
// 6 = RevGroup, 1 = RevWeight, etc.
// Equal items will be sorted by the next highest type
native(709) final function Sort(byte SortingMethod);
final function Dump( optional string group )
{
local int i;
log("** Dumping settings array for PlayInfo object '"$Name$"' **");
log("** Classes:"@InfoClasses.Length);
for ( i = 0; i < InfoClasses.Length; i++ )
log(" "$i$")"@InfoClasses[i].Name);
log("");
log("** Groups:"@Groups.Length);
for (i = 0; i < Groups.Length; i++)
log(" "$i$")"@Groups[i]);
log("");
Log("** Settings:"@Settings.Length);
for (i = 0; i<Settings.Length; i++)
{
if ( group == "" || group ~= Settings[i].Grouping )
{
Log(i$")"@Settings[i].SettingName);
log(" DisplayName:"@Settings[i].DisplayName);
log(" ClassFrom:"@Settings[i].ClassFrom);
log(" Group:"@Settings[i].Grouping);
log(" Value:"@Settings[i].Value);
log(" Data:"@Settings[i].Data);
log(" Weight:"@Settings[i].Weight);
log(" Struct:"@Settings[i].bStruct);
log(" Global:"@Settings[i].bGlobal);
log(" MPOnly:"@Settings[i].bMPOnly);
log(" SecLevel:"@Settings[i].SecLevel);
log(" ArrayDim:"@Settings[i].ArrayDim);
log(" bAdvanced:"@Settings[i].bAdvanced);
log(" ExtraPriv:"@Settings[i].ExtraPriv);
log(" RenderType:"@GetEnum(enum'EPlayInfoType',Settings[i].RenderType));
log("");
}
}
}
// Specify bStrict to purge any secondary classes from the Classes stack
final function bool Init(array<class<Info> > Classes, optional bool bStrict)
{
local int i, j;
local bool b;
if (Classes.Length == 0)
return b;
b = True;
Clear();
for (i = 0; i < Classes.Length; i++)
{
if (Classes[i] == None)
{
log("Call in PlayInfo.Init() with 'None' value for Class array member. Index:"$i);
Classes.Remove(i--, 1);
continue;
}
Classes[i].static.FillPlayInfo(Self);
}
if ( bStrict )
{
for ( i = InfoClasses.Length - 1; i >= 0; i-- )
{
for (j = 0; j < Classes.Length; j++)
if (InfoClasses[i] == Classes[j])
break;
if (j < Classes.Length)
continue;
b = b && RemoveClass(InfoClasses[i]);
}
}
return b;
}
final function class<GameInfo> GetGameInfo()
{
local int i;
for ( i = 0; i < InfoClasses.Length; i++ )
if ( class<GameInfo>( InfoClasses[i] ) != None )
return class<GameInfo>(InfoClasses[i]);
return None;
}
final function SplitStringToArray(out array<string> Parts, string Source, string Delim)
{
Split(Source, Delim, Parts);
}