Untitled
unknown
ini
a year ago
3.9 kB
7
Indexable
class X2DownloadableContentInfo_AlertLevelVarietyWOTC extends X2DownloadableContentInfo;
struct DiffWeights {
var int Diff1;
var int Diff2;
var int Diff3;
var int Diff4;
};
struct MissionDiffWeights {
var name MissionSource;
var array<DiffWeights> MonthDifficultyWeights;
};
var config(Game) array<DiffWeights> DefaultMonthDifficultyWeights;
var config(Game) array<MissionDiffWeights> MissionMonthDifficultyWeights;
var config(Game) array<name> MissionsToPatch;
static event OnPostTemplatesCreated()
{
PatchMissions();
}
static function PatchMissions()
{
local name Entry;
local X2StrategyElementTemplateManager StratMgr;
local X2MissionSourceTemplate MissionToModify;
StratMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager();
foreach default.MissionsToPatch(Entry)
{
MissionToModify = X2MissionSourceTemplate(StratMgr.FindStrategyElementTemplate(Entry));
if (MissionToModify == none)
{
`log("Failed to find mission source" @ Entry, true, 'ALVariety');
continue;
}
MissionToModify.GetMissionDifficultyFn = GetVariedMissionDifficulty;
`log("Patched mission source" @ Entry, true, 'ALVariety');
}
}
static function int GetVariedMissionDifficulty(XComGameState_MissionSite MissionState)
{
// Set the difficulty value
// The game prefers ManualDifficultySetting if present so this runs once per mission site
MissionState.ManualDifficultySetting = GetMissionDifficulty(MissionState.Source);
`log("Wrote randomized difficulty setting" @ MissionState.ManualDifficultySetting @ "Mission" @ MissionState.ObjectID, true, 'ALVariety');
return MissionState.ManualDifficultySetting;
}
static function int GetMissionDifficulty(name MissionSource)
{
local TDateTime StartDate;
local int MonthDiff;
local int index;
local array<DiffWeights> Weights;
local array<int> DiffOptions;
class'X2StrategyGameRulesetDataStructures'.static.SetTime(StartDate, 0, 0, 0, class'X2StrategyGameRulesetDataStructures'.default.START_MONTH,
class'X2StrategyGameRulesetDataStructures'.default.START_DAY, class'X2StrategyGameRulesetDataStructures'.default.START_YEAR);
MonthDiff = class'X2StrategyGameRulesetDataStructures'.static.DifferenceInMonths(class'XComGameState_GeoscapeEntity'.static.GetCurrentTime(), StartDate);
index = default.MissionMonthDifficultyWeights.Find('MissionSource', MissionSource);
// Source specific weights override defaults
if (index != INDEX_NONE)
{
`log("Using custom weights for" @ MissionSource @ "at index" @ index);
Weights = default.MissionMonthDifficultyWeights[index].MonthDifficultyWeights;
}
else
{
`log("Using default weights weights for" @ MissionSource);
Weights = default.DefaultMonthDifficultyWeights;
}
DiffOptions = GetDiffOptionsForMonth(MonthDiff, Weights);
`log("Mission difficulty options" @ ArrayToString(DiffOptions) @ "Month" @ MonthDiff, true, 'ALVariety');
return DiffOptions[`SYNC_RAND_STATIC(DiffOptions.Length)];
}
static function array<int> GetDiffOptionsForMonth(int Month, array<DiffWeights> Weights)
{
local array<int> Result;
// Clamp month so we don't access weights out of bounds
Month = Clamp(Month, 0, Weights.Length - 1);
// Construct the final weighted array of difficulties
// 1 being easy, 4 being very difficult
AddEntries(Result, 1, Weights[Month].Diff1);
AddEntries(Result, 2, Weights[Month].Diff2);
AddEntries(Result, 3, Weights[Month].Diff3);
AddEntries(Result, 4, Weights[Month].Diff4);
return Result;
}
static function AddEntries(out array<int> Result, int Value, int Count)
{
local int i;
for (i = 0; i < Count; i++)
{
Result.AddItem(Value);
}
}
static function string ArrayToString(array<int> arr)
{
local int i;
local string result;
for (i = 0; i < arr.Length; i++)
{
result @= arr[i];
}
return result;
}
Editor is loading...
Leave a Comment