Spaces:
Paused
Paused
| ; | |
| var __defProp = Object.defineProperty; | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | |
| var __getOwnPropNames = Object.getOwnPropertyNames; | |
| var __hasOwnProp = Object.prototype.hasOwnProperty; | |
| var __export = (target, all) => { | |
| for (var name in all) | |
| __defProp(target, name, { get: all[name], enumerable: true }); | |
| }; | |
| var __copyProps = (to, from, except, desc) => { | |
| if (from && typeof from === "object" || typeof from === "function") { | |
| for (let key of __getOwnPropNames(from)) | |
| if (!__hasOwnProp.call(to, key) && key !== except) | |
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | |
| } | |
| return to; | |
| }; | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | |
| var random_player_ai_exports = {}; | |
| __export(random_player_ai_exports, { | |
| RandomPlayerAI: () => RandomPlayerAI | |
| }); | |
| module.exports = __toCommonJS(random_player_ai_exports); | |
| var import_battle_stream = require("../battle-stream"); | |
| var import_prng = require("../prng"); | |
| /** | |
| * Example random player AI. | |
| * | |
| * Pokemon Showdown - http://pokemonshowdown.com/ | |
| * | |
| * @license MIT | |
| */ | |
| class RandomPlayerAI extends import_battle_stream.BattlePlayer { | |
| constructor(playerStream, options = {}, debug = false) { | |
| super(playerStream, debug); | |
| this.move = options.move || 1; | |
| this.mega = options.mega || 0; | |
| this.prng = import_prng.PRNG.get(options.seed); | |
| } | |
| receiveError(error) { | |
| if (error.message.startsWith("[Unavailable choice]")) | |
| return; | |
| throw error; | |
| } | |
| receiveRequest(request) { | |
| if (request.wait) { | |
| } else if (request.forceSwitch) { | |
| const pokemon = request.side.pokemon; | |
| const chosen = []; | |
| const choices = request.forceSwitch.map((mustSwitch, i) => { | |
| if (!mustSwitch) | |
| return `pass`; | |
| const canSwitch = range(1, 6).filter((j) => pokemon[j - 1] && // not active | |
| j > request.forceSwitch.length && // not chosen for a simultaneous switch | |
| !chosen.includes(j) && // not fainted or fainted and using Revival Blessing | |
| !pokemon[j - 1].condition.endsWith(` fnt`) === !pokemon[i].reviving); | |
| if (!canSwitch.length) | |
| return `pass`; | |
| const target = this.chooseSwitch( | |
| void 0, | |
| canSwitch.map((slot) => ({ slot, pokemon: pokemon[slot - 1] })) | |
| ); | |
| chosen.push(target); | |
| return `switch ${target}`; | |
| }); | |
| this.choose(choices.join(`, `)); | |
| } else if (request.teamPreview) { | |
| this.choose(this.chooseTeamPreview(request.side.pokemon)); | |
| } else if (request.active) { | |
| let [canMegaEvo, canUltraBurst, canZMove, canDynamax, canTerastallize] = [true, true, true, true, true]; | |
| const pokemon = request.side.pokemon; | |
| const chosen = []; | |
| const choices = request.active.map((active, i) => { | |
| if (pokemon[i].condition.endsWith(` fnt`) || pokemon[i].commanding) | |
| return `pass`; | |
| canMegaEvo = canMegaEvo && active.canMegaEvo; | |
| canUltraBurst = canUltraBurst && active.canUltraBurst; | |
| canZMove = canZMove && !!active.canZMove; | |
| canDynamax = canDynamax && !!active.canDynamax; | |
| canTerastallize = canTerastallize && !!active.canTerastallize; | |
| const change = (canMegaEvo || canUltraBurst || canDynamax) && this.prng.random() < this.mega; | |
| const useMaxMoves = !active.canDynamax && active.maxMoves || change && canDynamax; | |
| const possibleMoves = useMaxMoves ? active.maxMoves.maxMoves : active.moves; | |
| let canMove = range(1, possibleMoves.length).filter((j) => // not disabled | |
| !possibleMoves[j - 1].disabled).map((j) => ({ | |
| slot: j, | |
| move: possibleMoves[j - 1].move, | |
| target: possibleMoves[j - 1].target, | |
| zMove: false | |
| })); | |
| if (canZMove) { | |
| canMove.push(...range(1, active.canZMove.length).filter((j) => active.canZMove[j - 1]).map((j) => ({ | |
| slot: j, | |
| move: active.canZMove[j - 1].move, | |
| target: active.canZMove[j - 1].target, | |
| zMove: true | |
| }))); | |
| } | |
| const hasAlly = pokemon.length > 1 && !pokemon[i ^ 1].condition.endsWith(` fnt`); | |
| const filtered = canMove.filter((m) => m.target !== `adjacentAlly` || hasAlly); | |
| canMove = filtered.length ? filtered : canMove; | |
| const moves = canMove.map((m) => { | |
| let move = `move ${m.slot}`; | |
| if (request.active.length > 1) { | |
| if ([`normal`, `any`, `adjacentFoe`].includes(m.target)) { | |
| move += ` ${1 + this.prng.random(2)}`; | |
| } | |
| if (m.target === `adjacentAlly`) { | |
| move += ` -${(i ^ 1) + 1}`; | |
| } | |
| if (m.target === `adjacentAllyOrSelf`) { | |
| if (hasAlly) { | |
| move += ` -${1 + this.prng.random(2)}`; | |
| } else { | |
| move += ` -${i + 1}`; | |
| } | |
| } | |
| } | |
| if (m.zMove) | |
| move += ` zmove`; | |
| return { choice: move, move: m }; | |
| }); | |
| const canSwitch = range(1, 6).filter((j) => pokemon[j - 1] && // not active | |
| !pokemon[j - 1].active && // not chosen for a simultaneous switch | |
| !chosen.includes(j) && // not fainted | |
| !pokemon[j - 1].condition.endsWith(` fnt`)); | |
| const switches = active.trapped ? [] : canSwitch; | |
| if (switches.length && (!moves.length || this.prng.random() > this.move)) { | |
| const target = this.chooseSwitch( | |
| active, | |
| canSwitch.map((slot) => ({ slot, pokemon: pokemon[slot - 1] })) | |
| ); | |
| chosen.push(target); | |
| return `switch ${target}`; | |
| } else if (moves.length) { | |
| const move = this.chooseMove(active, moves); | |
| if (move.endsWith(` zmove`)) { | |
| canZMove = false; | |
| return move; | |
| } else if (change) { | |
| if (canTerastallize) { | |
| canTerastallize = false; | |
| return `${move} terastallize`; | |
| } else if (canDynamax) { | |
| canDynamax = false; | |
| return `${move} dynamax`; | |
| } else if (canMegaEvo) { | |
| canMegaEvo = false; | |
| return `${move} mega`; | |
| } else { | |
| canUltraBurst = false; | |
| return `${move} ultra`; | |
| } | |
| } else { | |
| return move; | |
| } | |
| } else { | |
| throw new Error(`${this.constructor.name} unable to make choice ${i}. request='${typeof request}', chosen='${chosen}', (mega=${canMegaEvo}, ultra=${canUltraBurst}, zmove=${canZMove}, dynamax='${canDynamax}', terastallize=${canTerastallize})`); | |
| } | |
| }); | |
| this.choose(choices.join(`, `)); | |
| } | |
| } | |
| chooseTeamPreview(team) { | |
| return `default`; | |
| } | |
| chooseMove(active, moves) { | |
| return this.prng.sample(moves).choice; | |
| } | |
| chooseSwitch(active, switches) { | |
| return this.prng.sample(switches).slot; | |
| } | |
| } | |
| function range(start, end, step = 1) { | |
| if (end === void 0) { | |
| end = start; | |
| start = 0; | |
| } | |
| const result = []; | |
| for (; start <= end; start += step) { | |
| result.push(start); | |
| } | |
| return result; | |
| } | |
| //# sourceMappingURL=random-player-ai.js.map | |