public void DailyTick(MobileParty mobileParty)
        {
            if (!Campaign.Current.DesertionEnabled || !mobileParty.IsActive || (mobileParty.IsDisbanding || mobileParty.Party.MapEvent != null) || !mobileParty.IsLordParty && (!mobileParty.IsGarrison || mobileParty.CurrentSettlement == null) && !mobileParty.IsCaravan)
            {
                return;
            }

            // This party can have desertions, so figure out if it needs them and apply
            TroopRoster desertedTroopList = (TroopRoster)null;

            if (mobileParty.IsLordParty || mobileParty.IsCaravan)
            {
                this.CheckDesertionDueToMorale(mobileParty, ref desertedTroopList);
            }
            this.CheckDesertionDueToPartySizeExceedsPaymentRatio(mobileParty, ref desertedTroopList);

            if (desertedTroopList != (TroopRoster)null && desertedTroopList.Count > 0 && mobileParty.IsMainParty)
            {
                GUI.Notifications.Desertion.Show(Hero.MainHero, desertedTroopList.TotalManCount);
                // Apply penalties to clan (notification handled on action level)
                Actions.ChangeRenown.Apply(mobileParty.LeaderHero, -Convert.ToSingle(desertedTroopList.TotalManCount) * 0.8f, Convert.ToSingle(Campaign.Current.Models.ClanTierModel.GetRequiredRenownForTier(mobileParty.LeaderHero.Clan.Tier))); // TODO test effects if applying to all parties
                Actions.ChangeInfluence.Apply(mobileParty.LeaderHero, -Convert.ToSingle(desertedTroopList.TotalManCount * 2f));
            }

            // Remove party if all members have deserted
            if (mobileParty.Party.NumberOfAllMembers > 0)
            {
                return;
            }
            mobileParty.RemoveParty();
        }
        private static bool OpenAdoptedHeroScreen()
        {
            if (!PartyScreenAllowed)
            {
                return(false);
            }

            if (ScreenManager.TopScreen is not MapScreen)
            {
                Game.Current.GameStateManager.PopState();
            }

            var _partyScreenLogic = new PartyScreenLogic();

            AccessTools.Field(typeof(PartyScreenManager), "_partyScreenLogic").SetValue(PartyScreenManager.Instance, _partyScreenLogic);
            AccessTools.Field(typeof(PartyScreenManager), "_currentMode").SetValue(PartyScreenManager.Instance, PartyScreenMode.Normal);

            var heroRoster = new TroopRoster(null);

            foreach (var hero in BLTAdoptAHeroCampaignBehavior.GetAllAdoptedHeroes().OrderBy(h => h.Name.Raw().ToLower()))
            {
                heroRoster.AddToCounts(hero.CharacterObject, 1);
            }

            _partyScreenLogic.Initialize(heroRoster, new(null), MobileParty.MainParty, false, new("Viewers"), 0, (_, _, _, _, _, _, _, _, _) => true, new("BLT Viewer Heroes"), false);
            _partyScreenLogic.InitializeTrade(PartyScreenLogic.TransferState.NotTransferable, PartyScreenLogic.TransferState.NotTransferable, PartyScreenLogic.TransferState.NotTransferable);
            _partyScreenLogic.SetTroopTransferableDelegate((_, _, _, _) => false);
            var partyState = Game.Current.GameStateManager.CreateState <PartyState>();

            partyState.InitializeLogic(_partyScreenLogic);
            Game.Current.GameStateManager.PushState(partyState);

            return(true);
        }
