コード例 #1
0
            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);
                }
            }
コード例 #2
0
            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);
            }