Exemplo n.º 1
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.º 2
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");
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
                    }
                }
            }
        }