Exemplo n.º 3
0
        private static void Postfix(Clan clan, ref ExplainedNumber goldChange, bool applyWithdrawals = false)
        {
            foreach (var pair in SlaveEstateBehavior.SlaveEstates)
            {
                int         wage        = 0;
                SlaveEstate slaveEstate = pair.Value;
                Village     village     = pair.Key;
                if (slaveEstate.Guards == null)
                {
                    slaveEstate.Guards = TroopRoster.CreateDummyTroopRoster();
                }
                else
                {
                    foreach (TroopRosterElement troop in slaveEstate.Guards)
                    {
                        wage += troop.Number * troop.Character.TroopWage;
                    }
                }

                if (wage > 0)
                {
                    goldChange.Add(-1 * wage, new TextObject("Wage of slave estate guards at " + village.Name.ToString()));
                }
            }
        }
Exemplo n.º 4
0
        internal static void TrySplitParty(MobileParty mobileParty)
        {
            if (GlobalMilitiaPower + mobileParty.Party.TotalStrength > CalculatedGlobalPowerLimit ||
                mobileParty.MemberRoster.TotalManCount < MinSplitSize ||
                !IsBM(mobileParty) ||
                mobileParty.IsTooBusyToMerge())
            {
                return;
            }

            var roll = Rng.NextDouble();

            if (roll <= Globals.Settings.RandomSplitChance ||
                !IsBM(mobileParty) ||
                mobileParty.Party.TotalStrength <= CalculatedMaxPartyStrength * Globals.Settings.StrengthSplitFactor * Variance ||
                mobileParty.Party.MemberRoster.TotalManCount <= CalculatedMaxPartySize * Globals.Settings.SizeSplitFactor * Variance)
            {
                return;
            }

            var party1     = TroopRoster.CreateDummyTroopRoster();
            var party2     = TroopRoster.CreateDummyTroopRoster();
            var prisoners1 = TroopRoster.CreateDummyTroopRoster();
            var prisoners2 = TroopRoster.CreateDummyTroopRoster();
            var inventory1 = new ItemRoster();
            var inventory2 = new ItemRoster();

            SplitRosters(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2);
            CreateSplitMilitias(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2);
        }
Exemplo n.º 5
0
 internal LootCollector()
 {
     this.LootedMembers      = new TroopRoster();
     this.LootedPrisoners    = new TroopRoster();
     this.LootedItems        = new ItemRoster();
     this.CasualtiesInBattle = new TroopRoster();
 }
Exemplo n.º 6
0
        bool OpenSlelectTroops(MenuCallbackArgs args, TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> canChangeStatusOfTroop, Action <TroopRoster> onDone)
        {
            bool excueted = false;;

            if (null != args.MenuContext.Handler as MenuViewContext)
            {
                excueted = true;
                MenuViewContext menuViewContext = (MenuViewContext)args.MenuContext.Handler;
                MenuView        menuView        = null;
                menuView = menuViewContext.AddMenuView <SpousesDefaultSelectTroops>(new object[]
                {
                    initialRoster,
                    maxNum,
                    canChangeStatusOfTroop,
                    onDone,
                    new Action(() => {
                        if (null != menuView)
                        {
                            menuViewContext.RemoveMenuView(menuView);
                        }
                    })
                });
            }

            return(excueted);
        }
Exemplo n.º 7
0
        private static void SplitRosters(MobileParty original, TroopRoster troops1, TroopRoster troops2,
                                         TroopRoster prisoners1, TroopRoster prisoners2, ItemRoster inventory1, ItemRoster inventory2)
        {
            //Mod.Log($"Processing troops: {original.MemberRoster.Count} types, {original.MemberRoster.TotalManCount} in total");
            foreach (var rosterElement in original.MemberRoster.GetTroopRoster().Where(x => x.Character.HeroObject is null))
            {
                SplitRosters(troops1, troops2, rosterElement);
            }

            if (original.PrisonRoster.TotalManCount > 0)
            {
                //Mod.Log($"Processing prisoners: {original.PrisonRoster.Count} types, {original.PrisonRoster.TotalManCount} in total");
                foreach (var rosterElement in original.PrisonRoster.GetTroopRoster())
                {
                    SplitRosters(prisoners1, prisoners2, rosterElement);
                }
            }

            foreach (var item in original.ItemRoster)
            {
                if (string.IsNullOrEmpty(item.EquipmentElement.Item?.Name?.ToString()))
                {
                    Mod.Log("Bad item: " + item.EquipmentElement);
                    continue;
                }

                var half = Math.Max(1, item.Amount / 2);
                inventory1.AddToCounts(item.EquipmentElement, half);
                var remainder = item.Amount % 2;
                inventory2.AddToCounts(item.EquipmentElement, half + remainder);
            }
        }
