private void RemoveTroops() { MobileParty heroParty = MobileParty.MainParty; TroopRoster troops = heroParty.MemberRoster; TroopRosterElement troopElement; CharacterObject troop; int troopTypeCount; int numOfTroopsToTake; TroopRoster tempTroopRoster; for (int i = 0; i < troops.Count; i++) { tempTroopRoster = new TroopRoster(); troop = troops.GetCharacterAtIndex(i); troopElement = troops.GetElementCopyAtIndex(i); Debug.WriteLine("troopElement " + i + ": " + troopElement.Character.Name); troopTypeCount = troops.GetTroopCount(troop); Debug.WriteLine("cons2 Troop " + i + ": " + troop.Name + ", count:" + troopTypeCount); if (numOfTroopNeeded > 0) { numOfTroopsToTake = getNumTroopNeeded(troop, troopTypeCount); int numOfTroopsToRemove = troopTypeCount - numOfTroopsToTake; Debug.WriteLine("take Troop " + troop.Name + ", num to take: " + numOfTroopsToTake + ", num to remove: " + numOfTroopsToRemove); numOfTroopNeeded -= numOfTroopsToTake; if (numOfTroopsToRemove > 0) { Debug.WriteLine("remove Troop1 " + troop.Name + ", num: " + numOfTroopsToRemove); CharacterObject tempTroop = troopElement.Character; tempTroopRoster.FillMembersOfRoster(numOfTroopsToTake, troop); troopRosterRemovedTroops.Add(tempTroopRoster); Debug.WriteLine("troopRoosterRemovedTroops count" + troopRosterRemovedTroops.Count()); troops.RemoveTroop(troop, numOfTroopsToRemove); i--; } } else { Debug.WriteLine("remove Troop2 " + troop.Name + ", num: " + troopTypeCount + ", troopCound: " + troopTypeCount); CharacterObject tempTroop = troopElement.Character; tempTroopRoster.FillMembersOfRoster(troopTypeCount, troop); Debug.WriteLine("output temp roster: "); outputRoster(troopRosterRemovedTroops); troopRosterRemovedTroops.Add(tempTroopRoster); Debug.WriteLine("output roster: "); outputRoster(troopRosterRemovedTroops); Debug.WriteLine("troopRoosterRemovedTroops count" + troopRosterRemovedTroops.Count() + ", troopRoster tootalCount: " + troopRosterRemovedTroops.TotalManCount); troops.RemoveTroop(troop, troopTypeCount); i--; } } Debug.WriteLine("end of remove troops"); }
public static void Prefix(ref TroopRoster rightMemberRoster) { if (Settings.Instance.Enabled && Settings.Instance.ApplyInventoryPatch && rightMemberRoster.Contains(Hero.MainHero.CharacterObject)) { //TroopRoster newRoster = new TroopRoster(); TroopRoster newRoster = TroopRoster.CreateDummyTroopRoster(); newRoster.Add(rightMemberRoster); PatchInventoryDefaults.DefaultCharacterEquipments.Clear(); foreach (Hero hero in Clan.PlayerClan.Heroes) { if (hero.IsAlive && !hero.IsChild && hero != Hero.MainHero && !newRoster.Contains(hero.CharacterObject)) { newRoster.AddToCounts(hero.CharacterObject, 1); PatchInventoryDefaults.SetDefault(hero.CharacterObject); } } foreach (Hero hero in Clan.PlayerClan.Companions) { if (hero.IsAlive && hero.IsPlayerCompanion && !newRoster.Contains(hero.CharacterObject)) { newRoster.AddToCounts(hero.CharacterObject, 1); PatchInventoryDefaults.SetDefault(hero.CharacterObject); } } rightMemberRoster = newRoster; } }
public static void SortUnits(TroopRoster input, SortType sortType, MBBindingList <PartyCharacterVM> partyVmUnits = null, bool useStickySlots = false) { if (input == null || input.Count == 0) { return; } int sticky = 0; if (useStickySlots) { sticky = PartyManagerSettings.Settings.StickySlots; } var stickyUnits = input.Where(x => !x.Character.IsHero).Select(x => x.Character.Name.ToString()).Take(sticky).ToList(); var inputList = input.ToList(); var flattenedOrder = CreateFlattenedRoster(input, sortType, partyVmUnits); flattenedOrder = flattenedOrder.Where(x => !stickyUnits.Contains(x.Troop.Name.ToString())).ToList(); for (int i = 0; i < inputList.Count; i++) { if (!inputList[i].Character.IsHero && !stickyUnits.Contains(inputList[i].Character.Name.ToString())) { input.RemoveTroop(inputList[i].Character, inputList[i].Number); } } input.Add(flattenedOrder); }
private void AddTroops() { Debug.WriteLine("adding troops, count: " + troopRosterRemovedTroops.Count()); MobileParty heroParty = MobileParty.MainParty; TroopRoster troops = heroParty.MemberRoster; troops.Add(troopRosterRemovedTroops); troopRosterRemovedTroops = new TroopRoster(); areTroopsRemoved = false; }
private void SelectMainPartyMember(MenuCallbackArgs args, Action nextStep, int maxNum) { if (null == this._tempMainMobile) { this._tempMainMobile = MBObjectManager.Instance.CreateObject <MobileParty>("sms_sneak_temp_party"); } else { this._tempMainMobile.MemberRoster.Reset(); } int count = MobileParty.MainParty.MemberRoster.Count; TroopRoster strongestTroopRoster = TroopRoster.CreateDummyTroopRoster(); List <Hero> includeHeros = new List <Hero>(); includeHeros.Add(Hero.MainHero); FlattenedTroopRoster strongestAndPriorTroops = GameComponent.GetStrongestAndPriorTroops(MobileParty.MainParty, maxNum, includeHeros); strongestTroopRoster.Add(strongestAndPriorTroops); bool execueted = OpenSlelectTroops(args, strongestTroopRoster, maxNum, new Func <CharacterObject, bool>(this.CanChangeStatusOfTroop), new Action <TroopRoster>((troop) => { DealPatyTroop(troop); nextStep(); })); if (!execueted) { //如果没有执行,就走随机筛选 TroopRoster troopRosters = MobileParty.MainParty.MemberRoster; List <TroopRosterElement> list = troopRosters.GetTroopRoster(); TroopRoster battleTroopRoster = TroopRoster.CreateDummyTroopRoster(); foreach (TroopRosterElement element in list) { if (element.Character.IsHero && !element.Character.IsPlayerCharacter) { if (battleTroopRoster.Count < maxNum) { battleTroopRoster.AddToCounts(element.Character, element.Number); } } } ; DealPatyTroop(battleTroopRoster); nextStep(); } }
public static void SortUnits(TroopRoster input) { if (SortPartyConfig.SortOrder == TroopSortType.None) { return; } List <TroopRosterElement> list = input.ToList(); List <FlattenedTroopRosterElement> elementList = CreateFlattenedRoster(input); for (int i = 0; i < list.Count; i++) { if (!list[i].Character.IsHero) { input.RemoveTroop(list[i].Character, list[i].Number); } } input.Add(elementList); }
public static void SortUnits(TroopRoster input, SortType sortType, MBBindingList <PartyCharacterVM> partyVmUnits = null) { if (input == null || input.Count == 0) { return; } var inputList = input.ToList(); var flattenedOrder = CreateFlattenedRoster(input, sortType, partyVmUnits); for (int i = 0; i < inputList.Count; i++) { if (!inputList[i].Character.IsHero) { input.RemoveTroop(inputList[i].Character, inputList[i].Number); } } input.Add(flattenedOrder); }
private static MobileParty FillPartyWithTroopsAndInit(Hero leader, Settlement target) { MobileParty rebelParty = MBObjectManager.Instance.CreateObject <MobileParty>(leader.CharacterObject.Name.ToString() + "_" + leader.Id); try { rebelParty.Initialize(); TroopRoster roster = new TroopRoster(); int basicTroopAmount = 128; TroopRoster basicUnits = new TroopRoster(); basicUnits.AddToCounts(leader.Culture.BasicTroop, basicTroopAmount); foreach (var upgrade1 in leader.Culture.BasicTroop.UpgradeTargets) { basicUnits.AddToCounts(upgrade1, basicTroopAmount / 2); foreach (var upgrade2 in upgrade1.UpgradeTargets) { basicUnits.AddToCounts(upgrade2, basicTroopAmount / 2); foreach (var upgrade3 in upgrade2.UpgradeTargets) { basicUnits.AddToCounts(upgrade3, basicTroopAmount / 4); foreach (var upgrade4 in upgrade3.UpgradeTargets) { basicUnits.AddToCounts(upgrade4, basicTroopAmount / 8); } } } } roster.Add(basicUnits); int eliteTroopAmount = 64; TroopRoster eliteUnits = new TroopRoster(); eliteUnits.AddToCounts(leader.Culture.EliteBasicTroop, eliteTroopAmount); foreach (var upgrade1 in leader.Culture.EliteBasicTroop.UpgradeTargets) { eliteUnits.AddToCounts(upgrade1, eliteTroopAmount / 2); foreach (var upgrade2 in upgrade1.UpgradeTargets) { eliteUnits.AddToCounts(upgrade2, eliteTroopAmount / 2); foreach (var upgrade3 in upgrade2.UpgradeTargets) { eliteUnits.AddToCounts(upgrade3, eliteTroopAmount / 4); foreach (var upgrade4 in upgrade3.UpgradeTargets) { eliteUnits.AddToCounts(upgrade4, eliteTroopAmount / 8); } } } } roster.Add(eliteUnits); TroopRoster prisoners = new TroopRoster { IsPrisonRoster = true }; rebelParty.Party.Owner = leader; rebelParty.MemberRoster.AddToCounts(leader.CharacterObject, 1, false, 0, 0, true, 0); rebelParty.SetAsMainParty(); rebelParty.InitializeMobileParty(new TextObject( leader.CharacterObject.GetName().ToString(), null), roster, prisoners, target.GatePosition, 0.0f, 0.0f); foreach (ItemObject item in ItemObject.All) { if (item.IsFood) { rebelParty.ItemRoster.AddToCounts(item, 150); break; } } rebelParty.HomeSettlement = target.BoundVillages[0].Settlement; rebelParty.Quartermaster = leader; } catch (Exception e) { Log.Info("Exception when trying to create new Army"); Log.Error(e); } return(rebelParty); }
internal void CECaptorPrisonerRebel(MenuCallbackArgs args) { CEPersistence.animationPlayEvent = false; TroopRoster releasedPrisoners = TroopRoster.CreateDummyTroopRoster(); try { foreach (TroopRosterElement element in MobileParty.MainParty.PrisonRoster.GetTroopRoster()) { if (element.Character.IsHero) { element.Character.HeroObject.ChangeState(Hero.CharacterStates.Active); } } releasedPrisoners.Add(MobileParty.MainParty.PrisonRoster.ToFlattenedRoster()); MobileParty.MainParty.PrisonRoster.Clear(); } catch (Exception) { CECustomHandler.LogToFile("Couldn't find anymore prisoners."); } if (!releasedPrisoners.GetTroopRoster().IsEmpty()) { try { TroopRosterElement leader = releasedPrisoners.GetTroopRoster().FirstOrDefault(hasHero => hasHero.Character.IsHero); Clan clan = null; Settlement nearest = null; MobileParty prisonerParty = null; if (leader.Character != null) { clan = leader.Character.HeroObject.Clan; nearest = SettlementHelper.FindNearestSettlement(settlement => settlement.OwnerClan == clan) ?? SettlementHelper.FindNearestSettlement(settlement => true); prisonerParty = LordPartyComponent.CreateLordParty("CustomPartyCE_" + MBRandom.RandomInt(int.MaxValue), leader.Character.HeroObject, MobileParty.MainParty.Position2D, 0.5f, nearest); } else { clan = Clan.BanditFactions.First(clanLooters => clanLooters.StringId == "looters"); clan.Banner.SetBannerVisual(Banner.CreateRandomBanner().BannerVisual); nearest = SettlementHelper.FindNearestSettlement(settlement => true); prisonerParty = BanditPartyComponent.CreateBanditParty("CustomPartyCE_" + MBRandom.RandomInt(int.MaxValue), clan, nearest.Hideout, false); } PartyTemplateObject defaultPartyTemplate = clan.DefaultPartyTemplate; prisonerParty.InitializeMobileParty(defaultPartyTemplate, MobileParty.MainParty.Position2D, 0.5f, 0.1f, -1); prisonerParty.SetCustomName(new TextObject("{=CEEVENTS1107}Escaped Captives")); prisonerParty.MemberRoster.Clear(); prisonerParty.ActualClan = clan; prisonerParty.MemberRoster.Add(releasedPrisoners.ToFlattenedRoster()); prisonerParty.IsActive = true; prisonerParty.HomeSettlement = nearest; prisonerParty.SetMovePatrolAroundPoint(nearest.IsTown ? nearest.GatePosition : nearest.Position2D); if (leader.Character != null) { prisonerParty.Party.Owner = leader.Character.HeroObject; #if BETA prisonerParty.ChangePartyLeader(leader.Character); #else prisonerParty.ChangePartyLeader(leader.Character, true); #endif } else { prisonerParty.Party.Owner = clan.Leader; } prisonerParty.RecentEventsMorale = -100; prisonerParty.Aggressiveness = 0.2f; prisonerParty.InitializePartyTrade(0); Hero.MainHero.HitPoints += 40; CECustomHandler.LogToFile(prisonerParty.Leader.Name.ToString()); PlayerEncounter.RestartPlayerEncounter(MobileParty.MainParty.Party, prisonerParty.Party); GameMenu.SwitchToMenu("encounter"); } catch (Exception) { CECaptorContinue(args); } } else { CECaptorContinue(args); } }
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; }