@haelp/teto
Version:
A typescript-based controllable TETR.IO client.
1 lines • 14 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/engine/garbage/legacy.ts"],"sourcesContent":["import {\n type GarbageQueueInitializeParams,\n type IncomingGarbage,\n type GarbageQueueSnapshot,\n type OutgoingGarbage\n} from \".\";\nimport { deepCopy, RNG } from \"../utils\";\n\nconst columnWidth = (width: number, garbageHoleSize: number) => {\n return Math.max(0, width - (garbageHoleSize - 1));\n};\n\nexport class LegacyGarbageQueue {\n options: GarbageQueueInitializeParams;\n\n queue: IncomingGarbage[];\n\n lastTankTime: number = 0;\n lastColumn: number | null = null;\n rng: RNG;\n\n // for opener phase calculations\n sent = 0;\n\n constructor(options: GarbageQueueInitializeParams) {\n this.options = deepCopy(options);\n if (!this.options.cap.absolute)\n this.options.cap.absolute = Number.MAX_SAFE_INTEGER;\n\n this.queue = [];\n\n this.rng = new RNG(this.options.seed);\n }\n\n snapshot(): GarbageQueueSnapshot {\n return {\n seed: this.rng.seed,\n lastTankTime: this.lastTankTime,\n lastColumn: this.lastColumn,\n sent: this.sent,\n queue: deepCopy(this.queue),\n hasChangedColumn: false,\n lastReceivedCount: 0\n };\n }\n\n fromSnapshot(snapshot: GarbageQueueSnapshot) {\n this.queue = deepCopy(snapshot.queue);\n this.lastTankTime = snapshot.lastTankTime;\n this.lastColumn = snapshot.lastColumn;\n this.rng = new RNG(snapshot.seed);\n this.sent = snapshot.sent;\n }\n\n rngex() {\n return this.rng.nextFloat();\n }\n\n get size() {\n return this.queue.reduce((a, b) => a + b.amount, 0);\n }\n\n receive(...args: IncomingGarbage[]) {\n this.queue.push(...args.filter((arg) => arg.amount > 0));\n\n while (this.size > this.options.cap.absolute) {\n const total = this.size;\n if (this.queue.at(-1)!.amount <= total - this.options.cap.absolute) {\n this.queue.pop();\n } else {\n this.queue.at(-1)!.amount -= total - this.options.cap.absolute;\n }\n }\n }\n\n confirm(cid: number, gameid: number, frame: number) {\n const obj = this.queue.find((g) => g.cid === cid && g.gameid === gameid);\n if (!obj) return false;\n obj.frame = frame;\n obj.confirmed = true;\n return true;\n }\n\n cancel(\n amount: number,\n pieceCount: number,\n legacy: { openerPhase?: boolean } = {}\n ) {\n let send = amount,\n cancel = 0;\n\n let cancelled: IncomingGarbage[] = [];\n\n if (\n pieceCount + 1 <=\n this.options.openerPhase - (legacy.openerPhase ? 1 : 0) &&\n this.size >= this.sent\n )\n cancel += amount;\n while ((send > 0 || cancel > 0) && this.size > 0) {\n this.queue[0].amount--;\n\n if (\n cancelled.length === 0 ||\n cancelled[cancelled.length - 1].cid !== this.queue[0].cid\n ) {\n cancelled.push({ ...this.queue[0], amount: 1 });\n } else {\n cancelled[cancelled.length - 1].amount++;\n }\n\n if (this.queue[0].amount <= 0) this.queue.shift();\n if (send > 0) send--;\n else cancel--;\n }\n\n this.sent += send;\n return [send, cancelled] as const;\n }\n\n /**\n * This function does NOT take into account messiness on timeout.\n * The first garbage hole will be correct,\n * but subsequent holes depend on whether or not garbage is cancelled.\n */\n predict() {\n const rng = this.rng.clone();\n const rngex = rng.nextFloat.bind(rng);\n\n let lastColumn = this.lastColumn;\n\n const reroll = () => {\n lastColumn = this.#__internal_rerollColumn(lastColumn, rngex);\n return lastColumn;\n };\n\n const result = this.#__internal_tank(\n deepCopy(this.queue),\n () => lastColumn,\n rngex,\n reroll,\n -Number.MIN_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER,\n false\n );\n\n return result.res;\n }\n\n get nextColumn() {\n const rng = this.rng.clone();\n if (this.lastColumn === null)\n return this.#__internal_rerollColumn(null, rng.nextFloat.bind(rng));\n return this.lastColumn;\n }\n\n #__internal_rerollColumn(current: number | null, rngex: RNG[\"nextFloat\"]) {\n let col: number;\n const cols = columnWidth(\n this.options.boardWidth,\n this.options.garbage.holeSize\n );\n\n if (this.options.messiness.nosame && current !== null) {\n col = Math.floor(rngex() * (cols - 1));\n if (col >= current) col++;\n } else {\n col = Math.floor(rngex() * cols);\n }\n\n return col;\n }\n\n #rerollColumn() {\n const col = this.#__internal_rerollColumn(\n this.lastColumn,\n this.rngex.bind(this)\n );\n this.lastColumn = col;\n return col;\n }\n\n #__internal_tank(\n queue: IncomingGarbage[],\n lastColumn: () => number | null,\n rngex: () => number,\n reroll: () => number,\n frame: number,\n cap: number,\n hard: boolean\n ) {\n if (queue.length === 0) return { res: [], lastColumn, queue };\n\n const res: OutgoingGarbage[] = [];\n\n queue = queue.sort((a, b) => a.frame - b.frame);\n\n if (\n this.options.messiness.timeout &&\n frame >= this.lastTankTime + this.options.messiness.timeout\n ) {\n reroll();\n this.lastTankTime = frame;\n }\n\n let total = 0;\n\n while (total < cap && queue.length > 0) {\n const item = deepCopy(queue[0]);\n\n // TODO: wtf hacky fix, this is 100% not right idk how to fix this\n if (item.frame + this.options.garbage.speed > (hard ? frame : frame - 1))\n break; // do not spawn garbage that is still traveling\n total += item.amount;\n\n let exausted = false;\n\n if (total > cap) {\n const excess = total - cap;\n queue[0].amount = excess;\n item.amount -= excess;\n } else {\n queue.shift();\n exausted = true;\n }\n\n for (let i = 0; i < item.amount; i++) {\n const r =\n lastColumn() === null || rngex() < this.options.messiness.within;\n res.push({\n ...item,\n id: item.cid,\n amount: 1,\n column: r ? reroll() : lastColumn()!\n });\n }\n\n if (exausted && rngex() < this.options.messiness.change) {\n reroll();\n }\n }\n\n return {\n res,\n queue\n };\n }\n\n tank(frame: number, cap: number, hard: boolean) {\n const { res, queue } = this.#__internal_tank(\n this.queue,\n () => this.lastColumn,\n this.rngex.bind(this),\n this.#rerollColumn.bind(this),\n frame,\n cap,\n hard\n );\n\n this.queue = queue;\n\n return res.map((v) => ({ ...v, bombs: this.options.bombs }));\n }\n\n round(amount: number): number {\n switch (this.options.rounding) {\n case \"down\":\n return Math.floor(amount);\n case \"rng\":\n const floored = Math.floor(amount);\n if (floored === amount) return floored;\n const decimal = amount - floored;\n return floored + (this.rngex() < decimal ? 1 : 0);\n default:\n throw new Error(`Invalid rounding mode ${this.options.rounding}`);\n }\n }\n}\n"],"names":["deepCopy","RNG","columnWidth","width","garbageHoleSize","Math","max","LegacyGarbageQueue","options","queue","lastTankTime","lastColumn","rng","sent","cap","absolute","Number","MAX_SAFE_INTEGER","seed","snapshot","hasChangedColumn","lastReceivedCount","fromSnapshot","rngex","nextFloat","size","reduce","a","b","amount","receive","args","push","filter","arg","total","at","pop","confirm","cid","gameid","frame","obj","find","g","confirmed","cancel","pieceCount","legacy","send","cancelled","openerPhase","length","shift","predict","clone","bind","reroll","result","MIN_SAFE_INTEGER","res","nextColumn","current","col","cols","boardWidth","garbage","holeSize","messiness","nosame","floor","hard","sort","timeout","item","speed","exausted","excess","i","r","within","id","column","change","tank","map","v","bombs","round","rounding","floored","decimal","Error"],"mappings":"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"}