Exemplo n.º 8
0
        internal static void TrySplitParty(MobileParty mobileParty)
        {
            if (MilitiaPowerPercent > Globals.Settings.GlobalPowerPercent ||
                mobileParty.MemberRoster.TotalManCount < MinSplitSize ||
                !mobileParty.IsBM() ||
                mobileParty.IsTooBusyToMerge())
            {
                return;
            }


            var roll = Rng.Next(0, 101);

            if (roll > Globals.Settings.RandomSplitChance ||
                mobileParty.Party.MemberRoster.TotalManCount > Math.Max(1, CalculatedMaxPartySize * ReductionFactor))
            {
                return;
            }

            var party1     = TroopRoster.CreateDummyTroopRoster();
            var party2     = TroopRoster.CreateDummyTroopRoster();
            var prisoners1 = TroopRoster.CreateDummyTroopRoster();
            var prisoners2 = TroopRoster.CreateDummyTroopRoster();
            var inventory1 = new ItemRoster();
            var inventory2 = new ItemRoster();

            SplitRosters(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2);
            CreateSplitMilitias(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2);
        }
        private Dictionary <int, int> GetNaughtyPrisoners(TroopRoster prisonRoster)
        {
            Dictionary <int, int> nPrisoners = new Dictionary <int, int>();

            for (int i = 0; i < prisonRoster.Count; i++)
            {
                CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(i);
                if (IsPrisonerRecruitable(characterAtIndex))
                {
                    int naughty = 0;
                    if (GlobalSettings <Settings> .Instance.ApplyEachUnit)
                    {
                        naughty = prisonRoster.GetElementNumber(i) - GetRecruitableNumberInternal(characterAtIndex);
                    }
                    else
                    {
                        naughty = 1;
                    }
                    if (naughty > 0)
                    {
                        nPrisoners[i] = naughty;
                    }
                }
            }
            return(nPrisoners);
        }
Exemplo n.º 10
0
        private static void SynthesizeBM()
        {
            if (!Globals.Settings.MilitiaSpawn ||
                CalculatedMaxPartySize < Globals.Settings.MinPartySize)
            {
                return;
            }

            for (var i = 0; i < (Globals.Settings.GlobalPowerPercent - MilitiaPowerPercent) / 24f; i++)
            {
                var settlement  = Settlement.All.Where(s => !s.IsVisible).GetRandomElementInefficiently();
                var clan        = Clan.BanditFactions.ToList()[Rng.Next(0, Clan.BanditFactions.Count())];
                var mobileParty = settlement.IsHideout
                    ? BanditPartyComponent.CreateBanditParty("Bandit_Militia", clan, settlement.Hideout, false)
                    : BanditPartyComponent.CreateLooterParty("Bandit_Militia", clan, settlement, false);
                mobileParty.InitializeMobilePartyAroundPosition(clan.DefaultPartyTemplate, settlement.GatePosition, 0);
                var simulatedMergedRoster = TroopRoster.CreateDummyTroopRoster();
                for (var count = 0;
                     count < CalculatedMaxPartySize / Globals.Settings.MinPartySize &&
                     simulatedMergedRoster.TotalManCount < CalculatedMaxPartySize &&
                     NumMountedTroops(simulatedMergedRoster) <= simulatedMergedRoster.TotalManCount / 2;
                     count++)
                {
                    simulatedMergedRoster.Add(mobileParty.MemberRoster);
                }

                var _ = new Militia(mobileParty.Position2D, simulatedMergedRoster, TroopRoster.CreateDummyTroopRoster());
                Trash(mobileParty);
                DoPowerCalculations();
            }
        }
