Ejemplo n.º 1
0
        public List<Item> retrieve_random_items(Permanent_ITypes iTyp, Player pl, int number, int c_floor)
        {
            BaseItemDC[] raw_items = new BaseItemDC[0];
            List<BaseItemDC> selected_items = new List<BaseItemDC>();
            List<BaseItemDC> teaser_items = new List<BaseItemDC>();
            List<Item> fetched_items = new List<Item>();

            switch (iTyp)
            {
                case Permanent_ITypes.Armor:
                    raw_items = cManager.Load<ArmorDC[]>("XmlData/Items/armors");
                    break;
                case Permanent_ITypes.Weapon:
                    raw_items = cManager.Load<WeaponDC[]>("XmlData/Items/weapons");
                    break;
                case Permanent_ITypes.Scroll:
                    raw_items = cManager.Load<ScrollDC[]>("XmlData/Items/scrolls");
                    break;
            }

            int playerGold = pl.get_my_gold();
            int tiers_available = calc_tier(playerGold);
            if (iTyp == Permanent_ITypes.Scroll)
                tiers_available = calc_scroll_tier(playerGold);
            int teaser_tier = calc_tier(pl.get_my_lifetime_gold());
            string pl_chclass = pl.my_class_as_string();

            for (int i = 0; i < raw_items.Count(); i++)
            {
                string[] available_for = raw_items[i].ValidClasses.Split(' ');
                bool valid_class = false;
                for(int cl = 0; cl < available_for.Count(); cl++)
                    if(String.Compare(available_for[cl], pl_chclass) == 0)
                        valid_class = true;

                if (valid_class && (raw_items[i].ItemTier == tiers_available ||
                                   raw_items[i].ItemTier == tiers_available - 1) &&
                                   (raw_items[i].Cost <= playerGold ||
                                    raw_items[i].Cost == 250) &&
                                   c_floor > raw_items[i].FloorsRequired)
                    selected_items.Add(raw_items[i]);

                if (valid_class && raw_items[i].ItemTier == teaser_tier)
                    teaser_items.Add(raw_items[i]);
            }

            while (fetched_items.Count < number - 1 && selected_items.Count > 0)
            {
                int selected_index = rGen.Next(selected_items.Count);
                add_dataclass_to_final_list(selected_items[selected_index], ref fetched_items);
                //Remove them from the list afterwards.
                selected_items.RemoveAt(selected_index);
            }

            int teaser_item = rGen.Next(2);
            if (teaser_item == 0 && teaser_items.Count() > 0 && tiers_available != teaser_tier)
            {
                int teaser_index = rGen.Next(teaser_items.Count());
                add_dataclass_to_final_list(teaser_items[teaser_index], ref fetched_items);
            }
            else
            {
                if (selected_items.Count > 0)
                {
                    int selected_index = rGen.Next(selected_items.Count);
                    add_dataclass_to_final_list(selected_items[selected_index], ref fetched_items);
                }
            }

            return fetched_items;
        }
Ejemplo n.º 2
0
        public List<Item> retrieve_random_consumables(Player pl, int number)
        {
            PotionDC[] raw_potion_data = cManager.Load<PotionDC[]>("XmlData/Items/potions");
            List<PotionDC> selected_potion_data = new List<PotionDC>();

            List<Item> fetched_list = new List<Item>();

            int tiers_available = 0;
            int playerGold = pl.get_my_gold();

            if (playerGold < 500)
                tiers_available = 1;
            else
                tiers_available = 2;

            string pl_chclass = pl.my_class_as_string();
            for (int i = 0; i < raw_potion_data.Count(); i++)
            {
                string[] available_for = raw_potion_data[i].ValidClasses.Split(' ');
                bool valid_class = false;
                for (int cl = 0; cl < available_for.Count(); cl++)
                    if (String.Compare(pl_chclass, available_for[cl]) == 0)
                        valid_class = true;

                if(valid_class && (raw_potion_data[i].ItemTier == tiers_available ||
                                   raw_potion_data[i].ItemTier == tiers_available-1) &&
                                   (raw_potion_data[i].Cost <= playerGold ||
                                    raw_potion_data[i].Cost == 500))
                    selected_potion_data.Add(raw_potion_data[i]);
            }

            while ((fetched_list.Count) < number && selected_potion_data.Count > 0)
            {
                int selected_p_index = rGen.Next(selected_potion_data.Count);
                bool duplicate_type = false;
                //Check to see if it's a duplicate type first.
                for (int j = 0; j < fetched_list.Count; j++)
                {
                    if (fetched_list[j] is Potion)
                    {
                        Potion p = (Potion)fetched_list[j];
                        string rpdType = selected_potion_data[selected_p_index].PotionType;
                        switch (p.get_type())
                        {
                            case Potion.Potion_Type.Health:
                                duplicate_type = String.Compare(rpdType, "Health") == 0;
                                break;
                            case Potion.Potion_Type.Repair:
                                duplicate_type = String.Compare(rpdType, "Repair") == 0;
                                break;
                        }
                    }
                }
                //If it is not a duplicate type, add the potion intialized from the data
                //to fectched item list.
                //regardless, the potion is removed from selected raw data.
                if (!duplicate_type)
                    fetched_list.Add(process_pDC(selected_potion_data[selected_p_index]));

                selected_potion_data.RemoveAt(selected_p_index);
            }

            //Raw potion data 0 should be minor Health Potion. it's the first one
            //in the list. This guarantees that if no other health potion is present you
            //At least get a minor one. Toss the player a bone.
            bool health_potion_present = false;
            for (int i = 0; i < fetched_list.Count; i++)
                if (fetched_list[i] is Potion)
                {
                    Potion p = (Potion)fetched_list[i];
                    if (p.get_type() == Potion.Potion_Type.Health)
                        health_potion_present = true;
                }

            if (!health_potion_present)
            {
                int MPID = raw_potion_data[0].IDNumber;
                int MPC = raw_potion_data[0].Cost;
                string MPN = raw_potion_data[0].Name;
                string MPI = raw_potion_data[0].Icon;
                int MPP = raw_potion_data[0].PotionPotency;
                int MPCo = raw_potion_data[0].PotionCode;
                fetched_list.Add(new Potion(MPID, MPC, MPN, MPI, Potion.Potion_Type.Health, MPP, MPCo));
            }

            bool bonus_quan = false;
            while (!bonus_quan)
            {
                int item_index = rGen.Next(fetched_list.Count);
                if (fetched_list[item_index] is Potion)
                {
                    Potion p = (Potion)fetched_list[item_index];
                    p.adjust_quantity(1);
                    bonus_quan = true;
                }
            }

            return fetched_list;
        }