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;
                    }
                }
            }
        }
        private static bool Prefix(
            PartiesBuyHorseCampaignBehavior __instance,
            MobileParty mobileParty,
            Settlement settlement,
            Hero hero)
        {
            if (mobileParty != null && !mobileParty.MapFaction.IsAtWarWith(settlement.MapFaction) && (mobileParty != MobileParty.MainParty && mobileParty.IsLordParty) && (mobileParty.LeaderHero != null && !mobileParty.IsDisbanding && settlement.IsTown))
            {
                double currentTime    = (double)Campaign.CurrentTime;
                int    num1           = Math.Min(100000, mobileParty.Leader.HeroObject.Gold);
                int    numberOfMounts = mobileParty.Party.NumberOfMounts;
                if (numberOfMounts > mobileParty.Party.NumberOfRegularMembers)
                {
                    return(false);
                }
                Town component = settlement.GetComponent <Town>();
                if (component.MarketData.GetItemCountOfCategory(DefaultItemCategories.Horse) == 0)
                {
                    return(false);
                }
                float averageValue = DefaultItemCategories.Horse.AverageValue;
                float num2         = averageValue * (float)numberOfMounts / (float)num1;
                if ((double)num2 < 0.0799999982118607)
                {
                    float randomFloat1 = MBRandom.RandomFloat;
                    float randomFloat2 = MBRandom.RandomFloat;
                    float randomFloat3 = MBRandom.RandomFloat;
                    float num3         = (0.08f - num2) * (float)num1 * randomFloat1 * randomFloat2 * randomFloat3;
                    if ((double)num3 > (double)(mobileParty.Party.NumberOfRegularMembers - numberOfMounts) * (double)averageValue)
                    {
                        num3 = (float)(mobileParty.Party.NumberOfRegularMembers - numberOfMounts) * averageValue;
                    }
                    Traverse.Create((object)__instance).Method("BuyHorses", new Type[3]
                    {
                        typeof(MobileParty),
                        typeof(Town),
                        typeof(float)
                    }, (object[])null).GetValue((object)mobileParty, (object)component, (object)num3);
                }
            }
            if (mobileParty == null || mobileParty == MobileParty.MainParty || (!mobileParty.IsLordParty || mobileParty.LeaderHero == null) || (mobileParty.IsDisbanding || !settlement.IsTown))
            {
                return(true);
            }
            float            num4 = 0.0f;
            EquipmentElement equipmentElement;

            for (int index = mobileParty.ItemRoster.Count - 1; index >= 0; --index)
            {
                ItemRosterElement subject = mobileParty.ItemRoster[index];
                equipmentElement = subject.EquipmentElement;
                if (equipmentElement.Item.IsMountable)
                {
                    double num1   = (double)num4;
                    int    amount = subject.Amount;
                    equipmentElement = subject.EquipmentElement;
                    int    num2 = equipmentElement.Item.Value;
                    double num3 = (double)(amount * num2);
                    num4 = (float)(num1 + num3);
                }
                else
                {
                    equipmentElement = subject.EquipmentElement;
                    if (!equipmentElement.Item.IsFood)
                    {
                        SellItemsAction.Apply(mobileParty.Party, settlement.Party, subject, subject.Amount, settlement);
                    }
                }
            }
            float num5 = Math.Min(100000f, (float)mobileParty.LeaderHero.Gold);
            float num6 = (float)(mobileParty.Party.PartySizeLimit - mobileParty.Party.NumberOfMenWithHorse);

            if ((double)num4 > (double)num5 * 0.100000001490116)
            {
                for (int index = (int)((double)mobileParty.Party.NumberOfMounts - (double)num6); index < 10; ++index)
                {
                    ItemRosterElement subject = new ItemRosterElement();
                    int num1 = 0;
                    foreach (ItemRosterElement itemRosterElement in mobileParty.ItemRoster)
                    {
                        equipmentElement = itemRosterElement.EquipmentElement;
                        if (equipmentElement.Item.IsMountable)
                        {
                            equipmentElement = itemRosterElement.EquipmentElement;
                            if (equipmentElement.Item.Value > num1)
                            {
                                equipmentElement = itemRosterElement.EquipmentElement;
                                num1             = equipmentElement.Item.Value;
                                subject          = itemRosterElement;
                            }
                        }
                    }
                    if (num1 > 0)
                    {
                        SellItemsAction.Apply(mobileParty.Party, settlement.Party, subject, 1, settlement);
                        num4 -= (float)num1;
                        if ((double)num4 < (double)num5 * 0.100000001490116)
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(false);
        }