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)); } }
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"); }
private static bool Prefix(ref Hero buyerHero, Hero sellerHero, int index, ref bool __result) { Hero leader = buyerHero; if ((leader != null ? leader.getTemplate() : (TroopRoster)null) != (TroopRoster)null && buyerHero?.PartyBelongedTo?.Party != null) { TroopRoster template = buyerHero.getTemplate(); CharacterObject volunteerType = sellerHero.VolunteerTypes[index]; CharacterObject troop = volunteerType; int troopCount = template.GetTroopCount(troop); if (buyerHero.PartyBelongedTo.Party.PartySizeLimit <= buyerHero.PartyBelongedTo.Party.NumberOfAllMembers) { __result = false; return(false); } switch (troopCount) { case 0: __result = false; break; case 1: if (buyerHero.Clan == Clan.PlayerClan) { buyerHero = CharacterObject.PlayerCharacter.HeroObject; } __result = index < HeroHelper.MaximumIndexHeroCanRecruitFromHero(buyerHero, sellerHero); break; default: if (troopCount - buyerHero.PartyBelongedTo.MemberRoster.GetTroopCount(volunteerType) <= 0) { __result = false; break; } goto case 1; } return(false); } if (buyerHero.Clan == Clan.PlayerClan) { buyerHero = CharacterObject.PlayerCharacter.HeroObject; } return(true); }
bool cleanseRoster(TroopRoster roster) { bool removed = false; // search for corrupted troops in the internal member "data" of TroopRoster TroopRosterElement[] troops = (TroopRosterElement[])roster.GetType().GetField("data", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(roster); var characterObjects = troops.Where(t => t.Number > 0 && t.Character?.Age == 0f).Select(t => t.Character).ToList(); if (characterObjects.Any()) { // delete them foreach (CharacterObject troop in characterObjects) { roster.RemoveTroop(troop, roster.GetTroopCount(troop)); removed = true; } } return(removed); }
private void OnSettlementEntered(MobileParty party, Settlement settlement, Hero hero) { if (party?.LeaderHero == null || !settlement.IsTown && !settlement.IsVillage || !party.IsLordParty && !party.IsCaravan) { return; } Dictionary <ItemCategory, int> dictionary1 = new Dictionary <ItemCategory, int>(5); MobileParty mobileParty = party; TroopRoster troopRoster1; if (mobileParty == null) { troopRoster1 = (TroopRoster)null; } else { Hero leaderHero = mobileParty.LeaderHero; troopRoster1 = leaderHero != null?leaderHero.getTemplate() : (TroopRoster)null; } TroopRoster troopRoster2 = troopRoster1; Town town = (Town)null; if (settlement.IsTown) { town = settlement.GetComponent <Town>(); } foreach (TroopRosterElement troopRosterElement in party.MemberRoster) { int val1 = troopRosterElement.NumberReadyToUpgrade; if (val1 > 0) { foreach (CharacterObject upgradeTarget in troopRosterElement.Character.UpgradeTargets) { ItemCategory itemFromCategory = upgradeTarget.UpgradeRequiresItemFromCategory; if ((town == null || town.MarketData.GetItemCountOfCategory(itemFromCategory) != 0) && itemFromCategory != null) { if (troopRoster2 != (TroopRoster)null) { int troopCount = troopRoster2.GetTroopCount(upgradeTarget); if (troopCount != 0) { if (troopCount > 1) { val1 = Math.Min(val1, troopCount - party.MemberRoster.GetTroopCount(upgradeTarget)); if (val1 <= 0) { continue; } } } else { continue; } } if (dictionary1.ContainsKey(itemFromCategory)) { dictionary1[itemFromCategory] += val1; } else { dictionary1[itemFromCategory] = val1; } } } } } if (dictionary1.Count <= 0) { return; } if (town != null) { foreach (ItemCategory key in dictionary1.Keys) { if (dictionary1[key] > town.MarketData.GetItemCountOfCategory(key)) { dictionary1[key] = town.MarketData.GetItemCountOfCategory(key); } } } Hero leaderHero1 = party.LeaderHero; Dictionary <ItemCategory, List <ItemRosterElement> > dictionary2 = new Dictionary <ItemCategory, List <ItemRosterElement> >(dictionary1.Count); SettlementComponent market = settlement.GetComponent(typeof(SettlementComponent)); foreach (ItemRosterElement itemRosterElement in settlement.ItemRoster) { ItemCategory itemCategory = itemRosterElement.EquipmentElement.Item.ItemCategory; if (dictionary1.ContainsKey(itemCategory) && !dictionary2.ContainsKey(itemCategory)) { dictionary2[itemCategory] = new List <ItemRosterElement>(); } dictionary2[itemCategory].Add(itemRosterElement); } foreach (KeyValuePair <ItemCategory, List <ItemRosterElement> > keyValuePair in dictionary2) { foreach (ItemRosterElement subject in keyValuePair.Value.OrderBy <ItemRosterElement, int>((Func <ItemRosterElement, int>)(o => market.GetItemPrice(o.EquipmentElement, party))).ToList <ItemRosterElement>()) { int num = Math.Min(subject.Amount, dictionary1[keyValuePair.Key]); while (num > 0 && leaderHero1.Gold > market.GetItemPrice(subject.EquipmentElement, party)) { SellItemsAction.Apply(settlement.Party, party.Party, subject, 1, settlement); --num; dictionary1[keyValuePair.Key]--; } if (num <= 0) { if (dictionary1[keyValuePair.Key] == 0) { break; } } else { break; } } } }