Untitled

 avatar
unknown
ini
6 months ago
3.9 kB
6
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