public static void Postfix(PartyBase party, StatExplainer explanation, ref int __result)
        {
            XmlNode settings = ClanTweakerSubModule.settings.xmlSettings.ChildNodes[1].SelectSingleNode("PartySizeSettings");

            bool flag;

            if (settings.SelectSingleNode("AffectClanParties").InnerText == "true")
            {
                flag = party.LeaderHero != null && (party.LeaderHero == Hero.MainHero || party.LeaderHero.Clan.Name == Hero.MainHero.Clan.Name);
            }
            else
            {
                flag = party.LeaderHero != null && party.LeaderHero == Hero.MainHero;
            }


            if (party.LeaderHero != null && party.LeaderHero == Hero.MainHero)
            {
                SkillObject leadership = SkillObject.FindFirst((SkillObject x) => x.Name.ToString() == "Leadership");
                SkillObject steward    = SkillObject.FindFirst((SkillObject x) => x.Name.ToString() == "Steward");

                int num = (int)Math.Ceiling((double)party.LeaderHero.GetSkillValue(leadership) * float.Parse(settings.SelectSingleNode("LeadershipBonus").InnerText) * 0.25f);
                __result += num;
                if (explanation != null)
                {
                    explanation.AddLine("Leadership bonus", (float)num, StatExplainer.OperationType.Add);
                }
                num       = (int)Math.Ceiling((double)party.LeaderHero.GetSkillValue(steward) * float.Parse(settings.SelectSingleNode("StewardBonus").InnerText) * 0.25f);
                __result += num;
                if (explanation != null)
                {
                    explanation.AddLine("Steward bonus", (float)num, StatExplainer.OperationType.Add);
                }
            }
        }
        public override float CalculateMilitiaChange(Settlement settlement, StatExplainer explanation = null)
        {
            float           baseVal = base.CalculateMilitiaChange(settlement, explanation);
            ExplainedNumber en      = new ExplainedNumber(0f, explanation);

            en.Add(baseVal);
            try
            {
                if (Settings.Instance.SettlementMilitiaBonusEnabled)
                {
                    if (settlement.IsCastle)
                    {
                        en.Add(Settings.Instance.CastleMilitiaBonus, new TextObject("Recruitment drive"));
                    }
                    if (settlement.IsTown)
                    {
                        en.Add(Settings.Instance.TownMilitiaBonus, new TextObject("Citizen militia"));
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"An error occurred in TweakedSettlementMilitiaModule:\n\n{ex.ToStringFull()}");
            }
            return(en.ResultNumber);
        }
 public static void GetPartyMemberSizeLimit(PartyBase party, StatExplainer explanation, ref int __result)
 {
     if (party?.Leader?.IsPlayerCharacter ?? false)
     {
         __result += BannerlordCheatsSettings.Instance.ExtraPartyMemberSize;
     }
 }
Пример #4
0
        private static void Postfix(
            DefaultPartySpeedCalculatingModel __instance,
            ref MobileParty mobileParty,
            ref float baseSpeed,
            ref StatExplainer explanation,
            ref float __result)
        {
            TerrainType faceTerrainType = Campaign.Current.MapSceneWrapper.GetFaceTerrainType(mobileParty.CurrentNavigationFace);

            if (faceTerrainType == TerrainType.Forest &&
                mobileParty.Leader != null &&
                mobileParty.Leader.GetFeatValue(DefaultFeats.Cultural.BattanianForestAgility))
            {
                var explainedNumber = new ExplainedNumber(baseSpeed, explanation, null);

                var movingAtForestEffectField = AccessTools.Field(typeof(DefaultPartySpeedCalculatingModel), "MovingAtForestEffect");
                var movingAtForestEffect      = (float)movingAtForestEffectField.GetValue(__instance);

                var battanianAgilityBonus =
                    DefaultFeats.Cultural.BattanianForestAgility.EffectBonus * Math.Abs(movingAtForestEffect);

                explainedNumber.AddFactor(battanianAgilityBonus, DefaultFeats.Cultural.BattanianForestAgility.Name);

                __result = explainedNumber.ResultNumber;
            }
        }
        private static void Postfix(ref float __result, Village village, StatExplainer explanation)
        {
            var perk = ActivePatch._perk;

            if (!(village.Bound?.OwnerClan?.Leader?.GetPerkValue(perk) ?? false))
            {
                return;
            }

            var explainedNumber = new ExplainedNumber(__result, explanation);

            if (!(__result > -0.0001f) || !(__result < 0.0001f) && explanation.Lines.Count > 0)
            {
                explanation.Lines.RemoveAt(explanation.Lines.Count - 1);
            }

            var extra = explanation.Lines.Where(line => line.Number > 0).Sum(line => line.Number);

            if (extra < float.Epsilon)
            {
                return;
            }

            explainedNumber.Add(extra * perk.PrimaryBonus - extra, perk.Name);
            __result = explainedNumber.ResultNumber;
        }
        private static void Postfix(ref int __result, MobileParty party, StatExplainer explanation)
        {
            var perk = ActivePatch._perk;
            var hero = party.LeaderHero;

            if (hero == null || hero.Clan?.Kingdom?.RulingClan?.Leader != hero)
            {
                return;
            }

            if (!hero.GetPerkValue(perk))
            {
                return;
            }

            var kingdomClans = hero.Clan?.Kingdom?.Clans;

            if (kingdomClans == null)
            {
                return;
            }

            var extra = (int)Math.Max(0, (kingdomClans.Count() - 1) * perk.PrimaryBonus);

            if (extra <= 0)
            {
                return;
            }

            var explainedNumber = new ExplainedNumber(__result, explanation);

            explainedNumber.Add(extra, perk.Name);
            __result = (int)explainedNumber.ResultNumber;
        }
Пример #7
0
        private static int CalculateGarrisonChangeInternal(Settlement settlement, StatExplainer explanation = null)
        {
            ExplainedNumber explainedNumber = new ExplainedNumber(0f, explanation, null);

            if (settlement.IsTown || settlement.IsCastle)
            {
                float loyalty = settlement.Town.Loyalty;
                if (settlement.IsStarving)
                {
                    float foodChange = settlement.Town.FoodChange;
                    int   num        = (settlement.Town.Owner.IsStarving && foodChange < -19f) ? ((int)((foodChange + 10f) / 10f)) : 0;
                    explainedNumber.Add((float)num, WangSettlementGarrisonModel._foodShortageText, null);
                }
                if (settlement.Town.GarrisonParty != null && ((float)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + explainedNumber.ResultNumber) / (float)settlement.Town.GarrisonParty.Party.PartySizeLimit > settlement.Town.GarrisonParty.PaymentRatio)
                {
                    int num2 = 0;
                    do
                    {
                        num2++;
                    }while (((float)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + explainedNumber.ResultNumber - (float)num2) / (float)settlement.Town.GarrisonParty.Party.PartySizeLimit >= settlement.Town.GarrisonParty.PaymentRatio && (float)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + explainedNumber.ResultNumber - (float)num2 > 0f && num2 < 20);
                    explainedNumber.Add((float)(-(float)num2), WangSettlementGarrisonModel._paymentIsLess, null);
                }
            }
            WangSettlementGarrisonModel.GetSettlementGarrisonChangeDueToIssues(settlement, ref explainedNumber);
            return((int)explainedNumber.ResultNumber);
        }
        public override float CalculateProsperityChange(Town fortification, StatExplainer explanation = null)
        {
            var result = base.CalculateProsperityChange(fortification, explanation);

            if (fortification.Owner.IsStarving || result < 0)
            {
                return(result);
            }

            var prosperity = fortification.Owner.Settlement.Prosperity;

            ExplainedNumber explainedNumber = new ExplainedNumber(0f, explanation, null);
            float           foodChange      = Campaign.Current.Models.SettlementFoodModel.CalculateTownFoodStocksChange(fortification, null);

            if (foodChange < -1 && Math.Abs(fortification.FoodStocks / foodChange) < 20 && prosperity < 1000 && result > 1)
            {
                explainedNumber.Add(-result, _surplusFoodText);
            }
            else if (SettlementSetting.Instance.boostProsperityGrowth > 0)
            {
                var factor = SettlementSetting.Instance.boostProsperityGrowth * result > 1 ? result : 1;
                explainedNumber.Add((float)factor, _surplusFoodText);
            }


            var r = result + explainedNumber.ResultNumber;

            if (prosperity > 11000 && r > 1f)
            {
                explainedNumber.Add((int)Math.Sqrt(r) - r, _surplusFoodText);
            }

            return(result + explainedNumber.ResultNumber);
        }
Пример #9
0
 public static void GetEffectivePartyMorale(MobileParty mobileParty, StatExplainer explanation, ref float __result)
 {
     if (mobileParty?.IsMainParty ?? false)
     {
         __result += BannerlordCheatsSettings.Instance.ExtraPartyMorale;
     }
 }
Пример #10
0
        private static void Postfix(ref float __result, Town fortification, StatExplainer explanation)
        {
            var perk = ActivePatch._perk;
            var hero = fortification.Settlement?.OwnerClan?.Leader;

            if (hero == null || !hero.GetPerkValue(perk) ||
                fortification.Settlement.Parties.Count(x => x.LeaderHero == fortification.Settlement.OwnerClan.Leader) <= 0)
            {
                return;
            }

            var explainedNumber = new ExplainedNumber(__result, explanation);

            if (explanation.Lines.Count > 0)
            {
                explanation.Lines.RemoveAt(explanation.Lines.Count - 1);
            }

            var extra = explanation.Lines.Where(line => line.Number > 0).Sum(line => line.Number);

            if (extra < float.Epsilon)
            {
                return;
            }

            explainedNumber.Add(extra * perk.PrimaryBonus - extra, perk.Name);
            __result = explainedNumber.ResultNumber;
        }
        private static int CalculateGarrisonChangeInternal(
            Settlement settlement,
            StatExplainer explanation = null)
        {
            ExplainedNumber result = new ExplainedNumber(0.0f, explanation, (TextObject)null);

            if (settlement.IsTown || settlement.IsCastle)
            {
                double loyalty = (double)settlement.Town.Loyalty;
                if (settlement.IsStarving)
                {
                    float foodChange = settlement.Town.FoodChange;
                    int   num        = !settlement.Town.Owner.IsStarving || (double)foodChange >= -19.0 ?
                                       0 : (int)(((double)foodChange + 10.0) * SubModule.Settings.garrisonFoodConsumpetionMultiplier / 10.0);

                    result.Add((float)num, LightSettlementGarrisonModel._foodShortageText);
                }
                if (settlement.Town.GarrisonParty != null && ((double)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + (double)result.ResultNumber) / (double)settlement.Town.GarrisonParty.Party.PartySizeLimit > (double)settlement.Town.GarrisonParty.PaymentRatio)
                {
                    int num = 0;
                    do
                    {
                        ++num;
                    }while (((double)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + (double)result.ResultNumber - (double)num) / (double)settlement.Town.GarrisonParty.Party.PartySizeLimit >= (double)settlement.Town.GarrisonParty.PaymentRatio && (double)settlement.Town.GarrisonParty.Party.NumberOfHealthyMembers + (double)result.ResultNumber - (double)num > 0.0 && num < 20);
                    result.Add((float)-num, LightSettlementGarrisonModel._paymentIsLess);
                }
            }
            LightSettlementGarrisonModel.GetSettlementGarrisonChangeDueToIssues(settlement, ref result);
            return((int)result.ResultNumber);
        }
            /* Both of the daily healing rate postfix patches have exactly the same body, so
             * this does all the work for them:
             */
            internal static void GetDailyHealing(StatExplainer explanation, ref float __result)
            {
                if (!Main.Settings !.EnableHealingTweaks || __result <= 0f)
                {
                    return;
                }

                // Our factors to apply to [hopefully] final values
                float configFactor   = Main.Settings.HealingRateFactor;
                float timeMultFactor = 1f / (float)Math.Pow(Main.Settings.TimeMultiplier, 0.35);

                // Healing Rate Adjustment Factor
                float newHealFromConfig = __result * configFactor;
                float offsetFromConfig  = newHealFromConfig - __result;

                if (!Util.NearEqual(offsetFromConfig, 0f, 1e-2f))
                {
                    new ExplainedNumber(offsetFromConfig, explanation, ConfigAdjustmentExplanation);
                    __result += offsetFromConfig;
                }

                // Time Multiplier
                float newHealFromTimeMult = __result * timeMultFactor;
                float offsetFromTimeMult  = newHealFromTimeMult - __result;

                if (!Util.NearEqual(offsetFromTimeMult, 0f, 1e-2f))
                {
                    new ExplainedNumber(offsetFromTimeMult, explanation, TimeMultAdjustmentExplanation);
                    __result += offsetFromTimeMult;
                }

                __result = (float)Math.Round(__result, 2);
            }
Пример #13
0
        public override float GetEffectivePartyMorale(MobileParty mobileParty, StatExplainer explanation = null)
        {
            ExplainedNumber explainedNumber;

            if (mobileParty.IsMainParty)
            {
                explainedNumber = new ExplainedNumber(30f, explanation, (TextObject)null); // Changed from 50f to 30f
            }
            else
            {
                explainedNumber = new ExplainedNumber(50f, explanation, (TextObject)null);
            }

            explainedNumber.Add(mobileParty.RecentEventsMorale, this._recentEventsText);
            this.GetMoraleEffectsFromSkill(mobileParty, ref explainedNumber);
            if (mobileParty.Party.IsStarving)
            {
                explainedNumber.Add((float)this.GetStarvationMoralePenalty(mobileParty), this._starvationMoraleText);
            }
            if ((double)mobileParty.HasUnpaidWages > 0.0)
            {
                explainedNumber.Add(mobileParty.HasUnpaidWages * (float)this.GetNoWageMoralePenalty(mobileParty), this._noWageMoraleText);
            }
            this.CalculateFoodVarietyMoraleBonus(mobileParty, ref explainedNumber);
            this.GetPartySizeMoraleEffect(mobileParty, ref explainedNumber);
            return(explainedNumber.ResultNumber);
        }
 static void Postfix(MobileParty party, StatExplainer explanation, ref int __result)
 {
     if (party.IsCaravan && party.Party?.Owner != null && party.Party.Owner == Hero.MainHero)
     {
         __result = Settings.Instance.PlayerCaravanPartySize;
     }
 }
Пример #15
0
        public override float CalculateLoyaltyChange(Town town, StatExplainer explanation = null)
        {
            ExplainedNumber explainedNumber = new ExplainedNumber(0.0f, explanation, (TextObject)null);
            SettlementInfo  info            = RevolutionBehaviour.GetSettlementInformation(town.Settlement);

            if (!town.IsTown)
            {
                return(explainedNumber.ResultNumber + base.CalculateLoyaltyChange(town, explanation));
            }

            if (info.Settlement.MapFaction.Leader == Hero.MainHero)
            {
                explainedNumber.Add(_basePlayerLoyalty, GameTexts.FindText("str_loyalty_bannerlord"));

                if (ModOptions.OptionsData.PlayerAffectedByOverextension && ModOptions.OptionsData.OverextensionMechanics)
                {
                    Overextension(info, ref explainedNumber);
                }
            }
            else
            {
                BaseLoyalty(info, ref explainedNumber);

                if (ModOptions.OptionsData.OverextensionMechanics)
                {
                    Overextension(info, ref explainedNumber);
                }
            }

            return(explainedNumber.ResultNumber + base.CalculateLoyaltyChange(town, explanation));
        }
Пример #16
0
        private static void Postfix(ref int __result, MobileParty party, StatExplainer explanation)
        {
            var perk = ActivePatch._perk;

            if (!(party.LeaderHero?.GetPerkValue(perk) ?? false))
            {
                return;
            }

            var extra = party.LeaderHero.Clan.Settlements.Count() * perk.PrimaryBonus;

            if (extra < float.Epsilon)
            {
                return;
            }

            var explainedNumber = new ExplainedNumber(__result, explanation);
            var baseLine        = explanation?.Lines.Find(x => x.Name == "Base");

            if (baseLine != null)
            {
                explanation.Lines.Remove(baseLine);
            }

            explainedNumber.Add(party.LeaderHero.Clan.Settlements.Count() * perk.PrimaryBonus, perk.Name);
            __result = (int)explainedNumber.ResultNumber;
        }
 public static void GetPartySpottingRange(MobileParty party, StatExplainer explainer, ref float __result)
 {
     if (party?.IsMainParty ?? false)
     {
         __result *= BannerlordCheatsSettings.Instance.MapVisibilityFactor;
     }
 }
 public static void Postfix(ref int __result, MobileParty mobileParty, StatExplainer explanation = null)
 {
     if (mobileParty.IsGarrison)
     {
         __result = (int)(__result * SubModule.Settings.GarrisonWagesMultiplier);
     }
 }
        public static void Postfix(ref float __result, MobileParty party, StatExplainer explainer)
        {
            //For now only do hero
            if (party.LeaderHero == Hero.MainHero)
            {
                if (party.Scout != null)
                {
                    var sk = party.Scout.GetSkillValue(DefaultSkills.Scouting);
                    if (sk > 0)
                    {
                        var mod = 1.0f - ((float)sk / 300.0f);
                        if (mod < 0.1f)
                        {
                            mod = 0.1f;
                        }

                        mod = MBRandom.RandomFloatRanged(mod, 1.0f);
                        var orig      = __result;
                        var deduction = (orig - ((__result * mod))) * -1f;;

                        ExplainedNumber en = new ExplainedNumber(__result, explainer);
                        explainer?.Lines.Remove(explainer.Lines.Last());
                        var textObject = new TextObject("{FIRST_NAME} scouted for food.", null);
                        textObject.SetTextVariable("FIRST_NAME", party.Scout.FirstName);
                        //textObject.SetTextVariable("REDUCTION_AMOUNT", (orig-__result).ToString());
                        en.Add(deduction, textObject);
                        __result = en.ResultNumber;
                    }
                }
            }
        }
        public override float CalculateTownFoodStocksChange(Town town, StatExplainer explanation = null)
        {
            float baseVal = base.CalculateTownFoodStocksChange(town, explanation);

            if (Settings.Instance.SettlementFoodBonusEnabled)
            {
                try
                {
                    ExplainedNumber en = new ExplainedNumber(baseVal, explanation);
                    explanation?.Lines.Remove(explanation.Lines.Last());

                    if (town.IsCastle)
                    {
                        en.Add(Settings.Instance.CastleFoodBonus, new TextObject("Military rations"));
                    }
                    else if (town.IsTown)
                    {
                        en.Add(Settings.Instance.TownFoodBonus, new TextObject("Citizen food drive"));
                    }

                    return(en.ResultNumber);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"An error occurred in TweakedSettlementFoodModel: {ex.ToStringFull()}");
                    return(baseVal);
                }
            }
            else
            {
                return(baseVal);
            }
        }
