public static void LeaveKingdomDebug(Clan clan)
        {
            if (!SettingsHelper.SystemDebugEnabled(AOSystems.EnsuredLoyalty, DebugType.General, clan))
            {
                return;
            }

            InDebugBranch = true;
            LeaveKingdomAsClanBarterable asClanBarterable = new LeaveKingdomAsClanBarterable(clan.Leader, null);
            int  ClanBarterableValueForFaction            = asClanBarterable.GetValueForFaction(clan);
            int  StayThreshold  = (Settings.Instance.FixMinorFactionVassals ? clan.IsUnderMercenaryService : clan.IsMinorFaction) ? 500 : 0;
            bool NativeDecision = ClanBarterableValueForFaction <= StayThreshold;

            TextObject ResultTextObject = new TextObject(Debug_Leave);

            StringHelper.SetEntitiyProperties(ResultTextObject, "LEAVING_CLAN", clan, true);
            StringHelper.SetNumericVariable(ResultTextObject, "LEAVE_BARTERABLE", ClanBarterableValueForFaction, "N0");
            StringHelper.SetNumericVariable(ResultTextObject, "LEAVE_THRESHOLD", StayThreshold, "N0");
            ResultTextObject.SetTextVariable("CLAN_DECISION", NativeDecision ? StayDecision : LeaveDecision);

            bool IsLoyaltyEnsured = LoyaltyManager.CheckLoyalty(clan, out TextObject LoyaltyTextObject);

            LoyaltyTextObject.SetTextVariable("TRANSITION_PART", NativeDecision == IsLoyaltyEnsured ? LoyaltyManager.TransitionFromSame : LoyaltyManager.TransitionFromDifferent);
            ResultTextObject.SetTextVariable("ENSURED_LOYALTY_RESULT", LoyaltyTextObject);

            MessageHelper.SimpleMessage(ResultTextObject);
            InDebugBranch = false;
        }
