{ "version": 3, "sources": ["../../../sim/battle-stream.ts"], "sourcesContent": ["/**\r\n * Battle Stream\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * Supports interacting with a PS battle in Stream format.\r\n *\r\n * This format is VERY NOT FINALIZED, please do not use it directly yet.\r\n *\r\n * @license MIT\r\n */\r\n\r\nimport {Streams, Utils} from '../lib';\r\nimport {Teams} from './teams';\r\nimport {Battle, extractChannelMessages} from './battle';\r\n\r\n/**\r\n * Like string.split(delimiter), but only recognizes the first `limit`\r\n * delimiters (default 1).\r\n *\r\n * `\"1 2 3 4\".split(\" \", 2) => [\"1\", \"2\"]`\r\n *\r\n * `Utils.splitFirst(\"1 2 3 4\", \" \", 1) => [\"1\", \"2 3 4\"]`\r\n *\r\n * Returns an array of length exactly limit + 1.\r\n */\r\nfunction splitFirst(str: string, delimiter: string, limit = 1) {\r\n\tconst splitStr: string[] = [];\r\n\twhile (splitStr.length < limit) {\r\n\t\tconst delimiterIndex = str.indexOf(delimiter);\r\n\t\tif (delimiterIndex >= 0) {\r\n\t\t\tsplitStr.push(str.slice(0, delimiterIndex));\r\n\t\t\tstr = str.slice(delimiterIndex + delimiter.length);\r\n\t\t} else {\r\n\t\t\tsplitStr.push(str);\r\n\t\t\tstr = '';\r\n\t\t}\r\n\t}\r\n\tsplitStr.push(str);\r\n\treturn splitStr;\r\n}\r\n\r\nexport class BattleStream extends Streams.ObjectReadWriteStream {\r\n\tdebug: boolean;\r\n\tnoCatch: boolean;\r\n\treplay: boolean | 'spectator';\r\n\tkeepAlive: boolean;\r\n\tbattle: Battle | null;\r\n\r\n\tconstructor(options: {\r\n\t\tdebug?: boolean, noCatch?: boolean, keepAlive?: boolean, replay?: boolean | 'spectator',\r\n\t} = {}) {\r\n\t\tsuper();\r\n\t\tthis.debug = !!options.debug;\r\n\t\tthis.noCatch = !!options.noCatch;\r\n\t\tthis.replay = options.replay || false;\r\n\t\tthis.keepAlive = !!options.keepAlive;\r\n\t\tthis.battle = null;\r\n\t}\r\n\r\n\t_write(chunk: string) {\r\n\t\tif (this.noCatch) {\r\n\t\t\tthis._writeLines(chunk);\r\n\t\t} else {\r\n\t\t\ttry {\r\n\t\t\t\tthis._writeLines(chunk);\r\n\t\t\t} catch (err: any) {\r\n\t\t\t\tthis.pushError(err, true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.battle) this.battle.sendUpdates();\r\n\t}\r\n\r\n\t_writeLines(chunk: string) {\r\n\t\tfor (const line of chunk.split('\\n')) {\r\n\t\t\tif (line.startsWith('>')) {\r\n\t\t\t\tconst [type, message] = splitFirst(line.slice(1), ' ');\r\n\t\t\t\tthis._writeLine(type, message);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpushMessage(type: string, data: string) {\r\n\t\tif (this.replay) {\r\n\t\t\tif (type === 'update') {\r\n\t\t\t\tif (this.replay === 'spectator') {\r\n\t\t\t\t\tconst channelMessages = extractChannelMessages(data, [0]);\r\n\t\t\t\t\tthis.push(channelMessages[0].join('\\n'));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst channelMessages = extractChannelMessages(data, [-1]);\r\n\t\t\t\t\tthis.push(channelMessages[-1].join('\\n'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.push(`${type}\\n${data}`);\r\n\t}\r\n\r\n\t_writeLine(type: string, message: string) {\r\n\t\tswitch (type) {\r\n\t\tcase 'start':\r\n\t\t\tconst options = JSON.parse(message);\r\n\t\t\toptions.send = (t: string, data: any) => {\r\n\t\t\t\tif (Array.isArray(data)) data = data.join(\"\\n\");\r\n\t\t\t\tthis.pushMessage(t, data);\r\n\t\t\t\tif (t === 'end' && !this.keepAlive) this.pushEnd();\r\n\t\t\t};\r\n\t\t\tif (this.debug) options.debug = true;\r\n\t\t\ttry {\r\n\t\t\t\tthis.battle = new Battle(options);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'player':\r\n\t\t\tconst [slot, optionsText] = splitFirst(message, ' ');\r\n\t\t\tthis.battle!.setPlayer(slot as SideID, JSON.parse(optionsText));\r\n\t\t\tbreak;\r\n\t\tcase 'capture':\r\n\t\t\tthis.battle!.inputLog.push(`>capture ${message}`);\r\n\t\t\tconst pokemon = this.battle!.getPokemonByPNX(message);\r\n\t\t\tif (!!pokemon) {\r\n\t\t\t\tpokemon.capture();\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(`Capture targeted ${message} but that Pok\u00E9mon does not exist.`);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 'p1':\r\n\t\tcase 'p2':\r\n\t\tcase 'p3':\r\n\t\tcase 'p4':\r\n\t\t\tif (message === 'undo') {\r\n\t\t\t\tthis.battle!.undoChoice(type);\r\n\t\t\t} else {\r\n\t\t\t\tthis.battle!.choose(type, message);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'forcewin':\r\n\t\tcase 'forcetie':\r\n\t\t\tthis.battle!.win(type === 'forcewin' ? message as SideID : null);\r\n\t\t\tif (message) {\r\n\t\t\t\tthis.battle!.inputLog.push(`>forcewin ${message}`);\r\n\t\t\t} else {\r\n\t\t\t\tthis.battle!.inputLog.push(`>forcetie`);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'forcelose':\r\n\t\t\tthis.battle!.lose(message as SideID);\r\n\t\t\tthis.battle!.inputLog.push(`>forcelose ${message}`);\r\n\t\t\tbreak;\r\n\t\tcase 'reseed':\r\n\t\t\tconst seed = message ? message.split(',').map(Number) as PRNGSeed : null;\r\n\t\t\tthis.battle!.resetRNG(seed);\r\n\t\t\t// could go inside resetRNG, but this makes using it in `eval` slightly less buggy\r\n\t\t\tthis.battle!.inputLog.push(`>reseed ${this.battle!.prng.seed.join(',')}`);\r\n\t\t\tbreak;\r\n\t\tcase 'tiebreak':\r\n\t\t\tthis.battle!.tiebreak();\r\n\t\t\tbreak;\r\n\t\tcase 'chat-inputlogonly':\r\n\t\t\tthis.battle!.inputLog.push(`>chat ${message}`);\r\n\t\t\tbreak;\r\n\t\tcase 'chat':\r\n\t\t\tthis.battle!.inputLog.push(`>chat ${message}`);\r\n\t\t\tthis.battle!.add('chat', `${message}`);\r\n\t\t\tbreak;\r\n\t\tcase 'eval':\r\n\t\t\tconst battle = this.battle!;\r\n\r\n\t\t\t// n.b. this will usually but not always work - if you eval code that also affects the inputLog,\r\n\t\t\t// replaying the inputlog would double-play the change.\r\n\t\t\tbattle.inputLog.push(`>${type} ${message}`);\r\n\r\n\t\t\tmessage = message.replace(/\\f/g, '\\n');\r\n\t\t\tbattle.add('', '>>> ' + message.replace(/\\n/g, '\\n||'));\r\n\t\t\ttry {\r\n\t\t\t\t/* eslint-disable no-eval, @typescript-eslint/no-unused-vars */\r\n\t\t\t\tconst p1 = battle.sides[0];\r\n\t\t\t\tconst p2 = battle.sides[1];\r\n\t\t\t\tconst p3 = battle.sides[2];\r\n\t\t\t\tconst p4 = battle.sides[3];\r\n\t\t\t\tconst p1active = p1?.active[0];\r\n\t\t\t\tconst p2active = p2?.active[0];\r\n\t\t\t\tconst p3active = p3?.active[0];\r\n\t\t\t\tconst p4active = p4?.active[0];\r\n\t\t\t\tconst toID = battle.toID;\r\n\t\t\t\tconst player = (input: string) => {\r\n\t\t\t\t\tinput = toID(input);\r\n\t\t\t\t\tif (/^p[1-9]$/.test(input)) return battle.sides[parseInt(input.slice(1)) - 1];\r\n\t\t\t\t\tif (/^[1-9]$/.test(input)) return battle.sides[parseInt(input) - 1];\r\n\t\t\t\t\tfor (const side of battle.sides) {\r\n\t\t\t\t\t\tif (toID(side.name) === input) return side;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t};\r\n\t\t\t\tconst pokemon = (side: string | Side, input: string) => {\r\n\t\t\t\t\tif (typeof side === 'string') side = player(side)!;\r\n\r\n\t\t\t\t\tinput = toID(input);\r\n\t\t\t\t\tif (/^[1-9]$/.test(input)) return side.pokemon[parseInt(input) - 1];\r\n\t\t\t\t\treturn side.pokemon.find(p => p.baseSpecies.id === input || p.species.id === input);\r\n\t\t\t\t};\r\n\t\t\t\tlet result = eval(message);\r\n\t\t\t\t/* eslint-enable no-eval, @typescript-eslint/no-unused-vars */\r\n\r\n\t\t\t\tif (result?.then) {\r\n\t\t\t\t\tresult.then((unwrappedResult: any) => {\r\n\t\t\t\t\t\tunwrappedResult = Utils.visualize(unwrappedResult);\r\n\t\t\t\t\t\tbattle.add('', 'Promise -> ' + unwrappedResult);\r\n\t\t\t\t\t\tbattle.sendUpdates();\r\n\t\t\t\t\t}, (error: Error) => {\r\n\t\t\t\t\t\tbattle.add('', '<<< error: ' + error.message);\r\n\t\t\t\t\t\tbattle.sendUpdates();\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = Utils.visualize(result);\r\n\t\t\t\t\tresult = result.replace(/\\n/g, '\\n||');\r\n\t\t\t\t\tbattle.add('', '<<< ' + result);\r\n\t\t\t\t}\r\n\t\t\t} catch (e: any) {\r\n\t\t\t\tbattle.add('', '<<< error: ' + e.message);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'requestlog':\r\n\t\t\tthis.push(`requesteddata\\n${this.battle!.inputLog.join('\\n')}`);\r\n\t\t\tbreak;\r\n\t\tcase 'requestexport':\r\n\t\t\tthis.push(`requesteddata\\n${this.battle!.prngSeed}\\n${this.battle!.inputLog.join('\\n')}`);\r\n\t\t\tbreak;\r\n\t\tcase 'requestteam':\r\n\t\t\tmessage = message.trim();\r\n\t\t\tconst slotNum = parseInt(message.slice(1)) - 1;\r\n\t\t\tif (isNaN(slotNum) || slotNum < 0) {\r\n\t\t\t\tthrow new Error(`Team requested for slot ${message}, but that slot does not exist.`);\r\n\t\t\t}\r\n\t\t\tconst side = this.battle!.sides[slotNum];\r\n\t\t\tconst team = Teams.pack(side.team);\r\n\t\t\tthis.push(`requesteddata\\n${team}`);\r\n\t\t\tbreak;\r\n\t\tcase 'version':\r\n\t\tcase 'version-origin':\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tthrow new Error(`Unrecognized command \">${type} ${message}\"`);\r\n\t\t}\r\n\t}\r\n\r\n\t_writeEnd() {\r\n\t\t// if battle already ended, we don't need to pushEnd.\r\n\t\tif (!this.atEOF) this.pushEnd();\r\n\t\tthis._destroy();\r\n\t}\r\n\r\n\t_destroy() {\r\n\t\tif (this.battle) this.battle.destroy();\r\n\t}\r\n}\r\n\r\n/**\r\n * Splits a BattleStream into omniscient, spectator, p1, p2, p3 and p4\r\n * streams, for ease of consumption.\r\n */\r\nexport function getPlayerStreams(stream: BattleStream) {\r\n\tconst streams = {\r\n\t\tomniscient: new Streams.ObjectReadWriteStream({\r\n\t\t\twrite(data: string) {\r\n\t\t\t\tvoid stream.write(data);\r\n\t\t\t},\r\n\t\t\twriteEnd() {\r\n\t\t\t\treturn stream.writeEnd();\r\n\t\t\t},\r\n\t\t}),\r\n\t\tspectator: new Streams.ObjectReadStream({\r\n\t\t\tread() {},\r\n\t\t}),\r\n\t\tp1: new Streams.ObjectReadWriteStream({\r\n\t\t\twrite(data: string) {\r\n\t\t\t\tvoid stream.write(data.replace(/(^|\\n)/g, `$1>p1 `));\r\n\t\t\t},\r\n\t\t}),\r\n\t\tp2: new Streams.ObjectReadWriteStream({\r\n\t\t\twrite(data: string) {\r\n\t\t\t\tvoid stream.write(data.replace(/(^|\\n)/g, `$1>p2 `));\r\n\t\t\t},\r\n\t\t}),\r\n\t\tp3: new Streams.ObjectReadWriteStream({\r\n\t\t\twrite(data: string) {\r\n\t\t\t\tvoid stream.write(data.replace(/(^|\\n)/g, `$1>p3 `));\r\n\t\t\t},\r\n\t\t}),\r\n\t\tp4: new Streams.ObjectReadWriteStream({\r\n\t\t\twrite(data: string) {\r\n\t\t\t\tvoid stream.write(data.replace(/(^|\\n)/g, `$1>p4 `));\r\n\t\t\t},\r\n\t\t}),\r\n\t};\r\n\t(async () => {\r\n\t\tfor await (const chunk of stream) {\r\n\t\t\tconst [type, data] = splitFirst(chunk, `\\n`);\r\n\t\t\tswitch (type) {\r\n\t\t\tcase 'update':\r\n\t\t\t\tconst channelMessages = extractChannelMessages(data, [-1, 0, 1, 2, 3, 4]);\r\n\t\t\t\tstreams.omniscient.push(channelMessages[-1].join('\\n'));\r\n\t\t\t\tstreams.spectator.push(channelMessages[0].join('\\n'));\r\n\t\t\t\tstreams.p1.push(channelMessages[1].join('\\n'));\r\n\t\t\t\tstreams.p2.push(channelMessages[2].join('\\n'));\r\n\t\t\t\tstreams.p3.push(channelMessages[3].join('\\n'));\r\n\t\t\t\tstreams.p4.push(channelMessages[4].join('\\n'));\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'sideupdate':\r\n\t\t\t\tconst [side, sideData] = splitFirst(data, `\\n`);\r\n\t\t\t\tstreams[side as SideID].push(sideData);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'end':\r\n\t\t\t\t// ignore\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const s of Object.values(streams)) {\r\n\t\t\ts.pushEnd();\r\n\t\t}\r\n\t})().catch(err => {\r\n\t\tfor (const s of Object.values(streams)) {\r\n\t\t\ts.pushError(err, true);\r\n\t\t}\r\n\t});\r\n\treturn streams;\r\n}\r\n\r\nexport abstract class BattlePlayer {\r\n\treadonly stream: Streams.ObjectReadWriteStream;\r\n\treadonly log: string[];\r\n\treadonly debug: boolean;\r\n\r\n\tconstructor(playerStream: Streams.ObjectReadWriteStream, debug = false) {\r\n\t\tthis.stream = playerStream;\r\n\t\tthis.log = [];\r\n\t\tthis.debug = debug;\r\n\t}\r\n\r\n\tasync start() {\r\n\t\tfor await (const chunk of this.stream) {\r\n\t\t\tthis.receive(chunk);\r\n\t\t}\r\n\t}\r\n\r\n\treceive(chunk: string) {\r\n\t\tfor (const line of chunk.split('\\n')) {\r\n\t\t\tthis.receiveLine(line);\r\n\t\t}\r\n\t}\r\n\r\n\treceiveLine(line: string) {\r\n\t\tif (this.debug) console.log(line);\r\n\t\tif (!line.startsWith('|')) return;\r\n\t\tconst [cmd, rest] = splitFirst(line.slice(1), '|');\r\n\t\tif (cmd === 'request') return this.receiveRequest(JSON.parse(rest));\r\n\t\tif (cmd === 'error') return this.receiveError(new Error(rest));\r\n\t\tthis.log.push(line);\r\n\t}\r\n\r\n\tabstract receiveRequest(request: AnyObject): void;\r\n\r\n\treceiveError(error: Error) {\r\n\t\tthrow error;\r\n\t}\r\n\r\n\tchoose(choice: string) {\r\n\t\tvoid this.stream.write(choice);\r\n\t}\r\n}\r\n\r\nexport class BattleTextStream extends Streams.ReadWriteStream {\r\n\treadonly battleStream: BattleStream;\r\n\tcurrentMessage: string;\r\n\r\n\tconstructor(options: {debug?: boolean}) {\r\n\t\tsuper();\r\n\t\tthis.battleStream = new BattleStream(options);\r\n\t\tthis.currentMessage = '';\r\n\t\tvoid this._listen();\r\n\t}\r\n\r\n\tasync _listen() {\r\n\t\tfor await (let message of this.battleStream) {\r\n\t\t\tif (!message.endsWith('\\n')) message += '\\n';\r\n\t\t\tthis.push(message + '\\n');\r\n\t\t}\r\n\t\tthis.pushEnd();\r\n\t}\r\n\r\n\t_write(message: string | Buffer) {\r\n\t\tthis.currentMessage += '' + message;\r\n\t\tconst index = this.currentMessage.lastIndexOf('\\n');\r\n\t\tif (index >= 0) {\r\n\t\t\tvoid this.battleStream.write(this.currentMessage.slice(0, index));\r\n\t\t\tthis.currentMessage = this.currentMessage.slice(index + 1);\r\n\t\t}\r\n\t}\r\n\r\n\t_writeEnd() {\r\n\t\treturn this.battleStream.writeEnd();\r\n\t}\r\n}\r\n"], "mappings": "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", "names": ["options", "type", "message", "side"] }