{ "version": 3, "sources": ["../../../../sim/tools/multi-random-runner.ts"], "sourcesContent": ["/**\r\n * Battle Simulator multi random runner.\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * @license MIT\r\n */\r\n\r\nimport {PRNG, PRNGSeed} from '../prng';\r\nimport {Runner, RunnerOptions} from './runner';\r\n\r\n// @ts-ignore\r\nexport interface MultiRandomRunnerOptions extends RunnerOptions {\r\n\ttotalGames: number;\r\n\tprng?: PRNG | PRNGSeed | null;\r\n\tformat?: string;\r\n\tcycle?: boolean;\r\n\tall?: boolean;\r\n\tasync?: boolean;\r\n}\r\n\r\nexport class MultiRandomRunner {\r\n\tstatic readonly FORMATS = [\r\n\t\t'gen8randombattle', 'gen8randomdoublesbattle', 'gen8battlefactory',\r\n\t\t'gen7randombattle', 'gen7randomdoublesbattle', 'gen7battlefactory',\r\n\t\t'gen6randombattle', 'gen6battlefactory',\r\n\t\t'gen5randombattle',\r\n\t\t'gen4randombattle',\r\n\t\t'gen3randombattle',\r\n\t\t'gen2randombattle',\r\n\t\t'gen1randombattle',\r\n\t];\r\n\r\n\tprivate readonly options: Partial;\r\n\tprivate readonly totalGames: number;\r\n\tprivate readonly prng: PRNG;\r\n\tprivate readonly format: string | undefined;\r\n\tprivate readonly cycle: boolean;\r\n\tprivate readonly all: boolean;\r\n\tprivate readonly isAsync: boolean;\r\n\r\n\tprivate formatIndex: number;\r\n\tprivate numGames: number;\r\n\r\n\tconstructor(options: MultiRandomRunnerOptions) {\r\n\t\tthis.options = {...options};\r\n\r\n\t\tthis.totalGames = options.totalGames;\r\n\r\n\t\tthis.prng = (options.prng && !Array.isArray(options.prng)) ?\r\n\t\t\toptions.prng : new PRNG(options.prng);\r\n\t\tthis.options.prng = this.prng;\r\n\r\n\t\tthis.format = options.format;\r\n\t\tthis.cycle = !!options.cycle;\r\n\t\tthis.all = !!options.all;\r\n\r\n\t\tthis.isAsync = !!options.async;\r\n\r\n\t\tthis.formatIndex = 0;\r\n\t\tthis.numGames = 0;\r\n\t}\r\n\r\n\tasync run() {\r\n\t\tlet games = [];\r\n\t\tlet format: string | false;\r\n\t\tlet lastFormat: string | false = false;\r\n\t\tlet failures = 0;\r\n\t\twhile ((format = this.getNextFormat())) {\r\n\t\t\tif (this.all && lastFormat && format !== lastFormat) {\r\n\t\t\t\tif (this.isAsync) await Promise.all(games);\r\n\t\t\t\tgames = [];\r\n\t\t\t}\r\n\r\n\t\t\tconst seed = this.prng.seed;\r\n\t\t\tconst game = new Runner({format, ...this.options}).run().catch(err => {\r\n\t\t\t\tfailures++;\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t`Run \\`node tools/simulate multi 1 --format=${format} --seed=${seed.join()}\\` ` +\r\n\t\t\t\t\t`to debug (optionally with \\`--output\\` and/or \\`--input\\` for more info):\\n`,\r\n\t\t\t\t\terr\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t\tif (!this.isAsync) await game;\r\n\t\t\tgames.push(game);\r\n\t\t\tlastFormat = format;\r\n\t\t}\r\n\r\n\t\tif (this.isAsync) await Promise.all(games);\r\n\t\treturn failures;\r\n\t}\r\n\r\n\tprivate getNextFormat() {\r\n\t\tconst FORMATS = MultiRandomRunner.FORMATS;\r\n\t\tif (this.formatIndex > FORMATS.length) return false;\r\n\r\n\t\tif (this.numGames++ < this.totalGames) {\r\n\t\t\tif (this.format) {\r\n\t\t\t\treturn this.format;\r\n\t\t\t} else if (this.all) {\r\n\t\t\t\treturn FORMATS[this.formatIndex];\r\n\t\t\t} else if (this.cycle) {\r\n\t\t\t\tconst format = FORMATS[this.formatIndex];\r\n\t\t\t\tthis.formatIndex = (this.formatIndex + 1) % FORMATS.length;\r\n\t\t\t\treturn format;\r\n\t\t\t} else {\r\n\t\t\t\treturn this.prng.sample(FORMATS);\r\n\t\t\t}\r\n\t\t} else if (this.all) {\r\n\t\t\tthis.numGames = 1;\r\n\t\t\tthis.formatIndex++;\r\n\t\t\treturn FORMATS[this.formatIndex];\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n}\r\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": [] }