コード例 #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
        //If performance is an issue let's memoize this, reason I haven't done that off the bat is
        //there is no readily safe identifier I can use to link the same troop types.
        //and honestly I think its over-optimising anyways to even consider it, memory is enough of a problem.
        private static double getTroopXpDivisor(TroopRoster roster, FlattenedTroopRosterElement item)
        {
            int indexOfTroop = roster.FindIndexOfTroop(item.Troop);

            if (indexOfTroop == -1)
            {
                return(1);
            }
            TroopRosterElement element = roster.GetElementCopyAtIndex(indexOfTroop);

            if (element.NumberReadyToUpgrade == 0 || element.Number == 0)
            {
                return(1);
            }
            return((double)element.Number / (double)element.NumberReadyToUpgrade);
        }
コード例 #3
0
        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];
                        }
                    }
                }
            }
        }