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); }
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)); }
private void OnSessionLaunched(CampaignGameStarter starter) { if (Clan.PlayerClan.IsUnderMercenaryService) { Clan.PlayerClan.MercenaryAwardMultiplier = FactionHelper.GetMercenaryAwardFactorToJoinKingdom(Clan.PlayerClan, Clan.PlayerClan.Kingdom, false) * MercPayraiseConfig.MercPayMultiplierValue; } }
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); }
private string SaveLevelInfo() { string datas = "ID : " + m_levelID + "\n"; datas += "Factions : " + FactionHelper.FactionsToString(m_faction) + "\n"; return(datas); }
// 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); }
// 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()); }
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++; } } } }
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); }
// 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);
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); }
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); }
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)); }
private void LoadLevelInfo(StreamReader stream) { m_levelID = uint.Parse(SaveSlot.Extract(stream.ReadLine())); m_faction = FactionHelper.StringToFactions(SaveSlot.Extract(stream.ReadLine())); }
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); }