{ "version": 3, "sources": ["../../../sim/tools/multi-random-runner.ts"], "sourcesContent": ["/**\n * Battle Simulator multi random runner.\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * @license MIT\n */\n\nimport { PRNG, type PRNGSeed } from '../prng';\nimport { Runner, type RunnerOptions } from './runner';\n\nexport interface MultiRandomRunnerOptions extends Partial {\n\ttotalGames: number;\n\tprng?: PRNG | PRNGSeed | null;\n\tformat?: string;\n\tcycle?: boolean;\n\tall?: boolean;\n\tasync?: boolean;\n}\n\nexport class MultiRandomRunner {\n\tstatic readonly FORMATS = [\n\t\t'gen8randombattle', 'gen8randomdoublesbattle', 'gen8battlefactory',\n\t\t'gen7randombattle', 'gen7battlefactory',\n\t\t'gen6randombattle', 'gen6battlefactory',\n\t\t'gen5randombattle',\n\t\t'gen4randombattle',\n\t\t'gen3randombattle',\n\t\t'gen2randombattle',\n\t\t'gen1randombattle',\n\t];\n\n\tprivate readonly options: Partial;\n\tprivate readonly totalGames: number;\n\tprivate readonly prng: PRNG;\n\tprivate readonly format: string | undefined;\n\tprivate readonly cycle: boolean;\n\tprivate readonly all: boolean;\n\tprivate readonly isAsync: boolean;\n\n\tprivate formatIndex: number;\n\tprivate numGames: number;\n\n\tconstructor(options: MultiRandomRunnerOptions) {\n\t\tthis.options = { ...options };\n\n\t\tthis.totalGames = options.totalGames;\n\n\t\tthis.prng = PRNG.get(options.prng);\n\t\tthis.options.prng = this.prng;\n\n\t\tthis.format = options.format;\n\t\tthis.cycle = !!options.cycle;\n\t\tthis.all = !!options.all;\n\n\t\tthis.isAsync = !!options.async;\n\n\t\tthis.formatIndex = 0;\n\t\tthis.numGames = 0;\n\t}\n\n\tasync run() {\n\t\tlet games = [];\n\t\tlet format: string | false;\n\t\tlet lastFormat: string | false = false;\n\t\tlet failures = 0;\n\t\twhile ((format = this.getNextFormat())) {\n\t\t\tif (this.all && lastFormat && format !== lastFormat) {\n\t\t\t\tif (this.isAsync) await Promise.all(games);\n\t\t\t\tgames = [];\n\t\t\t}\n\n\t\t\tconst seed = this.prng.getSeed();\n\t\t\tconst game = new Runner({ format, ...this.options }).run().catch(err => {\n\t\t\t\tfailures++;\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Run \\`node tools/simulate multi 1 --format=${format} --seed=${seed}\\` ` +\n\t\t\t\t\t`to debug (optionally with \\`--output\\` and/or \\`--input\\` for more info):\\n`,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (!this.isAsync) await game;\n\t\t\tgames.push(game);\n\t\t\tlastFormat = format;\n\t\t}\n\n\t\tif (this.isAsync) await Promise.all(games);\n\t\treturn failures;\n\t}\n\n\tprivate getNextFormat() {\n\t\tconst FORMATS = MultiRandomRunner.FORMATS;\n\t\tif (this.formatIndex > FORMATS.length) return false;\n\n\t\tif (this.numGames++ < this.totalGames) {\n\t\t\tif (this.format) {\n\t\t\t\treturn this.format;\n\t\t\t} else if (this.all) {\n\t\t\t\treturn FORMATS[this.formatIndex];\n\t\t\t} else if (this.cycle) {\n\t\t\t\tconst format = FORMATS[this.formatIndex];\n\t\t\t\tthis.formatIndex = (this.formatIndex + 1) % FORMATS.length;\n\t\t\t\treturn format;\n\t\t\t} else {\n\t\t\t\treturn this.prng.sample(FORMATS);\n\t\t\t}\n\t\t} else if (this.all) {\n\t\t\tthis.numGames = 1;\n\t\t\tthis.formatIndex++;\n\t\t\treturn FORMATS[this.formatIndex];\n\t\t}\n\n\t\treturn false;\n\t}\n}\n"], "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,kBAAoC;AACpC,oBAA2C;AAR3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,MAAM,qBAAN,MAAwB;AAAA,EAuB9B,YAAY,SAAmC;AAC9C,SAAK,UAAU,EAAE,GAAG,QAAQ;AAE5B,SAAK,aAAa,QAAQ;AAE1B,SAAK,OAAO,iBAAK,IAAI,QAAQ,IAAI;AACjC,SAAK,QAAQ,OAAO,KAAK;AAEzB,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,CAAC,CAAC,QAAQ;AACvB,SAAK,MAAM,CAAC,CAAC,QAAQ;AAErB,SAAK,UAAU,CAAC,CAAC,QAAQ;AAEzB,SAAK,cAAc;AACnB,SAAK,WAAW;AAAA,EACjB;AAAA,EAEA,MAAM,MAAM;AACX,QAAI,QAAQ,CAAC;AACb,QAAI;AACJ,QAAI,aAA6B;AACjC,QAAI,WAAW;AACf,WAAQ,SAAS,KAAK,cAAc,GAAI;AACvC,UAAI,KAAK,OAAO,cAAc,WAAW,YAAY;AACpD,YAAI,KAAK;AAAS,gBAAM,QAAQ,IAAI,KAAK;AACzC,gBAAQ,CAAC;AAAA,MACV;AAEA,YAAM,OAAO,KAAK,KAAK,QAAQ;AAC/B,YAAM,OAAO,IAAI,qBAAO,EAAE,QAAQ,GAAG,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,SAAO;AACvE;AACA,gBAAQ;AAAA,UACP,8CAA8C,iBAAiB;AAAA;AAAA,UAE/D;AAAA,QACD;AAAA,MACD,CAAC;AAED,UAAI,CAAC,KAAK;AAAS,cAAM;AACzB,YAAM,KAAK,IAAI;AACf,mBAAa;AAAA,IACd;AAEA,QAAI,KAAK;AAAS,YAAM,QAAQ,IAAI,KAAK;AACzC,WAAO;AAAA,EACR;AAAA,EAEQ,gBAAgB;AACvB,UAAM,UAAU,mBAAkB;AAClC,QAAI,KAAK,cAAc,QAAQ;AAAQ,aAAO;AAE9C,QAAI,KAAK,aAAa,KAAK,YAAY;AACtC,UAAI,KAAK,QAAQ;AAChB,eAAO,KAAK;AAAA,MACb,WAAW,KAAK,KAAK;AACpB,eAAO,QAAQ,KAAK,WAAW;AAAA,MAChC,WAAW,KAAK,OAAO;AACtB,cAAM,SAAS,QAAQ,KAAK,WAAW;AACvC,aAAK,eAAe,KAAK,cAAc,KAAK,QAAQ;AACpD,eAAO;AAAA,MACR,OAAO;AACN,eAAO,KAAK,KAAK,OAAO,OAAO;AAAA,MAChC;AAAA,IACD,WAAW,KAAK,KAAK;AACpB,WAAK,WAAW;AAChB,WAAK;AACL,aAAO,QAAQ,KAAK,WAAW;AAAA,IAChC;AAEA,WAAO;AAAA,EACR;AACD;AA/FO,IAAM,oBAAN;AAAM,kBACI,UAAU;AAAA,EACzB;AAAA,EAAoB;AAAA,EAA2B;AAAA,EAC/C;AAAA,EAAoB;AAAA,EACpB;AAAA,EAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;", "names": [] }