static bool Prefix(PartyBase party, float renownValueOfBattle, float contributionShare, StatExplainer explanation, ref float __result) { bool patched = false; try { if (party.LeaderHero != null && party.LeaderHero == Hero.MainHero) { ExplainedNumber stat; stat = new ExplainedNumber((renownValueOfBattle * contributionShare) * Settings.Instance.BattleRenownMultiplier, explanation); if (party.IsMobile) { if (party.MobileParty.HasPerk(DefaultPerks.TwoHanded.Notorious)) { PerkHelper.AddPerkBonusForParty(DefaultPerks.TwoHanded.Notorious, party.MobileParty, ref stat); } if (party.MobileParty.HasPerk(DefaultPerks.Charm.ShowYourScars)) { PerkHelper.AddPerkBonusForParty(DefaultPerks.Charm.ShowYourScars, party.MobileParty, ref stat); } } __result = stat.ResultNumber; patched = true; } } catch (Exception ex) { MessageBox.Show($"An error occurred during DefaultBattleRewardModelPatch. Reverting to original behaviour...\n\nException:\n{ex.Message}\n\n{ex.InnerException?.Message}\n\n{ex.InnerException?.InnerException?.Message}"); } return(!patched); }
private bool CheckLevelCap(IPerk perk) { var currentLevel = perk.CurrentLevel; if (currentLevel == null) { return(false); } var nextLevel = PerkHelper.GetNextLevel(perk.Scheme, currentLevel); var maxLevel = perk.Scheme.Levels.Length - 1; var nextLevelOutOfRange = nextLevel.Primary > maxLevel; if (nextLevelOutOfRange) { return(true); } else { var currentSubLevelIsMax = currentLevel.Sub >= perk.Scheme.Levels[currentLevel.Primary].MaxValue; if (currentSubLevelIsMax) { return(true); } else { return(false); } } }
static bool Prefix(ref float __result, Hero hero) { if (hero == Hero.MainHero || hero.Spouse == Hero.MainHero || hero.Clan.Leader == Hero.MainHero) { float num = 0.0f; if (hero.Spouse != null && hero.Age >= (double)SettingClass.Instance.MinPregnantAge && hero.Age <= (double)SettingClass.Instance.MaxPregnantAge && SettingClass.Instance.DailyPregnancyChanceOfTheMC - 0.0f >= 0.09f) { ExplainedNumber bonuses = new ExplainedNumber(1f, new StringBuilder("The chance of hero being pregnant")); PerkHelper.AddPerkBonusForCharacter(DefaultPerks.Medicine.PerfectHealth, hero.Clan.Leader.CharacterObject, ref bonuses); num = (float)bonuses.ResultNumber * 0.001f + SettingClass.Instance.DailyPregnancyChanceOfTheMC; if (num >= 1.0f) { num = 1.0f; } } __result = num; return(false); } return(true); }
static bool Prefix(PartyBase party, float renownValueOfBattle, float contributionShare, StatExplainer explanation, ref float __result) { bool patched = false; try { var battleRenownMultiplier = 1f; if (Settings.Instance.BattleRewardApplyToAI || party.LeaderHero != null && party.LeaderHero == Hero.MainHero) { battleRenownMultiplier = Settings.Instance.BattleRenownMultiplier; } var stat = new ExplainedNumber((renownValueOfBattle * contributionShare) * battleRenownMultiplier, explanation); //TODO:: Implement this the same as native in next game update //if (party.IsMobile && party.MobileParty.HasPerk(DefaultPerks.Charm.ShowYourScars)) //{ // PerkHelper.AddPerkBonusForParty(DefaultPerks.Charm.ShowYourScars, party.MobileParty, ref stat); //} if (party.IsMobile && party.Leader != null && party.Leader.HeroObject != null && party.LeaderHero.GetPerkValue(DefaultPerks.Charm.ShowYourScars)) { PerkHelper.AddPerkBonusForParty(DefaultPerks.Charm.ShowYourScars, party.MobileParty, true, ref stat); } __result = stat.ResultNumber; patched = true; } catch (Exception ex) { MessageBox.Show($"An error occurred during DefaultBattleRewardModelRenownPatch. Reverting to original behaviour...\n\nException:\n{ex.Message}\n\n{ex.InnerException?.Message}\n\n{ex.InnerException?.InnerException?.Message}"); } return(!patched); }
public int ConvertLevelSubsToTotal_FromPositiveTestCases_ReturnsCorrectFact(IPerkScheme perkScheme, int primaryLevel, int subLevel) { // ACT var factTotal = PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel); // ASSERT return(factTotal); }
public void HasNextLevel_FromNegativeTestCases_AlwaysReturnsFalse(IPerkScheme perkScheme, PerkLevel currentLevel) { // ACT var factHasNextLevel = PerkHelper.HasNextLevel(perkScheme, currentLevel); // ASSERT factHasNextLevel.Should().BeFalse(); }
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; }
private static PerkLevel GetFirstOrNextLevel(IPerk perk) { if (perk.CurrentLevel is null) { // Perk is not leveled yet return(new PerkLevel(1, 1)); } return(PerkHelper.GetNextLevel(perk.Scheme, perk.CurrentLevel)); }
private void AddGarrisonOwnerPerkEffects( Settlement currentSettlement, ref ExplainedNumber result) { if (currentSettlement == null || !currentSettlement.IsTown) { return; } PerkHelper.AddPerkBonusForTown(DefaultPerks.TwoHanded.GarrisonCapacity, currentSettlement.Town, ref result); }
public void GetNextLevel_FromTestCases_ReturnsCorrectNextLevel(IPerkScheme perkScheme, PerkLevel currentLevel, PerkLevel expectedNextLevel) { // ACT var nextLevel = PerkHelper.GetNextLevel(perkScheme, currentLevel); // ASSERT nextLevel.Primary.Should().Be(expectedNextLevel.Primary); nextLevel.Sub.Should().Be(expectedNextLevel.Sub); }
public override float GetDailyChanceOfPregnancyForHero(Hero hero) { try { // Changed to message rather than exception. // if (hero == null) throw new ArgumentNullException(nameof(hero)); if (hero == null) { InformationManager.DisplayMessage(new InformationMessage($"An error occurred during GetDailyChanceOfPregnancyForHero. (No hero)")); // Debug // InformationManager.DisplayMessage(new InformationMessage("Hero is:" + hero.Name + "\nSpouse is:" + hero.Spouse.Name + "\nSpouse's Spouse is:" + hero.Spouse.Spouse.Name)); return(0); } if (!Settings.Instance.DailyChancePregnancyTweakEnabled) { return(base.GetDailyChanceOfPregnancyForHero(hero)); } float num = 0.0f; if (!Settings.Instance.PlayerCharacterFertileEnabled && HeroIsMainOrSpouseOfMain(hero)) { return(num); } if (Settings.Instance.MaxChildrenTweakEnabled && hero.Children != null && hero.Children.Any() && hero.Children.Count >= Settings.Instance.MaxChildren) { return(num); } if (hero.Spouse != null && hero.IsFertile && IsHeroAgeSuitableForPregnancy(hero)) { ExplainedNumber bonuses = new ExplainedNumber(1f, null); PerkHelper.AddPerkBonusForCharacter(DefaultPerks.Medicine.PerfectHealth, hero.Clan.Leader.CharacterObject, false, ref bonuses); num = (float)((6.5 - ((double)hero.Age - Settings.Instance.MinPregnancyAge) * 0.23) * 0.02) * bonuses.ResultNumber; } if (hero.Children == null || !hero.Children.Any()) { num *= 3f; } else if (hero.Children.Count > 1) { num *= 2f; } return(num); } catch (Exception ex) { MessageBox.Show($"An error occurred during GetDailyChanceOfPregnancyForHero. Reverting to original behavior... \n\nException:\n{ex.Message}\n\n{ex.InnerException?.Message}\n\n{ex.InnerException?.Message}"); return(0); } }
private static bool CheckLevelCap(IPerk perk) { var currentLevel = perk.CurrentLevel; if (currentLevel == null) { return(false); } return(!PerkHelper.HasNextLevel(perk.Scheme, currentLevel)); }
public void ConvertLevelSubsToTotal_FromExceptionTestCases_ThrowsException(IPerkScheme perkScheme, int primaryLevel, int subLevel) { // ACT Action act = () => { PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel); }; act.Should().Throw <Exception>(); }
public void ConvertTotalLevelToLevelSubs_FromTestCases_ReturnsCorrectLevelAndSublevel(IPerkScheme perkScheme, int testedTotalLevel, int expectedLevel, int expectedSubLevel) { // ACT var isSuccess = PerkHelper.TryConvertTotalLevelToLevelSubs(perkScheme, testedTotalLevel, out var perkLevel); // ASSERT isSuccess.Should().BeTrue(); perkLevel.Primary.Should().Be(expectedLevel); perkLevel.Sub.Should().Be(expectedSubLevel); }
public static void Postfix(ref int __result, CharacterObject character, StatExplainer explanation) { var result = __result; var explainedNumber = new ExplainedNumber(result, explanation); var perk = ActivePatch._perk; PerkHelper.AddPerkBonusForCharacter(perk, character, ref explainedNumber); __result = MBMath.Round(explainedNumber.ResultNumber); }
private static float CalculateMoralGain(IEnumerable <PartyBase> attackers) { var moraleGain = new ExplainedNumber(4f); var perk = ActivePatch._perk; foreach (var attacker in attackers) { PerkHelper.AddPerkBonusForParty(perk, attacker.MobileParty, ref moraleGain); } return(moraleGain.ResultNumber); }
private static void ApplyPerkBonusToRaidHit(MapEvent __instance, float hitDamage) { var perk = ActivePatch._perk; var partyMemberHitDamage = new ExplainedNumber(hitDamage); foreach (var party in __instance.AttackerSide.Parties.Where(x => x.MobileParty != null)) { PerkHelper.AddPerkBonusForParty(perk, party.MobileParty, ref partyMemberHitDamage); } RaidingHelper.SetHitDamage(__instance, partyMemberHitDamage.ResultNumber); }
private static void ApplyPerkExtraRewardBonusToRaidHit(MapEvent __instance, float hitDamage) { var perk = ActivePatch._perk; var partyMemberHitDamage = new ExplainedNumber(hitDamage); foreach (var party in __instance.AttackerSide.Parties.Where(x => x.MobileParty != null)) { PerkHelper.AddPerkBonusForParty(perk, party.MobileParty, ref partyMemberHitDamage); } var damageBonus = partyMemberHitDamage.ResultNumber - partyMemberHitDamage.BaseNumber; RaidingHelper.SetHitDamage(__instance, partyMemberHitDamage.ResultNumber); RaidingHelper.IncreaseSettlementHitPoints(__instance, damageBonus); }
private static void CalculateBonusFlatHpAndRateFromPerk(SiegeEvent.SiegeEngineConstructionProgress justDeployedEngine, ISiegeEventSide sideSiegeEvent, out float bonusFlatHp, out float bonusHpRate) { var perk = ActivePatch._perk; var partyMemberHealth = new ExplainedNumber(justDeployedEngine.SiegeEngine.MaxHitPoints); var partyMemberRate = new ExplainedNumber(100); foreach (var siegeParty in sideSiegeEvent.SiegeParties.Where(x => x.MobileParty != null)) { PerkHelper.AddPerkBonusForParty(perk, siegeParty.MobileParty, ref partyMemberHealth); PerkHelper.AddPerkBonusForParty(perk, siegeParty.MobileParty, ref partyMemberRate); } bonusFlatHp = partyMemberHealth.ResultNumber - partyMemberHealth.BaseNumber; bonusHpRate = partyMemberRate.ResultNumber - partyMemberRate.BaseNumber; }
public void ConvertTotalLevel_TotalLevelFor6_Returns2Level1Sublevel() { //ARRANGE const int testedTotalLevel = 6; const int expectedLevel = 2; const int expectedSubLevel = 1; // ACT PerkHelper.ConvertTotalLevel(_perkScheme, testedTotalLevel, out var factLevel, out var factSubLevel); // ASSERT factLevel.Should().Be(expectedLevel); factSubLevel.Should().Be(expectedSubLevel); }
// Token: 0x06002010 RID: 8208 RVA: 0x00083220 File Offset: 0x00081420 private float GetWoundedModifier(int totalMenCount, int numWounded, MobileParty party) { numWounded -= totalMenCount / 4; if (numWounded <= 0) { return(0f); } if (totalMenCount == 0) { return(-0.5f); } float baseNumber = Math.Max(-0.8f, -0.05f * (float)numWounded / (float)totalMenCount); ExplainedNumber explainedNumber = new ExplainedNumber(baseNumber, null); PerkHelper.AddPerkBonusForParty(DefaultPerks.Medicine.MobileAid, party, ref explainedNumber); return(explainedNumber.ResultNumber); }
public void PerkLevelUp(IPerk perk) { var activePerkIsValid = Perks.Contains(perk); if (!activePerkIsValid) { throw new InvalidOperationException("Указанный перк не является активным для текущего актёра."); } var nextLevel = PerkHelper.GetNextLevel(perk.Scheme, perk.CurrentLevel); perk.CurrentLevel = nextLevel; UpdatePerks(); DoPerkArchieved(perk); }
public static void Postfix(ref float __result, Building building) { if (!building.BuildingType.IsDefaultProject) { return; } if (building.Town == null) { return; } var perk = ActivePatch._perk; var totalEffect = new ExplainedNumber(__result); PerkHelper.AddPerkBonusForTown(perk, building.Town, ref totalEffect); __result = totalEffect.ResultNumber; }
private void GetBattleXpBonusFromPerks(PartyBase party, ref ExplainedNumber xpToGain, CharacterObject troop) { if (party.IsMobile && party.MobileParty.LeaderHero != null) { if (!troop.IsArcher && party.MobileParty.HasPerk(DefaultPerks.OneHanded.Trainer, true)) { xpToGain.AddFactor(DefaultPerks.OneHanded.Trainer.SecondaryBonus * 0.01f, DefaultPerks.OneHanded.Trainer.Name); } if (troop.IsInfantry) { if (party.MobileParty.HasPerk(DefaultPerks.OneHanded.CorpsACorps, false)) { xpToGain.AddFactor(DefaultPerks.OneHanded.CorpsACorps.PrimaryBonus * 0.01f, DefaultPerks.OneHanded.CorpsACorps.Name); } if (party.MobileParty.HasPerk(DefaultPerks.TwoHanded.BaptisedInBlood, true)) { xpToGain.AddFactor(DefaultPerks.TwoHanded.BaptisedInBlood.SecondaryBonus * 0.01f, DefaultPerks.TwoHanded.BaptisedInBlood.Name); } } if (party.MobileParty.HasPerk(DefaultPerks.OneHanded.LeadByExample, false)) { xpToGain.AddFactor(DefaultPerks.OneHanded.LeadByExample.PrimaryBonus * 0.01f, DefaultPerks.OneHanded.LeadByExample.Name); } if (party.MobileParty.HasPerk(DefaultPerks.Leadership.Companions, false)) { xpToGain.AddFactor(DefaultPerks.Leadership.Companions.PrimaryBonus * 0.01f, DefaultPerks.Leadership.Companions.Name); } if (troop.IsArcher && party.MobileParty.HasPerk(DefaultPerks.Crossbow.MountedCrossbowman, true)) { xpToGain.AddFactor(DefaultPerks.Crossbow.MountedCrossbowman.SecondaryBonus * 0.01f, DefaultPerks.Crossbow.MountedCrossbowman.Name); } } if (party.IsMobile && party.MobileParty.IsGarrison) { Settlement currentSettlement = party.MobileParty.CurrentSettlement; if (((currentSettlement != null) ? currentSettlement.Town.Governor : null) != null) { PerkHelper.AddPerkBonusForTown(DefaultPerks.TwoHanded.Yadomejutsu, party.MobileParty.CurrentSettlement.Town, ref xpToGain); if (troop.IsMounted) { PerkHelper.AddPerkBonusForTown(DefaultPerks.Polearm.Guards, party.MobileParty.CurrentSettlement.Town, ref xpToGain); } } } }
private async void Perks_SelectionChanged(object sender, SelectionChangedEventArgs e) { var page = runePage[Perks.SelectedItem.ToString()]; var perkHelper = new PerkHelper { PerkIds = page.SelectedPerkIds, PerkStyle = page.PrimaryStyleId, PerkSubStyle = page.SubStyleId, }; var data = await StaticVars.ActiveClient.RiotProxyCalls.DoLcdsProxyCallWithResponse("gamecustomization", "setgamecustomization", $"{{\"category\":\"perks\",\"content\":\"{JsonConvert.SerializeObject(perkHelper)}\",\"queueType\":{_queueId}}}"); Debugger.Log(0, "", data.Payload); //{"category":"perks","content":"","queueType":430} }
public override float GetDailyChanceOfPregnancyForHero(Hero hero) { float result = default; var isMeOrMySpouse = IsMeOrMySpouse(hero); var maxPregnancyAge = isMeOrMySpouse ? config.MaxPregnancyAgeForMeOrMySpouse ?? GetMaxPregnancyAge() : GetMaxPregnancyAge(); if (hero.Spouse != null && hero.IsFertile && IsHeroAgeSuitableForPregnancy(hero, maxPregnancyAge)) { var bonuses = new ExplainedNumber(1f); PerkHelper.AddPerkBonusForCharacter(DefaultPerks.Medicine.PerfectHealth, hero.Clan.Leader.CharacterObject, true, ref bonuses); result = (float)((6.5 - (hero.Age - MinPregnancyAge) * 0.230000004172325) * 0.0199999995529652) * bonuses.ResultNumber; if (hero.Children.Count == 0) { result *= 3f; } else if (hero.Children.Count == 1) { result *= 2f; } if (isMeOrMySpouse && config.AddDailyChanceOfPregnancyForMeOrMySpouseMultiple != 1) { result *= config.AddDailyChanceOfPregnancyForMeOrMySpouseMultiple; } else if (config.AddDailyChanceOfPregnancyForHeroMultiple != 1) { result *= config.AddDailyChanceOfPregnancyForHeroMultiple; } if (config.HasWin32Console()) { var hero_name = hero?.Name?.ToString(); var hero_culture = hero?.Culture?.Name?.ToString(); var spouce_name = hero?.Spouse?.Name?.ToString(); var spouce_culture = hero?.Spouse?.Culture?.Name?.ToString(); var one_culture = hero_culture == spouce_culture; Console.WriteLine( $"GetDailyChanceOfPregnancyForHero: {result}, isMeOrMySpouse: {isMeOrMySpouse}, " + $"{hero_name}({hero_culture}) & " + $"{spouce_name}{(!one_culture ? $"({spouce_culture})" : null)}" ); } } return(result); }
public static bool GetDailyHealingHpForHeroes(ref float __result, MobileParty party, StatExplainer explanation, TextObject ____settlementText, TextObject ____starvingText, TextObject ____bushDoctorPerkText) { ExplainedNumber explainedNumber = new ExplainedNumber(2f, explanation, null); SkillHelper.AddSkillBonusForParty(DefaultSkills.Medicine, DefaultSkillEffects.HealingRateBonus, party, ref explainedNumber); if (party.CurrentSettlement != null || party.LastVisitedSettlement != null && party.LastVisitedSettlement.IsVillage && party.LastVisitedSettlement.Position2D.DistanceSquared(party.Position2D) < 1f) { explainedNumber.Add(5f, ____settlementText); } if (!party.IsGarrison && !party.IsMilitia) { if (party.PartyMoveMode != MoveModeType.Hold) { PerkHelper.AddPerkBonusForParty(DefaultPerks.Medicine.WalkItOff, party, ref explainedNumber); } else { PerkHelper.AddPerkBonusForParty(DefaultPerks.Medicine.TriageTent, party, ref explainedNumber); } } if (party.Morale >= Campaign.Current.Models.PartyMoraleModel.HighMoraleValue) { PerkHelper.AddPerkBonusForParty(DefaultPerks.Medicine.BestMedicine, party, ref explainedNumber); } if (party.CurrentSettlement != null) { explainedNumber.Add(5f, ____settlementText); if (party.CurrentSettlement.IsTown && party.SiegeEvent == null && !party.CurrentSettlement.IsUnderSiege) { PerkHelper.AddPerkBonusForParty(DefaultPerks.Medicine.GoodLodging, party, ref explainedNumber); } } else if (!party.IsMoving && party.LastVisitedSettlement != null && party.LastVisitedSettlement.IsVillage && party.LastVisitedSettlement.Position2D.DistanceSquared(party.Position2D) < 1f && !party.IsRaiding && !party.LastVisitedSettlement.IsUnderRaid && party.HasPerk(DefaultPerks.Medicine.BushDoctor)) { explainedNumber.AddFactor(DefaultPerks.Medicine.BushDoctor.SecondaryBonus, ____bushDoctorPerkText); } if (party.Party.IsStarving && party.CurrentSettlement == null) { explainedNumber.Add(-5f, ____starvingText); } __result = explainedNumber.ResultNumber; return(false); }
private static void CalculateBonusDamageAndRates( SiegeEngineType siegeEngineType, ISiegeEventSide siegeEventSide, out float bonusRateOnly, out float bonusDamageOnly) { var perk = ActivePatch._perk; var baseDamage = siegeEngineType.Damage; var partyMemberDamage = new ExplainedNumber(baseDamage); var partyMemberRate = new ExplainedNumber(100f); var parties = siegeEventSide.SiegeParties.Where(x => x.MobileParty != null); foreach (var party in parties) { PerkHelper.AddPerkBonusForParty(perk, party.MobileParty, ref partyMemberRate); PerkHelper.AddPerkBonusForParty(perk, party.MobileParty, ref partyMemberDamage); } bonusRateOnly = partyMemberRate.ResultNumber - 100; bonusDamageOnly = partyMemberDamage.ResultNumber - baseDamage; }
public override float GetDailyChanceOfPregnancyForHero(Hero hero) { if (hero == null) { throw new ArgumentNullException(nameof(hero)); } if (!Settings.Instance.DailyChancePregnancyTweakEnabled) { return(base.GetDailyChanceOfPregnancyForHero(hero)); } float num = 0.0f; if (!Settings.Instance.PlayerCharacterFertileEnabled && HeroIsMainOrSpouseOfMain(hero)) { return(num); } if (Settings.Instance.MaxChildrenTweakEnabled && hero.Children != null && hero.Children.Any() && hero.Children.Count >= Settings.Instance.MaxChildren) { return(num); } if (hero.Spouse != null && hero.IsFertile && IsHeroAgeSuitableForPregnancy(hero)) { ExplainedNumber bonuses = new ExplainedNumber(1f, null); PerkHelper.AddPerkBonusForCharacter(DefaultPerks.Medicine.PerfectHealth, hero.Clan.Leader.CharacterObject, ref bonuses); num = (float)((6.5 - ((double)hero.Age - Settings.Instance.MinPregnancyAge) * 0.23) * 0.02) * bonuses.ResultNumber; } if (hero.Children == null || !hero.Children.Any()) { num *= 3f; } else if (hero.Children.Count > 1) { num *= 2f; } return(num); }
public override int CalculatePartyWage(MobileParty mobileParty, bool applyWithdrawals) { if (!mobileParty.IsActive || mobileParty.IsMilitia) { return(0); } int wages = mobileParty.GetTotalWage(1f, (StatExplainer)null); if (mobileParty.IsMainParty && (mobileParty.CurrentSettlement != null | mobileParty.LastVisitedSettlement.GetTrackDistanceToMainAgent() <= 2.0f)) { // player in settlement should have 2x wages so bring it half down wages /= 2; } else if (mobileParty.Party.Owner.Clan == Clan.PlayerClan && mobileParty.IsGarrison) { // player clan garrison has 2x wages so bring it half down wages /= 2; } else if (mobileParty.Party.Owner.Clan != Clan.PlayerClan) { // AI shouldn't have 4x wages so bring it back down wages /= 4; } if (mobileParty.IsGarrison) { wages = (int)((double)wages * 0.75); } ExplainedNumber bonuses = new ExplainedNumber((float)wages, (StringBuilder)null); if (mobileParty.CurrentSettlement != null && mobileParty.CurrentSettlement.IsTown) { PerkHelper.AddPerkBonusForTown(DefaultPerks.TwoHanded.ReducedWage, mobileParty.CurrentSettlement.Town, ref bonuses); } if (mobileParty.IsCaravan && mobileParty.LeaderHero != null && (mobileParty.Party.Owner.Clan.Leader != null && mobileParty.Party.Owner.Clan.Leader.GetPerkValue(DefaultPerks.Trade.CaravanMaster))) { PerkHelper.AddPerkBonusForCharacter(DefaultPerks.Trade.CaravanMaster, mobileParty.Party.Owner.Clan.Leader.CharacterObject, ref bonuses); } return((int)bonuses.ResultNumber); }