Exemplo n.º 11
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);
        }
Exemplo n.º 12
0
        protected override void OnClick()
        {
            TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster;
            int         num          = 0;
            IRecruitPrisonersCampaignBehavior campaignBehavior = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>();
            CharacterObject bestPrisoner = null;

            while ((bestPrisoner = getBestRecruitablePrisoner()) != null)
            {
                if (MobileParty.MainParty.Party.PartySizeLimit <= MobileParty.MainParty.MemberRoster.TotalManCount)
                {
                    break;
                }

                int recruitableNumber = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>().GetRecruitableNumber(bestPrisoner);
                if (recruitableNumber > 0)
                {
                    int maxRecruitable = MobileParty.MainParty.Party.PartySizeLimit - MobileParty.MainParty.MemberRoster.TotalManCount;
                    recruitableNumber = Math.Min(recruitableNumber, maxRecruitable);
                    num += recruitableNumber;
                    PartyCommand command = new PartyCommand();
                    command.FillForRecruitTroop(PartyRosterSide.Right, TroopType.Prisoner, bestPrisoner, recruitableNumber);
                    _partyLogic.AddCommand(command);
                }
            }
            InformationManager.DisplayMessage(new InformationMessage("Recruited " + num.ToString() + " prisoners"));
        }
Exemplo n.º 13
0
        // Helpers.MobilePartyHelper
        public static FlattenedTroopRoster GetStrongestAndPriorTroops(MobileParty mobileParty, int maxTroopCount, List <Hero> includeList)
        {
            TroopRoster          troopRoster  = TroopRoster.CreateDummyTroopRoster();
            FlattenedTroopRoster memberRoster = mobileParty.MemberRoster.ToFlattenedRoster();

            memberRoster.RemoveIf((x) => x.IsWounded);
            List <CharacterObject> list = memberRoster.Select((x) => x.Troop).OrderByDescending((x) => x.Level).ToList <CharacterObject>();

            if (null != includeList && includeList.Count > 0)
            {
                foreach (Hero hero  in includeList)
                {
                    if (list.Any((x) => x == hero.CharacterObject))
                    {
                        list.Remove(hero.CharacterObject);
                        troopRoster.AddToCounts(hero.CharacterObject, 1, false, 0, 0, true, -1);
                        maxTroopCount--;
                    }
                }
            }
            List <CharacterObject> heroList = list.Where((x) => x.IsHero).ToList <CharacterObject>();
            int num = Math.Min(heroList.Count <CharacterObject>(), maxTroopCount);

            for (int i = 0; i < num; i++)
            {
                troopRoster.AddToCounts(heroList[i], 1, false, 0, 0, true, -1);
                list.Remove(heroList[i]);
            }
            return(troopRoster.ToFlattenedRoster());
        }
Exemplo n.º 14
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;
            }
        }
 public static void Prefix(MobileParty sellerParty, TroopRoster prisoners, Settlement currentSettlement, bool applyGoldChange)
 {
     if (currentSettlement != null)
     {
         currentSettlement.Prosperity += (float)prisoners.TotalRegulars * SubModule.Settings.PrisonerProsperityValue;
     }
 }
