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"); }
//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); }
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]; } } } } }