Beispiel #2
0
        private int GetScoreForKingdomToWithholdClan()
        {
            double RelativeScoreToLeave = new LeaveKingdomAsClanBarterable(LeavingClan.Leader, null).GetValueForFaction(LeavingClan) - (LeavingClan.IsMinorFaction ? 500 : 0);

            RelativeScoreToLeave = Math.Sqrt(Math.Abs(RelativeScoreToLeave)) * (RelativeScoreToLeave >= 0 ? -500 : 250); //invert it as negative is good for us
            double CostScore         = WithholdCost.InfluenceCost / Math.Max(0.001, LeavingClan.Kingdom.RulingClan.Influence) * WithholdCost.InfluenceCost * 1000 + WithholdCost.GoldCost / Math.Max(0.001, LeavingClan.Kingdom.Ruler.Gold) * WithholdCost.GoldCost;
            double ClanCountModifier = 0;

            foreach (Clan clan in LeavingClan.Kingdom.Clans)
            {
                if (clan != LeavingClan.Kingdom.RulingClan)
                {
                    int relationBetweenClans = FactionManager.GetRelationBetweenClans(LeavingClan.Kingdom.RulingClan, clan);
                    ClanCountModifier +=
                        1 * (clan.IsUnderMercenaryService ? 0.5 : 1) * (1.0 + (LeavingClan.Kingdom.Culture == clan.Culture ? 0.150000005960464 : -0.150000005960464))
                        * Math.Min(1.3, Math.Max(0.5, 1.0 + Math.Sqrt(Math.Abs(relationBetweenClans)) * (relationBetweenClans < 0 ? -0.03 : 0.02)));
                }
            }
            double RelativeStrengthModifier = LeavingClan.TotalStrength / (LeavingClan.Kingdom.TotalStrength - LeavingClan.Kingdom.RulingClan.TotalStrength);
            float  SettlementValue          = (TargetKingdom != null && TargetKingdom.IsAtWarWith(LeavingClan.Kingdom) && !LeavingClan.IsUnderMercenaryService) ? LeavingClan.CalculateSettlementValue(LeavingClan.Kingdom) : 0;
            double Result = (Campaign.Current.Models.DiplomacyModel.GetScoreOfKingdomToGetClan(LeavingClan.Kingdom, LeavingClan) + RelativeScoreToLeave) * (RelativeStrengthModifier + (LeavingClan.IsUnderMercenaryService ? 0.1 : 1)) + SettlementValue - CostScore * ClanCountModifier;

            if (SettingsHelper.SystemDebugEnabled(AOSystems.EnsuredLoyalty, DebugType.Technical, LeavingClan))
            {
                MessageHelper.TechnicalMessage($"Score for Kingdom {LeavingClan.Kingdom.Name} to withhold Clan {LeavingClan.Name}.\nRelativeScoreToLeave = {RelativeScoreToLeave:N}. CostScore = {CostScore:N}. ClanCountModifier = {ClanCountModifier}. ScoreOfKingdomToGetClan = {Campaign.Current.Models.DiplomacyModel.GetScoreOfKingdomToGetClan(LeavingClan.Kingdom, LeavingClan):N}. SettlementValue = {SettlementValue:N}. Result = {Result:N}.");
            }
            return((int)Result);
        }
        public static void Postfix(IFaction faction, ref int __result, LeaveKingdomAsClanBarterable __instance)
        {
            try
            {
                Hero    iOriginalOwner        = __instance.OriginalOwner;
                Clan    iOriginalOwnerClan    = iOriginalOwner.Clan;
                Kingdom iOriginalOwnerKingdom = iOriginalOwnerClan.Kingdom;

                if (!Settings.Instance !.FixMinorFactionVassals && (!LoyaltyDebugHelper.InDebugBranch || !SettingsHelper.SystemDebugEnabled(AOSystems.EnsuredLoyalty, DebugType.Technical, faction)))
                {
                    return;
                }

                IFaction mapFaction = iOriginalOwner.MapFaction;
                float    CalculatedResult;
                if (faction == __instance.OriginalOwner.Clan)
                {
                    CalculatedResult = __instance.OriginalOwner.Clan.IsUnderMercenaryService ? (int)Campaign.Current.Models.DiplomacyModel.GetScoreOfMercenaryToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom) : (int)Campaign.Current.Models.DiplomacyModel.GetScoreOfClanToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom);
                }
                else
                {
                    if (faction == mapFaction)
                    {
                        CalculatedResult = (float)((!iOriginalOwnerClan.IsUnderMercenaryService ? Campaign.Current.Models.DiplomacyModel.GetScoreOfClanToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom) : Campaign.Current.Models.DiplomacyModel.GetScoreOfMercenaryToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom)) * (faction == iOriginalOwnerClan || faction == iOriginalOwnerKingdom ? -1.0 : 1.0));
                    }
                    else
                    {
                        float clanStrength = Campaign.Current.Models.DiplomacyModel.GetClanStrength(iOriginalOwnerClan);
                        CalculatedResult = !faction.IsClan || !FactionManager.IsAtWarAgainstFaction(faction, iOriginalOwnerKingdom) ? (!FactionManager.IsAlliedWithFaction(faction, iOriginalOwnerKingdom) ? clanStrength * 0.01f : clanStrength * -0.5f) : clanStrength * 0.5f;
                    }
                }

                if (LoyaltyDebugHelper.InDebugBranch && SettingsHelper.SystemDebugEnabled(AOSystems.EnsuredLoyalty, DebugType.Technical))
                {
                    string UnitValueDebugInfo = string.Format("LeaveKingdom - UnitValueForFaction. faction: {0}. ScoreOfMercenaryToLeaveKingdom = {1}. ScoreOfClanToLeaveKingdom = {2}. CalculatedResult = {3}. Result = {4}",
                                                              faction.Name,
                                                              ((int)Campaign.Current.Models.DiplomacyModel.GetScoreOfMercenaryToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom)).ToString("N"),
                                                              ((int)Campaign.Current.Models.DiplomacyModel.GetScoreOfClanToLeaveKingdom(iOriginalOwnerClan, iOriginalOwnerKingdom)).ToString("N"),
                                                              CalculatedResult.ToString("N"), __result.ToString("N"));

                    MessageHelper.TechnicalMessage(UnitValueDebugInfo);
                }
                if (Settings.Instance.FixMinorFactionVassals)
                {
                    __result = (int)CalculatedResult;
                }
            }
            catch (Exception ex)
            {
                MethodInfo?methodInfo = MethodBase.GetCurrentMethod() as MethodInfo;
                DebugHelper.HandleException(ex, methodInfo, "Harmony patch for LeaveKingdomAsClanBarterable.GetUnitValueForFaction");
            }
        }
