List <String> pullFromJSON(String JSONFileName, RarityDistribution dist, int number_of_cards, int number_of_rares_or_better) { List <String> card_names = new List <String>(); String json = System.IO.File.ReadAllText(JSONFileName); //TODO: read JSON List <YGOJSONStruct> json_list = JsonConvert.DeserializeObject <List <YGOJSONStruct> >(json); //get rng rng = new Random(); String rarity = ""; List <String> rares = extractRarityList(json_list, "rare"); List <String> super_rares = extractRarityList(json_list, "super rare"); List <String> commons = extractRarityList(json_list, "common"); List <String> ultra_rares = extractRarityList(json_list, "ultra rare"); List <String> secret_rares = extractRarityList(json_list, "secret rare"); //define probability ranges for convenience double rare_bound = m_dist.rare; double super_rare_bound = rare_bound + m_dist.super_rare; double ultra_rare_bound = super_rare_bound + m_dist.ultra_rare; double secret_rare_bound = ultra_rare_bound + m_dist.secret_rare;; for (int i = 0; i < number_of_rares_or_better; i++) { double rng_val = rng.NextDouble(); //don't care about ultimate/ghost whatever if (rng_val <= rare_bound) { rarity = "Rare"; //get random card out of rares if (rares.Count == 0) { //card_names.Add(commons[rng.Next(commons.Count)]); //TODO: what if there are no commons? cant fall back. maybe just use a random one. card_names.Add(json_list[rng.Next(json_list.Count)].name); } else { card_names.Add(rares[rng.Next(rares.Count)]); } } else if (rng_val > rare_bound && rng_val <= super_rare_bound) { rarity = "Super Rare"; if (super_rares.Count == 0) { if (rares.Count == 0) { card_names.Add(commons[rng.Next(commons.Count)]); } else { card_names.Add(rares[rng.Next(rares.Count)]); } } else { card_names.Add(super_rares[rng.Next(super_rares.Count)]); } } else if (rng_val > super_rare_bound && rng_val <= ultra_rare_bound) { rarity = "Ultra Rare"; if (ultra_rares.Count == 0) { if (super_rares.Count == 0) { if (rares.Count == 0) { card_names.Add(commons[rng.Next(commons.Count)]); } else { card_names.Add(rares[rng.Next(rares.Count)]); } } else { card_names.Add(super_rares[rng.Next(super_rares.Count)]); } } else { card_names.Add(ultra_rares[rng.Next(ultra_rares.Count)]); } } else { rarity = "Secret Rare"; if (secret_rares.Count == 0) { if (ultra_rares.Count == 0) { if (super_rares.Count == 0) { if (rares.Count == 0) { card_names.Add(commons[rng.Next(commons.Count)]); } else { card_names.Add(rares[rng.Next(rares.Count)]); } } else { card_names.Add(super_rares[rng.Next(super_rares.Count)]); } } else { card_names.Add(ultra_rares[rng.Next(ultra_rares.Count)]); } } else { card_names.Add(secret_rares[rng.Next(secret_rares.Count)]); } } } for (int i = 0; i < number_of_cards - number_of_rares_or_better; i++) { //rest is commons if (commons.Count != 0) { card_names.Add(commons[rng.Next(commons.Count)]); } else { card_names.Add(json_list[rng.Next(json_list.Count)].name); } } return(card_names); }
List <int> pullFromBoosterPoolWithRarityDistribution(BoosterPool pool, bool remove_from_pool, RarityDistribution dist, int number_of_cards, int number_of_rares_or_better) { List <int> ret_list = new List <int>(); //rarity calc //define probability ranges for convenience double rare_bound = m_dist.rare; double super_rare_bound = rare_bound + m_dist.super_rare; double ultra_rare_bound = super_rare_bound + m_dist.ultra_rare; double secret_rare_bound = ultra_rare_bound + m_dist.secret_rare;; List <int> all_cards = new List <int>(); all_cards.AddRange(pool.commons); all_cards.AddRange(pool.rares); all_cards.AddRange(pool.super_rares); all_cards.AddRange(pool.ultra_rares); all_cards.AddRange(pool.secret_rares); for (int i = 0; i < number_of_rares_or_better; i++) { double rng_val = rng.NextDouble(); //don't care about ultimate/ghost whatever if (rng_val <= rare_bound) { //rarity = "Rare"; //get random card out of rares if (pool.rares.Count == 0) { //card_names.Add(commons[rng.Next(commons.Count)]); //TODO: what if there are no commons? cant fall back. maybe just use a random one. //ret_list.Add(all_cards[rng.Next(all_cards.Count)]); addRandomCardFromPool(ret_list, all_cards, all_cards, remove_from_pool); //card_names.Add(json_list[rng.Next(json_list.Count)].name); } else { //card_names.Add(rares[rng.Next(rares.Count)]); addRandomCardFromPool(ret_list, pool.rares, all_cards, remove_from_pool); } } else if (rng_val > rare_bound && rng_val <= super_rare_bound) { // rarity = "Super Rare"; if (pool.super_rares.Count == 0) { if (pool.rares.Count == 0) { addRandomCardFromPool(ret_list, pool.commons, all_cards, remove_from_pool); } else { addRandomCardFromPool(ret_list, pool.rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.super_rares, all_cards, remove_from_pool); } } else if (rng_val > super_rare_bound && rng_val <= ultra_rare_bound) { //rarity = "Ultra Rare"; if (pool.ultra_rares.Count == 0) { if (pool.super_rares.Count == 0) { if (pool.rares.Count == 0) { addRandomCardFromPool(ret_list, pool.commons, all_cards, remove_from_pool); } else { addRandomCardFromPool(ret_list, pool.rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.super_rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.ultra_rares, all_cards, remove_from_pool); } } else { // rarity = "Secret Rare"; if (pool.secret_rares.Count == 0) { if (pool.ultra_rares.Count == 0) { if (pool.super_rares.Count == 0) { if (pool.rares.Count == 0) { addRandomCardFromPool(ret_list, pool.commons, all_cards, remove_from_pool); } else { addRandomCardFromPool(ret_list, pool.rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.super_rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.ultra_rares, all_cards, remove_from_pool); } } else { addRandomCardFromPool(ret_list, pool.secret_rares, all_cards, remove_from_pool); } } } for (int i = 0; i < number_of_cards - number_of_rares_or_better; i++) { //rest is commons if (pool.commons.Count != 0) { addRandomCardFromPool(ret_list, pool.commons, all_cards, remove_from_pool); } else { addRandomCardFromPool(ret_list, all_cards, all_cards, remove_from_pool); } } return(ret_list); }