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

566 lines
13 KiB
Ucode

// ====================================================================
// Class: XAdmin.GameConfigSet
// Parent: XAdmin.xAdminConfigBase
//
// This class is responsible for handling changes to a Game default
// Behavior like Map List,Mutators and Ini Settings.
// ====================================================================
class GameConfigSet extends Object;
var LevelInfo Level; // Need access to Level function
var protected class<GameInfo> GameClass; // Which game class is being edited
var protected int GameIndex; // Index of GameClass
var protected PlayInfo Settings; // Game Setting Defaults
var int CurrentMapList; // Index of maplist we're editing
var protected array<int> UsedMutators; // List of Mutators in use
var protected array<int> UsedMaps; // Index of maps within active maplist
// Maintaining Global Lists
var protected string AllMapsPrefix; // Which map prefix is currently loaded
var protected array<string> AllMapLists; // List of all maplists for the specified gametype
var protected array<string> AllMaps; // List of all Maps for the specified gametype.
var protected array<string> AllMutators; // List of all available mutators
var protected array< class<GameInfo> > AllGameTypes;
var string NextMutators; // What mutators were set during this session
var protected bool bEdit; // We are currently editing something
function bool StartEdit(optional string GameType)
{
if (Level == None || bEdit)
return false;
// Load all Game Types, unless already loaded
if (AllGameTypes.Length == 0)
LoadGameTypes();
// Load All Mutators (Unless already loaded)
if (AllMutators.Length == 0)
LoadAllMutators();
// If no GameType Specified, use currently loaded one.
if (GameType == "")
GameType = String(Level.Game.Class);
// When editing allow for many ways to find the good game class
// Try with Acronym, Class, Alternate class, etc
GameClass = FindGameType(GameType);
log("GameClass is"@GameClass);
if (GameClass == None)
return false;
LoadAllMaps();
GameIndex = Level.Game.MaplistHandler.GetGameIndex(string(GameClass));
CurrentMapList = GetActiveList();
AllMapLists = GetLists();
// Load Game Setting
LoadSettings(GameClass);
// Fill in Used Mutators
SetUsedMutators();
NextMutators = "";
bEdit = true;
return true;
}
function bool EndEdit(bool bSave)
{
local int i;
if (Level == None || !bEdit)
return false;
// Save all data where it belongs
if (bSave)
{
// Log("GCS.EndEdit is now Saving All the Data");
// Commit to PlayInfo
Settings.SaveSettings();
NextMutators = "";
if (UsedMutators.Length > 0)
{
NextMutators = AllMutators[UsedMutators[0]];
for (i=1; i<UsedMutators.Length; i++)
NextMutators = NextMutators$","$AllMutators[UsedMutators[i]];
}
// Log("CGS.NextMutators="@NextMutators);
Level.Game.MaplistHandler.SaveGame(GameIndex);
}
else Level.Game.MaplistHandler.ResetGame(GameIndex);
bEdit = false;
return true;
}
function bool CanEdit()
{
return !bEdit;
}
// Settings Functions
function string GetParam(int idx)
{
if (idx < 0 || idx >= Settings.Settings.Length)
return "";
return Settings.Settings[idx].Value;
}
function string GetNamedParam(string Parameter)
{
local int i;
local string SettingName;
for (i = 0; i < Settings.Settings.Length; i++)
{
SettingName = Settings.Settings[i].SettingName;
if (SettingName ~= Parameter || Right(SettingName, Len(Parameter) + 1) ~= ("."$Parameter))
return Settings.Settings[i].Value;
}
return "";
}
function array<string> GetMaskedParams(string ParamMask)
{
local array<string> FoundParams;
local array<string> FoundMasks;
local string SettingName, ShortName;
local int i, j, p;
Split(ParamMask, " ", FoundMasks);
if (FoundMasks.Length > 0)
{
for (i = 0; i<Settings.Settings.Length; i++)
{
SettingName = Settings.Settings[i].SettingName;
ShortName = SettingName;
j = Instr(ShortName, ".");
while (j != -1)
{
ShortName = Mid(ShortName, p+1);
j = Instr(ShortName, ".");
}
for (j = 0; j<FoundMasks.Length; j++)
{
if (MaskedCompare(ShortName, FoundMasks[j]) || MaskedCompare(SettingName, FoundMasks[j]))
{
FoundParams[FoundParams.Length] = SettingName;
FoundParams[FoundParams.Length] = Settings.Settings[i].Value;
break;
}
}
}
}
return FoundParams;
}
function bool SetParam(int idx, string Value)
{
if (idx < 0 || idx >= Settings.Settings.Length)
return false;
return Settings.StoreSetting(idx, Value);
}
// Settings Commands Processing
function bool SetNamedParam(string Parameter, string Value)
{
local int i;
local string SettingName;
for (i = 0; i < Settings.Settings.Length; i++)
{
SettingName = Settings.Settings[i].SettingName;
if (SettingName ~= Parameter || Right(SettingName, Len(Parameter) + 1) ~= ("."$Parameter))
return Settings.StoreSetting(i, Value);
}
// Parameter not found
return false;
}
// MapList Functions
function array<string> GetLists()
{
local array<string> Names;
Names = Level.Game.MaplistHandler.GetMapListNames(GameIndex);
return Names;
}
function int GetActiveList()
{
return Level.Game.MaplistHandler.GetActiveList(GameIndex);
}
//function bool SetActiveList(int Index)
//{
// if (Index < 0 || Index > AllMapLists.Length || !bEdit)
// return false;
//
// CurrentMapList = Index;
// return true;
//}
function array<string> GetMaps()
{
return Level.Game.MaplistHandler.GetMapList(GameIndex, CurrentMapList);
}
function array<string> AddMaps(string MapMask)
{
local array<string> FoundMasks, AddedMaps, CurrentMaps;
local int i, j, k;
local bool bFound;
Split(MapMask, " ",FoundMasks);
if (FoundMasks.Length > 0)
{
CurrentMaps = GetMaps();
for (i = 0; i<AllMaps.Length; i++)
{
for (j = 0; j<FoundMasks.Length; j++)
{
if (MaskedCompare(AllMaps[i], FoundMasks[j]))
{
// Found a matching map, see if its already in the Used Maps list
bFound = false;
for (k = 0; k<CurrentMaps.Length; k++)
{
if (CurrentMaps[k] == AllMaps[i])
{
bFound = true;
break;
}
}
if (!bFound)
{
Level.Game.MaplistHandler.AddMap(GameIndex, CurrentMapList, AllMaps[i]);
AddedMaps[AddedMaps.Length] = AllMaps[i];
break;
}
}
}
}
}
return AddedMaps;
}
function array<string> RemoveMaps(string MapMask)
{
local array<string> FoundMasks, DelMaps, CurrentMaps;
local int i, j;
Split(MapMask, " ", FoundMasks);
if (FoundMasks.Length > 0)
{
CurrentMaps = GetMaps();
for (i=0; i<CurrentMaps.Length; i++)
{
for (j=0; j<FoundMasks.Length; j++)
{
if (MaskedCompare(CurrentMaps[i], FoundMasks[j]))
{
DelMaps[DelMaps.Length] = CurrentMaps[i];
Level.Game.MaplistHandler.RemoveMap(GameIndex, CurrentMapList, CurrentMaps[i]);
i--;
break;
}
}
}
}
return DelMaps;
}
function array<string> FindMaps(string MapMask)
{
local array<string> FoundMasks, FoundMaps, CurrentMaps;
local int i, j, k;
local bool bFound;
Split(MapMask, " ", FoundMasks);
if (FoundMasks.Length > 0)
{
CurrentMaps = GetMaps();
for (i = 0; i<AllMaps.Length; i++)
{
for (j = 0; j<FoundMasks.Length; j++)
{
if (MaskedCompare(AllMaps[i], FoundMasks[j]))
{
// Found a matching map, see if its already in the Used Maps list
bFound = false;
for (k = 0; k<CurrentMaps.Length; k++)
{
if (CurrentMaps[k] ~= AllMaps[i])
{
// Log("Found the map");
bFound = true;
break;
}
}
if (bFound)
FoundMaps[FoundMaps.Length] = "+"$AllMaps[i];
else
FoundMaps[FoundMaps.Length] = AllMaps[i];
break;
}
}
}
}
return FoundMaps;
}
// Mutator list functions
function array<string> GetUsedMutators()
{
local array<string> Strings;
local int i;
for (i = 0; i<UsedMutators.Length; i++)
Strings[Strings.Length] = AllMutators[UsedMutators[i]];
return Strings;
}
function array<string> GetUnusedMutators()
{
local array<string> Strings;
local int i;
Strings.Length = AllMutators.Length;
for (i = 0; i<AllMutators.Length; i++)
Strings[i] = AllMutators[i];
// Tag all used mutators
for (i = 0; i<UsedMutators.Length; i++)
Strings[UsedMutators[i]] = "";
for (i = 0; i<Strings.Length; i++)
{
if (Strings[i] == "")
{
Strings.Remove(i, 1);
i--;
}
}
return Strings;
}
function bool AddMutator(string MutatorName)
{
local int i, j;
local string Str;
// First make sure it isnt in the list
for (i = 0; i<AllMutators.Length; i++)
{
Str = AllMutators[i];
if (Str ~= MutatorName || Right(Str, Len(MutatorName) + 1) ~= ("."$MutatorName))
{
for (j=0; j<UsedMutators.Length; j++)
if (UsedMutators[j] == i)
return false;
UsedMutators[UsedMutators.Length] = i;
return true;
}
}
return false;
}
function bool DelMutator(string MutatorName)
{
local int i;
local string Str;
// First make sure it isnt in the list
for (i = 0; i<UsedMutators.Length; i++)
{
Str = AllMutators[UsedMutators[i]];
if (Str ~= MutatorName || Right(Str, Len(MutatorName) + 1) ~= ("."$MutatorName))
{
UsedMutators.Remove(i, 1);
return true;
}
}
return false;
}
////////////////////////////////
// Public Information
////////////////////////////////
function string GetEditedClass()
{
if (GameClass != None)
return String(GameClass);
return "";
}
function string GetGameAcronym()
{
if (GameClass != None)
return GameClass.default.Acronym;
return "";
}
////////////////////////////////
// Protected Helping functions
////////////////////////////////
protected function LoadGameTypes()
{
local class<GameInfo> TempClass;
local String NextGame;
local int i;
// Compile a list of all gametypes.
i = 0;
NextGame = Level.GetNextInt("Engine.GameInfo", 0);
while (NextGame != "")
{
TempClass = class<GameInfo>(DynamicLoadObject(NextGame, class'Class'));
if (TempClass != None)
AllGameTypes[AllGameTypes.Length] = TempClass;
NextGame = Level.GetNextInt("Engine.GameInfo", ++i);
}
}
protected function class<GameInfo> FindGameType(string GameType)
{
local class<GameInfo> TempClass;
local int i;
TempClass = None;
for (i=0; i<AllGameTypes.Length; i++)
{
TempClass = AllGameTypes[i];
if (GameType ~= string(TempClass)) break;
if (GameType ~= TempClass.default.Acronym) break;
if (GameType ~= TempClass.default.DecoTextName) break;
if (Right(string(TempClass), Len(GameType)+1) ~= ("."$GameType)) break;
if (Right(TempClass.default.DecoTextName, Len(GameType)+1) ~= ("."$GameType)) break;
}
return TempClass;
}
protected function LoadAllMutators()
{
local string NextMutator, NextDesc;
local int Cnt;
Level.GetNextIntDesc("Engine.Mutator", 0, NextMutator, NextDesc);
Cnt = 0;
AllMutators.Length = 0;
while(NextMutator != "")
{
AllMutators[AllMutators.Length] = NextMutator;
Cnt++;
Level.GetNextIntDesc("Engine.Mutator", Cnt, NextMutator, NextDesc);
}
}
protected function SetUsedMutators()
{
local Mutator M;
local int i;
for (M = Level.Game.BaseMutator.NextMutator; M != None; M = M.NextMutator)
{
if (M.bUserAdded)
{
for (i=0; i<AllMutators.Length; i++)
if (string(M.Class) ~= AllMutators[i])
break;
if (i == AllMutators.Length)
{
// Since this mutator had no .int entry, but it was added on the command line
// lets just add it to the list.
AllMutators[AllMutators.Length] = string(M.Class);
log("Unknown Mutator in use: "@String(M.Class));
}
UsedMutators[UsedMutators.Length] = i;
}
}
}
// Always reload settings at StartEdit()
protected function string LoadSettings(class<GameInfo> GameClass)
{
if (Settings == None)
Settings = new(None) class'PlayInfo';
Settings.Clear();
GameClass.static.FillPlayInfo(Settings);
return string(GameClass);
}
// TODO: Have a "native array<string> LoadAllMapNames(string MapPrefix)" somewhere ?
protected function LoadAllMaps(optional bool bForceLoad)
{
local string MapPrefix;
if (GameClass == None)
return;
MapPrefix = GameClass.Default.MapPrefix;
if(MapPrefix != "" && (MapPrefix != AllMapsPrefix || bForceLoad))
{
GameClass.static.LoadMapList(MapPrefix, AllMaps);
AllMapsPrefix = MapPrefix;
}
}
////////////////////////////////////////////////////////////
// TODO: Find Centralized place for the following functions
////////////////////////////////////////////////////////////
// Mask can be *|*Name|Name*|*Name*|Name
protected function bool MaskedCompare(string SettingName, string Mask)
{
local bool bMaskLeft, bMaskRight;
local int MaskLen;
if (Mask == "*" || Mask == "**")
return true;
MaskLen = Len(Mask);
bMaskLeft = Left(Mask, 1) == "*";
bMaskRight = Right(Mask, 1) == "*";
if (bMaskLeft && bMaskRight)
return Instr(Caps(SettingName), Mid(Caps(Mask), 1, MaskLen-2)) >= 0;
if (bMaskLeft)
return Left(SettingName, MaskLen -1) ~= Left(Mask, MaskLen - 1);
if (bMaskRight)
return Right(SettingName, MaskLen -1) ~= Right(Mask, MaskLen - 1);
return SettingName ~= Mask;
}
defaultproperties
{
}