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);
        }
        public void mod_ForceFinalResolve(EventResult.MarginType margin, AlignmentMaskType?overrideAlignment = null)
        {
            if (!KingmakerPatchSettings.KingdomAlignment.Enabled && !KingmakerPatchSettings.KingdomEvents.MaximumEffort)
            {
                this.source_ForceFinalResolve(margin, overrideAlignment);
                return;
            }

            if (KingmakerPatchSettings.KingdomAlignment.Enabled)
            {
                string alignmentString = KingmakerPatchSettings.KingdomAlignment.Alignment.ToLowerInvariant();
                overrideAlignment = new_GetAlignment(alignmentString) ?? KingdomState.Instance.Alignment.ToMask();
            }

            if (!KingmakerPatchSettings.KingdomEvents.MaximumEffort)
            {
                this.source_ForceFinalResolve(margin, overrideAlignment);
                return;
            }

            EventResult.MarginType overrideMargin = this.new_GetOverrideMargin();

            if (overrideMargin == EventResult.MarginType.Success || overrideMargin == EventResult.MarginType.GreatSuccess)
            {
                this.source_ForceFinalResolve(overrideMargin, overrideAlignment);
                return;
            }

            this.source_ForceFinalResolve(margin, overrideAlignment);
        }
 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;
 }
        private EventResult.MarginType new_GetOverrideMargin()
        {
            KingdomTaskEvent associatedTask = this.AssociatedTask;

            var leaderType = LeaderType.None;

            if (associatedTask != null)
            {
                leaderType = associatedTask.AssignedLeader.Type;
            }

            EventResult.MarginType autoResolveType = this.EventBlueprint.AutoResolveResult;

            bool hasSolutions = this.EventBlueprint.Solutions.HasSolutions;

            if (!hasSolutions)
            {
                return(autoResolveType);
            }

            bool canSolve = this.EventBlueprint.Solutions.CanSolve(leaderType);

            if (!canSolve)
            {
                return(autoResolveType);
            }

            EventResult[] possibleResults = this.EventBlueprint.Solutions.GetResolutions(leaderType).Where(r => !string.IsNullOrEmpty(r.LocalizedDescription)).ToArray();

            if (possibleResults.Any(r => r.Margin == EventResult.MarginType.GreatSuccess))
            {
                return(EventResult.MarginType.GreatSuccess);
            }

            if (possibleResults.Any(r => r.Margin == EventResult.MarginType.Success))
            {
                return(EventResult.MarginType.Success);
            }

            return(autoResolveType);
        }
        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;

        }
 public void source_ForceFinalResolve(EventResult.MarginType margin, AlignmentMaskType?overrideAlignment = null)
 {
     throw new DeadEndException("source_ForceFinalResolve");
 }