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; }
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"); } }
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 )); }
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"); } }