public async Task<ObservableCollection<PokemonForm>> LoadFormsAsync(SpeciesName species, GameVersion version, int displayLanguage, CancellationToken token) { try { string query = "SELECT pf.id, pfn.name FROM pokemon_v2_pokemonform pf\n" + "LEFT JOIN pokemon_v2_pokemon p ON pf.pokemon_id = p.id\n" + "LEFT JOIN\n(SELECT e.pokemon_form_id AS id, COALESCE(o.name, e.name) AS name FROM pokemon_v2_pokemonformname e\n" + "LEFT OUTER JOIN pokemon_v2_pokemonformname o ON e.pokemon_form_id = o.pokemon_form_id and o.language_id = ?\n" + "WHERE e.language_id = 9\nGROUP BY e.pokemon_form_id)\nAS pfn ON pf.id = pfn.id\n" + "WHERE p.pokemon_species_id = ? AND pf.version_group_id <= ?"; IEnumerable<DbPokemonForm> forms = await _connection.QueryAsync<DbPokemonForm>(token, query, new object[] { displayLanguage, species.Id, version.VersionGroup }); return new ObservableCollection<PokemonForm>(forms.Select((s) => { var f = new PokemonForm { Id = s.Id }; if (String.IsNullOrWhiteSpace(s.Name)) f.Name = species.Name; else f.Name = s.Name; return f; })); } catch (Exception) { return new ObservableCollection<PokemonForm>(); } }
public async Task<PokemonForm> LoadFormAsync(int formId, GameVersion version, int displayLanguage, CancellationToken token) { try { string query = "SELECT pf.id, pf.pokemon_id, p.pokemon_species_id, pfn.name, p.height, p.weight, p.base_experience, pt1.type_id AS type1, pt2.type_id AS type2, " + "pa1.ability_id AS ability1, pa2.ability_id AS ability2, pa3.ability_id AS hidden_ability, pi.rarity, pi.item_id FROM pokemon_v2_pokemonform pf\n" + "LEFT JOIN\n(SELECT e.pokemon_form_id AS id, COALESCE(o.name, e.name) AS name FROM pokemon_v2_pokemonformname e\n" + "LEFT OUTER JOIN pokemon_v2_pokemonformname o ON e.pokemon_form_id = o.pokemon_form_id and o.language_id = ?\n" + "WHERE e.language_id = 9\nGROUP BY e.pokemon_form_id)\nAS pfn ON pf.id = pfn.id\n" + "LEFT JOIN pokemon_v2_pokemon p ON pf.pokemon_id = p.id\n" + "LEFT JOIN pokemon_v2_pokemontype AS pt1 ON p.id = pt1.pokemon_id AND pt1.slot = 1\n" + "LEFT JOIN pokemon_v2_pokemontype AS pt2 ON p.id = pt2.pokemon_id AND pt2.slot = 2\n" + "LEFT JOIN pokemon_v2_pokemonability AS pa1 ON p.id = pa1.pokemon_id AND pa1.slot = 1\n" + "LEFT JOIN pokemon_v2_pokemonability AS pa2 ON p.id = pa2.pokemon_id AND pa2.slot = 2\n" + "LEFT JOIN pokemon_v2_pokemonability AS pa3 ON p.id = pa3.pokemon_id AND pa3.slot = 3\n" + "LEFT JOIN pokemon_v2_pokemonitem AS pi ON p.id = pi.pokemon_id AND pi.version_id = ?\n" + "WHERE pf.id = ?"; IEnumerable<DbPokemonForm> forms = await _connection.QueryAsync<DbPokemonForm>(token, query, new object[] { displayLanguage, version.Id, formId }); DbPokemonForm f = forms.First(); var form = new PokemonForm { BaseExperience = f.BaseExperience, Height = Math.Round((double)f.Height / 10, 2), HeldItemRarity = f.ItemRarity, Id = f.Id, Weight = Math.Round((double)f.Weight / 10, 2) }; form.Species = await LoadSpeciesAsync(f.PokemonSpeciesId, version, displayLanguage, token); if (String.IsNullOrWhiteSpace(f.Name)) form.Name = form.Species.Name; else form.Name = f.Name; // Handle Fairy before Gen 6 if (version.Generation < 6 && f.Type1 == 18) f.Type1 = 1; form.Type1 = await GetTypeAsync(f.Type1, version); if (f.Type2 != null) form.Type2 = await GetTypeAsync((int)f.Type2, version); if (version.Generation >= 3) { //form.Ability1 = await LoadAbilityAsync(f.Ability1, version, displayLanguage, token); //if (f.Ability2 != null) // form.Ability2 = await LoadAbilityAsync((int)f.Ability2, version, displayLanguage, token); //if (version.Generation >= 5 && f.HiddenAbility != null) // form.HiddenAbility = await LoadAbilityAsync((int)f.HiddenAbility, version, displayLanguage, token); } if (f.ItemId != null) form.HeldItem = await LoadItemAsync((int)f.ItemId, displayLanguage, token); //form.Stats = await LoadPokemonStatsAsync(f.PokemonId, version, displayLanguage, token); return form; } catch (Exception) { return null; } }
public async Task<PokemonForm> LoadFormByIdAsync(int id, GameVersion version, int language, CancellationToken token) { try { string query = String.Format(@" SELECT pf.id, pf.pokemon_id, p.species_id, pfn.name, p.height, p.weight, p.base_experience, pt1.type_id AS type1, pt2.type_id AS type2, pa1.ability_id AS ability1, pa2.ability_id AS ability2, pa3.ability_id AS hidden_ability, pi.rarity, pi.item_id FROM pokemon_forms pf LEFT JOIN (SELECT e.pokemon_form_id AS id, COALESCE(o.form_name, e.form_name) AS name FROM pokemon_form_names e LEFT OUTER JOIN pokemon_form_names o ON e.pokemon_form_id = o.pokemon_form_id and o.local_language_id = {0} WHERE e.local_language_id = 9 GROUP BY e.pokemon_form_id) AS pfn ON pf.id = pfn.id LEFT JOIN pokemon p ON pf.pokemon_id = p.id LEFT JOIN pokemon_types AS pt1 ON p.id = pt1.pokemon_id AND pt1.slot = 1 LEFT JOIN pokemon_types AS pt2 ON p.id = pt2.pokemon_id AND pt2.slot = 2 LEFT JOIN pokemon_abilities AS pa1 ON p.id = pa1.pokemon_id AND pa1.slot = 1 LEFT JOIN pokemon_abilities AS pa2 ON p.id = pa2.pokemon_id AND pa2.slot = 2 LEFT JOIN pokemon_abilities AS pa3 ON p.id = pa3.pokemon_id AND pa3.slot = 3 LEFT JOIN pokemon_items AS pi ON p.id = pi.pokemon_id AND pi.version_id = {1} WHERE pf.id = {2} ", language, version.Id, id); IEnumerable<DbPokemonForm> forms = await _connection.QueryAsync<DbPokemonForm>(token, query, new object[0]).ConfigureAwait(false); DbPokemonForm f = forms.Single(); // Handle Fairy Type before gen 6 if (version.Generation < 6 && f.Type1 == 18) f.Type1 = 1; Task<ElementType> type1Task = GetTypeAsync(f.Type1, version); Task<ElementType> type2Task = null; Task<Item> itemTask = null; Task<Ability> ability1Task = null; Task<Ability> ability2Task = null; Task<Ability> hiddenAbilityTask = null; var tasks = new List<Task> { type1Task, type2Task, itemTask, ability1Task, ability2Task, hiddenAbilityTask }; if (f.Type2 != null) type2Task = GetTypeAsync((int)f.Type2, version); if (version.Generation >= 2 && f.ItemId != null) itemTask = LoadItemByIdAsync((int)f.ItemId, language, token); if (version.Generation >= 3) { ability1Task = LoadAbilityByIdAsync(f.Ability1, version, language, token); if (f.Ability2 != null) ability2Task = LoadAbilityByIdAsync((int)f.Ability2, version, language, token); } if (version.Generation >= 5 && f.HiddenAbility != null) hiddenAbilityTask = LoadAbilityByIdAsync((int)f.HiddenAbility, version, language, token); var form = new PokemonForm { BaseExperience = f.BaseExperience, Height = Math.Round((double)f.Height / 10, 2), HeldItemRarity = f.ItemRarity, Id = f.Id, Weight = Math.Round((double)f.Weight / 10, 2) }; //form.Species = await LoadSpeciesAsync(f.PokemonSpeciesId, version, displayLanguage, token); //if (String.IsNullOrWhiteSpace(f.Name)) // form.Name = form.Species.Name; //else // form.Name = f.Name; await Task.WhenAll(tasks.Where(w => w != null)); form.Type1 = type1Task.Result; if (type2Task != null) form.Type2 = type2Task.Result; if (itemTask != null) form.HeldItem = itemTask.Result; if (ability1Task != null) form.Ability1 = ability1Task.Result; if (ability2Task != null) form.Ability2 = ability2Task.Result; if (hiddenAbilityTask != null) form.HiddenAbility = hiddenAbilityTask.Result; //form.Type1 = await GetTypeAsync(f.Type1, version); //if (f.Type2 != null) // form.Type2 = await GetTypeAsync((int)f.Type2, version); //if (f.ItemId != null) // form.HeldItem = await LoadItemByIdAsync((int)f.ItemId, language, token); //if (version.Generation >= 3) //{ // form.Ability1 = await LoadAbilityByIdAsync(f.Ability1, version, language, token); // if (f.Ability2 != null) // form.Ability2 = await LoadAbilityByIdAsync((int)f.Ability2, version, language, token); //} //if (version.Generation >= 5 && f.HiddenAbility != null) // form.HiddenAbility = await LoadAbilityByIdAsync((int)f.HiddenAbility, version, language, token); return form; } catch (Exception) { return null; } }