private static void RemoveBaseTypeIfNormalTypeExists(Dictionary <string, PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty> pokemon) { IEnumerable <IGrouping <int, PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty> > multiformPokemon = pokemon.Values.GroupBy(p => p.Dex).Where(g => g.Count() > 1); foreach (IGrouping <int, PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty> dexEntryGrouping in multiformPokemon) { PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty normalType = dexEntryGrouping.SingleOrDefault(p => p.SpeciesId.EndsWith("_normal")); if (normalType != null) { var baseType = dexEntryGrouping.SingleOrDefault(p => p.SpeciesId == normalType.SpeciesId.Replace("_normal", String.Empty)); if (baseType != null) { pokemon.Remove(baseType.SpeciesId); } } } }
public static async Task <IEnumerable <PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty> > AdaptPokemonAsync(dynamic gameMaster) { var regex = new Regex(@"^V\d+_POKEMON_"); //var regex = new Regex(@"^V0006_POKEMON_CHARIZARD$"); var templates = ((IEnumerable <dynamic>)gameMaster.itemTemplates).Select(t => t).Where(t => regex.IsMatch((string)t.templateId)); var pokemon = new Dictionary <string, PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty>(); foreach (dynamic template in templates) { string speciesId = GenerateSpeciesId(template); var pokemonProperty = new PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty { Dex = Convert.ToInt32(((string)template.templateId).Substring(1, 4)), SpeciesName = GenerateSpeciesName(speciesId), SpeciesId = speciesId, BaseStats = new PvPokeGameMasterFileManager.GameMasterFile.PokemonProperty.BaseStatsProperty { Atk = template.pokemonSettings.stats.baseAttack, Def = template.pokemonSettings.stats.baseDefense, Hp = template.pokemonSettings.stats.baseStamina }, Types = new List <string> { FormatType((string)template.pokemonSettings.type), FormatType((string)template.pokemonSettings.type2) }, FastMoves = template.pokemonSettings.quickMoves != null ? new List <string>(((IEnumerable <string>)template.pokemonSettings.quickMoves.ToObject <IEnumerable <string> >()).Select(GenerateMoveId).Distinct().OrderBy(m => m)) : new List <string>(), ChargedMoves = template.pokemonSettings.cinematicMoves != null ? new List <string>(((IEnumerable <string>)template.pokemonSettings.cinematicMoves.ToObject <IEnumerable <string> >()).Select(GenerateMoveId).Distinct().OrderBy(m => m)) : new List <string>(), LegacyMoves = new List <string>() }; pokemon[speciesId] = pokemonProperty; } RemoveSubtypePokemon(pokemon, "_shadow"); RemoveSubtypePokemon(pokemon, "_purified"); RemoveBaseTypeIfNormalTypeExists(pokemon); RenameNormalFormPokemon(pokemon); await AddMissingPokemonAsync(pokemon); var legacyMoves = await FileManager.LoadFileAsync <LegacyMoveCollection>(PokemonGoGameMasterFileManager.LegacyMovesJsonPath); foreach (LegacyMoveCollection.PokemonWithLegacyMoves pokemonWithLegacyMoves in legacyMoves.Pokemon) { var targetPokemon = pokemon[pokemonWithLegacyMoves.SpeciesId]; targetPokemon.FastMoves.AddRange(pokemonWithLegacyMoves.LegacyFastMoves); targetPokemon.FastMoves = targetPokemon.FastMoves.OrderBy(m => m).ToList(); targetPokemon.ChargedMoves.AddRange(pokemonWithLegacyMoves.LegacyChargeMoves); targetPokemon.ChargedMoves = targetPokemon.ChargedMoves.OrderBy(m => m).ToList(); targetPokemon.LegacyMoves.AddRange(pokemonWithLegacyMoves.LegacyFastMoves.Concat(pokemonWithLegacyMoves.LegacyChargeMoves).Distinct().OrderBy(m => m)); } ExpandHiddenPower(pokemon.Values); PruneEmptyLegacyMoves(pokemon); var defaultIVs = await FileManager.LoadFileAsync <DefaultIVsCollection>(PokemonGoGameMasterFileManager.DefaultIVsJsonPath); foreach (KeyValuePair <string, Dictionary <string, List <decimal> > > leagueSet in defaultIVs.Pokemon) { foreach (KeyValuePair <string, List <decimal> > stats in leagueSet.Value) { pokemon[leagueSet.Key].DefaultIVs[stats.Key] = stats.Value; } } return(pokemon.Values.OrderBy(p => p.Dex).ThenBy(p => p.SpeciesId)); }