Exemplo n.º 16
0
        private void DailyTick()
        {
            MobileParty mainParty    = MobileParty.MainParty;
            TroopRoster memberRoster = mainParty.MemberRoster;

            if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit)
            {
                return;
            }

            TroopRoster prisonRoster = mainParty.PrisonRoster;

            if (prisonRoster.TotalManCount == 0)
            {
                return;
            }

            IRecruitPrisonersCampaignBehavior recruitPrisonerBehavior = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>();

            if (recruitPrisonerBehavior == null)
            {
                return;
            }

            List <Tuple <CharacterObject, int> > recruitablePrisoners = new List <Tuple <CharacterObject, int> >();

            for (int i = 0; i < prisonRoster.Count; i++)
            {
                CharacterObject prisoner       = prisonRoster.GetCharacterAtIndex(i);
                int             numRecruitable = recruitPrisonerBehavior.GetRecruitableNumber(prisoner);

                if (numRecruitable > 0)
                {
                    recruitablePrisoners.Add(new Tuple <CharacterObject, int>(prisoner, numRecruitable));
                }
            }

            recruitablePrisoners.Sort((x, y) => y.Item1.Tier.CompareTo(x.Item1.Tier));

            for (int i = 0; i < recruitablePrisoners.Count; i++)
            {
                CharacterObject prisoner       = recruitablePrisoners[i].Item1;
                int             numRecruitable = recruitablePrisoners[i].Item2;
                while (numRecruitable > 0)
                {
                    recruitPrisonerBehavior.SetRecruitableNumber(prisoner, --numRecruitable);
                    prisonRoster.AddToCounts(prisoner, -1, false, 0, 0, true, -1);
                    mainParty.MemberRoster.AddToCounts(prisoner, 1, false, 0, 0, true, -1);
                    if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit)
                    {
                        break;
                    }
                }
                if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit)
                {
                    break;
                }
            }
        }
Exemplo n.º 17
0
 private void btnPrisoners_Click(object sender, EventArgs e)
 {
     this.prisonRoster = !this.prisonRoster;
     Roster            = this.prisonRoster ? Coordinator.Hero.PartyBelongedTo.Party.PrisonRoster : Coordinator.Hero.PartyBelongedTo.Party.MemberRoster;
     this.UpdateRosterList();
     this.btnPrisoners.Text     = "显示 " + (this.prisonRoster ? "部队" : "俘虏");
     this.btnTroopsUpgrade.Text = this.prisonRoster ? "招募" : "升级";
 }
 public GauntletMenuSpousesSelectTroops(TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> changeChangeStatusOfTroop, Action <TroopRoster> onDone, Action onCanel)
 {
     this._onCanel                   = onCanel;
     this._onDone                    = onDone;
     this._initialRoster             = initialRoster;
     this._maxNum                    = maxNum;
     this._changeChangeStatusOfTroop = changeChangeStatusOfTroop;
 }
Exemplo n.º 19
0
        public static void ConvertLootersToKingdomCultureRecruits(ref TroopRoster troopRoster, CultureObject culture, int numberToUpgrade)
        {
            var recruit = Recruits.Where(x =>
                                         x.Culture == Clan.All.FirstOrDefault(k => k.Culture == culture)?.Culture)
                          .ToList().GetRandomElement() ?? Recruits.ToList().GetRandomElement();

            troopRoster.AddToCounts(recruit, numberToUpgrade);
        }
Exemplo n.º 20
0
 private void outputRoster(TroopRoster roster)
 {
     for (int i = 0; i < roster.Count(); i++)
     {
         CharacterObject troop = roster.GetCharacterAtIndex(i);
         Debug.WriteLine("roster member: " + troop.Name + ", count: " + roster.GetTroopCount(troop));
     }
 }
Exemplo n.º 21
0
 public Militia(MobileParty mobileParty, TroopRoster party, TroopRoster prisoners)
 {
     Banner    = Banners.GetRandomElement();
     BannerKey = Banner.Serialize();
     Spawn(mobileParty, party, prisoners);
     TrainMilitia();
     PartyMilitiaMap.Add(MobileParty, this);
     LogMilitiaFormed(MobileParty);
 }
 public static void RegisterTemplate(Hero leader, TroopRoster template)
 {
     if (PartyAICommandsBehavior.Instance.template_map == null)
     {
         PartyAICommandsBehavior.Instance.template_map = new Dictionary <Hero, TroopRoster>();
     }
     PartyAICommandsBehavior.Instance.template_map[leader] = new TroopRoster((PartyBase)null);
     PartyAICommandsBehavior.Instance.template_map[leader].Add(template);
 }