Пример #21
0
        public static void Postfix(ref float __result, Clan clan, StatExplainer explanation)
        {
            var refContainer = new RefContainer <float>(__result);

            MercenaryContractCampaignEvents.Instance.OnCalculateInfluenceChange(refContainer, clan, explanation);
            __result = refContainer.Value;
        }
 public static void CalculateLearningRate(Hero hero, SkillObject skill, StatExplainer explainer, ref float __result)
 {
     if (hero?.IsHumanPlayerCharacter ?? false)
     {
         __result *= BannerlordCheatsSettings.Instance.LearningRateMultiplier;
     }
 }
 public static void CalculateInventoryCapacity(MobileParty mobileParty, StatExplainer explanation, int additionalTroops, int additionalSpareMounts, int additionalPackAnimals, bool includeFollowers, ref int __result)
 {
     if (mobileParty?.IsMainParty ?? false)
     {
         __result += BannerlordCheatsSettings.Instance.ExtraInventoryCapacity;
     }
 }
 public override int GetPartyMemberSizeLimit(PartyBase party, StatExplainer explanation = null)
 {
     if (!party.IsMobile)
     {
         return(0);
     }
     return(party.MobileParty.IsGarrison ? this.CalculateGarrisonPartySizeLimit(party.MobileParty, explanation) : this.CalculateMobilePartyMemberSizeLimit(party.MobileParty, explanation));
 }
