Untitled
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