private void OnSettlementOwnerChangedEvent(Settlement settlement, bool openToClaim, Hero newOwner, Hero oldOwner, Hero capturedHero, ChangeOwnerOfSettlementAction.ChangeOwnerOfSettlementDetail detail) { var settlementInfo = Managers.Settlement.Get(settlement); settlementInfo.UpdateOwnerRevolt(newOwner.MapFaction); if (capturedHero?.PartyBelongedTo?.Party != null) { var revolt = RevoltManager.Instance.GetRevoltByParty(capturedHero.PartyBelongedTo.Party); if (revolt != null && !RevolutionsSettings.Instance.RevoltsMinorFactionsMechanic && revolt.IsMinorFaction) { if (revolt.SettlementInfo.CurrentFaction == revolt.SettlementInfo.LoyalFaction) { var previousFactionOwner = BaseManagers.Faction.GetLordWithLeastFiefs(revolt.SettlementInfo.PreviousFaction).HeroObject; ChangeOwnerOfSettlementAction.ApplyByRevolt(previousFactionOwner, settlement); } else { var loyalFactionOwner = BaseManagers.Faction.GetLordWithLeastFiefs(revolt.SettlementInfo.LoyalFaction).HeroObject; ChangeOwnerOfSettlementAction.ApplyByRevolt(loyalFactionOwner, settlement); } Managers.Kingdom.DestroyKingdom(capturedHero.Clan.Kingdom); Managers.Clan.DestroyClan(capturedHero.Clan); capturedHero.PartyBelongedTo.RemoveParty(); KillCharacterAction.ApplyByRemove(capturedHero); RevoltManager.Instance.Revolts.Remove(revolt); } } }
private Kingdom GoRebelKingdom(Clan clan, IEnumerable <Settlement> settlements) { var capital = settlements.First(); var owner = capital.OwnerClan; // create a new kingdom for the clan TextObject kingdomIntroText = new TextObject("{=Separatism_Kingdom_Intro_Anarchy}{RebelKingdom} was found in {Year} as a result of anarchy in fiefs of the {ClanName} when people of {Settlement} have called {Ruler} on rulership.", null); kingdomIntroText.SetTextVariable("Year", CampaignTime.Now.GetYear); kingdomIntroText.SetTextVariable("ClanName", owner.Name); kingdomIntroText.SetTextVariable("Settlement", capital.Name); kingdomIntroText.SetTextVariable("Ruler", clan.Leader.Name); var kingdom = clan.CreateKingdom(kingdomIntroText); // keep policies from the old settlement kingdom foreach (var policy in owner.Kingdom.ActivePolicies) { kingdom.AddPolicy(policy); } // move the clan out of its current kingdom clan.ChangeKingdom(null, false); // change settlement ownership foreach (var s in settlements) { ChangeOwnerOfSettlementAction.ApplyByRevolt(clan.Leader, s); } // move the clan into the new kingdom clan.ChangeKingdom(kingdom, false); // declare wars kingdom.InheritsWarsFromKingdom(owner.Kingdom); DeclareWarAction.Apply(owner.Kingdom, kingdom); return(kingdom); }
internal static void EndSucceededRevolt(Revolt revolt) { var textObject = new TextObject(Localization.GameTexts.RevoltsRevoltEnd); textObject.SetTextVariable("SETTLEMENT", revolt.Settlement.Name); InformationManager.AddQuickInformation(textObject); revolt.SettlementInfo.CurrentFactionInfo.CityRevoltionSucceeded(revolt.Settlement); if (RevolutionsSettings.Instance.RevoltsImperialLoyaltyMechanic && revolt.SettlementInfo.IsCurrentFactionOfImperialCulture && !revolt.SettlementInfo.IsLoyalFactionOfImperialCulture) { revolt.Settlement.OwnerClan.AddRenown(-RevolutionsSettings.Instance.RevoltsImperialRenownLoss); } if (RevolutionsSettings.Instance.RevoltsMinorFactionsMechanic && revolt.IsMinorFaction) { ChangeOwnerOfSettlementAction.ApplyByRevolt(revolt.Party.LeaderHero, revolt.Settlement); revolt.Party.LeaderHero.Clan.AddRenown(RevolutionsSettings.Instance.RevoltsMinorFactionsRenownGainOnWin); foreach (var notable in revolt.Settlement.Notables.Concat(revolt.Settlement.BoundVillages.SelectMany(s => s.Settlement.Notables))) { notable.SetPersonalRelation(revolt.Party.Leader.HeroObject, new Random().Next(5, 25)); } var amountOTroops = (RevolutionsSettings.Instance.RevoltsGeneralBaseSize + (int)(revolt.Settlement.Prosperity * RevolutionsSettings.Instance.RevoltsGeneralProsperityMulitplier)) / 3; var eliteUnits = new TroopRoster(); eliteUnits.AddToCounts(revolt.Party.Leader.Culture.RangedEliteMilitiaTroop, amountOTroops); eliteUnits.AddToCounts(revolt.Party.Leader.Culture.MeleeEliteMilitiaTroop, amountOTroops * 2); revolt.Party.MobileParty.MemberRoster.Add(eliteUnits); SetPartyAiAction.GetActionForPatrollingAroundSettlement(revolt.Party.MobileParty, revolt.Settlement); revolt.Party.MobileParty.Ai.SetDoNotMakeNewDecisions(false); Managers.Revolt.Revolts.Remove(revolt); } if (RevolutionsSettings.Instance.RevoltsMinorFactionsMechanic && !revolt.IsMinorFaction) { revolt.Party.MobileParty.Ai.SetDoNotMakeNewDecisions(false); Managers.Revolt.Revolts.Remove(revolt); } }
private void RevoltLogic(SettlementInfo info, Settlement settlement) { TextObject revoltNotification = GameTexts.FindText("str_GM_RevoltNotification"); revoltNotification.SetTextVariable("SETTLEMENT", settlement.Name.ToString()); InformationManager.DisplayMessage(new InformationMessage(revoltNotification.ToString())); Hero selectedHero = null; TextObject revolutionaryMob = GameTexts.FindText("str_GM_RevolutionaryMob"); MobileParty mob = MobileParty.Create(revolutionaryMob.ToString()); TroopRoster roster = new TroopRoster(); TroopRoster infantry = new TroopRoster(); infantry.FillMembersOfRoster(300, settlement.Culture.MeleeMilitiaTroop); roster.Add(infantry); TroopRoster archers = new TroopRoster(); archers.FillMembersOfRoster(200, settlement.Culture.RangedMilitiaTroop); roster.Add(archers); TroopRoster prisonRoster = new TroopRoster(); prisonRoster.IsPrisonRoster = true; if (info.CurrentFaction.IsAtWarWith(info.OriginalFaction)) { Clan chosenClan = null; int leastSettlements = 100; foreach (var noble in info.OriginalFaction.Nobles) { int currentSettlements = noble.Clan.Settlements.Count(); if (currentSettlements >= leastSettlements) { continue; } leastSettlements = currentSettlements; chosenClan = noble.Clan; } selectedHero = chosenClan != null?chosenClan.Nobles.GetRandomElement() : info.OriginalFaction.Leader; } else { var clan = CreateRebellionClan(info); clan.AddRenown(500); DeclareWarAction.Apply(clan, info.CurrentFaction); selectedHero = clan.Leader; mob.IsLordParty = true; } mob.ChangePartyLeader(selectedHero.CharacterObject); mob.Party.Owner = selectedHero; if (!info.CurrentFaction.IsAtWarWith(info.OriginalFaction)) { mob.MemberRoster.AddToCounts(mob.Party.Owner.CharacterObject, 1, false, 0, 0, true, -1); } mob.InitializeMobileParty(new TextObject(revolutionaryMob.ToString(), null), roster, prisonRoster, settlement.GatePosition, 2.0f, 2.0f); Revolutionaries.Add(new Tuple <PartyBase, SettlementInfo>(mob.Party, info)); MobileParty garrison = settlement.Parties.FirstOrDefault(party => party.IsGarrison); if (garrison == null) { foreach (var party in settlement.Parties.Where(party => party.IsMilitia || party.MapFaction.StringId == settlement.OwnerClan.MapFaction.StringId)) { garrison = party; break; } } if (garrison == null) { ChangeOwnerOfSettlementAction.ApplyByRevolt(selectedHero, settlement); GetFactionInformation(info.CurrentFaction).CityRevoltedSuccess(settlement); } else { Campaign.Current.MapEventManager.StartSiegeOutsideMapEvent(mob.Party, garrison.Party); } info.RevoltProgress = 0; }