Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        public int ConvertLevelSubsToTotal_FromPositiveTestCases_ReturnsCorrectFact(IPerkScheme perkScheme,
                                                                                    int primaryLevel, int subLevel)
        {
            // ACT
            var factTotal = PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel);

            // ASSERT
            return(factTotal);
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 8
0
        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);
 }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 12
0
        private static bool CheckLevelCap(IPerk perk)
        {
            var currentLevel = perk.CurrentLevel;

            if (currentLevel == null)
            {
                return(false);
            }

            return(!PerkHelper.HasNextLevel(perk.Scheme, currentLevel));
        }
Ejemplo n.º 13
0
        public void ConvertLevelSubsToTotal_FromExceptionTestCases_ThrowsException(IPerkScheme perkScheme,
                                                                                   int primaryLevel, int subLevel)
        {
            // ACT
            Action act = () =>
            {
                PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel);
            };

            act.Should().Throw <Exception>();
        }
Ejemplo n.º 14
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        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;
        }
Ejemplo n.º 20
0
        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);
        }
Ejemplo n.º 22
0
        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);
        }
Ejemplo n.º 23
0
        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;
        }
Ejemplo n.º 24
0
 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);
            }
Ejemplo n.º 27
0
        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);
        }
Ejemplo n.º 28
0
        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;
        }
Ejemplo n.º 29
0
        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);
        }