import fs from 'fs'; import POGOProtos from 'pogo-protos'; import { ApiService } from 'api/ApiService'; import { IBaseStatsRank, IPokemon } from 'app/models/Pokemon'; interface ICalculateRelativeStats { id : POGOProtos.Enums.PokemonId; form : POGOProtos.Enums.Form; value : number; } export const parseGameMaster = async () => { const apiService = new ApiService(); // const pokemonForms : { [ key in keyof typeof POGOProtos.Enums.PokemonId ]? : Array } = {}; const pokemonData : { [ key in keyof typeof POGOProtos.Enums.PokemonId ]? : Array } = {}; const pokemonBaseStamina : Array = []; const pokemonBaseAttack : Array = []; const pokemonBaseDefense : Array = []; const pokemonOrderById : Record = {}; const GameMasterProto = fs.readFileSync('externals/pokemongo-game-master/versions/latest/GAME_MASTER.protobuf'); const GameMaster = POGOProtos.Networking.Responses.DownloadItemTemplatesResponse.decode(GameMasterProto); // fs.writeFileSync('gamemaster.json', JSON.stringify(decoded, null, 2)); const version = GameMaster.timestamp_ms; for (const entry of GameMaster.item_templates) { if (!entry.template_id) { continue; } // ignore *_NORMAL entries if (entry.template_id.match(/^V(\d{4})_POKEMON_(\w+)(?, form) => { // if (form.form) { // output.push(form.form); // } // return output; // }, []); // } else if (pokemonId) { // pokemonForms[pokemonId] = [POGOProtos.Enums.Form.FORM_UNSET]; // } } } // const orderedPokemon = Object.values(pokemonData).sort((a, b) => { const orderedPokemon = (Object.values(pokemonData) as unknown as Array>).sort((a, b) => { return a[0].order - b[0].order; }); orderedPokemon.forEach((value) => { value.sort((a, b) => { return a.form - b.form; }); }); let flatOrderedPokemon : Array = []; flatOrderedPokemon = flatOrderedPokemon.concat(...orderedPokemon); // calculate pokemon relative rankings pokemonBaseStamina.sort((a, b) => { return a.value - b.value; }); pokemonBaseStamina.forEach((stats, index, array) => { const key = POGOProtos.Enums.PokemonId[stats.id] + POGOProtos.Enums.Form[stats.form]; pokemonOrderById[key].staminaRank = Math.floor((index / (array.length - 1)) * 100); }); pokemonBaseAttack.sort((a, b) => { return a.value - b.value; }); pokemonBaseAttack.forEach((stats, index, array) => { const key = POGOProtos.Enums.PokemonId[stats.id] + POGOProtos.Enums.Form[stats.form]; pokemonOrderById[key].attackRank = Math.floor((index / (array.length - 1)) * 100); }); pokemonBaseDefense.sort((a, b) => { return a.value - b.value; }); pokemonBaseDefense.forEach((stats, index, array) => { const key = POGOProtos.Enums.PokemonId[stats.id] + POGOProtos.Enums.Form[stats.form]; pokemonOrderById[key].defenseRank = Math.floor((index / (array.length - 1)) * 100); }); flatOrderedPokemon.forEach((mon) => { const key = POGOProtos.Enums.PokemonId[mon.id] + POGOProtos.Enums.Form[mon.form]; mon.statsRank = { ...pokemonOrderById[key] }; }); return flatOrderedPokemon; };