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; }
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; }