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 static bool Prefix(KingdomUIEventWindow __instance, KingdomEventUIView kingdomEventView) { var blueprint = kingdomEventView.Blueprint; __instance.m_Description.text = blueprint.LocalizedDescription; __instance.m_Disposables.Add(__instance.m_Description.SetLinkTooltip(null, null, default(TooltipConfig))); var isActive = kingdomEventView.IsCrusadeEvent && kingdomEventView.IsFinished; __instance.m_ResultDescription.gameObject.SetActive(isActive); if (isActive) { var currentEventSolution = __instance.m_Footer.CurrentEventSolution; if (currentEventSolution?.ResultText != null) { var resultDescription = __instance.m_ResultDescription; var currentEventSolution2 = __instance.m_Footer.CurrentEventSolution; resultDescription.text = ((currentEventSolution2 != null) ? currentEventSolution2.ResultText : null); __instance.m_Disposables.Add(__instance.m_ResultDescription.SetLinkTooltip(null, null, default(TooltipConfig))); } else { __instance.m_ResultDescription.text = string.Empty; } } var blueprintKingdomProject = blueprint as BlueprintKingdomProject; string mechanicalDescription = ((blueprintKingdomProject != null) ? blueprintKingdomProject.MechanicalDescription : null); if (settings.previewDecreeResults) { var eventResults = blueprintKingdomProject.Solutions.GetResolutions(blueprintKingdomProject.DefaultResolutionType); if (eventResults != null) { foreach (var result in eventResults) { if (result.Actions != null && result.Actions.Actions.Length > 0) { mechanicalDescription += $"\n<size=67%><b>Results Preview </b>\n{string.Join("\n", result.Actions.Actions.Select(c => c.GetCaption())).MergeSpaces(true)}</size>"; } } } } // RelicInfo code borrowed (with permission from Rathtr) from https://www.nexusmods.com/pathfinderwrathoftherighteous/mods/200 var projectType = kingdomEventView.ProjectBlueprint.ProjectType; if (settings.previewRelicResults //&& projectType == KingdomProjectType.Relics && blueprint.ElementsArray.Find(elem => elem is KingdomActionStartEvent) is KingdomActionStartEvent e && e.Event is BlueprintCrusadeEvent crusadeEvent ) { // this relic event starts another event on completion var allRelicProjects = // todo: cache this? from ev in Game.Instance.BlueprintRoot.Kingdom.KingdomProjectEvents where ev.Get().ProjectType == KingdomProjectType.Relics select ev.Get(); BlueprintCrusadeEvent subEvent = null; foreach (var relicProject in allRelicProjects) { if (relicProject.TriggerCondition.HasConditions && relicProject.TriggerCondition.Conditions.First() is FlagUnlocked unlockedFlag) { var conditionFlag = unlockedFlag.ConditionFlag; if (blueprint.ElementsArray.Exists(elem => elem is KingdomActionStartEvent actE && actE.Event.ElementsArray.Exists(elem2 => elem2 is UnlockFlag unlockFlag && unlockFlag.flag == conditionFlag ) ) && relicProject.ElementsArray.Find(elem => elem is KingdomActionStartEvent) is KingdomActionStartEvent subActionEvent && subActionEvent.Event is BlueprintCrusadeEvent subBp && subBp.EventSolutions.Length >= 1 && (subEvent = subBp) != null) { break; } } } var solStrings = "\n\n"; for (var i = 0; i < crusadeEvent.EventSolutions.Length; ++i) { var sol = crusadeEvent.EventSolutions[i]; if (sol.IsAvail) { solStrings += sol.PreviewText(); } if (subEvent != null) { var finalSols = from subEventSol in subEvent.EventSolutions where subEventSol.m_AvailConditions.HasConditions && subEventSol.m_AvailConditions.Conditions[0] is FlagUnlocked flagUnlockCond && sol.m_SuccessEffects.Actions.ToList().Find(act => act is UnlockFlag) is UnlockFlag intermediateFlagUnlocked && intermediateFlagUnlocked.flag == flagUnlockCond.ConditionFlag select subEventSol; if (finalSols.Count() > 1) { solStrings += " leads to\n".SizePercent(75); } foreach (var endSolution in finalSols) { solStrings += $" {endSolution.PreviewText()}\n"; } } else { solStrings += "\n"; } } __instance.m_Description.text += solStrings.SizePercent(87); } __instance.m_Disposables.Add(__instance.m_Description.SetLinkTooltip()); __instance.m_ResultDescription.gameObject.SetActive(isActive); if (isActive && __instance.m_Footer.CurrentEventSolution?.ResultText != null) { __instance.m_ResultDescription.text = (string)__instance.m_Footer.CurrentEventSolution?.ResultText; __instance.m_Disposables.Add(__instance.m_ResultDescription.SetLinkTooltip()); } else { __instance.m_ResultDescription.text = string.Empty; } __instance.m_MechanicalDescription.text = mechanicalDescription; __instance.m_MechanicalDescription.gameObject.SetActive((blueprintKingdomProject?.MechanicalDescription) != null); __instance.m_Disposables.Add(__instance.m_MechanicalDescription.SetLinkTooltip(null, null, default)); return(false); }