public static float getDoNotReplenishGarrisonCorrectionMult(
            MobileParty mobileParty,
            Settlement settlement)
        {
            if (settlement.IsVillage || settlement.OwnerClan.Kingdom != mobileParty.LeaderHero.Clan.Kingdom)
            {
                return(1f);
            }
            float strengthPerWalledCenter = FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom);

            if (mobileParty.Army != null)
            {
                strengthPerWalledCenter *= 0.75f;
            }
            if (settlement.IsFortification && settlement.OwnerClan != Clan.PlayerClan)
            {
                float num1 = settlement.Town.GarrisonParty != null ? settlement.Town.GarrisonParty.Party.TotalStrength : 0.0f;
                float num2 = FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan);
                float num3 = FactionHelper.SettlementProsperityEffectOnGarrisonSizeConstant(settlement);
                float num4 = FactionHelper.SettlementFoodPotentialEffectOnGarrisonSizeConstant(settlement);
                float num5 = strengthPerWalledCenter * num2 * num3 * num4;
                if ((double)num1 < (double)num5)
                {
                    return((float)(1.0 / (1.0 + Math.Pow(1.0 - (double)num1 / (double)num5, 3.0) * 99.0)));
                }
            }
            return(1f);
        }
Exemplo n.º 2
0
            private static float GetWarMultForClan(Clan clan, Kingdom kingdom)
            {
                var campaignWars = Campaign.Current.FactionManager.FindCampaignWarsOfFaction(kingdom);

                if (campaignWars.Count == 0)
                {
                    return(1.0f);
                }

                // Start with the current raw kingdom strength. This represents total men, garrisons, etc.
                var totalKingdomScore    = kingdom.TotalStrength;
                var totalOppositionScore = FactionHelper.GetTotalEnemyKingdomPower(kingdom);

                // Add additional points for renown gained, raids, and sieges in the current wars.
                foreach (var campaignWar in campaignWars)
                {
                    FindSides(campaignWar, kingdom, out var kingdomSide, out var oppositionSide);

                    var(kingdomScore, oppositionScore) = CalculateWarScore(campaignWar, kingdomSide, oppositionSide);
                    totalKingdomScore    += kingdomScore;
                    totalOppositionScore += oppositionScore;
                }
                var warMult = totalKingdomScore / totalOppositionScore;

                if ((warMult < 1) &&
                    (clan.Culture == kingdom.Culture))
                {
                    // Clans do not leave their own culture when losing wars.
                    return(1.0f);
                }

                return(Clamp(warMult, 0, 1.5f));
            }
Exemplo n.º 3
0
 private void OnSessionLaunched(CampaignGameStarter starter)
 {
     if (Clan.PlayerClan.IsUnderMercenaryService)
     {
         Clan.PlayerClan.MercenaryAwardMultiplier = FactionHelper.GetMercenaryAwardFactorToJoinKingdom(Clan.PlayerClan, Clan.PlayerClan.Kingdom, false) * MercPayraiseConfig.MercPayMultiplierValue;
     }
 }
Exemplo n.º 4
0
        public override int FindNumberOfTroopsToTakeFromGarrison(MobileParty mobileParty, Settlement settlement, float defaultIdealGarrisonStrengthPerWalledCenter = 0f)
        {
            MobileParty garrisonParty = settlement.Town.GarrisonParty;

            if (garrisonParty != null)
            {
                float totalStrength = garrisonParty.Party.TotalStrength;
                float num           = (defaultIdealGarrisonStrengthPerWalledCenter > 0.1f) ? defaultIdealGarrisonStrengthPerWalledCenter : FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom, settlement.OwnerClan);
                float num2          = FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan);
                num *= num2;
                num *= (settlement.IsTown ? 2f : 1f);
                float num3 = (float)mobileParty.Party.PartySizeLimit * mobileParty.PaymentRatio;
                int   numberOfAllMembers = mobileParty.Party.NumberOfAllMembers;
                float num4 = num3 / (float)numberOfAllMembers;
                float num5 = (float)Math.Min(11.0, (double)num4 * Math.Sqrt((double)num4)) - 1f;
                float num6 = (float)Math.Pow((double)(totalStrength / num), 1.5);
                float num7 = (mobileParty.LeaderHero.Clan.Leader == mobileParty.LeaderHero) ? 2f : 1f;
                int   num8 = MBRandom.RoundRandomized(num5 * num6 * num7);
                int   num9 = 25;
                num9 *= (settlement.IsTown ? 2 : 1);
                if (num8 > garrisonParty.Party.MemberRoster.TotalRegulars - num9)
                {
                    num8 = garrisonParty.Party.MemberRoster.TotalRegulars - num9;
                }
                return(num8);
            }
            return(0);
        }
