private void mod_Resolve(int checkMargin, AlignmentMaskType alignment, LeaderType type) { if (!KingmakerPatchSettings.KingdomAlignment.Enabled && !KingmakerPatchSettings.KingdomEvents.MaximumEffort) { this.source_Resolve(checkMargin, alignment, type); return; } if (KingmakerPatchSettings.KingdomAlignment.Enabled) { string alignmentString = KingmakerPatchSettings.KingdomAlignment.Alignment.ToLowerInvariant(); alignment = new_GetAlignment(alignmentString) ?? alignment; } if (!KingmakerPatchSettings.KingdomEvents.MaximumEffort) { this.source_Resolve(checkMargin, alignment, type); return; } EventResult.MarginType overrideMargin = this.new_GetOverrideMargin(); if (overrideMargin == EventResult.MarginType.Success || overrideMargin == EventResult.MarginType.GreatSuccess) { checkMargin = EventResult.MarginToInt(overrideMargin); } this.source_Resolve(checkMargin, alignment, type); }
static string FormatResult(KingdomEvent kingdomEvent, EventResult.MarginType margin, AlignmentMaskType alignment, LeaderType leaderType) { string text = ""; var statChanges = CalculateEventResult(kingdomEvent, margin, alignment, leaderType); var statChangesText = statChanges.ToStringWithPrefix(" "); text += string.Format("{0}:{1}", margin, statChangesText == "" ? " No Change" : statChangesText); //TODO: Solution for presenting actions text += "\n"; return text; }
public static KingdomStats.Changes CalculateEventResult(KingdomEvent kingdomEvent, EventResult.MarginType margin, AlignmentMaskType alignment, LeaderType leaderType) { var checkMargin = EventResult.MarginToInt(margin); var result = new KingdomStats.Changes(); var m_TriggerChange = Traverse.Create(kingdomEvent).Field("m_TriggerChange").GetValue<KingdomStats.Changes>(); var m_SuccessCount = Traverse.Create(kingdomEvent).Field("m_SuccessCount").GetValue<int>(); BlueprintKingdomEvent blueprintKingdomEvent = kingdomEvent.EventBlueprint as BlueprintKingdomEvent; if (blueprintKingdomEvent && blueprintKingdomEvent.UnapplyTriggerOnResolve && m_TriggerChange != null) { result.Accumulate(m_TriggerChange.Opposite(), 1); } var resolutions = kingdomEvent.EventBlueprint.Solutions.GetResolutions(leaderType); if (resolutions == null) resolutions = Array.Empty<EventResult>(); foreach (var eventResult in resolutions) { var validConditions = eventResult.Condition == null || eventResult.Condition.Check(kingdomEvent.EventBlueprint); if (eventResult.MatchesMargin(checkMargin) && (alignment & eventResult.LeaderAlignment) != AlignmentMaskType.None && validConditions) { result.Accumulate(eventResult.StatChanges, 1); m_SuccessCount += eventResult.SuccessCount; } } if(checkMargin >= 0 && blueprintKingdomEvent != null) { result.Accumulate((KingdomStats.Type)leaderType, Game.Instance.BlueprintRoot.Kingdom.StatIncreaseOnEvent); } bool willBeFinished = true; if(blueprintKingdomEvent != null && blueprintKingdomEvent.IsRecurrent) { willBeFinished = m_SuccessCount >= blueprintKingdomEvent.Solutions.GetSuccessCount(leaderType); } if (willBeFinished) { var eventFinalResults = kingdomEvent.EventBlueprint.GetComponent<EventFinalResults>(); if(eventFinalResults != null && eventFinalResults.Results != null) { foreach(var eventResult in eventFinalResults.Results) { var validConditions = eventResult.Condition == null || eventResult.Condition.Check(kingdomEvent.EventBlueprint); if (eventResult.MatchesMargin(checkMargin) && (alignment & eventResult.LeaderAlignment) != AlignmentMaskType.None && validConditions) { result.Accumulate(eventResult.StatChanges, 1); } } } } return result; }
static void Postfix(KingdomUIEventWindow __instance, KingdomEventUIView kingdomEventView) { try { if (!Main.enabled) return; if (!Main.settings.previewEventResults) return; if (kingdomEventView.Task == null || kingdomEventView.Task.Event == null) { return; //Task is null on event results; } //Calculate results for current leader var solutionText = Traverse.Create(__instance).Field("m_Description").GetValue<TextMeshProUGUI>(); solutionText.text += "\n"; var leader = kingdomEventView.Task.AssignedLeader; if (leader == null) { solutionText.text += "<size=75%>Select a leader to preview results</size>"; return; } var blueprint = kingdomEventView.Blueprint; var solutions = blueprint.Solutions; var resolutions = solutions.GetResolutions(leader.Type); solutionText.text += "<size=75%>"; var leaderAlignmentMask = leader.LeaderSelection.Alignment.ToMask(); bool isValid(EventResult result) => (leaderAlignmentMask & result.LeaderAlignment) != AlignmentMaskType.None; var validResults = resolutions.Where(isValid); solutionText.text += "Leader " + leader.LeaderSelection.CharacterName + " - Alignment " + leaderAlignmentMask + "\n"; foreach (var eventResult in validResults) { solutionText.text += FormatResult(kingdomEventView.Task.Event, eventResult.Margin, leaderAlignmentMask, leader.Type); } //Calculate best result int bestResult = 0; KingdomStats.Changes bestEventResult = null; LeaderType bestLeader = 0; AlignmentMaskType bestAlignment = 0; foreach (var solution in solutions.Entries) { if (!solution.CanBeSolved) continue; foreach(var alignmentMask in solution.Resolutions.Select(s => s.LeaderAlignment).Distinct()) { var eventResult = CalculateEventResult(kingdomEventView.Task.Event, EventResult.MarginType.GreatSuccess, alignmentMask, solution.Leader); int sum = 0; for (int i = 0; i < 10; i++) sum += eventResult[(KingdomStats.Type)i]; if (sum > bestResult) { bestResult = sum; bestLeader = solution.Leader; bestEventResult = eventResult; bestAlignment = alignmentMask; } } } if (bestEventResult != null) { solutionText.text += "<size=50%>\n<size=75%>"; solutionText.text += "Best Result: Leader " + bestLeader + " - Alignment " + bestAlignment + "\n"; if (bestLeader == leader.Type && (leaderAlignmentMask & bestAlignment) != AlignmentMaskType.None) { solutionText.text += "<color=#308014>"; } else { solutionText.text += "<color=#808080>"; } solutionText.text += FormatResult(kingdomEventView.Task.Event, EventResult.MarginType.GreatSuccess, bestAlignment, bestLeader); solutionText.text += "</color>"; } solutionText.text += "</size>"; } catch (Exception ex) { Main.Error(ex); } }
private void source_Resolve(int checkMargin, AlignmentMaskType alignment, LeaderType type) { throw new DeadEndException("source_Resolve"); }