コード例 #1
0
        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");
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
        }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
            }
        }
コード例 #10
0
        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;
        }