Exemplo n.º 5
0
    private string SaveLevelInfo()
    {
        string datas = "ID : " + m_levelID + "\n";

        datas += "Factions : " + FactionHelper.FactionsToString(m_faction) + "\n";

        return(datas);
    }
Exemplo n.º 6
0
    // Use this for initialization
    void Start()
    {
        m_numberOfSolarSystem = (uint)Random.Range(m_numberOfSolarSystemMin, m_numberOfSolarSystemMax);
        m_renderer            = GetComponentInChildren <SpriteRenderer>();
        m_renderer.color      = FactionHelper.GetFactionColor(GetMainFaction());
        transform.localScale  = new Vector3(0.1f, 0.1f, 1);

        m_animator = GetComponentInChildren <Animator>();
        m_collider = GetComponent <Collider2D>();

        CreateSystems();
        m_systemContainer.gameObject.SetActive(false);
    }
Exemplo n.º 7
0
    // Use this for initialization
    void Start()
    {
        m_numberOfPlanets = (uint)Random.Range(m_numberOfPlanetMin, m_numberOfPlanetMax);

        m_sunSize        = Random.Range(m_sunSizeMin, m_sunSizeMax);
        m_sunTemperature = Random.Range(m_sunTemperatureMin, m_sunTemperatureMax);
        m_sunColor       = Mathf.CorrelatedColorTemperatureToRGB(m_sunTemperature);

        m_animator = GetComponentInChildren <Animator>();

        m_sunRenderer.color = m_sunColor;

        m_auraRenderer.color = FactionHelper.GetFactionColor(GetMainFaction());
    }
Exemplo n.º 8
0
        public GumpFactions(NubiaPlayer _owner)
            : base("Factions & Réputations", 380, 405)
        {
            Closable = true;
            mOwner   = _owner;
            int y     = YBase;
            int x     = XBase;
            int line  = 0;
            int scale = 27;
            int decal = 5;

            if (mOwner == null)
            {
                return;
            }
            if (mOwner.ReputationStack == null)
            {
                return;
            }

            for (int i = 0; i < (int)FactionEnum.Maximum; i++)
            {
                FactionEnum faction = (FactionEnum)i;
                if (mOwner.ReputationStack.Reputations.ContainsKey(faction))
                {
                    BaseFaction fac = FactionHelper.getFaction(faction);
                    if (fac != null)
                    {
                        ReputationEnum reput = ReputationEnum.Neutre;
                        int            val   = mOwner.ReputationStack.getReputation(faction);
                        reput = FactionHelper.getReputForVal(val);
                        AddImage(x, line * scale + y - 3, 2440);
                        AddLabel(x + 10, y + line * scale, ColorText, fac.Name);

                        AddImage(x + 180, line * scale + y - 3, 2440);
                        AddLabel(x + 190, y + line * scale, FactionHelper.getHueForReput(reput), FactionHelper.getNameForReput(reput));
                        line++;
                    }
                }
            }
        }
Exemplo n.º 9
0
            public override float GetScoreOfKingdomToGetClan(Kingdom kingdom, Clan clan)
            {
                var numClanHeroes           = clan.CommanderHeroes.Count;
                var existingHeroesInKingdom = GetNumberOfHeroesInKingdom(kingdom);

                if ((numClanHeroes == 0) ||
                    (existingHeroesInKingdom == 0))
                {
                    return(-1E+08f);
                }

                // Start with a basis of 0.
                var valueProposition = 0.0f;

                // Add value for the settlements the clan will bring to the kingdom, and the adjusted clan strength.
                // Adjusted clan strength is the clan strength ~ how badly the kingdom needs allies.
                var clanStrength        = GetClanStrength(clan, numClanHeroes);
                var powerRatioToEnemies = FactionHelper.GetPowerRatioToEnemies(kingdom);
                var howBadlyDoesThisKingdomNeedSupport = 1f / Clamp(powerRatioToEnemies > 1 ? (float)Math.Sqrt(powerRatioToEnemies) : powerRatioToEnemies, 0.1f, 2.5f);
                var adjustedClanStrength = clanStrength * howBadlyDoesThisKingdomNeedSupport;

                valueProposition += clan.CalculateSettlementValue(kingdom) * 0.1f + adjustedClanStrength;

                // Increase the value for happier relations.
                var relationMult = Clamp(1.0f + 0.0199999995529652f * FactionManager.GetRelationBetweenClans(kingdom.RulingClan, clan), 0.33f, 2f);

                valueProposition *= relationMult;

                // Increase the value for the same culture.
                var sameCultureMult = (float)(1.0 + (kingdom.Culture == clan.Culture ? 1.0 : 0.0));

                valueProposition *= sameCultureMult;

                // Increase the value if the lord is known to be honorable.
                var reliabilityConstant = HeroHelper.CalculateReliabilityConstant(clan.Leader);

                valueProposition *= reliabilityConstant;

                return(valueProposition);
            }
