{ "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, PRNGSeed} from '../prng';\nimport {Runner, RunnerOptions} from './runner';\n\n// @ts-ignore\nexport interface MultiRandomRunnerOptions extends RunnerOptions {\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', 'gen7randomdoublesbattle', '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 = (options.prng && !Array.isArray(options.prng)) ?\n\t\t\toptions.prng : new PRNG(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.seed;\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.join()}\\` ` +\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,kBAA6B;AAC7B,oBAAoC;AARpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,MAAM,qBAAN,MAAwB;AAAA,EAuB9B,YAAY,SAAmC;AAC9C,SAAK,UAAU,EAAC,GAAG,QAAO;AAE1B,SAAK,aAAa,QAAQ;AAE1B,SAAK,OAAQ,QAAQ,QAAQ,CAAC,MAAM,QAAQ,QAAQ,IAAI,IACvD,QAAQ,OAAO,IAAI,iBAAK,QAAQ,IAAI;AACrC,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;AACvB,YAAM,OAAO,IAAI,qBAAO,EAAC,QAAQ,GAAG,KAAK,QAAO,CAAC,EAAE,IAAI,EAAE,MAAM,SAAO;AACrE;AACA,gBAAQ;AAAA,UACP,8CAA8C,iBAAiB,KAAK,KAAK;AAAA;AAAA,UAEzE;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;AAhGO,IAAM,oBAAN;AAAM,kBACI,UAAU;AAAA,EACzB;AAAA,EAAoB;AAAA,EAA2B;AAAA,EAC/C;AAAA,EAAoB;AAAA,EAA2B;AAAA,EAC/C;AAAA,EAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;", "names": [] }