UNPKG

teambuilder

Version:

pokemon teambuilder

171 lines (151 loc) 5.47 kB
const sets = require("../../mon-sets/gen7anythinggoes/sets.json"); const config = require("../../../config.js"); const util = require("../../util.js"); let recursions = 0; let stats = { ints: { rayCheck: 0, zygCheck: 0, marshCheck: 0, donCheck: 0, breaker: 0, ultraCheck: 0, xernCheck: 0, ogreCheck: 0 }, rocks: false, defog: false, cleric: false }; module.exports = tryBuild(); function tryBuild() { try { util.init(stats); return (buildTeam()); } catch (err) { if (String(err).includes("RangeError")) { return ("error: recurseThreshold too high - try again or lower it."); } return (`error: ${err}`); } } function buildTeam() { let teamString = ""; for (var b = 1; b < config.teamNumber + 1; b++) { stats = { ints: { rayCheck: 0, zygCheck: 0, marshCheck: 0, donCheck: 0, breaker: 0, ultraCheck: 0, xernCheck: 0, ogreCheck: 0 }, rocks: false, defog: false, cleric: false }; recursions = 0; let team = []; if (config.teamNumber > 1) { teamString += `=== [${config.tier}] team${b} ===\n\n`; } if (!config.startMon.set) { team[0] = util.getRandomMon(team); } else { team[0] = config.startMon; } stats = util.updateStats(team); for (let i = 1; i < config.teamLength; i++) { let pruneArray = []; let prunedArray = []; let priority = ""; let currentValue = 100; let rejected = []; for (let [key, value] of Object.entries(stats.ints)) { if (value <= currentValue) { currentValue = value; priority = key; } } for (let a = 0; a < sets.length; a++) { for (let a = 0; a < sets.length; a++) { if (sets[a][priority] >= config.cutoff) { pruneArray.push(sets[a]); } } } for (let a = 0; a < pruneArray.length; a++) { if (util.isValid(pruneArray[a], team)) { if (!stats.rocks || !stats.defog) { if (!stats.rocks && pruneArray[a].rocks) { prunedArray.push(pruneArray[a]); } else if (!stats.defog && pruneArray[a].defog) { prunedArray.push(pruneArray[a]); } else { rejected.push(pruneArray[a]); } } else { if ((!stats.rocks) || (stats.rocks && !pruneArray[a].rocks)) { prunedArray.push(pruneArray[a]); } } } } if (prunedArray.length === 0) { if (!stats.defog && config.cutoff <= 2) { let mon = util.getRandomMon(team); let a = 0; while (!mon.defog) { mon = util.getRandomMon(team); a++; if (a > 1000) { throw ("Not enough defoggers - try again or add more defoggers."); } } prunedArray.push(mon); } else if (rejected) { for (let i = 0; i < rejected.length; i++) { if (rejected[i] && util.isValid(rejected[i], team)) { if ((!stats.rocks) || (stats.rocks && !rejected[i].rocks)) { prunedArray.push(rejected[i]); } } } if (prunedArray.length === 0) { prunedArray.push(util.getRandomMon(team)); } } else { prunedArray.push(util.getRandomMon(team)); } } let tests = 0; while (true) { let rand = prunedArray[util.getRandomInt(prunedArray.length)]; if (util.isValid(rand, team)) { team.push(rand); break; } tests++ if(tests >= 1000){ throw("recurseThreshold or breakerThreshold too hight - lower one or try again"); } } stats = util.updateStats(team); } teamString += util.parseTeam(team); for (let value of Object.values(stats.ints)) { if (config.teamNumber === 1 && ((value < config.recurseThreshold || !stats.defog) || stats.ints.breaker < config.breakerThreshold)) { if (recursions > 3200 || ((config.coreMode && config.startMon.set) && recursions > 500)) { throw ("recurseThreshold or breakerThreshold too high - lower one or try again"); } recursions++; teamString = buildTeam(); break; } } } return (teamString); }