Beispiel #4
0
        private ComplexCost GetWithholdCost()
        {
            if (!SettingsHelper.SubSystemEnabled(SubSystemType.LoyaltyWithholding, LeavingClan))
            {
                return(null);
            }

            if (TargetKingdom != null)
            {
                JoinKingdomAsClanBarterable asClanBarterable = new JoinKingdomAsClanBarterable(LeavingClan.Leader, TargetKingdom);
                int ClanBarterableValueForClan    = asClanBarterable.GetValueForFaction(LeavingClan);
                int ClanBarterableValueForKingdom = asClanBarterable.GetValueForFaction(TargetKingdom);
                ClanBarterable = asClanBarterable;
                BarterableSum  = ClanBarterableValueForClan + ClanBarterableValueForKingdom;
            }
            else
            {
                LeaveKingdomAsClanBarterable asClanBarterable = new LeaveKingdomAsClanBarterable(LeavingClan.Leader, null);
                int ClanBarterableValueForFaction             = asClanBarterable.GetValueForFaction(LeavingClan);
                ClanBarterable = asClanBarterable;
                BarterableSum  = ClanBarterableValueForFaction - (LeavingClan.IsMinorFaction ? 500 : 0);
            }

            if (BarterableSum <= Settings.Instance.WithholdToleranceLimit * 1000000)
            {
                return(null);
            }
            BaseCalculatedCost = Math.Sqrt(BarterableSum) / Math.Log10(BarterableSum);

            return
                (new ComplexCost
                 (
                     (int)(BaseCalculatedCost * Settings.Instance.WithholdInfluenceMultiplier),
                     Settings.Instance.UseWithholdBribing && Settings.Instance.WithholdToleranceLimitForBribes * 1000000 < BarterableSum ? (int)BaseCalculatedCost * Settings.Instance.WithholdGoldMultiplier : 0
                 ));
        }
Beispiel #5
0
        public static void Postfix(IFaction factionForEvaluation, int __result, JoinKingdomAsClanBarterable __instance)
        {
            try
            {
                Hero iOriginalOwner     = __instance.OriginalOwner;
                Clan iOriginalOwnerClan = iOriginalOwner.Clan;

                if (!LoyaltyDebugHelper.InDebugBranch || !SettingsHelper.SystemDebugEnabled(AOSystems.EnsuredLoyalty, DebugType.Technical, new List <IFaction>()
                {
                    factionForEvaluation, iOriginalOwnerClan
                }))
                {
                    return;
                }

                Kingdom   iOriginalOwnerKingdom = iOriginalOwnerClan.Kingdom;
                Kingdom   iTargetKingdom        = __instance.TargetKingdom;
                PartyBase iOriginalParty        = __instance.OriginalParty;
                //Hero leader = iOriginalOwner.MapFaction.Leader;

                float CalculatedResult = -1000000f;
                int   valueForFaction  = 0;
                float settlementValue  = 0f;

                float ScoreOfClanToJoinKingdom = Campaign.Current.Models.DiplomacyModel.GetScoreOfClanToJoinKingdom(iOriginalOwnerClan, iTargetKingdom);
                float ScoreOfKingdomToGetClan  = Campaign.Current.Models.DiplomacyModel.GetScoreOfKingdomToGetClan(iTargetKingdom, iOriginalOwnerClan);

                if (iTargetKingdom.IsKingdomFaction)
                {
                    if (factionForEvaluation == iOriginalOwnerClan)
                    {
                        CalculatedResult = ScoreOfClanToJoinKingdom;
                        if (iOriginalOwnerKingdom != null)
                        {
                            valueForFaction = new LeaveKingdomAsClanBarterable(iOriginalOwner, iOriginalParty).GetValueForFaction(factionForEvaluation);
                            if (!iTargetKingdom.IsAtWarWith(iOriginalOwnerKingdom))
                            {
                                settlementValue   = iOriginalOwnerClan.CalculateSettlementValue(iOriginalOwnerKingdom);
                                CalculatedResult -= settlementValue;
                            }
                            CalculatedResult += valueForFaction;
                        }
                    }
                    else if (factionForEvaluation.MapFaction == iTargetKingdom)
                    {
                        CalculatedResult = ScoreOfKingdomToGetClan;
                    }
                }
                string UnitValueDebugInfo = string.Format("JoinKingdom - UnitValueForFaction. factionForEvaluation: {0}." +
                                                          " ScoreOfClanToJoinKingdom = {1}. GetScoreOfKingdomToGetClan = {2}. ValueForFaction = {3}. SettlementValue = {4}. CalculatedResult = {5}. NativeResult = {6}",
                                                          (factionForEvaluation != null) ? factionForEvaluation.Name.ToString() : "is null",
                                                          ScoreOfClanToJoinKingdom.ToString("N"),
                                                          ScoreOfKingdomToGetClan.ToString("N"),
                                                          valueForFaction.ToString("N"), settlementValue.ToString("N"), CalculatedResult.ToString("N"), __result.ToString("N"));

                MessageHelper.TechnicalMessage(UnitValueDebugInfo);
            }
            catch (Exception ex)
            {
                MethodInfo methodInfo = MethodBase.GetCurrentMethod() as MethodInfo;
                DebugHelper.HandleException(ex, methodInfo, "Harmony patch for JoinKingdomAsClanBarterable.GetUnitValueForFaction");
            }
        }