Exemplo n.º 10
0
        // KillCharacterAction && MarriageAction
        internal void ClanOption(Hero firstHero, Clan newClan, bool setLeader = false, bool adopt = false)
        {
            if (firstHero.Clan != newClan)
            {
                Clan         clan = firstHero.Clan;
                PropertyInfo pi   = Campaign.Current.GetType().GetProperty("PlayerDefaultFaction", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                try
                {
                    RemoveFactionLeader(firstHero);

                    if (firstHero.PartyBelongedTo != null && clan != null && !firstHero.IsHumanPlayerCharacter)
                    {
                        if (clan.Kingdom != newClan.Kingdom)
                        {
                            if (firstHero.PartyBelongedTo.Army != null)
                            {
                                if (firstHero.PartyBelongedTo.Army.LeaderParty == firstHero.PartyBelongedTo)
                                {
                                    firstHero.PartyBelongedTo.Army.DisperseArmy(Army.ArmyDispersionReason.Unknown);
                                }
                                else
                                {
                                    firstHero.PartyBelongedTo.Army = null;
                                }
                            }
                            IFaction kingdom = newClan.Kingdom;
                            FactionHelper.FinishAllRelatedHostileActionsOfNobleToFaction(firstHero, kingdom ?? newClan);
                        }

                        DisbandPartyAction.ApplyDisband(firstHero.PartyBelongedTo);
                        if (firstHero.PartyBelongedTo != null)
                        {
                            firstHero.PartyBelongedTo.Party.Owner = null;
                        }
                        firstHero.ChangeState(Hero.CharacterStates.Fugitive);
                        MobileParty partyBelongedTo = firstHero.PartyBelongedTo;
                        if (partyBelongedTo != null)
                        {
                            partyBelongedTo.MemberRoster.RemoveTroop(firstHero.CharacterObject, 1, default, 0);
Exemplo n.º 11
0
        private void ClanChangedKingdom(Clan clan, Kingdom oldKingdom, Kingdom newKingdom, bool byRebellion, bool showNotification)
        {
            if (oldKingdom == null)
            {
                return;
            }

            var kingdomInfo = Managers.Kingdom.Get(oldKingdom);

            if (kingdomInfo == null || !kingdomInfo.IsCivilWarKingdom)
            {
                return;
            }

            var clans = oldKingdom.Clans.Where(go => !go.IsUnderMercenaryService && !go.IsClanTypeMercenary);

            if (clans.Count() > 0)
            {
                return;
            }

            foreach (var currentClan in oldKingdom.Clans.ToList())
            {
                foreach (var enemyFaction in Campaign.Current.Factions.Where(go => go.IsAtWarWith(currentClan)))
                {
                    if (clan.IsAtWarWith(enemyFaction))
                    {
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(enemyFaction, currentClan);
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(currentClan, enemyFaction);
                    }
                }

                clan.ClanLeaveKingdom(false);
            }

            Managers.Kingdom.DestroyKingdom(oldKingdom);
        }
        // [HarmonyPrefix]
        // [HarmonyPatch("ThinkAboutDeclaringWar")]
        private static bool ThinkAboutDeclaringWar(PoliticalStagnationAndBorderIncidentCampaignBehavior __instance, Kingdom kingdom)
        {
            var atWars = Kingdom.All.Where(a => a != kingdom && a.IsAtWarWith(kingdom)).ToList();

            if (atWars.Count > 1)
            {
                return(false);
            }

            List <IFaction> possibleKingdomsToDeclareWar = FactionHelper.GetPossibleKingdomsToDeclareWar(kingdom);


            var             nears   = DiplomacySetting.GetNearFactionsWithFaction(kingdom, Kingdom.All);
            var             results = nears.Intersect(possibleKingdomsToDeclareWar).ToList();
            float           num     = 0f;
            IFaction        faction = null;
            List <IFaction> occupy  = DiplomacySetting.GetAllFactionOccupyFactionSettlement(kingdom);

            foreach (IFaction item in results)
            {
                var factor1 = 1f;

                var atWars2 = Kingdom.All.Where(a => a != item && a.IsAtWarWith(item)).Count();
                if (occupy.Contains(item))
                {
                    if (DiplomacySetting.InTruce(kingdom, item))
                    {
                        if (atWars2 < 1)
                        {
                            continue;
                        }
                        if (atWars2 < 2 && MBRandom.RandomFloat < 0.5f)
                        {
                            continue;
                        }
                    }

                    factor1 = 1.5f;
                }
                else
                {
                    if (atWars2 > 2)
                    {
                        continue;
                    }
                    if (DiplomacySetting.InTruce(kingdom, item))
                    {
                        continue;
                    }
                }

                //float scoreOfDeclaringWar = factor1 * Campaign.Current.Models.DiplomacyModel.GetScoreOfDeclaringWar(kingdom, item);
                float scoreOfDeclaringWar = factor1 * 1f;

                if (kingdom.Culture == item.Culture)
                {
                    var factor = Math.Max(0.1f, 1 - Kingdom.All.Where(a => a.MapFaction != null && a.MapFaction.Settlements.Where(t => t.IsTown).Count() > 3 && (a.Culture != kingdom.Culture || a.Ruler == Hero.MainHero)).Count() * 0.15f);
                    scoreOfDeclaringWar *= factor * 0.5f;
                }

                if (scoreOfDeclaringWar > num)
                {
                    faction = item;
                    num     = scoreOfDeclaringWar;
                }
            }

            if (faction != null && MBRandom.RandomFloat < 0.2f)
            {
                DeclareWarAction.ApplyDeclareWarOverProvocation(kingdom, faction);
            }
            return(false);
        }
Exemplo n.º 13
0
        static bool Prefix(Clan clan, Kingdom kingdom, int detail, int awardMultiplier, bool byRebellion, bool showNotification)
        {
            //MessageBox.Show($"Detail: {detail}");
            //MessageBox.Show(SharedObjects.Instance.RebellionRelationsChange.ToString());

            var  onClanChangedKingdom          = typeof(CampaignEventDispatcher).GetMethod("OnClanChangedKingdom", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            var  onMercenaryClanChangedKingdom = typeof(CampaignEventDispatcher).GetMethod("OnMercenaryClanChangedKingdom", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            Type type = typeof(ChangeKingdomAction).Assembly.GetType("TaleWorlds.CampaignSystem.Actions.ChangeKingdomAction+ChangeKingdomActionDetail");

            int joinMerc       = (int)Enum.ToObject(type, 0);
            int joinKingdom    = (int)Enum.ToObject(type, 1);
            int leaveKingdom   = (int)Enum.ToObject(type, 2);
            int leaveRebellion = (int)Enum.ToObject(type, 3);
            int leaveMerc      = (int)Enum.ToObject(type, 4);

            Kingdom oldKingdom = clan.Kingdom;

            if (kingdom != null)
            {
                foreach (Kingdom kingdom3 in Kingdom.All)
                {
                    if (object.ReferenceEquals(kingdom3, kingdom) || !kingdom.IsAtWarWith(kingdom3))
                    {
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(clan, kingdom3);
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(kingdom3, clan);
                    }
                }
                foreach (Clan clan2 in Clan.All)
                {
                    if (!object.ReferenceEquals(clan2, clan) && ((clan2.Kingdom == null) && !kingdom.IsAtWarWith(clan2)))
                    {
                        FactionHelper.FinishAllRelatedHostileActions(clan, clan2);
                    }
                }
            }
            if (detail == joinKingdom)   //ChangeKingdomActionDetail.JoinKingdom
            {
                object[] additionalArgs = new object[] { clan, oldKingdom, kingdom, false };
                StatisticsDataLogHelper.AddLog(StatisticsDataLogHelper.LogAction.ChangeKingdomAction, additionalArgs);
                clan.IsUnderMercenaryService = false;
                if (oldKingdom != null)
                {
                    clan.ClanLeaveKingdom(!byRebellion);
                }
                clan.ClanJoinFaction(kingdom);
                onClanChangedKingdom.Invoke(CampaignEventDispatcher.Instance, new object[] { clan, oldKingdom, clan.Kingdom, byRebellion, showNotification });
            }
            else if (detail == joinMerc)   //ChangeKingdomActionDetail.JoinAsMercenary
            {
                object[] additionalArgs = new object[] { clan, oldKingdom, kingdom, false };
                StatisticsDataLogHelper.AddLog(StatisticsDataLogHelper.LogAction.ChangeKingdomAction, additionalArgs);
                if (clan.IsUnderMercenaryService)
                {
                    clan.ClanLeaveKingdom(false);
                }
                clan.MercenaryAwardMultiplier = MathF.Round((float)awardMultiplier);
                clan.IsUnderMercenaryService  = true;
                clan.ClanJoinFaction(kingdom);
                //CampaignEventDispatcher.Instance.OnMercenaryClanChangedKingdom(clan, null, kingdom);
                onMercenaryClanChangedKingdom.Invoke(CampaignEventDispatcher.Instance, new object[] { clan, null, kingdom });
            }
            else if (detail == leaveRebellion || detail == leaveKingdom || detail == leaveMerc)   //ChangeKingdomActionDetail.LeaveAsMercenary = 4
            {
                object[] additionalArgs = new object[] { clan, oldKingdom, kingdom, true };
                StatisticsDataLogHelper.AddLog(StatisticsDataLogHelper.LogAction.ChangeKingdomAction, additionalArgs);
                clan.ClanLeaveKingdom(false);
                if (detail == leaveMerc)   //ChangeKingdomActionDetail.LeaveAsMercenary
                {
                    onMercenaryClanChangedKingdom.Invoke(CampaignEventDispatcher.Instance, new object[] { clan, kingdom, null });
                    clan.IsUnderMercenaryService = false;
                }
                if (detail == leaveRebellion)   //ChangeKingdomActionDetail.LeaveWithRebellion
                {
                    if (object.ReferenceEquals(clan, Clan.PlayerClan))
                    {
                        foreach (Clan clan3 in oldKingdom.Clans)
                        {
                            ChangeRelationAction.ApplyRelationChangeBetweenHeroes(clan.Leader, clan3.Leader, SharedObjects.Instance.RebellionRelationsChange, true);
                        }
                        if (SharedObjects.Instance.DeclareWarOnRebellion)
                        {
                            DeclareWarAction.Apply(oldKingdom, clan);
                        }
                    }
                    onClanChangedKingdom.Invoke(CampaignEventDispatcher.Instance, new object[] { clan, oldKingdom, null, true, true });
                }
                else if (detail == leaveKingdom)   //ChangeKingdomActionDetail.LeaveKingdom
                {
                    if (object.ReferenceEquals(clan, Clan.PlayerClan))
                    {
                        foreach (Clan clan4 in oldKingdom.Clans)
                        {
                            ChangeRelationAction.ApplyRelationChangeBetweenHeroes(clan.Leader, clan4.Leader, SharedObjects.Instance.ForfeitSettlementsRelationsChange, true);
                        }
                    }
                    foreach (Settlement settlement in new List <Settlement>(clan.Settlements))
                    {
                        ChangeOwnerOfSettlementAction.ApplyByLeaveFaction(oldKingdom.Leader, settlement);
                        foreach (Hero hero in new List <Hero>((IEnumerable <Hero>)settlement.HeroesWithoutParty))
                        {
                            if ((hero.CurrentSettlement != null) && object.ReferenceEquals(hero.Clan, clan))
                            {
                                if (hero.PartyBelongedTo != null)
                                {
                                    LeaveSettlementAction.ApplyForParty(hero.PartyBelongedTo);
                                    EnterSettlementAction.ApplyForParty(hero.PartyBelongedTo, clan.Leader.HomeSettlement);
                                    continue;
                                }
                                LeaveSettlementAction.ApplyForCharacterOnly(hero);
                                EnterSettlementAction.ApplyForCharacterOnly(hero, clan.Leader.HomeSettlement);
                            }
                        }
                    }
                    onClanChangedKingdom.Invoke(CampaignEventDispatcher.Instance, new object[] { clan, oldKingdom, null, false, false });
                }
            }
            if (object.ReferenceEquals(clan, Clan.PlayerClan))
            {
                Campaign.Current.UpdateDecisions();
            }
            typeof(ChangeKingdomAction).GetMethod("CheckIfPartyIconIsDirty", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)
            .Invoke(null, new object[] { clan, kingdom });
            return(false);
        }
        public override int FindNumberOfTroopsToLeaveToGarrison(MobileParty mobileParty, Settlement settlement)
        {
            MobileParty garrisonParty    = settlement.Town.GarrisonParty;
            float       garrisonStrength = 0f;

            if (garrisonParty is not null)
            {
                garrisonStrength = garrisonParty.Party.TotalStrength;
            }
            float num2 = FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom, settlement.OwnerClan) * FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan) * (settlement.IsTown ? 2f : 1f);
            int   result;

            if ((settlement.OwnerClan.Leader == Hero.MainHero && (mobileParty.LeaderHero == null || mobileParty.LeaderHero.Clan != Clan.PlayerClan)) || (double)garrisonStrength >= (double)num2)
            {
                result = 0;
            }
            else
            {
                int   numberOfRegularMembers = mobileParty.Party.NumberOfRegularMembers;
                float woundedRatio           = (float)(1.0 + (double)mobileParty.Party.NumberOfWoundedRegularMembers / (double)mobileParty.Party.NumberOfRegularMembers);
                float num4  = (float)mobileParty.Party.PartySizeLimit * mobileParty.PaymentRatio;
                float num5  = (float)(Math.Pow((double)Math.Min(2f, (float)numberOfRegularMembers / num4), 1.20000004768372) * 0.75);
                float num6  = (float)((1.0 - (double)garrisonStrength / (double)num2) * (1.0 - (double)garrisonStrength / (double)num2));
                bool  flag3 = mobileParty.Army != null;
                if (flag3)
                {
                    num6 = Math.Min(num6, 0.5f);
                }
                float num7  = 0.5f;
                bool  flag4 = settlement.OwnerClan == mobileParty.Leader.HeroObject.Clan || settlement.OwnerClan == mobileParty.Party.Owner.MapFaction.Leader.Clan;
                if (flag4)
                {
                    num7 = 1f;
                }
                float        num8 = (mobileParty.Army != null) ? 1.25f : 1f;
                float        num9 = 1f;
                List <float> list = new List <float>(5);
                for (int i = 0; i < 5; i++)
                {
                    list.Add(Campaign.MapDiagonal * Campaign.MapDiagonal);
                }
                foreach (Kingdom kingdom in Kingdom.All)
                {
                    bool flag5 = kingdom.IsKingdomFaction && mobileParty.MapFaction.IsAtWarWith(kingdom);
                    if (flag5)
                    {
                        foreach (Settlement settlement2 in kingdom.Settlements)
                        {
                            float num10 = settlement2.Position2D.DistanceSquared(mobileParty.Position2D);
                            for (int j = 0; j < 5; j++)
                            {
                                bool flag6 = (double)num10 < (double)list[j];
                                if (flag6)
                                {
                                    for (int k = 4; k >= j + 1; k--)
                                    {
                                        list[k] = list[k - 1];
                                    }
                                    list[j] = num10;
                                    break;
                                }
                            }
                        }
                    }
                }
                float num11 = 0f;
                for (int l = 0; l < 5; l++)
                {
                    num11 += (float)Math.Sqrt((double)list[l]);
                }
                float  num12 = num11 / 5f;
                double num13 = (double)Math.Max(0f, Math.Min((float)((double)Campaign.MapDiagonal / 15.0 - (double)Campaign.MapDiagonal / 30.0), num12 - Campaign.MapDiagonal / 30f)) / ((double)Campaign.MapDiagonal / 15.0 - (double)Campaign.MapDiagonal / 30.0);
                float  num14 = Math.Min(0.7f, num9 * num5 * num6 * num7 * num8 * woundedRatio);
                result = MBRandom.RoundRandomized((float)numberOfRegularMembers * num14);
            }
            return(result);
        }
Exemplo n.º 15
0
        public static void ChangeKingdom(this Clan clan, Kingdom newKingdom, bool rebellion)
        {
            Kingdom oldKingdom = clan.Kingdom;

            if (newKingdom != null)
            {
                foreach (Kingdom k in Kingdom.All)
                {
                    if (k == newKingdom || !newKingdom.IsAtWarWith(k))
                    {
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(clan, k);
                        FactionHelper.FinishAllRelatedHostileActionsOfFactionToFaction(k, clan);
                    }
                }
                foreach (Clan c in Clan.All)
                {
                    if (c != clan && c.Kingdom == null && !newKingdom.IsAtWarWith(c))
                    {
                        FactionHelper.FinishAllRelatedHostileActions(clan, c);
                    }
                }
            }

            StatisticsDataLogHelper.AddLog(StatisticsDataLogHelper.LogAction.ChangeKingdomAction, new object[]
            {
                clan,
                oldKingdom,
                newKingdom,
                newKingdom == null || rebellion
            });
            clan.IsUnderMercenaryService = false;
            if (oldKingdom != null)
            {
                clan.ClanLeaveKingdom(false);
            }
            if (newKingdom != null)
            {
                clan.ClanJoinFaction(newKingdom);
                NotifyClanChangedKingdom(clan, oldKingdom, newKingdom, rebellion, true);

                if (rebellion)
                {
                    foreach (Clan c in oldKingdom.Clans)
                    {
                        int relationChange = SeparatismConfig.Settings.RelationChangeRebelWithRulerVassals;
                        if (c.Leader == oldKingdom.Leader)
                        {
                            relationChange = SeparatismConfig.Settings.RelationChangeRebelWithRuler;
                        }
                        else if (c.Leader.IsFriend(oldKingdom.Leader))
                        {
                            relationChange = SeparatismConfig.Settings.RelationChangeRebelWithRulerFriendVassals;
                        }
                        else if (c.Leader.IsEnemy(oldKingdom.Leader))
                        {
                            relationChange = SeparatismConfig.Settings.RelationChangeRebelWithRulerEnemyVassals;
                        }

                        if (relationChange != 0)
                        {
                            ChangeRelationAction.ApplyRelationChangeBetweenHeroes(clan.Leader, c.Leader, relationChange, true);
                        }
                    }

                    newKingdom.InheritsWarsFromKingdom(oldKingdom);
                    DeclareWarAction.Apply(oldKingdom, newKingdom);
                }
                else
                {
                    int relationChange = SeparatismConfig.Settings.RelationChangeUnitedRulers;
                    if (relationChange != 0)
                    {
                        ChangeRelationAction.ApplyRelationChangeBetweenHeroes(clan.Leader, newKingdom.Leader, relationChange, true);
                    }
                    if (oldKingdom != null)
                    {
                        newKingdom.InheritsWarsFromKingdom(oldKingdom);
                    }
                }
            }
            if (oldKingdom != null && oldKingdom.Clans.Where(x => x.Leader.IsAlive).Count() == 0)             // old kingdom is empty so we destroy it
            {
                if (newKingdom == null)
                {
                    NotifyClanChangedKingdom(clan, oldKingdom, null, false, true);
                }
                Campaign.Current.RemoveEmptyKingdoms();
            }

            CheckIfPartyIconIsDirty(clan, oldKingdom);
        }
        public override int FindNumberOfTroopsToLeaveToGarrison(
            MobileParty mobileParty,
            Settlement settlement)
        {
            MobileParty garrisonParty = settlement.Town.GarrisonParty;
            float       num1          = 0.0f;

            if (garrisonParty != null)
            {
                num1 = garrisonParty.Party.TotalStrength;
            }
            float num2 = FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom, settlement.OwnerClan) * FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan) * (settlement.IsTown ? 2f : 1f);

            if (settlement.OwnerClan.Leader == Hero.MainHero && (mobileParty.LeaderHero == null || mobileParty.LeaderHero.Clan != Clan.PlayerClan) || (double)num1 >= (double)num2)
            {
                return(0);
            }
            int   ofRegularMembers = mobileParty.Party.NumberOfRegularMembers;
            float num3             = (float)(1.0 + (double)mobileParty.Party.NumberOfWoundedRegularMembers / (double)mobileParty.Party.NumberOfRegularMembers);
            float num4             = (float)mobileParty.Party.PartySizeLimit * mobileParty.PaymentRatio;
            float num5             = (float)(Math.Pow((double)Math.Min(2f, (float)ofRegularMembers / num4), 1.20000004768372) * 0.75);
            float val1             = (float)((1.0 - (double)num1 / (double)num2) * (1.0 - (double)num1 / (double)num2));

            if (mobileParty.Army != null)
            {
                val1 = Math.Min(val1, 0.5f);
            }
            float num6 = 0.5f;

            if (settlement.OwnerClan == mobileParty.Leader.HeroObject.Clan || settlement.OwnerClan == mobileParty.Party.Owner.MapFaction.Leader.Clan)
            {
                num6 = 1f;
            }
            float        num7      = mobileParty.Army != null ? 1.25f : 1f;
            float        num8      = 1f;
            List <float> floatList = new List <float>(5);

            for (int index = 0; index < 5; ++index)
            {
                floatList.Add(Campaign.MapDiagonal * Campaign.MapDiagonal);
            }
            foreach (Kingdom kingdom in Kingdom.All)
            {
                if (kingdom.IsKingdomFaction && mobileParty.MapFaction.IsAtWarWith((IFaction)kingdom))
                {
                    foreach (Settlement settlement1 in kingdom.Settlements)
                    {
                        float num9 = settlement1.Position2D.DistanceSquared(mobileParty.Position2D);
                        for (int index1 = 0; index1 < 5; ++index1)
                        {
                            if ((double)num9 < (double)floatList[index1])
                            {
                                for (int index2 = 4; index2 >= index1 + 1; --index2)
                                {
                                    floatList[index2] = floatList[index2 - 1];
                                }
                                floatList[index1] = num9;
                                break;
                            }
                        }
                    }
                }
            }
            float num10 = 0.0f;

            for (int index = 0; index < 5; ++index)
            {
                num10 += (float)Math.Sqrt((double)floatList[index]);
            }
            float  num11 = num10 / 5f;
            double num12 = (double)Math.Max(0.0f, Math.Min((float)((double)Campaign.MapDiagonal / 15.0 - (double)Campaign.MapDiagonal / 30.0), num11 - Campaign.MapDiagonal / 30f)) / ((double)Campaign.MapDiagonal / 15.0 - (double)Campaign.MapDiagonal / 30.0);
            float  num13 = Math.Min(0.7f, num8 * num5 * val1 * num6 * num7 * num3);

            return(MBRandom.RoundRandomized((float)ofRegularMembers * num13));
        }
Exemplo n.º 17
0
 private void LoadLevelInfo(StreamReader stream)
 {
     m_levelID = uint.Parse(SaveSlot.Extract(stream.ReadLine()));
     m_faction = FactionHelper.StringToFactions(SaveSlot.Extract(stream.ReadLine()));
 }
Exemplo n.º 18
0
        public override int FindNumberOfTroopsToLeaveToGarrison(MobileParty mobileParty, Settlement settlement)
        {
            if (SettlementGarrisonSetting.Instance.DisablePlayerClanLeaveTroopToGarrison && mobileParty.LeaderHero != null && mobileParty.LeaderHero.Clan == Clan.PlayerClan)
            {
                return(0);
            }

            MobileParty garrisonParty = settlement.Town.GarrisonParty;
            float       num           = 0f;

            if (garrisonParty != null)
            {
                num = garrisonParty.Party.TotalStrength;
            }
            float num2 = FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom, settlement.OwnerClan);
            float num3 = FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan);
            float num4 = FactionHelper.SettlementProsperityEffectOnGarrisonSizeConstant(settlement);

            num2 *= num3;
            num2 *= num4;
            if ((settlement.OwnerClan.Leader != Hero.MainHero || (mobileParty.LeaderHero != null && mobileParty.LeaderHero.Clan == Clan.PlayerClan)) && num < num2)
            {
                int   numberOfRegularMembers = mobileParty.Party.NumberOfRegularMembers;
                float num5 = 1f + (float)mobileParty.Party.NumberOfWoundedRegularMembers / (float)mobileParty.Party.NumberOfRegularMembers;
                float num6 = (float)mobileParty.Party.PartySizeLimit * mobileParty.PaymentRatio;
                float num7 = (float)(Math.Pow((double)Math.Min(2f, (float)numberOfRegularMembers / num6), 1.2000000476837158) * 0.75);
                float num8 = (1f - num / num2) * (1f - num / num2);
                if (mobileParty.Army != null)
                {
                    num8 = Math.Min(num8, 0.5f);
                }
                float num9 = 0.5f;
                if (settlement.OwnerClan == mobileParty.Leader.HeroObject.Clan || settlement.OwnerClan == mobileParty.Party.Owner.MapFaction.Leader.Clan)
                {
                    num9 = 1f;
                }
                float        num10 = (mobileParty.Army != null) ? 1.25f : 1f;
                float        num11 = 1f;
                List <float> list  = new List <float>(5);
                for (int i = 0; i < 5; i++)
                {
                    list.Add(Campaign.MapDiagonal * Campaign.MapDiagonal);
                }
                foreach (Kingdom kingdom in Kingdom.All)
                {
                    if (kingdom.IsKingdomFaction && mobileParty.MapFaction.IsAtWarWith(kingdom))
                    {
                        foreach (Settlement settlement2 in kingdom.Settlements)
                        {
                            float num12 = settlement2.Position2D.DistanceSquared(mobileParty.Position2D);
                            for (int j = 0; j < 5; j++)
                            {
                                if (num12 < list[j])
                                {
                                    for (int k = 4; k >= j + 1; k--)
                                    {
                                        list[k] = list[k - 1];
                                    }
                                    list[j] = num12;
                                    break;
                                }
                            }
                        }
                    }
                }
                float num13 = 0f;
                for (int l = 0; l < 5; l++)
                {
                    num13 += (float)Math.Sqrt((double)list[l]);
                }
                num13 /= 5f;
                float num14 = Math.Max(0f, Math.Min(Campaign.MapDiagonal / 15f - Campaign.MapDiagonal / 30f, num13 - Campaign.MapDiagonal / 30f));
                float num15 = Campaign.MapDiagonal / 15f - Campaign.MapDiagonal / 30f;
                float num16 = num14 / num15;
                float num17 = Math.Min(0.7f, num11 * num7 * num8 * num9 * num10 * num5);
                return(MBRandom.RoundRandomized((float)numberOfRegularMembers * num17));
            }
            return(0);
        }
        public override int FindNumberOfTroopsToTakeFromGarrison(
            MobileParty mobileParty,
            Settlement settlement,
            float defaultIdealGarrisonStrengthPerWalledCenter = 0.0f)
        {
            MobileParty garrisonParty = settlement.Town.GarrisonParty;

            if (garrisonParty == null)
            {
                return(0);
            }
            float  totalStrength = garrisonParty.Party.TotalStrength;
            float  num1          = ((double)defaultIdealGarrisonStrengthPerWalledCenter > 0.100000001490116 ? defaultIdealGarrisonStrengthPerWalledCenter : FactionHelper.FindIdealGarrisonStrengthPerWalledCenter(mobileParty.MapFaction as Kingdom, settlement.OwnerClan)) * FactionHelper.OwnerClanEconomyEffectOnGarrisonSizeConstant(settlement.OwnerClan) * (settlement.IsTown ? 2f : 1f);
            float  num2          = (float)mobileParty.Party.PartySizeLimit * mobileParty.PaymentRatio / (float)mobileParty.Party.NumberOfAllMembers;
            double num3          = Math.Min(11.0, (double)num2 * Math.Sqrt((double)num2)) - 1.0;
            float  num4          = (float)Math.Pow((double)totalStrength / (double)num1, 1.5);
            float  num5          = mobileParty.LeaderHero.Clan.Leader == mobileParty.LeaderHero ? 2f : 1f;
            double num6          = (double)num4;
            int    num7          = MBRandom.RoundRandomized((float)(num3 * num6) * num5);
            int    num8          = 25 * (settlement.IsTown ? 2 : 1);

            if (num7 > garrisonParty.Party.MemberRoster.TotalRegulars - num8)
            {
                num7 = garrisonParty.Party.MemberRoster.TotalRegulars - num8;
            }
            return(num7);
        }