private static void GetDailyTributePaid(IFaction faction, StanceLink __instance, ref int ____dailyTributeFrom1To2)
 {
     if (__instance.PeaceDeclarationDate.ElapsedDaysUntilNow > 50)
     {
         ____dailyTributeFrom1To2 = 0;
     }
 }
Esempio n. 2
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;
                }
            }
        }
Esempio n. 3
0
 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);
        }
Esempio n. 5
0
        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();
        }
Esempio n. 7
0
 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)" : "");
            }
        }
Esempio n. 10
0
        private static void ApplyInternal(IFaction faction1, IFaction faction2, int dailyTributeFrom1To2)
        {
            StanceLink stanceWith = faction1.GetStanceWith(faction2);

            Traverse.Create(stanceWith).Field("_peaceDeclarationDate").SetValue(CampaignTime.Now);
        }