{
  "version": 3,
  "sources": ["../src/math.ts", "../src/utils.ts", "../src/gamepad.json", "../src/app.ts", "../src/easings.ts", "../src/timer.ts", "../src/kaboom.ts"],
  "sourcesContent": ["import {\n\tPoint,\n\tRNGValue,\n\tLerpValue,\n\tVec2Args,\n} from \"./types\"\n\nexport function deg2rad(deg: number): number {\n\treturn deg * Math.PI / 180\n}\n\nexport function rad2deg(rad: number): number {\n\treturn rad * 180 / Math.PI\n}\n\nexport function clamp(\n\tval: number,\n\tmin: number,\n\tmax: number,\n): number {\n\tif (min > max) {\n\t\treturn clamp(val, max, min)\n\t}\n\treturn Math.min(Math.max(val, min), max)\n}\n\nexport function lerp<V extends LerpValue>(\n\ta: V,\n\tb: V,\n\tt: number,\n): V {\n\tif (typeof a === \"number\" && typeof b === \"number\") {\n\t\treturn a + (b - a) * t as V\n\t} else if (a instanceof Vec2 && b instanceof Vec2) {\n\t\treturn a.lerp(b, t) as V\n\t} else if (a instanceof Color && b instanceof Color) {\n\t\treturn a.lerp(b, t) as V\n\t}\n\tthrow new Error(`Bad value for lerp(): ${a}, ${b}. Only number, Vec2 and Color is supported.`)\n}\n\nexport function map(\n\tv: number,\n\tl1: number,\n\th1: number,\n\tl2: number,\n\th2: number,\n): number {\n\treturn l2 + (v - l1) / (h1 - l1) * (h2 - l2)\n}\n\nexport function mapc(\n\tv: number,\n\tl1: number,\n\th1: number,\n\tl2: number,\n\th2: number,\n): number {\n\treturn clamp(map(v, l1, h1, l2, h2), l2, h2)\n}\n\nexport class Vec2 {\n\tx: number = 0\n\ty: number = 0\n\tconstructor(x: number = 0, y: number = x) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t}\n\tstatic fromAngle(deg: number) {\n\t\tconst angle = deg2rad(deg)\n\t\treturn new Vec2(Math.cos(angle), Math.sin(angle))\n\t}\n\tstatic LEFT = new Vec2(-1, 0)\n\tstatic RIGHT = new Vec2(1, 0)\n\tstatic UP = new Vec2(0, -1)\n\tstatic DOWN = new Vec2(0, 1)\n\tclone(): Vec2 {\n\t\treturn new Vec2(this.x, this.y)\n\t}\n\tadd(...args: Vec2Args): Vec2 {\n\t\tconst p2 = vec2(...args)\n\t\treturn new Vec2(this.x + p2.x, this.y + p2.y)\n\t}\n\tsub(...args: Vec2Args): Vec2 {\n\t\tconst p2 = vec2(...args)\n\t\treturn new Vec2(this.x - p2.x, this.y - p2.y)\n\t}\n\tscale(...args: Vec2Args): Vec2 {\n\t\tconst s = vec2(...args)\n\t\treturn new Vec2(this.x * s.x, this.y * s.y)\n\t}\n\tdist(...args: Vec2Args): number {\n\t\tconst p2 = vec2(...args)\n\t\treturn this.sub(p2).len()\n\t}\n\tsdist(...args: Vec2Args): number {\n\t\tconst p2 = vec2(...args)\n\t\treturn this.sub(p2).slen()\n\t}\n\tlen(): number {\n\t\treturn Math.sqrt(this.dot(this))\n\t}\n\tslen(): number {\n\t\treturn this.dot(this)\n\t}\n\tunit(): Vec2 {\n\t\tconst len = this.len()\n\t\treturn len === 0 ? new Vec2(0) : this.scale(1 / len)\n\t}\n\tnormal(): Vec2 {\n\t\treturn new Vec2(this.y, -this.x)\n\t}\n\treflect(normal: Vec2) {\n\t\treturn this.sub(normal.scale(2 * this.dot(normal)))\n\t}\n\tproject(on: Vec2) {\n\t\treturn on.scale(on.dot(this) / on.len())\n\t}\n\treject(on: Vec2) {\n\t\treturn this.sub(this.project(on))\n\t}\n\tdot(p2: Vec2): number {\n\t\treturn this.x * p2.x + this.y * p2.y\n\t}\n\tcross(p2: Vec2): number {\n\t\treturn this.x * p2.y - this.y * p2.x\n\t}\n\tangle(...args: Vec2Args): number {\n\t\tconst p2 = vec2(...args)\n\t\treturn rad2deg(Math.atan2(this.y - p2.y, this.x - p2.x))\n\t}\n\tangleBetween(...args: Vec2Args): number {\n\t\tconst p2 = vec2(...args)\n\t\treturn rad2deg(Math.atan2(this.cross(p2), this.dot(p2)))\n\t}\n\tlerp(dest: Vec2, t: number): Vec2 {\n\t\treturn new Vec2(lerp(this.x, dest.x, t), lerp(this.y, dest.y, t))\n\t}\n\tslerp(dest: Vec2, t: number): Vec2 {\n\t\tconst cos = this.dot(dest)\n\t\tconst sin = this.cross(dest)\n\t\tconst angle = Math.atan2(sin, cos)\n\t\treturn this\n\t\t\t.scale(Math.sin((1 - t) * angle))\n\t\t\t.add(dest.scale(Math.sin(t * angle)))\n\t\t\t.scale(1 / sin)\n\t}\n\tisZero(): boolean {\n\t\treturn this.x === 0 && this.y === 0\n\t}\n\ttoFixed(n: number): Vec2 {\n\t\treturn new Vec2(Number(this.x.toFixed(n)), Number(this.y.toFixed(n)))\n\t}\n\ttransform(m: Mat4): Vec2 {\n\t\treturn m.multVec2(this)\n\t}\n\teq(other: Vec2): boolean {\n\t\treturn this.x === other.x && this.y === other.y\n\t}\n\tbbox(): Rect {\n\t\treturn new Rect(this, 0, 0)\n\t}\n\ttoString(): string {\n\t\treturn `vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`\n\t}\n}\n\nexport function vec2(...args: Vec2Args): Vec2 {\n\tif (args.length === 1) {\n\t\tif (args[0] instanceof Vec2) {\n\t\t\treturn new Vec2(args[0].x, args[0].y)\n\t\t} else if (Array.isArray(args[0]) && args[0].length === 2) {\n\t\t\treturn new Vec2(...args[0])\n\t\t}\n\t}\n\t// @ts-ignore\n\treturn new Vec2(...args)\n}\n\nexport class Color {\n\n\tr: number = 255\n\tg: number = 255\n\tb: number = 255\n\n\tconstructor(r: number, g: number, b: number) {\n\t\tthis.r = clamp(r, 0, 255)\n\t\tthis.g = clamp(g, 0, 255)\n\t\tthis.b = clamp(b, 0, 255)\n\t}\n\n\tstatic fromArray(arr: number[]) {\n\t\treturn new Color(arr[0], arr[1], arr[2])\n\t}\n\n\tstatic fromHex(hex: string | number) {\n\t\tif (typeof hex === \"number\") {\n\t\t\treturn new Color(\n\t\t\t\t(hex >> 16) & 0xff,\n\t\t\t\t(hex >> 8) & 0xff,\n\t\t\t\t(hex >> 0) & 0xff,\n\t\t\t)\n\t\t} else if (typeof hex === \"string\") {\n\t\t\tconst result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n\t\t\treturn new Color(\n\t\t\t\tparseInt(result[1], 16),\n\t\t\t\tparseInt(result[2], 16),\n\t\t\t\tparseInt(result[3], 16),\n\t\t\t)\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid hex color format\")\n\t\t}\n\t}\n\n\tstatic fromHSL(h: number, s: number, l: number) {\n\n\t\tif (s == 0){\n\t\t\treturn new Color(255 * l, 255 * l, 255 * l)\n\t\t}\n\n\t\tconst hue2rgb = (p, q, t) => {\n\t\t\tif (t < 0) t += 1\n\t\t\tif (t > 1) t -= 1\n\t\t\tif (t < 1 / 6) return p + (q - p) * 6 * t\n\t\t\tif (t < 1 / 2) return q\n\t\t\tif (t < 2 / 3) return p + (q - p) * (2/3 - t) * 6\n\t\t\treturn p\n\t\t}\n\n\t\tconst q = l < 0.5 ? l * (1 + s) : l + s - l * s\n\t\tconst p = 2 * l - q\n\t\tconst r = hue2rgb(p, q, h + 1 / 3)\n\t\tconst g = hue2rgb(p, q, h)\n\t\tconst b = hue2rgb(p, q, h - 1 / 3)\n\n\t\treturn new Color(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255))\n\n\t}\n\n\tstatic RED = new Color(255, 0, 0)\n\tstatic GREEN = new Color(0, 255, 0)\n\tstatic BLUE = new Color(0, 0, 255)\n\tstatic YELLOW = new Color(255, 255, 0)\n\tstatic MAGENTA = new Color(255, 0, 255)\n\tstatic CYAN = new Color(0, 255, 255)\n\tstatic WHITE = new Color(255, 255, 255)\n\tstatic BLACK = new Color(0, 0, 0)\n\n\tclone(): Color {\n\t\treturn new Color(this.r, this.g, this.b)\n\t}\n\n\tlighten(a: number): Color {\n\t\treturn new Color(this.r + a, this.g + a, this.b + a)\n\t}\n\n\tdarken(a: number): Color {\n\t\treturn this.lighten(-a)\n\t}\n\n\tinvert(): Color {\n\t\treturn new Color(255 - this.r, 255 - this.g, 255 - this.b)\n\t}\n\n\tmult(other: Color): Color {\n\t\treturn new Color(\n\t\t\tthis.r * other.r / 255,\n\t\t\tthis.g * other.g / 255,\n\t\t\tthis.b * other.b / 255,\n\t\t)\n\t}\n\n\tlerp(dest: Color, t: number): Color {\n\t\treturn new Color(\n\t\t\tlerp(this.r, dest.r, t),\n\t\t\tlerp(this.g, dest.g, t),\n\t\t\tlerp(this.b, dest.b, t),\n\t\t)\n\t}\n\n\teq(other: Color): boolean {\n\t\treturn this.r === other.r\n\t\t\t&& this.g === other.g\n\t\t\t&& this.b === other.b\n\n\t}\n\n\ttoString(): string {\n\t\treturn `rgb(${this.r}, ${this.g}, ${this.b})`\n\t}\n\n\ttoHex(): string {\n\t\treturn \"#\" + ((1 << 24) + (this.r << 16) + (this.g << 8) + this.b).toString(16).slice(1)\n\t}\n\n}\n\nexport function rgb(...args): Color {\n\tif (args.length === 0) {\n\t\treturn new Color(255, 255, 255)\n\t} else if (args.length === 1) {\n\t\tif (args[0] instanceof Color) {\n\t\t\treturn args[0].clone()\n\t\t} else if (typeof args[0] === \"string\") {\n\t\t\treturn Color.fromHex(args[0])\n\t\t} else if (Array.isArray(args[0]) && args[0].length === 3) {\n\t\t\treturn Color.fromArray(args[0])\n\t\t}\n\t}\n\t// @ts-ignore\n\treturn new Color(...args)\n}\n\nexport const hsl2rgb = (h, s, l) => Color.fromHSL(h, s, l)\n\nexport class Quad {\n\tx: number = 0\n\ty: number = 0\n\tw: number = 1\n\th: number = 1\n\tconstructor(x: number, y: number, w: number, h: number) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.w = w\n\t\tthis.h = h\n\t}\n\tscale(other: Quad): Quad {\n\t\treturn new Quad(\n\t\t\tthis.x + this.w * other.x,\n\t\t\tthis.y + this.h * other.y,\n\t\t\tthis.w * other.w,\n\t\t\tthis.h * other.h,\n\t\t)\n\t}\n\tpos() {\n\t\treturn new Vec2(this.x, this.y)\n\t}\n\tclone(): Quad {\n\t\treturn new Quad(this.x, this.y, this.w, this.h)\n\t}\n\teq(other: Quad): boolean {\n\t\treturn this.x === other.x\n\t\t\t&& this.y === other.y\n\t\t\t&& this.w === other.w\n\t\t\t&& this.h === other.h\n\t}\n\ttoString(): string {\n\t\treturn `quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`\n\t}\n}\n\nexport function quad(x: number, y: number, w: number, h: number): Quad {\n\treturn new Quad(x, y, w, h)\n}\n\nexport class Mat4 {\n\n\tm: number[] = [\n\t\t1, 0, 0, 0,\n\t\t0, 1, 0, 0,\n\t\t0, 0, 1, 0,\n\t\t0, 0, 0, 1,\n\t]\n\n\tconstructor(m?: number[]) {\n\t\tif (m) {\n\t\t\tthis.m = m\n\t\t}\n\t}\n\n\tstatic translate(p: Vec2): Mat4 {\n\t\treturn new Mat4([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\tp.x, p.y, 0, 1,\n\t\t])\n\t}\n\n\tstatic scale(s: Vec2): Mat4 {\n\t\treturn new Mat4([\n\t\t\ts.x, 0, 0, 0,\n\t\t\t0, s.y, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1,\n\t\t])\n\t}\n\n\tstatic rotateX(a: number): Mat4 {\n\t\ta = deg2rad(-a)\n\t\tconst c = Math.cos(a)\n\t\tconst s = Math.sin(a)\n\t\treturn new Mat4([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, -s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1,\n\t\t])\n\t}\n\n\tstatic rotateY(a: number): Mat4 {\n\t\ta = deg2rad(-a)\n\t\tconst c = Math.cos(a)\n\t\tconst s = Math.sin(a)\n\t\treturn new Mat4([\n\t\t\tc, 0, s, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t-s, 0, c, 0,\n\t\t\t0, 0, 0, 1,\n\t\t])\n\t}\n\n\tstatic rotateZ(a: number): Mat4 {\n\t\ta = deg2rad(-a)\n\t\tconst c = Math.cos(a)\n\t\tconst s = Math.sin(a)\n\t\treturn new Mat4([\n\t\t\tc, -s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1,\n\t\t])\n\t}\n\n\ttranslate(p: Vec2) {\n\t\tthis.m[12] += this.m[0] * p.x + this.m[4] * p.y\n\t\tthis.m[13] += this.m[1] * p.x + this.m[5] * p.y\n\t\tthis.m[14] += this.m[2] * p.x + this.m[6] * p.y\n\t\tthis.m[15] += this.m[3] * p.x + this.m[7] * p.y\n\t\treturn this\n\t}\n\n\tscale(p: Vec2) {\n\t\tthis.m[0] *= p.x\n\t\tthis.m[4] *= p.y\n\t\tthis.m[1] *= p.x\n\t\tthis.m[5] *= p.y\n\t\tthis.m[2] *= p.x\n\t\tthis.m[6] *= p.y\n\t\tthis.m[3] *= p.x\n\t\tthis.m[7] *= p.y\n\t\treturn this\n\t}\n\n\trotate(a: number): Mat4 {\n\t\ta = deg2rad(-a)\n\t\tconst c = Math.cos(a)\n\t\tconst s = Math.sin(a)\n\t\tconst m0 = this.m[0]\n\t\tconst m1 = this.m[1]\n\t\tconst m4 = this.m[4]\n\t\tconst m5 = this.m[5]\n\t\tthis.m[0] = m0 * c + m1 * s\n\t\tthis.m[1] = -m0 * s + m1 * c\n\t\tthis.m[4] = m4 * c + m5 * s\n\t\tthis.m[5] = -m4 * s + m5 * c\n\t\treturn this\n\t}\n\n\t// TODO: in-place variant\n\tmult(other: Mat4): Mat4 {\n\t\tconst out = []\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tfor (let j = 0; j < 4; j++) {\n\t\t\t\tout[i * 4 + j] =\n\t\t\t\t\tthis.m[0 * 4 + j] * other.m[i * 4 + 0] +\n\t\t\t\t\tthis.m[1 * 4 + j] * other.m[i * 4 + 1] +\n\t\t\t\t\tthis.m[2 * 4 + j] * other.m[i * 4 + 2] +\n\t\t\t\t\tthis.m[3 * 4 + j] * other.m[i * 4 + 3]\n\t\t\t}\n\t\t}\n\t\treturn new Mat4(out)\n\t}\n\n\tmultVec2(p: Vec2): Vec2 {\n\t\treturn new Vec2(\n\t\t\tp.x * this.m[0] + p.y * this.m[4] + this.m[12],\n\t\t\tp.x * this.m[1] + p.y * this.m[5] + this.m[13],\n\t\t)\n\t}\n\n\tgetTranslation() {\n\t\treturn new Vec2(this.m[12], this.m[13])\n\t}\n\n\tgetScale() {\n\t\tif (this.m[0] != 0 || this.m[1] != 0) {\n\t\t\tconst det = this.m[0] * this.m[5] - this.m[1] * this.m[4]\n\t\t\tconst r = Math.sqrt(this.m[0] * this.m[0] + this.m[1] * this.m[1])\n\t\t\treturn new Vec2(r, det / r)\n\t\t} else if (this.m[4] != 0 || this.m[5] != 0) {\n\t\t\tconst det = this.m[0] * this.m[5] - this.m[1] * this.m[4]\n\t\t\tconst s = Math.sqrt(this.m[4] * this.m[4] + this.m[5] * this.m[5])\n\t\t\treturn new Vec2(det / s, s)\n\t\t} else {\n\t\t\treturn new Vec2(0, 0)\n\t\t}\n\t}\n\n\tgetRotation() {\n\t\tif (this.m[0] != 0 || this.m[1] != 0) {\n\t\t\tconst r = Math.sqrt(this.m[0] * this.m[0] + this.m[1] * this.m[1])\n\t\t\treturn rad2deg(this.m[1] > 0 ? Math.acos(this.m[0] / r) : -Math.acos(this.m[0] / r))\n\t\t} else if (this.m[4] != 0 || this.m[5] != 0) {\n\t\t\tconst s = Math.sqrt(this.m[4] * this.m[4] + this.m[5] * this.m[5])\n\t\t\treturn rad2deg(Math.PI / 2 - (this.m[5] > 0 ? Math.acos(-this.m[4] / s) : -Math.acos(this.m[4] / s)))\n\t\t} else {\n\t\t\treturn 0\n\t\t}\n\t}\n\n\tgetSkew() {\n\t\tif (this.m[0] != 0 || this.m[1] != 0) {\n\t\t\tconst r = Math.sqrt(this.m[0] * this.m[0] + this.m[1] * this.m[1])\n\t\t\treturn new Vec2(Math.atan(this.m[0] * this.m[4] + this.m[1] * this.m[5]) / (r * r), 0)\n\t\t}\n\t\telse if (this.m[4] != 0 || this.m[5] != 0) {\n\t\t\tconst s = Math.sqrt(this.m[4] * this.m[4] + this.m[5] * this.m[5])\n\t\t\treturn new Vec2(0, Math.atan(this.m[0] * this.m[4] + this.m[1] * this.m[5]) / (s * s))\n\t\t}\n\t\telse {\n\t\t\treturn new Vec2(0, 0)\n\t\t}\n\t}\n\n\tinvert(): Mat4 {\n\n\t\tconst out = []\n\n\t\tconst f00 = this.m[10] * this.m[15] - this.m[14] * this.m[11]\n\t\tconst f01 = this.m[9] * this.m[15] - this.m[13] * this.m[11]\n\t\tconst f02 = this.m[9] * this.m[14] - this.m[13] * this.m[10]\n\t\tconst f03 = this.m[8] * this.m[15] - this.m[12] * this.m[11]\n\t\tconst f04 = this.m[8] * this.m[14] - this.m[12] * this.m[10]\n\t\tconst f05 = this.m[8] * this.m[13] - this.m[12] * this.m[9]\n\t\tconst f06 = this.m[6] * this.m[15] - this.m[14] * this.m[7]\n\t\tconst f07 = this.m[5] * this.m[15] - this.m[13] * this.m[7]\n\t\tconst f08 = this.m[5] * this.m[14] - this.m[13] * this.m[6]\n\t\tconst f09 = this.m[4] * this.m[15] - this.m[12] * this.m[7]\n\t\tconst f10 = this.m[4] * this.m[14] - this.m[12] * this.m[6]\n\t\tconst f11 = this.m[5] * this.m[15] - this.m[13] * this.m[7]\n\t\tconst f12 = this.m[4] * this.m[13] - this.m[12] * this.m[5]\n\t\tconst f13 = this.m[6] * this.m[11] - this.m[10] * this.m[7]\n\t\tconst f14 = this.m[5] * this.m[11] - this.m[9] * this.m[7]\n\t\tconst f15 = this.m[5] * this.m[10] - this.m[9] * this.m[6]\n\t\tconst f16 = this.m[4] * this.m[11] - this.m[8] * this.m[7]\n\t\tconst f17 = this.m[4] * this.m[10] - this.m[8] * this.m[6]\n\t\tconst f18 = this.m[4] * this.m[9] - this.m[8] * this.m[5]\n\n\t\tout[0] = this.m[5] * f00 - this.m[6] * f01 + this.m[7] * f02\n\t\tout[4] = -(this.m[4] * f00 - this.m[6] * f03 + this.m[7] * f04)\n\t\tout[8] = this.m[4] * f01 - this.m[5] * f03 + this.m[7] * f05\n\t\tout[12] = -(this.m[4] * f02 - this.m[5] * f04 + this.m[6] * f05)\n\n\t\tout[1] = -(this.m[1] * f00 - this.m[2] * f01 + this.m[3] * f02)\n\t\tout[5] = this.m[0] * f00 - this.m[2] * f03 + this.m[3] * f04\n\t\tout[9] = -(this.m[0] * f01 - this.m[1] * f03 + this.m[3] * f05)\n\t\tout[13] = this.m[0] * f02 - this.m[1] * f04 + this.m[2] * f05\n\n\t\tout[2] = this.m[1] * f06 - this.m[2] * f07 + this.m[3] * f08\n\t\tout[6] = -(this.m[0] * f06 - this.m[2] * f09 + this.m[3] * f10)\n\t\tout[10] = this.m[0] * f11 - this.m[1] * f09 + this.m[3] * f12\n\t\tout[14] = -(this.m[0] * f08 - this.m[1] * f10 + this.m[2] * f12)\n\n\t\tout[3] = -(this.m[1] * f13 - this.m[2] * f14 + this.m[3] * f15)\n\t\tout[7] = this.m[0] * f13 - this.m[2] * f16 + this.m[3] * f17\n\t\tout[11] = -(this.m[0] * f14 - this.m[1] * f16 + this.m[3] * f18)\n\t\tout[15] = this.m[0] * f15 - this.m[1] * f17 + this.m[2] * f18\n\n\t\tconst det =\n\t\t\tthis.m[0] * out[0] +\n\t\t\tthis.m[1] * out[4] +\n\t\t\tthis.m[2] * out[8] +\n\t\t\tthis.m[3] * out[12]\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tfor (let j = 0; j < 4; j++) {\n\t\t\t\tout[i * 4 + j] *= (1.0 / det)\n\t\t\t}\n\t\t}\n\n\t\treturn new Mat4(out)\n\n\t}\n\n\tclone(): Mat4 {\n\t\treturn new Mat4([...this.m])\n\t}\n\n\ttoString(): string {\n\t\treturn this.m.toString()\n\t}\n\n}\n\nexport function wave(lo: number, hi: number, t: number, f = (t) => -Math.cos(t)): number {\n\treturn lo + (f(t) + 1) / 2 * (hi - lo)\n}\n\n// basic ANSI C LCG\nconst A = 1103515245\nconst C = 12345\nconst M = 2147483648\n\nexport class RNG {\n\tseed: number\n\tconstructor(seed: number) {\n\t\tthis.seed = seed\n\t}\n\tgen(): number {\n\t\tthis.seed = (A * this.seed + C) % M\n\t\treturn this.seed / M\n\t}\n\tgenNumber(a: number, b: number): number {\n\t\treturn a + this.gen() * (b - a)\n\t}\n\tgenVec2(a: Vec2, b?: Vec2): Vec2 {\n\t\treturn new Vec2(\n\t\t\tthis.genNumber(a.x, b.x),\n\t\t\tthis.genNumber(a.y, b.y),\n\t\t)\n\t}\n\tgenColor(a: Color, b: Color): Color {\n\t\treturn new Color(\n\t\t\tthis.genNumber(a.r, b.r),\n\t\t\tthis.genNumber(a.g, b.g),\n\t\t\tthis.genNumber(a.b, b.b),\n\t\t)\n\t}\n\tgenAny<T extends RNGValue>(...args: T[]): T {\n\t\tif (args.length === 0) {\n\t\t\treturn this.gen() as T\n\t\t} else if (args.length === 1) {\n\t\t\tif (typeof args[0] === \"number\") {\n\t\t\t\treturn this.genNumber(0, args[0]) as T\n\t\t\t} else if (args[0] instanceof Vec2) {\n\t\t\t\treturn this.genVec2(vec2(0, 0), args[0]) as T\n\t\t\t} else if (args[0] instanceof Color) {\n\t\t\t\treturn this.genColor(rgb(0, 0, 0), args[0]) as T\n\t\t\t}\n\t\t} else if (args.length === 2) {\n\t\t\tif (typeof args[0] === \"number\" && typeof args[1] === \"number\") {\n\t\t\t\treturn this.genNumber(args[0], args[1]) as T\n\t\t\t} else if (args[0] instanceof Vec2 && args[1] instanceof Vec2) {\n\t\t\t\treturn this.genVec2(args[0], args[1]) as T\n\t\t\t} else if (args[0] instanceof Color && args[1] instanceof Color) {\n\t\t\t\treturn this.genColor(args[0], args[1]) as T\n\t\t\t}\n\t\t}\n\t}\n}\n\n// TODO: let user pass seed\nconst defRNG = new RNG(Date.now())\n\nexport function randSeed(seed?: number): number {\n\tif (seed != null) {\n\t\tdefRNG.seed = seed\n\t}\n\treturn defRNG.seed\n}\n\nexport function rand(...args) {\n\t// @ts-ignore\n\treturn defRNG.genAny(...args)\n}\n\n// TODO: randi() to return 0 / 1?\nexport function randi(...args: number[]) {\n\treturn Math.floor(rand(...args))\n}\n\nexport function chance(p: number): boolean {\n\treturn rand() <= p\n}\n\nexport function choose<T>(list: T[]): T {\n\treturn list[randi(list.length)]\n}\n\n// TODO: better name\nexport function testRectRect2(r1: Rect, r2: Rect): boolean {\n\treturn r1.pos.x + r1.width >= r2.pos.x\n\t\t&& r1.pos.x <= r2.pos.x + r2.width\n\t\t&& r1.pos.y + r1.height >= r2.pos.y\n\t\t&& r1.pos.y <= r2.pos.y + r2.height\n}\n\nexport function testRectRect(r1: Rect, r2: Rect): boolean {\n\treturn r1.pos.x + r1.width > r2.pos.x\n\t\t&& r1.pos.x < r2.pos.x + r2.width\n\t\t&& r1.pos.y + r1.height > r2.pos.y\n\t\t&& r1.pos.y < r2.pos.y + r2.height\n}\n\n// TODO: better name\nexport function testLineLineT(l1: Line, l2: Line): number | null {\n\n\tif ((l1.p1.x === l1.p2.x && l1.p1.y === l1.p2.y) || (l2.p1.x === l2.p2.x && l2.p1.y === l2.p2.y)) {\n\t\treturn null\n\t}\n\n\tconst denom = ((l2.p2.y - l2.p1.y) * (l1.p2.x - l1.p1.x) - (l2.p2.x - l2.p1.x) * (l1.p2.y - l1.p1.y))\n\n\t// parallel\n\tif (denom === 0) {\n\t\treturn null\n\t}\n\n\tconst ua = ((l2.p2.x - l2.p1.x) * (l1.p1.y - l2.p1.y) - (l2.p2.y - l2.p1.y) * (l1.p1.x - l2.p1.x)) / denom\n\tconst ub = ((l1.p2.x - l1.p1.x) * (l1.p1.y - l2.p1.y) - (l1.p2.y - l1.p1.y) * (l1.p1.x - l2.p1.x)) / denom\n\n\t// is the intersection on the segments\n\tif (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n\t\treturn null\n\t}\n\n\treturn ua\n\n}\n\nexport function testLineLine(l1: Line, l2: Line): Vec2 | null {\n\tconst t = testLineLineT(l1, l2)\n\tif (!t) return null\n\treturn vec2(\n\t\tl1.p1.x + t * (l1.p2.x - l1.p1.x),\n\t\tl1.p1.y + t * (l1.p2.y - l1.p1.y),\n\t)\n}\n\nexport function testRectLine(r: Rect, l: Line): boolean {\n\tif (testRectPoint(r, l.p1) || testRectPoint(r, l.p2)) {\n\t\treturn true\n\t}\n\tconst pts = r.points()\n\treturn !!testLineLine(l, new Line(pts[0], pts[1]))\n\t\t|| !!testLineLine(l, new Line(pts[1], pts[2]))\n\t\t|| !!testLineLine(l, new Line(pts[2], pts[3]))\n\t\t|| !!testLineLine(l, new Line(pts[3], pts[0]))\n}\n\nexport function testRectPoint2(r: Rect, pt: Point): boolean {\n\treturn pt.x >= r.pos.x\n\t\t&& pt.x <= r.pos.x + r.width\n\t\t&& pt.y >= r.pos.y\n\t\t&& pt.y <= r.pos.y + r.height\n}\n\nexport function testRectPoint(r: Rect, pt: Point): boolean {\n\treturn pt.x > r.pos.x\n\t\t&& pt.x < r.pos.x + r.width\n\t\t&& pt.y > r.pos.y\n\t\t&& pt.y < r.pos.y + r.height\n}\n\nexport function testRectCircle(r: Rect, c: Circle): boolean {\n\tconst nx = Math.max(r.pos.x, Math.min(c.center.x, r.pos.x + r.width))\n\tconst ny = Math.max(r.pos.y, Math.min(c.center.y, r.pos.y + r.height))\n\tconst nearestPoint = vec2(nx, ny)\n\treturn nearestPoint.sdist(c.center) <= c.radius * c.radius\n}\n\nexport function testRectPolygon(r: Rect, p: Polygon): boolean {\n\treturn testPolygonPolygon(p, new Polygon(r.points()))\n}\n\nexport function testLinePoint(l: Line, pt: Vec2): boolean {\n\tconst v1 = pt.sub(l.p1)\n\tconst v2 = l.p2.sub(l.p1)\n\n\t// Check if sine is 0, in that case lines are parallel.\n\t// If not parallel, the point cannot lie on the line.\n\tif (Math.abs(v1.cross(v2)) > Number.EPSILON) {\n\t\treturn false\n\t}\n\n\t// Scalar projection of v1 on v2\n\tconst t = v1.dot(v2) / v2.dot(v2)\n\t// Since t is percentual distance of pt from line.p1 on the line,\n\t// it should be between 0% and 100%\n\treturn t >= 0 && t <= 1\n}\n\nexport function testLineCircle(l: Line, circle: Circle): boolean {\n\tconst v = l.p2.sub(l.p1)\n\tconst a = v.dot(v)\n\tconst centerToOrigin = l.p1.sub(circle.center)\n\tconst b = 2 * v.dot(centerToOrigin)\n\tconst c = centerToOrigin.dot(centerToOrigin) - circle.radius * circle.radius\n\t// Calculate the discriminant of ax^2 + bx + c\n\tconst dis = b * b - 4 * a * c\n\n\t// No root\n\tif ((a <= Number.EPSILON) || (dis < 0)) {\n\t\treturn false\n\t}\n\t// One possible root\n\telse if (dis == 0) {\n\t\tconst t = -b / (2 * a)\n\t\tif (t >= 0 && t <= 1) {\n\t\t\treturn true\n\t\t}\n\t}\n\t// Two possible roots\n\telse {\n\t\tconst t1 = (-b + Math.sqrt(dis)) / (2 * a)\n\t\tconst t2 = (-b - Math.sqrt(dis)) / (2 * a)\n\t\tif ((t1 >= 0 && t1 <= 1) || (t2 >= 0 && t2 <= 1)) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check if line is completely within the circle\n\t// We only need to check one point, since the line didn't cross the circle\n\treturn testCirclePoint(circle, l.p1)\n}\n\nexport function testLinePolygon(l: Line, p: Polygon): boolean {\n\n\t// test if line is inside\n\tif (testPolygonPoint(p, l.p1) || testPolygonPoint(p, l.p2)) {\n\t\treturn true\n\t}\n\n\t// test each line\n\tfor (let i = 0; i < p.pts.length; i++) {\n\t\tconst p1 = p.pts[i]\n\t\tconst p2 = p.pts[(i + 1) % p.pts.length]\n\t\tif (testLineLine(l, new Line(p1, p2))) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n\n}\n\nexport function testCirclePoint(c: Circle, p: Point): boolean {\n\treturn c.center.sdist(p) < c.radius * c.radius\n}\n\nexport function testCircleCircle(c1: Circle, c2: Circle): boolean {\n\treturn c1.center.sdist(c2.center) < (c1.radius + c2.radius) * (c1.radius + c2.radius)\n}\n\nexport function testCirclePolygon(c: Circle, p: Polygon): boolean {\n\t// For each edge check for intersection\n\tlet prev = p.pts[p.pts.length - 1]\n\tfor (const cur of p.pts) {\n\t\tif (testLineCircle(new Line(prev, cur), c)) {\n\t\t\treturn true\n\t\t}\n\t\tprev = cur\n\t}\n\n\t// Check if the polygon is completely within the circle\n\t// We only need to check one point, since the polygon didn't cross the circle\n\tif (testCirclePoint(c, p.pts[0])) {\n\t\treturn true\n\t}\n\n\t// Check if the circle is completely within the polygon\n\treturn testPolygonPoint(p, c.center)\n}\n\nexport function testPolygonPolygon(p1: Polygon, p2: Polygon): boolean {\n\tfor (let i = 0; i < p1.pts.length; i++) {\n\t\tif (testLinePolygon(new Line(p1.pts[i], p1.pts[(i + 1) % p1.pts.length]), p2)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nexport function testPolygonPoint(poly: Polygon, pt: Point): boolean {\n\n\tlet c = false\n\tconst p = poly.pts\n\n\tfor (let i = 0, j = p.length - 1; i < p.length; j = i++) {\n\t\tif (\n\t\t\t((p[i].y > pt.y) != (p[j].y > pt.y))\n\t\t\t&& (pt.x < (p[j].x - p[i].x) * (pt.y - p[i].y) / (p[j].y - p[i].y) + p[i].x)\n\t\t) {\n\t\t\tc = !c\n\t\t}\n\t}\n\n\treturn c\n\n}\n\nexport function testPointPoint(p1: Point, p2: Point): boolean {\n\treturn p1.x === p2.x && p1.y === p2.y\n}\n\nexport class Line {\n\tp1: Vec2\n\tp2: Vec2\n\tconstructor(p1: Vec2, p2: Vec2) {\n\t\tthis.p1 = p1.clone()\n\t\tthis.p2 = p2.clone()\n\t}\n\ttransform(m: Mat4): Line {\n\t\treturn new Line(m.multVec2(this.p1), m.multVec2(this.p2))\n\t}\n\tbbox(): Rect {\n\t\treturn Rect.fromPoints(this.p1, this.p2)\n\t}\n\tarea(): number {\n\t\treturn this.p1.dist(this.p2)\n\t}\n\tclone(): Line {\n\t\treturn new Line(this.p1, this.p2)\n\t}\n}\n\n// TODO: use x: number y: number (x, y, width, height)\nexport class Rect {\n\tpos: Vec2\n\twidth: number\n\theight: number\n\tconstructor(pos: Vec2, width: number, height: number) {\n\t\tthis.pos = pos.clone()\n\t\tthis.width = width\n\t\tthis.height = height\n\t}\n\tstatic fromPoints(p1: Vec2, p2: Vec2): Rect {\n\t\treturn new Rect(p1.clone(), p2.x - p1.x, p2.y - p1.y)\n\t}\n\tcenter(): Vec2 {\n\t\treturn new Vec2(this.pos.x + this.width / 2, this.pos.y + this.height / 2)\n\t}\n\tpoints(): [Vec2, Vec2, Vec2, Vec2] {\n\t\treturn [\n\t\t\tthis.pos,\n\t\t\tthis.pos.add(this.width, 0),\n\t\t\tthis.pos.add(this.width, this.height),\n\t\t\tthis.pos.add(0, this.height),\n\t\t]\n\t}\n\ttransform(m: Mat4): Polygon {\n\t\treturn new Polygon(this.points().map((pt) => m.multVec2(pt)))\n\t}\n\tbbox(): Rect {\n\t\treturn this.clone()\n\t}\n\tarea(): number {\n\t\treturn this.width * this.height\n\t}\n\tclone(): Rect {\n\t\treturn new Rect(this.pos.clone(), this.width, this.height)\n\t}\n\tdistToPoint(p: Vec2): number {\n\t\treturn Math.sqrt(this.sdistToPoint(p))\n\t}\n\tsdistToPoint(p: Vec2): number {\n\t\tconst min = this.pos\n\t\tconst max = this.pos.add(this.width, this.height)\n\t\tconst dx = Math.max(min.x - p.x, 0, p.x - max.x)\n\t\tconst dy = Math.max(min.y - p.y, 0, p.y - max.y)\n\t\treturn dx * dx + dy * dy\n\t}\n}\n\nexport class Circle {\n\tcenter: Vec2\n\tradius: number\n\tconstructor(center: Vec2, radius: number) {\n\t\tthis.center = center.clone()\n\t\tthis.radius = radius\n\t}\n\ttransform(tr: Mat4): Ellipse {\n\t\treturn new Ellipse(this.center, this.radius, this.radius).transform(tr)\n\t}\n\tbbox(): Rect {\n\t\treturn Rect.fromPoints(\n\t\t\tthis.center.sub(vec2(this.radius)),\n\t\t\tthis.center.add(vec2(this.radius)),\n\t\t)\n\t}\n\tarea(): number {\n\t\treturn this.radius * this.radius * Math.PI\n\t}\n\tclone(): Circle {\n\t\treturn new Circle(this.center, this.radius)\n\t}\n}\n\nexport class Ellipse {\n\tcenter: Vec2\n\tradiusX: number\n\tradiusY: number\n\tconstructor(center: Vec2, rx: number, ry: number) {\n\t\tthis.center = center.clone()\n\t\tthis.radiusX = rx\n\t\tthis.radiusY = ry\n\t}\n\ttransform(tr: Mat4): Ellipse {\n\t\treturn new Ellipse(\n\t\t\ttr.multVec2(this.center),\n\t\t\ttr.m[0] * this.radiusX,\n\t\t\ttr.m[5] * this.radiusY,\n\t\t)\n\t}\n\tbbox(): Rect {\n\t\treturn Rect.fromPoints(\n\t\t\tthis.center.sub(vec2(this.radiusX, this.radiusY)),\n\t\t\tthis.center.add(vec2(this.radiusX, this.radiusY)),\n\t\t)\n\t}\n\tarea(): number {\n\t\treturn this.radiusX * this.radiusY * Math.PI\n\t}\n\tclone(): Ellipse {\n\t\treturn new Ellipse(this.center, this.radiusX, this.radiusY)\n\t}\n}\n\nexport class Polygon {\n\tpts: Vec2[]\n\tconstructor(pts: Vec2[]) {\n\t\tif (pts.length < 3) {\n\t\t\tthrow new Error(\"Polygons should have at least 3 vertices\")\n\t\t}\n\t\tthis.pts = pts\n\t}\n\ttransform(m: Mat4): Polygon {\n\t\treturn new Polygon(this.pts.map((pt) => m.multVec2(pt)))\n\t}\n\tbbox(): Rect {\n\t\tconst p1 = vec2(Number.MAX_VALUE)\n\t\tconst p2 = vec2(-Number.MAX_VALUE)\n\t\tfor (const pt of this.pts) {\n\t\t\tp1.x = Math.min(p1.x, pt.x)\n\t\t\tp2.x = Math.max(p2.x, pt.x)\n\t\t\tp1.y = Math.min(p1.y, pt.y)\n\t\t\tp2.y = Math.max(p2.y, pt.y)\n\t\t}\n\t\treturn Rect.fromPoints(p1, p2)\n\t}\n\tarea(): number {\n\t\tlet total = 0\n\t\tconst l = this.pts.length\n\t\tfor (let i = 0; i < l; i++) {\n\t\t\tconst p1 = this.pts[i]\n\t\t\tconst p2 = this.pts[(i + 1) % l]\n\t\t\ttotal += (p1.x * p2.y * 0.5)\n\t\t\ttotal -= (p2.x * p1.y * 0.5)\n\t\t}\n\t\treturn Math.abs(total)\n\t}\n\tclone(): Polygon {\n\t\treturn new Polygon(this.pts.map((pt) => pt.clone()))\n\t}\n}\n\nexport function sat(p1: Polygon, p2: Polygon): Vec2 | null {\n\tlet overlap = Number.MAX_VALUE\n\tlet displacement = vec2(0)\n\tfor (const poly of [p1, p2]) {\n\t\tfor (let i = 0; i < poly.pts.length; i++) {\n\t\t\tconst a = poly.pts[i]\n\t\t\tconst b = poly.pts[(i + 1) % poly.pts.length]\n\t\t\tconst axisProj = b.sub(a).normal().unit()\n\t\t\tlet min1 = Number.MAX_VALUE\n\t\t\tlet max1 = -Number.MAX_VALUE\n\t\t\tfor (let j = 0; j < p1.pts.length; j++) {\n\t\t\t\tconst q = p1.pts[j].dot(axisProj)\n\t\t\t\tmin1 = Math.min(min1, q)\n\t\t\t\tmax1 = Math.max(max1, q)\n\t\t\t}\n\t\t\tlet min2 = Number.MAX_VALUE\n\t\t\tlet max2 = -Number.MAX_VALUE\n\t\t\tfor (let j = 0; j < p2.pts.length; j++) {\n\t\t\t\tconst q = p2.pts[j].dot(axisProj)\n\t\t\t\tmin2 = Math.min(min2, q)\n\t\t\t\tmax2 = Math.max(max2, q)\n\t\t\t}\n\t\t\tconst o = Math.min(max1, max2) - Math.max(min1, min2)\n\t\t\tif (o < 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (o < Math.abs(overlap)) {\n\t\t\t\tconst o1 = max2 - min1\n\t\t\t\tconst o2 = min2 - max1\n\t\t\t\toverlap = Math.abs(o1) < Math.abs(o2) ? o1 : o2\n\t\t\t\tdisplacement = axisProj.scale(overlap)\n\t\t\t}\n\t\t}\n\t}\n\treturn displacement\n}\n", "export class IDList<T> extends Map<number, T> {\n\tprivate lastID: number\n\tconstructor(...args) {\n\t\tsuper(...args)\n\t\tthis.lastID = 0\n\t}\n\tpush(v: T): number {\n\t\tconst id = this.lastID\n\t\tthis.set(id, v)\n\t\tthis.lastID++\n\t\treturn id\n\t}\n\tpushd(v: T): () => void {\n\t\tconst id = this.push(v)\n\t\treturn () => this.delete(id)\n\t}\n}\n\nexport class EventController {\n\tpaused: boolean = false\n\treadonly cancel: () => void\n\tconstructor(cancel: () => void) {\n\t\tthis.cancel = cancel\n\t}\n\tstatic join(events: EventController[]): EventController {\n\t\tconst ev = new EventController(() => events.forEach((e) => e.cancel()))\n\t\tObject.defineProperty(ev, \"paused\", {\n\t\t\tget: () => events[0].paused,\n\t\t\tset: (p: boolean) => events.forEach((e) => e.paused = p),\n\t\t})\n\t\tev.paused = false\n\t\treturn ev\n\t}\n}\n\nexport class Event<Args extends any[] = any[]> {\n\tprivate handlers: IDList<(...args: Args) => void> = new IDList()\n\tadd(action: (...args: Args) => void): EventController {\n\t\tconst cancel = this.handlers.pushd((...args: Args) => {\n\t\t\tif (ev.paused) return\n\t\t\taction(...args)\n\t\t})\n\t\tconst ev = new EventController(cancel)\n\t\treturn ev\n\t}\n\taddOnce(action: (...args) => void): EventController {\n\t\tconst ev = this.add((...args) => {\n\t\t\tev.cancel()\n\t\t\taction(...args)\n\t\t})\n\t\treturn ev\n\t}\n\tnext(): Promise<Args> {\n\t\treturn new Promise((res) => this.addOnce(res))\n\t}\n\ttrigger(...args: Args) {\n\t\tthis.handlers.forEach((action) => action(...args))\n\t}\n\tnumListeners(): number {\n\t\treturn this.handlers.size\n\t}\n\tclear() {\n\t\tthis.handlers.clear()\n\t}\n}\n\n// TODO: only accept one argument?\nexport class EventHandler<EventMap extends Record<string, any[]>> {\n\tprivate handlers: Partial<{\n\t\t[Name in keyof EventMap]: Event<EventMap[Name]>\n\t}> = {}\n\ton<Name extends keyof EventMap>(\n\t\tname: Name,\n\t\taction: (...args: EventMap[Name]) => void,\n\t): EventController {\n\t\tif (!this.handlers[name]) {\n\t\t\tthis.handlers[name] = new Event<EventMap[Name]>()\n\t\t}\n\t\treturn this.handlers[name].add(action)\n\t}\n\tonOnce<Name extends keyof EventMap>(\n\t\tname: Name,\n\t\taction: (...args: EventMap[Name]) => void,\n\t): EventController {\n\t\tconst ev = this.on(name, (...args) => {\n\t\t\tev.cancel()\n\t\t\taction(...args)\n\t\t})\n\t\treturn ev\n\t}\n\tnext<Name extends keyof EventMap>(name: Name): Promise<unknown> {\n\t\treturn new Promise((res) => {\n\t\t\t// TODO: can only pass 1 val to resolve()\n\t\t\tthis.onOnce(name, (...args: EventMap[Name]) => res(args[0]))\n\t\t})\n\t}\n\ttrigger<Name extends keyof EventMap>(name: Name, ...args: EventMap[Name]) {\n\t\tif (this.handlers[name]) {\n\t\t\tthis.handlers[name].trigger(...args)\n\t\t}\n\t}\n\tremove<Name extends keyof EventMap>(name: Name) {\n\t\tdelete this.handlers[name]\n\t}\n\tclear() {\n\t\tthis.handlers = {}\n\t}\n\tnumListeners<Name extends keyof EventMap>(name: Name): number {\n\t\treturn this.handlers[name]?.numListeners() ?? 0\n\t}\n}\n\nexport function deepEq(o1: any, o2: any): boolean {\n\tconst t1 = typeof o1\n\tconst t2 = typeof o2\n\tif (t1 !== t2) {\n\t\treturn false\n\t}\n\tif (t1 === \"object\" && t2 === \"object\" && o1 !== null && o2 !== null) {\n\t\tconst k1 = Object.keys(o1)\n\t\tconst k2 = Object.keys(o2)\n\t\tif (k1.length !== k2.length) {\n\t\t\treturn false\n\t\t}\n\t\tfor (const k of k1) {\n\t\t\tconst v1 = o1[k]\n\t\t\tconst v2 = o2[k]\n\t\t\tif (!(typeof v1 === \"function\" && typeof v2 === \"function\")) {\n\t\t\t\tif (!deepEq(v1, v2)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn o1 === o2\n}\n\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n\tconst binstr = window.atob(base64)\n\tconst len = binstr.length\n\tconst bytes = new Uint8Array(len)\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binstr.charCodeAt(i)\n\t}\n\treturn bytes.buffer\n}\n\nexport function dataURLToArrayBuffer(url: string): ArrayBuffer {\n\treturn base64ToArrayBuffer(url.split(\",\")[1])\n}\n\nexport function download(filename: string, url: string) {\n\tconst a = document.createElement(\"a\")\n\ta.href = url\n\ta.download = filename\n\ta.click()\n}\n\nexport function downloadText(filename: string, text: string) {\n\tdownload(filename, \"data:text/plain;charset=utf-8,\" + text)\n}\n\nexport function downloadJSON(filename: string, data: any) {\n\tdownloadText(filename, JSON.stringify(data))\n}\n\nexport function downloadBlob(filename: string, blob: Blob) {\n\tconst url = URL.createObjectURL(blob)\n\tdownload(filename, url)\n\tURL.revokeObjectURL(url)\n}\n\nexport const isDataURL = (str: string) => str.match(/^data:\\w+\\/\\w+;base64,.+/)\nexport const getExt = (p: string) => p.split(\".\").pop()\n\nexport const uid = (() => {\n\tlet id = 0\n\treturn () => id++\n})()\n\nconst warned = new Set()\n\nexport function warn(msg: string) {\n\tif (!warned.has(msg)) {\n\t\twarned.add(msg)\n\t\tconsole.warn(msg)\n\t}\n}\n\nexport function deprecateMsg(oldName: string, newName: string) {\n\twarn(`${oldName} is deprecated. Use ${newName} instead.`)\n}\n\nexport function deprecate(oldName: string, newName: string, newFunc: (...args) => any) {\n\treturn (...args) => {\n\t\tdeprecateMsg(oldName, newName)\n\t\treturn newFunc(...args)\n\t}\n}\n\nexport function benchmark(task: () => void, times: number = 1) {\n\tconst t1 = performance.now()\n\tfor (let i = 0; i < times; i++) {\n\t\ttask()\n\t}\n\tconst t2 = performance.now()\n\treturn t2 - t1\n}\n\nexport function comparePerf(t1: () => void, t2: () => void, times: number = 1) {\n\treturn benchmark(t2, times) / benchmark(t1, times)\n}\n\nexport class BinaryHeap<T> {\n\t_items: T[]\n\t_compareFn: (a: T, b: T) => boolean\n\n\t/**\n\t * Creates a binary heap with the given compare function\n\t * Not passing a compare function will give a min heap\n\t */\n\tconstructor(compareFn = (a: T, b: T) => a < b) {\n\t\tthis._compareFn = compareFn\n\t\tthis._items = []\n\t}\n\n\t/**\n\t * Insert an item into the binary heap\n\t */\n\tinsert(item: T) {\n\t\tthis._items.push(item)\n\t\tthis.moveUp(this._items.length - 1)\n\t}\n\n\t/**\n\t * Remove the smallest item from the binary heap in case of a min heap\n\t * or the greatest item from the binary heap in case of a max heap\n\t */\n\tremove() {\n\t\tif (this._items.length === 0)\n\t\t\treturn null\n\t\tconst item = this._items[0]\n\t\tconst lastItem = this._items.pop()\n\t\tif (this._items.length !== 0) {\n\t\t\tthis._items[0] = lastItem as T\n\t\t\tthis.moveDown(0)\n\t\t}\n\t\treturn item\n\t}\n\n\t/**\n\t * Remove all items\n\t */\n\tclear() {\n\t\tthis._items.splice(0, this._items.length)\n\t}\n\n\tmoveUp(pos: number) {\n\t\twhile (pos > 0) {\n\t\t\tconst parent = Math.floor((pos - 1) / 2)\n\t\t\tif (!this._compareFn(this._items[pos], this._items[parent]))\n\t\t\t\tif (this._items[pos] >= this._items[parent])\n\t\t\t\t\tbreak\n\t\t\tthis.swap(pos, parent)\n\t\t\tpos = parent\n\t\t}\n\t}\n\n\tmoveDown(pos: number) {\n\t\twhile (pos < Math.floor(this._items.length / 2)) {\n\t\t\tlet child = 2 * pos + 1\n\t\t\tif (child < this._items.length - 1 && !this._compareFn(this._items[child], this._items[child + 1]))\n\t\t\t\t++child\n\t\t\tif (this._compareFn(this._items[pos], this._items[child]))\n\t\t\t\tbreak\n\t\t\tthis.swap(pos, child)\n\t\t\tpos = child\n\t\t}\n\t}\n\n\tswap(index1: number, index2: number) {\n\t\t[this._items[index1], this._items[index2]] = [this._items[index2], this._items[index1]]\n\t}\n\n\t/**\n\t * Returns the amount of items\n\t */\n\tget length() {\n\t\treturn this._items.length\n\t}\n}\n", "{\n\t\"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)\": {\n\t\t\"buttons\": {\n\t\t\t\"0\": \"south\",\n\t\t\t\"1\": \"east\",\n\t\t\t\"2\": \"west\",\n\t\t\t\"3\": \"north\",\n\t\t\t\"4\": \"lshoulder\",\n\t\t\t\"5\": \"rshoulder\",\n\t\t\t\"6\": \"ltrigger\",\n\t\t\t\"7\": \"rtrigger\",\n\t\t\t\"8\": \"select\",\n\t\t\t\"9\": \"start\",\n\t\t\t\"10\": \"lstick\",\n\t\t\t\"11\": \"rstick\",\n\t\t\t\"12\": \"dpad-up\",\n\t\t\t\"13\": \"dpad-down\",\n\t\t\t\"14\": \"dpad-left\",\n\t\t\t\"15\": \"dpad-right\",\n\t\t\t\"16\": \"home\",\n\t\t\t\"17\": \"capture\"\n\t\t},\n\t\t\"sticks\": {\n\t\t\t\"left\": { \"x\": 0, \"y\": 1 },\n\t\t\t\"right\": { \"x\": 2, \"y\": 3 }\n\t\t}\n\t},\n\t\"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)\": {\n\t\t\"buttons\": {\n\t\t\t\"0\": \"south\",\n\t\t\t\"1\": \"east\",\n\t\t\t\"2\": \"west\",\n\t\t\t\"3\": \"north\",\n\t\t\t\"4\": \"lshoulder\",\n\t\t\t\"5\": \"rshoulder\",\n\t\t\t\"9\": \"select\",\n\t\t\t\"10\": \"lstick\",\n\t\t\t\"16\": \"start\"\n\t\t},\n\t\t\"sticks\": {\n\t\t\t\"left\": { \"x\": 0, \"y\": 1 }\n\t\t}\n\t},\n\t\"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)\": {\n\t\t\"buttons\": {\n\t\t\t\"0\": \"south\",\n\t\t\t\"1\": \"east\",\n\t\t\t\"2\": \"west\",\n\t\t\t\"3\": \"north\",\n\t\t\t\"4\": \"lshoulder\",\n\t\t\t\"5\": \"rshoulder\",\n\t\t\t\"9\": \"start\",\n\t\t\t\"10\": \"lstick\",\n\t\t\t\"16\": \"select\"\n\t\t},\n\t\t\"sticks\": {\n\t\t\t\"left\": { \"x\": 0, \"y\": 1 }\n\t\t}\n\t},\n\t\"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)\": {\n\t\t\"buttons\": {\n\t\t\t\"0\": \"south\",\n\t\t\t\"1\": \"east\",\n\t\t\t\"2\": \"west\",\n\t\t\t\"3\": \"north\",\n\t\t\t\"4\": \"lshoulder\",\n\t\t\t\"5\": \"rshoulder\",\n\t\t\t\"6\": \"ltrigger\",\n\t\t\t\"7\": \"rtrigger\",\n\t\t\t\"8\": \"select\",\n\t\t\t\"9\": \"start\",\n\t\t\t\"10\": \"lstick\",\n\t\t\t\"11\": \"rstick\",\n\t\t\t\"12\": \"dpad-up\",\n\t\t\t\"13\": \"dpad-down\",\n\t\t\t\"14\": \"dpad-left\",\n\t\t\t\"15\": \"dpad-right\",\n\t\t\t\"16\": \"home\",\n\t\t\t\"17\": \"capture\"\n\t\t},\n\t\t\"sticks\": {\n\t\t\t\"left\": { \"x\": 0, \"y\": 1 },\n\t\t\t\"right\": { \"x\": 2, \"y\": 3 }\n\t\t}\n\t},\n\t\"default\": {\n\t\t\"buttons\": {\n\t\t\t\"0\": \"south\",\n\t\t\t\"1\": \"east\",\n\t\t\t\"2\": \"west\",\n\t\t\t\"3\": \"north\",\n\t\t\t\"4\": \"lshoulder\",\n\t\t\t\"5\": \"rshoulder\",\n\t\t\t\"6\": \"ltrigger\",\n\t\t\t\"7\": \"rtrigger\",\n\t\t\t\"8\": \"select\",\n\t\t\t\"9\": \"start\",\n\t\t\t\"10\": \"lstick\",\n\t\t\t\"11\": \"rstick\",\n\t\t\t\"12\": \"dpad-up\",\n\t\t\t\"13\": \"dpad-down\",\n\t\t\t\"14\": \"dpad-left\",\n\t\t\t\"15\": \"dpad-right\",\n\t\t\t\"16\": \"home\"\n\t\t},\n\t\t\"sticks\": {\n\t\t\t\"left\": { \"x\": 0, \"y\": 1 },\n\t\t\t\"right\": { \"x\": 2, \"y\": 3 }\n\t\t}\n\t}\n}\n", "// everything related to canvas, game loop and input\n\nimport type {\n\tKaboomCtx,\n\tCursor,\n\tKey,\n\tMouseButton,\n\tGamepadButton,\n\tGamepadStick,\n\tGamepadDef,\n\tKGamePad,\n} from \"./types\"\n\nimport {\n\tVec2,\n} from \"./math\"\n\nimport {\n\tEventHandler,\n\tEventController,\n} from \"./utils\"\n\nimport GAMEPAD_MAP from \"./gamepad.json\"\n\nexport class ButtonState<T = string> {\n\tpressed: Set<T> = new Set([])\n\tpressedRepeat: Set<T> = new Set([])\n\treleased: Set<T> = new Set([])\n\tdown: Set<T> = new Set([])\n\tupdate() {\n\t\tthis.pressed.clear()\n\t\tthis.released.clear()\n\t\tthis.pressedRepeat.clear()\n\t}\n\tpress(btn: T) {\n\t\tthis.pressed.add(btn)\n\t\tthis.pressedRepeat.add(btn)\n\t\tthis.down.add(btn)\n\t}\n\tpressRepeat(btn: T) {\n\t\tthis.pressedRepeat.add(btn)\n\t}\n\trelease(btn: T) {\n\t\tthis.down.delete(btn)\n\t\tthis.pressed.delete(btn)\n\t\tthis.released.add(btn)\n\t}\n}\n\nclass GamepadState {\n\tbuttonState: ButtonState<GamepadButton> = new ButtonState()\n\tstickState: Map<GamepadStick, Vec2> = new Map()\n}\n\nclass FPSCounter {\n\tprivate dts: number[] = []\n\tprivate timer: number = 0\n\tfps: number = 0\n\ttick(dt: number) {\n\t\tthis.dts.push(dt)\n\t\tthis.timer += dt\n\t\tif (this.timer >= 1) {\n\t\t\tthis.timer = 0\n\t\t\tthis.fps = Math.round(1 / (this.dts.reduce((a, b) => a + b) / this.dts.length))\n\t\t\tthis.dts = []\n\t\t}\n\t}\n}\n\nexport default (opt: {\n\tcanvas: HTMLCanvasElement,\n\ttouchToMouse?: boolean,\n\tgamepads?: Record<string, GamepadDef>,\n\tpixelDensity?: number,\n\tmaxFPS?: number,\n}) => {\n\n\tif (!opt.canvas) {\n\t\tthrow new Error(\"Please provide a canvas\")\n\t}\n\n\tconst state = {\n\t\tcanvas: opt.canvas,\n\t\tloopID: null as null | number,\n\t\tstopped: false,\n\t\tdt: 0,\n\t\ttime: 0,\n\t\trealTime: 0,\n\t\tfpsCounter: new FPSCounter(),\n\t\ttimeScale: 1,\n\t\tskipTime: false,\n\t\tnumFrames: 0,\n\t\tmousePos: new Vec2(0),\n\t\tmouseDeltaPos: new Vec2(0),\n\t\tkeyState: new ButtonState<Key>(),\n\t\tmouseState: new ButtonState<MouseButton>(),\n\t\tmergedGamepadState: new GamepadState(),\n\t\tgamepadStates: new Map<number, GamepadState>(),\n\t\tgamepads: [] as KGamePad[],\n\t\tcharInputted: [],\n\t\tisMouseMoved: false,\n\t\tlastWidth: opt.canvas.offsetWidth,\n\t\tlastHeight: opt.canvas.offsetHeight,\n\t\tevents: new EventHandler<{\n\t\t\tmouseMove: [],\n\t\t\tmouseDown: [MouseButton],\n\t\t\tmousePress: [MouseButton],\n\t\t\tmouseRelease: [MouseButton],\n\t\t\tcharInput: [string],\n\t\t\tkeyPress: [Key],\n\t\t\tkeyDown: [Key],\n\t\t\tkeyPressRepeat: [Key],\n\t\t\tkeyRelease: [Key],\n\t\t\ttouchStart: [Vec2, Touch],\n\t\t\ttouchMove: [Vec2, Touch],\n\t\t\ttouchEnd: [Vec2, Touch],\n\t\t\tgamepadButtonDown: [string],\n\t\t\tgamepadButtonPress: [string],\n\t\t\tgamepadButtonRelease: [string],\n\t\t\tgamepadStick: [string, Vec2],\n\t\t\tgamepadConnect: [KGamePad],\n\t\t\tgamepadDisconnect: [KGamePad],\n\t\t\tscroll: [Vec2],\n\t\t\thide: [],\n\t\t\tshow: [],\n\t\t\tresize: [],\n\t\t\tinput: [],\n\t\t}>(),\n\t}\n\n\tfunction canvas() {\n\t\treturn state.canvas\n\t}\n\n\tfunction dt() {\n\t\treturn state.dt * state.timeScale\n\t}\n\n\tfunction time() {\n\t\treturn state.time\n\t}\n\n\tfunction fps() {\n\t\treturn state.fpsCounter.fps\n\t}\n\n\tfunction numFrames() {\n\t\treturn state.numFrames\n\t}\n\n\tfunction screenshot(): string {\n\t\treturn state.canvas.toDataURL()\n\t}\n\n\tfunction setCursor(c: Cursor): void {\n\t\tstate.canvas.style.cursor = c\n\t}\n\n\tfunction getCursor(): Cursor {\n\t\treturn state.canvas.style.cursor\n\t}\n\n\tfunction setCursorLocked(b: boolean): void {\n\t\tif (b) {\n\t\t\ttry {\n\t\t\t\tconst res = state.canvas.requestPointerLock() as unknown as Promise<void>\n\t\t\t\tif (res.catch) {\n\t\t\t\t\tres.catch((e) => console.error(e))\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t}\n\t\t} else {\n\t\t\tdocument.exitPointerLock()\n\t\t}\n\t}\n\n\tfunction isCursorLocked(): boolean {\n\t\treturn !!document.pointerLockElement\n\t}\n\n\t// wrappers around full screen functions to work across browsers\n\tfunction enterFullscreen(el: HTMLElement) {\n\t\tif (el.requestFullscreen) el.requestFullscreen()\n\t\t// @ts-ignore\n\t\telse if (el.webkitRequestFullscreen) el.webkitRequestFullscreen()\n\t}\n\n\tfunction exitFullscreen() {\n\t\tif (document.exitFullscreen) document.exitFullscreen()\n\t\t// @ts-ignore\n\t\telse if (document.webkitExitFullScreen) document.webkitExitFullScreen()\n\t}\n\n\tfunction getFullscreenElement(): Element | void {\n\t\treturn document.fullscreenElement\n\t\t\t// @ts-ignore\n\t\t\t|| document.webkitFullscreenElement\n\t}\n\n\tfunction setFullscreen(f: boolean = true) {\n\t\tif (f) {\n\t\t\tenterFullscreen(state.canvas)\n\t\t} else {\n\t\t\texitFullscreen()\n\t\t}\n\t}\n\n\tfunction isFullscreen(): boolean {\n\t\treturn Boolean(getFullscreenElement())\n\t}\n\n\tfunction quit() {\n\t\tstate.stopped = true\n\t\tfor (const name in canvasEvents) {\n\t\t\tstate.canvas.removeEventListener(name, canvasEvents[name])\n\t\t}\n\t\tfor (const name in docEvents) {\n\t\t\tdocument.removeEventListener(name, docEvents[name])\n\t\t}\n\t\tfor (const name in winEvents) {\n\t\t\twindow.removeEventListener(name, winEvents[name])\n\t\t}\n\t\tresizeObserver.disconnect()\n\t}\n\n\tfunction run(action: () => void) {\n\n\t\tif (state.loopID !== null) {\n\t\t\tcancelAnimationFrame(state.loopID)\n\t\t}\n\n\t\tlet accumulatedDt = 0\n\n\t\tconst frame = (t: number) => {\n\n\t\t\tif (state.stopped) return\n\n\t\t\t// TODO: allow background actions?\n\t\t\tif (document.visibilityState !== \"visible\") {\n\t\t\t\tstate.loopID = requestAnimationFrame(frame)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst loopTime = t / 1000\n\t\t\tconst realDt = loopTime - state.realTime\n\t\t\tconst desiredDt = opt.maxFPS ? 1 / opt.maxFPS : 0\n\n\t\t\tstate.realTime = loopTime\n\t\t\taccumulatedDt += realDt\n\n\t\t\tif (accumulatedDt > desiredDt) {\n\t\t\t\tif (!state.skipTime) {\n\t\t\t\t\tstate.dt = accumulatedDt\n\t\t\t\t\tstate.time += dt()\n\t\t\t\t\tstate.fpsCounter.tick(state.dt)\n\t\t\t\t}\n\t\t\t\taccumulatedDt = 0\n\t\t\t\tstate.skipTime = false\n\t\t\t\tstate.numFrames++\n\t\t\t\tprocessInput()\n\t\t\t\taction()\n\t\t\t\tresetInput()\n\t\t\t}\n\n\t\t\tstate.loopID = requestAnimationFrame(frame)\n\n\t\t}\n\n\t\tframe(0)\n\n\t}\n\n\tfunction isTouchscreen() {\n\t\treturn (\"ontouchstart\" in window) || navigator.maxTouchPoints > 0\n\t}\n\n\tfunction mousePos(): Vec2 {\n\t\treturn state.mousePos.clone()\n\t}\n\n\tfunction mouseDeltaPos(): Vec2 {\n\t\treturn state.mouseDeltaPos.clone()\n\t}\n\n\tfunction isMousePressed(m: MouseButton = \"left\"): boolean {\n\t\treturn state.mouseState.pressed.has(m)\n\t}\n\n\tfunction isMouseDown(m: MouseButton = \"left\"): boolean {\n\t\treturn state.mouseState.down.has(m)\n\t}\n\n\tfunction isMouseReleased(m: MouseButton = \"left\"): boolean {\n\t\treturn state.mouseState.released.has(m)\n\t}\n\n\tfunction isMouseMoved(): boolean {\n\t\treturn state.isMouseMoved\n\t}\n\n\tfunction isKeyPressed(k?: Key): boolean {\n\t\treturn k === undefined\n\t\t\t? state.keyState.pressed.size > 0\n\t\t\t: state.keyState.pressed.has(k)\n\t}\n\n\tfunction isKeyPressedRepeat(k?: Key): boolean {\n\t\treturn k === undefined\n\t\t\t? state.keyState.pressedRepeat.size > 0\n\t\t\t: state.keyState.pressedRepeat.has(k)\n\t}\n\n\tfunction isKeyDown(k?: Key): boolean {\n\t\treturn k === undefined\n\t\t\t? state.keyState.down.size > 0\n\t\t\t: state.keyState.down.has(k)\n\t}\n\n\tfunction isKeyReleased(k?: Key): boolean {\n\t\treturn k === undefined\n\t\t\t? state.keyState.released.size > 0\n\t\t\t: state.keyState.released.has(k)\n\t}\n\n\tfunction isGamepadButtonPressed(btn?: GamepadButton): boolean {\n\t\treturn btn === undefined\n\t\t\t? state.mergedGamepadState.buttonState.pressed.size > 0\n\t\t\t: state.mergedGamepadState.buttonState.pressed.has(btn)\n\t}\n\n\tfunction isGamepadButtonDown(btn?: GamepadButton): boolean {\n\t\treturn btn === undefined\n\t\t\t? state.mergedGamepadState.buttonState.down.size > 0\n\t\t\t: state.mergedGamepadState.buttonState.down.has(btn)\n\t}\n\n\tfunction isGamepadButtonReleased(btn?: GamepadButton): boolean {\n\t\treturn btn === undefined\n\t\t\t? state.mergedGamepadState.buttonState.released.size > 0\n\t\t\t: state.mergedGamepadState.buttonState.released.has(btn)\n\t}\n\n\tfunction onResize(action: () => void): EventController {\n\t\treturn state.events.on(\"resize\", action)\n\t}\n\n\t// input callbacks\n\tconst onKeyDown = ((key, action) => {\n\t\tif (typeof key === \"function\") {\n\t\t\treturn state.events.on(\"keyDown\", key)\n\t\t} else if (typeof key === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"keyDown\", (k) => k === key && action(key))\n\t\t}\n\t}) as KaboomCtx[\"onKeyDown\"]\n\n\tconst onKeyPress = ((key, action) => {\n\t\tif (typeof key === \"function\") {\n\t\t\treturn state.events.on(\"keyPress\", key)\n\t\t} else if (typeof key === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"keyPress\", (k) => k === key && action(key))\n\t\t}\n\t}) as KaboomCtx[\"onKeyPress\"]\n\n\tconst onKeyPressRepeat = ((key, action) => {\n\t\tif (typeof key === \"function\") {\n\t\t\treturn state.events.on(\"keyPressRepeat\", key)\n\t\t} else if (typeof key === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"keyPressRepeat\", (k) => k === key && action(key))\n\t\t}\n\t}) as KaboomCtx[\"onKeyPressRepeat\"]\n\n\tconst onKeyRelease = ((key, action) => {\n\t\tif (typeof key === \"function\") {\n\t\t\treturn state.events.on(\"keyRelease\", key)\n\t\t} else if (typeof key === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"keyRelease\", (k) => k === key && action(key))\n\t\t}\n\t}) as KaboomCtx[\"onKeyRelease\"]\n\n\tfunction onMouseDown(\n\t\tmouse: MouseButton | ((m: MouseButton) => void),\n\t\taction?: (m: MouseButton) => void,\n\t): EventController {\n\t\tif (typeof mouse === \"function\") {\n\t\t\treturn state.events.on(\"mouseDown\", (m) => mouse(m))\n\t\t} else {\n\t\t\treturn state.events.on(\"mouseDown\", (m) => m === mouse && action(m))\n\t\t}\n\t}\n\n\tfunction onMousePress(\n\t\tmouse: MouseButton | ((m: MouseButton) => void),\n\t\taction?: (m: MouseButton) => void,\n\t): EventController {\n\t\tif (typeof mouse === \"function\") {\n\t\t\treturn state.events.on(\"mousePress\", (m) => mouse(m))\n\t\t} else {\n\t\t\treturn state.events.on(\"mousePress\", (m) => m === mouse && action(m))\n\t\t}\n\t}\n\n\tfunction onMouseRelease(\n\t\tmouse: MouseButton | ((m: MouseButton) => void),\n\t\taction?: (m: MouseButton) => void,\n\t): EventController {\n\t\tif (typeof mouse === \"function\") {\n\t\t\treturn state.events.on(\"mouseRelease\", (m) => mouse(m))\n\t\t} else {\n\t\t\treturn state.events.on(\"mouseRelease\", (m) => m === mouse && action(m))\n\t\t}\n\t}\n\n\tfunction onMouseMove(f: (pos: Vec2, dpos: Vec2) => void): EventController {\n\t\treturn state.events.on(\"mouseMove\", () => f(mousePos(), mouseDeltaPos()))\n\t}\n\n\tfunction onCharInput(action: (ch: string) => void): EventController {\n\t\treturn state.events.on(\"charInput\", action)\n\t}\n\n\tfunction onTouchStart(f: (pos: Vec2, t: Touch) => void): EventController {\n\t\treturn state.events.on(\"touchStart\", f)\n\t}\n\n\tfunction onTouchMove(f: (pos: Vec2, t: Touch) => void): EventController {\n\t\treturn state.events.on(\"touchMove\", f)\n\t}\n\n\tfunction onTouchEnd(f: (pos: Vec2, t: Touch) => void): EventController {\n\t\treturn state.events.on(\"touchEnd\", f)\n\t}\n\n\tfunction onScroll(action: (delta: Vec2) => void): EventController {\n\t\treturn state.events.on(\"scroll\", action)\n\t}\n\n\tfunction onHide(action: () => void): EventController {\n\t\treturn state.events.on(\"hide\", action)\n\t}\n\n\tfunction onShow(action: () => void): EventController {\n\t\treturn state.events.on(\"show\", action)\n\t}\n\n\tfunction onGamepadButtonDown(btn: GamepadButton | ((btn: GamepadButton) => void), action?: (btn: GamepadButton) => void): EventController {\n\t\tif (typeof btn === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonDown\", btn)\n\t\t} else if (typeof btn === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonDown\", (b) => b === btn && action(btn))\n\t\t}\n\t}\n\n\tfunction onGamepadButtonPress(btn: GamepadButton | ((btn: GamepadButton) => void), action?: (btn: GamepadButton) => void): EventController {\n\t\tif (typeof btn === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonPress\", btn)\n\t\t} else if (typeof btn === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonPress\", (b) => b === btn && action(btn))\n\t\t}\n\t}\n\n\tfunction onGamepadButtonRelease(btn: GamepadButton | ((btn: GamepadButton) => void), action?: (btn: GamepadButton) => void): EventController {\n\t\tif (typeof btn === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonRelease\", btn)\n\t\t} else if (typeof btn === \"string\" && typeof action === \"function\") {\n\t\t\treturn state.events.on(\"gamepadButtonRelease\", (b) => b === btn && action(btn))\n\t\t}\n\t}\n\n\tfunction onGamepadStick(stick: GamepadStick, action: (value: Vec2) => void): EventController {\n\t\treturn state.events.on(\"gamepadStick\", ((a: string, v: Vec2) => a === stick && action(v)))\n\t}\n\n\tfunction onGamepadConnect(action: (gamepad: KGamePad) => void) {\n\t\tstate.events.on(\"gamepadConnect\", action)\n\t}\n\n\tfunction onGamepadDisconnect(action: (gamepad: KGamePad) => void) {\n\t\tstate.events.on(\"gamepadDisconnect\", action)\n\t}\n\n\tfunction getGamepadStick(stick: GamepadStick): Vec2 {\n\t\treturn state.mergedGamepadState.stickState.get(stick) || new Vec2(0)\n\t}\n\n\tfunction charInputted(): string[] {\n\t\treturn [...state.charInputted]\n\t}\n\n\tfunction getGamepads(): KGamePad[] {\n\t\treturn [...state.gamepads]\n\t}\n\n\tfunction processInput() {\n\t\tstate.events.trigger(\"input\")\n\t\tstate.keyState.down.forEach((k) => state.events.trigger(\"keyDown\", k))\n\t\tstate.mouseState.down.forEach((k) => state.events.trigger(\"mouseDown\", k))\n\t\tprocessGamepad()\n\t}\n\n\tfunction resetInput() {\n\t\tstate.keyState.update()\n\t\tstate.mouseState.update()\n\t\tstate.mergedGamepadState.buttonState.update()\n\t\tstate.mergedGamepadState.stickState.forEach((v, k) => {\n\t\t\tstate.mergedGamepadState.stickState.set(k, new Vec2(0))\n\t\t})\n\t\tstate.charInputted = []\n\t\tstate.isMouseMoved = false\n\n\t\tstate.gamepadStates.forEach((s) => {\n\t\t\ts.buttonState.update()\n\t\t\ts.stickState.forEach((v, k) => {\n\t\t\t\ts.stickState.set(k, new Vec2(0))\n\t\t\t})\n\t\t})\n\t}\n\n\tfunction registerGamepad(browserGamepad: Gamepad) {\n\n\t\tconst gamepad = {\n\t\t\tindex: browserGamepad.index,\n\t\t\tisPressed: (btn: GamepadButton) => {\n\t\t\t\treturn state.gamepadStates.get(browserGamepad.index).buttonState.pressed.has(btn)\n\t\t\t},\n\t\t\tisDown: (btn: GamepadButton) => {\n\t\t\t\treturn state.gamepadStates.get(browserGamepad.index).buttonState.down.has(btn)\n\t\t\t},\n\t\t\tisReleased: (btn: GamepadButton) => {\n\t\t\t\treturn state.gamepadStates.get(browserGamepad.index).buttonState.released.has(btn)\n\t\t\t},\n\t\t\tgetStick: (stick: GamepadStick) => {\n\t\t\t\treturn state.gamepadStates.get(browserGamepad.index).stickState.get(stick)\n\t\t\t},\n\t\t}\n\n\t\tstate.gamepads.push(gamepad)\n\n\t\tstate.gamepadStates.set(browserGamepad.index, {\n\t\t\tbuttonState: new ButtonState(),\n\t\t\tstickState: new Map([\n\t\t\t\t[\"left\", new Vec2(0)],\n\t\t\t\t[\"right\", new Vec2(0)],\n\t\t\t]),\n\t\t})\n\n\t\treturn gamepad\n\n\t}\n\n\tfunction removeGamepad(gamepad: Gamepad) {\n\t\tstate.gamepads = state.gamepads.filter((g) => g.index !== gamepad.index)\n\t\tstate.gamepadStates.delete(gamepad.index)\n\t}\n\n\tfunction processGamepad() {\n\n\t\tfor (const browserGamepad of navigator.getGamepads()) {\n\t\t\tif (browserGamepad && !state.gamepadStates.has(browserGamepad.index)) {\n\t\t\t\tregisterGamepad(browserGamepad)\n\t\t\t}\n\t\t}\n\n\t\tfor (const gamepad of state.gamepads) {\n\n\t\t\tconst browserGamepad = navigator.getGamepads()[gamepad.index]\n\t\t\tconst customMap = opt.gamepads ?? {}\n\t\t\tconst map = customMap[browserGamepad.id] ?? GAMEPAD_MAP[browserGamepad.id] ?? GAMEPAD_MAP[\"default\"]\n\t\t\tconst gamepadState = state.gamepadStates.get(gamepad.index)\n\n\t\t\tfor (let i = 0; i < browserGamepad.buttons.length; i++) {\n\t\t\t\tif (browserGamepad.buttons[i].pressed) {\n\t\t\t\t\tif (!gamepadState.buttonState.down.has(map.buttons[i])) {\n\t\t\t\t\t\tstate.mergedGamepadState.buttonState.press(map.buttons[i])\n\t\t\t\t\t\tgamepadState.buttonState.press(map.buttons[i])\n\t\t\t\t\t\tstate.events.trigger(\"gamepadButtonPress\", map.buttons[i])\n\t\t\t\t\t}\n\t\t\t\t\tstate.events.trigger(\"gamepadButtonDown\", map.buttons[i])\n\t\t\t\t} else {\n\t\t\t\t\tif (gamepadState.buttonState.down.has(map.buttons[i])) {\n\t\t\t\t\t\tstate.mergedGamepadState.buttonState.release(map.buttons[i])\n\t\t\t\t\t\tgamepadState.buttonState.release(map.buttons[i])\n\t\t\t\t\t\tstate.events.trigger(\"gamepadButtonRelease\", map.buttons[i])\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const stickName in map.sticks) {\n\t\t\t\tconst stick = map.sticks[stickName]\n\t\t\t\tconst value = new Vec2(\n\t\t\t\t\tbrowserGamepad.axes[stick.x],\n\t\t\t\t\tbrowserGamepad.axes[stick.y],\n\t\t\t\t)\n\t\t\t\tgamepadState.stickState.set(stickName as GamepadStick, value)\n\t\t\t\tstate.mergedGamepadState.stickState.set(stickName as GamepadStick, value)\n\t\t\t\tstate.events.trigger(\"gamepadStick\", stickName, value)\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttype EventList<M> = {\n\t\t[event in keyof M]?: (event: M[event]) => void\n\t}\n\n\tconst canvasEvents: EventList<HTMLElementEventMap> = {}\n\tconst docEvents: EventList<DocumentEventMap> = {}\n\tconst winEvents: EventList<WindowEventMap> = {}\n\n\tcanvasEvents.mousemove = (e) => {\n\t\tconst mousePos = new Vec2(e.offsetX, e.offsetY)\n\t\tconst mouseDeltaPos = new Vec2(e.movementX, e.movementY)\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tstate.isMouseMoved = true\n\t\t\tstate.mousePos = mousePos\n\t\t\tstate.mouseDeltaPos = mouseDeltaPos\n\t\t\tstate.events.trigger(\"mouseMove\")\n\t\t})\n\t}\n\n\tconst MOUSE_BUTTONS: MouseButton[] = [\n\t\t\"left\",\n\t\t\"middle\",\n\t\t\"right\",\n\t\t\"back\",\n\t\t\"forward\",\n\t]\n\n\tcanvasEvents.mousedown = (e) => {\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst m = MOUSE_BUTTONS[e.button]\n\t\t\tif (!m) return\n\t\t\tstate.mouseState.press(m)\n\t\t\tstate.events.trigger(\"mousePress\", m)\n\t\t})\n\t}\n\n\tcanvasEvents.mouseup = (e) => {\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst m = MOUSE_BUTTONS[e.button]\n\t\t\tif (!m) return\n\t\t\tstate.mouseState.release(m)\n\t\t\tstate.events.trigger(\"mouseRelease\", m)\n\t\t})\n\t}\n\n\tconst PREVENT_DEFAULT_KEYS = new Set([\n\t\t\" \",\n\t\t\"ArrowLeft\",\n\t\t\"ArrowRight\",\n\t\t\"ArrowUp\",\n\t\t\"ArrowDown\",\n\t\t\"Tab\",\n\t])\n\n\t// translate these key names to a simpler version\n\tconst KEY_ALIAS = {\n\t\t\"ArrowLeft\": \"left\",\n\t\t\"ArrowRight\": \"right\",\n\t\t\"ArrowUp\": \"up\",\n\t\t\"ArrowDown\": \"down\",\n\t\t\" \": \"space\",\n\t}\n\n\tcanvasEvents.keydown = (e) => {\n\t\tif (PREVENT_DEFAULT_KEYS.has(e.key)) {\n\t\t\te.preventDefault()\n\t\t}\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst k = KEY_ALIAS[e.key] || e.key.toLowerCase()\n\t\t\tif (k.length === 1) {\n\t\t\t\tstate.events.trigger(\"charInput\", k)\n\t\t\t\tstate.charInputted.push(k)\n\t\t\t} else if (k === \"space\") {\n\t\t\t\tstate.events.trigger(\"charInput\", \" \")\n\t\t\t\tstate.charInputted.push(\" \")\n\t\t\t}\n\t\t\tif (e.repeat) {\n\t\t\t\tstate.keyState.pressRepeat(k)\n\t\t\t\tstate.events.trigger(\"keyPressRepeat\", k)\n\t\t\t} else {\n\t\t\t\tstate.keyState.press(k)\n\t\t\t\tstate.events.trigger(\"keyPressRepeat\", k)\n\t\t\t\tstate.events.trigger(\"keyPress\", k)\n\t\t\t}\n\t\t})\n\t}\n\n\tcanvasEvents.keyup = (e) => {\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst k = KEY_ALIAS[e.key] || e.key.toLowerCase()\n\t\t\tstate.keyState.release(k)\n\t\t\tstate.events.trigger(\"keyRelease\", k)\n\t\t})\n\t}\n\n\tcanvasEvents.touchstart = (e) => {\n\t\t// disable long tap context menu\n\t\te.preventDefault()\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst touches = [...e.changedTouches]\n\t\t\tconst box = state.canvas.getBoundingClientRect()\n\t\t\tif (opt.touchToMouse !== false) {\n\t\t\t\tstate.mousePos = new Vec2(\n\t\t\t\t\ttouches[0].clientX - box.x,\n\t\t\t\t\ttouches[0].clientY - box.y,\n\t\t\t\t)\n\t\t\t\tstate.mouseState.press(\"left\")\n\t\t\t\tstate.events.trigger(\"mousePress\", \"left\")\n\t\t\t}\n\t\t\ttouches.forEach((t) => {\n\t\t\t\tstate.events.trigger(\n\t\t\t\t\t\"touchStart\",\n\t\t\t\t\tnew Vec2(t.clientX - box.x, t.clientY - box.y),\n\t\t\t\t\tt,\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t}\n\n\tcanvasEvents.touchmove = (e) => {\n\t\t// disable scrolling\n\t\te.preventDefault()\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst touches = [...e.changedTouches]\n\t\t\tconst box = state.canvas.getBoundingClientRect()\n\t\t\tif (opt.touchToMouse !== false) {\n\t\t\t\tstate.mousePos = new Vec2(\n\t\t\t\t\ttouches[0].clientX - box.x,\n\t\t\t\t\ttouches[0].clientY - box.y,\n\t\t\t\t)\n\t\t\t\tstate.events.trigger(\"mouseMove\")\n\t\t\t}\n\t\t\ttouches.forEach((t) => {\n\t\t\t\tstate.events.trigger(\n\t\t\t\t\t\"touchMove\",\n\t\t\t\t\tnew Vec2(t.clientX - box.x, t.clientY - box.y),\n\t\t\t\t\tt,\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t}\n\n\tcanvasEvents.touchend = (e) => {\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst touches = [...e.changedTouches]\n\t\t\tconst box = state.canvas.getBoundingClientRect()\n\t\t\tif (opt.touchToMouse !== false) {\n\t\t\t\tstate.mousePos = new Vec2(\n\t\t\t\t\ttouches[0].clientX - box.x,\n\t\t\t\t\ttouches[0].clientY - box.y,\n\t\t\t\t)\n\t\t\t\tstate.mouseState.release(\"left\")\n\t\t\t\tstate.events.trigger(\"mouseRelease\", \"left\")\n\t\t\t}\n\t\t\ttouches.forEach((t) => {\n\t\t\t\tstate.events.trigger(\n\t\t\t\t\t\"touchEnd\",\n\t\t\t\t\tnew Vec2(t.clientX - box.x, t.clientY - box.y),\n\t\t\t\t\tt,\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t}\n\n\tcanvasEvents.touchcancel = (e) => {\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tconst touches = [...e.changedTouches]\n\t\t\tconst box = state.canvas.getBoundingClientRect()\n\t\t\tif (opt.touchToMouse !== false) {\n\t\t\t\tstate.mousePos = new Vec2(\n\t\t\t\t\ttouches[0].clientX - box.x,\n\t\t\t\t\ttouches[0].clientY - box.y,\n\t\t\t\t)\n\t\t\t\tstate.mouseState.release(\"left\")\n\t\t\t\tstate.events.trigger(\"mouseRelease\", \"left\")\n\t\t\t}\n\t\t\ttouches.forEach((t) => {\n\t\t\t\tstate.events.trigger(\n\t\t\t\t\t\"touchEnd\",\n\t\t\t\t\tnew Vec2(t.clientX - box.x, t.clientY - box.y),\n\t\t\t\t\tt,\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t}\n\n\t// TODO: option to not prevent default?\n\tcanvasEvents.wheel = (e) => {\n\t\te.preventDefault()\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tstate.events.trigger(\"scroll\", new Vec2(e.deltaX, e.deltaY))\n\t\t})\n\t}\n\n\tcanvasEvents.contextmenu = (e) => e.preventDefault()\n\n\tdocEvents.visibilitychange = () => {\n\t\tif (document.visibilityState === \"visible\") {\n\t\t\t// prevent a surge of dt when switch back after the tab being hidden for a while\n\t\t\tstate.skipTime = true\n\t\t\tstate.events.trigger(\"show\")\n\t\t} else {\n\t\t\tstate.events.trigger(\"hide\")\n\t\t}\n\t}\n\n\twinEvents.gamepadconnected = (e) => {\n\t\tconst kbGamepad = registerGamepad(e.gamepad)\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tstate.events.trigger(\"gamepadConnect\", kbGamepad)\n\t\t})\n\t}\n\n\twinEvents.gamepaddisconnected = (e) => {\n\t\tconst kbGamepad = getGamepads().filter((g) => g.index === e.gamepad.index)[0]\n\t\tremoveGamepad(e.gamepad)\n\t\tstate.events.onOnce(\"input\", () => {\n\t\t\tstate.events.trigger(\"gamepadDisconnect\", kbGamepad)\n\t\t})\n\t}\n\n\tfor (const name in canvasEvents) {\n\t\tstate.canvas.addEventListener(name, canvasEvents[name])\n\t}\n\n\tfor (const name in docEvents) {\n\t\tdocument.addEventListener(name, docEvents[name])\n\t}\n\n\tfor (const name in winEvents) {\n\t\twindow.addEventListener(name, winEvents[name])\n\t}\n\n\tconst resizeObserver = new ResizeObserver((entries) => {\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.target !== state.canvas) continue\n\t\t\tif (\n\t\t\t\tstate.lastWidth === state.canvas.offsetWidth\n\t\t\t\t&& state.lastHeight === state.canvas.offsetHeight\n\t\t\t) return\n\t\t\tstate.lastWidth = state.canvas.offsetWidth\n\t\t\tstate.lastHeight = state.canvas.offsetHeight\n\t\t\tstate.events.onOnce(\"input\", () => {\n\t\t\t\tstate.events.trigger(\"resize\")\n\t\t\t})\n\t\t}\n\t})\n\n\tresizeObserver.observe(state.canvas)\n\n\treturn {\n\t\tdt,\n\t\ttime,\n\t\trun,\n\t\tcanvas,\n\t\tfps,\n\t\tnumFrames,\n\t\tquit,\n\t\tsetFullscreen,\n\t\tisFullscreen,\n\t\tsetCursor,\n\t\tscreenshot,\n\t\tgetGamepads,\n\t\tgetCursor,\n\t\tsetCursorLocked,\n\t\tisCursorLocked,\n\t\tisTouchscreen,\n\t\tmousePos,\n\t\tmouseDeltaPos,\n\t\tisKeyDown,\n\t\tisKeyPressed,\n\t\tisKeyPressedRepeat,\n\t\tisKeyReleased,\n\t\tisMouseDown,\n\t\tisMousePressed,\n\t\tisMouseReleased,\n\t\tisMouseMoved,\n\t\tisGamepadButtonPressed,\n\t\tisGamepadButtonDown,\n\t\tisGamepadButtonReleased,\n\t\tgetGamepadStick,\n\t\tcharInputted,\n\t\tonResize,\n\t\tonKeyDown,\n\t\tonKeyPress,\n\t\tonKeyPressRepeat,\n\t\tonKeyRelease,\n\t\tonMouseDown,\n\t\tonMousePress,\n\t\tonMouseRelease,\n\t\tonMouseMove,\n\t\tonCharInput,\n\t\tonTouchStart,\n\t\tonTouchMove,\n\t\tonTouchEnd,\n\t\tonScroll,\n\t\tonHide,\n\t\tonShow,\n\t\tonGamepadButtonDown,\n\t\tonGamepadButtonPress,\n\t\tonGamepadButtonRelease,\n\t\tonGamepadStick,\n\t\tonGamepadConnect,\n\t\tonGamepadDisconnect,\n\t\tevents: state.events,\n\t}\n\n}\n", "// https://easings.net/\nconst c1 = 1.70158\nconst c2 = c1 * 1.525\nconst c3 = c1 + 1\nconst c4 = (2 * Math.PI) / 3\nconst c5 = (2 * Math.PI) / 4.5\n\nconst easings = {\n\tlinear: (x) => x,\n\teaseInSine: (x) => 1 - Math.cos((x * Math.PI) / 2),\n\teaseOutSine: (x) => Math.sin((x * Math.PI) / 2),\n\teaseInOutSine: (x) => -(Math.cos(Math.PI * x) - 1) / 2,\n\teaseInQuad: (x) => x * x,\n\teaseOutQuad: (x) => 1 - (1 - x) * (1 - x),\n\teaseInOutQuad: (x) => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n\teaseInCubic: (x) => x * x * x,\n\teaseOutCubic: (x) => 1 - Math.pow(1 - x, 3),\n\teaseInOutCubic: (x) => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,\n\teaseInQuart: (x) => x * x * x * x,\n\teaseOutQuart: (x) => 1 - Math.pow(1 - x, 4),\n\teaseInOutQuart: (x) => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,\n\teaseInQuint: (x) => x * x * x * x * x,\n\teaseOutQuint: (x) => 1 - Math.pow(1 - x, 5),\n\teaseInOutQuint: (x) => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,\n\teaseInExpo: (x) => x === 0 ? 0 : Math.pow(2, 10 * x - 10),\n\teaseOutExpo: (x) => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),\n\teaseInOutExpo: (x) => {\n\t\treturn x === 0\n\t\t\t? 0\n\t\t\t: x === 1\n\t\t\t\t? 1\n\t\t\t\t: x < 0.5\n\t\t\t\t\t? Math.pow(2, 20 * x - 10) / 2\n\t\t\t\t\t: (2 - Math.pow(2, -20 * x + 10)) / 2\n\t},\n\teaseInCirc: (x) => 1 - Math.sqrt(1 - Math.pow(x, 2)),\n\teaseOutCirc: (x) => Math.sqrt(1 - Math.pow(x - 1, 2)),\n\teaseInOutCirc: (x) => {\n\t\treturn x < 0.5\n\t\t\t? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n\t\t\t: (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2\n\t},\n\teaseInBack: (x) => c3 * x * x * x - c1 * x * x,\n\teaseOutBack: (x) => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),\n\teaseInOutBack: (x) => {\n\t\treturn x < 0.5\n\t\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2\n\t},\n\teaseInElastic: (x) => {\n\t\treturn x === 0\n\t\t\t? 0\n\t\t\t: x === 1\n\t\t\t\t? 1\n\t\t\t\t: -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4)\n\t},\n\teaseOutElastic: (x) => {\n\t\treturn x === 0\n\t\t\t? 0\n\t\t\t: x === 1\n\t\t\t\t? 1\n\t\t\t\t: Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1\n\t},\n\teaseInOutElastic: (x) => {\n\t\treturn x === 0\n\t\t\t? 0\n\t\t\t: x === 1\n\t\t\t\t? 1\n\t\t\t\t: x < 0.5\n\t\t\t\t\t? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n\t\t\t\t\t: (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 + 1\n\t},\n\teaseInBounce: (x) => 1 - easings.easeOutBounce(1 - x),\n\teaseOutBounce: (x) => {\n\t\tconst n1 = 7.5625\n\t\tconst d1 = 2.75\n\t\tif (x < 1 / d1) {\n\t\t\treturn n1 * x * x\n\t\t} else if (x < 2 / d1) {\n\t\t\treturn n1 * (x -= 1.5 / d1) * x + 0.75\n\t\t} else if (x < 2.5 / d1) {\n\t\t\treturn n1 * (x -= 2.25 / d1) * x + 0.9375\n\t\t} else {\n\t\t\treturn n1 * (x -= 2.625 / d1) * x + 0.984375\n\t\t}\n\t},\n\teaseInOutBounce: (x) => {\n\t\treturn x < 0.5\n\t\t\t? (1 - easings.easeOutBounce(1 - 2 * x)) / 2\n\t\t\t: (1 + easings.easeOutBounce(2 * x - 1)) / 2\n\t},\n}\n\nexport default easings\n", "export default class Timer {\n\n\ttime: number\n\taction: () => void\n\tfinished: boolean = false\n\tpaused: boolean = false\n\n\tconstructor(time: number, action: () => void) {\n\t\tthis.time = time\n\t\tthis.action = action\n\t}\n\n\ttick(dt: number): boolean {\n\t\tif (this.finished || this.paused) return false\n\t\tthis.time -= dt\n\t\tif (this.time <= 0) {\n\t\t\tthis.action()\n\t\t\tthis.finished = true\n\t\t\tthis.time = 0\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\treset(time) {\n\t\tthis.time = time\n\t\tthis.finished = false\n\t}\n\n}\n", "const VERSION = \"3000.1.8\"\n\nimport initApp from \"./app\"\n\nimport {\n\tsat,\n\tvec2,\n\tRect,\n\tPolygon,\n\tLine,\n\tCircle,\n\tColor,\n\tVec2,\n\tMat4,\n\tQuad,\n\tRNG,\n\tquad,\n\trgb,\n\thsl2rgb,\n\trand,\n\trandi,\n\trandSeed,\n\tchance,\n\tchoose,\n\tclamp,\n\tlerp,\n\tmap,\n\tmapc,\n\twave,\n\ttestLinePoint,\n\ttestLineLine,\n\ttestLineCircle,\n\ttestRectRect,\n\ttestRectLine,\n\ttestRectPoint,\n\ttestPolygonPoint,\n\ttestCirclePolygon,\n\tdeg2rad,\n\trad2deg,\n} from \"./math\"\n\nimport easings from \"./easings\"\n\nimport {\n\tIDList,\n\tEvent,\n\tEventHandler,\n\tdownload,\n\tdownloadText,\n\tdownloadJSON,\n\tdownloadBlob,\n\tuid,\n\tisDataURL,\n\tgetExt,\n\tdeepEq,\n\tdataURLToArrayBuffer,\n\tEventController,\n\t// eslint-disable-next-line\n\twarn,\n\t// eslint-disable-next-line\n\tbenchmark,\n\t// eslint-disable-next-line\n\tcomparePerf,\n\tBinaryHeap,\n} from \"./utils\"\n\nimport type {\n\tGfxShader,\n\tGfxFont,\n\tRenderProps,\n\tCharTransform,\n\tTextureOpt,\n\tImageSource,\n\tFormattedText,\n\tFormattedChar,\n\tDrawRectOpt,\n\tDrawLineOpt,\n\tDrawLinesOpt,\n\tDrawTriangleOpt,\n\tDrawPolygonOpt,\n\tDrawCircleOpt,\n\tDrawEllipseOpt,\n\tDrawUVQuadOpt,\n\tVertex,\n\tBitmapFontData,\n\tShaderData,\n\tLoadSpriteSrc,\n\tLoadSpriteOpt,\n\tSpriteAtlasData,\n\tLoadBitmapFontOpt,\n\tKaboomCtx,\n\tKaboomOpt,\n\tAudioPlay,\n\tAudioPlayOpt,\n\tDrawSpriteOpt,\n\tDrawTextOpt,\n\tTextAlign,\n\tGameObj,\n\tSceneName,\n\tSceneDef,\n\tCompList,\n\tComp,\n\tTag,\n\tKey,\n\tMouseButton,\n\tPosComp,\n\tScaleComp,\n\tRotateComp,\n\tColorComp,\n\tOpacityComp,\n\tAnchor,\n\tAnchorComp,\n\tZComp,\n\tFollowComp,\n\tOffScreenCompOpt,\n\tOffScreenComp,\n\tAreaCompOpt,\n\tAreaComp,\n\tSpriteComp,\n\tSpriteCompOpt,\n\tSpriteAnimPlayOpt,\n\tSpriteAnims,\n\tTextComp,\n\tTextCompOpt,\n\tRectComp,\n\tRectCompOpt,\n\tUVQuadComp,\n\tCircleComp,\n\tOutlineComp,\n\tTimerComp,\n\tBodyComp,\n\tBodyCompOpt,\n\tUniform,\n\tShaderComp,\n\tFixedComp,\n\tStayComp,\n\tHealthComp,\n\tLifespanCompOpt,\n\tStateComp,\n\tDebug,\n\tKaboomPlugin,\n\tEmptyComp,\n\tLevelComp,\n\tEdge,\n\tTileComp,\n\tTileCompOpt,\n\tLevelOpt,\n\tRecording,\n\tBoomOpt,\n\tPeditFile,\n\tShape,\n\tDoubleJumpComp,\n\tTimerController,\n\tTweenController,\n\tLoadFontOpt,\n\tAgentComp,\n\tAgentCompOpt,\n\tPathFindOpt,\n\tGetOpt,\n\tVec2Args,\n\tNineSlice,\n\tLerpValue,\n\tTexFilter,\n\tMaskComp,\n\tMask,\n\tOutline,\n} from \"./types\"\n\nimport Timer from \"./timer\"\n\nimport beanSpriteSrc from \"./assets/bean.png\"\nimport burpSoundSrc from \"./assets/burp.mp3\"\nimport kaSpriteSrc from \"./assets/ka.png\"\nimport boomSpriteSrc from \"./assets/boom.png\"\n\ntype EventList<M> = {\n\t[event in keyof M]?: (event: M[event]) => void\n}\n\ninterface SpriteCurAnim {\n\tname: string,\n\ttimer: number,\n\tloop: boolean,\n\tspeed: number,\n\tpingpong: boolean,\n\tonEnd: () => void,\n}\n\n// some default charsets for loading bitmap fonts\nconst ASCII_CHARS = \" !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"\n\nconst DEF_ANCHOR = \"topleft\"\nconst BG_GRID_SIZE = 64\n\nconst DEF_FONT = \"monospace\"\nconst DBG_FONT = \"monospace\"\nconst DEF_TEXT_SIZE = 36\nconst DEF_TEXT_CACHE_SIZE = 64\nconst MAX_TEXT_CACHE_SIZE = 256\nconst FONT_ATLAS_WIDTH = 2048\nconst FONT_ATLAS_HEIGHT = 2048\nconst SPRITE_ATLAS_WIDTH = 2048\nconst SPRITE_ATLAS_HEIGHT = 2048\n// 0.1 pixel padding to texture coordinates to prevent artifact\nconst UV_PAD = 0.1\nconst DEF_HASH_GRID_SIZE = 64\nconst DEF_FONT_FILTER = \"nearest\"\n\nconst LOG_MAX = 8\nconst LOG_TIME = 4\n\nconst VERTEX_FORMAT = [\n\t{ name: \"a_pos\", size: 2 },\n\t{ name: \"a_uv\", size: 2 },\n\t{ name: \"a_color\", size: 4 },\n]\n\nconst STRIDE = VERTEX_FORMAT.reduce((sum, f) => sum + f.size, 0)\n\nconst MAX_BATCHED_QUAD = 2048\nconst MAX_BATCHED_VERTS = MAX_BATCHED_QUAD * 4 * STRIDE\nconst MAX_BATCHED_INDICES = MAX_BATCHED_QUAD * 6\n\n// vertex shader template, replace {{user}} with user vertex shader code\nconst VERT_TEMPLATE = `\nattribute vec2 a_pos;\nattribute vec2 a_uv;\nattribute vec4 a_color;\n\nvarying vec2 v_pos;\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\nvec4 def_vert() {\n\treturn vec4(a_pos, 0.0, 1.0);\n}\n\n{{user}}\n\nvoid main() {\n\tvec4 pos = vert(a_pos, a_uv, a_color);\n\tv_pos = a_pos;\n\tv_uv = a_uv;\n\tv_color = a_color;\n\tgl_Position = pos;\n}\n`\n\n// fragment shader template, replace {{user}} with user fragment shader code\nconst FRAG_TEMPLATE = `\nprecision mediump float;\n\nvarying vec2 v_pos;\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\nuniform sampler2D u_tex;\n\nvec4 def_frag() {\n\treturn v_color * texture2D(u_tex, v_uv);\n}\n\n{{user}}\n\nvoid main() {\n\tgl_FragColor = frag(v_pos, v_uv, v_color, u_tex);\n\tif (gl_FragColor.a == 0.0) {\n\t\tdiscard;\n\t}\n}\n`\n\n// default {{user}} vertex shader code\nconst DEF_VERT = `\nvec4 vert(vec2 pos, vec2 uv, vec4 color) {\n\treturn def_vert();\n}\n`\n\n// default {{user}} fragment shader code\nconst DEF_FRAG = `\nvec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) {\n\treturn def_frag();\n}\n`\n\nconst COMP_DESC = new Set([\n\t\"id\",\n\t\"require\",\n])\n\nconst COMP_EVENTS = new Set([\n\t\"add\",\n\t\"update\",\n\t\"draw\",\n\t\"destroy\",\n\t\"inspect\",\n\t\"drawInspect\",\n])\n\n// convert anchor string to a vec2 offset\nfunction anchorPt(orig: Anchor | Vec2): Vec2 {\n\tswitch (orig) {\n\t\tcase \"topleft\": return new Vec2(-1, -1)\n\t\tcase \"top\": return new Vec2(0, -1)\n\t\tcase \"topright\": return new Vec2(1, -1)\n\t\tcase \"left\": return new Vec2(-1, 0)\n\t\tcase \"center\": return new Vec2(0, 0)\n\t\tcase \"right\": return new Vec2(1, 0)\n\t\tcase \"botleft\": return new Vec2(-1, 1)\n\t\tcase \"bot\": return new Vec2(0, 1)\n\t\tcase \"botright\": return new Vec2(1, 1)\n\t\tdefault: return orig\n\t}\n}\n\nfunction alignPt(align: TextAlign): number {\n\tswitch (align) {\n\t\tcase \"left\": return 0\n\t\tcase \"center\": return 0.5\n\t\tcase \"right\": return 1\n\t\tdefault: return 0\n\t}\n}\n\nfunction createEmptyAudioBuffer(ctx: AudioContext) {\n\treturn ctx.createBuffer(1, 1, 44100)\n}\n\n// only exports one kaboom() which contains all the state\nexport default (gopt: KaboomOpt = {}): KaboomCtx => {\n\n\tconst root = gopt.root ?? document.body\n\n\t// if root is not defined (which falls back to <body>) we assume user is using kaboom on a clean page, and modify <body> to better fit a full screen canvas\n\tif (root === document.body) {\n\t\tdocument.body.style[\"width\"] = \"100%\"\n\t\tdocument.body.style[\"height\"] = \"100%\"\n\t\tdocument.body.style[\"margin\"] = \"0px\"\n\t\tdocument.documentElement.style[\"width\"] = \"100%\"\n\t\tdocument.documentElement.style[\"height\"] = \"100%\"\n\t}\n\n\t// create a <canvas> if user didn't provide one\n\tconst canvas = gopt.canvas ?? (() => {\n\t\tconst canvas = document.createElement(\"canvas\")\n\t\troot.appendChild(canvas)\n\t\treturn canvas\n\t})()\n\n\t// global pixel scale\n\tconst gscale = gopt.scale ?? 1\n\tconst fixedSize = gopt.width && gopt.height && !gopt.stretch && !gopt.letterbox\n\n\t// adjust canvas size according to user size / viewport settings\n\tif (fixedSize) {\n\t\tcanvas.width = gopt.width * gscale\n\t\tcanvas.height = gopt.height * gscale\n\t} else {\n\t\tcanvas.width = canvas.parentElement.offsetWidth\n\t\tcanvas.height = canvas.parentElement.offsetHeight\n\t}\n\n\tconst cw = canvas.width\n\tconst ch = canvas.height\n\tconst pixelDensity = gopt.pixelDensity || window.devicePixelRatio\n\n\tcanvas.width *= pixelDensity\n\tcanvas.height *= pixelDensity\n\n\t// canvas css styles\n\tconst styles = [\n\t\t\"outline: none\",\n\t\t\"cursor: default\",\n\t]\n\n\tif (fixedSize) {\n\t\tstyles.push(`width: ${cw}px`)\n\t\tstyles.push(`height: ${ch}px`)\n\t} else {\n\t\tstyles.push(\"width: 100%\")\n\t\tstyles.push(\"height: 100%\")\n\t}\n\n\tif (gopt.crisp) {\n\t\t// chrome only supports pixelated and firefox only supports crisp-edges\n\t\tstyles.push(\"image-rendering: pixelated\")\n\t\tstyles.push(\"image-rendering: crisp-edges\")\n\t}\n\n\tcanvas.style.cssText = styles.join(\";\")\n\t// make canvas focusable\n\tcanvas.tabIndex = 0\n\n\tconst fontCacheCanvas = document.createElement(\"canvas\")\n\tfontCacheCanvas.width = MAX_TEXT_CACHE_SIZE\n\tfontCacheCanvas.height = MAX_TEXT_CACHE_SIZE\n\tconst fontCacheCtx = fontCacheCanvas.getContext(\"2d\", {\n\t\twillReadFrequently: true,\n\t})\n\n\tconst app = initApp({\n\t\tcanvas: canvas,\n\t\ttouchToMouse: gopt.touchToMouse,\n\t\tgamepads: gopt.gamepads,\n\t\tpixelDensity: gopt.pixelDensity,\n\t\tmaxFPS: gopt.maxFPS,\n\t})\n\n\tconst gc: Array<() => void> = []\n\n\tconst gl = app.canvas()\n\t\t.getContext(\"webgl\", {\n\t\t\tantialias: true,\n\t\t\tdepth: true,\n\t\t\tstencil: true,\n\t\t\talpha: true,\n\t\t\tpreserveDrawingBuffer: true,\n\t\t})\n\n\tclass Texture {\n\n\t\tsrc: null | ImageSource = null\n\t\tglTex: WebGLTexture\n\t\twidth: number\n\t\theight: number\n\n\t\tconstructor(w: number, h: number, opt: TextureOpt = {}) {\n\n\t\t\tthis.glTex = gl.createTexture()\n\t\t\tgc.push(() => this.free())\n\t\t\tthis.bind()\n\n\t\t\tif (w && h) {\n\t\t\t\tgl.texImage2D(\n\t\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t\t0, gl.RGBA,\n\t\t\t\t\tw,\n\t\t\t\t\th,\n\t\t\t\t\t0,\n\t\t\t\t\tgl.RGBA,\n\t\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\t\tnull,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tthis.width = w\n\t\t\tthis.height = h\n\n\t\t\tconst filter = (() => {\n\t\t\t\tswitch (opt.filter ?? gopt.texFilter) {\n\t\t\t\t\tcase \"linear\": return gl.LINEAR\n\t\t\t\t\tcase \"nearest\": return gl.NEAREST\n\t\t\t\t\tdefault: return gl.NEAREST\n\t\t\t\t}\n\t\t\t})()\n\n\t\t\tconst wrap = (() => {\n\t\t\t\tswitch (opt.wrap) {\n\t\t\t\t\tcase \"repeat\": return gl.REPEAT\n\t\t\t\t\tcase \"clampToEdge\": return gl.CLAMP_TO_EDGE\n\t\t\t\t\tdefault: return gl.CLAMP_TO_EDGE\n\t\t\t\t}\n\t\t\t})()\n\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap)\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap)\n\t\t\tthis.unbind()\n\n\t\t}\n\n\t\tstatic fromImage(img: ImageSource, opt: TextureOpt = {}): Texture {\n\t\t\tconst tex = new Texture(0, 0, opt)\n\t\t\ttex.bind()\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img)\n\t\t\ttex.width = img.width\n\t\t\ttex.height = img.height\n\t\t\ttex.unbind()\n\t\t\ttex.src = img\n\t\t\treturn tex\n\t\t}\n\n\t\tupdate(img: ImageSource, x = 0, y = 0) {\n\t\t\tthis.bind()\n\t\t\tgl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, img)\n\t\t\tthis.unbind()\n\t\t}\n\n\t\tbind() {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, this.glTex)\n\t\t}\n\n\t\tunbind() {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, null)\n\t\t}\n\n\t\tfree() {\n\t\t\tgl.deleteTexture(this.glTex)\n\t\t}\n\n\t}\n\n\tclass KaboomError extends Error {\n\t\tconstructor(msg) {\n\t\t\tsuper(msg)\n\t\t\tthis.name = \"KaboomError\"\n\t\t}\n\t}\n\n\tclass TexPacker {\n\t\tprivate tex: Texture\n\t\tprivate canvas: HTMLCanvasElement\n\t\tprivate ctx: CanvasRenderingContext2D\n\t\tprivate x: number = 0\n\t\tprivate y: number = 0\n\t\tprivate curHeight: number = 0\n\t\tconstructor(w: number, h: number) {\n\t\t\tthis.canvas = document.createElement(\"canvas\")\n\t\t\tthis.canvas.width = w\n\t\t\tthis.canvas.height = h\n\t\t\tthis.tex = Texture.fromImage(this.canvas)\n\t\t\tthis.ctx = this.canvas.getContext(\"2d\")\n\t\t}\n\t\tadd(img: ImageSource): [Texture, Quad] {\n\t\t\tif (img.width > this.canvas.width || img.height > this.canvas.height) {\n\t\t\t\tthrow new KaboomError(`Texture size (${img.width} x ${img.height}) exceeds limit (${this.canvas.width} x ${this.canvas.height})`)\n\t\t\t}\n\t\t\tif (this.x + img.width > this.canvas.width) {\n\t\t\t\tthis.x = 0\n\t\t\t\tthis.y += this.curHeight\n\t\t\t\tthis.curHeight = 0\n\t\t\t}\n\t\t\tif (this.y + img.height > this.canvas.height) {\n\t\t\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\t\t\t\tthis.tex = Texture.fromImage(this.canvas)\n\t\t\t\tthis.x = 0\n\t\t\t\tthis.y = 0\n\t\t\t\tthis.curHeight = 0\n\t\t\t}\n\t\t\tconst pos = new Vec2(this.x, this.y)\n\t\t\tthis.x += img.width\n\t\t\tif (img.height > this.curHeight) {\n\t\t\t\tthis.curHeight = img.height\n\t\t\t}\n\t\t\tif (img instanceof ImageData) {\n\t\t\t\tthis.ctx.putImageData(img, pos.x, pos.y)\n\t\t\t} else {\n\t\t\t\tthis.ctx.drawImage(img, pos.x, pos.y)\n\t\t\t}\n\t\t\tthis.tex.update(this.canvas)\n\t\t\treturn [this.tex, new Quad(\n\t\t\t\tpos.x / this.canvas.width,\n\t\t\t\tpos.y / this.canvas.height,\n\t\t\t\timg.width / this.canvas.width,\n\t\t\t\timg.height / this.canvas.height,\n\t\t\t)]\n\t\t}\n\t}\n\n\tclass FrameBuffer {\n\n\t\ttex: Texture\n\t\tglFrameBuffer: WebGLFramebuffer\n\t\tglRenderBuffer: WebGLRenderbuffer\n\n\t\tconstructor(w: number, h: number, opt: TextureOpt = {}) {\n\t\t\tthis.tex = new Texture(w, h, opt)\n\t\t\tthis.glFrameBuffer = gl.createFramebuffer()\n\t\t\tthis.glRenderBuffer = gl.createRenderbuffer()\n\t\t\tgc.push(() => this.free())\n\t\t\tthis.bind()\n\t\t\tgl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, w, h)\n\t\t\tgl.framebufferTexture2D(\n\t\t\t\tgl.FRAMEBUFFER,\n\t\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\tthis.tex.glTex,\n\t\t\t\t0,\n\t\t\t)\n\t\t\tgl.framebufferRenderbuffer(\n\t\t\t\tgl.FRAMEBUFFER,\n\t\t\t\tgl.DEPTH_STENCIL_ATTACHMENT,\n\t\t\t\tgl.RENDERBUFFER,\n\t\t\t\tthis.glRenderBuffer,\n\t\t\t)\n\t\t\tthis.unbind()\n\t\t}\n\n\t\tget width() {\n\t\t\treturn this.tex.width\n\t\t}\n\n\t\tget height() {\n\t\t\treturn this.tex.height\n\t\t}\n\n\t\tbind() {\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.glFrameBuffer)\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, this.glRenderBuffer)\n\t\t}\n\n\t\tunbind() {\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, null)\n\t\t}\n\n\t\tfree() {\n\t\t\tgl.deleteFramebuffer(this.glFrameBuffer)\n\t\t\tgl.deleteRenderbuffer(this.glRenderBuffer)\n\t\t\tthis.tex.free()\n\t\t}\n\n\t}\n\n\tconst gfx = (() => {\n\n\t\tconst defShader = makeShader(DEF_VERT, DEF_FRAG)\n\n\t\t// a 1x1 white texture to draw raw shapes like rectangles and polygons\n\t\t// we use a texture for those so we can use only 1 pipeline for drawing sprites + shapes\n\t\tconst emptyTex = Texture.fromImage(\n\t\t\tnew ImageData(new Uint8ClampedArray([ 255, 255, 255, 255 ]), 1, 1),\n\t\t)\n\n\t\tconst frameBuffer = (gopt.width && gopt.height)\n\t\t\t? new FrameBuffer(gopt.width * pixelDensity * gscale, gopt.height * pixelDensity * gscale)\n\t\t\t: new FrameBuffer(gl.drawingBufferWidth, gl.drawingBufferHeight)\n\n\t\tlet bgColor: null | Color = null\n\t\tlet bgAlpha = 1\n\n\t\tif (gopt.background) {\n\t\t\tbgColor = Color.fromArray(gopt.background)\n\t\t\tbgAlpha = gopt.background[3] ?? 1\n\t\t\tgl.clearColor(\n\t\t\t\tbgColor.r / 255,\n\t\t\t\tbgColor.g / 255,\n\t\t\t\tbgColor.b / 255,\n\t\t\t\tbgAlpha,\n\t\t\t)\n\t\t}\n\n\t\tgl.enable(gl.BLEND)\n\t\tgl.enable(gl.SCISSOR_TEST)\n\t\tgl.blendFuncSeparate(\n\t\t\tgl.SRC_ALPHA,\n\t\t\tgl.ONE_MINUS_SRC_ALPHA,\n\t\t\tgl.ONE,\n\t\t\tgl.ONE_MINUS_SRC_ALPHA,\n\t\t)\n\n\t\t// we only use one vertex and index buffer that batches all draw calls\n\t\tconst vbuf = gl.createBuffer()\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vbuf)\n\t\tgl.bufferData(gl.ARRAY_BUFFER, MAX_BATCHED_VERTS * 4, gl.DYNAMIC_DRAW)\n\n\t\tVERTEX_FORMAT.reduce((offset, f, i) => {\n\t\t\tgl.vertexAttribPointer(i, f.size, gl.FLOAT, false, STRIDE * 4, offset)\n\t\t\tgl.enableVertexAttribArray(i)\n\t\t\treturn offset + f.size * 4\n\t\t}, 0)\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n\t\tconst ibuf = gl.createBuffer()\n\n\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf)\n\t\tgl.bufferData(gl.ELEMENT_ARRAY_BUFFER, MAX_BATCHED_INDICES * 4, gl.DYNAMIC_DRAW)\n\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)\n\n\t\t// a checkerboard texture used for the default background\n\t\tconst bgTex = Texture.fromImage(\n\t\t\tnew ImageData(new Uint8ClampedArray([\n\t\t\t\t128, 128, 128, 255,\n\t\t\t\t190, 190, 190, 255,\n\t\t\t\t190, 190, 190, 255,\n\t\t\t\t128, 128, 128, 255,\n\t\t\t]), 2, 2), {\n\t\t\t\twrap: \"repeat\",\n\t\t\t\tfilter: \"nearest\",\n\t\t\t},\n\t\t)\n\n\t\treturn {\n\n\t\t\t// keep track of how many draw calls we're doing this frame\n\t\t\tdrawCalls: 0,\n\t\t\t// how many draw calls we're doing last frame, this is the number we give to users\n\t\t\tlastDrawCalls: 0,\n\n\t\t\t// gfx states\n\t\t\tdefShader: defShader,\n\t\t\tcurShader: defShader,\n\t\t\tframeBuffer: frameBuffer,\n\t\t\tpostShader: null,\n\t\t\tpostShaderUniform: null,\n\t\t\tdefTex: emptyTex,\n\t\t\tcurTex: emptyTex,\n\t\t\tcurUniform: {},\n\t\t\tvbuf: vbuf,\n\t\t\tibuf: ibuf,\n\n\t\t\t// local vertex / index buffer queue\n\t\t\tvqueue: [],\n\t\t\tiqueue: [],\n\n\t\t\ttransform: new Mat4(),\n\t\t\ttransformStack: [],\n\n\t\t\tbgTex: bgTex,\n\t\t\tbgColor: bgColor,\n\t\t\tbgAlpha: bgAlpha,\n\n\t\t\twidth: gopt.width ?? gl.drawingBufferWidth / pixelDensity / gscale,\n\t\t\theight: gopt.height ?? gl.drawingBufferHeight / pixelDensity / gscale,\n\n\t\t\tviewport: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: gl.drawingBufferWidth,\n\t\t\t\theight: gl.drawingBufferHeight,\n\t\t\t},\n\n\t\t\tfixed: false,\n\n\t\t}\n\n\t})()\n\n\tclass SpriteData {\n\n\t\ttex: Texture\n\t\tframes: Quad[] = [ new Quad(0, 0, 1, 1) ]\n\t\tanims: SpriteAnims = {}\n\t\tslice9: NineSlice | null = null\n\n\t\tconstructor(\n\t\t\ttex: Texture,\n\t\t\tframes?: Quad[],\n\t\t\tanims: SpriteAnims = {},\n\t\t\tslice9: NineSlice = null,\n\t\t) {\n\t\t\tthis.tex = tex\n\t\t\tif (frames) this.frames = frames\n\t\t\tthis.anims = anims\n\t\t\tthis.slice9 = slice9\n\t\t}\n\n\t\tget width() {\n\t\t\treturn this.tex.width * this.frames[0].w\n\t\t}\n\n\t\tget height() {\n\t\t\treturn this.tex.height * this.frames[0].h\n\t\t}\n\n\t\tstatic from(src: LoadSpriteSrc, opt: LoadSpriteOpt = {}): Promise<SpriteData> {\n\t\t\treturn typeof src === \"string\"\n\t\t\t\t? SpriteData.fromURL(src, opt)\n\t\t\t\t: Promise.resolve(SpriteData.fromImage(src, opt))\n\t\t}\n\n\t\tstatic fromImage(data: ImageSource, opt: LoadSpriteOpt = {}): SpriteData {\n\t\t\tconst [tex, quad] = assets.packer.add(data)\n\t\t\tconst frames = opt.frames ? opt.frames.map((f) => new Quad(\n\t\t\t\tquad.x + f.x * quad.w,\n\t\t\t\tquad.y + f.y * quad.h,\n\t\t\t\tf.w * quad.w,\n\t\t\t\tf.h * quad.h,\n\t\t\t)) : slice(opt.sliceX || 1, opt.sliceY || 1, quad.x, quad.y, quad.w, quad.h)\n\t\t\treturn new SpriteData(tex, frames, opt.anims, opt.slice9)\n\t\t}\n\n\t\tstatic fromURL(url: string, opt: LoadSpriteOpt = {}): Promise<SpriteData> {\n\t\t\treturn loadImg(url).then((img) => SpriteData.fromImage(img, opt))\n\t\t}\n\n\t}\n\n\tclass SoundData {\n\n\t\tbuf: AudioBuffer\n\n\t\tconstructor(buf: AudioBuffer) {\n\t\t\tthis.buf = buf\n\t\t}\n\n\t\tstatic fromArrayBuffer(buf: ArrayBuffer): Promise<SoundData> {\n\t\t\treturn new Promise((resolve, reject) =>\n\t\t\t\taudio.ctx.decodeAudioData(buf, resolve, reject),\n\t\t\t).then((buf: AudioBuffer) => new SoundData(buf))\n\t\t}\n\n\t\tstatic fromURL(url: string): Promise<SoundData> {\n\t\t\tif (isDataURL(url)) {\n\t\t\t\treturn SoundData.fromArrayBuffer(dataURLToArrayBuffer(url))\n\t\t\t} else {\n\t\t\t\treturn fetchArrayBuffer(url).then((buf) => SoundData.fromArrayBuffer(buf))\n\t\t\t}\n\t\t}\n\n\t}\n\n\tconst audio = (() => {\n\n\t\t// TODO: handle when audio context is unavailable\n\t\tconst ctx = new (\n\t\t\twindow.AudioContext || (window as any).webkitAudioContext\n\t\t)() as AudioContext\n\t\tconst masterNode = ctx.createGain()\n\t\tmasterNode.connect(ctx.destination)\n\n\t\t// by default browsers can only load audio async, we don't deal with that and just start with an empty audio buffer\n\t\tconst burpSnd = new SoundData(createEmptyAudioBuffer(ctx))\n\n\t\t// load that burp sound\n\t\tctx.decodeAudioData(burpSoundSrc.buffer.slice(0)).then((buf) => {\n\t\t\tburpSnd.buf = buf\n\t\t}).catch((err) => {\n\t\t\tconsole.error(\"Failed to load burp: \", err)\n\t\t})\n\n\t\treturn {\n\t\t\tctx,\n\t\t\tmasterNode,\n\t\t\tburpSnd,\n\t\t}\n\n\t})()\n\n\tclass Asset<D> {\n\t\tloaded: boolean = false\n\t\tdata: D | null = null\n\t\terror: Error | null = null\n\t\tprivate onLoadEvents: Event<[D]> = new Event()\n\t\tprivate onErrorEvents: Event<[Error]> = new Event()\n\t\tprivate onFinishEvents: Event<[]> = new Event()\n\t\tconstructor(loader: Promise<D>) {\n\t\t\tloader.then((data) => {\n\t\t\t\tthis.data = data\n\t\t\t\tthis.onLoadEvents.trigger(data)\n\t\t\t}).catch((err) => {\n\t\t\t\tthis.error = err\n\t\t\t\tif (this.onErrorEvents.numListeners() > 0) {\n\t\t\t\t\tthis.onErrorEvents.trigger(err)\n\t\t\t\t} else {\n\t\t\t\t\tthrow err\n\t\t\t\t}\n\t\t\t}).finally(() => {\n\t\t\t\tthis.onFinishEvents.trigger()\n\t\t\t\tthis.loaded = true\n\t\t\t})\n\t\t}\n\t\tstatic loaded<D>(data: D): Asset<D> {\n\t\t\tconst asset = new Asset(Promise.resolve(data)) as Asset<D>\n\t\t\tasset.data = data\n\t\t\tasset.loaded = true\n\t\t\treturn asset\n\t\t}\n\t\tonLoad(action: (data: D) => void) {\n\t\t\tif (this.loaded && this.data) {\n\t\t\t\taction(this.data)\n\t\t\t} else {\n\t\t\t\tthis.onLoadEvents.add(action)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\t\tonError(action: (err: Error) => void) {\n\t\t\tif (this.loaded && this.error) {\n\t\t\t\taction(this.error)\n\t\t\t} else {\n\t\t\t\tthis.onErrorEvents.add(action)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\t\tonFinish(action: () => void) {\n\t\t\tif (this.loaded) {\n\t\t\t\taction()\n\t\t\t} else {\n\t\t\t\tthis.onFinishEvents.add(action)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\t\tthen(action: (data: D) => void): Asset<D> {\n\t\t\treturn this.onLoad(action)\n\t\t}\n\t\tcatch(action: (err: Error) => void): Asset<D> {\n\t\t\treturn this.onError(action)\n\t\t}\n\t\tfinally(action: () => void): Asset<D> {\n\t\t\treturn this.onFinish(action)\n\t\t}\n\t}\n\n\tclass AssetBucket<D> {\n\t\tassets: Map<string, Asset<D>> = new Map()\n\t\tlastUID: number = 0\n\t\tadd(name: string | null, loader: Promise<D>): Asset<D> {\n\t\t\t// if user don't provide a name we use a generated one\n\t\t\tconst id = name ?? (this.lastUID++ + \"\")\n\t\t\tconst asset = new Asset(loader)\n\t\t\tthis.assets.set(id, asset)\n\t\t\treturn asset\n\t\t}\n\t\taddLoaded(name: string | null, data: D): Asset<D> {\n\t\t\tconst id = name ?? (this.lastUID++ + \"\")\n\t\t\tconst asset = Asset.loaded(data)\n\t\t\tthis.assets.set(id, asset)\n\t\t\treturn asset\n\t\t}\n\t\tget(handle: string): Asset<D> | void {\n\t\t\treturn this.assets.get(handle)\n\t\t}\n\t\tprogress(): number {\n\t\t\tif (this.assets.size === 0) {\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\tlet loaded = 0\n\t\t\tthis.assets.forEach((asset) => {\n\t\t\t\tif (asset.loaded) {\n\t\t\t\t\tloaded++\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn loaded / this.assets.size\n\t\t}\n\t}\n\n\tconst assets = {\n\t\t// prefix for when loading from a url\n\t\turlPrefix: \"\",\n\t\t// asset holders\n\t\tsprites: new AssetBucket<SpriteData>(),\n\t\tfonts: new AssetBucket<FontData>(),\n\t\tbitmapFonts: new AssetBucket<BitmapFontData>(),\n\t\tsounds: new AssetBucket<SoundData>(),\n\t\tshaders: new AssetBucket<ShaderData>(),\n\t\tcustom: new AssetBucket<any>(),\n\t\tpacker: new TexPacker(SPRITE_ATLAS_WIDTH, SPRITE_ATLAS_HEIGHT),\n\t\t// if we finished initially loading all assets\n\t\tloaded: false,\n\t}\n\n\tconst game = {\n\n\t\t// general events\n\t\tevents: new EventHandler<{\n\t\t\tmouseMove: [],\n\t\t\tmouseDown: [MouseButton],\n\t\t\tmousePress: [MouseButton],\n\t\t\tmouseRelease: [MouseButton],\n\t\t\tcharInput: [string],\n\t\t\tkeyPress: [Key],\n\t\t\tkeyDown: [Key],\n\t\t\tkeyPressRepeat: [Key],\n\t\t\tkeyRelease: [Key],\n\t\t\ttouchStart: [Vec2, Touch],\n\t\t\ttouchMove: [Vec2, Touch],\n\t\t\ttouchEnd: [Vec2, Touch],\n\t\t\tgamepadButtonDown: [string],\n\t\t\tgamepadButtonPress: [string],\n\t\t\tgamepadButtonRelease: [string],\n\t\t\tgamepadStick: [string, Vec2],\n\t\t\tgamepadConnect: [Gamepad],\n\t\t\tgamepadDisconnect: [Gamepad],\n\t\t\tscroll: [Vec2],\n\t\t\tadd: [GameObj],\n\t\t\tdestroy: [GameObj],\n\t\t\tload: [],\n\t\t\tloading: [number],\n\t\t\terror: [Error],\n\t\t\tinput: [],\n\t\t\tframeEnd: [],\n\t\t\tresize: [],\n\t\t\tsceneLeave: [string],\n\t\t}>(),\n\n\t\t// object events\n\t\tobjEvents: new EventHandler(),\n\n\t\t// root game object\n\t\troot: make([]),\n\n\t\t// misc\n\t\tgravity: 0,\n\t\tscenes: {},\n\n\t\t// on screen log\n\t\tlogs: [],\n\n\t\t// camera\n\t\tcam: {\n\t\t\tpos: null,\n\t\t\tscale: new Vec2(1),\n\t\t\tangle: 0,\n\t\t\tshake: 0,\n\t\t\ttransform: new Mat4(),\n\t\t},\n\n\t}\n\n\t// TODO: accept Asset<T>?\n\t// wrap individual loaders with global loader counter, for stuff like progress bar\n\tfunction load<T>(prom: Promise<T>): Asset<T> {\n\t\treturn assets.custom.add(null, prom)\n\t}\n\n\t// get current load progress\n\tfunction loadProgress(): number {\n\t\tconst buckets = [\n\t\t\tassets.sprites,\n\t\t\tassets.sounds,\n\t\t\tassets.shaders,\n\t\t\tassets.fonts,\n\t\t\tassets.bitmapFonts,\n\t\t\tassets.custom,\n\t\t]\n\t\treturn buckets.reduce((n, bucket) => n + bucket.progress(), 0) / buckets.length\n\t}\n\n\t// global load path prefix\n\tfunction loadRoot(path?: string): string {\n\t\tif (path !== undefined) {\n\t\t\tassets.urlPrefix = path\n\t\t}\n\t\treturn assets.urlPrefix\n\t}\n\n\t// wrapper around fetch() that applies urlPrefix and basic error handling\n\tfunction fetchURL(path: string) {\n\t\tconst url = assets.urlPrefix + path\n\t\treturn fetch(url)\n\t\t\t.then((res) => {\n\t\t\t\tif (!res.ok) throw new KaboomError(`Failed to fetch \"${url}\"`)\n\t\t\t\treturn res\n\t\t\t})\n\t}\n\n\tfunction fetchJSON(path: string) {\n\t\treturn fetchURL(path).then((res) => res.json())\n\t}\n\n\tfunction fetchText(path: string) {\n\t\treturn fetchURL(path).then((res) => res.text())\n\t}\n\n\tfunction fetchArrayBuffer(path: string) {\n\t\treturn fetchURL(path).then((res) => res.arrayBuffer())\n\t}\n\n\t// wrapper around image loader to get a Promise\n\tfunction loadImg(src: string): Promise<HTMLImageElement> {\n\t\tconst img = new Image()\n\t\timg.crossOrigin = \"anonymous\"\n\t\timg.src = isDataURL(src) ? src : assets.urlPrefix + src\n\t\treturn new Promise<HTMLImageElement>((resolve, reject) => {\n\t\t\timg.onload = () => resolve(img)\n\t\t\timg.onerror = () => reject(new KaboomError(`Failed to load image from \"${src}\"`))\n\t\t})\n\t}\n\n\tfunction loadJSON(name, url) {\n\t\treturn assets.custom.add(name, fetchJSON(url))\n\t}\n\n\tclass FontData {\n\t\tfontface: FontFace\n\t\tfilter: TexFilter = DEF_FONT_FILTER\n\t\toutline: Outline | null = null\n\t\tconstructor(face: FontFace, opt: LoadFontOpt = {}) {\n\t\t\tthis.fontface = face\n\t\t\tthis.filter = opt.filter ?? DEF_FONT_FILTER\n\t\t\tif (opt.outline) {\n\t\t\t\tthis.outline = {\n\t\t\t\t\twidth: 1,\n\t\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\t}\n\t\t\t\tif (typeof opt.outline === \"number\") {\n\t\t\t\t\tthis.outline.width = opt.outline\n\t\t\t\t} else if (typeof opt.outline === \"object\") {\n\t\t\t\t\tif (opt.outline.width) this.outline.width = opt.outline.width\n\t\t\t\t\tif (opt.outline.color) this.outline.color = opt.outline.color\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: pass in null src to store opt for default fonts like \"monospace\"\n\tfunction loadFont(\n\t\tname: string,\n\t\tsrc: string | BinaryData,\n\t\topt: LoadFontOpt = {},\n\t): Asset<FontData> {\n\t\tconst font = new FontFace(name, typeof src === \"string\" ? `url(${src})` : src)\n\t\tdocument.fonts.add(font)\n\t\treturn assets.fonts.add(name, font.load().catch((err) => {\n\t\t\tthrow new KaboomError(`Failed to load font from \"${src}\": ${err}`)\n\t\t}).then((face) => new FontData(face, opt)))\n\t}\n\n\t// TODO: support outline\n\t// TODO: support LoadSpriteSrc\n\tfunction loadBitmapFont(\n\t\tname: string | null,\n\t\tsrc: string,\n\t\tgw: number,\n\t\tgh: number,\n\t\topt: LoadBitmapFontOpt = {},\n\t): Asset<BitmapFontData> {\n\t\treturn assets.bitmapFonts.add(name, loadImg(src)\n\t\t\t.then((img) => {\n\t\t\t\treturn makeFont(\n\t\t\t\t\tTexture.fromImage(img, opt),\n\t\t\t\t\tgw,\n\t\t\t\t\tgh,\n\t\t\t\t\topt.chars ?? ASCII_CHARS,\n\t\t\t\t)\n\t\t\t}),\n\t\t)\n\t}\n\n\t// get an array of frames based on configuration on how to slice the image\n\tfunction slice(x = 1, y = 1, dx = 0, dy = 0, w = 1, h = 1): Quad[] {\n\t\tconst frames = []\n\t\tconst qw = w / x\n\t\tconst qh = h / y\n\t\tfor (let j = 0; j < y; j++) {\n\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\tframes.push(new Quad(\n\t\t\t\t\tdx + i * qw,\n\t\t\t\t\tdy + j * qh,\n\t\t\t\t\tqw,\n\t\t\t\t\tqh,\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t\treturn frames\n\t}\n\n\t// TODO: load synchronously if passed ImageSource\n\tfunction loadSpriteAtlas(\n\t\tsrc: LoadSpriteSrc,\n\t\tdata: SpriteAtlasData | string,\n\t): Asset<Record<string, SpriteData>> {\n\t\tif (typeof data === \"string\") {\n\t\t\treturn load(new Promise((res, rej) => {\n\t\t\t\tfetchJSON(data).then((json) => {\n\t\t\t\t\tloadSpriteAtlas(src, json).then(res).catch(rej)\n\t\t\t\t})\n\t\t\t}))\n\t\t}\n\t\treturn load(SpriteData.from(src).then((atlas) => {\n\t\t\tconst map = {}\n\t\t\tfor (const name in data) {\n\t\t\t\tconst info = data[name]\n\t\t\t\tconst quad = atlas.frames[0]\n\t\t\t\tconst w = SPRITE_ATLAS_WIDTH * quad.w\n\t\t\t\tconst h = SPRITE_ATLAS_HEIGHT * quad.h\n\t\t\t\tconst frames = info.frames ? info.frames.map((f) => new Quad(\n\t\t\t\t\tquad.x + (info.x + f.x) / w * quad.w,\n\t\t\t\t\tquad.y + (info.y + f.y) / h * quad.h,\n\t\t\t\t\tf.w / w * quad.w,\n\t\t\t\t\tf.h / h * quad.h,\n\t\t\t\t)) : slice(\n\t\t\t\t\tinfo.sliceX || 1,\n\t\t\t\t\tinfo.sliceY || 1,\n\t\t\t\t\tquad.x + info.x / w * quad.w,\n\t\t\t\t\tquad.y + info.y / h * quad.h,\n\t\t\t\t\tinfo.width / w * quad.w,\n\t\t\t\t\tinfo.height / h * quad.h,\n\t\t\t\t)\n\t\t\t\tconst spr = new SpriteData(atlas.tex, frames, info.anims)\n\t\t\t\tassets.sprites.addLoaded(name, spr)\n\t\t\t\tmap[name] = spr\n\t\t\t}\n\t\t\treturn map\n\t\t}))\n\t}\n\n\tfunction createSpriteSheet(\n\t\timages: ImageSource[],\n\t\topt: LoadSpriteOpt = {},\n\t): SpriteData {\n\t\tconst canvas = document.createElement(\"canvas\")\n\t\tconst width = images[0].width\n\t\tconst height = images[0].height\n\t\tcanvas.width = width * images.length\n\t\tcanvas.height = height\n\t\tconst ctx = canvas.getContext(\"2d\")\n\t\timages.forEach((img, i) => {\n\t\t\tif (img instanceof ImageData) {\n\t\t\t\tctx.putImageData(img, i * width, 0)\n\t\t\t} else {\n\t\t\t\tctx.drawImage(img, i * width, 0)\n\t\t\t}\n\t\t})\n\t\tconst merged = ctx.getImageData(0, 0, images.length * width, height)\n\t\treturn SpriteData.fromImage(merged, {\n\t\t\t...opt,\n\t\t\tsliceX: images.length,\n\t\t\tsliceY: 1,\n\t\t})\n\t}\n\n\t// load a sprite to asset manager\n\tfunction loadSprite(\n\t\tname: string | null,\n\t\tsrc: LoadSpriteSrc | LoadSpriteSrc[],\n\t\topt: LoadSpriteOpt = {\n\t\t\tsliceX: 1,\n\t\t\tsliceY: 1,\n\t\t\tanims: {},\n\t\t},\n\t): Asset<SpriteData> {\n\t\tif (Array.isArray(src)) {\n\t\t\tif (src.some((s) => typeof s === \"string\")) {\n\t\t\t\treturn assets.sprites.add(\n\t\t\t\t\tname,\n\t\t\t\t\tPromise.all(src.map((s) => {\n\t\t\t\t\t\treturn typeof s === \"string\" ? loadImg(s) : Promise.resolve(s)\n\t\t\t\t\t})).then((images) => createSpriteSheet(images, opt)),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treturn assets.sprites.addLoaded(name, createSpriteSheet(src as ImageSource[], opt))\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof src === \"string\") {\n\t\t\t\treturn assets.sprites.add(name, SpriteData.from(src, opt))\n\t\t\t} else {\n\t\t\t\treturn assets.sprites.addLoaded(name, SpriteData.fromImage(src, opt))\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadPedit(name: string | null, src: string | PeditFile): Asset<SpriteData> {\n\n\t\t// eslint-disable-next-line\n\t\treturn assets.sprites.add(name, new Promise(async (resolve) => {\n\n\t\t\tconst data = typeof src === \"string\" ? await fetchJSON(src) : src\n\t\t\tconst images = await Promise.all(data.frames.map(loadImg))\n\t\t\tconst canvas = document.createElement(\"canvas\")\n\t\t\tcanvas.width = data.width\n\t\t\tcanvas.height = data.height * data.frames.length\n\n\t\t\tconst ctx = canvas.getContext(\"2d\")\n\n\t\t\timages.forEach((img: HTMLImageElement, i) => {\n\t\t\t\tctx.drawImage(img, 0, i * data.height)\n\t\t\t})\n\n\t\t\tconst spr = await loadSprite(null, canvas, {\n\t\t\t\tsliceY: data.frames.length,\n\t\t\t\tanims: data.anims,\n\t\t\t})\n\n\t\t\tresolve(spr)\n\n\t\t}))\n\n\t}\n\n\tfunction loadAseprite(\n\t\tname: string | null,\n\t\timgSrc: LoadSpriteSrc,\n\t\tjsonSrc: string,\n\t): Asset<SpriteData> {\n\t\tif (typeof imgSrc === \"string\" && !jsonSrc) {\n\t\t\tjsonSrc = imgSrc.replace(new RegExp(`${getExt(imgSrc)}$`), \"json\")\n\t\t}\n\t\tconst resolveJSON = typeof jsonSrc === \"string\"\n\t\t\t? fetchJSON(jsonSrc)\n\t\t\t: Promise.resolve(jsonSrc)\n\t\treturn assets.sprites.add(name, resolveJSON.then((data) => {\n\t\t\tconst size = data.meta.size\n\t\t\tconst frames = data.frames.map((f: any) => {\n\t\t\t\treturn new Quad(\n\t\t\t\t\tf.frame.x / size.w,\n\t\t\t\t\tf.frame.y / size.h,\n\t\t\t\t\tf.frame.w / size.w,\n\t\t\t\t\tf.frame.h / size.h,\n\t\t\t\t)\n\t\t\t})\n\t\t\tconst anims = {}\n\t\t\tfor (const anim of data.meta.frameTags) {\n\t\t\t\tif (anim.from === anim.to) {\n\t\t\t\t\tanims[anim.name] = anim.from\n\t\t\t\t} else {\n\t\t\t\t\tanims[anim.name] = {\n\t\t\t\t\t\tfrom: anim.from,\n\t\t\t\t\t\tto: anim.to,\n\t\t\t\t\t\tspeed: 10,\n\t\t\t\t\t\tloop: true,\n\t\t\t\t\t\tpingpong: anim.direction === \"pingpong\",\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn SpriteData.from(imgSrc, {\n\t\t\t\tframes: frames,\n\t\t\t\tanims: anims,\n\t\t\t})\n\t\t}))\n\t}\n\n\tfunction loadShader(\n\t\tname: string | null,\n\t\tvert?: string,\n\t\tfrag?: string,\n\t) {\n\t\treturn assets.shaders.addLoaded(name, makeShader(vert, frag))\n\t}\n\n\tfunction loadShaderURL(\n\t\tname: string | null,\n\t\tvert?: string,\n\t\tfrag?: string,\n\t): Asset<ShaderData> {\n\t\tconst resolveUrl = (url?: string) =>\n\t\t\turl\n\t\t\t\t? fetchText(url)\n\t\t\t\t: Promise.resolve(null)\n\t\tconst load = Promise.all([resolveUrl(vert), resolveUrl(frag)])\n\t\t\t.then(([vcode, fcode]: [string | null, string | null]) => {\n\t\t\t\treturn makeShader(vcode, fcode)\n\t\t\t})\n\t\treturn assets.shaders.add(name, load)\n\t}\n\n\t// TODO: allow stream big audio\n\t// load a sound to asset manager\n\tfunction loadSound(\n\t\tname: string | null,\n\t\tsrc: string | ArrayBuffer,\n\t): Asset<SoundData> {\n\t\treturn assets.sounds.add(\n\t\t\tname,\n\t\t\ttypeof src === \"string\"\n\t\t\t\t? SoundData.fromURL(src)\n\t\t\t\t: SoundData.fromArrayBuffer(src),\n\t\t)\n\t}\n\n\tfunction loadBean(name: string = \"bean\"): Asset<SpriteData> {\n\t\treturn loadSprite(name, beanSpriteSrc)\n\t}\n\n\tfunction getSprite(handle: string): Asset<SpriteData> | void {\n\t\treturn assets.sprites.get(handle)\n\t}\n\n\tfunction getSound(handle: string): Asset<SoundData> | void {\n\t\treturn assets.sounds.get(handle)\n\t}\n\n\tfunction getFont(handle: string): Asset<FontData> | void {\n\t\treturn assets.fonts.get(handle)\n\t}\n\n\tfunction getBitmapFont(handle: string): Asset<BitmapFontData> | void {\n\t\treturn assets.bitmapFonts.get(handle)\n\t}\n\n\tfunction getShader(handle: string): Asset<ShaderData> | void {\n\t\treturn assets.shaders.get(handle)\n\t}\n\n\tfunction getAsset(handle: string): Asset<any> | void {\n\t\treturn assets.custom.get(handle)\n\t}\n\n\tfunction resolveSprite(\n\t\tsrc: DrawSpriteOpt[\"sprite\"],\n\t): Asset<SpriteData> | null {\n\t\tif (typeof src === \"string\") {\n\t\t\tconst spr = getSprite(src)\n\t\t\tif (spr) {\n\t\t\t\t// if it's already loaded or being loading, return it\n\t\t\t\treturn spr\n\t\t\t} else if (loadProgress() < 1) {\n\t\t\t\t// if there's any other ongoing loading task we return empty and don't error yet\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\t// if all other assets are loaded and we still haven't found this sprite, throw\n\t\t\t\tthrow new KaboomError(`Sprite not found: ${src}`)\n\t\t\t}\n\t\t} else if (src instanceof SpriteData) {\n\t\t\treturn Asset.loaded(src)\n\t\t} else if (src instanceof Asset) {\n\t\t\treturn src\n\t\t} else {\n\t\t\tthrow new KaboomError(`Invalid sprite: ${src}`)\n\t\t}\n\t}\n\n\tfunction resolveSound(\n\t\tsrc: Parameters<typeof play>[0],\n\t): Asset<SoundData> | null {\n\t\tif (typeof src === \"string\") {\n\t\t\tconst snd = getSound(src)\n\t\t\tif (snd) {\n\t\t\t\treturn snd\n\t\t\t} else if (loadProgress() < 1) {\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\tthrow new KaboomError(`Sound not found: ${src}`)\n\t\t\t}\n\t\t} else if (src instanceof SoundData) {\n\t\t\treturn Asset.loaded(src)\n\t\t} else if (src instanceof Asset) {\n\t\t\treturn src\n\t\t} else {\n\t\t\tthrow new KaboomError(`Invalid sound: ${src}`)\n\t\t}\n\t}\n\n\tfunction resolveShader(\n\t\tsrc: RenderProps[\"shader\"],\n\t): ShaderData | Asset<ShaderData> | null {\n\t\tif (!src) {\n\t\t\treturn gfx.defShader\n\t\t}\n\t\tif (typeof src === \"string\") {\n\t\t\tconst shader = getShader(src)\n\t\t\tif (shader) {\n\t\t\t\treturn shader.data ?? shader\n\t\t\t} else if (loadProgress() < 1) {\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\tthrow new KaboomError(`Shader not found: ${src}`)\n\t\t\t}\n\t\t} else if (src instanceof Asset) {\n\t\t\treturn src.data ? src.data : src\n\t\t}\n\t\t// TODO: check type\n\t\t// @ts-ignore\n\t\treturn src\n\t}\n\n\tfunction resolveFont(\n\t\tsrc: DrawTextOpt[\"font\"],\n\t):\n\t\t| FontData\n\t\t| Asset<FontData>\n\t\t| BitmapFontData\n\t\t| Asset<BitmapFontData>\n\t\t| string\n\t\t| void\n\t{\n\t\tif (!src) {\n\t\t\treturn resolveFont(gopt.font ?? DEF_FONT)\n\t\t}\n\t\tif (typeof src === \"string\") {\n\t\t\tconst bfont = getBitmapFont(src)\n\t\t\tconst font = getFont(src)\n\t\t\tif (bfont) {\n\t\t\t\treturn bfont.data ?? bfont\n\t\t\t} else if (font) {\n\t\t\t\treturn font.data ?? font\n\t\t\t} else if (document.fonts.check(`${DEF_TEXT_CACHE_SIZE}px ${src}`)) {\n\t\t\t\treturn src\n\t\t\t} else if (loadProgress() < 1) {\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\tthrow new KaboomError(`Font not found: ${src}`)\n\t\t\t}\n\t\t} else if (src instanceof Asset) {\n\t\t\treturn src.data ? src.data : src\n\t\t}\n\t\t// TODO: check type\n\t\t// @ts-ignore\n\t\treturn src\n\t}\n\n\t// get / set master volume\n\tfunction volume(v?: number): number {\n\t\tif (v !== undefined) {\n\t\t\taudio.masterNode.gain.value = v\n\t\t}\n\t\treturn audio.masterNode.gain.value\n\t}\n\n\t// TODO: method to completely destory audio?\n\t// TODO: time() not correct when looped over or ended\n\t// TODO: onEnd() not working\n\t// plays a sound, returns a control handle\n\tfunction play(\n\t\tsrc: string | SoundData | Asset<SoundData>,\n\t\topt: AudioPlayOpt = {},\n\t): AudioPlay {\n\n\t\tconst ctx = audio.ctx\n\t\tlet paused = opt.paused ?? false\n\t\tlet srcNode = ctx.createBufferSource()\n\t\tconst onEndEvents = new Event()\n\t\tconst gainNode = ctx.createGain()\n\t\tconst pos = opt.seek ?? 0\n\t\tlet startTime = 0\n\t\tlet stopTime = 0\n\t\tlet started = false\n\n\t\tsrcNode.loop = Boolean(opt.loop)\n\t\tsrcNode.detune.value = opt.detune ?? 0\n\t\tsrcNode.playbackRate.value = opt.speed ?? 1\n\t\tsrcNode.connect(gainNode)\n\t\tsrcNode.onended = () => {\n\t\t\tif (getTime() >= srcNode.buffer?.duration ?? Number.POSITIVE_INFINITY) {\n\t\t\t\tonEndEvents.trigger()\n\t\t\t}\n\t\t}\n\t\tgainNode.connect(audio.masterNode)\n\t\tgainNode.gain.value = opt.volume ?? 1\n\n\t\tconst start = (data: SoundData) => {\n\t\t\tsrcNode.buffer = data.buf\n\t\t\tif (!paused) {\n\t\t\t\tstartTime = ctx.currentTime\n\t\t\t\tsrcNode.start(0, pos)\n\t\t\t\tstarted = true\n\t\t\t}\n\t\t}\n\n\t\tconst snd = resolveSound(src)\n\n\t\tif (snd instanceof Asset) {\n\t\t\tsnd.onLoad(start)\n\t\t}\n\n\t\tconst getTime = () => {\n\t\t\tif (!srcNode.buffer) return 0\n\t\t\tconst t = paused\n\t\t\t\t? stopTime - startTime\n\t\t\t\t: ctx.currentTime - startTime\n\t\t\tconst d = srcNode.buffer.duration\n\t\t\treturn srcNode.loop ? t % d : Math.min(t, d)\n\t\t}\n\n\t\tconst cloneNode = (oldNode: AudioBufferSourceNode) => {\n\t\t\tconst newNode = ctx.createBufferSource()\n\t\t\tnewNode.buffer = oldNode.buffer\n\t\t\tnewNode.loop = oldNode.loop\n\t\t\tnewNode.playbackRate.value = oldNode.playbackRate.value\n\t\t\tnewNode.detune.value = oldNode.detune.value\n\t\t\tnewNode.onended = oldNode.onended\n\t\t\tnewNode.connect(gainNode)\n\t\t\treturn newNode\n\t\t}\n\n\t\treturn {\n\n\t\t\tstop() {\n\t\t\t\tthis.paused = true\n\t\t\t\tthis.seek(0)\n\t\t\t},\n\n\t\t\tset paused(p: boolean) {\n\t\t\t\tif (paused === p) return\n\t\t\t\tpaused = p\n\t\t\t\tif (p) {\n\t\t\t\t\tif (started) {\n\t\t\t\t\t\tsrcNode.stop()\n\t\t\t\t\t\tstarted = false\n\t\t\t\t\t}\n\t\t\t\t\tstopTime = ctx.currentTime\n\t\t\t\t} else {\n\t\t\t\t\tsrcNode = cloneNode(srcNode)\n\t\t\t\t\tconst pos = stopTime - startTime\n\t\t\t\t\tsrcNode.start(0, pos)\n\t\t\t\t\tstarted = true\n\t\t\t\t\tstartTime = ctx.currentTime - pos\n\t\t\t\t\tstopTime = 0\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tget paused() {\n\t\t\t\treturn paused\n\t\t\t},\n\n\t\t\tplay(time: number = 0) {\n\t\t\t\tthis.seek(time)\n\t\t\t\tthis.paused = false\n\t\t\t},\n\n\t\t\tseek(time: number) {\n\t\t\t\tif (!srcNode.buffer?.duration) return\n\t\t\t\tif (time > srcNode.buffer.duration) return\n\t\t\t\tif (paused) {\n\t\t\t\t\tsrcNode = cloneNode(srcNode)\n\t\t\t\t\tstartTime = stopTime - time\n\t\t\t\t} else {\n\t\t\t\t\tsrcNode.stop()\n\t\t\t\t\tsrcNode = cloneNode(srcNode)\n\t\t\t\t\tstartTime = ctx.currentTime - time\n\t\t\t\t\tsrcNode.start(0, time)\n\t\t\t\t\tstarted = true\n\t\t\t\t\tstopTime = 0\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// TODO: affect time()\n\t\t\tset speed(val: number) {\n\t\t\t\tsrcNode.playbackRate.value = val\n\t\t\t},\n\n\t\t\tget speed() {\n\t\t\t\treturn srcNode.playbackRate.value\n\t\t\t},\n\n\t\t\tset detune(val: number) {\n\t\t\t\tsrcNode.detune.value = val\n\t\t\t},\n\n\t\t\tget detune() {\n\t\t\t\treturn srcNode.detune.value\n\t\t\t},\n\n\t\t\tset volume(val: number) {\n\t\t\t\tgainNode.gain.value = Math.max(val, 0)\n\t\t\t},\n\n\t\t\tget volume() {\n\t\t\t\treturn gainNode.gain.value\n\t\t\t},\n\n\t\t\tset loop(l: boolean) {\n\t\t\t\tsrcNode.loop = l\n\t\t\t},\n\n\t\t\tget loop() {\n\t\t\t\treturn srcNode.loop\n\t\t\t},\n\n\t\t\tduration(): number {\n\t\t\t\treturn srcNode.buffer?.duration ?? 0\n\t\t\t},\n\n\t\t\ttime(): number {\n\t\t\t\treturn getTime() % this.duration()\n\t\t\t},\n\n\t\t\tonEnd(action: () => void) {\n\t\t\t\treturn onEndEvents.add(action)\n\t\t\t},\n\n\t\t\tthen(action: () => void) {\n\t\t\t\treturn this.onEnd(action)\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\t// core kaboom logic\n\tfunction burp(opt?: AudioPlayOpt): AudioPlay {\n\t\treturn play(audio.burpSnd, opt)\n\t}\n\n\ttype DrawTextureOpt = RenderProps & {\n\t\ttex: Texture,\n\t\twidth?: number,\n\t\theight?: number,\n\t\ttiled?: boolean,\n\t\tflipX?: boolean,\n\t\tflipY?: boolean,\n\t\tquad?: Quad,\n\t\tanchor?: Anchor | Vec2,\n\t}\n\n\tfunction makeShader(\n\t\tvertSrc: string | null = DEF_VERT,\n\t\tfragSrc: string | null = DEF_FRAG,\n\t): GfxShader {\n\n\t\tconst vcode = VERT_TEMPLATE.replace(\"{{user}}\", vertSrc ?? DEF_VERT)\n\t\tconst fcode = FRAG_TEMPLATE.replace(\"{{user}}\", fragSrc ?? DEF_FRAG)\n\t\tconst vertShader = gl.createShader(gl.VERTEX_SHADER)\n\t\tconst fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n\n\t\tgl.shaderSource(vertShader, vcode)\n\t\tgl.shaderSource(fragShader, fcode)\n\t\tgl.compileShader(vertShader)\n\t\tgl.compileShader(fragShader)\n\n\t\tconst prog = gl.createProgram()\n\n\t\tgc.push(() => gl.deleteProgram(prog))\n\t\tgl.attachShader(prog, vertShader)\n\t\tgl.attachShader(prog, fragShader)\n\n\t\tgl.bindAttribLocation(prog, 0, \"a_pos\")\n\t\tgl.bindAttribLocation(prog, 1, \"a_uv\")\n\t\tgl.bindAttribLocation(prog, 2, \"a_color\")\n\n\t\tgl.linkProgram(prog)\n\n\t\tif (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n\n\t\t\tconst formatShaderError = (msg: string) => {\n\t\t\t\tconst FMT = /^ERROR:\\s0:(?<line>\\d+):\\s(?<msg>.+)/\n\t\t\t\tconst match = msg.match(FMT)\n\t\t\t\treturn {\n\t\t\t\t\tline: Number(match.groups.line),\n\t\t\t\t\t// seem to be a \\n\\0 at the end of error messages, causing unwanted line break\n\t\t\t\t\tmsg: match.groups.msg.replace(/\\n\\0$/, \"\"),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst vertError = gl.getShaderInfoLog(vertShader)\n\t\t\tconst fragError = gl.getShaderInfoLog(fragShader)\n\t\t\tlet msg = \"\"\n\n\t\t\tif (vertError) {\n\t\t\t\tconst err = formatShaderError(vertError)\n\t\t\t\tmsg += `Vertex shader line ${err.line - 14}: ${err.msg}`\n\t\t\t}\n\n\t\t\tif (fragError) {\n\t\t\t\tconst err = formatShaderError(fragError)\n\t\t\t\tmsg += `Fragment shader line ${err.line - 14}: ${err.msg}`\n\t\t\t}\n\n\t\t\tthrow new KaboomError(msg)\n\n\t\t}\n\n\t\tgl.deleteShader(vertShader)\n\t\tgl.deleteShader(fragShader)\n\n\t\treturn {\n\n\t\t\tbind() {\n\t\t\t\tgl.useProgram(prog)\n\t\t\t},\n\n\t\t\tunbind() {\n\t\t\t\tgl.useProgram(null)\n\t\t\t},\n\n\t\t\tfree() {\n\t\t\t\tgl.deleteProgram(prog)\n\t\t\t},\n\n\t\t\t// TODO: support vec3 and vec4\n\t\t\tsend(uniform: Uniform) {\n\t\t\t\tfor (const name in uniform) {\n\t\t\t\t\tconst val = uniform[name]\n\t\t\t\t\tconst loc = gl.getUniformLocation(prog, name)\n\t\t\t\t\tif (typeof val === \"number\") {\n\t\t\t\t\t\tgl.uniform1f(loc, val)\n\t\t\t\t\t} else if (val instanceof Mat4) {\n\t\t\t\t\t\tgl.uniformMatrix4fv(loc, false, new Float32Array(val.m))\n\t\t\t\t\t} else if (val instanceof Color) {\n\t\t\t\t\t\t// TODO: opacity?\n\t\t\t\t\t\tgl.uniform3f(loc, val.r, val.g, val.b)\n\t\t\t\t\t} else if (val instanceof Vec2) {\n\t\t\t\t\t\tgl.uniform2f(loc, val.x, val.y)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction makeFont(\n\t\ttex: Texture,\n\t\tgw: number,\n\t\tgh: number,\n\t\tchars: string,\n\t): GfxFont {\n\n\t\tconst cols = tex.width / gw\n\t\tconst map: Record<string, Quad> = {}\n\t\tconst charMap = chars.split(\"\").entries()\n\n\t\tfor (const [i, ch] of charMap) {\n\t\t\tmap[ch] = new Quad(\n\t\t\t\t(i % cols) * gw,\n\t\t\t\tMath.floor(i / cols) * gh,\n\t\t\t\tgw,\n\t\t\t\tgh,\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\ttex: tex,\n\t\t\tmap: map,\n\t\t\tsize: gh,\n\t\t}\n\n\t}\n\n\t// TODO: expose\n\tfunction drawRaw(\n\t\tverts: Vertex[],\n\t\tindices: number[],\n\t\tfixed: boolean,\n\t\ttex: Texture = gfx.defTex,\n\t\tshaderSrc: RenderProps[\"shader\"] = gfx.defShader,\n\t\tuniform: Uniform = {},\n\t) {\n\n\t\tconst shader = resolveShader(shaderSrc)\n\n\t\tif (!shader || shader instanceof Asset) {\n\t\t\treturn\n\t\t}\n\n\t\t// flush on texture / shader change and overflow\n\t\tif (\n\t\t\ttex !== gfx.curTex\n\t\t\t|| shader !== gfx.curShader\n\t\t\t|| !deepEq(gfx.curUniform, uniform)\n\t\t\t|| gfx.vqueue.length + verts.length * STRIDE > MAX_BATCHED_VERTS\n\t\t\t|| gfx.iqueue.length + indices.length > MAX_BATCHED_INDICES\n\t\t) {\n\t\t\tflush()\n\t\t}\n\n\t\tconst transform = (gfx.fixed || fixed)\n\t\t\t? gfx.transform\n\t\t\t: game.cam.transform.mult(gfx.transform)\n\n\t\tfor (const v of verts) {\n\t\t\t// normalized world space coordinate [-1.0 ~ 1.0]\n\t\t\tconst pt = screen2ndc(transform.multVec2(v.pos))\n\t\t\tgfx.vqueue.push(\n\t\t\t\tpt.x, pt.y,\n\t\t\t\tv.uv.x, v.uv.y,\n\t\t\t\tv.color.r / 255, v.color.g / 255, v.color.b / 255, v.opacity,\n\t\t\t)\n\t\t}\n\n\t\tfor (const i of indices) {\n\t\t\tgfx.iqueue.push(i + gfx.vqueue.length / STRIDE - verts.length)\n\t\t}\n\n\t\tgfx.curTex = tex\n\t\tgfx.curShader = shader\n\t\tgfx.curUniform = uniform\n\n\t}\n\n\t// draw all batched shapes\n\tfunction flush() {\n\n\t\tif (\n\t\t\t!gfx.curTex\n\t\t\t|| !gfx.curShader\n\t\t\t|| gfx.vqueue.length === 0\n\t\t\t|| gfx.iqueue.length === 0\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, gfx.vbuf)\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(gfx.vqueue))\n\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gfx.ibuf)\n\t\tgl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Uint16Array(gfx.iqueue))\n\t\tgfx.curShader.bind()\n\t\tgfx.curShader.send(gfx.curUniform)\n\t\tgfx.curTex.bind()\n\t\tgl.drawElements(gl.TRIANGLES, gfx.iqueue.length, gl.UNSIGNED_SHORT, 0)\n\t\tgfx.curTex.unbind()\n\t\tgfx.curShader.unbind()\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null)\n\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)\n\n\t\tgfx.vqueue.length = 0\n\t\tgfx.iqueue.length = 0\n\n\t\tgfx.drawCalls++\n\n\t}\n\n\t// start a rendering frame, reset some states\n\tfunction frameStart() {\n\n\t\t// clear backbuffer\n\t\tgl.clear(gl.COLOR_BUFFER_BIT)\n\t\tgfx.frameBuffer.bind()\n\t\tgl.viewport(0, 0, gfx.frameBuffer.width, gfx.frameBuffer.height)\n\t\t// clear framebuffer\n\t\tgl.clear(gl.COLOR_BUFFER_BIT)\n\n\t\tif (!gfx.bgColor) {\n\t\t\tdrawUnscaled(() => {\n\t\t\t\tdrawUVQuad({\n\t\t\t\t\twidth: width(),\n\t\t\t\t\theight: height(),\n\t\t\t\t\tquad: new Quad(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\twidth() / BG_GRID_SIZE,\n\t\t\t\t\t\theight() / BG_GRID_SIZE,\n\t\t\t\t\t),\n\t\t\t\t\ttex: gfx.bgTex,\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tgfx.drawCalls = 0\n\t\tgfx.fixed = false\n\t\tgfx.transformStack.length = 0\n\t\tgfx.transform = new Mat4()\n\n\t}\n\n\tfunction usePostEffect(name: string, uniform?: Uniform | (() => Uniform)) {\n\t\tgfx.postShader = name\n\t\tgfx.postShaderUniform = uniform ?? null\n\t}\n\n\tfunction frameEnd() {\n\t\t// TODO: don't render debug UI with framebuffer\n\t\t// TODO: polish framebuffer rendering / sizing issues\n\t\tflush()\n\t\tgfx.frameBuffer.unbind()\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)\n\n\t\tflush()\n\t\tconst ow = gfx.width\n\t\tconst oh = gfx.height\n\t\tgfx.width = gl.drawingBufferWidth / pixelDensity\n\t\tgfx.height = gl.drawingBufferHeight / pixelDensity\n\n\t\tdrawTexture({\n\t\t\tflipY: true,\n\t\t\ttex: gfx.frameBuffer.tex,\n\t\t\tpos: new Vec2(gfx.viewport.x, gfx.viewport.y),\n\t\t\twidth: gfx.viewport.width,\n\t\t\theight: gfx.viewport.height,\n\t\t\tshader: gfx.postShader,\n\t\t\tuniform: typeof gfx.postShaderUniform === \"function\"\n\t\t\t\t? gfx.postShaderUniform()\n\t\t\t\t: gfx.postShaderUniform,\n\t\t\tfixed: true,\n\t\t})\n\n\t\tflush()\n\t\tgfx.width = ow\n\t\tgfx.height = oh\n\t\tgfx.lastDrawCalls = gfx.drawCalls\n\t}\n\n\t// convert a screen space coordinate to webgl normalized device coordinate\n\tfunction screen2ndc(pt: Vec2): Vec2 {\n\t\treturn new Vec2(\n\t\t\tpt.x / width() * 2 - 1,\n\t\t\t-pt.y / height() * 2 + 1,\n\t\t)\n\t}\n\n\tfunction pushMatrix(m: Mat4) {\n\t\tgfx.transform = m.clone()\n\t}\n\n\tfunction pushTranslate(...args: Vec2Args) {\n\t\tif (args[0] === undefined) return\n\t\tconst p = vec2(...args)\n\t\tif (p.x === 0 && p.y === 0) return\n\t\tgfx.transform.translate(p)\n\t}\n\n\tfunction pushScale(...args: Vec2Args) {\n\t\tif (args[0] === undefined) return\n\t\tconst p = vec2(...args)\n\t\tif (p.x === 1 && p.y === 1) return\n\t\tgfx.transform.scale(p)\n\t}\n\n\tfunction pushRotate(a: number) {\n\t\tif (!a) return\n\t\tgfx.transform.rotate(a)\n\t}\n\n\tfunction pushTransform() {\n\t\tgfx.transformStack.push(gfx.transform.clone())\n\t}\n\n\tfunction popTransform() {\n\t\tif (gfx.transformStack.length > 0) {\n\t\t\tgfx.transform = gfx.transformStack.pop()\n\t\t}\n\t}\n\n\t// draw a uv textured quad\n\tfunction drawUVQuad(opt: DrawUVQuadOpt) {\n\n\t\tif (opt.width === undefined || opt.height === undefined) {\n\t\t\tthrow new KaboomError(\"drawUVQuad() requires property \\\"width\\\" and \\\"height\\\".\")\n\t\t}\n\n\t\tif (opt.width <= 0 || opt.height <= 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst w = opt.width\n\t\tconst h = opt.height\n\t\tconst anchor = anchorPt(opt.anchor || DEF_ANCHOR)\n\t\tconst offset = anchor.scale(new Vec2(w, h).scale(-0.5))\n\t\tconst q = opt.quad || new Quad(0, 0, 1, 1)\n\t\tconst color = opt.color || rgb(255, 255, 255)\n\t\tconst opacity = opt.opacity ?? 1\n\n\t\t// apply uv padding to avoid artifacts\n\t\tconst uvPadX = opt.tex ? UV_PAD / opt.tex.width : 0\n\t\tconst uvPadY = opt.tex ? UV_PAD / opt.tex.height : 0\n\t\tconst qx = q.x + uvPadX\n\t\tconst qy = q.y + uvPadY\n\t\tconst qw = q.w - uvPadX * 2\n\t\tconst qh = q.h - uvPadY * 2\n\n\t\tpushTransform()\n\t\tpushTranslate(opt.pos)\n\t\tpushRotate(opt.angle)\n\t\tpushScale(opt.scale)\n\t\tpushTranslate(offset)\n\n\t\tdrawRaw([\n\t\t\t{\n\t\t\t\tpos: new Vec2(-w / 2, h / 2),\n\t\t\t\tuv: new Vec2(opt.flipX ? qx + qw : qx, opt.flipY ? qy : qy + qh),\n\t\t\t\tcolor: color,\n\t\t\t\topacity: opacity,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpos: new Vec2(-w / 2, -h / 2),\n\t\t\t\tuv: new Vec2(opt.flipX ? qx + qw : qx, opt.flipY ? qy + qh : qy),\n\t\t\t\tcolor: color,\n\t\t\t\topacity: opacity,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpos: new Vec2(w / 2, -h / 2),\n\t\t\t\tuv: new Vec2(opt.flipX ? qx : qx + qw, opt.flipY ? qy + qh : qy),\n\t\t\t\tcolor: color,\n\t\t\t\topacity: opacity,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpos: new Vec2(w / 2, h / 2),\n\t\t\t\tuv: new Vec2(opt.flipX ? qx : qx + qw, opt.flipY ? qy : qy + qh),\n\t\t\t\tcolor: color,\n\t\t\t\topacity: opacity,\n\t\t\t},\n\t\t], [0, 1, 3, 1, 2, 3], opt.fixed, opt.tex, opt.shader, opt.uniform)\n\n\t\tpopTransform()\n\n\t}\n\n\t// TODO: clean\n\tfunction drawTexture(opt: DrawTextureOpt) {\n\n\t\tif (!opt.tex) {\n\t\t\tthrow new KaboomError(\"drawTexture() requires property \\\"tex\\\".\")\n\t\t}\n\n\t\tconst q = opt.quad ?? new Quad(0, 0, 1, 1)\n\t\tconst w = opt.tex.width * q.w\n\t\tconst h = opt.tex.height * q.h\n\t\tconst scale = new Vec2(1)\n\n\t\tif (opt.tiled) {\n\n\t\t\t// TODO: draw fract\n\t\t\tconst repX = Math.ceil((opt.width || w) / w)\n\t\t\tconst repY = Math.ceil((opt.height || h) / h)\n\t\t\tconst anchor = anchorPt(opt.anchor || DEF_ANCHOR).add(new Vec2(1, 1)).scale(0.5)\n\t\t\tconst offset = anchor.scale(repX * w, repY * h)\n\n\t\t\t// TODO: rotation\n\t\t\tfor (let i = 0; i < repX; i++) {\n\t\t\t\tfor (let j = 0; j < repY; j++) {\n\t\t\t\t\tdrawUVQuad(Object.assign({}, opt, {\n\t\t\t\t\t\tpos: (opt.pos || new Vec2(0)).add(new Vec2(w * i, h * j)).sub(offset),\n\t\t\t\t\t\tscale: scale.scale(opt.scale || new Vec2(1)),\n\t\t\t\t\t\ttex: opt.tex,\n\t\t\t\t\t\tquad: q,\n\t\t\t\t\t\twidth: w,\n\t\t\t\t\t\theight: h,\n\t\t\t\t\t\tanchor: \"topleft\",\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t// TODO: should this ignore scale?\n\t\t\tif (opt.width && opt.height) {\n\t\t\t\tscale.x = opt.width / w\n\t\t\t\tscale.y = opt.height / h\n\t\t\t} else if (opt.width) {\n\t\t\t\tscale.x = opt.width / w\n\t\t\t\tscale.y = scale.x\n\t\t\t} else if (opt.height) {\n\t\t\t\tscale.y = opt.height / h\n\t\t\t\tscale.x = scale.y\n\t\t\t}\n\n\t\t\tdrawUVQuad(Object.assign({}, opt, {\n\t\t\t\tscale: scale.scale(opt.scale || new Vec2(1)),\n\t\t\t\ttex: opt.tex,\n\t\t\t\tquad: q,\n\t\t\t\twidth: w,\n\t\t\t\theight: h,\n\t\t\t}))\n\n\t\t}\n\n\t}\n\n\tfunction drawSprite(opt: DrawSpriteOpt) {\n\n\t\tif (!opt.sprite) {\n\t\t\tthrow new KaboomError(\"drawSprite() requires property \\\"sprite\\\"\")\n\t\t}\n\n\t\t// TODO: slow\n\t\tconst spr = resolveSprite(opt.sprite)\n\n\t\tif (!spr || !spr.data) {\n\t\t\treturn\n\t\t}\n\n\t\tconst q = spr.data.frames[opt.frame ?? 0]\n\n\t\tif (!q) {\n\t\t\tthrow new KaboomError(`Frame not found: ${opt.frame ?? 0}`)\n\t\t}\n\n\t\tdrawTexture(Object.assign({}, opt, {\n\t\t\ttex: spr.data.tex,\n\t\t\tquad: q.scale(opt.quad ?? new Quad(0, 0, 1, 1)),\n\t\t}))\n\n\t}\n\n\t// generate vertices to form an arc\n\tfunction getArcPts(\n\t\tpos: Vec2,\n\t\tradiusX: number,\n\t\tradiusY: number,\n\t\tstart: number,\n\t\tend: number,\n\t\tres: number = 1,\n\t): Vec2[] {\n\n\t\t// normalize and turn start and end angles to radians\n\t\tstart = deg2rad(start % 360)\n\t\tend = deg2rad(end % 360)\n\t\tif (end <= start) end += Math.PI * 2\n\n\t\tconst pts = []\n\t\tconst nverts = Math.ceil((end - start) / deg2rad(8) * res)\n\t\tconst step = (end - start) / nverts\n\n\t\t// calculate vertices\n\t\tfor (let a = start; a < end; a += step) {\n\t\t\tpts.push(pos.add(radiusX * Math.cos(a), radiusY * Math.sin(a)))\n\t\t}\n\n\t\tpts.push(pos.add(radiusX * Math.cos(end), radiusY * Math.sin(end)))\n\n\t\treturn pts\n\n\t}\n\n\tfunction drawRect(opt: DrawRectOpt) {\n\n\t\tif (opt.width === undefined || opt.height === undefined) {\n\t\t\tthrow new KaboomError(\"drawRect() requires property \\\"width\\\" and \\\"height\\\".\")\n\t\t}\n\n\t\tif (opt.width <= 0 || opt.height <= 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst w = opt.width\n\t\tconst h = opt.height\n\t\tconst anchor = anchorPt(opt.anchor || DEF_ANCHOR).add(1, 1)\n\t\tconst offset = anchor.scale(new Vec2(w, h).scale(-0.5))\n\n\t\tlet pts = [\n\t\t\tnew Vec2(0, 0),\n\t\t\tnew Vec2(w, 0),\n\t\t\tnew Vec2(w, h),\n\t\t\tnew Vec2(0, h),\n\t\t]\n\n\t\t// TODO: gradient for rounded rect\n\t\t// TODO: drawPolygon should handle generic rounded corners\n\t\tif (opt.radius) {\n\n\t\t\t// maxium radius is half the shortest side\n\t\t\tconst r = Math.min(Math.min(w, h) / 2, opt.radius)\n\n\t\t\tpts = [\n\t\t\t\tnew Vec2(r, 0),\n\t\t\t\tnew Vec2(w - r, 0),\n\t\t\t\t...getArcPts(new Vec2(w - r, r), r, r, 270, 360),\n\t\t\t\tnew Vec2(w, r),\n\t\t\t\tnew Vec2(w, h - r),\n\t\t\t\t...getArcPts(new Vec2(w - r, h - r), r, r, 0, 90),\n\t\t\t\tnew Vec2(w - r, h),\n\t\t\t\tnew Vec2(r, h),\n\t\t\t\t...getArcPts(new Vec2(r, h - r), r, r, 90, 180),\n\t\t\t\tnew Vec2(0, h - r),\n\t\t\t\tnew Vec2(0, r),\n\t\t\t\t...getArcPts(new Vec2(r, r), r, r, 180, 270),\n\t\t\t]\n\n\t\t}\n\n\t\tdrawPolygon(Object.assign({}, opt, {\n\t\t\toffset,\n\t\t\tpts,\n\t\t\t...(opt.gradient ? {\n\t\t\t\tcolors: opt.horizontal ? [\n\t\t\t\t\topt.gradient[0],\n\t\t\t\t\topt.gradient[1],\n\t\t\t\t\topt.gradient[1],\n\t\t\t\t\topt.gradient[0],\n\t\t\t\t] : [\n\t\t\t\t\topt.gradient[0],\n\t\t\t\t\topt.gradient[0],\n\t\t\t\t\topt.gradient[1],\n\t\t\t\t\topt.gradient[1],\n\t\t\t\t],\n\t\t\t} : {}),\n\t\t}))\n\n\t}\n\n\tfunction drawLine(opt: DrawLineOpt) {\n\n\t\tconst { p1, p2 } = opt\n\n\t\tif (!p1 || !p2) {\n\t\t\tthrow new KaboomError(\"drawLine() requires properties \\\"p1\\\" and \\\"p2\\\".\")\n\t\t}\n\n\t\tconst w = opt.width || 1\n\n\t\t// the displacement from the line end point to the corner point\n\t\tconst dis = p2.sub(p1).unit().normal().scale(w * 0.5)\n\n\t\t// calculate the 4 corner points of the line polygon\n\t\tconst verts = [\n\t\t\tp1.sub(dis),\n\t\t\tp1.add(dis),\n\t\t\tp2.add(dis),\n\t\t\tp2.sub(dis),\n\t\t].map((p) => ({\n\t\t\tpos: new Vec2(p.x, p.y),\n\t\t\tuv: new Vec2(0),\n\t\t\tcolor: opt.color ?? Color.WHITE,\n\t\t\topacity: opt.opacity ?? 1,\n\t\t}))\n\n\t\tdrawRaw(verts, [0, 1, 3, 1, 2, 3], opt.fixed, gfx.defTex, opt.shader, opt.uniform)\n\n\t}\n\n\tfunction drawLines(opt: DrawLinesOpt) {\n\n\t\tconst pts = opt.pts\n\n\t\tif (!pts) {\n\t\t\tthrow new KaboomError(\"drawLines() requires property \\\"pts\\\".\")\n\t\t}\n\n\t\tif (pts.length < 2) {\n\t\t\treturn\n\t\t}\n\n\t\tif (opt.radius && pts.length >= 3) {\n\n\t\t\t// TODO: line joines\n\t\t\t// TODO: rounded vertices for arbitury polygonic shape\n\t\t\tlet minSLen = pts[0].sdist(pts[1])\n\n\t\t\tfor (let i = 1; i < pts.length - 1; i++) {\n\t\t\t\tminSLen = Math.min(pts[i].sdist(pts[i + 1]), minSLen)\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line\n\t\t\tconst radius = Math.min(opt.radius, Math.sqrt(minSLen) / 2)\n\n\t\t\tdrawLine(Object.assign({}, opt, { p1: pts[0], p2: pts[1] }))\n\n\t\t\tfor (let i = 1; i < pts.length - 2; i++) {\n\t\t\t\tconst p1 = pts[i]\n\t\t\t\tconst p2 = pts[i + 1]\n\t\t\t\tdrawLine(Object.assign({}, opt, {\n\t\t\t\t\tp1: p1,\n\t\t\t\t\tp2: p2,\n\t\t\t\t}))\n\t\t\t}\n\n\t\t\tdrawLine(Object.assign({}, opt, {\n\t\t\t\tp1: pts[pts.length - 2],\n\t\t\t\tp2: pts[pts.length - 1],\n\t\t\t}))\n\n\t\t} else {\n\n\t\t\tfor (let i = 0; i < pts.length - 1; i++) {\n\t\t\t\tdrawLine(Object.assign({}, opt, {\n\t\t\t\t\tp1: pts[i],\n\t\t\t\t\tp2: pts[i + 1],\n\t\t\t\t}))\n\t\t\t\t// TODO: other line join types\n\t\t\t\tif (opt.join !== \"none\") {\n\t\t\t\t\tdrawCircle(Object.assign({}, opt, {\n\t\t\t\t\t\tpos: pts[i],\n\t\t\t\t\t\tradius: opt.width / 2,\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction drawTriangle(opt: DrawTriangleOpt) {\n\t\tif (!opt.p1 || !opt.p2 || !opt.p3) {\n\t\t\tthrow new KaboomError(\"drawPolygon() requires properties \\\"p1\\\", \\\"p2\\\" and \\\"p3\\\".\")\n\t\t}\n\t\treturn drawPolygon(Object.assign({}, opt, {\n\t\t\tpts: [opt.p1, opt.p2, opt.p3],\n\t\t}))\n\t}\n\n\tfunction drawCircle(opt: DrawCircleOpt) {\n\n\t\tif (typeof opt.radius !== \"number\") {\n\t\t\tthrow new KaboomError(\"drawCircle() requires property \\\"radius\\\".\")\n\t\t}\n\n\t\tif (opt.radius === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tdrawEllipse(Object.assign({}, opt, {\n\t\t\tradiusX: opt.radius,\n\t\t\tradiusY: opt.radius,\n\t\t\tangle: 0,\n\t\t}))\n\n\t}\n\n\tfunction drawEllipse(opt: DrawEllipseOpt) {\n\n\t\tif (opt.radiusX === undefined || opt.radiusY === undefined) {\n\t\t\tthrow new KaboomError(\"drawEllipse() requires properties \\\"radiusX\\\" and \\\"radiusY\\\".\")\n\t\t}\n\n\t\tif (opt.radiusX === 0 || opt.radiusY === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst start = opt.start ?? 0\n\t\tconst end = opt.end ?? 360\n\t\tconst offset = anchorPt(opt.anchor ?? \"center\").scale(new Vec2(-opt.radiusX, -opt.radiusY))\n\n\t\tconst pts = getArcPts(\n\t\t\toffset,\n\t\t\topt.radiusX,\n\t\t\topt.radiusY,\n\t\t\tstart,\n\t\t\tend,\n\t\t\topt.resolution,\n\t\t)\n\n\t\t// center\n\t\tpts.unshift(offset)\n\n\t\tconst polyOpt = Object.assign({}, opt, {\n\t\t\tpts,\n\t\t\tradius: 0,\n\t\t\t...(opt.gradient ? {\n\t\t\t\tcolors: [\n\t\t\t\t\topt.gradient[0],\n\t\t\t\t\t...Array(pts.length - 1).fill(opt.gradient[1]),\n\t\t\t\t],\n\t\t\t} : {}),\n\t\t})\n\n\t\t// full circle with outline shouldn't have the center point\n\t\tif (end - start >= 360 && opt.outline) {\n\t\t\tif (opt.fill !== false) {\n\t\t\t\tdrawPolygon(Object.assign(polyOpt, {\n\t\t\t\t\toutline: null,\n\t\t\t\t}))\n\t\t\t}\n\t\t\tdrawPolygon(Object.assign(polyOpt, {\n\t\t\t\tpts: pts.slice(1),\n\t\t\t\tfill: false,\n\t\t\t}))\n\t\t\treturn\n\t\t}\n\n\t\tdrawPolygon(polyOpt)\n\n\t}\n\n\tfunction drawPolygon(opt: DrawPolygonOpt) {\n\n\t\tif (!opt.pts) {\n\t\t\tthrow new KaboomError(\"drawPolygon() requires property \\\"pts\\\".\")\n\t\t}\n\n\t\tconst npts = opt.pts.length\n\n\t\tif (npts < 3) {\n\t\t\treturn\n\t\t}\n\n\t\tpushTransform()\n\t\tpushTranslate(opt.pos)\n\t\tpushScale(opt.scale)\n\t\tpushRotate(opt.angle)\n\t\tpushTranslate(opt.offset)\n\n\t\tif (opt.fill !== false) {\n\n\t\t\tconst color = opt.color ?? Color.WHITE\n\n\t\t\tconst verts = opt.pts.map((pt, i) => ({\n\t\t\t\tpos: new Vec2(pt.x, pt.y),\n\t\t\t\tuv: new Vec2(0, 0),\n\t\t\t\tcolor: opt.colors ? (opt.colors[i] ?? color) : color,\n\t\t\t\topacity: opt.opacity ?? 1,\n\t\t\t}))\n\n\t\t\t// TODO: better triangulation\n\t\t\tconst indices = [...Array(npts - 2).keys()]\n\t\t\t\t.map((n) => [0, n + 1, n + 2])\n\t\t\t\t.flat()\n\n\t\t\tdrawRaw(verts, opt.indices ?? indices, opt.fixed, gfx.defTex, opt.shader, opt.uniform)\n\n\t\t}\n\n\t\tif (opt.outline) {\n\t\t\tdrawLines({\n\t\t\t\tpts: [ ...opt.pts, opt.pts[0] ],\n\t\t\t\tradius: opt.radius,\n\t\t\t\twidth: opt.outline.width,\n\t\t\t\tcolor: opt.outline.color,\n\t\t\t\tjoin: opt.outline.join,\n\t\t\t\tuniform: opt.uniform,\n\t\t\t\tfixed: opt.fixed,\n\t\t\t\topacity: opt.opacity,\n\t\t\t})\n\t\t}\n\n\t\tpopTransform()\n\n\t}\n\n\tfunction drawStenciled(content: () => void, mask: () => void, test: number) {\n\n\t\tflush()\n\t\tgl.clear(gl.STENCIL_BUFFER_BIT)\n\t\tgl.enable(gl.STENCIL_TEST)\n\n\t\t// don't perform test, pure write\n\t\tgl.stencilFunc(\n\t\t\tgl.NEVER,\n\t\t\t1,\n\t\t\t0xFF,\n\t\t)\n\n\t\t// always replace since we're writing to the buffer\n\t\tgl.stencilOp(\n\t\t\tgl.REPLACE,\n\t\t\tgl.REPLACE,\n\t\t\tgl.REPLACE,\n\t\t)\n\n\t\tmask()\n\t\tflush()\n\n\t\t// perform test\n\t\tgl.stencilFunc(\n\t\t\ttest,\n\t\t\t1,\n\t\t\t0xFF,\n\t\t)\n\n\t\t// don't write since we're only testing\n\t\tgl.stencilOp(\n\t\t\tgl.KEEP,\n\t\t\tgl.KEEP,\n\t\t\tgl.KEEP,\n\t\t)\n\n\t\tcontent()\n\t\tflush()\n\t\tgl.disable(gl.STENCIL_TEST)\n\n\t}\n\n\tfunction drawMasked(content: () => void, mask: () => void) {\n\t\tdrawStenciled(content, mask, gl.EQUAL)\n\t}\n\n\tfunction drawSubtracted(content: () => void, mask: () => void) {\n\t\tdrawStenciled(content, mask, gl.NOTEQUAL)\n\t}\n\n\tfunction getViewportScale() {\n\t\treturn (gfx.viewport.width + gfx.viewport.height) / (gfx.width + gfx.height)\n\t}\n\n\tfunction drawUnscaled(content: () => void) {\n\t\tflush()\n\t\tconst ow = gfx.width\n\t\tconst oh = gfx.height\n\t\tgfx.width = gfx.viewport.width\n\t\tgfx.height = gfx.viewport.height\n\t\tcontent()\n\t\tflush()\n\t\tgfx.width = ow\n\t\tgfx.height = oh\n\t}\n\n\tfunction applyCharTransform(fchar: FormattedChar, tr: CharTransform) {\n\t\tif (tr.pos) fchar.pos = fchar.pos.add(tr.pos)\n\t\tif (tr.scale) fchar.scale = fchar.scale.scale(vec2(tr.scale))\n\t\tif (tr.angle) fchar.angle += tr.angle\n\t\tif (tr.color) fchar.color = fchar.color.mult(tr.color)\n\t\tif (tr.opacity) fchar.opacity *= tr.opacity\n\t}\n\n\t// TODO: escape\n\t// eslint-disable-next-line\n\tconst TEXT_STYLE_RE = /\\[(?<style>\\w+)\\](?<text>.*?)\\[\\/\\k<style>\\]/g\n\n\t// TODO: handle nested\n\tfunction compileStyledText(text: string): {\n\t\tcharStyleMap: Record<number, string[]>,\n\t\ttext: string,\n\t} {\n\n\t\tconst charStyleMap = {}\n\t\t// get the text without the styling syntax\n\t\tconst renderText = text.replace(TEXT_STYLE_RE, \"$2\")\n\t\tlet idxOffset = 0\n\n\t\t// put each styled char index into a map for easy access when iterating each char\n\t\tfor (const match of text.matchAll(TEXT_STYLE_RE)) {\n\t\t\tconst origIdx = match.index - idxOffset\n\t\t\tfor (let i = 0; i < match.groups.text.length; i++) {\n\t\t\t\tcharStyleMap[i + origIdx] = [match.groups.style]\n\t\t\t}\n\t\t\t// omit the style syntax in format string when calculating index\n\t\t\tidxOffset += match[0].length - match.groups.text.length\n\t\t}\n\n\t\treturn {\n\t\t\tcharStyleMap: charStyleMap,\n\t\t\ttext: renderText,\n\t\t}\n\n\t}\n\n\ttype FontAtlas = {\n\t\tfont: BitmapFontData,\n\t\tcursor: Vec2,\n\t\toutline: Outline | null,\n\t}\n\n\tconst fontAtlases: Record<string, FontAtlas> = {}\n\n\t// TODO: cache formatted text\n\t// format text and return a list of chars with their calculated position\n\tfunction formatText(opt: DrawTextOpt): FormattedText {\n\n\t\tif (opt.text === undefined) {\n\t\t\tthrow new KaboomError(\"formatText() requires property \\\"text\\\".\")\n\t\t}\n\n\t\tlet font = resolveFont(opt.font)\n\n\t\t// if it's still loading\n\t\tif (opt.text === \"\" || font instanceof Asset || !font) {\n\t\t\treturn {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t\tchars: [],\n\t\t\t\topt: opt,\n\t\t\t}\n\t\t}\n\n\t\tconst { charStyleMap, text } = compileStyledText(opt.text + \"\")\n\t\tconst chars = text.split(\"\")\n\n\t\t// if it's not bitmap font, we draw it with 2d canvas or use cached image\n\t\tif (font instanceof FontData || typeof font === \"string\") {\n\n\t\t\tconst fontName = font instanceof FontData ? font.fontface.family : font\n\t\t\tconst opts: {\n\t\t\t\toutline: Outline | null,\n\t\t\t\tfilter: TexFilter,\n\t\t\t} = font instanceof FontData ? {\n\t\t\t\toutline: font.outline,\n\t\t\t\tfilter: font.filter,\n\t\t\t} : {\n\t\t\t\toutline: null,\n\t\t\t\tfilter: DEF_FONT_FILTER,\n\t\t\t}\n\n\t\t\t// TODO: customizable font tex filter\n\t\t\tconst atlas: FontAtlas = fontAtlases[fontName] ?? {\n\t\t\t\tfont: {\n\t\t\t\t\ttex: new Texture(FONT_ATLAS_WIDTH, FONT_ATLAS_HEIGHT, {\n\t\t\t\t\t\tfilter: opts.filter,\n\t\t\t\t\t}),\n\t\t\t\t\tmap: {},\n\t\t\t\t\tsize: DEF_TEXT_CACHE_SIZE,\n\t\t\t\t},\n\t\t\t\tcursor: new Vec2(0),\n\t\t\t\toutline: opts.outline,\n\t\t\t}\n\n\t\t\tif (!fontAtlases[fontName]) {\n\t\t\t\tfontAtlases[fontName] = atlas\n\t\t\t}\n\n\t\t\tfont = atlas.font\n\n\t\t\tfor (const ch of chars) {\n\n\t\t\t\tif (!atlas.font.map[ch]) {\n\n\t\t\t\t\t// TODO: use assets.packer to pack font texture\n\t\t\t\t\tconst c2d = fontCacheCtx\n\t\t\t\t\tc2d.clearRect(0, 0, fontCacheCanvas.width, fontCacheCanvas.height)\n\t\t\t\t\tc2d.font = `${font.size}px ${fontName}`\n\t\t\t\t\tc2d.textBaseline = \"top\"\n\t\t\t\t\tc2d.textAlign = \"left\"\n\t\t\t\t\tc2d.fillStyle = \"#ffffff\"\n\t\t\t\t\tconst m = c2d.measureText(ch)\n\t\t\t\t\tlet w = Math.ceil(m.width)\n\t\t\t\t\tlet h = font.size\n\t\t\t\t\tif (atlas.outline) {\n\t\t\t\t\t\tc2d.lineJoin = \"round\"\n\t\t\t\t\t\tc2d.lineWidth = atlas.outline.width * 2\n\t\t\t\t\t\tc2d.strokeStyle = atlas.outline.color.toHex()\n\t\t\t\t\t\tc2d.strokeText(ch, atlas.outline.width, atlas.outline.width)\n\t\t\t\t\t\tw += atlas.outline.width * 2\n\t\t\t\t\t\th += atlas.outline.width * 3\n\t\t\t\t\t}\n\t\t\t\t\tc2d.fillText(ch, atlas.outline?.width ?? 0, atlas.outline?.width ?? 0)\n\n\t\t\t\t\tconst img = c2d.getImageData(0, 0, w, h)\n\n\t\t\t\t\t// if we are about to exceed the X axis of the texture, go to another line\n\t\t\t\t\tif (atlas.cursor.x + w > FONT_ATLAS_WIDTH) {\n\t\t\t\t\t\tatlas.cursor.x = 0\n\t\t\t\t\t\tatlas.cursor.y += h\n\t\t\t\t\t\tif (atlas.cursor.y > FONT_ATLAS_HEIGHT) {\n\t\t\t\t\t\t\t// TODO: create another atlas\n\t\t\t\t\t\t\tthrow new KaboomError(\"Font atlas exceeds character limit\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfont.tex.update(img, atlas.cursor.x, atlas.cursor.y)\n\t\t\t\t\tfont.map[ch] = new Quad(atlas.cursor.x, atlas.cursor.y, w, h)\n\t\t\t\t\tatlas.cursor.x += w\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst size = opt.size || font.size\n\t\tconst scale = vec2(opt.scale ?? 1).scale(size / font.size)\n\t\tconst lineSpacing = opt.lineSpacing ?? 0\n\t\tconst letterSpacing = opt.letterSpacing ?? 0\n\t\tlet curX = 0\n\t\tlet tw = 0\n\t\tlet th = 0\n\t\tconst lines: Array<{\n\t\t\twidth: number,\n\t\t\tchars: FormattedChar[],\n\t\t}> = []\n\t\tlet curLine: FormattedChar[] = []\n\t\tlet cursor = 0\n\t\tlet lastSpace = null\n\t\tlet lastSpaceWidth = null\n\n\t\t// TODO: word break\n\t\twhile (cursor < chars.length) {\n\n\t\t\tlet ch = chars[cursor]\n\n\t\t\t// always new line on '\\n'\n\t\t\tif (ch === \"\\n\") {\n\n\t\t\t\tth += size + lineSpacing\n\n\t\t\t\tlines.push({\n\t\t\t\t\twidth: curX - letterSpacing,\n\t\t\t\t\tchars: curLine,\n\t\t\t\t})\n\n\t\t\t\tlastSpace = null\n\t\t\t\tlastSpaceWidth = null\n\t\t\t\tcurX = 0\n\t\t\t\tcurLine = []\n\n\t\t\t} else {\n\n\t\t\t\tlet q = font.map[ch]\n\n\t\t\t\t// TODO: leave space if character not found?\n\t\t\t\tif (q) {\n\n\t\t\t\t\tlet gw = q.w * scale.x\n\n\t\t\t\t\tif (opt.width && curX + gw > opt.width) {\n\t\t\t\t\t\t// new line on last word if width exceeds\n\t\t\t\t\t\tth += size + lineSpacing\n\t\t\t\t\t\tif (lastSpace != null) {\n\t\t\t\t\t\t\tcursor -= curLine.length - lastSpace\n\t\t\t\t\t\t\tch = chars[cursor]\n\t\t\t\t\t\t\tq = font.map[ch]\n\t\t\t\t\t\t\tgw = q.w * scale.x\n\t\t\t\t\t\t\t// omit trailing space\n\t\t\t\t\t\t\tcurLine = curLine.slice(0, lastSpace - 1)\n\t\t\t\t\t\t\tcurX = lastSpaceWidth\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastSpace = null\n\t\t\t\t\t\tlastSpaceWidth = null\n\t\t\t\t\t\tlines.push({\n\t\t\t\t\t\t\twidth: curX - letterSpacing,\n\t\t\t\t\t\t\tchars: curLine,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcurX = 0\n\t\t\t\t\t\tcurLine = []\n\t\t\t\t\t}\n\n\t\t\t\t\t// push char\n\t\t\t\t\tcurLine.push({\n\t\t\t\t\t\ttex: font.tex,\n\t\t\t\t\t\twidth: q.w,\n\t\t\t\t\t\theight: q.h,\n\t\t\t\t\t\t// without some padding there'll be visual artifacts on edges\n\t\t\t\t\t\tquad: new Quad(\n\t\t\t\t\t\t\tq.x / font.tex.width,\n\t\t\t\t\t\t\tq.y / font.tex.height,\n\t\t\t\t\t\t\tq.w / font.tex.width,\n\t\t\t\t\t\t\tq.h / font.tex.height,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tch: ch,\n\t\t\t\t\t\tpos: new Vec2(curX, th),\n\t\t\t\t\t\topacity: opt.opacity ?? 1,\n\t\t\t\t\t\tcolor: opt.color ?? Color.WHITE,\n\t\t\t\t\t\tscale: vec2(scale),\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (ch === \" \") {\n\t\t\t\t\t\tlastSpace = curLine.length\n\t\t\t\t\t\tlastSpaceWidth = curX\n\t\t\t\t\t}\n\n\t\t\t\t\tcurX += gw\n\t\t\t\t\ttw = Math.max(tw, curX)\n\t\t\t\t\tcurX += letterSpacing\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcursor++\n\n\t\t}\n\n\t\tlines.push({\n\t\t\twidth: curX - letterSpacing,\n\t\t\tchars: curLine,\n\t\t})\n\n\t\tth += size\n\n\t\tif (opt.width) {\n\t\t\ttw = opt.width\n\t\t}\n\n\t\tconst fchars: FormattedChar[] = []\n\n\t\tfor (const line of lines) {\n\n\t\t\tconst ox = (tw - line.width) * alignPt(opt.align ?? \"left\")\n\n\t\t\tfor (const fchar of line.chars) {\n\n\t\t\t\tconst q = font.map[fchar.ch]\n\t\t\t\tconst idx = fchars.length\n\n\t\t\t\tfchar.pos = fchar.pos.add(ox, 0).add(\n\t\t\t\t\tq.w * scale.x * 0.5,\n\t\t\t\t\tq.h * scale.y * 0.5,\n\t\t\t\t)\n\n\t\t\t\tif (opt.transform) {\n\t\t\t\t\tconst tr = typeof opt.transform === \"function\"\n\t\t\t\t\t\t? opt.transform(idx, fchar.ch)\n\t\t\t\t\t\t: opt.transform\n\t\t\t\t\tif (tr) {\n\t\t\t\t\t\tapplyCharTransform(fchar, tr)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (charStyleMap[idx]) {\n\t\t\t\t\tconst styles = charStyleMap[idx]\n\t\t\t\t\tfor (const name of styles) {\n\t\t\t\t\t\tconst style = opt.styles[name]\n\t\t\t\t\t\tconst tr = typeof style === \"function\"\n\t\t\t\t\t\t\t? style(idx, fchar.ch)\n\t\t\t\t\t\t\t: style\n\t\t\t\t\t\tif (tr) {\n\t\t\t\t\t\t\tapplyCharTransform(fchar, tr)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfchars.push(fchar)\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: tw,\n\t\t\theight: th,\n\t\t\tchars: fchars,\n\t\t\topt: opt,\n\t\t}\n\n\t}\n\n\tfunction drawText(opt: DrawTextOpt) {\n\t\tdrawFormattedText(formatText(opt))\n\t}\n\n\tfunction drawFormattedText(ftext: FormattedText) {\n\t\tpushTransform()\n\t\tpushTranslate(ftext.opt.pos)\n\t\tpushRotate(ftext.opt.angle)\n\t\tpushTranslate(anchorPt(ftext.opt.anchor ?? \"topleft\").add(1, 1).scale(ftext.width, ftext.height).scale(-0.5))\n\t\tftext.chars.forEach((ch) => {\n\t\t\tdrawUVQuad({\n\t\t\t\ttex: ch.tex,\n\t\t\t\twidth: ch.width,\n\t\t\t\theight: ch.height,\n\t\t\t\tpos: ch.pos,\n\t\t\t\tscale: ch.scale,\n\t\t\t\tangle: ch.angle,\n\t\t\t\tcolor: ch.color,\n\t\t\t\topacity: ch.opacity,\n\t\t\t\tquad: ch.quad,\n\t\t\t\tanchor: \"center\",\n\t\t\t\tuniform: ftext.opt.uniform,\n\t\t\t\tshader: ftext.opt.shader,\n\t\t\t\tfixed: ftext.opt.fixed,\n\t\t\t})\n\t\t})\n\t\tpopTransform()\n\t}\n\n\t// get game width\n\tfunction width(): number {\n\t\treturn gfx.width\n\t}\n\n\t// get game height\n\tfunction height(): number {\n\t\treturn gfx.height\n\t}\n\n\tconst winEvents: EventList<WindowEventMap> = {}\n\n\t// transform a point from window space to content space\n\tfunction windowToContent(pt: Vec2) {\n\t\treturn new Vec2(\n\t\t\t(pt.x - gfx.viewport.x) * width() / gfx.viewport.width,\n\t\t\t(pt.y - gfx.viewport.y) * height() / gfx.viewport.height,\n\t\t)\n\t}\n\n\t// transform a point from content space to view space\n\tfunction contentToView(pt: Vec2) {\n\t\treturn new Vec2(\n\t\t\tpt.x * gfx.viewport.width / gfx.width,\n\t\t\tpt.y * gfx.viewport.height / gfx.height,\n\t\t)\n\t}\n\n\tfunction mousePos() {\n\t\treturn windowToContent(app.mousePos())\n\t}\n\n\twinEvents.error = (e) => {\n\t\tif (e.error && e.error instanceof KaboomError) {\n\t\t\thandleErr(e.error)\n\t\t} else if (e instanceof KaboomError) {\n\t\t\thandleErr(e)\n\t\t}\n\t}\n\n\twinEvents.unhandledrejection = (e) => {\n\t\tif (e.reason instanceof KaboomError) {\n\t\t\thandleErr(e.reason)\n\t\t}\n\t}\n\n\tfor (const name in winEvents) {\n\t\twindow.addEventListener(name, winEvents[name])\n\t}\n\n\tlet debugPaused = false\n\n\tconst debug: Debug = {\n\t\tinspect: false,\n\t\ttimeScale: 1,\n\t\tshowLog: true,\n\t\tfps: () => app.fps(),\n\t\tnumFrames: () => app.numFrames(),\n\t\tstepFrame: updateFrame,\n\t\tdrawCalls: () => gfx.drawCalls,\n\t\tclearLog: () => game.logs = [],\n\t\tlog: (msg) => {\n\t\t\tconst max = gopt.logMax ?? LOG_MAX\n\t\t\tgame.logs.unshift({\n\t\t\t\tmsg: msg,\n\t\t\t\ttime: app.time(),\n\t\t\t})\n\t\t\tif (game.logs.length > max) {\n\t\t\t\tgame.logs = game.logs.slice(0, max)\n\t\t\t}\n\t\t},\n\t\terror: (msg) => debug.log(new KaboomError(msg.toString ? msg.toString() : msg as string)),\n\t\tcurRecording: null,\n\t\tnumObjects: () => get(\"*\", { recursive: true }).length,\n\t\tget paused() {\n\t\t\treturn debugPaused\n\t\t},\n\t\tset paused(v) {\n\t\t\tdebugPaused = v\n\t\t\tif (v) {\n\t\t\t\taudio.ctx.suspend()\n\t\t\t} else {\n\t\t\t\taudio.ctx.resume()\n\t\t\t}\n\t\t},\n\t}\n\n\tfunction dt() {\n\t\treturn app.dt() * debug.timeScale\n\t}\n\n\tfunction camPos(...pos: Vec2Args): Vec2 {\n\t\tif (pos.length > 0) {\n\t\t\tgame.cam.pos = vec2(...pos)\n\t\t}\n\t\treturn game.cam.pos ? game.cam.pos.clone() : center()\n\t}\n\n\tfunction camScale(...scale: Vec2Args): Vec2 {\n\t\tif (scale.length > 0) {\n\t\t\tgame.cam.scale = vec2(...scale)\n\t\t}\n\t\treturn game.cam.scale.clone()\n\t}\n\n\tfunction camRot(angle: number): number {\n\t\tif (angle !== undefined) {\n\t\t\tgame.cam.angle = angle\n\t\t}\n\t\treturn game.cam.angle\n\t}\n\n\tfunction shake(intensity: number = 12) {\n\t\tgame.cam.shake += intensity\n\t}\n\n\tfunction toScreen(p: Vec2): Vec2 {\n\t\treturn game.cam.transform.multVec2(p)\n\t}\n\n\tfunction toWorld(p: Vec2): Vec2 {\n\t\treturn game.cam.transform.invert().multVec2(p)\n\t}\n\n\tfunction calcTransform(obj: GameObj): Mat4 {\n\t\tconst tr = new Mat4()\n\t\tif (obj.pos) tr.translate(obj.pos)\n\t\tif (obj.scale) tr.scale(obj.scale)\n\t\tif (obj.angle) tr.rotate(obj.angle)\n\t\treturn obj.parent ? tr.mult(obj.parent.transform) : tr\n\t}\n\n\tfunction make<T>(comps: CompList<T> = []): GameObj<T> {\n\n\t\tconst compStates = new Map()\n\t\tconst cleanups = {}\n\t\tconst events = new EventHandler()\n\t\tconst inputEvents: EventController[] = []\n\t\tlet onCurCompCleanup = null\n\t\tlet paused = false\n\n\t\t// TODO\n\t\t// @ts-ignore\n\t\tconst obj: GameObj = {\n\n\t\t\tid: uid(),\n\t\t\t// TODO: a nice way to hide / pause when add()-ing\n\t\t\thidden: false,\n\t\t\ttransform: new Mat4(),\n\t\t\tchildren: [],\n\t\t\tparent: null,\n\n\t\t\tset paused(p) {\n\t\t\t\tif (p === paused) return\n\t\t\t\tpaused = p\n\t\t\t\tfor (const e of inputEvents) {\n\t\t\t\t\te.paused = p\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tget paused() {\n\t\t\t\treturn paused\n\t\t\t},\n\n\t\t\tadd<T2>(a: CompList<T2> | GameObj<T2> = []): GameObj<T2> {\n\t\t\t\tconst obj = Array.isArray(a) ? make(a) : a\n\t\t\t\tif (obj.parent) {\n\t\t\t\t\tthrow new KaboomError(\"Cannot add a game obj that already has a parent.\")\n\t\t\t\t}\n\t\t\t\tobj.parent = this\n\t\t\t\tobj.transform = calcTransform(obj)\n\t\t\t\tthis.children.push(obj)\n\t\t\t\t// TODO: trigger add for children\n\t\t\t\tobj.trigger(\"add\", obj)\n\t\t\t\tgame.events.trigger(\"add\", obj)\n\t\t\t\treturn obj\n\t\t\t},\n\n\t\t\treadd(obj: GameObj): GameObj {\n\t\t\t\tconst idx = this.children.indexOf(obj)\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tthis.children.splice(idx, 1)\n\t\t\t\t\tthis.children.push(obj)\n\t\t\t\t}\n\t\t\t\treturn obj\n\t\t\t},\n\n\t\t\tremove(obj: GameObj): void {\n\t\t\t\tconst idx = this.children.indexOf(obj)\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tobj.parent = null\n\t\t\t\t\tthis.children.splice(idx, 1)\n\t\t\t\t\tconst trigger = (o) => {\n\t\t\t\t\t\to.trigger(\"destroy\")\n\t\t\t\t\t\tgame.events.trigger(\"destroy\", o)\n\t\t\t\t\t\to.children.forEach((child) => trigger(child))\n\t\t\t\t\t}\n\t\t\t\t\ttrigger(obj)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// TODO: recursive\n\t\t\tremoveAll(tag?: Tag) {\n\t\t\t\tif (tag) {\n\t\t\t\t\tthis.get(tag).forEach((obj) => this.remove(obj))\n\t\t\t\t} else {\n\t\t\t\t\tfor (const child of [...this.children]) this.remove(child)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tupdate() {\n\t\t\t\tif (this.paused) return\n\t\t\t\tthis.children\n\t\t\t\t\t.sort((o1, o2) => (o1.z ?? 0) - (o2.z ?? 0))\n\t\t\t\t\t.forEach((child) => child.update())\n\t\t\t\tthis.trigger(\"update\")\n\t\t\t},\n\n\t\t\tdraw(this: GameObj<PosComp | ScaleComp | RotateComp | FixedComp | MaskComp>) {\n\t\t\t\tif (this.hidden) return\n\t\t\t\tconst f = gfx.fixed\n\t\t\t\tif (this.fixed) gfx.fixed = true\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(this.pos)\n\t\t\t\tpushScale(this.scale)\n\t\t\t\tpushRotate(this.angle)\n\t\t\t\tconst children = this.children.sort((o1, o2) => (o1.z ?? 0) - (o2.z ?? 0))\n\t\t\t\t// TODO: automatically don't draw if offscreen\n\t\t\t\tif (this.mask) {\n\t\t\t\t\tconst maskFunc = {\n\t\t\t\t\t\tintersect: drawMasked,\n\t\t\t\t\t\tsubtract: drawSubtracted,\n\t\t\t\t\t}[this.mask]\n\t\t\t\t\tif (!maskFunc) {\n\t\t\t\t\t\tthrow new KaboomError(`Invalid mask func: \"${this.mask}\"`)\n\t\t\t\t\t}\n\t\t\t\t\tmaskFunc(() => {\n\t\t\t\t\t\tchildren.forEach((child) => child.draw())\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\tthis.trigger(\"draw\")\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthis.trigger(\"draw\")\n\t\t\t\t\tchildren.forEach((child) => child.draw())\n\t\t\t\t}\n\t\t\t\tpopTransform()\n\t\t\t\tgfx.fixed = f\n\t\t\t},\n\n\t\t\tdrawInspect(this: GameObj<PosComp | ScaleComp | RotateComp>) {\n\t\t\t\tif (this.hidden) return\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(this.pos)\n\t\t\t\tpushScale(this.scale)\n\t\t\t\tpushRotate(this.angle)\n\t\t\t\tthis.children\n\t\t\t\t\t.sort((o1, o2) => (o1.z ?? 0) - (o2.z ?? 0))\n\t\t\t\t\t.forEach((child) => child.drawInspect())\n\t\t\t\tthis.trigger(\"drawInspect\")\n\t\t\t\tpopTransform()\n\t\t\t},\n\n\t\t\t// use a comp, or tag\n\t\t\tuse(comp: Comp | Tag) {\n\n\t\t\t\tif (!comp) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// tag\n\t\t\t\tif (typeof comp === \"string\") {\n\t\t\t\t\treturn this.use({\n\t\t\t\t\t\tid: comp,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tlet gc = []\n\n\t\t\t\t// clear if overwrite\n\t\t\t\tif (comp.id) {\n\t\t\t\t\tthis.unuse(comp.id)\n\t\t\t\t\tcleanups[comp.id] = []\n\t\t\t\t\tgc = cleanups[comp.id]\n\t\t\t\t\tcompStates.set(comp.id, comp)\n\t\t\t\t}\n\n\t\t\t\tfor (const k in comp) {\n\n\t\t\t\t\tif (COMP_DESC.has(k)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst prop = Object.getOwnPropertyDescriptor(comp, k)\n\n\t\t\t\t\tif (typeof prop.value === \"function\") {\n\t\t\t\t\t\tcomp[k] = comp[k].bind(this)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (prop.set) {\n\t\t\t\t\t\tObject.defineProperty(comp, k, {\n\t\t\t\t\t\t\tset: prop.set.bind(this),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif (prop.get) {\n\t\t\t\t\t\tObject.defineProperty(comp, k, {\n\t\t\t\t\t\t\tget: prop.get.bind(this),\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif (COMP_EVENTS.has(k)) {\n\t\t\t\t\t\t// automatically clean up events created by components in add() stage\n\t\t\t\t\t\tconst func = k === \"add\" ? () => {\n\t\t\t\t\t\t\tonCurCompCleanup = (c) => gc.push(c)\n\t\t\t\t\t\t\tcomp[k]()\n\t\t\t\t\t\t\tonCurCompCleanup = null\n\t\t\t\t\t\t} : comp[k]\n\t\t\t\t\t\tgc.push(this.on(k, func).cancel)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this[k] === undefined) {\n\t\t\t\t\t\t\t// assign comp fields to game obj\n\t\t\t\t\t\t\tObject.defineProperty(this, k, {\n\t\t\t\t\t\t\t\tget: () => comp[k],\n\t\t\t\t\t\t\t\tset: (val) => comp[k] = val,\n\t\t\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tgc.push(() => delete this[k])\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new KaboomError(`Duplicate component property: \"${k}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// check for component dependencies\n\t\t\t\tconst checkDeps = () => {\n\t\t\t\t\tif (!comp.require) return\n\t\t\t\t\tfor (const dep of comp.require) {\n\t\t\t\t\t\tif (!this.c(dep)) {\n\t\t\t\t\t\t\tthrow new KaboomError(`Component \"${comp.id}\" requires component \"${dep}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (comp.destroy) {\n\t\t\t\t\tgc.push(comp.destroy.bind(this))\n\t\t\t\t}\n\n\t\t\t\t// manually trigger add event if object already exist\n\t\t\t\tif (this.exists()) {\n\t\t\t\t\tcheckDeps()\n\t\t\t\t\tif (comp.add) {\n\t\t\t\t\t\tonCurCompCleanup = (c) => gc.push(c)\n\t\t\t\t\t\tcomp.add.call(this)\n\t\t\t\t\t\tonCurCompCleanup = null\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (comp.require) {\n\t\t\t\t\t\tgc.push(this.on(\"add\", checkDeps).cancel)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tunuse(id: Tag) {\n\t\t\t\tif (cleanups[id]) {\n\t\t\t\t\tcleanups[id].forEach((e) => e())\n\t\t\t\t\tdelete cleanups[id]\n\t\t\t\t}\n\t\t\t\tif (compStates.has(id)) {\n\t\t\t\t\tcompStates.delete(id)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tc(id: Tag): Comp {\n\t\t\t\treturn compStates.get(id)\n\t\t\t},\n\n\t\t\tget(t: Tag | Tag[], opts: GetOpt = {}): GameObj[] {\n\t\t\t\tlet list: GameObj[] = opts.recursive\n\t\t\t\t\t? this.children.flatMap(function recurse(child) {\n\t\t\t\t\t\treturn [child, ...child.children.flatMap(recurse)]\n\t\t\t\t\t})\n\t\t\t\t\t: this.children\n\t\t\t\tlist = list.filter((child) => t ? child.is(t) : true)\n\t\t\t\tif (opts.liveUpdate) {\n\t\t\t\t\tconst isChild = (obj) => {\n\t\t\t\t\t\treturn opts.recursive\n\t\t\t\t\t\t\t? this.isAncestorOf(obj)\n\t\t\t\t\t\t\t: obj.parent === this\n\t\t\t\t\t}\n\t\t\t\t\t// TODO: handle when object add / remove tags\n\t\t\t\t\t// TODO: clean up when obj destroyed\n\t\t\t\t\tonAdd((obj) => {\n\t\t\t\t\t\tif (isChild(obj) && obj.is(t)) {\n\t\t\t\t\t\t\tlist.push(obj)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tonDestroy((obj) => {\n\t\t\t\t\t\tif (isChild(obj) && obj.is(t)) {\n\t\t\t\t\t\t\tconst idx = list.findIndex((o) => o.id === obj.id)\n\t\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\t\tlist.splice(idx, 1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treturn list\n\t\t\t},\n\n\t\t\tisAncestorOf(obj: GameObj) {\n\t\t\t\tif (!obj.parent) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\treturn obj.parent === this || this.isAncestorOf(obj.parent)\n\t\t\t},\n\n\t\t\texists(): boolean {\n\t\t\t\treturn game.root.isAncestorOf(this)\n\t\t\t},\n\n\t\t\tis(tag: Tag | Tag[]): boolean {\n\t\t\t\tif (tag === \"*\") {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(tag)) {\n\t\t\t\t\tfor (const t of tag) {\n\t\t\t\t\t\tif (!this.c(t)) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t} else {\n\t\t\t\t\treturn this.c(tag) != null\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ton(name: string, action: (...args) => void): EventController {\n\t\t\t\tconst ctrl = events.on(name, action.bind(this))\n\t\t\t\tif (onCurCompCleanup) {\n\t\t\t\t\tonCurCompCleanup(() => ctrl.cancel())\n\t\t\t\t}\n\t\t\t\treturn ctrl\n\t\t\t},\n\n\t\t\ttrigger(name: string, ...args): void {\n\t\t\t\tevents.trigger(name, ...args)\n\t\t\t\tgame.objEvents.trigger(name, this, ...args)\n\t\t\t},\n\n\t\t\tdestroy() {\n\t\t\t\tif (this.parent) {\n\t\t\t\t\tthis.parent.remove(this)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tinspect() {\n\t\t\t\tconst info = {}\n\t\t\t\tfor (const [tag, comp] of compStates) {\n\t\t\t\t\tinfo[tag] = comp.inspect ? comp.inspect() : null\n\t\t\t\t}\n\t\t\t\treturn info\n\t\t\t},\n\n\t\t\tonAdd(cb: () => void): EventController {\n\t\t\t\treturn this.on(\"add\", cb)\n\t\t\t},\n\n\t\t\tonUpdate(cb: () => void): EventController {\n\t\t\t\treturn this.on(\"update\", cb)\n\t\t\t},\n\n\t\t\tonDraw(cb: () => void): EventController {\n\t\t\t\treturn this.on(\"draw\", cb)\n\t\t\t},\n\n\t\t\tonDestroy(action: () => void): EventController {\n\t\t\t\treturn this.on(\"destroy\", action)\n\t\t\t},\n\n\t\t\tclearEvents() {\n\t\t\t\tevents.clear()\n\t\t\t},\n\n\t\t}\n\n\t\t// TODO: type with as const\n\t\tconst evs = [\n\t\t\t\"onKeyPress\",\n\t\t\t\"onKeyPressRepeat\",\n\t\t\t\"onKeyDown\",\n\t\t\t\"onKeyRelease\",\n\t\t\t\"onMousePress\",\n\t\t\t\"onMouseDown\",\n\t\t\t\"onMouseRelease\",\n\t\t\t\"onMouseMove\",\n\t\t\t\"onCharInput\",\n\t\t\t\"onMouseMove\",\n\t\t\t\"onTouchStart\",\n\t\t\t\"onTouchMove\",\n\t\t\t\"onTouchEnd\",\n\t\t\t\"onScroll\",\n\t\t\t\"onGamepadButtonPress\",\n\t\t\t\"onGamepadButtonDown\",\n\t\t\t\"onGamepadButtonRelease\",\n\t\t\t\"onGamepadStick\",\n\t\t]\n\n\t\tfor (const e of evs) {\n\t\t\tobj[e] = (...args) => {\n\t\t\t\tconst ev = app[e](...args)\n\t\t\t\tinputEvents.push(ev)\n\t\t\t\t// TODO: what if the game object is destroy and re-added\n\t\t\t\tobj.onDestroy(() => ev.cancel())\n\t\t\t\treturn ev\n\t\t\t}\n\t\t}\n\n\t\tfor (const comp of comps) {\n\t\t\tobj.use(comp)\n\t\t}\n\n\t\treturn obj as unknown as GameObj<T>\n\n\t}\n\n\t// add an event to a tag\n\tfunction on(event: string, tag: Tag, cb: (obj: GameObj, ...args) => void): EventController {\n\t\tif (!game.objEvents[event]) {\n\t\t\tgame.objEvents[event] = new IDList()\n\t\t}\n\t\treturn game.objEvents.on(event, (obj, ...args) => {\n\t\t\tif (obj.is(tag)) {\n\t\t\t\tcb(obj, ...args)\n\t\t\t}\n\t\t})\n\t}\n\n\t// add update event to a tag or global update\n\tconst onUpdate = ((tag: Tag | (() => void), action?: (obj: GameObj) => void) => {\n\t\tif (typeof tag === \"function\" && action === undefined) {\n\t\t\tconst obj = add([{ update: tag }])\n\t\t\treturn {\n\t\t\t\tget paused() {\n\t\t\t\t\treturn obj.paused\n\t\t\t\t},\n\t\t\t\tset paused(p) {\n\t\t\t\t\tobj.paused = p\n\t\t\t\t},\n\t\t\t\tcancel: () => obj.destroy(),\n\t\t\t}\n\t\t} else if (typeof tag === \"string\") {\n\t\t\treturn on(\"update\", tag, action)\n\t\t}\n\t}) as KaboomCtx[\"onUpdate\"]\n\n\t// add draw event to a tag or global draw\n\tconst onDraw = ((tag: Tag | (() => void), action?: (obj: GameObj) => void) => {\n\t\tif (typeof tag === \"function\" && action === undefined) {\n\t\t\tconst obj = add([{ draw: tag }])\n\t\t\treturn {\n\t\t\t\tget paused() {\n\t\t\t\t\treturn obj.hidden\n\t\t\t\t},\n\t\t\t\tset paused(p) {\n\t\t\t\t\tobj.hidden = p\n\t\t\t\t},\n\t\t\t\tcancel: () => obj.destroy(),\n\t\t\t}\n\t\t} else if (typeof tag === \"string\") {\n\t\t\treturn on(\"draw\", tag, action)\n\t\t}\n\t}) as KaboomCtx[\"onDraw\"]\n\n\tfunction onAdd(tag: Tag | ((obj: GameObj) => void), action?: (obj: GameObj) => void) {\n\t\tif (typeof tag === \"function\" && action === undefined) {\n\t\t\treturn game.events.on(\"add\", tag)\n\t\t} else if (typeof tag === \"string\") {\n\t\t\treturn on(\"add\", tag, action)\n\t\t}\n\t}\n\n\tfunction onDestroy(tag: Tag | ((obj: GameObj) => void), action?: (obj: GameObj) => void) {\n\t\tif (typeof tag === \"function\" && action === undefined) {\n\t\t\treturn game.events.on(\"destroy\", tag)\n\t\t} else if (typeof tag === \"string\") {\n\t\t\treturn on(\"destroy\", tag, action)\n\t\t}\n\t}\n\n\t// add an event that runs with objs with t1 collides with objs with t2\n\tfunction onCollide(\n\t\tt1: Tag,\n\t\tt2: Tag,\n\t\tf: (a: GameObj, b: GameObj, col?: Collision) => void,\n\t): EventController {\n\t\treturn on(\"collide\", t1, (a, b, col) => b.is(t2) && f(a, b, col))\n\t}\n\n\tfunction onCollideUpdate(\n\t\tt1: Tag,\n\t\tt2: Tag,\n\t\tf: (a: GameObj, b: GameObj, col?: Collision) => void,\n\t): EventController {\n\t\treturn on(\"collideUpdate\", t1, (a, b, col) => b.is(t2) && f(a, b, col))\n\t}\n\n\tfunction onCollideEnd(\n\t\tt1: Tag,\n\t\tt2: Tag,\n\t\tf: (a: GameObj, b: GameObj, col?: Collision) => void,\n\t): EventController {\n\t\treturn on(\"collideEnd\", t1, (a, b, col) => b.is(t2) && f(a, b, col))\n\t}\n\n\tfunction forAllCurrentAndFuture(t: Tag, action: (obj: GameObj) => void) {\n\t\tget(t, { recursive: true }).forEach(action)\n\t\tonAdd(t, action)\n\t}\n\n\t// add an event that runs when objs with tag t is clicked\n\tfunction onClick(tag: Tag | (() => void), action?: (obj: GameObj) => void): EventController {\n\t\tif (typeof tag === \"function\") {\n\t\t\treturn app.onMousePress(tag)\n\t\t} else {\n\t\t\tconst events = []\n\t\t\tforAllCurrentAndFuture(tag, (obj) => {\n\t\t\t\tif (!obj.area)\n\t\t\t\t\tthrow new KaboomError(\"onClick() requires the object to have area() component\")\n\t\t\t\tevents.push(obj.onClick(() => action(obj)))\n\t\t\t})\n\t\t\treturn EventController.join(events)\n\t\t}\n\t}\n\n\t// add an event that runs once when objs with tag t is hovered\n\tfunction onHover(t: Tag, action: (obj: GameObj) => void): EventController {\n\t\tconst events = []\n\t\tforAllCurrentAndFuture(t, (obj) => {\n\t\t\tif (!obj.area)\n\t\t\t\tthrow new KaboomError(\"onHover() requires the object to have area() component\")\n\t\t\tevents.push(obj.onHover(() => action(obj)))\n\t\t})\n\t\treturn EventController.join(events)\n\t}\n\n\t// add an event that runs once when objs with tag t is hovered\n\tfunction onHoverUpdate(t: Tag, action: (obj: GameObj) => void): EventController {\n\t\tconst events = []\n\t\tforAllCurrentAndFuture(t, (obj) => {\n\t\t\tif (!obj.area)\n\t\t\t\tthrow new KaboomError(\"onHoverUpdate() requires the object to have area() component\")\n\t\t\tevents.push(obj.onHoverUpdate(() => action(obj)))\n\t\t})\n\t\treturn EventController.join(events)\n\t}\n\n\t// add an event that runs once when objs with tag t is unhovered\n\tfunction onHoverEnd(t: Tag, action: (obj: GameObj) => void): EventController {\n\t\tconst events = []\n\t\tforAllCurrentAndFuture(t, (obj) => {\n\t\t\tif (!obj.area)\n\t\t\t\tthrow new KaboomError(\"onHoverEnd() requires the object to have area() component\")\n\t\t\tevents.push(obj.onHoverEnd(() => action(obj)))\n\t\t})\n\t\treturn EventController.join(events)\n\t}\n\n\t// TODO: use PromiseLike?\n\t// TODO: use root game object and timer()?\n\t// add an event that'd be run after t\n\tfunction wait(time: number, action?: () => void): TimerController {\n\t\tlet t = 0\n\t\tconst actions = []\n\t\tif (action) actions.push(action)\n\t\tconst ev = onUpdate(() => {\n\t\t\tt += dt()\n\t\t\tif (t >= time) {\n\t\t\t\tev.cancel()\n\t\t\t\tactions.forEach((action) => action())\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tpaused: ev.paused,\n\t\t\tcancel: ev.cancel,\n\t\t\tonEnd(action) {\n\t\t\t\tactions.push(action)\n\t\t\t},\n\t\t\tthen(action) {\n\t\t\t\tthis.onEnd(action)\n\t\t\t\treturn this\n\t\t\t},\n\t\t}\n\t}\n\n\t// add an event that's run every t seconds\n\tfunction loop(t: number, action: () => void): EventController {\n\n\t\tlet curTimer: null | TimerController = null\n\n\t\tconst newAction = () => {\n\t\t\t// TODO: should f be execute right away as loop() is called?\n\t\t\tcurTimer = wait(t, newAction)\n\t\t\taction()\n\t\t}\n\n\t\tcurTimer = wait(0, newAction)\n\n\t\treturn {\n\t\t\tget paused() {\n\t\t\t\treturn curTimer.paused\n\t\t\t},\n\t\t\tset paused(p) {\n\t\t\t\tcurTimer.paused = p\n\t\t\t},\n\t\t\tcancel: () => curTimer.cancel(),\n\t\t}\n\n\t}\n\n\tfunction enterDebugMode() {\n\n\t\tapp.onKeyPress(\"f1\", () => {\n\t\t\tdebug.inspect = !debug.inspect\n\t\t})\n\n\t\tapp.onKeyPress(\"f2\", () => {\n\t\t\tdebug.clearLog()\n\t\t})\n\n\t\tapp.onKeyPress(\"f8\", () => {\n\t\t\tdebug.paused = !debug.paused\n\t\t})\n\n\t\tapp.onKeyPress(\"f7\", () => {\n\t\t\tdebug.timeScale = toFixed(clamp(debug.timeScale - 0.2, 0, 2), 1)\n\t\t})\n\n\t\tapp.onKeyPress(\"f9\", () => {\n\t\t\tdebug.timeScale = toFixed(clamp(debug.timeScale + 0.2, 0, 2), 1)\n\t\t})\n\n\t\tapp.onKeyPress(\"f10\", () => {\n\t\t\tdebug.stepFrame()\n\t\t})\n\n\t}\n\n\tfunction enterBurpMode() {\n\t\tapp.onKeyPress(\"b\", () => burp())\n\t}\n\n\tfunction setGravity(g: number) {\n\t\tgame.gravity = g\n\t}\n\n\tfunction getGravity() {\n\t\treturn game.gravity\n\t}\n\n\tfunction setBackground(...args) {\n\t\tif (args.length === 1 || args.length === 2) {\n\t\t\tgfx.bgColor = rgb(args[0])\n\t\t\tif (args[1]) gfx.bgAlpha = args[1]\n\t\t} else if (args.length === 3 || args.length === 4) {\n\t\t\tgfx.bgColor = rgb(args[0], args[1], args[2])\n\t\t\tif (args[3]) gfx.bgAlpha = args[3]\n\t\t}\n\t\tgl.clearColor(\n\t\t\tgfx.bgColor.r / 255,\n\t\t\tgfx.bgColor.g / 255,\n\t\t\tgfx.bgColor.b / 255,\n\t\t\tgfx.bgAlpha,\n\t\t)\n\t}\n\n\tfunction getBackground() {\n\t\treturn gfx.bgColor.clone()\n\t}\n\n\t// TODO: manage global velocity here?\n\tfunction pos(...args: Vec2Args): PosComp {\n\n\t\treturn {\n\n\t\t\tid: \"pos\",\n\t\t\tpos: vec2(...args),\n\n\t\t\tmoveBy(...args: Vec2Args) {\n\t\t\t\tthis.pos = this.pos.add(vec2(...args))\n\t\t\t},\n\n\t\t\t// move with velocity (pixels per second)\n\t\t\tmove(...args: Vec2Args) {\n\t\t\t\tthis.moveBy(vec2(...args).scale(dt()))\n\t\t\t},\n\n\t\t\t// move to a destination, with optional speed\n\t\t\tmoveTo(...args) {\n\t\t\t\tif (typeof args[0] === \"number\" && typeof args[1] === \"number\") {\n\t\t\t\t\treturn this.moveTo(vec2(args[0], args[1]), args[2])\n\t\t\t\t}\n\t\t\t\tconst dest = args[0]\n\t\t\t\tconst speed = args[1]\n\t\t\t\tif (speed === undefined) {\n\t\t\t\t\tthis.pos = vec2(dest)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst diff = dest.sub(this.pos)\n\t\t\t\tif (diff.len() <= speed * dt()) {\n\t\t\t\t\tthis.pos = vec2(dest)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.move(diff.unit().scale(speed))\n\t\t\t},\n\n\t\t\tworldPos(this: GameObj<PosComp>): Vec2 {\n\t\t\t\treturn this.parent\n\t\t\t\t\t? this.parent.transform.multVec2(this.pos)\n\t\t\t\t\t: this.pos\n\t\t\t},\n\n\t\t\t// get the screen position (transformed by camera)\n\t\t\tscreenPos(this: GameObj<PosComp | FixedComp>): Vec2 {\n\t\t\t\tconst pos = this.worldPos()\n\t\t\t\treturn isFixed(this)\n\t\t\t\t\t? pos\n\t\t\t\t\t: toScreen(pos)\n\t\t\t},\n\n\t\t\tinspect() {\n\t\t\t\treturn `(${Math.round(this.pos.x)}, ${Math.round(this.pos.y)})`\n\t\t\t},\n\n\t\t\tdrawInspect() {\n\t\t\t\tdrawCircle({\n\t\t\t\t\tcolor: rgb(255, 0, 0),\n\t\t\t\t\tradius: 4 / getViewportScale(),\n\t\t\t\t})\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\t// TODO: allow single number assignment\n\tfunction scale(...args: Vec2Args): ScaleComp {\n\t\tif (args.length === 0) {\n\t\t\treturn scale(1)\n\t\t}\n\t\treturn {\n\t\t\tid: \"scale\",\n\t\t\tscale: vec2(...args),\n\t\t\tscaleTo(...args: Vec2Args) {\n\t\t\t\tthis.scale = vec2(...args)\n\t\t\t},\n\t\t\tscaleBy(...args: Vec2Args) {\n\t\t\t\tthis.scale.scale(vec2(...args))\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `(${toFixed(this.scale.x, 2)}, ${toFixed(this.scale.y, 2)})`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction rotate(r: number): RotateComp {\n\t\treturn {\n\t\t\tid: \"rotate\",\n\t\t\tangle: r ?? 0,\n\t\t\trotateBy(angle: number) {\n\t\t\t\tthis.angle += angle\n\t\t\t},\n\t\t\trotateTo(angle: number) {\n\t\t\t\tthis.angle = angle\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `${Math.round(this.angle)}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction color(...args): ColorComp {\n\t\treturn {\n\t\t\tid: \"color\",\n\t\t\tcolor: rgb(...args),\n\t\t\tinspect() {\n\t\t\t\treturn this.color.toString()\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction toFixed(n: number, f: number) {\n\t\treturn Number(n.toFixed(f))\n\t}\n\n\t// TODO: fadeIn here?\n\tfunction opacity(a: number): OpacityComp {\n\t\treturn {\n\t\t\tid: \"opacity\",\n\t\t\topacity: a ?? 1,\n\t\t\tinspect() {\n\t\t\t\treturn `${toFixed(this.opacity, 1)}`\n\t\t\t},\n\t\t\tfadeOut(time = 1, easeFunc = easings.linear): TweenController {\n\t\t\t\treturn tween(this.opacity, 0, time, (a) => this.opacity = a, easeFunc)\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction anchor(o: Anchor | Vec2): AnchorComp {\n\t\tif (!o) {\n\t\t\tthrow new KaboomError(\"Please define an anchor\")\n\t\t}\n\t\treturn {\n\t\t\tid: \"anchor\",\n\t\t\tanchor: o,\n\t\t\tinspect() {\n\t\t\t\tif (typeof this.anchor === \"string\") {\n\t\t\t\t\treturn this.anchor\n\t\t\t\t} else {\n\t\t\t\t\treturn this.anchor.toString()\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction z(z: number): ZComp {\n\t\treturn {\n\t\t\tid: \"z\",\n\t\t\tz: z,\n\t\t\tinspect() {\n\t\t\t\treturn `${this.z}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction follow(obj: GameObj, offset?: Vec2): FollowComp {\n\t\treturn {\n\t\t\tid: \"follow\",\n\t\t\trequire: [ \"pos\" ],\n\t\t\tfollow: {\n\t\t\t\tobj: obj,\n\t\t\t\toffset: offset ?? vec2(0),\n\t\t\t},\n\t\t\tadd(this: GameObj<FollowComp | PosComp>) {\n\t\t\t\tif (obj.exists()) {\n\t\t\t\t\tthis.pos = this.follow.obj.pos.add(this.follow.offset)\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate(this: GameObj<FollowComp | PosComp>) {\n\t\t\t\tif (obj.exists()) {\n\t\t\t\t\tthis.pos = this.follow.obj.pos.add(this.follow.offset)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction move(dir: number | Vec2, speed: number): EmptyComp {\n\t\tconst d = typeof dir === \"number\" ? Vec2.fromAngle(dir) : dir.unit()\n\t\treturn {\n\t\t\tid: \"move\",\n\t\t\trequire: [ \"pos\" ],\n\t\t\tupdate(this: GameObj<PosComp>) {\n\t\t\t\tthis.move(d.scale(speed))\n\t\t\t},\n\t\t}\n\t}\n\n\tconst DEF_OFFSCREEN_DIS = 200\n\n\tfunction offscreen(opt: OffScreenCompOpt = {}): OffScreenComp {\n\t\tconst distance = opt.distance ?? DEF_OFFSCREEN_DIS\n\t\tlet isOut = false\n\t\treturn {\n\t\t\tid: \"offscreen\",\n\t\t\trequire: [ \"pos\" ],\n\t\t\tisOffScreen(this: GameObj<PosComp>): boolean {\n\t\t\t\tconst pos = this.screenPos()\n\t\t\t\tconst screenRect = new Rect(vec2(0), width(), height())\n\t\t\t\treturn !testRectPoint(screenRect, pos)\n\t\t\t\t\t&& screenRect.sdistToPoint(pos) > distance * distance\n\t\t\t},\n\t\t\tonExitScreen(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"exitView\", action)\n\t\t\t},\n\t\t\tonEnterScreen(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"enterView\", action)\n\t\t\t},\n\t\t\tupdate(this: GameObj) {\n\t\t\t\tif (this.isOffScreen()) {\n\t\t\t\t\tif (!isOut) {\n\t\t\t\t\t\tthis.trigger(\"exitView\")\n\t\t\t\t\t\tisOut = true\n\t\t\t\t\t}\n\t\t\t\t\tif (opt.hide) this.hidden = true\n\t\t\t\t\tif (opt.pause) this.paused = true\n\t\t\t\t\tif (opt.destroy) this.destroy()\n\t\t\t\t} else {\n\t\t\t\t\tif (isOut) {\n\t\t\t\t\t\tthis.trigger(\"enterView\")\n\t\t\t\t\t\tisOut = false\n\t\t\t\t\t}\n\t\t\t\t\tif (opt.hide) this.hidden = false\n\t\t\t\t\tif (opt.pause) this.paused = false\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction isFixed(obj: GameObj) {\n\t\tif (obj.fixed) return true\n\t\treturn obj.parent ? isFixed(obj.parent) : false\n\t}\n\n\tfunction area(opt: AreaCompOpt = {}): AreaComp {\n\n\t\tconst colliding = {}\n\t\tconst collidingThisFrame = new Set()\n\n\t\treturn {\n\n\t\t\tid: \"area\",\n\t\t\tcollisionIgnore: opt.collisionIgnore ?? [],\n\n\t\t\tadd(this: GameObj<AreaComp>) {\n\n\t\t\t\tif (this.area.cursor) {\n\t\t\t\t\tthis.onHover(() => app.setCursor(this.area.cursor))\n\t\t\t\t}\n\n\t\t\t\tthis.onCollideUpdate((obj, col) => {\n\t\t\t\t\tif (!colliding[obj.id]) {\n\t\t\t\t\t\tthis.trigger(\"collide\", obj, col)\n\t\t\t\t\t}\n\t\t\t\t\tcolliding[obj.id] = col\n\t\t\t\t\tcollidingThisFrame.add(obj.id)\n\t\t\t\t})\n\n\t\t\t},\n\n\t\t\tupdate(this: GameObj<AreaComp>) {\n\t\t\t\tfor (const id in colliding) {\n\t\t\t\t\tif (!collidingThisFrame.has(Number(id))) {\n\t\t\t\t\t\tthis.trigger(\"collideEnd\", colliding[id].target)\n\t\t\t\t\t\tdelete colliding[id]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcollidingThisFrame.clear()\n\t\t\t},\n\n\t\t\tdrawInspect(this: GameObj<AreaComp | AnchorComp | FixedComp>) {\n\n\t\t\t\tconst a = this.localArea()\n\n\t\t\t\tpushTransform()\n\t\t\t\tpushScale(this.area.scale)\n\t\t\t\tpushTranslate(this.area.offset)\n\n\t\t\t\tconst opts = {\n\t\t\t\t\toutline: {\n\t\t\t\t\t\twidth: 4 / getViewportScale(),\n\t\t\t\t\t\tcolor: rgb(0, 0, 255),\n\t\t\t\t\t},\n\t\t\t\t\tanchor: this.anchor,\n\t\t\t\t\tfill: false,\n\t\t\t\t\tfixed: isFixed(this),\n\t\t\t\t}\n\n\t\t\t\tif (a instanceof Rect) {\n\t\t\t\t\tdrawRect({\n\t\t\t\t\t\t...opts,\n\t\t\t\t\t\tpos: a.pos,\n\t\t\t\t\t\twidth: a.width,\n\t\t\t\t\t\theight: a.height,\n\t\t\t\t\t})\n\t\t\t\t} else if (a instanceof Polygon) {\n\t\t\t\t\tdrawPolygon({\n\t\t\t\t\t\t...opts,\n\t\t\t\t\t\tpts: a.pts,\n\t\t\t\t\t})\n\t\t\t\t} else if (a instanceof Circle) {\n\t\t\t\t\tdrawCircle({\n\t\t\t\t\t\t...opts,\n\t\t\t\t\t\tpos: a.center,\n\t\t\t\t\t\tradius: a.radius,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tpopTransform()\n\n\t\t\t},\n\n\t\t\tarea: {\n\t\t\t\tshape: opt.shape ?? null,\n\t\t\t\tscale: opt.scale ? vec2(opt.scale) : vec2(1),\n\t\t\t\toffset: opt.offset ?? vec2(0),\n\t\t\t\tcursor: opt.cursor ?? null,\n\t\t\t},\n\n\t\t\tisClicked(): boolean {\n\t\t\t\treturn app.isMousePressed() && this.isHovering()\n\t\t\t},\n\n\t\t\tisHovering(this: GameObj) {\n\t\t\t\tconst mpos = isFixed(this) ? mousePos() : toWorld(mousePos())\n\t\t\t\treturn this.hasPoint(mpos)\n\t\t\t},\n\n\t\t\tcheckCollision(this: GameObj, other: GameObj<AreaComp>) {\n\t\t\t\treturn colliding[other.id] ?? null\n\t\t\t},\n\n\t\t\tgetCollisions() {\n\t\t\t\treturn Object.values(colliding)\n\t\t\t},\n\n\t\t\tisColliding(other: GameObj<AreaComp>) {\n\t\t\t\treturn Boolean(colliding[other.id])\n\t\t\t},\n\n\t\t\tisOverlapping(other) {\n\t\t\t\tconst col = colliding[other.id]\n\t\t\t\treturn col && col.hasOverlap()\n\t\t\t},\n\n\t\t\tonClick(this: GameObj<AreaComp>, f: () => void): EventController {\n\t\t\t\tconst e = app.onMousePress(\"left\", () => {\n\t\t\t\t\tif (this.isHovering()) {\n\t\t\t\t\t\tf()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.onDestroy(() => e.cancel())\n\t\t\t\treturn e\n\t\t\t},\n\n\t\t\tonHover(this: GameObj, action: () => void): EventController {\n\t\t\t\tlet hovering = false\n\t\t\t\treturn this.onUpdate(() => {\n\t\t\t\t\tif (!hovering) {\n\t\t\t\t\t\tif (this.isHovering()) {\n\t\t\t\t\t\t\thovering = true\n\t\t\t\t\t\t\taction()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\thovering = this.isHovering()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tonHoverUpdate(this: GameObj, onHover: () => void): EventController {\n\t\t\t\treturn this.onUpdate(() => {\n\t\t\t\t\tif (this.isHovering()) {\n\t\t\t\t\t\tonHover()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tonHoverEnd(this: GameObj, action: () => void): EventController {\n\t\t\t\tlet hovering = false\n\t\t\t\treturn this.onUpdate(() => {\n\t\t\t\t\tif (hovering) {\n\t\t\t\t\t\tif (!this.isHovering()) {\n\t\t\t\t\t\t\thovering = false\n\t\t\t\t\t\t\taction()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\thovering = this.isHovering()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tonCollide(\n\t\t\t\tthis: GameObj,\n\t\t\t\ttag: Tag | ((obj: GameObj, col?: Collision) => void),\n\t\t\t\tcb?: (obj: GameObj, col?: Collision) => void,\n\t\t\t): EventController {\n\t\t\t\tif (typeof tag === \"function\" && cb === undefined) {\n\t\t\t\t\treturn this.on(\"collide\", tag)\n\t\t\t\t} else if (typeof tag === \"string\") {\n\t\t\t\t\treturn this.onCollide((obj, col) => {\n\t\t\t\t\t\tif (obj.is(tag)) {\n\t\t\t\t\t\t\tcb(obj, col)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonCollideUpdate(\n\t\t\t\tthis: GameObj<AreaComp>,\n\t\t\t\ttag: Tag | ((obj: GameObj, col?: Collision) => void),\n\t\t\t\tcb?: (obj: GameObj, col?: Collision) => void,\n\t\t\t): EventController {\n\t\t\t\tif (typeof tag === \"function\" && cb === undefined) {\n\t\t\t\t\treturn this.on(\"collideUpdate\", tag)\n\t\t\t\t} else if (typeof tag === \"string\") {\n\t\t\t\t\treturn this.on(\"collideUpdate\", (obj, col) => obj.is(tag) && cb(obj, col))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonCollideEnd(\n\t\t\t\tthis: GameObj<AreaComp>,\n\t\t\t\ttag: Tag | ((obj: GameObj) => void),\n\t\t\t\tcb?: (obj: GameObj) => void,\n\t\t\t): EventController {\n\t\t\t\tif (typeof tag === \"function\" && cb === undefined) {\n\t\t\t\t\treturn this.on(\"collideEnd\", tag)\n\t\t\t\t} else if (typeof tag === \"string\") {\n\t\t\t\t\treturn this.on(\"collideEnd\", (obj) => obj.is(tag) && cb(obj))\n\t\t\t\t}\n\t\t\t},\n\n\t\t\thasPoint(pt: Vec2): boolean {\n\t\t\t\t// TODO: convert to pt to local space instead\n\t\t\t\treturn testPolygonPoint(this.worldArea(), pt)\n\t\t\t},\n\n\t\t\t// push an obj out of another if they're overlapped\n\t\t\tresolveCollision(this: GameObj<AreaComp | PosComp>, obj: GameObj<AreaComp>) {\n\t\t\t\tconst col = this.checkCollision(obj)\n\t\t\t\tif (col && !col.resolved) {\n\t\t\t\t\tthis.pos = this.pos.add(col.displacement)\n\t\t\t\t\tcol.resolved = true\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tlocalArea(this: GameObj<AreaComp | { renderArea(): Shape }>): Shape {\n\t\t\t\treturn this.area.shape\n\t\t\t\t\t? this.area.shape\n\t\t\t\t\t: this.renderArea()\n\t\t\t},\n\n\t\t\t// TODO: cache\n\t\t\tworldArea(this: GameObj<AreaComp | AnchorComp>): Polygon {\n\n\t\t\t\tconst localArea = this.localArea()\n\n\t\t\t\tif (!(localArea instanceof Polygon || localArea instanceof Rect)) {\n\t\t\t\t\tthrow new KaboomError(\"Only support polygon and rect shapes for now\")\n\t\t\t\t}\n\n\t\t\t\tconst transform = this.transform\n\t\t\t\t\t.clone()\n\t\t\t\t\t.scale(vec2(this.area.scale ?? 1))\n\t\t\t\t\t.translate(this.area.offset)\n\n\t\t\t\tif (localArea instanceof Rect) {\n\t\t\t\t\tconst offset = anchorPt(this.anchor || DEF_ANCHOR)\n\t\t\t\t\t\t.add(1, 1)\n\t\t\t\t\t\t.scale(-0.5)\n\t\t\t\t\t\t.scale(localArea.width, localArea.height)\n\t\t\t\t\ttransform.translate(offset)\n\t\t\t\t}\n\n\t\t\t\treturn localArea.transform(transform) as Polygon\n\n\t\t\t},\n\n\t\t\tscreenArea(this: GameObj<AreaComp | FixedComp>): Polygon {\n\t\t\t\tconst area = this.worldArea()\n\t\t\t\tif (isFixed(this)) {\n\t\t\t\t\treturn area\n\t\t\t\t} else {\n\t\t\t\t\treturn area.transform(game.cam.transform)\n\t\t\t\t}\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction getRenderProps(obj: GameObj<any>) {\n\t\treturn {\n\t\t\tcolor: obj.color,\n\t\t\topacity: obj.opacity,\n\t\t\tanchor: obj.anchor,\n\t\t\toutline: obj.outline,\n\t\t\tshader: obj.shader,\n\t\t\tuniform: obj.uniform,\n\t\t}\n\t}\n\n\t// TODO: clean\n\tfunction sprite(\n\t\tsrc: string | SpriteData | Asset<SpriteData>,\n\t\topt: SpriteCompOpt = {},\n\t): SpriteComp {\n\n\t\tlet spriteData: SpriteData | null = null\n\t\tlet curAnim: SpriteCurAnim | null = null\n\t\t// 1  - from small index to large index\n\t\t// -1 - reverse\n\t\tlet curAnimDir: -1 | 1 | null = null\n\t\tconst spriteLoadedEvent = new Event<[SpriteData]>()\n\n\t\tif (!src) {\n\t\t\tthrow new KaboomError(\"Please pass the resource name or data to sprite()\")\n\t\t}\n\n\t\tconst calcTexScale = (tex: Texture, q: Quad, w?: number, h?: number): Vec2 => {\n\t\t\tconst scale = vec2(1, 1)\n\t\t\tif (w && h) {\n\t\t\t\tscale.x = w / (tex.width * q.w)\n\t\t\t\tscale.y = h / (tex.height * q.h)\n\t\t\t} else if (w) {\n\t\t\t\tscale.x = w / (tex.width * q.w)\n\t\t\t\tscale.y = scale.x\n\t\t\t} else if (h) {\n\t\t\t\tscale.y = h / (tex.height * q.h)\n\t\t\t\tscale.x = scale.y\n\t\t\t}\n\t\t\treturn scale\n\t\t}\n\n\t\treturn {\n\n\t\t\tid: \"sprite\",\n\t\t\t// TODO: allow update\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tframe: opt.frame || 0,\n\t\t\tquad: opt.quad || new Quad(0, 0, 1, 1),\n\t\t\tanimSpeed: opt.animSpeed ?? 1,\n\t\t\tflipX: opt.flipX ?? false,\n\t\t\tflipY: opt.flipY ?? false,\n\n\t\t\tdraw(this: GameObj<SpriteComp>) {\n\n\t\t\t\tif (!spriteData) return\n\n\t\t\t\tconst q = spriteData.frames[this.frame ?? 0]\n\n\t\t\t\tif (!q) {\n\t\t\t\t\tthrow new KaboomError(`Frame not found: ${this.frame ?? 0}`)\n\t\t\t\t}\n\n\t\t\t\tif (spriteData.slice9) {\n\t\t\t\t\t// TODO: tile\n\t\t\t\t\t// TODO: use scale or width / height, or both?\n\t\t\t\t\tconst { left, right, top, bottom } = spriteData.slice9\n\t\t\t\t\tconst tw = spriteData.tex.width * q.w\n\t\t\t\t\tconst th = spriteData.tex.height * q.h\n\t\t\t\t\tconst iw = this.width - left - right\n\t\t\t\t\tconst ih = this.height - top - bottom\n\t\t\t\t\tconst w1 = left / tw\n\t\t\t\t\tconst w3 = right / tw\n\t\t\t\t\tconst w2 = 1 - w1 - w3\n\t\t\t\t\tconst h1 = top / th\n\t\t\t\t\tconst h3 = bottom / th\n\t\t\t\t\tconst h2 = 1 - h1 - h3\n\t\t\t\t\tconst quads = [\n\t\t\t\t\t\t// uv\n\t\t\t\t\t\tquad(0,       0,       w1, h1),\n\t\t\t\t\t\tquad(w1,      0,       w2, h1),\n\t\t\t\t\t\tquad(w1 + w2, 0,       w3, h1),\n\t\t\t\t\t\tquad(0,       h1,      w1, h2),\n\t\t\t\t\t\tquad(w1,      h1,      w2, h2),\n\t\t\t\t\t\tquad(w1 + w2, h1,      w3, h2),\n\t\t\t\t\t\tquad(0,       h1 + h2, w1, h3),\n\t\t\t\t\t\tquad(w1,      h1 + h2, w2, h3),\n\t\t\t\t\t\tquad(w1 + w2, h1 + h2, w3, h3),\n\t\t\t\t\t\t// transform\n\t\t\t\t\t\tquad(0,         0,        left,  top),\n\t\t\t\t\t\tquad(left,      0,        iw,    top),\n\t\t\t\t\t\tquad(left + iw, 0,        right, top),\n\t\t\t\t\t\tquad(0,         top,      left,  ih),\n\t\t\t\t\t\tquad(left,      top,      iw,    ih),\n\t\t\t\t\t\tquad(left + iw, top,      right, ih),\n\t\t\t\t\t\tquad(0,         top + ih, left,  bottom),\n\t\t\t\t\t\tquad(left,      top + ih, iw,    bottom),\n\t\t\t\t\t\tquad(left + iw, top + ih, right, bottom),\n\t\t\t\t\t]\n\t\t\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\t\t\tconst uv = quads[i]\n\t\t\t\t\t\tconst transform = quads[i + 9]\n\t\t\t\t\t\tdrawTexture(Object.assign(getRenderProps(this), {\n\t\t\t\t\t\t\tpos: transform.pos(),\n\t\t\t\t\t\t\ttex: spriteData.tex,\n\t\t\t\t\t\t\tquad: q.scale(uv),\n\t\t\t\t\t\t\tflipX: this.flipX,\n\t\t\t\t\t\t\tflipY: this.flipY,\n\t\t\t\t\t\t\ttiled: opt.tiled,\n\t\t\t\t\t\t\twidth: transform.w,\n\t\t\t\t\t\t\theight: transform.h,\n\t\t\t\t\t\t}))\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tdrawTexture(Object.assign(getRenderProps(this), {\n\t\t\t\t\t\ttex: spriteData.tex,\n\t\t\t\t\t\tquad: q.scale(this.quad ?? new Quad(0, 0, 1, 1)),\n\t\t\t\t\t\tflipX: this.flipX,\n\t\t\t\t\t\tflipY: this.flipY,\n\t\t\t\t\t\ttiled: opt.tiled,\n\t\t\t\t\t\twidth: this.width,\n\t\t\t\t\t\theight: this.height,\n\t\t\t\t\t}))\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tadd(this: GameObj<SpriteComp>) {\n\n\t\t\t\tconst setSpriteData = (spr) => {\n\n\t\t\t\t\tlet q = spr.frames[0].clone()\n\n\t\t\t\t\tif (opt.quad) {\n\t\t\t\t\t\tq = q.scale(opt.quad)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst scale = calcTexScale(spr.tex, q, opt.width, opt.height)\n\n\t\t\t\t\tthis.width = spr.tex.width * q.w * scale.x\n\t\t\t\t\tthis.height = spr.tex.height * q.h * scale.y\n\n\t\t\t\t\tif (opt.anim) {\n\t\t\t\t\t\tthis.play(opt.anim)\n\t\t\t\t\t}\n\n\t\t\t\t\tspriteData = spr\n\t\t\t\t\tspriteLoadedEvent.trigger(spriteData)\n\n\t\t\t\t}\n\n\t\t\t\tconst spr = resolveSprite(src)\n\n\t\t\t\tif (spr) {\n\t\t\t\t\tspr.onLoad(setSpriteData)\n\t\t\t\t} else {\n\t\t\t\t\tonLoad(() => setSpriteData(resolveSprite(src).data))\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tupdate(this: GameObj<SpriteComp>) {\n\n\t\t\t\tif (!curAnim) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst anim = spriteData.anims[curAnim.name]\n\n\t\t\t\tif (typeof anim === \"number\") {\n\t\t\t\t\tthis.frame = anim\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (anim.speed === 0) {\n\t\t\t\t\tthrow new KaboomError(\"Sprite anim speed cannot be 0\")\n\t\t\t\t}\n\n\t\t\t\tcurAnim.timer += dt() * this.animSpeed\n\n\t\t\t\tif (curAnim.timer >= (1 / curAnim.speed)) {\n\n\t\t\t\t\tcurAnim.timer = 0\n\t\t\t\t\tthis.frame += curAnimDir\n\n\t\t\t\t\tif (this.frame < Math.min(anim.from, anim.to) ||\n\t\t\t\t\t\tthis.frame > Math.max(anim.from, anim.to)) {\n\t\t\t\t\t\tif (curAnim.loop) {\n\t\t\t\t\t\t\tif (curAnim.pingpong) {\n\t\t\t\t\t\t\t\tthis.frame -= curAnimDir\n\t\t\t\t\t\t\t\tcurAnimDir *= -1\n\t\t\t\t\t\t\t\tthis.frame += curAnimDir\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.frame = anim.from\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.frame = anim.to\n\t\t\t\t\t\t\tcurAnim.onEnd()\n\t\t\t\t\t\t\tthis.stop()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tplay(this: GameObj<SpriteComp>, name: string, opt: SpriteAnimPlayOpt = {}) {\n\n\t\t\t\tif (!spriteData) {\n\t\t\t\t\tspriteLoadedEvent.add(() => this.play(name, opt))\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst anim = spriteData.anims[name]\n\n\t\t\t\tif (anim === undefined) {\n\t\t\t\t\tthrow new KaboomError(`Anim not found: ${name}`)\n\t\t\t\t}\n\n\t\t\t\tif (curAnim) {\n\t\t\t\t\tthis.stop()\n\t\t\t\t}\n\n\t\t\t\tcurAnim = typeof anim === \"number\"\n\t\t\t\t\t? {\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\ttimer: 0,\n\t\t\t\t\t\tloop: false,\n\t\t\t\t\t\tpingpong: false,\n\t\t\t\t\t\tspeed: 0,\n\t\t\t\t\t\tonEnd: () => {},\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\ttimer: 0,\n\t\t\t\t\t\tloop: opt.loop ?? anim.loop ?? false,\n\t\t\t\t\t\tpingpong: opt.pingpong ?? anim.pingpong ?? false,\n\t\t\t\t\t\tspeed: opt.speed ?? anim.speed ?? 10,\n\t\t\t\t\t\tonEnd: opt.onEnd ?? (() => {}),\n\t\t\t\t\t}\n\n\t\t\t\tcurAnimDir = typeof anim === \"number\"\n\t\t\t\t\t? null\n\t\t\t\t\t: anim.from < anim.to ? 1 : -1\n\n\t\t\t\tthis.frame = typeof anim === \"number\"\n\t\t\t\t\t? anim\n\t\t\t\t\t: anim.from\n\n\t\t\t\tthis.trigger(\"animStart\", name)\n\n\t\t\t},\n\n\t\t\tstop(this: GameObj<SpriteComp>) {\n\t\t\t\tif (!curAnim) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst prevAnim = curAnim.name\n\t\t\t\tcurAnim = null\n\t\t\t\tthis.trigger(\"animEnd\", prevAnim)\n\t\t\t},\n\n\t\t\tnumFrames() {\n\t\t\t\treturn spriteData?.frames.length ?? 0\n\t\t\t},\n\n\t\t\tcurAnim() {\n\t\t\t\treturn curAnim?.name\n\t\t\t},\n\n\t\t\tonAnimEnd(\n\t\t\t\tthis: GameObj<SpriteComp>,\n\t\t\t\taction: (name: string) => void,\n\t\t\t): EventController {\n\t\t\t\treturn this.on(\"animEnd\", action)\n\t\t\t},\n\n\t\t\tonAnimStart(\n\t\t\t\tthis: GameObj<SpriteComp>,\n\t\t\t\taction: (name: string) => void,\n\t\t\t): EventController {\n\t\t\t\treturn this.on(\"animStart\", action)\n\t\t\t},\n\n\t\t\trenderArea() {\n\t\t\t\treturn new Rect(vec2(0), this.width, this.height)\n\t\t\t},\n\n\t\t\tinspect() {\n\t\t\t\tif (typeof src === \"string\") {\n\t\t\t\t\treturn `\"${src}\"`\n\t\t\t\t}\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction text(t: string, opt: TextCompOpt = {}): TextComp {\n\n\t\tfunction update(obj: GameObj<TextComp | any>) {\n\n\t\t\tconst ftext = formatText(Object.assign(getRenderProps(obj), {\n\t\t\t\ttext: obj.text + \"\",\n\t\t\t\tsize: obj.textSize,\n\t\t\t\tfont: obj.font,\n\t\t\t\twidth: opt.width && obj.width,\n\t\t\t\talign: obj.align,\n\t\t\t\tletterSpacing: obj.letterSpacing,\n\t\t\t\tlineSpacing: obj.lineSpacing,\n\t\t\t\t// TODO: shouldn't run when object / ancestor is paused\n\t\t\t\ttransform: obj.textTransform,\n\t\t\t\tstyles: obj.textStyles,\n\t\t\t}))\n\n\t\t\tif (!opt.width) {\n\t\t\t\tobj.width = ftext.width / (obj.scale?.x || 1)\n\t\t\t}\n\n\t\t\tobj.height = ftext.height / (obj.scale?.y || 1)\n\n\t\t\treturn ftext\n\n\t\t}\n\n\t\tconst obj = {\n\n\t\t\tid: \"text\",\n\t\t\tset text(nt) {\n\t\t\t\tt = nt\n\t\t\t\t// @ts-ignore\n\t\t\t\tupdate(this)\n\t\t\t},\n\t\t\tget text() {\n\t\t\t\treturn t\n\t\t\t},\n\t\t\ttextSize: opt.size ?? DEF_TEXT_SIZE,\n\t\t\tfont: opt.font,\n\t\t\twidth: opt.width ?? 0,\n\t\t\theight: 0,\n\t\t\talign: opt.align,\n\t\t\tlineSpacing: opt.lineSpacing,\n\t\t\tletterSpacing: opt.letterSpacing,\n\t\t\ttextTransform: opt.transform,\n\t\t\ttextStyles: opt.styles,\n\n\t\t\tadd(this: GameObj<TextComp>) {\n\t\t\t\tonLoad(() => update(this))\n\t\t\t},\n\n\t\t\tdraw(this: GameObj<TextComp>) {\n\t\t\t\tdrawFormattedText(update(this))\n\t\t\t},\n\n\t\t\trenderArea() {\n\t\t\t\treturn new Rect(vec2(0), this.width, this.height)\n\t\t\t},\n\n\t\t}\n\n\t\t// @ts-ignore\n\t\tupdate(obj)\n\n\t\treturn obj\n\n\t}\n\n\tfunction rect(w: number, h: number, opt: RectCompOpt = {}): RectComp {\n\t\treturn {\n\t\t\tid: \"rect\",\n\t\t\twidth: w,\n\t\t\theight: h,\n\t\t\tradius: opt.radius || 0,\n\t\t\tdraw(this: GameObj<RectComp>) {\n\t\t\t\tdrawRect(Object.assign(getRenderProps(this), {\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\tradius: this.radius,\n\t\t\t\t}))\n\t\t\t},\n\t\t\trenderArea() {\n\t\t\t\treturn new Rect(vec2(0), this.width, this.height)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `${Math.ceil(this.width)}, ${Math.ceil(this.height)}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction uvquad(w: number, h: number): UVQuadComp {\n\t\treturn {\n\t\t\tid: \"rect\",\n\t\t\twidth: w,\n\t\t\theight: h,\n\t\t\tdraw(this: GameObj<UVQuadComp>) {\n\t\t\t\tdrawUVQuad(Object.assign(getRenderProps(this), {\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\theight: this.height,\n\t\t\t\t}))\n\t\t\t},\n\t\t\trenderArea() {\n\t\t\t\treturn new Rect(vec2(0), this.width, this.height)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `${Math.ceil(this.width)}, ${Math.ceil(this.height)}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction circle(radius: number): CircleComp {\n\t\treturn {\n\t\t\tid: \"circle\",\n\t\t\tradius: radius,\n\t\t\tdraw(this: GameObj<CircleComp>) {\n\t\t\t\tdrawCircle(Object.assign(getRenderProps(this), {\n\t\t\t\t\tradius: this.radius,\n\t\t\t\t}))\n\t\t\t},\n\t\t\trenderArea(this: GameObj<AnchorComp | CircleComp>) {\n\t\t\t\treturn new Rect(new Vec2(this.anchor ? 0 : -this.radius), this.radius * 2, this.radius * 2)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `${Math.ceil(this.radius)}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction outline(width: number = 1, color: Color = rgb(0, 0, 0)): OutlineComp {\n\t\treturn {\n\t\t\tid: \"outline\",\n\t\t\toutline: {\n\t\t\t\twidth,\n\t\t\t\tcolor,\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction timer(): TimerComp {\n\t\treturn {\n\t\t\tid: \"timer\",\n\t\t\twait(this: GameObj<TimerComp>, time: number, action?: () => void): TimerController {\n\t\t\t\tconst actions = []\n\t\t\t\tif (action) actions.push(action)\n\t\t\t\tlet t = 0\n\t\t\t\tconst ev = this.onUpdate(() => {\n\t\t\t\t\tt += dt()\n\t\t\t\t\tif (t >= time) {\n\t\t\t\t\t\tactions.forEach((f) => f())\n\t\t\t\t\t\tev.cancel()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tget paused() {\n\t\t\t\t\t\treturn ev.paused\n\t\t\t\t\t},\n\t\t\t\t\tset paused(p) {\n\t\t\t\t\t\tev.paused = p\n\t\t\t\t\t},\n\t\t\t\t\tcancel: ev.cancel,\n\t\t\t\t\tonEnd(action) {\n\t\t\t\t\t\tactions.push(action)\n\t\t\t\t\t},\n\t\t\t\t\tthen(action) {\n\t\t\t\t\t\tthis.onEnd(action)\n\t\t\t\t\t\treturn this\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t\tloop(t: number, action: () => void): EventController {\n\t\t\t\tlet curTimer: null | TimerController = null\n\t\t\t\tconst newAction = () => {\n\t\t\t\t\t// TODO: should f be execute right away as loop() is called?\n\t\t\t\t\tcurTimer = this.wait(t, newAction)\n\t\t\t\t\taction()\n\t\t\t\t}\n\t\t\t\tcurTimer = this.wait(0, newAction)\n\t\t\t\treturn {\n\t\t\t\t\tget paused() {\n\t\t\t\t\t\treturn curTimer.paused\n\t\t\t\t\t},\n\t\t\t\t\tset paused(p) {\n\t\t\t\t\t\tcurTimer.paused = p\n\t\t\t\t\t},\n\t\t\t\t\tcancel: () => curTimer.cancel(),\n\t\t\t\t}\n\t\t\t},\n\t\t\ttween<V extends LerpValue>(\n\t\t\t\tthis: GameObj<TimerComp>,\n\t\t\t\tfrom: V,\n\t\t\t\tto: V,\n\t\t\t\tduration: number,\n\t\t\t\tsetValue: (value: V) => void,\n\t\t\t\teaseFunc = easings.linear,\n\t\t\t) {\n\t\t\t\tlet curTime = 0\n\t\t\t\tconst onEndEvents: Array<() => void> = []\n\t\t\t\tconst ev = this.onUpdate(() => {\n\t\t\t\t\tcurTime += dt()\n\t\t\t\t\tconst t = Math.min(curTime / duration, 1)\n\t\t\t\t\tsetValue(lerp(from, to, easeFunc(t)))\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\tev.cancel()\n\t\t\t\t\t\tsetValue(to)\n\t\t\t\t\t\tonEndEvents.forEach((action) => action())\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tget paused() {\n\t\t\t\t\t\treturn ev.paused\n\t\t\t\t\t},\n\t\t\t\t\tset paused(p) {\n\t\t\t\t\t\tev.paused = p\n\t\t\t\t\t},\n\t\t\t\t\tonEnd(action: () => void) {\n\t\t\t\t\t\tonEndEvents.push(action)\n\t\t\t\t\t},\n\t\t\t\t\tthen(action: () => void) {\n\t\t\t\t\t\tthis.onEnd(action)\n\t\t\t\t\t\treturn this\n\t\t\t\t\t},\n\t\t\t\t\tcancel() {\n\t\t\t\t\t\tev.cancel()\n\t\t\t\t\t},\n\t\t\t\t\tfinish() {\n\t\t\t\t\t\tev.cancel()\n\t\t\t\t\t\tsetValue(to)\n\t\t\t\t\t\tonEndEvents.forEach((action) => action())\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\t// maximum y velocity with body()\n\tconst DEF_JUMP_FORCE = 640\n\tconst MAX_VEL = 65536\n\n\t// TODO: land on wall\n\tfunction body(opt: BodyCompOpt = {}): BodyComp {\n\n\t\tconst vel = vec2(0)\n\t\tlet curPlatform: GameObj<PosComp | AreaComp | BodyComp> | null = null\n\t\tlet lastPlatformPos = null\n\t\tlet wantFall = false\n\n\t\treturn {\n\n\t\t\tid: \"body\",\n\t\t\trequire: [ \"pos\", \"area\" ],\n\t\t\tjumpForce: opt.jumpForce ?? DEF_JUMP_FORCE,\n\t\t\tgravityScale: opt.gravityScale ?? 1,\n\t\t\tisStatic: opt.isStatic ?? false,\n\t\t\t// TODO: prefer density * area()\n\t\t\tmass: opt.mass ?? 1,\n\n\t\t\tadd(this: GameObj<PosComp | BodyComp | AreaComp>) {\n\n\t\t\t\tif (this.mass === 0) {\n\t\t\t\t\tthrow new KaboomError(\"Can't set body mass to 0\")\n\t\t\t\t}\n\n\t\t\t\t// static vs static: don't resolve\n\t\t\t\t// static vs non-static: always resolve non-static\n\t\t\t\t// non-static vs non-static: resolve the first one\n\t\t\t\tthis.onCollideUpdate((other: GameObj<PosComp | BodyComp>, col) => {\n\n\t\t\t\t\tif (!other.is(\"body\")) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (col.resolved) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.trigger(\"beforePhysicsResolve\", col)\n\t\t\t\t\tother.trigger(\"beforePhysicsResolve\", col.reverse())\n\n\t\t\t\t\t// user can mark 'resolved' in beforePhysicsResolve to stop a resolution\n\t\t\t\t\tif (col.resolved) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.isStatic && other.isStatic) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else if (!this.isStatic && !other.isStatic) {\n\t\t\t\t\t\t// TODO: update all children transform?\n\t\t\t\t\t\tconst tmass = this.mass + other.mass\n\t\t\t\t\t\tthis.pos = this.pos.add(col.displacement.scale(other.mass / tmass))\n\t\t\t\t\t\tother.pos = other.pos.add(col.displacement.scale(-this.mass / tmass))\n\t\t\t\t\t\tthis.transform = calcTransform(this)\n\t\t\t\t\t\tother.transform = calcTransform(other)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// if one is static and on is not, resolve the non static one\n\t\t\t\t\t\tconst col2 = (!this.isStatic && other.isStatic) ? col : col.reverse()\n\t\t\t\t\t\tcol2.source.pos = col2.source.pos.add(col2.displacement)\n\t\t\t\t\t\tcol2.source.transform = calcTransform(col2.source)\n\t\t\t\t\t}\n\n\t\t\t\t\tcol.resolved = true\n\t\t\t\t\tthis.trigger(\"physicsResolve\", col)\n\t\t\t\t\tother.trigger(\"physicsResolve\", col.reverse())\n\n\t\t\t\t})\n\n\t\t\t\tthis.onPhysicsResolve((col) => {\n\t\t\t\t\tif (game.gravity) {\n\t\t\t\t\t\tif (col.isBottom() && this.isFalling()) {\n\t\t\t\t\t\t\tvel.y = 0\n\t\t\t\t\t\t\tcurPlatform = col.target as GameObj<PosComp | BodyComp | AreaComp>\n\t\t\t\t\t\t\tlastPlatformPos = col.target.pos\n\t\t\t\t\t\t\tif (wantFall) {\n\t\t\t\t\t\t\t\twantFall = false\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.trigger(\"ground\", curPlatform)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (col.isTop() && this.isJumping()) {\n\t\t\t\t\t\t\tvel.y = 0\n\t\t\t\t\t\t\tthis.trigger(\"headbutt\", col.target)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t},\n\n\t\t\tupdate(this: GameObj<PosComp | BodyComp | AreaComp>) {\n\n\t\t\t\tif (!game.gravity) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (this.isStatic) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (wantFall) {\n\t\t\t\t\tcurPlatform = null\n\t\t\t\t\tlastPlatformPos = null\n\t\t\t\t\tthis.trigger(\"fallOff\")\n\t\t\t\t\twantFall = false\n\t\t\t\t}\n\n\t\t\t\tif (curPlatform) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.isOverlapping(curPlatform)\n\t\t\t\t\t\t|| !curPlatform.exists()\n\t\t\t\t\t\t|| !curPlatform.is(\"body\")\n\t\t\t\t\t) {\n\t\t\t\t\t\twantFall = true\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!curPlatform.pos.eq(lastPlatformPos)\n\t\t\t\t\t\t\t&& opt.stickToPlatform !== false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.moveBy(curPlatform.pos.sub(lastPlatformPos))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastPlatformPos = curPlatform.pos\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst prevVelY = vel.y\n\t\t\t\tvel.y += game.gravity * this.gravityScale * dt()\n\t\t\t\tvel.y = Math.min(vel.y, opt.maxVelocity ?? MAX_VEL)\n\t\t\t\tif (prevVelY < 0 && vel.y >= 0) {\n\t\t\t\t\tthis.trigger(\"fall\")\n\t\t\t\t}\n\t\t\t\tthis.move(vel)\n\n\t\t\t},\n\n\t\t\tonPhysicsResolve(this: GameObj, action) {\n\t\t\t\treturn this.on(\"physicsResolve\", action)\n\t\t\t},\n\n\t\t\tonBeforePhysicsResolve(this: GameObj, action) {\n\t\t\t\treturn this.on(\"beforePhysicsResolve\", action)\n\t\t\t},\n\n\t\t\tcurPlatform(): GameObj | null {\n\t\t\t\treturn curPlatform\n\t\t\t},\n\n\t\t\tisGrounded() {\n\t\t\t\treturn curPlatform !== null\n\t\t\t},\n\n\t\t\tisFalling(): boolean {\n\t\t\t\treturn vel.y > 0\n\t\t\t},\n\n\t\t\tisJumping(): boolean {\n\t\t\t\treturn vel.y < 0\n\t\t\t},\n\n\t\t\tjump(force: number) {\n\t\t\t\tcurPlatform = null\n\t\t\t\tlastPlatformPos = null\n\t\t\t\tvel.y = -force || -this.jumpForce\n\t\t\t},\n\n\t\t\tonGround(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"ground\", action)\n\t\t\t},\n\n\t\t\tonFall(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"fall\", action)\n\t\t\t},\n\n\t\t\tonFallOff(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"fallOff\", action)\n\t\t\t},\n\n\t\t\tonHeadbutt(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"headbutt\", action)\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction doubleJump(numJumps: number = 2): DoubleJumpComp {\n\t\tlet jumpsLeft = numJumps\n\t\treturn {\n\t\t\tid: \"doubleJump\",\n\t\t\trequire: [ \"body\" ],\n\t\t\tnumJumps: numJumps,\n\t\t\tadd(this: GameObj<BodyComp | DoubleJumpComp>) {\n\t\t\t\tthis.onGround(() => {\n\t\t\t\t\tjumpsLeft = this.numJumps\n\t\t\t\t})\n\t\t\t},\n\t\t\tdoubleJump(this: GameObj<BodyComp | DoubleJumpComp>, force?: number) {\n\t\t\t\tif (jumpsLeft <= 0) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (jumpsLeft < this.numJumps) {\n\t\t\t\t\tthis.trigger(\"doubleJump\")\n\t\t\t\t}\n\t\t\t\tjumpsLeft--\n\t\t\t\tthis.jump(force)\n\t\t\t},\n\t\t\tonDoubleJump(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"doubleJump\", action)\n\t\t\t},\n\t\t\tinspect(this: GameObj<BodyComp | DoubleJumpComp>) {\n\t\t\t\treturn `${jumpsLeft}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction shader(id: string, uniform?: Uniform | (() => Uniform)): ShaderComp {\n\t\treturn {\n\t\t\tid: \"shader\",\n\t\t\tshader: id,\n\t\t\t...(typeof uniform === \"function\" ? {\n\t\t\t\tuniform: uniform(),\n\t\t\t\tupdate() {\n\t\t\t\t\tthis.uniform = uniform()\n\t\t\t\t},\n\t\t\t} : {\n\t\t\t\tuniform: uniform,\n\t\t\t}),\n\t\t}\n\t}\n\n\t// TODO: all children should be fixed\n\tfunction fixed(): FixedComp {\n\t\treturn {\n\t\t\tid: \"fixed\",\n\t\t\tfixed: true,\n\t\t}\n\t}\n\n\tfunction stay(scenesToStay?: string[]): StayComp {\n\t\treturn {\n\t\t\tid: \"stay\",\n\t\t\tstay: true,\n\t\t\tscenesToStay: scenesToStay,\n\t\t}\n\t}\n\n\tfunction health(hp: number): HealthComp {\n\t\tif (hp == null) {\n\t\t\tthrow new KaboomError(\"health() requires the initial amount of hp\")\n\t\t}\n\t\tconst maxHP = hp\n\t\treturn {\n\t\t\tid: \"health\",\n\t\t\thurt(this: GameObj, n: number = 1) {\n\t\t\t\tthis.setHP(hp - n)\n\t\t\t\tthis.trigger(\"hurt\", n)\n\t\t\t},\n\t\t\theal(this: GameObj, n: number = 1) {\n\t\t\t\tthis.setHP(hp + n)\n\t\t\t\tthis.trigger(\"heal\", n)\n\t\t\t},\n\t\t\thp(): number {\n\t\t\t\treturn hp\n\t\t\t},\n\t\t\tmaxHP(): number {\n\t\t\t\treturn maxHP\n\t\t\t},\n\t\t\tsetHP(this: GameObj, n: number) {\n\t\t\t\thp = n\n\t\t\t\tif (hp <= 0) {\n\t\t\t\t\tthis.trigger(\"death\")\n\t\t\t\t}\n\t\t\t},\n\t\t\tonHurt(this: GameObj, action: (amount?: number) => void): EventController {\n\t\t\t\treturn this.on(\"hurt\", action)\n\t\t\t},\n\t\t\tonHeal(this: GameObj, action: (amount?: number) => void): EventController {\n\t\t\t\treturn this.on(\"heal\", action)\n\t\t\t},\n\t\t\tonDeath(this: GameObj, action: () => void): EventController {\n\t\t\t\treturn this.on(\"death\", action)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn `${hp}`\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction lifespan(time: number, opt: LifespanCompOpt = {}): EmptyComp {\n\t\tif (time == null) {\n\t\t\tthrow new KaboomError(\"lifespan() requires time\")\n\t\t}\n\t\tconst fade = opt.fade ?? 0\n\t\treturn {\n\t\t\tid: \"lifespan\",\n\t\t\tasync add(this: GameObj<OpacityComp>) {\n\t\t\t\tawait wait(time)\n\t\t\t\t// TODO: this secretively requires opacity comp, make opacity on every game obj?\n\t\t\t\tif (fade > 0 && this.opacity) {\n\t\t\t\t\tawait tween(this.opacity, 0, fade, (a) => this.opacity = a, easings.linear)\n\t\t\t\t}\n\t\t\t\tthis.destroy()\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction state(\n\t\tinitState: string,\n\t\tstateList?: string[],\n\t\ttransitions?: Record<string, string | string[]>,\n\t): StateComp {\n\n\t\tif (!initState) {\n\t\t\tthrow new KaboomError(\"state() requires an initial state\")\n\t\t}\n\n\t\tconst events = {}\n\n\t\tfunction initStateEvents(state: string) {\n\t\t\tif (!events[state]) {\n\t\t\t\tevents[state] = {\n\t\t\t\t\tenter: new Event(),\n\t\t\t\t\tend: new Event(),\n\t\t\t\t\tupdate: new Event(),\n\t\t\t\t\tdraw: new Event(),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction on(event, state, action) {\n\t\t\tinitStateEvents(state)\n\t\t\treturn events[state][event].add(action)\n\t\t}\n\n\t\tfunction trigger(event, state, ...args) {\n\t\t\tinitStateEvents(state)\n\t\t\tevents[state][event].trigger(...args)\n\t\t}\n\n\t\tlet didFirstEnter = false\n\n\t\treturn {\n\n\t\t\tid: \"state\",\n\t\t\tstate: initState,\n\n\t\t\tenterState(state: string, ...args) {\n\n\t\t\t\tdidFirstEnter = true\n\n\t\t\t\tif (stateList && !stateList.includes(state)) {\n\t\t\t\t\tthrow new KaboomError(`State not found: ${state}`)\n\t\t\t\t}\n\n\t\t\t\tconst oldState = this.state\n\n\t\t\t\tif (transitions) {\n\n\t\t\t\t\t// check if the transition is legal, if transition graph is defined\n\t\t\t\t\tif (!transitions?.[oldState]) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst available = typeof transitions[oldState] === \"string\"\n\t\t\t\t\t\t? [transitions[oldState]]\n\t\t\t\t\t\t: transitions[oldState] as string[]\n\n\t\t\t\t\tif (!available.includes(state)) {\n\t\t\t\t\t\tthrow new KaboomError(`Cannot transition state from \"${oldState}\" to \"${state}\". Available transitions: ${available.map((s) => `\"${s}\"`).join(\", \")}`)\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttrigger(\"end\", oldState, ...args)\n\t\t\t\tthis.state = state\n\t\t\t\ttrigger(\"enter\", state, ...args)\n\t\t\t\ttrigger(\"enter\", `${oldState} -> ${state}`, ...args)\n\n\t\t\t},\n\n\t\t\tonStateTransition(from: string, to: string, action: () => void): EventController {\n\t\t\t\treturn on(\"enter\", `${from} -> ${to}`, action)\n\t\t\t},\n\n\t\t\tonStateEnter(state: string, action: () => void): EventController {\n\t\t\t\treturn on(\"enter\", state, action)\n\t\t\t},\n\n\t\t\tonStateUpdate(state: string, action: () => void): EventController {\n\t\t\t\treturn on(\"update\", state, action)\n\t\t\t},\n\n\t\t\tonStateDraw(state: string, action: () => void): EventController {\n\t\t\t\treturn on(\"draw\", state, action)\n\t\t\t},\n\n\t\t\tonStateEnd(state: string, action: () => void): EventController {\n\t\t\t\treturn on(\"end\", state, action)\n\t\t\t},\n\n\t\t\tupdate() {\n\t\t\t\t// execute the enter event for initState\n\t\t\t\tif (!didFirstEnter) {\n\t\t\t\t\ttrigger(\"enter\", initState)\n\t\t\t\t\tdidFirstEnter = true\n\t\t\t\t}\n\t\t\t\ttrigger(\"update\", this.state)\n\t\t\t},\n\n\t\t\tdraw() {\n\t\t\t\ttrigger(\"draw\", this.state)\n\t\t\t},\n\n\t\t\tinspect() {\n\t\t\t\treturn this.state\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction fadeIn(time: number = 1): Comp {\n\t\tlet t = 0\n\t\tlet done = false\n\t\treturn {\n\t\t\trequire: [ \"opacity\" ],\n\t\t\tadd(this: GameObj<OpacityComp>) {\n\t\t\t\tthis.opacity = 0\n\t\t\t},\n\t\t\tupdate(this: GameObj<OpacityComp>) {\n\t\t\t\tif (done) return\n\t\t\t\tt += dt()\n\t\t\t\tthis.opacity = map(t, 0, time, 0, 1)\n\t\t\t\tif (t >= time) {\n\t\t\t\t\tthis.opacity = 1\n\t\t\t\t\tdone = true\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction mask(m: Mask = \"intersect\"): MaskComp {\n\t\treturn {\n\t\t\tid: \"mask\",\n\t\t\tmask: m,\n\t\t}\n\t}\n\n\tfunction onLoad(cb: () => void): void {\n\t\tif (assets.loaded) {\n\t\t\tcb()\n\t\t} else {\n\t\t\tgame.events.on(\"load\", cb)\n\t\t}\n\t}\n\n\tfunction scene(id: SceneName, def: SceneDef) {\n\t\tgame.scenes[id] = def\n\t}\n\n\tfunction go(name: SceneName, ...args) {\n\n\t\tif (!game.scenes[name]) {\n\t\t\tthrow new KaboomError(`Scene not found: ${name}`)\n\t\t}\n\n\t\tgame.events.onOnce(\"frameEnd\", () => {\n\n\t\t\tgame.events.trigger(\"sceneLeave\", name)\n\t\t\tapp.events.clear()\n\t\t\tgame.events.clear()\n\t\t\tgame.objEvents.clear()\n\n\t\t\t;[...game.root.children].forEach((obj) => {\n\t\t\t\tif (\n\t\t\t\t\t!obj.stay\n\t\t\t\t\t|| (obj.scenesToStay && !obj.scenesToStay.includes(name))\n\t\t\t\t) {\n\t\t\t\t\tgame.root.remove(obj)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tgame.root.clearEvents()\n\n\t\t\t// cam\n\t\t\tgame.cam = {\n\t\t\t\tpos: null,\n\t\t\t\tscale: vec2(1),\n\t\t\t\tangle: 0,\n\t\t\t\tshake: 0,\n\t\t\t\ttransform: new Mat4(),\n\t\t\t}\n\n\t\t\tgame.scenes[name](...args)\n\n\t\t\tif (gopt.debug !== false) {\n\t\t\t\tenterDebugMode()\n\t\t\t}\n\n\t\t\tif (gopt.burp) {\n\t\t\t\tenterBurpMode()\n\t\t\t}\n\n\t\t})\n\n\t}\n\n\tfunction onSceneLeave(action: (newScene?: string) => void): EventController {\n\t\treturn game.events.on(\"sceneLeave\", action)\n\t}\n\n\tfunction getData<T>(key: string, def?: T): T {\n\t\ttry {\n\t\t\treturn JSON.parse(window.localStorage[key])\n\t\t} catch {\n\t\t\tif (def) {\n\t\t\t\tsetData(key, def)\n\t\t\t\treturn def\n\t\t\t} else {\n\t\t\t\treturn null\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setData(key: string, data: any) {\n\t\twindow.localStorage[key] = JSON.stringify(data)\n\t}\n\n\tfunction plug<T extends Record<string, any>>(plugin: KaboomPlugin<T>, ...args: any): KaboomCtx & T {\n\t\tconst funcs = plugin(ctx)\n\t\tlet funcsObj: T\n\t\tif (typeof funcs === \"function\") {\n\t\t\tconst plugWithOptions = funcs(...args)\n\t\t\tfuncsObj = plugWithOptions(ctx)\n\t\t}\n\t\telse {\n\t\t\tfuncsObj = funcs\n\t\t}\n\t\tfor (const k in funcsObj) {\n\t\t\t// @ts-ignore\n\t\t\tctx[k] = funcsObj[k]\n\t\t\tif (gopt.global !== false) {\n\t\t\t\t// @ts-ignore\n\t\t\t\twindow[k] = funcsObj[k]\n\t\t\t}\n\t\t}\n\t\treturn ctx as KaboomCtx & T\n\t}\n\n\tfunction center(): Vec2 {\n\t\treturn vec2(width() / 2, height() / 2)\n\t}\n\n\tenum EdgeMask {\n\t\tNone = 0,\n\t\tLeft = 1,\n\t\tTop = 2,\n\t\tLeftTop = 3,\n\t\tRight = 4,\n\t\tHorizontal = 5,\n\t\tRightTop = 6,\n\t\tHorizontalTop = 7,\n\t\tBottom = 8,\n\t\tLeftBottom = 9,\n\t\tVertical = 10,\n\t\tLeftVertical = 11,\n\t\tRightBottom = 12,\n\t\tHorizontalBottom = 13,\n\t\tRightVertical = 14,\n\t\tAll = 15,\n\t}\n\n\tfunction tile(opts: TileCompOpt = {}): TileComp {\n\n\t\tlet tilePos = vec2(0)\n\t\tlet isObstacle = opts.isObstacle ?? false\n\t\tlet cost = opts.cost ?? 0\n\t\tlet edges = opts.edges ?? []\n\n\t\tconst getEdgeMask = () => {\n\t\t\tconst loopup = {\n\t\t\t\t\"left\": EdgeMask.Left,\n\t\t\t\t\"top\": EdgeMask.Top,\n\t\t\t\t\"right\": EdgeMask.Right,\n\t\t\t\t\"bottom\": EdgeMask.Bottom,\n\t\t\t}\n\t\t\treturn edges.map(s => loopup[s] || 0).reduce((mask, dir) => mask | dir, 0)\n\t\t}\n\n\t\tlet edgeMask = getEdgeMask()\n\n\t\treturn {\n\n\t\t\tid: \"tile\",\n\t\t\ttilePosOffset: opts.offset ?? vec2(0),\n\n\t\t\tset tilePos(p: Vec2) {\n\t\t\t\tconst level = this.getLevel()\n\t\t\t\ttilePos = p.clone()\n\t\t\t\t// @ts-ignore\n\t\t\t\tthis.pos = vec2(\n\t\t\t\t\tthis.tilePos.x * level.tileWidth(),\n\t\t\t\t\tthis.tilePos.y * level.tileHeight(),\n\t\t\t\t).add(this.tilePosOffset)\n\t\t\t},\n\n\t\t\tget tilePos() {\n\t\t\t\treturn tilePos\n\t\t\t},\n\n\t\t\tset isObstacle(is: boolean) {\n\t\t\t\tif (isObstacle === is) return\n\t\t\t\tisObstacle = is\n\t\t\t\tthis.getLevel().invalidateNavigationMap()\n\t\t\t},\n\n\t\t\tget isObstacle() {\n\t\t\t\treturn isObstacle\n\t\t\t},\n\n\t\t\tset cost(n: number) {\n\t\t\t\tif (cost === n) return\n\t\t\t\tcost = n\n\t\t\t\tthis.getLevel().invalidateNavigationMap()\n\t\t\t},\n\n\t\t\tget cost() {\n\t\t\t\treturn cost\n\t\t\t},\n\n\t\t\tset edges(e: Edge[]) {\n\t\t\t\tedges = e\n\t\t\t\tedgeMask = getEdgeMask()\n\t\t\t\tthis.getLevel().invalidateNavigationMap()\n\t\t\t},\n\n\t\t\tget edges() {\n\t\t\t\treturn edges\n\t\t\t},\n\n\t\t\tget edgeMask() {\n\t\t\t\treturn edgeMask\n\t\t\t},\n\n\t\t\tgetLevel(this: GameObj) {\n\t\t\t\treturn this.parent as GameObj<LevelComp>\n\t\t\t},\n\n\t\t\tmoveLeft() {\n\t\t\t\tthis.tilePos = this.tilePos.add(vec2(-1, 0))\n\t\t\t},\n\n\t\t\tmoveRight() {\n\t\t\t\tthis.tilePos = this.tilePos.add(vec2(1, 0))\n\t\t\t},\n\n\t\t\tmoveUp() {\n\t\t\t\tthis.tilePos = this.tilePos.add(vec2(0, -1))\n\t\t\t},\n\n\t\t\tmoveDown() {\n\t\t\t\tthis.tilePos = this.tilePos.add(vec2(0, 1))\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction addLevel(map: string[], opt: LevelOpt): GameObj<PosComp | LevelComp> {\n\n\t\tif (!opt.tileWidth || !opt.tileHeight) {\n\t\t\tthrow new KaboomError(\"Must provide tileWidth and tileHeight.\")\n\t\t}\n\n\t\t// TODO: custom parent\n\t\tconst level = add([\n\t\t\tpos(opt.pos ?? vec2(0)),\n\t\t]) as GameObj<PosComp | LevelComp>\n\n\t\tconst numRows = map.length\n\t\tlet numColumns = 0\n\n\t\t// The spatial map keeps track of the objects at each location\n\t\tlet spatialMap: GameObj[][] | null = null\n\t\tlet costMap: number[] | null = null\n\t\tlet edgeMap: number[] | null = null\n\t\tlet connectivityMap: number[] | null = null\n\n\t\tconst tile2Hash = (tilePos: Vec2) => tilePos.x + tilePos.y * numColumns\n\t\tconst hash2Tile = (hash: number) => vec2(\n\t\t\tMath.floor(hash % numColumns),\n\t\t\tMath.floor(hash / numColumns),\n\t\t)\n\n\t\tconst createSpatialMap = () => {\n\t\t\tspatialMap = []\n\t\t\tfor (const child of level.children) {\n\t\t\t\tinsertIntoSpatialMap(child)\n\t\t\t}\n\t\t}\n\n\t\tconst insertIntoSpatialMap = (obj: GameObj) => {\n\t\t\tconst i = tile2Hash(obj.tilePos)\n\t\t\tif (spatialMap[i]) {\n\t\t\t\tspatialMap[i].push(obj)\n\t\t\t} else {\n\t\t\t\tspatialMap[i] = [obj]\n\t\t\t}\n\t\t}\n\n\t\tconst removeFromSpatialMap = (obj: GameObj) => {\n\t\t\tconst i = tile2Hash(obj.tilePos)\n\t\t\tif (spatialMap[i]) {\n\t\t\t\tconst index = spatialMap[i].indexOf(obj)\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tspatialMap[i].splice(index, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst updateSpatialMap = () => {\n\t\t\tlet spatialMapChanged = false\n\t\t\tfor (const child of level.children) {\n\t\t\t\tconst tilePos = level.pos2Tile(child.pos)\n\t\t\t\tif (child.tilePos.x != tilePos.x || child.tilePos.y != tilePos.y) {\n\t\t\t\t\tspatialMapChanged = true\n\t\t\t\t\tremoveFromSpatialMap(child)\n\t\t\t\t\tchild.tilePos.x = tilePos.x\n\t\t\t\t\tchild.tilePos.y = tilePos.y\n\t\t\t\t\tinsertIntoSpatialMap(child)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (spatialMapChanged) {\n\t\t\t\tlevel.trigger(\"spatial_map_changed\")\n\t\t\t}\n\t\t}\n\n\t\t// The obstacle map tells which tiles are accessible\n\t\t// Cost: accessible with cost\n\t\t// Infinite: inaccessible\n\t\tconst createCostMap = () => {\n\t\t\tconst spatialMap = level.getSpatialMap()\n\t\t\tconst size = level.numRows() * level.numColumns()\n\t\t\tif (!costMap) {\n\t\t\t\tcostMap = new Array<number>(size)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcostMap.length = size\n\t\t\t}\n\t\t\tcostMap.fill(1, 0, size)\n\t\t\tfor (let i = 0; i < spatialMap.length; i++) {\n\t\t\t\tconst objects = spatialMap[i]\n\t\t\t\tif (objects) {\n\t\t\t\t\tlet cost = 0\n\t\t\t\t\tfor (const obj of objects) {\n\t\t\t\t\t\tif (obj.isObstacle) {\n\t\t\t\t\t\t\tcost = Infinity\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcost += obj.cost\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcostMap[i] = cost || 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// The edge map tells which edges between nodes are walkable\n\t\tconst createEdgeMap = () => {\n\t\t\tconst spatialMap = level.getSpatialMap()\n\t\t\tconst size = level.numRows() * level.numColumns()\n\t\t\tif (!edgeMap) {\n\t\t\t\tedgeMap = new Array<number>(size)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tedgeMap.length = size\n\t\t\t}\n\t\t\tedgeMap.fill(EdgeMask.All, 0, size)\n\t\t\tfor (let i = 0; i < spatialMap.length; i++) {\n\t\t\t\tconst objects = spatialMap[i]\n\t\t\t\tif (objects) {\n\t\t\t\t\tconst len = objects.length\n\t\t\t\t\tlet mask = EdgeMask.All\n\t\t\t\t\tfor (let j = 0; j < len; j++) {\n\t\t\t\t\t\tmask |= objects[j].edgeMask\n\t\t\t\t\t}\n\t\t\t\t\tedgeMap[i] = mask\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// The connectivity map is used to see whether two locations are connected\n\t\t// -1: inaccesible n: connectivity group\n\t\tconst createConnectivityMap = () => {\n\t\t\tconst size = level.numRows() * level.numColumns()\n\t\t\tconst traverse = (i: number, index: number) => {\n\t\t\t\tconst frontier: number[] = []\n\t\t\t\tfrontier.push(i)\n\t\t\t\twhile (frontier.length > 0) {\n\t\t\t\t\tconst i = frontier.pop()\n\t\t\t\t\tgetNeighbours(i).forEach((i) => {\n\t\t\t\t\t\tif (connectivityMap[i] < 0) {\n\t\t\t\t\t\t\tconnectivityMap[i] = index\n\t\t\t\t\t\t\tfrontier.push(i)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!connectivityMap) {\n\t\t\t\tconnectivityMap = new Array<number>(size)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconnectivityMap.length = size\n\t\t\t}\n\t\t\tconnectivityMap.fill(-1, 0, size)\n\t\t\tlet index = 0\n\t\t\tfor (let i = 0; i < costMap.length; i++) {\n\t\t\t\tif (connectivityMap[i] >= 0) { index++; continue }\n\t\t\t\ttraverse(i, index)\n\t\t\t\tindex++\n\t\t\t}\n\t\t}\n\n\t\tconst getCost = (node: number, neighbour: number) => {\n\t\t\t// Cost of destination tile\n\t\t\treturn costMap[neighbour]\n\t\t}\n\n\t\tconst getHeuristic = (node: number, goal: number) => {\n\t\t\t// Euclidian distance to target\n\t\t\tconst p1 = hash2Tile(node)\n\t\t\tconst p2 = hash2Tile(goal)\n\t\t\treturn p1.dist(p2)\n\t\t}\n\n\t\tconst getNeighbours = (node: number, diagonals?: boolean) => {\n\t\t\tconst n = []\n\t\t\tconst x = Math.floor(node % numColumns)\n\t\t\tconst left = x > 0 &&\n\t\t\t\t(edgeMap[node] & EdgeMask.Left) &&\n\t\t\t\tcostMap[node - 1] !== Infinity\n\t\t\tconst top = node >= numColumns &&\n\t\t\t\t(edgeMap[node] & EdgeMask.Top) &&\n\t\t\t\tcostMap[node - numColumns] !== Infinity\n\t\t\tconst right = x < numColumns - 1 &&\n\t\t\t\t(edgeMap[node] & EdgeMask.Right) &&\n\t\t\t\tcostMap[node + 1] !== Infinity\n\t\t\tconst bottom = node < numColumns * numRows - numColumns - 1 &&\n\t\t\t\t(edgeMap[node] & EdgeMask.Bottom) &&\n\t\t\t\tcostMap[node + numColumns] !== Infinity\n\t\t\tif (diagonals) {\n\t\t\t\tif (left) {\n\t\t\t\t\tif (top) { n.push(node - numColumns - 1) }\n\t\t\t\t\tn.push(node - 1)\n\t\t\t\t\tif (bottom) { n.push(node + numColumns - 1) }\n\t\t\t\t}\n\t\t\t\tif (top) {\n\t\t\t\t\tn.push(node - numColumns)\n\t\t\t\t}\n\t\t\t\tif (right) {\n\t\t\t\t\tif (top) { n.push(node - numColumns + 1) }\n\t\t\t\t\tn.push(node + 1)\n\t\t\t\t\tif (bottom) { n.push(node + numColumns + 1) }\n\t\t\t\t}\n\t\t\t\tif (bottom) {\n\t\t\t\t\tn.push(node + numColumns)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (left) {\n\t\t\t\t\tn.push(node - 1)\n\t\t\t\t}\n\t\t\t\tif (top) {\n\t\t\t\t\tn.push(node - numColumns)\n\t\t\t\t}\n\t\t\t\tif (right) {\n\t\t\t\t\tn.push(node + 1)\n\t\t\t\t}\n\t\t\t\tif (bottom) {\n\t\t\t\t\tn.push(node + numColumns)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn n\n\t\t}\n\n\t\tconst levelComp: LevelComp = {\n\n\t\t\tid: \"level\",\n\n\t\t\ttileWidth() {\n\t\t\t\treturn opt.tileWidth\n\t\t\t},\n\n\t\t\ttileHeight() {\n\t\t\t\treturn opt.tileHeight\n\t\t\t},\n\n\t\t\tspawn(this: GameObj<LevelComp>, key: string | CompList<any>, ...args: Vec2Args): GameObj | null {\n\n\t\t\t\tconst p = vec2(...args)\n\n\t\t\t\tconst comps = (() => {\n\t\t\t\t\tif (typeof key === \"string\") {\n\t\t\t\t\t\tif (opt.tiles[key]) {\n\t\t\t\t\t\t\tif (typeof opt.tiles[key] !== \"function\") {\n\t\t\t\t\t\t\t\tthrow new KaboomError(\"Level symbol def must be a function returning a component list\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn opt.tiles[key](p)\n\t\t\t\t\t\t} else if (opt.wildcardTile) {\n\t\t\t\t\t\t\treturn opt.wildcardTile(key, p)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (Array.isArray(key)) {\n\t\t\t\t\t\treturn key\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new KaboomError(\"Expected a symbol or a component list\")\n\t\t\t\t\t}\n\t\t\t\t})()\n\n\t\t\t\t// empty tile\n\t\t\t\tif (!comps) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tlet hasPos = false\n\t\t\t\tlet hasTile = false\n\n\t\t\t\tfor (const comp of comps) {\n\t\t\t\t\tif (comp.id === \"tile\") hasTile = true\n\t\t\t\t\tif (comp.id === \"pos\") hasPos = true\n\t\t\t\t}\n\n\t\t\t\tif (!hasPos) comps.push(pos())\n\t\t\t\tif (!hasTile) comps.push(tile())\n\n\t\t\t\tconst obj = level.add(comps)\n\n\t\t\t\tif (hasPos) {\n\t\t\t\t\tobj.tilePosOffset = obj.pos.clone()\n\t\t\t\t}\n\n\t\t\t\tobj.tilePos = p\n\n\t\t\t\tif (spatialMap) {\n\t\t\t\t\tinsertIntoSpatialMap(obj)\n\t\t\t\t\tthis.trigger(\"spatial_map_changed\")\n\t\t\t\t\tthis.trigger(\"navigation_map_invalid\")\n\t\t\t\t}\n\n\t\t\t\treturn obj\n\n\t\t\t},\n\n\t\t\tnumColumns() {\n\t\t\t\treturn numColumns\n\t\t\t},\n\n\t\t\tnumRows() {\n\t\t\t\treturn numRows\n\t\t\t},\n\n\t\t\tlevelWidth() {\n\t\t\t\treturn numColumns * this.tileWidth()\n\t\t\t},\n\n\t\t\tlevelHeight() {\n\t\t\t\treturn numRows * this.tileHeight()\n\t\t\t},\n\n\t\t\ttile2Pos(...args: Vec2Args) {\n\t\t\t\treturn vec2(...args).scale(this.tileWidth(), this.tileHeight())\n\t\t\t},\n\n\t\t\tpos2Tile(...args: Vec2Args) {\n\t\t\t\tconst p = vec2(...args)\n\t\t\t\treturn vec2(\n\t\t\t\t\tMath.floor(p.x / this.tileWidth()),\n\t\t\t\t\tMath.floor(p.y / this.tileHeight()),\n\t\t\t\t)\n\t\t\t},\n\n\t\t\tgetSpatialMap() {\n\t\t\t\tif (!spatialMap) {\n\t\t\t\t\tcreateSpatialMap()\n\t\t\t\t}\n\t\t\t\treturn spatialMap\n\t\t\t},\n\n\t\t\tonSpatialMapChanged(this: GameObj<LevelComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"spatial_map_changed\", cb)\n\t\t\t},\n\n\t\t\tonNavigationMapInvalid(this: GameObj<LevelComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"navigation_map_invalid\", cb)\n\t\t\t},\n\n\t\t\tgetAt(tilePos: Vec2) {\n\t\t\t\tif (!spatialMap) {\n\t\t\t\t\tcreateSpatialMap()\n\t\t\t\t}\n\t\t\t\tconst hash = tile2Hash(tilePos)\n\t\t\t\treturn spatialMap[hash] || []\n\t\t\t},\n\n\t\t\tupdate() {\n\t\t\t\tif (spatialMap) {\n\t\t\t\t\tupdateSpatialMap()\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tinvalidateNavigationMap() {\n\t\t\t\tcostMap = null\n\t\t\t\tedgeMap = null\n\t\t\t\tconnectivityMap = null\n\t\t\t},\n\n\t\t\tonNavigationMapChanged(this: GameObj<LevelComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"navigation_map_changed\", cb)\n\t\t\t},\n\n\t\t\tgetTilePath(this: GameObj<LevelComp>, from: Vec2, to: Vec2, opts: PathFindOpt = {}) {\n\t\t\t\tif (!costMap) {\n\t\t\t\t\tcreateCostMap()\n\t\t\t\t}\n\t\t\t\tif (!edgeMap) {\n\t\t\t\t\tcreateEdgeMap()\n\t\t\t\t}\n\t\t\t\tif (!connectivityMap) {\n\t\t\t\t\tcreateConnectivityMap()\n\t\t\t\t}\n\n\t\t\t\t// Tiles are outside the grid\n\t\t\t\tif (from.x < 0 || from.x >= numColumns ||\n\t\t\t\t\tfrom.y < 0 || from.y >= numRows) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tif (to.x < 0 || to.x >= numColumns ||\n\t\t\t\t\tto.y < 0 || to.y >= numRows) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\tconst start = tile2Hash(from)\n\t\t\t\tconst goal = tile2Hash(to)\n\n\t\t\t\t// Tiles are not accessible\n\t\t\t\t// If we test the start tile, we may get stuck\n\t\t\t\t/*if (costMap[start] === Infinity) {\n\t\t\t\t\treturn null\n\t\t\t\t}*/\n\t\t\t\tif (costMap[goal] === Infinity) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\t// Same Tile, no waypoints needed\n\t\t\t\tif (start === goal) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\n\t\t\t\t// Tiles are not within the same section\n\t\t\t\t// If we test the start tile when invalid, we may get stuck\n\t\t\t\tif (connectivityMap[start] != -1 && connectivityMap[start] !== connectivityMap[goal]) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\t// Find a path\n\t\t\t\tinterface CostNode { cost: number, node: number }\n\t\t\t\tconst frontier = new BinaryHeap<CostNode>((a, b) => a.cost < b.cost)\n\t\t\t\tfrontier.insert({ cost: 0, node: start })\n\n\t\t\t\tconst cameFrom = new Map<number, number>()\n\t\t\t\tcameFrom.set(start, start)\n\t\t\t\tconst costSoFar = new Map<number, number>()\n\t\t\t\tcostSoFar.set(start, 0)\n\n\t\t\t\twhile (frontier.length !== 0) {\n\t\t\t\t\tconst current = frontier.remove()?.node\n\n\t\t\t\t\tif (current === goal)\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tconst neighbours = getNeighbours(current, opts.allowDiagonals)\n\t\t\t\t\tfor (const next of neighbours) {\n\t\t\t\t\t\tconst newCost = (costSoFar.get(current) || 0) +\n\t\t\t\t\t\t\tgetCost(current, next) +\n\t\t\t\t\t\t\tgetHeuristic(next, goal)\n\t\t\t\t\t\tif (!costSoFar.has(next) || newCost < costSoFar.get(next)) {\n\t\t\t\t\t\t\tcostSoFar.set(next, newCost)\n\t\t\t\t\t\t\tfrontier.insert({ cost: newCost, node: next })\n\t\t\t\t\t\t\tcameFrom.set(next, current)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst path = []\n\t\t\t\tlet node = goal\n\t\t\t\tconst p = hash2Tile(node)\n\t\t\t\tpath.push(p)\n\t\t\t\twhile (node !== start) {\n\t\t\t\t\tnode = cameFrom.get(node)\n\t\t\t\t\tconst p = hash2Tile(node)\n\t\t\t\t\tpath.push(p)\n\t\t\t\t}\n\t\t\t\treturn path.reverse()\n\t\t\t},\n\n\t\t\tgetPath(this: GameObj<LevelComp>, from: Vec2, to: Vec2, opts: PathFindOpt = {}) {\n\t\t\t\tconst tw = this.tileWidth()\n\t\t\t\tconst th = this.tileHeight()\n\t\t\t\tconst path = this.getTilePath(\n\t\t\t\t\tthis.pos2Tile(from),\n\t\t\t\t\tthis.pos2Tile(to),\n\t\t\t\t\topts,\n\t\t\t\t)\n\t\t\t\tif (path) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\t...path\n\t\t\t\t\t\t\t.slice(1, -1)\n\t\t\t\t\t\t\t.map((tilePos) => tilePos.scale(tw, th).add(tw / 2, th / 2)),\n\t\t\t\t\t\tto,\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t},\n\n\t\t}\n\n\t\tlevel.use(levelComp)\n\n\t\tlevel.onNavigationMapInvalid(() => {\n\t\t\tlevel.invalidateNavigationMap()\n\t\t\tlevel.trigger(\"navigation_map_changed\")\n\t\t})\n\n\t\tmap.forEach((row, i) => {\n\t\t\tconst keys = row.split(\"\")\n\t\t\tnumColumns = Math.max(keys.length, numColumns)\n\t\t\tkeys.forEach((key, j) => {\n\t\t\t\tlevel.spawn(key, vec2(j, i))\n\t\t\t})\n\t\t})\n\n\t\treturn level\n\n\t}\n\n\tfunction agent(opts: AgentCompOpt = {}) : AgentComp {\n\t\tlet target: Vec2 | null = null\n\t\tlet path: Vec2[] | null = null\n\t\tlet index: number | null = null\n\t\tlet navMapChangedEvent: EventController | null = null\n\t\treturn {\n\t\t\tid: \"agent\",\n\t\t\trequire: [\"pos\", \"tile\"],\n\t\t\tagentSpeed: opts.speed ?? 100,\n\t\t\tallowDiagonals: opts.allowDiagonals ?? true,\n\t\t\tgetDistanceToTarget(this: GameObj<AgentComp | PosComp>) {\n\t\t\t\treturn target ? this.pos.dist(target) : 0\n\t\t\t},\n\t\t\tgetNextLocation() {\n\t\t\t\treturn path && index ? path[index] : null\n\t\t\t},\n\t\t\tgetPath() {\n\t\t\t\treturn path ? path.slice() : null\n\t\t\t},\n\t\t\tgetTarget() {\n\t\t\t\treturn target\n\t\t\t},\n\t\t\tisNavigationFinished() {\n\t\t\t\treturn path ? index === null : true\n\t\t\t},\n\t\t\tisTargetReachable() {\n\t\t\t\treturn path !== null\n\t\t\t},\n\t\t\tisTargetReached(this: GameObj<AgentComp | PosComp>) {\n\t\t\t\treturn target ? this.pos.eq(target) : true\n\t\t\t},\n\t\t\tsetTarget(this: GameObj<AgentComp | TileComp | PosComp>, p: Vec2) {\n\t\t\t\ttarget = p\n\t\t\t\tpath = this.getLevel().getPath(this.pos, target, {\n\t\t\t\t\tallowDiagonals: this.allowDiagonals,\n\t\t\t\t})\n\t\t\t\tindex = path ? 0 : null\n\t\t\t\tif (path) {\n\t\t\t\t\tif (!navMapChangedEvent) {\n\t\t\t\t\t\tnavMapChangedEvent = this.getLevel().onNavigationMapChanged(() => {\n\t\t\t\t\t\t\tif (path && index !== null) {\n\t\t\t\t\t\t\t\tpath = this.getLevel().getPath(this.pos, target, {\n\t\t\t\t\t\t\t\t\tallowDiagonals: this.allowDiagonals,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tindex = path ? 0 : null\n\t\t\t\t\t\t\t\tif (path) {\n\t\t\t\t\t\t\t\t\tthis.trigger(\"navigation-next\", this, path[index])\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.trigger(\"navigation-ended\", this)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tthis.onDestroy(() => navMapChangedEvent.cancel())\n\t\t\t\t\t}\n\t\t\t\t\tthis.trigger(\"navigation-started\", this)\n\t\t\t\t\tthis.trigger(\"navigation-next\", this, path[index])\n\t\t\t\t} else {\n\t\t\t\t\tthis.trigger(\"navigation-ended\", this)\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate(this: GameObj<AgentComp | PosComp>) {\n\t\t\t\tif (path && index !== null) {\n\t\t\t\t\tif (this.pos.sdist(path[index]) < 2) {\n\t\t\t\t\t\tif (index === path.length - 1) {\n\t\t\t\t\t\t\tthis.pos = target.clone()\n\t\t\t\t\t\t\tindex = null\n\t\t\t\t\t\t\tthis.trigger(\"navigation-ended\", this)\n\t\t\t\t\t\t\tthis.trigger(\"target-reached\", this)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex++\n\t\t\t\t\t\t\tthis.trigger(\"navigation-next\", this, path[index])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tthis.moveTo(path[index], this.agentSpeed)\n\t\t\t\t}\n\t\t\t},\n\t\t\tonNavigationStarted(this: GameObj<AgentComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"navigation-started\", cb)\n\t\t\t},\n\t\t\tonNavigationNext(this: GameObj<AgentComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"navigation-next\", cb)\n\t\t\t},\n\t\t\tonNavigationEnded(this: GameObj<AgentComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"navigation-ended\", cb)\n\t\t\t},\n\t\t\tonTargetReached(this: GameObj<AgentComp>, cb: () => void) {\n\t\t\t\treturn this.on(\"target-reached\", cb)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn JSON.stringify({\n\t\t\t\t\ttarget: JSON.stringify(target),\n\t\t\t\t\tpath: JSON.stringify(path),\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tfunction record(frameRate?): Recording {\n\n\t\tconst stream = app.canvas().captureStream(frameRate)\n\t\tconst audioDest = audio.ctx.createMediaStreamDestination()\n\n\t\taudio.masterNode.connect(audioDest)\n\n\t\t// TODO: Enabling audio results in empty video if no audio received\n\t\t// const audioStream = audioDest.stream\n\t\t// const [firstAudioTrack] = audioStream.getAudioTracks()\n\n\t\t// stream.addTrack(firstAudioTrack);\n\n\t\tconst recorder = new MediaRecorder(stream)\n\t\tconst chunks = []\n\n\t\trecorder.ondataavailable = (e) => {\n\t\t\tif (e.data.size > 0) {\n\t\t\t\tchunks.push(e.data)\n\t\t\t}\n\t\t}\n\n\t\trecorder.onerror = () => {\n\t\t\taudio.masterNode.disconnect(audioDest)\n\t\t\tstream.getTracks().forEach(t => t.stop())\n\t\t}\n\n\t\trecorder.start()\n\n\t\treturn {\n\n\t\t\tresume() {\n\t\t\t\trecorder.resume()\n\t\t\t},\n\n\t\t\tpause() {\n\t\t\t\trecorder.pause()\n\t\t\t},\n\n\t\t\tstop(): Promise<Blob> {\n\t\t\t\trecorder.stop()\n\t\t\t\t// cleanup\n\t\t\t\taudio.masterNode.disconnect(audioDest)\n\t\t\t\tstream.getTracks().forEach(t => t.stop())\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\trecorder.onstop = () => {\n\t\t\t\t\t\tresolve(new Blob(chunks, {\n\t\t\t\t\t\t\ttype: \"video/mp4\",\n\t\t\t\t\t\t}))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tdownload(filename = \"kaboom.mp4\") {\n\t\t\t\tthis.stop().then((blob) => downloadBlob(filename, blob))\n\t\t\t},\n\n\t\t}\n\n\t}\n\n\tfunction isFocused(): boolean {\n\t\treturn document.activeElement === app.canvas()\n\t}\n\n\tfunction destroy(obj: GameObj) {\n\t\tobj.destroy()\n\t}\n\n\t// aliases for root game obj operations\n\tconst add: KaboomCtx[\"add\"] = game.root.add.bind(game.root)\n\tconst readd: KaboomCtx[\"readd\"] = game.root.readd.bind(game.root)\n\tconst destroyAll: KaboomCtx[\"destroyAll\"] = game.root.removeAll.bind(game.root)\n\tconst get: KaboomCtx[\"get\"] = game.root.get.bind(game.root)\n\n\tfunction boom(speed: number = 2, size: number = 1): Comp {\n\t\tlet time = 0\n\t\treturn {\n\t\t\tid: \"boom\",\n\t\t\trequire: [ \"scale\" ],\n\t\t\tupdate(this: GameObj<ScaleComp>) {\n\t\t\t\tconst s = Math.sin(time * speed) * size\n\t\t\t\tif (s < 0) {\n\t\t\t\t\tthis.destroy()\n\t\t\t\t}\n\t\t\t\tthis.scale = vec2(s)\n\t\t\t\ttime += dt()\n\t\t\t},\n\t\t}\n\t}\n\n\tconst kaSprite = loadSprite(null, kaSpriteSrc)\n\tconst boomSprite = loadSprite(null, boomSpriteSrc)\n\n\tfunction addKaboom(p: Vec2, opt: BoomOpt = {}): GameObj {\n\n\t\tconst kaboom = add([\n\t\t\tpos(p),\n\t\t\tstay(),\n\t\t])\n\n\t\tconst speed = (opt.speed || 1) * 5\n\t\tconst s = opt.scale || 1\n\n\t\tkaboom.add([\n\t\t\tsprite(boomSprite),\n\t\t\tscale(0),\n\t\t\tanchor(\"center\"),\n\t\t\tboom(speed, s),\n\t\t\t...opt.comps ?? [],\n\t\t])\n\n\t\tconst ka = kaboom.add([\n\t\t\tsprite(kaSprite),\n\t\t\tscale(0),\n\t\t\tanchor(\"center\"),\n\t\t\ttimer(),\n\t\t\t...opt.comps ?? [],\n\t\t])\n\n\t\tka.wait(0.4 / speed, () => ka.use(boom(speed, s)))\n\t\tka.onDestroy(() => kaboom.destroy())\n\n\t\treturn kaboom\n\n\t}\n\n\tfunction updateFrame() {\n\t\t// update every obj\n\t\tgame.root.update()\n\t}\n\n\tclass Collision {\n\t\tsource: GameObj\n\t\ttarget: GameObj\n\t\tdisplacement: Vec2\n\t\tresolved: boolean = false\n\t\tconstructor(source: GameObj, target: GameObj, dis: Vec2, resolved = false) {\n\t\t\tthis.source = source\n\t\t\tthis.target = target\n\t\t\tthis.displacement = dis\n\t\t\tthis.resolved = resolved\n\t\t}\n\t\treverse() {\n\t\t\treturn new Collision(\n\t\t\t\tthis.target,\n\t\t\t\tthis.source,\n\t\t\t\tthis.displacement.scale(-1),\n\t\t\t\tthis.resolved,\n\t\t\t)\n\t\t}\n\t\thasOverlap() {\n\t\t\treturn !this.displacement.isZero()\n\t\t}\n\t\tisLeft() {\n\t\t\treturn this.displacement.x > 0\n\t\t}\n\t\tisRight() {\n\t\t\treturn this.displacement.x < 0\n\t\t}\n\t\tisTop() {\n\t\t\treturn this.displacement.y > 0\n\t\t}\n\t\tisBottom() {\n\t\t\treturn this.displacement.y < 0\n\t\t}\n\t\tpreventResolution() {\n\t\t\tthis.resolved = true\n\t\t}\n\t}\n\n\tfunction checkFrame() {\n\n\t\t// TODO: persistent grid?\n\t\t// start a spatial hash grid for more efficient collision detection\n\t\tconst grid: Record<number, Record<number, GameObj<AreaComp>[]>> = {}\n\t\tconst cellSize = gopt.hashGridSize || DEF_HASH_GRID_SIZE\n\n\t\t// current transform\n\t\tlet tr = new Mat4()\n\n\t\t// a local transform stack\n\t\tconst stack = []\n\n\t\tfunction checkObj(obj: GameObj) {\n\n\t\t\tstack.push(tr.clone())\n\n\t\t\t// Update object transform here. This will be the transform later used in rendering.\n\t\t\tif (obj.pos) tr.translate(obj.pos)\n\t\t\tif (obj.scale) tr.scale(obj.scale)\n\t\t\tif (obj.angle) tr.rotate(obj.angle)\n\t\t\tobj.transform = tr.clone()\n\n\t\t\tif (obj.c(\"area\") && !obj.paused) {\n\n\t\t\t\t// TODO: only update worldArea if transform changed\n\t\t\t\tconst aobj = obj as GameObj<AreaComp>\n\t\t\t\tconst area = aobj.worldArea()\n\t\t\t\tconst bbox = area.bbox()\n\n\t\t\t\t// Get spatial hash grid coverage\n\t\t\t\tconst xmin = Math.floor(bbox.pos.x / cellSize)\n\t\t\t\tconst ymin = Math.floor(bbox.pos.y / cellSize)\n\t\t\t\tconst xmax = Math.ceil((bbox.pos.x + bbox.width) / cellSize)\n\t\t\t\tconst ymax = Math.ceil((bbox.pos.y + bbox.height) / cellSize)\n\n\t\t\t\t// Cache objs that are already checked\n\t\t\t\tconst checked = new Set()\n\n\t\t\t\t// insert & check against all covered grids\n\t\t\t\tfor (let x = xmin; x <= xmax; x++) {\n\t\t\t\t\tfor (let y = ymin; y <= ymax; y++) {\n\t\t\t\t\t\tif(!grid[x]) {\n\t\t\t\t\t\t\tgrid[x] = {}\n\t\t\t\t\t\t\tgrid[x][y] = [aobj]\n\t\t\t\t\t\t} else if(!grid[x][y]) {\n\t\t\t\t\t\t\tgrid[x][y] = [aobj]\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst cell = grid[x][y]\n\t\t\t\t\t\t\tcheck: for (const other of cell) {\n\t\t\t\t\t\t\t\tif (other.paused) continue\n\t\t\t\t\t\t\t\tif (!other.exists()) continue\n\t\t\t\t\t\t\t\tif (checked.has(other.id)) continue\n\t\t\t\t\t\t\t\tfor (const tag of aobj.collisionIgnore) {\n\t\t\t\t\t\t\t\t\tif (other.is(tag)) {\n\t\t\t\t\t\t\t\t\t\tcontinue check\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor (const tag of other.collisionIgnore) {\n\t\t\t\t\t\t\t\t\tif (aobj.is(tag)) {\n\t\t\t\t\t\t\t\t\t\tcontinue check\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// TODO: cache the world area here\n\t\t\t\t\t\t\t\tconst res = sat(aobj.worldArea(), other.worldArea())\n\t\t\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t\t\t// TODO: rehash if the object position is changed after resolution?\n\t\t\t\t\t\t\t\t\tconst col1 = new Collision(aobj, other, res)\n\t\t\t\t\t\t\t\t\taobj.trigger(\"collideUpdate\", other, col1)\n\t\t\t\t\t\t\t\t\tconst col2 = col1.reverse()\n\t\t\t\t\t\t\t\t\t// resolution only has to happen once\n\t\t\t\t\t\t\t\t\tcol2.resolved = col1.resolved\n\t\t\t\t\t\t\t\t\tother.trigger(\"collideUpdate\", aobj, col2)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tchecked.add(other.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcell.push(aobj)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobj.children.forEach(checkObj)\n\t\t\ttr = stack.pop()\n\n\t\t}\n\n\t\tcheckObj(game.root)\n\n\t}\n\n\tfunction drawFrame() {\n\n\t\t// calculate camera matrix\n\t\tconst cam = game.cam\n\t\tconst shake = Vec2.fromAngle(rand(0, 360)).scale(cam.shake)\n\n\t\tcam.shake = lerp(cam.shake, 0, 5 * dt())\n\t\tcam.transform = new Mat4()\n\t\t\t.translate(center())\n\t\t\t.scale(cam.scale)\n\t\t\t.rotate(cam.angle)\n\t\t\t.translate((cam.pos ?? center()).scale(-1).add(shake))\n\n\t\tgame.root.draw()\n\t\tflush()\n\n\t}\n\n\tfunction drawLoadScreen() {\n\n\t\tconst progress = loadProgress()\n\n\t\tif (game.events.numListeners(\"loading\") > 0) {\n\t\t\tgame.events.trigger(\"loading\", progress)\n\t\t} else {\n\t\t\tdrawUnscaled(() => {\n\t\t\t\tconst w = width() / 2\n\t\t\t\tconst h = 24\n\t\t\t\tconst pos = vec2(width() / 2, height() / 2).sub(vec2(w / 2, h / 2))\n\t\t\t\tdrawRect({\n\t\t\t\t\tpos: vec2(0),\n\t\t\t\t\twidth: width(),\n\t\t\t\t\theight: height(),\n\t\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\t})\n\t\t\t\tdrawRect({\n\t\t\t\t\tpos: pos,\n\t\t\t\t\twidth: w,\n\t\t\t\t\theight: h,\n\t\t\t\t\tfill: false,\n\t\t\t\t\toutline: {\n\t\t\t\t\t\twidth: 4,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tdrawRect({\n\t\t\t\t\tpos: pos,\n\t\t\t\t\twidth: w * progress,\n\t\t\t\t\theight: h,\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t}\n\n\tfunction drawInspectText(pos, txt) {\n\n\t\tdrawUnscaled(() => {\n\n\t\t\tconst pad = vec2(8)\n\n\t\t\tpushTransform()\n\t\t\tpushTranslate(pos)\n\n\t\t\tconst ftxt = formatText({\n\t\t\t\ttext: txt,\n\t\t\t\tfont: DBG_FONT,\n\t\t\t\tsize: 16,\n\t\t\t\tpos: pad,\n\t\t\t\tcolor: rgb(255, 255, 255),\n\t\t\t\tfixed: true,\n\t\t\t})\n\n\t\t\tconst bw = ftxt.width + pad.x * 2\n\t\t\tconst bh = ftxt.height + pad.x * 2\n\n\t\t\tif (pos.x + bw >= width()) {\n\t\t\t\tpushTranslate(vec2(-bw, 0))\n\t\t\t}\n\n\t\t\tif (pos.y + bh >= height()) {\n\t\t\t\tpushTranslate(vec2(0, -bh))\n\t\t\t}\n\n\t\t\tdrawRect({\n\t\t\t\twidth: bw,\n\t\t\t\theight: bh,\n\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\tradius: 4,\n\t\t\t\topacity: 0.8,\n\t\t\t\tfixed: true,\n\t\t\t})\n\n\t\t\tdrawFormattedText(ftxt)\n\t\t\tpopTransform()\n\n\t\t})\n\n\t}\n\n\tfunction drawDebug() {\n\n\t\tif (debug.inspect) {\n\n\t\t\tlet inspecting = null\n\n\t\t\tfor (const obj of game.root.get(\"*\", { recursive: true })) {\n\t\t\t\tif (obj.c(\"area\") && obj.isHovering()) {\n\t\t\t\t\tinspecting = obj\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgame.root.drawInspect()\n\n\t\t\tif (inspecting) {\n\n\t\t\t\tconst lines = []\n\t\t\t\tconst data = inspecting.inspect()\n\n\t\t\t\tfor (const tag in data) {\n\t\t\t\t\tif (data[tag]) {\n\t\t\t\t\t\tlines.push(`${tag}: ${data[tag]}`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlines.push(`${tag}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdrawInspectText(contentToView(mousePos()), lines.join(\"\\n\"))\n\n\t\t\t}\n\n\t\t\tdrawInspectText(vec2(8), `FPS: ${debug.fps()}`)\n\n\t\t}\n\n\t\tif (debug.paused) {\n\n\t\t\tdrawUnscaled(() => {\n\n\t\t\t\t// top right corner\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(width(), 0)\n\t\t\t\tpushTranslate(-8, 8)\n\n\t\t\t\tconst size = 32\n\n\t\t\t\t// bg\n\t\t\t\tdrawRect({\n\t\t\t\t\twidth: size,\n\t\t\t\t\theight: size,\n\t\t\t\t\tanchor: \"topright\",\n\t\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\t\topacity: 0.8,\n\t\t\t\t\tradius: 4,\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\t// pause icon\n\t\t\t\tfor (let i = 1; i <= 2; i++) {\n\t\t\t\t\tdrawRect({\n\t\t\t\t\t\twidth: 4,\n\t\t\t\t\t\theight: size * 0.6,\n\t\t\t\t\t\tanchor: \"center\",\n\t\t\t\t\t\tpos: vec2(-size / 3 * i, size * 0.5),\n\t\t\t\t\t\tcolor: rgb(255, 255, 255),\n\t\t\t\t\t\tradius: 2,\n\t\t\t\t\t\tfixed: true,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tpopTransform()\n\n\t\t\t})\n\n\t\t}\n\n\t\tif (debug.timeScale !== 1) {\n\n\t\t\tdrawUnscaled(() => {\n\n\t\t\t\t// bottom right corner\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(width(), height())\n\t\t\t\tpushTranslate(-8, -8)\n\n\t\t\t\tconst pad = 8\n\n\t\t\t\t// format text first to get text size\n\t\t\t\tconst ftxt = formatText({\n\t\t\t\t\ttext: debug.timeScale.toFixed(1),\n\t\t\t\t\tfont: DBG_FONT,\n\t\t\t\t\tsize: 16,\n\t\t\t\t\tcolor: rgb(255, 255, 255),\n\t\t\t\t\tpos: vec2(-pad),\n\t\t\t\t\tanchor: \"botright\",\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\t// bg\n\t\t\t\tdrawRect({\n\t\t\t\t\twidth: ftxt.width + pad * 2 + pad * 4,\n\t\t\t\t\theight: ftxt.height + pad * 2,\n\t\t\t\t\tanchor: \"botright\",\n\t\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\t\topacity: 0.8,\n\t\t\t\t\tradius: 4,\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\t// fast forward / slow down icon\n\t\t\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t\t\tconst flipped = debug.timeScale < 1\n\t\t\t\t\tdrawTriangle({\n\t\t\t\t\t\tp1: vec2(-ftxt.width - pad * (flipped ? 2 : 3.5), -pad),\n\t\t\t\t\t\tp2: vec2(-ftxt.width - pad * (flipped ? 2 : 3.5), -pad - ftxt.height),\n\t\t\t\t\t\tp3: vec2(-ftxt.width - pad * (flipped ? 3.5 : 2), -pad - ftxt.height / 2),\n\t\t\t\t\t\tpos: vec2(-i * pad * 1 + (flipped ? -pad * 0.5 : 0), 0),\n\t\t\t\t\t\tcolor: rgb(255, 255, 255),\n\t\t\t\t\t\tfixed: true,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// text\n\t\t\t\tdrawFormattedText(ftxt)\n\n\t\t\t\tpopTransform()\n\n\t\t\t})\n\n\t\t}\n\n\t\tif (debug.curRecording) {\n\n\t\t\tdrawUnscaled(() => {\n\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(0, height())\n\t\t\t\tpushTranslate(24, -24)\n\n\t\t\t\tdrawCircle({\n\t\t\t\t\tradius: 12,\n\t\t\t\t\tcolor: rgb(255, 0, 0),\n\t\t\t\t\topacity: wave(0, 1, app.time() * 4),\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\tpopTransform()\n\n\t\t\t})\n\n\t\t}\n\n\t\tif (debug.showLog && game.logs.length > 0) {\n\n\t\t\tdrawUnscaled(() => {\n\n\t\t\t\tpushTransform()\n\t\t\t\tpushTranslate(0, height())\n\t\t\t\tpushTranslate(8, -8)\n\n\t\t\t\tconst pad = 8\n\t\t\t\tconst logs = []\n\n\t\t\t\tfor (const log of game.logs) {\n\t\t\t\t\tlet str = \"\"\n\t\t\t\t\tconst style = log.msg instanceof Error ? \"error\" : \"info\"\n\t\t\t\t\tstr += `[time]${log.time.toFixed(2)}[/time]`\n\t\t\t\t\tstr += \" \"\n\t\t\t\t\tstr += `[${style}]${log.msg?.toString ? log.msg.toString() : log.msg}[/${style}]`\n\t\t\t\t\tlogs.push(str)\n\t\t\t\t}\n\n\t\t\t\tgame.logs = game.logs\n\t\t\t\t\t.filter((log) => app.time() - log.time < (gopt.logTime || LOG_TIME))\n\n\t\t\t\tconst ftext = formatText({\n\t\t\t\t\ttext: logs.join(\"\\n\"),\n\t\t\t\t\tfont: DBG_FONT,\n\t\t\t\t\tpos: vec2(pad, -pad),\n\t\t\t\t\tanchor: \"botleft\",\n\t\t\t\t\tsize: 16,\n\t\t\t\t\twidth: width() * 0.6,\n\t\t\t\t\tlineSpacing: pad / 2,\n\t\t\t\t\tfixed: true,\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\"time\": { color: rgb(127, 127, 127) },\n\t\t\t\t\t\t\"info\": { color: rgb(255, 255, 255) },\n\t\t\t\t\t\t\"error\": { color: rgb(255, 0, 127) },\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tdrawRect({\n\t\t\t\t\twidth: ftext.width + pad * 2,\n\t\t\t\t\theight: ftext.height + pad * 2,\n\t\t\t\t\tanchor: \"botleft\",\n\t\t\t\t\tcolor: rgb(0, 0, 0),\n\t\t\t\t\tradius: 4,\n\t\t\t\t\topacity: 0.8,\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\tdrawFormattedText(ftext)\n\t\t\t\tpopTransform()\n\n\t\t\t})\n\n\t\t}\n\n\t}\n\n\tif (gopt.debug !== false) {\n\t\tenterDebugMode()\n\t}\n\n\tif (gopt.burp) {\n\t\tenterBurpMode()\n\t}\n\n\tfunction onLoading(action: (progress: number) => void) {\n\t\tgame.events.on(\"loading\", action)\n\t}\n\n\tfunction onResize(action: () => void) {\n\t\tapp.onResize(action)\n\t}\n\n\tfunction onError(action: (err: Error) => void) {\n\t\tgame.events.on(\"error\", action)\n\t}\n\n\tfunction handleErr(err: Error) {\n\n\t\taudio.ctx.suspend()\n\n\t\t// TODO: this should only run once\n\t\tapp.run(() => {\n\n\t\t\tdrawUnscaled(() => {\n\n\t\t\t\tconst pad = 32\n\t\t\t\tconst gap = 16\n\t\t\t\tconst gw = width()\n\t\t\t\tconst gh = height()\n\n\t\t\t\tconst textStyle = {\n\t\t\t\t\tsize: 36,\n\t\t\t\t\twidth: gw - pad * 2,\n\t\t\t\t\tletterSpacing: 4,\n\t\t\t\t\tlineSpacing: 4,\n\t\t\t\t\tfont: DBG_FONT,\n\t\t\t\t\tfixed: true,\n\t\t\t\t}\n\n\t\t\t\tdrawRect({\n\t\t\t\t\twidth: gw,\n\t\t\t\t\theight: gh,\n\t\t\t\t\tcolor: rgb(0, 0, 255),\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\tconst title = formatText({\n\t\t\t\t\t...textStyle,\n\t\t\t\t\ttext: \"Error\",\n\t\t\t\t\tpos: vec2(pad),\n\t\t\t\t\tcolor: rgb(255, 128, 0),\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\tdrawFormattedText(title)\n\n\t\t\t\tdrawText({\n\t\t\t\t\t...textStyle,\n\t\t\t\t\ttext: err.message,\n\t\t\t\t\tpos: vec2(pad, pad + title.height + gap),\n\t\t\t\t\tfixed: true,\n\t\t\t\t})\n\n\t\t\t\tpopTransform()\n\t\t\t\tgame.events.trigger(\"error\", err)\n\n\t\t\t})\n\n\t\t})\n\n\t}\n\n\tfunction onCleanup(action: () => void) {\n\t\tgc.push(action)\n\t}\n\n\tfunction quit() {\n\n\t\tgame.events.onOnce(\"frameEnd\", () => {\n\n\t\t\tapp.quit()\n\n\t\t\tfor (const name in winEvents) {\n\t\t\t\twindow.removeEventListener(name, winEvents[name])\n\t\t\t}\n\n\t\t\t// clear canvas\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT)\n\n\t\t\t// unbind everything\n\t\t\tconst numTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)\n\n\t\t\tfor (let unit = 0; unit < numTextureUnits; unit++) {\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + unit)\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, null)\n\t\t\t\tgl.bindTexture(gl.TEXTURE_CUBE_MAP, null)\n\t\t\t}\n\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, null)\n\t\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, null)\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n\t\t\t// run all scattered gc events\n\t\t\tgc.forEach((f) => f())\n\n\t\t\t// delete webgl buffers\n\t\t\tgl.deleteBuffer(gfx.vbuf)\n\t\t\tgl.deleteBuffer(gfx.ibuf)\n\n\t\t})\n\n\t}\n\n\tfunction tween<V extends LerpValue>(\n\t\tfrom: V,\n\t\tto: V,\n\t\tduration: number,\n\t\tsetValue: (value: V) => void,\n\t\teaseFunc = easings.linear,\n\t): TweenController {\n\t\tlet curTime = 0\n\t\tconst onEndEvents: Array<() => void> = []\n\t\tconst ev = onUpdate(() => {\n\t\t\tcurTime += dt()\n\t\t\tconst t = Math.min(curTime / duration, 1)\n\t\t\tsetValue(lerp(from, to, easeFunc(t)))\n\t\t\tif (t === 1) {\n\t\t\t\tev.cancel()\n\t\t\t\tsetValue(to)\n\t\t\t\tonEndEvents.forEach((action) => action())\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tget paused() {\n\t\t\t\treturn ev.paused\n\t\t\t},\n\t\t\tset paused(p) {\n\t\t\t\tev.paused = p\n\t\t\t},\n\t\t\tonEnd(action: () => void) {\n\t\t\t\tonEndEvents.push(action)\n\t\t\t},\n\t\t\tthen(action: () => void) {\n\t\t\t\tthis.onEnd(action)\n\t\t\t\treturn this\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\tev.cancel()\n\t\t\t},\n\t\t\tfinish() {\n\t\t\t\tev.cancel()\n\t\t\t\tsetValue(to)\n\t\t\t\tonEndEvents.forEach((action) => action())\n\t\t\t},\n\t\t}\n\t}\n\n\tlet isFirstFrame = true\n\n\t// main game loop\n\tapp.run(() => {\n\n\t\tif (!assets.loaded) {\n\t\t\tif (loadProgress() === 1 && !isFirstFrame) {\n\t\t\t\tassets.loaded = true\n\t\t\t\tgame.events.trigger(\"load\")\n\t\t\t}\n\t\t}\n\n\t\tif (!assets.loaded && gopt.loadingScreen !== false || isFirstFrame) {\n\t\t\tframeStart()\n\t\t\t// TODO: Currently if assets are not initially loaded no updates or timers will be run, however they will run if loadingScreen is set to false. What's the desired behavior or should we make them consistent?\n\t\t\tdrawLoadScreen()\n\t\t\tframeEnd()\n\t\t} else {\n\t\t\tif (!debug.paused) updateFrame()\n\t\t\tcheckFrame()\n\t\t\tframeStart()\n\t\t\tdrawFrame()\n\t\t\tif (gopt.debug !== false) drawDebug()\n\t\t\tframeEnd()\n\t\t}\n\n\t\tif (isFirstFrame) {\n\t\t\tisFirstFrame = false\n\t\t}\n\n\t\tgame.events.trigger(\"frameEnd\")\n\n\t})\n\n\t// update viewport based on user setting and fullscreen state\n\tfunction updateViewport() {\n\n\t\t// content size (scaled content size, with scale, stretch and letterbox)\n\t\t// view size (unscaled viewport size)\n\t\t// window size (will be the same as view size except letterbox mode)\n\n\t\t// canvas size\n\t\tconst pd = pixelDensity\n\t\tconst cw = gl.drawingBufferWidth / pd\n\t\tconst ch = gl.drawingBufferHeight / pd\n\n\t\tif (app.isFullscreen()) {\n\t\t\tconst ww = window.innerWidth\n\t\t\tconst wh = window.innerHeight\n\t\t\tconst rw = ww / wh\n\t\t\tconst rc = cw / ch\n\t\t\tif (rw > rc) {\n\t\t\t\tconst sw = window.innerHeight * rc\n\t\t\t\tgfx.viewport = {\n\t\t\t\t\tx: (ww - sw) / 2,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: sw,\n\t\t\t\t\theight: wh,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst sh = window.innerWidth / rc\n\t\t\t\tgfx.viewport = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: (wh - sh) / 2,\n\t\t\t\t\twidth: ww,\n\t\t\t\t\theight: sh,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif (gopt.letterbox) {\n\n\t\t\tif (!gopt.width || !gopt.height) {\n\t\t\t\tthrow new KaboomError(\"Letterboxing requires width and height defined.\")\n\t\t\t}\n\n\t\t\tconst rc = cw / ch\n\t\t\tconst rg = gopt.width / gopt.height\n\n\t\t\tif (rc > rg) {\n\t\t\t\tconst sw = ch * rg\n\t\t\t\tconst x = (cw - sw) / 2\n\t\t\t\tgfx.viewport = {\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: sw,\n\t\t\t\t\theight: ch,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst sh = cw / rg\n\t\t\t\tconst y = (ch - sh) / 2\n\t\t\t\tgfx.viewport = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: y,\n\t\t\t\t\twidth: cw,\n\t\t\t\t\theight: sh,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\n\t\t}\n\n\t\tif (gopt.stretch) {\n\t\t\tif (!gopt.width || !gopt.height) {\n\t\t\t\tthrow new KaboomError(\"Stretching requires width and height defined.\")\n\t\t\t}\n\t\t}\n\n\t\tgfx.viewport = {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: cw,\n\t\t\theight: ch,\n\t\t}\n\n\t}\n\n\tapp.onHide(() => {\n\t\tif (!gopt.backgroundAudio) {\n\t\t\taudio.ctx.suspend()\n\t\t}\n\t})\n\n\tapp.onShow(() => {\n\t\tif (!gopt.backgroundAudio) {\n\t\t\taudio.ctx.resume()\n\t\t}\n\t})\n\n\t// TODO: white artifact when scrolling, but disappears when done\n\t// TODO: if you resize to larger than the initial size it'll leave white space\n\t// TODO: this clears on scene change\n\tapp.onResize(() => {\n\t\tif (app.isFullscreen()) return\n\t\tconst fixedSize = gopt.width && gopt.height\n\t\tif (fixedSize && !gopt.stretch && !gopt.letterbox) return\n\t\tcanvas.width = canvas.offsetWidth * pixelDensity\n\t\tcanvas.height = canvas.offsetHeight * pixelDensity\n\t\tupdateViewport()\n\t\tif (!fixedSize) {\n\t\t\tgfx.frameBuffer.free()\n\t\t\tgfx.frameBuffer = new FrameBuffer(gl.drawingBufferWidth, gl.drawingBufferHeight)\n\t\t\tgfx.width = gl.drawingBufferWidth / pixelDensity\n\t\t\tgfx.height = gl.drawingBufferHeight / pixelDensity\n\t\t}\n\t})\n\n\tupdateViewport()\n\n\t// the exported ctx handle\n\tconst ctx: KaboomCtx = {\n\t\tVERSION,\n\t\t// asset load\n\t\tloadRoot,\n\t\tloadProgress,\n\t\tloadSprite,\n\t\tloadSpriteAtlas,\n\t\tloadSound,\n\t\tloadBitmapFont,\n\t\tloadFont,\n\t\tloadShader,\n\t\tloadShaderURL,\n\t\tloadAseprite,\n\t\tloadPedit,\n\t\tloadBean,\n\t\tloadJSON,\n\t\tload,\n\t\tgetSprite,\n\t\tgetSound,\n\t\tgetFont,\n\t\tgetBitmapFont,\n\t\tgetShader,\n\t\tgetAsset,\n\t\tAsset,\n\t\tSpriteData,\n\t\tSoundData,\n\t\t// query\n\t\twidth,\n\t\theight,\n\t\tcenter,\n\t\tdt,\n\t\ttime: app.time,\n\t\tscreenshot: app.screenshot,\n\t\trecord,\n\t\tisFocused,\n\t\tsetCursor: app.setCursor,\n\t\tgetCursor: app.getCursor,\n\t\tsetCursorLocked: app.setCursorLocked,\n\t\tisCursorLocked: app.isCursorLocked,\n\t\tsetFullscreen: app.setFullscreen,\n\t\tisFullscreen: app.isFullscreen,\n\t\tisTouchscreen: app.isTouchscreen,\n\t\tonLoad,\n\t\tonLoading,\n\t\tonResize,\n\t\tonGamepadConnect: app.onGamepadConnect,\n\t\tonGamepadDisconnect: app.onGamepadDisconnect,\n\t\tonError,\n\t\tonCleanup,\n\t\t// misc\n\t\tcamPos,\n\t\tcamScale,\n\t\tcamRot,\n\t\tshake,\n\t\ttoScreen,\n\t\ttoWorld,\n\t\tsetGravity,\n\t\tgetGravity,\n\t\tsetBackground,\n\t\tgetBackground,\n\t\tgetGamepads: app.getGamepads,\n\t\t// obj\n\t\tadd,\n\t\tmake,\n\t\tdestroy,\n\t\tdestroyAll,\n\t\tget,\n\t\treadd,\n\t\t// comps\n\t\tpos,\n\t\tscale,\n\t\trotate,\n\t\tcolor,\n\t\topacity,\n\t\tanchor,\n\t\tarea,\n\t\tsprite,\n\t\ttext,\n\t\trect,\n\t\tcircle,\n\t\tuvquad,\n\t\toutline,\n\t\tbody,\n\t\tdoubleJump,\n\t\tshader,\n\t\ttimer,\n\t\tfixed,\n\t\tstay,\n\t\thealth,\n\t\tlifespan,\n\t\tz,\n\t\tmove,\n\t\toffscreen,\n\t\tfollow,\n\t\tstate,\n\t\tfadeIn,\n\t\tmask,\n\t\ttile,\n\t\tagent,\n\t\t// group events\n\t\ton,\n\t\tonUpdate,\n\t\tonDraw,\n\t\tonAdd,\n\t\tonDestroy,\n\t\tonClick,\n\t\tonCollide,\n\t\tonCollideUpdate,\n\t\tonCollideEnd,\n\t\tonHover,\n\t\tonHoverUpdate,\n\t\tonHoverEnd,\n\t\t// input\n\t\tonKeyDown: app.onKeyDown,\n\t\tonKeyPress: app.onKeyPress,\n\t\tonKeyPressRepeat: app.onKeyPressRepeat,\n\t\tonKeyRelease: app.onKeyRelease,\n\t\tonMouseDown: app.onMouseDown,\n\t\tonMousePress: app.onMousePress,\n\t\tonMouseRelease: app.onMouseRelease,\n\t\tonMouseMove: app.onMouseMove,\n\t\tonCharInput: app.onCharInput,\n\t\tonTouchStart: app.onTouchStart,\n\t\tonTouchMove: app.onTouchMove,\n\t\tonTouchEnd: app.onTouchEnd,\n\t\tonScroll: app.onScroll,\n\t\tonHide: app.onHide,\n\t\tonShow: app.onShow,\n\t\tonGamepadButtonDown: app.onGamepadButtonDown,\n\t\tonGamepadButtonPress: app.onGamepadButtonPress,\n\t\tonGamepadButtonRelease: app.onGamepadButtonRelease,\n\t\tonGamepadStick: app.onGamepadStick,\n\t\tmousePos: mousePos,\n\t\tmouseDeltaPos: app.mouseDeltaPos,\n\t\tisKeyDown: app.isKeyDown,\n\t\tisKeyPressed: app.isKeyPressed,\n\t\tisKeyPressedRepeat: app.isKeyPressedRepeat,\n\t\tisKeyReleased: app.isKeyReleased,\n\t\tisMouseDown: app.isMouseDown,\n\t\tisMousePressed: app.isMousePressed,\n\t\tisMouseReleased: app.isMouseReleased,\n\t\tisMouseMoved: app.isMouseMoved,\n\t\tisGamepadButtonPressed: app.isGamepadButtonPressed,\n\t\tisGamepadButtonDown: app.isGamepadButtonDown,\n\t\tisGamepadButtonReleased: app.isGamepadButtonReleased,\n\t\t// getGamepadStick,\n\t\tcharInputted: app.charInputted,\n\t\t// timer\n\t\tloop,\n\t\twait,\n\t\t// audio\n\t\tplay,\n\t\tvolume,\n\t\tburp,\n\t\taudioCtx: audio.ctx,\n\t\t// math\n\t\tTimer,\n\t\tLine,\n\t\tRect,\n\t\tCircle,\n\t\tPolygon,\n\t\tVec2,\n\t\tColor,\n\t\tMat4,\n\t\tQuad,\n\t\tRNG,\n\t\trand,\n\t\trandi,\n\t\trandSeed,\n\t\tvec2,\n\t\trgb,\n\t\thsl2rgb,\n\t\tquad,\n\t\tchoose,\n\t\tchance,\n\t\tlerp,\n\t\ttween,\n\t\teasings,\n\t\tmap,\n\t\tmapc,\n\t\twave,\n\t\tdeg2rad,\n\t\trad2deg,\n\t\tclamp,\n\t\ttestLineLine,\n\t\ttestRectRect,\n\t\ttestRectLine,\n\t\ttestRectPoint,\n\t\ttestCirclePolygon,\n\t\ttestLinePoint,\n\t\ttestLineCircle,\n\t\t// raw draw\n\t\tdrawSprite,\n\t\tdrawText,\n\t\tformatText,\n\t\tdrawRect,\n\t\tdrawLine,\n\t\tdrawLines,\n\t\tdrawTriangle,\n\t\tdrawCircle,\n\t\tdrawEllipse,\n\t\tdrawUVQuad,\n\t\tdrawPolygon,\n\t\tdrawFormattedText,\n\t\tdrawMasked,\n\t\tdrawSubtracted,\n\t\tpushTransform,\n\t\tpopTransform,\n\t\tpushTranslate,\n\t\tpushScale,\n\t\tpushRotate,\n\t\tpushMatrix,\n\t\tusePostEffect,\n\t\t// debug\n\t\tdebug,\n\t\t// scene\n\t\tscene,\n\t\tgo,\n\t\tonSceneLeave,\n\t\t// level\n\t\taddLevel,\n\t\t// storage\n\t\tgetData,\n\t\tsetData,\n\t\tdownload,\n\t\tdownloadJSON,\n\t\tdownloadText,\n\t\tdownloadBlob,\n\t\t// plugin\n\t\tplug,\n\t\t// char sets\n\t\tASCII_CHARS,\n\t\t// dom\n\t\tcanvas: app.canvas(),\n\t\t// misc\n\t\taddKaboom,\n\t\t// dirs\n\t\tLEFT: Vec2.LEFT,\n\t\tRIGHT: Vec2.RIGHT,\n\t\tUP: Vec2.UP,\n\t\tDOWN: Vec2.DOWN,\n\t\t// colors\n\t\tRED: Color.RED,\n\t\tGREEN: Color.GREEN,\n\t\tBLUE: Color.BLUE,\n\t\tYELLOW: Color.YELLOW,\n\t\tMAGENTA: Color.MAGENTA,\n\t\tCYAN: Color.CYAN,\n\t\tWHITE: Color.WHITE,\n\t\tBLACK: Color.BLACK,\n\t\tquit,\n\t\t// helpers\n\t\tEvent,\n\t\tEventHandler,\n\t\tEventController,\n\t\tKaboomError,\n\t}\n\n\tif (gopt.plugins) {\n\t\tgopt.plugins.forEach(plug)\n\t}\n\n\t// export everything to window if global is set\n\tif (gopt.global !== false) {\n\t\tfor (const k in ctx) {\n\t\t\twindow[k] = ctx[k]\n\t\t}\n\t}\n\n\tapp.canvas().focus()\n\n\treturn ctx\n\n}\n"],
  "mappings": "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EAAE,EACrDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,GAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EACpDC,GAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CAAC,EACnDC,GAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CAAC,EACnDC,EAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CAAC,EACnDC,GAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,EAAE,EAAI,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CAAC,EACnDC,GAAM,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CAAC,EAAI,KAAK,EAAE,CA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",
  "names": ["deg2rad", "deg", "__name", "rad2deg", "rad", "clamp", "val", "min", "max", "lerp", "a", "b", "t", "Vec2", "Color", "map", "v", "l1", "h1", "l2", "h2", "mapc", "_Vec2", "x", "y", "angle", "args", "p2", "vec2", "s", "len", "normal", "on", "dest", "cos", "sin", "n", "m", "other", "Rect", "_Color", "r", "g", "arr", "hex", "result", "h", "l", "hue2rgb", "p", "q", "rgb", "hsl2rgb", "Quad", "_Quad", "quad", "w", "Mat4", "_Mat4", "m0", "m1", "m4", "m5", "out", "i", "j", "det", "f00", "f01", "f02", "f03", "f04", "f05", "f06", "f07", "f08", "f09", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "wave", "lo", "hi", "f", "A", "C", "M", "RNG", "seed", "defRNG", "randSeed", "rand", "randi", "chance", "choose", "list", "testRectRect", "r1", "r2", "__name", "testLineLineT", "l1", "l2", "denom", "ua", "ub", "testLineLine", "t", "vec2", "testRectLine", "l", "testRectPoint", "pts", "Line", "testRectPoint", "pt", "__name", "testLinePoint", "l", "pt", "v1", "v2", "t", "__name", "testLineCircle", "circle", "v", "a", "centerToOrigin", "b", "c", "dis", "t1", "t2", "testCirclePoint", "testCirclePoint", "c", "p", "__name", "testCirclePolygon", "c", "p", "prev", "cur", "testLineCircle", "Line", "testCirclePoint", "testPolygonPoint", "__name", "testPolygonPoint", "poly", "pt", "p", "i", "j", "__name", "Line", "_Line", "__name", "p1", "p2", "m", "Rect", "_Rect", "pos", "width", "height", "Vec2", "Polygon", "pt", "p", "min", "max", "dx", "dy", "Circle", "_Circle", "center", "radius", "tr", "Ellipse", "vec2", "_Ellipse", "rx", "ry", "_Polygon", "pts", "total", "l", "i", "sat", "overlap", "displacement", "poly", "a", "axisProj", "min1", "max1", "j", "q", "min2", "max2", "o", "o1", "o2", "IDList", "__name", "args", "v", "id", "EventController", "_EventController", "cancel", "events", "ev", "e", "p", "Event", "action", "res", "EventHandler", "name", "deepEq", "o1", "o2", "t1", "t2", "k1", "k2", "k", "v1", "v2", "base64ToArrayBuffer", "base64", "binstr", "len", "bytes", "i", "dataURLToArrayBuffer", "url", "download", "filename", "a", "downloadText", "text", "downloadJSON", "data", "downloadBlob", "blob", "isDataURL", "str", "getExt", "uid", "BinaryHeap", "__name", "compareFn", "a", "b", "item", "lastItem", "pos", "parent", "child", "index1", "index2", "gamepad_default", "ButtonState", "__name", "btn", "GamepadState", "FPSCounter", "dt", "a", "b", "app_default", "opt", "state", "Vec2", "EventHandler", "canvas", "time", "fps", "numFrames", "screenshot", "setCursor", "c", "getCursor", "setCursorLocked", "res", "e", "isCursorLocked", "enterFullscreen", "el", "exitFullscreen", "getFullscreenElement", "setFullscreen", "f", "isFullscreen", "quit", "name", "canvasEvents", "docEvents", "winEvents", "resizeObserver", "run", "action", "accumulatedDt", "frame", "t", "loopTime", "realDt", "desiredDt", "processInput", "resetInput", "isTouchscreen", "mousePos", "mouseDeltaPos", "isMousePressed", "m", "isMouseDown", "isMouseReleased", "isMouseMoved", "isKeyPressed", "k", "isKeyPressedRepeat", "isKeyDown", "isKeyReleased", "isGamepadButtonPressed", "isGamepadButtonDown", "isGamepadButtonReleased", "onResize", "onKeyDown", "key", "onKeyPress", "onKeyPressRepeat", "onKeyRelease", "onMouseDown", "mouse", "onMousePress", "onMouseRelease", "onMouseMove", "onCharInput", "onTouchStart", "onTouchMove", "onTouchEnd", "onScroll", "onHide", "onShow", "onGamepadButtonDown", "onGamepadButtonPress", "onGamepadButtonRelease", "onGamepadStick", "stick", "v", "onGamepadConnect", "onGamepadDisconnect", "getGamepadStick", "charInputted", "getGamepads", "processGamepad", "s", "registerGamepad", "browserGamepad", "gamepad", "removeGamepad", "g", "map", "gamepad_default", "gamepadState", "i", "stickName", "value", "MOUSE_BUTTONS", "PREVENT_DEFAULT_KEYS", "KEY_ALIAS", "touches", "box", "kbGamepad", "entries", "entry", "c2", "c3", "c4", "c5", "easings", "x", "easings_default", "Timer", "__name", "time", "action", "dt", "VERSION", "ASCII_CHARS", "DEF_ANCHOR", "BG_GRID_SIZE", "DEF_FONT", "DBG_FONT", "DEF_TEXT_SIZE", "DEF_TEXT_CACHE_SIZE", "MAX_TEXT_CACHE_SIZE", "FONT_ATLAS_WIDTH", "FONT_ATLAS_HEIGHT", "SPRITE_ATLAS_WIDTH", "SPRITE_ATLAS_HEIGHT", "UV_PAD", "DEF_HASH_GRID_SIZE", "DEF_FONT_FILTER", "LOG_MAX", "LOG_TIME", "VERTEX_FORMAT", "STRIDE", "sum", "f", "MAX_BATCHED_QUAD", "MAX_BATCHED_VERTS", "MAX_BATCHED_INDICES", "VERT_TEMPLATE", "FRAG_TEMPLATE", "DEF_VERT", "DEF_FRAG", "COMP_DESC", "COMP_EVENTS", "anchorPt", "orig", "Vec2", "__name", "alignPt", "align", "createEmptyAudioBuffer", "ctx", "kaboom_default", "gopt", "root", "canvas", "gscale", "fixedSize", "cw", "ch", "pixelDensity", "styles", "fontCacheCanvas", "fontCacheCtx", "app", "app_default", "gc", "gl", "Texture", "w", "h", "opt", "filter", "wrap", "img", "tex", "x", "y", "KaboomError", "msg", "TexPacker", "pos", "Quad", "FrameBuffer", "gfx", "defShader", "makeShader", "emptyTex", "frameBuffer", "bgColor", "bgAlpha", "Color", "vbuf", "offset", "i", "ibuf", "bgTex", "Mat4", "SpriteData", "frames", "anims", "slice9", "src", "data", "quad", "assets", "slice", "url", "loadImg", "SoundData", "buf", "resolve", "reject", "audio", "isDataURL", "dataURLToArrayBuffer", "fetchArrayBuffer", "masterNode", "burpSnd", "burp_default", "err", "Asset", "Event", "loader", "asset", "action", "AssetBucket", "name", "id", "handle", "loaded", "game", "EventHandler", "make", "load", "prom", "loadProgress", "buckets", "bucket", "loadRoot", "path", "fetchURL", "res", "fetchJSON", "fetchText", "loadJSON", "FontData", "face", "rgb", "loadFont", "font", "loadBitmapFont", "gw", "gh", "makeFont", "dx", "dy", "qw", "qh", "j", "loadSpriteAtlas", "rej", "json", "atlas", "map", "info", "spr", "createSpriteSheet", "images", "width", "height", "merged", "loadSprite", "s", "loadPedit", "loadAseprite", "imgSrc", "jsonSrc", "getExt", "resolveJSON", "size", "anim", "loadShader", "vert", "frag", "loadShaderURL", "resolveUrl", "vcode", "fcode", "loadSound", "loadBean", "bean_default", "getSprite", "getSound", "getFont", "getBitmapFont", "getShader", "getAsset", "resolveSprite", "resolveSound", "snd", "resolveShader", "shader", "resolveFont", "bfont", "volume", "v", "play", "paused", "srcNode", "onEndEvents", "gainNode", "startTime", "stopTime", "started", "getTime", "start", "t", "d", "cloneNode", "oldNode", "newNode", "p", "time", "val", "l", "burp", "vertSrc", "fragSrc", "vertShader", "fragShader", "prog", "formatShaderError", "FMT", "match", "vertError", "fragError", "uniform", "loc", "chars", "cols", "charMap", "drawRaw", "verts", "indices", "fixed", "shaderSrc", "deepEq", "flush", "transform", "pt", "screen2ndc", "frameStart", "drawUnscaled", "drawUVQuad", "usePostEffect", "frameEnd", "ow", "oh", "drawTexture", "pushMatrix", "m", "pushTranslate", "args", "vec2", "pushScale", "pushRotate", "a", "pushTransform", "popTransform", "q", "color", "opacity", "uvPadX", "uvPadY", "qx", "qy", "scale", "repX", "repY", "drawSprite", "getArcPts", "radiusX", "radiusY", "end", "deg2rad", "pts", "nverts", "step", "drawRect", "r", "drawPolygon", "drawLine", "p1", "p2", "dis", "drawLines", "minSLen", "radius", "drawCircle", "drawTriangle", "drawEllipse", "polyOpt", "npts", "n", "drawStenciled", "content", "mask", "test", "drawMasked", "drawSubtracted", "getViewportScale", "applyCharTransform", "fchar", "tr", "TEXT_STYLE_RE", "compileStyledText", "text", "charStyleMap", "renderText", "idxOffset", "origIdx", "fontAtlases", "formatText", "fontName", "opts", "c2d", "lineSpacing", "letterSpacing", "curX", "tw", "th", "lines", "curLine", "cursor", "lastSpace", "lastSpaceWidth", "fchars", "line", "ox", "idx", "style", "drawText", "drawFormattedText", "ftext", "winEvents", "windowToContent", "contentToView", "mousePos", "handleErr", "debugPaused", "debug", "updateFrame", "max", "get", "dt", "camPos", "center", "camScale", "camRot", "angle", "shake", "intensity", "toScreen", "toWorld", "calcTransform", "obj", "comps", "compStates", "cleanups", "events", "inputEvents", "onCurCompCleanup", "uid", "e", "trigger", "o", "child", "tag", "o1", "o2", "children", "maskFunc", "comp", "k", "prop", "func", "c", "checkDeps", "dep", "list", "recurse", "isChild", "onAdd", "onDestroy", "ctrl", "cb", "evs", "ev", "on", "event", "IDList", "onUpdate", "add", "onDraw", "onCollide", "t1", "t2", "b", "col", "onCollideUpdate", "onCollideEnd", "forAllCurrentAndFuture", "onClick", "EventController", "onHover", "onHoverUpdate", "onHoverEnd", "wait", "actions", "loop", "curTimer", "newAction", "enterDebugMode", "toFixed", "clamp", "enterBurpMode", "setGravity", "g", "getGravity", "setBackground", "getBackground", "dest", "speed", "diff", "isFixed", "rotate", "easeFunc", "easings_default", "tween", "anchor", "z", "follow", "move", "dir", "DEF_OFFSCREEN_DIS", "offscreen", "distance", "isOut", "screenRect", "Rect", "testRectPoint", "area", "colliding", "collidingThisFrame", "Polygon", "Circle", "mpos", "other", "hovering", "testPolygonPoint", "localArea", "getRenderProps", "sprite", "spriteData", "curAnim", "curAnimDir", "spriteLoadedEvent", "calcTexScale", "left", "right", "top", "bottom", "iw", "ih", "w1", "w3", "w2", "h1", "h3", "h2", "quads", "uv", "setSpriteData", "onLoad", "prevAnim", "update", "nt", "rect", "uvquad", "circle", "outline", "timer", "from", "to", "duration", "setValue", "curTime", "lerp", "DEF_JUMP_FORCE", "MAX_VEL", "body", "vel", "curPlatform", "lastPlatformPos", "wantFall", "tmass", "col2", "prevVelY", "force", "doubleJump", "numJumps", "jumpsLeft", "stay", "scenesToStay", "health", "hp", "maxHP", "lifespan", "fade", "state", "initState", "stateList", "transitions", "initStateEvents", "didFirstEnter", "oldState", "available", "fadeIn", "done", "scene", "def", "go", "onSceneLeave", "getData", "key", "setData", "plug", "plugin", "funcs", "funcsObj", "EdgeMask", "tile", "tilePos", "isObstacle", "cost", "edges", "getEdgeMask", "loopup", "edgeMask", "level", "is", "addLevel", "numRows", "numColumns", "spatialMap", "costMap", "edgeMap", "connectivityMap", "tile2Hash", "hash2Tile", "hash", "createSpatialMap", "insertIntoSpatialMap", "removeFromSpatialMap", "index", "updateSpatialMap", "spatialMapChanged", "createCostMap", "objects", "createEdgeMap", "len", "createConnectivityMap", "traverse", "frontier", "getNeighbours", "getCost", "node", "neighbour", "getHeuristic", "goal", "diagonals", "levelComp", "hasPos", "hasTile", "BinaryHeap", "cameFrom", "costSoFar", "current", "neighbours", "next", "newCost", "row", "keys", "agent", "target", "navMapChangedEvent", "record", "frameRate", "stream", "audioDest", "recorder", "chunks", "filename", "blob", "downloadBlob", "isFocused", "destroy", "readd", "destroyAll", "boom", "kaSprite", "ka_default", "boomSprite", "boom_default", "addKaboom", "kaboom", "ka", "Collision", "source", "resolved", "checkFrame", "grid", "cellSize", "stack", "checkObj", "aobj", "bbox", "xmin", "ymin", "xmax", "ymax", "checked", "cell", "check", "sat", "col1", "drawFrame", "cam", "rand", "drawLoadScreen", "progress", "drawInspectText", "txt", "pad", "ftxt", "bw", "bh", "drawDebug", "inspecting", "flipped", "wave", "logs", "log", "str", "onLoading", "onResize", "onError", "textStyle", "title", "onCleanup", "quit", "numTextureUnits", "unit", "isFirstFrame", "updateViewport", "pd", "ww", "wh", "rw", "rc", "sw", "sh", "rg", "Timer", "Line", "RNG", "randi", "randSeed", "hsl2rgb", "choose", "chance", "mapc", "rad2deg", "testLineLine", "testRectRect", "testRectLine", "testCirclePolygon", "testLinePoint", "testLineCircle", "download", "downloadJSON", "downloadText"]
}
