public void mod_OnStart()
        {
            if (!KingmakerPatchSettings.KingdomEvents.InstantComplete)
            {
                this.source_OnStart();
                return;
            }

            KingdomEventUIView previousView = this.alias_m_KingdomEventView;

            EventBus.RaiseEvent((IKingdomUIStartSpendTimeEvent h) => h.OnStartSpendTimeEvent(previousView.Blueprint));

            KingdomTaskEvent task = previousView.Task;

            EventBus.RaiseEvent((IKingdomUICloseEventWindow h) => h.OnClose());

            task?.Start(false);

            if (task == null || task.IsFinished || task.AssignedLeader == null || previousView.Blueprint.NeedToVisitTheThroneRoom)
            {
                return;
            }

            task.Event.Resolve(task);

            if (previousView.RulerTimeRequired <= 0)
            {
                return;
            }

            foreach (UnitEntityData unitEntityData in Kingmaker.Game.Instance.Player.AllCharacters)
            {
                RestController.ApplyRest(unitEntityData.Descriptor);
            }
        }
Пример #2
0
            public static void Postfix(KingdomEventUIView ___m_KingdomEventView, bool __state)
            {
                if (__state)
                {
                    EventBus.RaiseEvent((IKingdomUIStartSpendTimeEvent h) => h.OnStartSpendTimeEvent(___m_KingdomEventView.Blueprint));
                    KingdomTaskEvent kingdomTaskEvent = ___m_KingdomEventView?.Task;
                    EventBus.RaiseEvent((IKingdomUICloseEventWindow h) => h.OnClose());
                    kingdomTaskEvent?.Start(false);

                    if (kingdomTaskEvent == null)
                    {
                        return;
                    }

                    if (kingdomTaskEvent.IsFinished || kingdomTaskEvent.AssignedLeader == null || ___m_KingdomEventView.Blueprint.NeedToVisitTheThroneRoom)
                    {
                        return;
                    }

                    kingdomTaskEvent.Event.Resolve(kingdomTaskEvent);

                    if (___m_KingdomEventView.RulerTimeRequired <= 0)
                    {
                        return;
                    }
                    foreach (UnitEntityData unitEntityData in player.AllCharacters)
                    {
                        RestController.ApplyRest(unitEntityData.Descriptor);
                    }
                    new KingdomTimelineManager().MaybeUpdateTimeline();
                }
            }
        public void mod_OnClose()
        {
            if (!KingmakerPatchSettings.KingdomEvents.InstantComplete)
            {
                this.source_OnClose();
                return;
            }

            KingdomEventUIView previousView = this.alias_m_KingdomEventView;

            // deselects the view
            EventBus.RaiseEvent((IEventSceneHandler h) => h.OnEventSelected(null, this.alias_m_Cart));

            if (previousView == null)
            {
                return;
            }

            if (previousView.IsFinished || previousView.AssignedLeader == null || previousView.Blueprint.NeedToVisitTheThroneRoom)
            {
                return;
            }

            bool          inProgress = previousView.IsInProgress;
            BlueprintUnit leader     = previousView.AssignedLeader;

            if (!inProgress || leader == null)
            {
                return;
            }

            previousView.Event.Resolve(previousView.Task);

            if (previousView.RulerTimeRequired <= 0)
            {
                return;
            }

            foreach (UnitEntityData unitEntityData in Kingmaker.Game.Instance.Player.AllCharacters)
            {
                RestController.ApplyRest(unitEntityData.Descriptor);
            }
        }
Пример #4
0
            public static void Postfix(bool __state, KingdomEventUIView ___m_KingdomEventView, KingdomEventHandCartController ___m_Cart)
            {
                if (__state)
                {
                    if (___m_KingdomEventView != null)
                    {
                        EventBus.RaiseEvent((IEventSceneHandler h) => h.OnEventSelected(null, ___m_Cart));

                        if (___m_KingdomEventView.IsFinished || ___m_KingdomEventView.AssignedLeader == null || ___m_KingdomEventView.Blueprint.NeedToVisitTheThroneRoom)
                        {
                            return;
                        }

                        bool          inProgress = ___m_KingdomEventView.IsInProgress;
                        BlueprintUnit leader     = ___m_KingdomEventView.AssignedLeader.Blueprint;

                        if (!inProgress || leader == null)
                        {
                            return;
                        }

                        ___m_KingdomEventView.Event.Resolve(___m_KingdomEventView.Task);

                        if (___m_KingdomEventView.RulerTimeRequired <= 0)
                        {
                            return;
                        }

                        foreach (UnitEntityData unitEntityData in player.AllCharacters)
                        {
                            RestController.ApplyRest(unitEntityData.Descriptor);
                        }

                        new KingdomTimelineManager().MaybeUpdateTimeline();
                    }
                }
            }
 static bool Prefix(KingdomUIEventWindowFooter __instance, ref bool __result, KingdomEventUIView kingdomEventView, ref bool enable)
 {
     try
     {
         if (!Main.enabled)
         {
             return(true);
         }
         if (!Main.settings.currencyFallback)
         {
             return(true);
         }
         enable = false;
         if (kingdomEventView.Task == null)
         {
             __result = false;
             return(false);
         }
         if (kingdomEventView.Task.IsStarted)
         {
             __result = false;
             return(false);
         }
         enable = (kingdomEventView.Task.AssignedLeader != null);
         if (enable && kingdomEventView.CostInBP > 0)
         {
             enable = KingdomCurrencyFallback.CanSpend(kingdomEventView.CostInBP);
         }
         if (enable && !KingdomTimelineManager.CanAdvanceTime())
         {
             enable = !IsSpendRulerTimeDays(__instance);
         }
         __result = true;
         return(false);
     }
     catch (Exception ex)
     {
         Main.Error(ex);
         return(true);
     }
 }
            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);
                }
            }
Пример #7
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);
            }