Пример #25
0
 public static void PostFix2(ref StatExplainer __result, MobileParty __instance)
 {
     if (__instance != null && __instance.LeaderHero != null &&
         BuffManager.Instance.IsBuffCurrentlyActiveForHero(__instance.LeaderHero, "bannerbuff_partyspeedbuff_1"))
     {
         __result.AddLine("Active Speed Buff", 3f, StatExplainer.OperationType.Add);
     }
 }
        public static List <TooltipProperty> GetLearningRateTooltip(int attributeValue, int focusValue, int skillValue, int characterLevel, TextObject attributeName)
        {
            StatExplainer statExplainer = new StatExplainer();
            float         learningRate  = Campaign.Current.Models.CharacterDevelopmentModel.CalculateLearningRate(attributeValue, focusValue, skillValue, characterLevel, attributeName, statExplainer);
            var           ret           = (List <TooltipProperty>)Reworked_SkillsSubModule.GetTooltipForAccumulatingPropertyWithResult.Invoke(null, new object[] { _learningRateStr.ToString(), learningRate, statExplainer });

            return(ret);
        }
Пример #27
0
        public static StatExplainer MaxHitpointsExplanation(StatExplainer __result, CharacterObject __instance)
        {
            var bonuses = new CharacterAttributeBonuses(__instance);
            var bonusHP = (int)(__instance.MaxHitPoints() * bonuses.HPMultiplier / (1 + bonuses.HPMultiplier));

            __result.AddLine("Endurance modifier", bonusHP);
            return(__result);
        }
Пример #28
0
        private static void PartySizeLimitExplainerPatched(PartyBase __instance, ref StatExplainer __result)
        {
            var extra = BannerlordPatch.BannerlordPerkExtra(__instance.LeaderHero);

            if (extra > 0)
            {
                __result.AddLine("Bannerlord", extra);
            }
        }
        private static void PartySizeLimitExplainerPatched(PartyBase __instance, ref StatExplainer __result)
        {
            var extra = ManAtArmsPatch.ManAtArmsPerkExtra(__instance.LeaderHero);

            if (extra > 0)
            {
                __result.AddLine("Man-At-Arms", extra);
            }
        }
        public static void Postfix(ref float __result, Town town, StatExplainer explanation = null)
        {
            var perk    = ActivePatch._perk;
            var totalHP = new ExplainedNumber(__result, explanation);

            PerkHelper.AddPerkBonusForTown(perk, town, ref totalHP);

            __result = totalHP.ResultNumber;
        }