private static void GetDailyTributePaid(IFaction faction, StanceLink __instance, ref int ____dailyTributeFrom1To2) { if (__instance.PeaceDeclarationDate.ElapsedDaysUntilNow > 50) { ____dailyTributeFrom1To2 = 0; } }
public static void DetermineSupport(MakePeaceKingdomDecision __instance, ref float __result, Clan clan, DecisionOutcome possibleOutcome) { var test1 = new PeaceBarterable(__instance.Kingdom, __instance.FactionToMakePeaceWith, CampaignTime.Years(1f)).GetValueForFaction(clan); //InformationManager.DisplayMessage(new InformationMessage(__instance.FactionToMakePeaceWith.Name.ToString() + ":" + test1.ToString())); var shouldPeaceBeDeclared = (bool)possibleOutcome.GetType().GetField("ShouldPeaceBeDeclared", BindingFlags.Instance | BindingFlags.Public).GetValue(possibleOutcome); if (DiplomacySetting.Instance.EnableMakePeaceStrategyPlus) { var atWars = (from x in clan.Kingdom.Stances where x.IsAtWar && x.Faction1.IsKingdomFaction && x.Faction2.IsKingdomFaction select x).ToArray <StanceLink>(); //var plus = 2 * atWars.Length * (float)(new PeaceBarterable(__instance.Kingdom, __instance.FactionToMakePeaceWith, CampaignTime.Years(1f)).GetValueForFaction(clan)) * Campaign.Current.Models.DiplomacyModel.DenarsToInfluence(); var plus = 1f; var settlementsOccupyed = DiplomacySetting.GetFactionSettlementOccupyedByFaction(clan.MapFaction, __instance.FactionToMakePeaceWith).Sum(a => a.IsCastle ? 2 : 3); plus *= settlementsOccupyed == 0 ? 0f : (float)Math.Sqrt(settlementsOccupyed); StanceLink stanceWith = clan.MapFaction.GetStanceWith(__instance.FactionToMakePeaceWith); var toDays = stanceWith.WarStartDate.ElapsedDaysUntilNow; //兼容旧档 if (toDays > 2000) { Traverse.Create(stanceWith).Property("WarStartDate").SetValue(CampaignTime.Now); toDays = stanceWith.WarStartDate.ElapsedDaysUntilNow; } var daysFactor = Math.Min(9, toDays < 20 ? 1 : toDays / 20f); var factor = Math.Max(0, daysFactor - plus); var clanMercy = clan.Leader.GetTraitLevel(DefaultTraits.Mercy) * 20; if (shouldPeaceBeDeclared) { __result += Math.Abs(__result) / 10 * (factor) + clanMercy; } else { // __result -= Math.Abs(__result) / 10 * (resultFactor) - clanMercy; } } if (__instance.ProposerClan == Clan.PlayerClan && DiplomacySetting.Instance.RelationEffectOfMakePeaceDecision > 0 && __result >= 0) { var relation = CharacterRelationManager.GetHeroRelation(Hero.MainHero, clan.Leader); relation = relation > 0 ? relation : 0; if (shouldPeaceBeDeclared) { __result += Math.Abs(__result) * DiplomacySetting.Instance.RelationEffectOfMakePeaceDecision * relation / 100f; } else { __result -= Math.Abs(__result) * DiplomacySetting.Instance.RelationEffectOfMakePeaceDecision / 10 * relation / 100f; } } }
public KingdomWarItemVMExtensionVM(StanceLink stanceLink, Action <KingdomWarItemVM> onSelect, Action <KingdomWarItemVM> onAction) : base(stanceLink, onSelect, onAction) { this.SendMessengerActionName = new TextObject("{=cXfcwzPp}Send Messenger").ToString(); this.InfluenceCost = (int)DiplomacyCostCalculator.DetermineInfluenceCostForMakingPeace(Faction1 as Kingdom); this.GoldCost = DiplomacyCostCalculator.DetermineGoldCostForMakingPeace(this.Faction1 as Kingdom, this.Faction2 as Kingdom); this.ActionName = GameTexts.FindText("str_kingdom_propose_peace_action", null).ToString(); UpdateDiplomacyProperties(); }
public static bool IsAlliedWith(this IFaction faction1, IFaction faction2) { if (faction1 == null || faction2 == null || faction1 == faction2) { return(false); } StanceLink stanceLink = faction1.GetStanceWith(faction2); return(stanceLink.IsAllied); }
private void UpdateDailyWarExhaustion(Tuple <Kingdom, Kingdom> kingdoms) { StanceLink stanceLink = kingdoms.Item1.GetStanceWith(kingdoms.Item2); if (stanceLink?.IsAtWar ?? false && (float)Math.Round(stanceLink.WarStartDate.ElapsedDaysUntilNow) >= 1.0f) { AddDailyWarExhaustion(kingdoms); } else { RemoveDailyWarExhaustion(kingdoms); } }
public KingdomWarItemVMExtensionVM(StanceLink stanceLink, Action <KingdomWarItemVM> onSelect, Action <KingdomWarItemVM> onAction) : base(stanceLink, onSelect, onAction) { this.SendMessengerActionName = new TextObject("{=cXfcwzPp}Send Messenger").ToString(); HybridCost costForMakingPeace = DiplomacyCostCalculator.DetermineCostForMakingPeace(Faction1 as Kingdom, Faction2 as Kingdom, true); this.InfluenceCost = (int)costForMakingPeace.InfluenceCost.Value; this.GoldCost = (int)costForMakingPeace.GoldCost.Value; this.ActionName = GameTexts.FindText("str_kingdom_propose_peace_action", null).ToString(); this.AllianceText = new TextObject("{=zpNalMeA}Alliances").ToString(); this.WarsText = new TextObject("{=y5tXjbLK}Wars").ToString(); this.PactsText = new TextObject("{=noWHMN1W}Non-Aggression Pacts").ToString(); UpdateDiplomacyProperties(); }
public override float CalculateWarSuccessScore(Kingdom decidingKingdom, IFaction factionAtWar) { if (factionAtWar.IsKingdomFaction) { StanceLink stanceWith = decidingKingdom.GetStanceWith(factionAtWar); int decidingKingdomScore = stanceWith.GetSuccessfulSieges(decidingKingdom) * 1000 + factionAtWar.Heroes.Count(h => h.IsPrisoner && h.PartyBelongedToAsPrisoner?.MapFaction == decidingKingdom) * 100 + stanceWith.GetSuccessfulRaids(decidingKingdom) * 25 + stanceWith.GetCasualties(factionAtWar); int factionAtWarScore = stanceWith.GetSuccessfulSieges(factionAtWar) * 1000 + decidingKingdom.Heroes.Count(h => h.IsPrisoner && h.PartyBelongedToAsPrisoner?.MapFaction == factionAtWar) * 100 + stanceWith.GetSuccessfulRaids(factionAtWar) * 25 + stanceWith.GetCasualties(decidingKingdom); return(decidingKingdomScore - factionAtWarScore); } return(0); }
//CalculateTributeFactor private double CalculateTributeFactor(DecisionMaker decisionMaker, IFaction factionToChangeStateWith, int dailyTributeToBePaid = 0) { bool atWar = decisionMaker.Hero.MapFaction.IsAtWarWith(factionToChangeStateWith); StanceLink stanceWith = decisionMaker.Hero.MapFaction.GetStanceWith(factionToChangeStateWith); dailyTributeToBePaid = atWar ? dailyTributeToBePaid : stanceWith.GetDailyTributePaid(decisionMaker.Hero.MapFaction); double GetReputationScoreModifierAtWar() => dailyTributeToBePaid *CalculateWarSuccessScore(decisionMaker.Hero.Clan.Kingdom, factionToChangeStateWith) >= 0 //Tribute is being demanded from the winning faction ? CalculateWarSuccessScore(decisionMaker.Hero.Clan.Kingdom, factionToChangeStateWith) >= 0 //Deciding kingdom is winning ? GetTraitLevelModifier(decisionMaker.Hero.GetTraitLevel(DefaultTraits.Valor) * 2 + decisionMaker.Hero.GetTraitLevel(DefaultTraits.Calculating) - decisionMaker.Hero.GetTraitLevel(DefaultTraits.Generosity), 2) : GetTraitLevelModifier(-decisionMaker.Hero.GetTraitLevel(DefaultTraits.Honor) - decisionMaker.Hero.GetTraitLevel(DefaultTraits.Generosity)) : 1.0; double GetReputationScoreModifierAtPeace() => GetTraitLevelModifier(-decisionMaker.Hero.GetTraitLevel(DefaultTraits.Honor) - decisionMaker.Hero.GetTraitLevel(DefaultTraits.Generosity)); double weightedDailyTribute = dailyTributeToBePaid * (atWar ? GetReputationScoreModifierAtWar() : GetReputationScoreModifierAtPeace()) * 0.25 //This is reputational consideration part (uses faction tribute as whole) + (dailyTributeToBePaid * deCalculateShareFactor(decisionMaker.Hero.Clan) //This is clan financial consideration part (assesses clan income) * GetTraitLevelModifier(decisionMaker.Hero.GetTraitLevel(DefaultTraits.Calculating) - decisionMaker.Hero.GetTraitLevel(DefaultTraits.Generosity))); return(Campaign.Current.Models.DiplomacyModel.GetValueOfDailyTribute((int)weightedDailyTribute) * Campaign.Current.Models.DiplomacyModel.DenarsToInfluence()); }
private static void UpdateDiplomacyProperties(KingdomDiplomacyItemVM __instance, ref IFaction ____playerKingdom, ref IFaction ___Faction1, ref IFaction ___Faction2, ref string ____faction2Name) { StanceLink stanceWith = ____playerKingdom.GetStanceWith(___Faction2); if (stanceWith.IsNeutral) { var days = (int)stanceWith.PeaceDeclarationDate.ElapsedDaysUntilNow; if (stanceWith.GetDailyTributePaid(____playerKingdom) != 0) { var paid = -stanceWith.GetDailyTributePaid(____playerKingdom); __instance.Faction2Name = $"{___Faction2.Name.ToString()}({paid}$/d)({days}d)"; } else { __instance.Faction2Name = ___Faction2.Name.ToString() + (days < 10000 ? $"({days}d)" : ""); } } else { var days = (int)stanceWith.WarStartDate.ElapsedDaysUntilNow; __instance.Faction2Name = ___Faction2.Name.ToString() + (days < 10000 ? $"({days}d)" : ""); } }
private static void ApplyInternal(IFaction faction1, IFaction faction2, int dailyTributeFrom1To2) { StanceLink stanceWith = faction1.GetStanceWith(faction2); Traverse.Create(stanceWith).Field("_peaceDeclarationDate").SetValue(CampaignTime.Now); }