pokemon-go-pvp-rank
Version:
Pokémon Go PVP ranking calculator
97 lines (96 loc) • 4.14 kB
JavaScript
;
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;