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; } }
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; }
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); }
public static void GetEffectivePartyMorale(MobileParty mobileParty, StatExplainer explanation, ref float __result) { if (mobileParty?.IsMainParty ?? false) { __result += BannerlordCheatsSettings.Instance.ExtraPartyMorale; } }
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); }
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; } }
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)); }
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); } }
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)); }
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); }
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); }
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; }