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.º 2
0
        internal static int NumMountedTroops(TroopRoster troopRoster)
        {
            var mountedTroops         = troopRoster.GetTroopRoster().Where(x => x.Character.IsMounted);
            var mountedTroopTypeCount = mountedTroops.Count();
            var total = 0;

            for (var i = 0; i < mountedTroopTypeCount; i++)
            {
                total += troopRoster.GetElementNumber(i);
            }

            return(total);
        }
        private void DailyTick()
        {
            TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster;

            float[] dailyRecruitingProbabilityByTier = (float[])_dailyRecruitingProbabilityByTier.Clone();
            float[] dailyTierRecruitProbabilityDecay = (float[])_dailyTierRecruitProbabilityDecay.Clone();

            int randomIndexToStartAt = MBRandom.RandomInt(prisonRoster.Count);

            for (int i = 0; i < prisonRoster.Count; i++)
            {
                int index = (i + randomIndexToStartAt) % prisonRoster.Count;

                CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(index);
                if (!IsPrisonerRecruitable(characterAtIndex))
                {
                    continue;
                }

                int numberOfTroops = prisonRoster.GetElementNumber(index);
                int numberOfCurrentlyRecruitableTroops = this.GetRecruitableNumber(characterAtIndex);


                int troopTier    = characterAtIndex.Tier;
                int troopsToRoll = numberOfTroops;

                if (ConfigLoader.Instance.Config.ScaleByReadyToRecruit)
                {
                    troopsToRoll -= numberOfCurrentlyRecruitableTroops;
                }

                //Loop through all the prisoners  we want to roll a probability for changing into a recruitable prisoner
                for (int n = 0; n < troopsToRoll && numberOfCurrentlyRecruitableTroops < numberOfTroops; n++)
                {
                    //If any of them pass their current probability check.
                    if (troopTier < dailyRecruitingProbabilityByTier.Length &&
                        dailyRecruitingProbabilityByTier[troopTier] > 0f &&
                        MBRandom.RandomFloat < dailyRecruitingProbabilityByTier[troopTier])
                    {
                        numberOfCurrentlyRecruitableTroops++;
                        this.SetRecruitableNumber(characterAtIndex, numberOfCurrentlyRecruitableTroops);
                        dailyRecruitingProbabilityByTier[troopTier] -= dailyTierRecruitProbabilityDecay[troopTier];
                    }
                }
            }
        }
        private void DailyTick()
        {
            TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster;

            float[] dailyRecruitingProbabilityByTier = (float[])_dailyRecruitingProbabilityByTier.Clone();
            float[] dailyTierRecruitProbabilityDecay = (float[])_dailyTierRecruitProbabilityDecay.Clone();
            int     num = MBRandom.RandomInt(prisonRoster.Count);

            for (int i = 0; i < prisonRoster.Count; i++)
            {
                int index = (i + num) % prisonRoster.Count;

                CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(index);
                if (!IsPrisonerRecruitable(characterAtIndex))
                {
                    continue;
                }
                int elementNumber             = prisonRoster.GetElementNumber(index);
                int recruitableNumberInternal = GetRecruitableNumber(characterAtIndex);
                prisonRoster.GetElementCopyAtIndex(index);

                if (recruitableNumberInternal < elementNumber)
                {
                    int tier = characterAtIndex.Tier;
                    int troopsLeftToRecruit = elementNumber;

                    if (ConfigLoader.Instance.Config.ScaleByReadyToRecruit)
                    {
                        troopsLeftToRecruit -= recruitableNumberInternal;
                    }

                    for (int n = 0; n < troopsLeftToRecruit; n++)
                    {
                        if (tier < dailyRecruitingProbabilityByTier.Length && dailyRecruitingProbabilityByTier[tier] > 0f && MBRandom.RandomFloat < dailyRecruitingProbabilityByTier[tier])
                        {
                            recruitableNumberInternal++;
                            SetRecruitableNumber(characterAtIndex, recruitableNumberInternal);
                            dailyRecruitingProbabilityByTier[tier] -= dailyTierRecruitProbabilityDecay[tier];
                        }
                    }
                }
            }
        }
        private void RemoveUnused(TroopRoster roster)
        {
            if (_recruitables.Count == 0)
            {
                return;
            }
            Dictionary <CharacterObject, int> dictionary = new Dictionary <CharacterObject, int>();

            for (int i = 0; i < roster.Count; i++)
            {
                CharacterObject characterAtIndex = roster.GetCharacterAtIndex(i);
                _recruitables.TryGetValue(characterAtIndex, out int value);
                int num = Math.Min(value, roster.GetElementNumber(i));
                if (num > 0)
                {
                    dictionary[characterAtIndex] = num;
                }
            }
            _recruitables = dictionary;
        }