Exemplo n.º 23
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;
        }
Exemplo n.º 24
0
 public SpousesSelectTroopsVM(TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> canChangeChangeStatusOfTroop, Action <TroopRoster> onDone)
 {
     this._canChangeChangeStatusOfTroop = canChangeChangeStatusOfTroop;
     this._onDone        = onDone;
     this._maxNum        = maxNum;
     this._initialRoster = initialRoster;
     this.InitList();
     this.RefreshValues();
     this._maxSelectableTroopCount = maxNum;
     this.OnCurrentSelectedAmountChange();
 }
Exemplo n.º 25
0
        public static List <FlattenedTroopRosterElement> CreateFlattenedRoster(TroopRoster roster)
        {
            IEnumerable <FlattenedTroopRosterElement> source = from x in roster.ToFlattenedRoster()
                                                               where !x.Troop.IsHero
                                                               select x;

            switch (SortPartyConfig.SortOrder)
            {
            case TroopSortType.TierDesc:
                return((from x in source
                        orderby x.Troop.Tier descending, x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.TierAsc:
                return((from x in source
                        orderby x.Troop.Tier, x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.TierDescType:
                return((from x in source
                        orderby x.Troop.Tier descending, IsMountedUnit(x.Troop), IsRangedUnit(x.Troop), x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.TierAscType:
                return((from x in source
                        orderby x.Troop.Tier, IsMountedUnit(x.Troop), IsRangedUnit(x.Troop), x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.MountRangeTierDesc:
                return((from x in source
                        orderby IsMountedUnit(x.Troop) descending, IsRangedUnit(x.Troop), x.Troop.Tier descending, x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.MountRangeTierAsc:
                return((from x in source
                        orderby IsMountedUnit(x.Troop) descending, IsRangedUnit(x.Troop), x.Troop.Tier, x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.CultureTierDesc:
                return((from x in source
                        orderby x.Troop.Culture.Name.ToString(), x.Troop.Tier descending, x.Troop.Name.ToString()
                        select x).ToList());

            case TroopSortType.CultureTierAsc:
                return((from x in source
                        orderby x.Troop.Culture.Name.ToString(), x.Troop.Tier, x.Troop.Name.ToString()
                        select x).ToList());

            default:
                return((from x in source
                        orderby x.Troop.Tier descending, x.Troop.Name.ToString()
                        select x).ToList());
            }
        }
Exemplo n.º 26
0
 public SlaveEstate()
 {
     _village                    = Settlement.CurrentSettlement.Village;
     _prisoners                  = TroopRoster.CreateDummyTroopRoster();
     _stockpile                  = new ItemRoster();
     _product                    = FindProduct(_village);
     _logs                       = new List <DailyLog>();
     _surgeon_house_level        = 0;
     _overseer_house_level       = 0;
     _tool_repair_workshop_level = 0;
 }
Exemplo n.º 27
0
        public static TroopRoster ConstructTroopRoster(PartyTemplateObject template, PartyBase party)
        {
            TroopRoster roster = new TroopRoster(party);

            foreach (PartyTemplateStack stack in template.Stacks)
            {
                int num = MBRandom.RandomInt(stack.MinValue, stack.MaxValue);
                roster.AddToCounts(stack.Character, num);
            }
            return(roster);
        }
        public static void DesertTroopsFromParty(MobileParty party, int stackNo, int numberOfDeserters, ref TroopRoster desertedTroopList)
        {
            TroopRosterElement rosterSlot = party.MemberRoster.GetElementCopyAtIndex(stackNo);

            party.MemberRoster.AddToCounts(rosterSlot.Character, -numberOfDeserters, false, 0, 0, true, -1);
            if (desertedTroopList == (TroopRoster)null)
            {
                desertedTroopList = new TroopRoster();
            }
            desertedTroopList.AddToCounts(rosterSlot.Character, numberOfDeserters, false, 0, 0, true, -1);
        }
        private void DailyTick()
        {
            Settings    settings     = GlobalSettings <Settings> .Instance;
            TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster;

            // I'm not sure how the following line redirects to my function. Todd Howard: "It just works"
            float[] dailyRecruitedPrisoners = Campaign.Current.Models.PrisonerRecruitmentCalculationModel.GetDailyRecruitedPrisoners(MobileParty.MainParty);
            float   excess = dailyRecruitedPrisoners[dailyRecruitedPrisoners.Length - 1]; // This is pooled chance to recruit higher tiers than we have settings for
            Dictionary <int, int> nPrisoners = GetNaughtyPrisoners(prisonRoster);         // Get prisoner index -> not yet recruitable number
            int totalN = GetTotalNaughty(nPrisoners);                                     // Determine how many loops we need to process the above dictionary

            for (int n = 0; n < totalN; n++)
            {
                int i     = MBRandom.RandomInt(nPrisoners.Count);             // Get random for better distribution
                int index = nPrisoners.ElementAt(i).Key;
                nPrisoners[index] -= 1;
                if (nPrisoners[index] < 1)
                {
                    nPrisoners.Remove(index);
                }
                CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(index);
                int             tier             = characterAtIndex.Tier;
                if (dailyRecruitedPrisoners[tier] > 0f)                 // TODO We should probably organise nPrisoners by Tier, index, then unrecruited so we can remove Tier chance < 0
                {
                    if (tier < dailyRecruitedPrisoners.Length)
                    {
                        if (MBRandom.RandomFloat < dailyRecruitedPrisoners[tier])
                        {
                            // 100 Leadership decreases chance decrease per recruitment by 33%, capped at 275
                            float chanceDecreaseLeadership = settings.LeadershipBase
                                                             - Math.Min(settings.LeadershipCap, Clan.PlayerClan.Leader.GetSkillValue(DefaultSkills.Charm)) / (float)settings.LeadershipDiv;

                            SetRecruitableNumberInternal(characterAtIndex, GetRecruitableNumberInternal(characterAtIndex) + 1);

                            // Clan Tier has exponential effect, increase power base to increase steepness, change float multipler to change ceiling
                            float clanPowerThing = (float)Math.Pow(settings.ClanTierChanceLossDecreasePowerBase, Clan.PlayerClan.Tier + settings.ClanTierChanceLossDecreasePowerAdd);
                            float clanImpact     = settings.ClanTierChanceLossDecreaseBase + settings.ClanTierChanceLossDecreaseFloat * clanPowerThing - settings.ClanTierChanceLossDecreaseFloat;
                            dailyRecruitedPrisoners[tier] -= chanceDecreaseLeadership / (clanImpact);
                        }
                    }
                    else if (MBRandom.RandomFloat < excess)
                    {
                        float chanceDecreaseLeadership = settings.LeadershipBase
                                                         - Math.Min(settings.LeadershipCap, Clan.PlayerClan.Leader.GetSkillValue(DefaultSkills.Charm)) / (float)settings.LeadershipDiv;
                        SetRecruitableNumberInternal(characterAtIndex, GetRecruitableNumberInternal(characterAtIndex) + 1);
                        float clanPowerThing = (float)Math.Pow(settings.ClanTierChanceLossDecreasePowerBase, Clan.PlayerClan.Tier + settings.ClanTierChanceLossDecreasePowerAdd);
                        float clanImpact     = settings.ClanTierChanceLossDecreaseBase + settings.ClanTierChanceLossDecreaseFloat * clanPowerThing - settings.ClanTierChanceLossDecreaseFloat;
                        excess -= chanceDecreaseLeadership / clanImpact;
                    }
                }
            }
            RemoveUnused(prisonRoster);
        }
Exemplo n.º 30
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");
        }