UNPKG

pokemon-go-pvp-rank

Version:
97 lines (96 loc) 4.14 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildRank = exports.calculateProducts = void 0; const level_constants_js_1 = __importStar(require("./level-constants.js")); function calculateCp({ attack, defense, health, levelConstant, }) { const value = attack * Math.sqrt(defense * health) * Math.pow(levelConstant, 2); return value < 100 ? 10 : Math.floor(value / 10); } function calculateProducts({ pokedexEntry, attackStat, defenseStat, healthStat, levelConstant, }) { const { baseAttack, baseDefense, baseHealth } = pokedexEntry; const attackProduct = (baseAttack + attackStat) * levelConstant; const defenseProduct = (baseDefense + defenseStat) * levelConstant; const healthProduct = Math.floor((baseHealth + healthStat) * levelConstant); const product = attackProduct * defenseProduct * healthProduct; const cp = calculateCp({ attack: baseAttack + attackStat, defense: baseDefense + defenseStat, health: baseHealth + healthStat, levelConstant, }); return { attackProduct, defenseProduct, healthProduct, product, cp, }; } exports.calculateProducts = calculateProducts; function buildRank({ pokedexEntry, maxCP, maxLevel = 40, minimumStatValue: minStat = 0, }) { const rankEntries = []; for (let attackStat = 15; attackStat >= minStat; attackStat -= 1) { for (let defenseStat = 15; defenseStat >= minStat; defenseStat -= 1) { for (let healthStat = 15; healthStat >= minStat; healthStat -= 1) { const initialIndex = level_constants_js_1.levelToIndex({ level: maxLevel }); for (let levelIndex = initialIndex; levelIndex >= 0; levelIndex -= 1) { const products = calculateProducts({ pokedexEntry, attackStat, defenseStat, healthStat, levelConstant: level_constants_js_1.default[levelIndex], }); if (products.cp <= maxCP) { rankEntries.push(Object.assign({ attackStat, defenseStat, healthStat, level: level_constants_js_1.indexToLevel({ index: levelIndex }) }, products)); break; } } } } } const rankSorted = rankEntries.sort((a, b) => b.product - a.product); return rankSorted.map((data, index) => { return Object.assign(Object.assign({}, data), { rank: index + 1 }); }); } exports.buildRank = buildRank; function calculateRank({ pokedexEntry, refAttackStat, refDefenseStat, refHealthStat, maxCP, maxLevel = 40, minimumStatValue = 0, }) { const rank = buildRank({ pokedexEntry, maxCP, maxLevel, minimumStatValue, }); const occurence = rank.find(el => { return (el.attackStat === refAttackStat && el.defenseStat === refDefenseStat && el.healthStat === refHealthStat); }); if (!occurence) { throw new Error('Could not find a rank occurence'); } return { occurence, rank }; } exports.default = calculateRank;