{
  "version": 3,
  "sources": ["../src/math.ts", "../src/utils.ts", "../src/gamepad.json", "../src/app.ts", "../src/gfx.ts", "../src/assets.ts", "../src/easings.ts", "../src/texPacker.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\t// TODO: use range of [0, 360] [0, 100] [0, 100]?\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\ttoHSL(): [number, number, number] {\n\t\tconst r = this.r / 255\n\t\tconst g = this.g / 255\n\t\tconst b = this.b / 255\n\t\tconst max = Math.max(r, g, b), min = Math.min(r, g, b)\n\t\tlet h = (max + min) / 2\n\t\tlet s = h\n\t\tconst l = h\n\t\tif (max == min) {\n\t\t\th = s = 0\n\t\t} else {\n\t\t\tconst d = max - min\n\t\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\t\t\tswitch (max) {\n\t\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break\n\t\t\t\tcase g: h = (b - r) / d + 2; break\n\t\t\t\tcase b: h = (r - g) / d + 4; break\n\t\t\t}\n\t\t\th /= 6\n\t\t}\n\t\treturn [ h, s, l ]\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 = 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 Registry<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: Registry<(...args: Args) => void> = new Registry()\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\tif (o1 === o2) {\n\t\treturn true\n\t}\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\tif (Array.isArray(o1) !== Array.isArray(o2)) {\n\t\t\treturn false\n\t\t}\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 (!deepEq(v1, v2)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\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 getFileExt = (p: string) => p.split(\".\").pop()\nexport const getFileName = (p: string) => p.split(\".\").slice(0, -1).join(\".\")\n\ntype Func = (...args: any[]) => any\n\nexport function overload2<A extends Func, B extends Func>(fn1: A, fn2: B): A & B {\n\treturn ((...args) => {\n\t\tconst al = args.length\n\t\tif (al === fn1.length) return fn1(...args)\n\t\tif (al === fn2.length) return fn2(...args)\n\t}) as A & B\n}\n\nexport function overload3<\n\tA extends Func,\n\tB extends Func,\n\tC extends Func,\n>(fn1: A, fn2: B, fn3: C): A & B & C {\n\treturn ((...args) => {\n\t\tconst al = args.length\n\t\tif (al === fn1.length) return fn1(...args)\n\t\tif (al === fn2.length) return fn2(...args)\n\t\tif (al === fn3.length) return fn3(...args)\n\t}) as A & B & C\n}\n\nexport function overload4<\n\tA extends Func,\n\tB extends Func,\n\tC extends Func,\n\tD extends Func,\n>(fn1: A, fn2: B, fn3: C, fn4: D): A & B & C & D {\n\treturn ((...args) => {\n\t\tconst al = args.length\n\t\tif (al === fn1.length) return fn1(...args)\n\t\tif (al === fn2.length) return fn2(...args)\n\t\tif (al === fn3.length) return fn3(...args)\n\t\tif (al === fn4.length) return fn4(...args)\n\t}) as A & B & C & D\n}\n\nexport const uid = (() => {\n\tlet id = 0\n\treturn () => id++\n})()\n\nexport const getErrorMessage = (error: unknown) =>\n\t(error instanceof Error) ? error.message : String(error)\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\nconst enum EnumRunesCode {\n\tHIGH_SURROGATE_START = 0xd800,\n\tHIGH_SURROGATE_END = 0xdbff,\n\n\tLOW_SURROGATE_START = 0xdc00,\n\n\tREGIONAL_INDICATOR_START = 0x1f1e6,\n\tREGIONAL_INDICATOR_END = 0x1f1ff,\n\n\tFITZPATRICK_MODIFIER_START = 0x1f3fb,\n\tFITZPATRICK_MODIFIER_END = 0x1f3ff,\n\n\tVARIATION_MODIFIER_START = 0xfe00,\n\tVARIATION_MODIFIER_END = 0xfe0f,\n\n\tDIACRITICAL_MARKS_START = 0x20d0,\n\tDIACRITICAL_MARKS_END = 0x20ff,\n\n\tSUBDIVISION_INDICATOR_START = 0x1f3f4,\n\tTAGS_START = 0xe0000,\n\tTAGS_END = 0xe007f,\n\n\tZWJ = 0x200d,\n}\n\nconst GRAPHEMES = Object.freeze([\n\t0x0308, // ( \u25CC\u0308 ) COMBINING DIAERESIS\n\t0x0937, // ( \u0937 ) DEVANAGARI LETTER SSA\n\t0x093F, // ( \u093F ) DEVANAGARI VOWEL SIGN I\n\t0x0BA8, // ( \u0BA8 ) TAMIL LETTER NA\n\t0x0BBF, // ( \u0BBF ) TAMIL VOWEL SIGN I\n\t0x0BCD, // ( \u25CC\u0BCD) TAMIL SIGN VIRAMA\n\t0x0E31, // ( \u25CC\u0E31 ) THAI CHARACTER MAI HAN-AKAT\n\t0x0E33, // ( \u0E33 ) THAI CHARACTER SARA AM\n\t0x0E40, // ( \u0E40 ) THAI CHARACTER SARA E\n\t0x0E49, // ( \u0E40 ) THAI CHARACTER MAI THO\n\t0x1100, // ( \u1100 ) HANGUL CHOSEONG KIYEOK\n\t0x1161, // ( \u1161 ) HANGUL JUNGSEONG A\n\t0x11A8, // ( \u11A8 ) HANGUL JONGSEONG KIYEOK\n])\n\nenum EnumCodeUnits {\n\tunit_1 = 1,\n\tunit_2 = 2,\n\tunit_4 = 4,\n}\n\nexport function runes(string: string): string[] {\n\tif (typeof string !== \"string\") {\n\t\tthrow new TypeError(\"string cannot be undefined or null\")\n\t}\n\tconst result: string[] = []\n\tlet i = 0\n\tlet increment = 0\n\twhile (i < string.length) {\n\t\tincrement += nextUnits(i + increment, string)\n\t\tif (isGrapheme(string[i + increment])) {\n\t\t\tincrement++\n\t\t}\n\t\tif (isVariationSelector(string[i + increment])) {\n\t\t\tincrement++\n\t\t}\n\t\tif (isDiacriticalMark(string[i + increment])) {\n\t\t\tincrement++\n\t\t}\n\t\tif (isZeroWidthJoiner(string[i + increment])) {\n\t\t\tincrement++\n\t\t\tcontinue\n\t\t}\n\t\tresult.push(string.substring(i, i + increment))\n\t\ti += increment\n\t\tincrement = 0\n\t}\n\treturn result\n}\n\n// Decide how many code units make up the current character.\n// BMP characters: 1 code unit\n// Non-BMP characters (represented by surrogate pairs): 2 code units\n// Emoji with skin-tone modifiers: 4 code units (2 code points)\n// Country flags: 4 code units (2 code points)\n// Variations: 2 code units\n// Subdivision flags: 14 code units (7 code points)\nfunction nextUnits(i: number, string: string) {\n\tconst current = string[i]\n\t// If we don't have a value that is part of a surrogate pair, or we're at\n\t// the end, only take the value at i\n\tif (!isFirstOfSurrogatePair(current) || i === string.length - 1) {\n\t\treturn EnumCodeUnits.unit_1\n\t}\n\n\tconst currentPair = current + string[i + 1]\n\tconst nextPair = string.substring(i + 2, i + 5)\n\n\t// Country flags are comprised of two regional indicator symbols,\n\t// each represented by a surrogate pair.\n\t// See http://emojipedia.org/flags/\n\t// If both pairs are regional indicator symbols, take 4\n\tif (isRegionalIndicator(currentPair) && isRegionalIndicator(nextPair)) {\n\t\treturn EnumCodeUnits.unit_4\n\t}\n\n\t// https://unicode.org/emoji/charts/full-emoji-list.html#subdivision-flag\n\t// See https://emojipedia.org/emoji-tag-sequence/\n\t// If nextPair is in Tags(https://en.wikipedia.org/wiki/Tags_(Unicode_block)),\n\t// then find next closest U+E007F(CANCEL TAG)\n\tif (isSubdivisionFlag(currentPair) &&\tisSupplementarySpecialpurposePlane(nextPair)) {\n\t\treturn string.slice(i).indexOf(String.fromCodePoint(EnumRunesCode.TAGS_END)) + 2\n\t}\n\n\t// If the next pair make a Fitzpatrick skin tone\n\t// modifier, take 4\n\t// See http://emojipedia.org/modifiers/\n\t// Technically, only some code points are meant to be\n\t// combined with the skin tone modifiers. This function\n\t// does not check the current pair to see if it is\n\t// one of them.\n\tif (isFitzpatrickModifier(nextPair)) {\n\t\treturn EnumCodeUnits.unit_4\n\t}\n\treturn EnumCodeUnits.unit_2\n}\n\nfunction isFirstOfSurrogatePair(string: string) {\n\treturn string && betweenInclusive(string[0].charCodeAt(0), EnumRunesCode.HIGH_SURROGATE_START, EnumRunesCode.HIGH_SURROGATE_END)\n}\n\nfunction isRegionalIndicator(string: string) {\n\treturn betweenInclusive(codePointFromSurrogatePair(string), EnumRunesCode.REGIONAL_INDICATOR_START, EnumRunesCode.REGIONAL_INDICATOR_END)\n}\n\nfunction isSubdivisionFlag(string: string) {\n\treturn betweenInclusive(codePointFromSurrogatePair(string),\tEnumRunesCode.SUBDIVISION_INDICATOR_START, EnumRunesCode.SUBDIVISION_INDICATOR_START)\n}\n\nfunction isFitzpatrickModifier(string: string) {\n\treturn betweenInclusive(codePointFromSurrogatePair(string), EnumRunesCode.FITZPATRICK_MODIFIER_START, EnumRunesCode.FITZPATRICK_MODIFIER_END)\n}\n\nfunction isVariationSelector(string: string) {\n\treturn typeof string === \"string\" && betweenInclusive(string.charCodeAt(0), EnumRunesCode.VARIATION_MODIFIER_START, EnumRunesCode.VARIATION_MODIFIER_END)\n}\n\nfunction isDiacriticalMark(string: string) {\n\treturn typeof string === \"string\" && betweenInclusive(string.charCodeAt(0), EnumRunesCode.DIACRITICAL_MARKS_START, EnumRunesCode.DIACRITICAL_MARKS_END)\n}\n\nfunction isSupplementarySpecialpurposePlane(string: string) {\n\tconst codePoint = string.codePointAt(0)\n\treturn (typeof string === \"string\" &&\ttypeof codePoint === \"number\" && betweenInclusive(codePoint, EnumRunesCode.TAGS_START, EnumRunesCode.TAGS_END))\n}\n\nfunction isGrapheme(string: string) {\n\treturn typeof string === \"string\" && GRAPHEMES.includes(string.charCodeAt(0))\n}\n\nfunction isZeroWidthJoiner(string: string) {\n\treturn typeof string === \"string\" && string.charCodeAt(0) === EnumRunesCode.ZWJ\n}\n\nfunction codePointFromSurrogatePair(pair: string) {\n\tconst highOffset = pair.charCodeAt(0) - EnumRunesCode.HIGH_SURROGATE_START\n\tconst lowOffset = pair.charCodeAt(1) - EnumRunesCode.LOW_SURROGATE_START\n\treturn (highOffset << 10) + lowOffset + 0x10000\n}\n\nfunction betweenInclusive(value: number, lower: number, upper: number) {\n\treturn value >= lower && value <= upper\n}\n\nexport function substring(string: string, start?: number, width?: number) {\n\tconst chars = runes(string)\n\tif (start === undefined) {\n\t\treturn string\n\t}\n\tif (start >= chars.length) {\n\t\treturn \"\"\n\t}\n\tconst rest = chars.length - start\n\tconst stringWidth = width === undefined ? rest : width\n\tlet endIndex = start + stringWidth\n\tif (endIndex > (start + rest)) {\n\t\tendIndex = undefined\n\t}\n\treturn chars.slice(start, endIndex).join(\"\")\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\tCursor,\n\tKey,\n\tMouseButton,\n\tGamepadButton,\n\tGamepadStick,\n\tGamepadDef,\n\tKGamePad,\n} from \"./types\"\n\nimport {\n\tVec2,\n\tmap,\n} from \"./math\"\n\nimport {\n\tEventHandler,\n\tEventController,\n\toverload2,\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 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 = overload2((action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyDown\", action)\n\t}, (key: Key, action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyDown\", (k) => k === key && action(key))\n\t})\n\n\tconst onKeyPress = overload2((action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyPress\", action)\n\t}, (key: Key, action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyPress\", (k) => k === key && action(key))\n\t})\n\n\tconst onKeyPressRepeat = overload2((action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyPressRepeat\", action)\n\t}, (key: Key, action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyPressRepeat\", (k) => k === key && action(key))\n\t})\n\n\tconst onKeyRelease = overload2((action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyRelease\", action)\n\t}, (key: Key, action: (key: Key) => void) => {\n\t\treturn state.events.on(\"keyRelease\", (k) => k === key && action(key))\n\t})\n\n\tconst onMouseDown = overload2((action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mouseDown\", (m) => action(m))\n\t}, (mouse: MouseButton, action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mouseDown\", (m) => m === mouse && action(m))\n\t})\n\n\tconst onMousePress = overload2((action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mousePress\", (m) => action(m))\n\t}, (mouse: MouseButton, action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mousePress\", (m) => m === mouse && action(m))\n\t})\n\n\tconst onMouseRelease = overload2((action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mouseRelease\", (m) => action(m))\n\t}, (mouse: MouseButton, action: (m: MouseButton) => void) => {\n\t\treturn state.events.on(\"mouseRelease\", (m) => m === mouse && action(m))\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\tconst pd = opt.pixelDensity || window.devicePixelRatio || 1\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\tif (isFullscreen()) {\n\t\t\tconst cw = state.canvas.width / pd\n\t\t\tconst ch = state.canvas.height / pd\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 ratio = wh / ch\n\t\t\t\tconst offset = (ww - (cw * ratio)) / 2\n\t\t\t\tmousePos.x = map(e.offsetX - offset, 0, cw * ratio, 0, cw)\n\t\t\t\tmousePos.y = map(e.offsetY, 0, ch * ratio, 0, ch)\n\t\t\t} else {\n\t\t\t\tconst ratio = ww / cw\n\t\t\t\tconst offset = (wh - (ch * ratio)) / 2\n\t\t\t\tmousePos.x = map(e.offsetX , 0, cw * ratio, 0, cw)\n\t\t\t\tmousePos.y = map(e.offsetY - offset, 0, ch * ratio, 0, ch)\n\t\t\t}\n\t\t}\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\t// TODO: handle all touches at once instead of sequentially\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: state.canvas,\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", "import type {\n\tImageSource,\n\tTextureOpt,\n\tTexFilter,\n\tUniform,\n} from \"./types\"\n\nimport {\n\tMat4,\n\tVec2,\n\tColor,\n} from \"./math\"\n\nimport {\n\tdeepEq,\n} from \"./utils\"\n\nexport type GfxCtx = ReturnType<typeof initGfx>\n\nexport class Texture {\n\n\tctx: GfxCtx\n\tsrc: null | ImageSource = null\n\tglTex: WebGLTexture\n\twidth: number\n\theight: number\n\n\tconstructor(ctx: GfxCtx, w: number, h: number, opt: TextureOpt = {}) {\n\n\t\tthis.ctx = ctx\n\t\tconst gl = ctx.gl\n\t\tthis.glTex = ctx.gl.createTexture()\n\t\tctx.onDestroy(() => this.free())\n\n\t\tthis.width = w\n\t\tthis.height = h\n\n\t\t// TODO: no default\n\t\tconst filter = {\n\t\t\t\"linear\": gl.LINEAR,\n\t\t\t\"nearest\": gl.NEAREST,\n\t\t}[opt.filter ?? ctx.opts.texFilter] ?? gl.NEAREST\n\n\t\tconst wrap = {\n\t\t\t\"repeat\": gl.REPEAT,\n\t\t\t\"clampToEadge\": gl.CLAMP_TO_EDGE,\n\t\t}[opt.wrap] ?? gl.CLAMP_TO_EDGE\n\n\t\tthis.bind()\n\n\t\tif (w && h) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0, gl.RGBA,\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t)\n\t\t}\n\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter)\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter)\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap)\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap)\n\t\tthis.unbind()\n\n\t}\n\n\tstatic fromImage(ctx: GfxCtx, img: ImageSource, opt: TextureOpt = {}): Texture {\n\t\tconst tex = new Texture(ctx, img.width, img.height, opt)\n\t\ttex.update(img)\n\t\ttex.src = img\n\t\treturn tex\n\t}\n\n\tupdate(img: ImageSource, x = 0, y = 0) {\n\t\tconst gl = this.ctx.gl\n\t\tthis.bind()\n\t\tgl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, img)\n\t\tthis.unbind()\n\t}\n\n\tbind() {\n\t\tthis.ctx.pushTexture2D(this.glTex)\n\t}\n\n\tunbind() {\n\t\tthis.ctx.popTexture2D()\n\t}\n\n\tfree() {\n\t\tthis.ctx.gl.deleteTexture(this.glTex)\n\t}\n\n}\n\nexport class FrameBuffer {\n\n\tctx: GfxCtx\n\ttex: Texture\n\tglFramebuffer: WebGLFramebuffer\n\tglRenderbuffer: WebGLRenderbuffer\n\n\tconstructor(ctx: GfxCtx, w: number, h: number, opt: TextureOpt = {}) {\n\n\t\tthis.ctx = ctx\n\t\tconst gl = ctx.gl\n\t\tctx.onDestroy(() => this.free())\n\t\tthis.tex = new Texture(ctx, w, h, opt)\n\t\tthis.glFramebuffer = gl.createFramebuffer()\n\t\tthis.glRenderbuffer = gl.createRenderbuffer()\n\t\tthis.bind()\n\t\tgl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, w, h)\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\tthis.tex.glTex,\n\t\t\t0,\n\t\t)\n\t\tgl.framebufferRenderbuffer(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.DEPTH_STENCIL_ATTACHMENT,\n\t\t\tgl.RENDERBUFFER,\n\t\t\tthis.glRenderbuffer,\n\t\t)\n\t\tthis.unbind()\n\t}\n\n\tget width() {\n\t\treturn this.tex.width\n\t}\n\n\tget height() {\n\t\treturn this.tex.height\n\t}\n\n\ttoImageData() {\n\t\tconst gl = this.ctx.gl\n\t\tconst data = new Uint8ClampedArray(this.width * this.height * 4)\n\t\tthis.bind()\n\t\tgl.readPixels(0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, data)\n\t\tthis.unbind()\n\t\t// flip vertically\n\t\tconst bytesPerRow = this.width * 4\n\t\tconst temp = new Uint8Array(bytesPerRow)\n\t\tfor (let y = 0; y < (this.height / 2 | 0); y++) {\n\t\t\tconst topOffset = y * bytesPerRow\n\t\t\tconst bottomOffset = (this.height - y - 1) * bytesPerRow\n\t\t\ttemp.set(data.subarray(topOffset, topOffset + bytesPerRow))\n\t\t\tdata.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow)\n\t\t\tdata.set(temp, bottomOffset)\n\t\t}\n\t\treturn new ImageData(data, this.width, this.height)\n\t}\n\n\ttoDataURL() {\n\t\tconst canvas = document.createElement(\"canvas\")\n\t\tconst ctx = canvas.getContext(\"2d\")\n\t\tcanvas.width = this.width\n\t\tcanvas.height = this.height\n\t\tctx.putImageData(this.toImageData(), 0, 0)\n\t\treturn canvas.toDataURL()\n\t}\n\n\tdraw(action: () => void) {\n\t\tthis.bind()\n\t\taction()\n\t\tthis.unbind()\n\t}\n\n\tbind() {\n\t\tthis.ctx.pushFramebuffer(this.glFramebuffer)\n\t\tthis.ctx.pushRenderbuffer(this.glRenderbuffer)\n\t\tthis.ctx.pushViewport({ x: 0, y: 0, w: this.width, h: this.height })\n\t}\n\n\tunbind() {\n\t\tthis.ctx.popFramebuffer()\n\t\tthis.ctx.popRenderbuffer()\n\t\tthis.ctx.popViewport()\n\t}\n\n\tfree() {\n\t\tconst gl = this.ctx.gl\n\t\tgl.deleteFramebuffer(this.glFramebuffer)\n\t\tgl.deleteRenderbuffer(this.glRenderbuffer)\n\t\tthis.tex.free()\n\t}\n\n}\n\nexport class Shader {\n\n\tctx: GfxCtx\n\tglProgram: WebGLProgram\n\n\tconstructor(ctx: GfxCtx, vert: string, frag: string, attribs: string[]) {\n\n\t\tthis.ctx = ctx\n\t\tctx.onDestroy(() => this.free())\n\n\t\tconst gl = ctx.gl\n\t\tconst vertShader = gl.createShader(gl.VERTEX_SHADER)\n\t\tconst fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n\n\t\tgl.shaderSource(vertShader, vert)\n\t\tgl.shaderSource(fragShader, frag)\n\t\tgl.compileShader(vertShader)\n\t\tgl.compileShader(fragShader)\n\n\t\tconst prog = gl.createProgram()\n\t\tthis.glProgram = prog\n\n\t\tgl.attachShader(prog, vertShader)\n\t\tgl.attachShader(prog, fragShader)\n\n\t\tattribs.forEach((attrib, i) => gl.bindAttribLocation(prog, i, attrib))\n\n\t\tgl.linkProgram(prog)\n\n\t\tif (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n\t\t\tconst vertError = gl.getShaderInfoLog(vertShader)\n\t\t\tif (vertError) throw new Error(\"VERTEX SHADER \" + vertError)\n\t\t\tconst fragError = gl.getShaderInfoLog(fragShader)\n\t\t\tif (fragError) throw new Error(\"FRAGMENT SHADER \" + fragError)\n\t\t}\n\n\t\tgl.deleteShader(vertShader)\n\t\tgl.deleteShader(fragShader)\n\n\t}\n\n\tbind() {\n\t\tthis.ctx.pushProgram(this.glProgram)\n\t}\n\n\tunbind() {\n\t\tthis.ctx.popProgram()\n\t}\n\n\tsend(uniform: Uniform) {\n\t\tconst gl = this.ctx.gl\n\t\tfor (const name in uniform) {\n\t\t\tconst val = uniform[name]\n\t\t\tconst loc = gl.getUniformLocation(this.glProgram, name)\n\t\t\tif (typeof val === \"number\") {\n\t\t\t\tgl.uniform1f(loc, val)\n\t\t\t} else if (val instanceof Mat4) {\n\t\t\t\tgl.uniformMatrix4fv(loc, false, new Float32Array(val.m))\n\t\t\t} else if (val instanceof Color) {\n\t\t\t\tgl.uniform3f(loc, val.r, val.g, val.b)\n\t\t\t} else if (val instanceof Vec2) {\n\t\t\t\tgl.uniform2f(loc, val.x, val.y)\n\t\t\t}\n\t\t}\n\t}\n\n\tfree() {\n\t\tthis.ctx.gl.deleteProgram(this.glProgram)\n\t}\n\n}\n\nexport type VertexFormat = {\n\tname: string,\n\tsize: number,\n}[]\n\nexport class BatchRenderer {\n\n\tctx: GfxCtx\n\n\tglVBuf: WebGLBuffer\n\tglIBuf: WebGLBuffer\n\tvqueue: number[] = []\n\tiqueue: number[] = []\n\tstride: number\n\tmaxVertices: number\n\tmaxIndices: number\n\n\tvertexFormat: VertexFormat\n\tnumDraws: number = 0\n\n\tcurPrimitive: GLenum | null = null\n\tcurTex: Texture | null = null\n\tcurShader: Shader | null = null\n\tcurUniform: Uniform = {}\n\n\tconstructor(ctx: GfxCtx, format: VertexFormat, maxVertices: number, maxIndices: number) {\n\n\t\tconst gl = ctx.gl\n\n\t\tthis.vertexFormat = format\n\t\tthis.ctx = ctx\n\t\tthis.stride = format.reduce((sum, f) => sum + f.size, 0)\n\t\tthis.maxVertices = maxVertices\n\t\tthis.maxIndices = maxIndices\n\n\t\tthis.glVBuf = gl.createBuffer()\n\t\tctx.pushArrayBuffer(this.glVBuf)\n\t\tgl.bufferData(gl.ARRAY_BUFFER, maxVertices * 4, gl.DYNAMIC_DRAW)\n\t\tctx.popArrayBuffer()\n\n\t\tthis.glIBuf = gl.createBuffer()\n\t\tctx.pushElementArrayBuffer(this.glIBuf)\n\t\tgl.bufferData(gl.ELEMENT_ARRAY_BUFFER, maxIndices * 4, gl.DYNAMIC_DRAW)\n\t\tctx.popElementArrayBuffer()\n\n\t}\n\n\tpush(\n\t\tprimitive: GLenum,\n\t\tverts: number[],\n\t\tindices: number[],\n\t\tshader: Shader,\n\t\ttex: Texture | null = null,\n\t\tuniform: Uniform = {},\n\t) {\n\t\tif (\n\t\t\tprimitive !== this.curPrimitive\n\t\t\t|| tex !== this.curTex\n\t\t\t|| shader !== this.curShader\n\t\t\t|| !deepEq(this.curUniform, uniform)\n\t\t\t|| this.vqueue.length + verts.length * this.stride > this.maxVertices\n\t\t\t|| this.iqueue.length + indices.length > this.maxIndices\n\t\t) {\n\t\t\tthis.flush()\n\t\t}\n\t\tconst indexOffset = this.vqueue.length / this.stride\n\t\tfor (const v of verts) {\n\t\t\tthis.vqueue.push(v)\n\t\t}\n\t\tfor (const i of indices) {\n\t\t\tthis.iqueue.push(i + indexOffset)\n\t\t}\n\t\tthis.curPrimitive = primitive\n\t\tthis.curShader = shader\n\t\tthis.curTex = tex\n\t\tthis.curUniform = uniform\n\t}\n\n\tflush() {\n\n\t\tif (\n\t\t\t!this.curPrimitive\n\t\t\t|| !this.curShader\n\t\t\t|| this.vqueue.length === 0\n\t\t\t|| this.iqueue.length === 0\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst gl = this.ctx.gl\n\n\t\tthis.ctx.pushArrayBuffer(this.glVBuf)\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(this.vqueue))\n\t\tthis.ctx.pushElementArrayBuffer(this.glIBuf)\n\t\tgl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Uint16Array(this.iqueue))\n\t\tthis.ctx.setVertexFormat(this.vertexFormat)\n\t\tthis.curShader.bind()\n\t\tthis.curShader.send(this.curUniform)\n\t\tthis.curTex?.bind()\n\t\tgl.drawElements(this.curPrimitive, this.iqueue.length, gl.UNSIGNED_SHORT, 0)\n\t\tthis.curTex?.unbind()\n\t\tthis.curShader.unbind()\n\n\t\tthis.ctx.popArrayBuffer()\n\t\tthis.ctx.popElementArrayBuffer()\n\n\t\tthis.vqueue = []\n\t\tthis.iqueue = []\n\t\tthis.numDraws++\n\n\t}\n\n\tfree() {\n\t\tconst gl = this.ctx.gl\n\t\tgl.deleteBuffer(this.glVBuf)\n\t\tgl.deleteBuffer(this.glIBuf)\n\t}\n\n}\n\nexport class Mesh {\n\n\tctx: GfxCtx\n\tglVBuf: WebGLBuffer\n\tglIBuf: WebGLBuffer\n\tvertexFormat: VertexFormat\n\tcount: number\n\n\tconstructor(ctx: GfxCtx, format: VertexFormat, verts: number[], indices: number[]) {\n\n\t\tconst gl = ctx.gl\n\n\t\tthis.vertexFormat = format\n\t\tthis.ctx = ctx\n\n\t\tthis.glVBuf = gl.createBuffer()\n\t\tctx.pushArrayBuffer(this.glVBuf)\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW)\n\t\tctx.popArrayBuffer()\n\n\t\tthis.glIBuf = gl.createBuffer()\n\t\tctx.pushElementArrayBuffer(this.glIBuf)\n\t\tgl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW)\n\t\tctx.popElementArrayBuffer()\n\n\t\tthis.count = indices.length\n\n\t}\n\n\tdraw(primitive?: GLenum) {\n\t\tconst gl = this.ctx.gl\n\t\tthis.ctx.pushArrayBuffer(this.glVBuf)\n\t\tthis.ctx.pushElementArrayBuffer(this.glIBuf)\n\t\tthis.ctx.setVertexFormat(this.vertexFormat)\n\t\tgl.drawElements(primitive ?? gl.TRIANGLES, this.count, gl.UNSIGNED_SHORT, 0)\n\t\tthis.ctx.popArrayBuffer()\n\t\tthis.ctx.popElementArrayBuffer()\n\t}\n\n\tfree() {\n\t\tconst gl = this.ctx.gl\n\t\tgl.deleteBuffer(this.glVBuf)\n\t\tgl.deleteBuffer(this.glIBuf)\n\t}\n\n\n}\n\nfunction genStack<T>(setFunc: (item: T) => void) {\n\tconst stack: T[] = []\n\tconst push = (item: T) => {\n\t\tstack.push(item)\n\t\tsetFunc(item)\n\t}\n\tconst pop = () => {\n\t\tstack.pop()\n\t\tsetFunc(cur() ?? null)\n\t}\n\tconst cur = () => stack[stack.length - 1]\n\treturn [push, pop, cur] as const\n}\n\nexport default function initGfx(gl: WebGLRenderingContext, opts: {\n\ttexFilter?: TexFilter,\n} = {}) {\n\n\tconst gc: Array<() => void> = []\n\n\tfunction onDestroy(action) {\n\t\tgc.push(action)\n\t}\n\n\tfunction destroy() {\n\t\tgc.forEach((action) => action())\n\t\tgl.getExtension(\"WEBGL_lose_context\").loseContext()\n\t}\n\n\tlet curVertexFormat = null\n\n\tfunction setVertexFormat(fmt: VertexFormat) {\n\t\tif (deepEq(fmt, curVertexFormat)) return\n\t\tcurVertexFormat = fmt\n\t\tconst stride = fmt.reduce((sum, f) => sum + f.size, 0)\n\t\tfmt.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\t}\n\n\tconst [ pushTexture2D, popTexture2D ] =\n\t\tgenStack<WebGLTexture>((t) => gl.bindTexture(gl.TEXTURE_2D, t))\n\n\tconst [ pushArrayBuffer, popArrayBuffer ] =\n\t\tgenStack<WebGLBuffer>((b) => gl.bindBuffer(gl.ARRAY_BUFFER, b))\n\n\tconst [ pushElementArrayBuffer, popElementArrayBuffer ] =\n\t\tgenStack<WebGLBuffer>((b) => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, b))\n\n\tconst [ pushFramebuffer, popFramebuffer ] =\n\t\tgenStack<WebGLFramebuffer>((b) => gl.bindFramebuffer(gl.FRAMEBUFFER, b))\n\n\tconst [ pushRenderbuffer, popRenderbuffer ] =\n\t\tgenStack<WebGLRenderbuffer>((b) => gl.bindRenderbuffer(gl.RENDERBUFFER, b))\n\n\tconst [ pushViewport, popViewport ] =\n\t\tgenStack<{ x: number, y: number, w: number, h: number }>(({ x, y, w, h }) => {\n\t\t\tgl.viewport(x, y, w, h)\n\t\t})\n\n\tconst [ pushProgram, popProgram ] = genStack<WebGLProgram>((p) => gl.useProgram(p))\n\n\tpushViewport({ x: 0, y: 0, w: gl.drawingBufferWidth, h: gl.drawingBufferHeight })\n\n\treturn {\n\t\tgl,\n\t\topts,\n\t\tonDestroy,\n\t\tdestroy,\n\t\tpushTexture2D,\n\t\tpopTexture2D,\n\t\tpushArrayBuffer,\n\t\tpopArrayBuffer,\n\t\tpushElementArrayBuffer,\n\t\tpopElementArrayBuffer,\n\t\tpushFramebuffer,\n\t\tpopFramebuffer,\n\t\tpushRenderbuffer,\n\t\tpopRenderbuffer,\n\t\tpushViewport,\n\t\tpopViewport,\n\t\tpushProgram,\n\t\tpopProgram,\n\t\tsetVertexFormat,\n\t}\n\n}\n", "import {\n\tEvent,\n} from \"./utils\"\n\nexport class Asset<D> {\n\tloaded: boolean = false\n\tdata: D | null = null\n\terror: Error | null = null\n\tprivate onLoadEvents: Event<[D]> = new Event()\n\tprivate onErrorEvents: Event<[Error]> = new Event()\n\tprivate onFinishEvents: Event<[]> = new Event()\n\tconstructor(loader: Promise<D>) {\n\t\tloader.then((data) => {\n\t\t\tthis.data = data\n\t\t\tthis.onLoadEvents.trigger(data)\n\t\t}).catch((err) => {\n\t\t\tthis.error = err\n\t\t\tif (this.onErrorEvents.numListeners() > 0) {\n\t\t\t\tthis.onErrorEvents.trigger(err)\n\t\t\t} else {\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.onFinishEvents.trigger()\n\t\t\tthis.loaded = true\n\t\t})\n\t}\n\tstatic loaded<D>(data: D): Asset<D> {\n\t\tconst asset = new Asset(Promise.resolve(data)) as Asset<D>\n\t\tasset.data = data\n\t\tasset.loaded = true\n\t\treturn asset\n\t}\n\tonLoad(action: (data: D) => void) {\n\t\tif (this.loaded && this.data) {\n\t\t\taction(this.data)\n\t\t} else {\n\t\t\tthis.onLoadEvents.add(action)\n\t\t}\n\t\treturn this\n\t}\n\tonError(action: (err: Error) => void) {\n\t\tif (this.loaded && this.error) {\n\t\t\taction(this.error)\n\t\t} else {\n\t\t\tthis.onErrorEvents.add(action)\n\t\t}\n\t\treturn this\n\t}\n\tonFinish(action: () => void) {\n\t\tif (this.loaded) {\n\t\t\taction()\n\t\t} else {\n\t\t\tthis.onFinishEvents.add(action)\n\t\t}\n\t\treturn this\n\t}\n\tthen(action: (data: D) => void): Asset<D> {\n\t\treturn this.onLoad(action)\n\t}\n\tcatch(action: (err: Error) => void): Asset<D> {\n\t\treturn this.onError(action)\n\t}\n\tfinally(action: () => void): Asset<D> {\n\t\treturn this.onFinish(action)\n\t}\n}\n\nexport class AssetBucket<D> {\n\tassets: Map<string, Asset<D>> = new Map()\n\tlastUID: number = 0\n\tadd(name: string | null, loader: Promise<D>): Asset<D> {\n\t\t// if user don't provide a name we use a generated one\n\t\tconst id = name ?? (this.lastUID++ + \"\")\n\t\tconst asset = new Asset(loader)\n\t\tthis.assets.set(id, asset)\n\t\treturn asset\n\t}\n\taddLoaded(name: string | null, data: D): Asset<D> {\n\t\tconst id = name ?? (this.lastUID++ + \"\")\n\t\tconst asset = Asset.loaded(data)\n\t\tthis.assets.set(id, asset)\n\t\treturn asset\n\t}\n\tget(handle: string): Asset<D> | void {\n\t\treturn this.assets.get(handle)\n\t}\n\tprogress(): number {\n\t\tif (this.assets.size === 0) {\n\t\t\treturn 1\n\t\t}\n\t\tlet loaded = 0\n\t\tthis.assets.forEach((asset) => {\n\t\t\tif (asset.loaded) {\n\t\t\t\tloaded++\n\t\t\t}\n\t\t})\n\t\treturn loaded / this.assets.size\n\t}\n}\n\nexport function fetchURL(url: string) {\n\treturn fetch(url)\n\t\t.then((res) => {\n\t\t\tif (!res.ok) throw new Error(`Failed to fetch \"${url}\"`)\n\t\t\treturn res\n\t\t})\n}\n\nexport function fetchJSON(path: string) {\n\treturn fetchURL(path).then((res) => res.json())\n}\n\nexport function fetchText(path: string) {\n\treturn fetchURL(path).then((res) => res.text())\n}\n\nexport function fetchArrayBuffer(path: string) {\n\treturn fetchURL(path).then((res) => res.arrayBuffer())\n}\n\n// wrapper around image loader to get a Promise\nexport function loadImg(src: string): Promise<HTMLImageElement> {\n\tconst img = new Image()\n\timg.crossOrigin = \"anonymous\"\n\timg.src = src\n\treturn new Promise<HTMLImageElement>((resolve, reject) => {\n\t\timg.onload = () => resolve(img)\n\t\timg.onerror = () => reject(new Error(`Failed to load image from \"${src}\"`))\n\t})\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", "import type {\n\tImageSource,\n} from \"./types\"\n\nimport {\n\tGfxCtx,\n\tTexture,\n} from \"./gfx\"\n\nimport {\n\tVec2,\n\tQuad,\n} from \"./math\"\n\nexport default class TexPacker {\n\tprivate textures: Texture[] = []\n\tprivate canvas: HTMLCanvasElement\n\tprivate c2d: CanvasRenderingContext2D\n\tprivate x: number = 0\n\tprivate y: number = 0\n\tprivate curHeight: number = 0\n\tprivate gfx: GfxCtx\n\tconstructor(gfx: GfxCtx, w: number, h: number) {\n\t\tthis.gfx = gfx\n\t\tthis.canvas = document.createElement(\"canvas\")\n\t\tthis.canvas.width = w\n\t\tthis.canvas.height = h\n\t\tthis.textures = [Texture.fromImage(gfx, this.canvas)]\n\t\tthis.c2d = this.canvas.getContext(\"2d\")\n\t}\n\tadd(img: ImageSource): [Texture, Quad] {\n\t\tif (img.width > this.canvas.width || img.height > this.canvas.height) {\n\t\t\tthrow new Error(`Texture size (${img.width} x ${img.height}) exceeds limit (${this.canvas.width} x ${this.canvas.height})`)\n\t\t}\n\t\t// next row\n\t\tif (this.x + img.width > this.canvas.width) {\n\t\t\tthis.x = 0\n\t\t\tthis.y += this.curHeight\n\t\t\tthis.curHeight = 0\n\t\t}\n\t\t// next texture\n\t\tif (this.y + img.height > this.canvas.height) {\n\t\t\tthis.c2d.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\t\t\tthis.textures.push(Texture.fromImage(this.gfx, this.canvas))\n\t\t\tthis.x = 0\n\t\t\tthis.y = 0\n\t\t\tthis.curHeight = 0\n\t\t}\n\t\tconst curTex = this.textures[this.textures.length - 1]\n\t\tconst pos = new Vec2(this.x, this.y)\n\t\tthis.x += img.width\n\t\tif (img.height > this.curHeight) {\n\t\t\tthis.curHeight = img.height\n\t\t}\n\t\tif (img instanceof ImageData) {\n\t\t\tthis.c2d.putImageData(img, pos.x, pos.y)\n\t\t} else {\n\t\t\tthis.c2d.drawImage(img, pos.x, pos.y)\n\t\t}\n\t\tcurTex.update(this.canvas)\n\t\treturn [curTex, new Quad(\n\t\t\tpos.x / this.canvas.width,\n\t\t\tpos.y / this.canvas.height,\n\t\t\timg.width / this.canvas.width,\n\t\t\timg.height / this.canvas.height,\n\t\t)]\n\t}\n\tfree() {\n\t\tfor (const tex of this.textures) {\n\t\t\ttex.free()\n\t\t}\n\t}\n}\n", "const VERSION = \"3000.1.17\"\n\nimport initApp from \"./app\"\nimport initGfx, {\n\tTexture,\n\tFrameBuffer,\n\tShader,\n\tBatchRenderer,\n} from \"./gfx\"\n\nimport {\n\tAsset,\n\tAssetBucket,\n\tfetchArrayBuffer,\n\tfetchJSON,\n\tfetchText,\n\tloadImg,\n} from \"./assets\"\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\"\nimport TexPacker from \"./texPacker\"\n\nimport {\n\tRegistry,\n\tEvent,\n\tEventHandler,\n\tdownload,\n\tdownloadText,\n\tdownloadJSON,\n\tdownloadBlob,\n\tuid,\n\tisDataURL,\n\tgetFileName,\n\toverload2,\n\tdataURLToArrayBuffer,\n\tEventController,\n\tgetErrorMessage,\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\trunes,\n} from \"./utils\"\n\nimport type {\n\tGfxFont,\n\tRenderProps,\n\tCharTransform,\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\tAsepriteData,\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\tCircleCompOpt,\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\tPolygonComp,\n\tPolygonCompOpt,\n} from \"./types\"\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\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 = \"linear\"\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\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\tconst cw = canvas.width\n\t\tconst ch = canvas.height\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\n\tconst pixelDensity = gopt.pixelDensity || window.devicePixelRatio\n\n\tcanvas.width *= pixelDensity\n\tcanvas.height *= pixelDensity\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 fontCacheC2d = 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\tconst ggl = initGfx(gl, {\n\t\ttexFilter: gopt.texFilter,\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\tggl,\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(ggl, gopt.width * pixelDensity * gscale, gopt.height * pixelDensity * gscale)\n\t\t\t: new FrameBuffer(ggl, 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 = rgb(gopt.background)\n\t\t\tbgAlpha = Array.isArray(gopt.background) ? 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 ?? 1,\n\t\t\t)\n\t\t}\n\n\t\tgl.enable(gl.BLEND)\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\tconst renderer = new BatchRenderer(ggl, VERTEX_FORMAT, MAX_BATCHED_VERTS, MAX_BATCHED_INDICES)\n\n\t\t// a checkerboard texture used for the default background\n\t\tconst bgTex = Texture.fromImage(\n\t\t\tggl,\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// 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\tdefTex: emptyTex,\n\t\t\tframeBuffer: frameBuffer,\n\t\t\tpostShader: null,\n\t\t\tpostShaderUniform: null,\n\t\t\trenderer: renderer,\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\tconst ctx = new (\n\t\t\twindow.AudioContext || (window as any).webkitAudioContext\n\t\t)() as AudioContext\n\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\tconst assets = {\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(ggl, SPRITE_ATLAS_WIDTH, SPRITE_ATLAS_HEIGHT),\n\t\t// if we finished initially loading all assets\n\t\tloaded: false,\n\t}\n\n\tfunction fixURL<D>(url: D): D {\n\t\tif (typeof url !== \"string\" || isDataURL(url)) return url\n\t\treturn assets.urlPrefix + url as D\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\tgame.root.use(timer())\n\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\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\tsize: number = DEF_TEXT_CACHE_SIZE\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\tthis.size = opt.size ?? DEF_TEXT_CACHE_SIZE\n\t\t\tif (this.size > MAX_TEXT_CACHE_SIZE) {\n\t\t\t\tthrow new Error(`Max font size: ${MAX_TEXT_CACHE_SIZE}`)\n\t\t\t}\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 Error(`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(ggl, 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\tsrc = fixURL(src)\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 c2d = canvas.getContext(\"2d\")\n\t\timages.forEach((img, i) => {\n\t\t\tif (img instanceof ImageData) {\n\t\t\t\tc2d.putImageData(img, i * width, 0)\n\t\t\t} else {\n\t\t\t\tc2d.drawImage(img, i * width, 0)\n\t\t\t}\n\t\t})\n\t\tconst merged = c2d.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\tsrc = fixURL(src)\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\tsrc = fixURL(src)\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 c2d = canvas.getContext(\"2d\")\n\n\t\t\timages.forEach((img: HTMLImageElement, i) => {\n\t\t\t\tc2d.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 | AsepriteData,\n\t): Asset<SpriteData> {\n\n\t\timgSrc = fixURL(imgSrc)\n\t\tjsonSrc = fixURL(jsonSrc)\n\n\t\tif (typeof imgSrc === \"string\" && !jsonSrc) {\n\t\t\tjsonSrc = getFileName(imgSrc) + \".json\"\n\t\t}\n\n\t\tconst resolveJSON = typeof jsonSrc === \"string\"\n\t\t\t? fetchJSON(jsonSrc)\n\t\t\t: Promise.resolve(jsonSrc)\n\n\t\treturn assets.sprites.add(name, resolveJSON.then((data: AsepriteData) => {\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\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\tvert = fixURL(vert)\n\t\tfrag = fixURL(frag)\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\tsrc = fixURL(src)\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(name: string): Asset<SpriteData> | void {\n\t\treturn assets.sprites.get(name)\n\t}\n\n\tfunction getSound(name: string): Asset<SoundData> | void {\n\t\treturn assets.sounds.get(name)\n\t}\n\n\tfunction getFont(name: string): Asset<FontData> | void {\n\t\treturn assets.fonts.get(name)\n\t}\n\n\tfunction getBitmapFont(name: string): Asset<BitmapFontData> | void {\n\t\treturn assets.bitmapFonts.get(name)\n\t}\n\n\tfunction getShader(name: string): Asset<ShaderData> | void {\n\t\treturn assets.shaders.get(name)\n\t}\n\n\tfunction getAsset(name: string): Asset<any> | void {\n\t\treturn assets.custom.get(name)\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 Error(`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 Error(`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 Error(`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 Error(`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 Error(`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 Error(`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 makeCanvas(w: number, h: number) {\n\t\treturn new FrameBuffer(ggl, w, h)\n\t}\n\n\tfunction makeShader(\n\t\tvertSrc: string | null = DEF_VERT,\n\t\tfragSrc: string | null = DEF_FRAG,\n\t): Shader {\n\t\tconst vcode = VERT_TEMPLATE.replace(\"{{user}}\", vertSrc ?? DEF_VERT)\n\t\tconst fcode = FRAG_TEMPLATE.replace(\"{{user}}\", fragSrc ?? DEF_FRAG)\n\t\ttry {\n\t\t\treturn new Shader(ggl, vcode, fcode, VERTEX_FORMAT.map((vert) => vert.name))\n\t\t} catch (e) {\n\t\t\tconst lineOffset = 14\n\t\t\tconst fmt = /(?<type>^\\w+) SHADER ERROR: 0:(?<line>\\d+): (?<msg>.+)/\n\t\t\tconst match = getErrorMessage(e).match(fmt)\n\t\t\tconst line = Number(match.groups.line) - lineOffset\n\t\t\tconst msg = match.groups.msg.trim()\n\t\t\tconst ty = match.groups.type.toLowerCase()\n\t\t\tthrow new Error(`${ty} shader line ${line}: ${msg}`)\n\t\t}\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\tconst transform = (gfx.fixed || fixed)\n\t\t\t? gfx.transform\n\t\t\t: game.cam.transform.mult(gfx.transform)\n\n\t\tconst vv = []\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\tvv.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\tgfx.renderer.push(gl.TRIANGLES, vv, indices, shader, tex, uniform)\n\n\t}\n\n\t// draw all batched shapes\n\tfunction flush() {\n\t\tgfx.renderer.flush()\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\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.renderer.numDraws = 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\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.lastDrawCalls = gfx.renderer.numDraws\n\t\tgfx.frameBuffer.unbind()\n\t\tgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)\n\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\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 Error(\"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 Error(\"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 Error(\"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 Error(`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 Error(\"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 Error(\"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 Error(\"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 Error(\"drawTriangle() 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 Error(\"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 Error(\"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 Error(\"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] ? opt.colors[i].mult(color) : 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.ch.length === 1) 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 Error(\"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 = runes(text)\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(ggl, 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 = fontCacheC2d\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 Error(\"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\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\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.lastDrawCalls,\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 Error(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// @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 Error(\"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\tif (this.canvas) this.canvas.bind()\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 Error(`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\tif (this.canvas) this.canvas.unbind()\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 Error(`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 Error(`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\tconst events = []\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\tevents.push(onAdd((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\tevents.push(onDestroy((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\tthis.onDestroy(() => {\n\t\t\t\t\t\tfor (const ev of events) {\n\t\t\t\t\t\t\tev.cancel()\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 Registry()\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\tconst onUpdate = overload2((action: () => void): EventController => {\n\t\tconst obj = add([{ update: action }])\n\t\treturn {\n\t\t\tget paused() {\n\t\t\t\treturn obj.paused\n\t\t\t},\n\t\t\tset paused(p) {\n\t\t\t\tobj.paused = p\n\t\t\t},\n\t\t\tcancel: () => obj.destroy(),\n\t\t}\n\t}, (tag: Tag, action: (obj: GameObj) => void) => {\n\t\treturn on(\"update\", tag, action)\n\t})\n\n\tconst onDraw = overload2((action: () => void): EventController => {\n\t\tconst obj = add([{ draw: action }])\n\t\treturn {\n\t\t\tget paused() {\n\t\t\t\treturn obj.hidden\n\t\t\t},\n\t\t\tset paused(p) {\n\t\t\t\tobj.hidden = p\n\t\t\t},\n\t\t\tcancel: () => obj.destroy(),\n\t\t}\n\t}, (tag: Tag, action: (obj: GameObj) => void) => {\n\t\treturn on(\"draw\", tag, action)\n\t})\n\n\tconst onAdd = overload2((action: (obj: GameObj) => void) => {\n\t\treturn game.events.on(\"add\", action)\n\t}, (tag: Tag, action: (obj: GameObj) => void) => {\n\t\treturn on(\"add\", tag, action)\n\t})\n\n\tconst onDestroy = overload2((action: (obj: GameObj) => void) => {\n\t\treturn game.events.on(\"destroy\", action)\n\t}, (tag: Tag, action: (obj: GameObj) => void) => {\n\t\treturn on(\"destroy\", tag, action)\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\tconst onClick = overload2((action: () => void) => {\n\t\treturn app.onMousePress(action)\n\t}, (tag: Tag, action: (obj: GameObj) => void) => {\n\t\tconst events = []\n\t\tforAllCurrentAndFuture(tag, (obj) => {\n\t\t\tif (!obj.area)\n\t\t\t\tthrow new Error(\"onClick() requires the object to have area() component\")\n\t\t\tevents.push(obj.onClick(() => 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 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 Error(\"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 Error(\"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 Error(\"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\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 Error(\"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\t// TODO: perform check instead of use cache\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 Error(\"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 Error(\"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 Error(`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 Error(\"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 Error(`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 polygon(pts: Vec2[], opt: PolygonCompOpt = {}): PolygonComp {\n\t\tif(pts.length < 3) throw new Error(`Polygon's need more than two points, ${pts.length} points provided`)\n\t\treturn {\n\t\t\tid: \"polygon\",\n\t\t\tpts,\n\t\t\tcolors: opt.colors,\n\t\t\tradius: opt.radius,\n\t\t\tdraw(this: GameObj<PolygonComp>) {\n\t\t\t\tdrawPolygon(Object.assign(getRenderProps(this), {\n\t\t\t\t\tpts: this.pts,\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tradius: this.radius,\n\t\t\t\t\tfill: opt.fill,\n\t\t\t\t}))\n\t\t\t},\n\t\t\trenderArea(this: GameObj<PolygonComp>) {\n\t\t\t\treturn new Polygon(this.pts)\n\t\t\t},\n\t\t\tinspect() {\n\t\t\t\treturn this.pts.map(p => `[${p.x},${p.y}]`).join(\",\")\n\t\t\t},\n\t\t}\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\tfill: opt.fill,\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, opt: CircleCompOpt = {}): 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\tfill: opt.fill,\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\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\tvel: new Vec2(0),\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 Error(\"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\tthis.vel.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\tthis.vel.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// TODO: this prevents from falling when on edge\n\t\t\t\t\t\t!this.isColliding(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 = this.vel.y\n\t\t\t\tthis.vel.y += game.gravity * this.gravityScale * dt()\n\t\t\t\tthis.vel.y = Math.min(this.vel.y, opt.maxVelocity ?? MAX_VEL)\n\t\t\t\tif (prevVelY < 0 && this.vel.y >= 0) {\n\t\t\t\t\tthis.trigger(\"fall\")\n\t\t\t\t}\n\t\t\t\tthis.move(this.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 this.vel.y > 0\n\t\t\t},\n\n\t\t\tisJumping(): boolean {\n\t\t\t\treturn this.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\tthis.vel.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\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, maxHP?: number): HealthComp {\n\t\tif (hp == null) {\n\t\t\tthrow new Error(\"health() requires the initial amount of hp\")\n\t\t}\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\tconst origHP = hp\n\t\t\t\tthis.setHP(hp + n)\n\t\t\t\tthis.trigger(\"heal\", hp - origHP)\n\t\t\t},\n\t\t\thp(): number {\n\t\t\t\treturn hp\n\t\t\t},\n\t\t\tmaxHP(): number | null {\n\t\t\t\treturn maxHP ?? null\n\t\t\t},\n\t\t\tsetMaxHP(n: number): void {\n\t\t\t\tmaxHP = n\n\t\t\t},\n\t\t\tsetHP(this: GameObj, n: number) {\n\t\t\t\thp = maxHP ? Math.min(maxHP, n) : 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 Error(\"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 Error(\"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 Error(`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 Error(`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 drawon(c: FrameBuffer) {\n\t\treturn {\n\t\t\tadd(this: GameObj) {\n\t\t\t\tthis.canvas = c\n\t\t\t},\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 Error(`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\t\t\tinitEvents()\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})\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 Error(\"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 Error(\"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 Error(\"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 = game.root.add.bind(game.root)\n\tconst readd = game.root.readd.bind(game.root)\n\tconst destroyAll = game.root.removeAll.bind(game.root)\n\tconst get = game.root.get.bind(game.root)\n\tconst wait = game.root.wait.bind(game.root)\n\tconst loop = game.root.loop.bind(game.root)\n\tconst tween = game.root.tween.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\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\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\tconsole.error(err)\n\n\t\taudio.ctx.suspend()\n\n\t\t// TODO: this should only run once\n\t\tapp.run(() => {\n\n\t\t\tframeStart()\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\tframeEnd()\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\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\tggl.destroy()\n\t\t\tgc.forEach((f) => f())\n\n\t\t})\n\n\t}\n\n\tlet isFirstFrame = true\n\n\t// main game loop\n\tapp.run(() => {\n\n\t\ttry {\n\n\t\t\tif (!assets.loaded) {\n\t\t\t\tif (loadProgress() === 1 && !isFirstFrame) {\n\t\t\t\t\tassets.loaded = true\n\t\t\t\t\tgame.events.trigger(\"load\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!assets.loaded && gopt.loadingScreen !== false || isFirstFrame) {\n\t\t\t\tframeStart()\n\t\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\t\tdrawLoadScreen()\n\t\t\t\tframeEnd()\n\t\t\t} else {\n\t\t\t\tif (!debug.paused) updateFrame()\n\t\t\t\tcheckFrame()\n\t\t\t\tframeStart()\n\t\t\t\tdrawFrame()\n\t\t\t\tif (gopt.debug !== false) drawDebug()\n\t\t\t\tframeEnd()\n\t\t\t}\n\n\t\t\tif (isFirstFrame) {\n\t\t\t\tisFirstFrame = false\n\t\t\t}\n\n\t\t\tgame.events.trigger(\"frameEnd\")\n\n\t\t} catch (e) {\n\t\t\thandleErr(e)\n\t\t}\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 (gopt.letterbox) {\n\n\t\t\tif (!gopt.width || !gopt.height) {\n\t\t\t\tthrow new Error(\"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 Error(\"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\tfunction initEvents() {\n\n\t\tapp.onHide(() => {\n\t\t\tif (!gopt.backgroundAudio) {\n\t\t\t\taudio.ctx.suspend()\n\t\t\t}\n\t\t})\n\n\t\tapp.onShow(() => {\n\t\t\tif (!gopt.backgroundAudio && !debug.paused) {\n\t\t\t\taudio.ctx.resume()\n\t\t\t}\n\t\t})\n\n\t\tapp.onResize(() => {\n\t\t\tif (app.isFullscreen()) return\n\t\t\tconst fixedSize = gopt.width && gopt.height\n\t\t\tif (fixedSize && !gopt.stretch && !gopt.letterbox) return\n\t\t\tcanvas.width = canvas.offsetWidth * pixelDensity\n\t\t\tcanvas.height = canvas.offsetHeight * pixelDensity\n\t\t\tupdateViewport()\n\t\t\tif (!fixedSize) {\n\t\t\t\tgfx.frameBuffer.free()\n\t\t\t\tgfx.frameBuffer = new FrameBuffer(ggl, gl.drawingBufferWidth, gl.drawingBufferHeight)\n\t\t\t\tgfx.width = gl.drawingBufferWidth / pixelDensity\n\t\t\t\tgfx.height = gl.drawingBufferHeight / pixelDensity\n\t\t\t}\n\t\t})\n\n\t\tif (gopt.debug !== false) {\n\t\t\tapp.onKeyPress(\"f1\", () => debug.inspect = !debug.inspect)\n\t\t\tapp.onKeyPress(\"f2\", () => debug.clearLog())\n\t\t\tapp.onKeyPress(\"f8\", () => debug.paused = !debug.paused)\n\t\t\tapp.onKeyPress(\"f7\", () => {\n\t\t\t\tdebug.timeScale = toFixed(clamp(debug.timeScale - 0.2, 0, 2), 1)\n\t\t\t})\n\t\t\tapp.onKeyPress(\"f9\", () => {\n\t\t\t\tdebug.timeScale = toFixed(clamp(debug.timeScale + 0.2, 0, 2), 1)\n\t\t\t})\n\t\t\tapp.onKeyPress(\"f10\", () => debug.stepFrame())\n\t\t}\n\n\t\tif (gopt.burp) {\n\t\t\tapp.onKeyPress(\"b\", () => burp())\n\t\t}\n\n\t}\n\n\tupdateViewport()\n\tinitEvents()\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\tpolygon,\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\tdrawon,\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\tgetGamepadStick: app.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\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\tmakeCanvas,\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}\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\tif (gopt.focus !== false) {\n\t\tapp.canvas.focus()\n\t}\n\n\treturn ctx\n\n}\n"],
  "mappings": "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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", "d", "rgb", "hsl2rgb", "Quad", "_Quad", "w", "quad", "Mat4", "_Mat4", "c", "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", "r", "l", "testRectPoint", "pts", "Line", "testRectPoint", "r", "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", "c", "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", "Registry", "__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", "getFileName", "__name", "p", "overload2", "fn1", "fn2", "args", "al", "uid", "id", "getErrorMessage", "__name", "error", "BinaryHeap", "__name", "compareFn", "a", "b", "item", "lastItem", "pos", "parent", "child", "index1", "index2", "GRAPHEMES", "runes", "string", "result", "i", "increment", "nextUnits", "isGrapheme", "isVariationSelector", "isDiacriticalMark", "isZeroWidthJoiner", "__name", "current", "isFirstOfSurrogatePair", "currentPair", "nextPair", "isRegionalIndicator", "isSubdivisionFlag", "isSupplementarySpecialpurposePlane", "isFitzpatrickModifier", "betweenInclusive", "codePointFromSurrogatePair", "codePoint", "GRAPHEMES", "pair", "highOffset", "lowOffset", "value", "lower", "upper", "gamepad_default", "ButtonState", "__name", "btn", "GamepadState", "FPSCounter", "dt", "a", "b", "app_default", "opt", "state", "Vec2", "EventHandler", "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", "overload2", "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", "pd", "cw", "ch", "ww", "wh", "rw", "rc", "ratio", "offset", "MOUSE_BUTTONS", "PREVENT_DEFAULT_KEYS", "KEY_ALIAS", "touches", "box", "kbGamepad", "entries", "entry", "Texture", "_Texture", "__name", "ctx", "w", "h", "opt", "gl", "filter", "wrap", "img", "tex", "x", "y", "FrameBuffer", "data", "bytesPerRow", "temp", "topOffset", "bottomOffset", "canvas", "action", "Shader", "vert", "frag", "attribs", "vertShader", "fragShader", "prog", "attrib", "i", "vertError", "fragError", "uniform", "name", "val", "loc", "Mat4", "Color", "Vec2", "BatchRenderer", "format", "maxVertices", "maxIndices", "sum", "f", "primitive", "verts", "indices", "shader", "deepEq", "indexOffset", "v", "genStack", "setFunc", "stack", "push", "__name", "item", "pop", "cur", "initGfx", "gl", "opts", "gc", "onDestroy", "action", "destroy", "curVertexFormat", "setVertexFormat", "fmt", "deepEq", "stride", "sum", "f", "offset", "i", "pushTexture2D", "popTexture2D", "t", "pushArrayBuffer", "popArrayBuffer", "b", "pushElementArrayBuffer", "popElementArrayBuffer", "pushFramebuffer", "popFramebuffer", "pushRenderbuffer", "popRenderbuffer", "pushViewport", "popViewport", "x", "y", "w", "h", "pushProgram", "popProgram", "p", "Asset", "_Asset", "__name", "Event", "loader", "data", "err", "asset", "action", "AssetBucket", "name", "id", "handle", "loaded", "fetchURL", "url", "res", "fetchJSON", "path", "fetchText", "fetchArrayBuffer", "loadImg", "src", "img", "resolve", "reject", "c2", "c3", "c4", "c5", "easings", "x", "easings_default", "TexPacker", "__name", "gfx", "w", "h", "Texture", "img", "curTex", "pos", "Vec2", "Quad", "tex", "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", "styles", "cw", "ch", "pixelDensity", "fontCacheCanvas", "fontCacheC2d", "app", "app_default", "gc", "gl", "ggl", "initGfx", "gfx", "defShader", "makeShader", "emptyTex", "Texture", "frameBuffer", "FrameBuffer", "bgColor", "bgAlpha", "rgb", "renderer", "BatchRenderer", "bgTex", "Mat4", "SpriteData", "Quad", "tex", "frames", "anims", "slice9", "src", "opt", "data", "quad", "assets", "slice", "url", "loadImg", "img", "SoundData", "buf", "resolve", "reject", "audio", "isDataURL", "dataURLToArrayBuffer", "fetchArrayBuffer", "masterNode", "burpSnd", "burp_default", "err", "AssetBucket", "TexPacker", "fixURL", "game", "EventHandler", "make", "timer", "load", "prom", "loadProgress", "buckets", "n", "bucket", "loadRoot", "path", "loadJSON", "name", "fetchJSON", "FontData", "face", "loadFont", "font", "loadBitmapFont", "gw", "gh", "makeFont", "x", "y", "dx", "dy", "w", "qw", "qh", "j", "i", "loadSpriteAtlas", "res", "rej", "json", "atlas", "map", "info", "h", "spr", "createSpriteSheet", "images", "width", "height", "c2d", "merged", "loadSprite", "s", "loadPedit", "loadAseprite", "imgSrc", "jsonSrc", "getFileName", "resolveJSON", "size", "anim", "loadShader", "vert", "frag", "loadShaderURL", "resolveUrl", "fetchText", "vcode", "fcode", "loadSound", "loadBean", "bean_default", "getSprite", "getSound", "getFont", "getBitmapFont", "getShader", "getAsset", "resolveSprite", "Asset", "resolveSound", "snd", "resolveShader", "shader", "resolveFont", "bfont", "volume", "v", "play", "paused", "srcNode", "onEndEvents", "Event", "gainNode", "pos", "startTime", "stopTime", "started", "getTime", "start", "t", "d", "cloneNode", "oldNode", "newNode", "p", "time", "val", "l", "action", "burp", "makeCanvas", "vertSrc", "fragSrc", "Shader", "e", "fmt", "match", "getErrorMessage", "line", "msg", "ty", "chars", "cols", "charMap", "drawRaw", "verts", "indices", "fixed", "shaderSrc", "uniform", "transform", "vv", "pt", "screen2ndc", "flush", "frameStart", "drawUnscaled", "drawUVQuad", "usePostEffect", "frameEnd", "ow", "oh", "drawTexture", "pushMatrix", "m", "pushTranslate", "args", "vec2", "pushScale", "pushRotate", "a", "pushTransform", "popTransform", "offset", "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", "Color", "drawLines", "minSLen", "radius", "drawCircle", "drawTriangle", "drawEllipse", "polyOpt", "npts", "drawStenciled", "content", "mask", "test", "drawMasked", "drawSubtracted", "getViewportScale", "applyCharTransform", "fchar", "tr", "TEXT_STYLE_RE", "compileStyledText", "text", "charStyleMap", "renderText", "idxOffset", "origIdx", "fontAtlases", "formatText", "runes", "fontName", "opts", "lineSpacing", "letterSpacing", "curX", "tw", "th", "lines", "curLine", "cursor", "lastSpace", "lastSpaceWidth", "fchars", "ox", "idx", "style", "drawText", "drawFormattedText", "ftext", "windowToContent", "contentToView", "mousePos", "debugPaused", "debug", "updateFrame", "max", "get", "dt", "camPos", "center", "camScale", "camRot", "angle", "shake", "intensity", "toScreen", "toWorld", "calcTransform", "obj", "comps", "compStates", "cleanups", "events", "inputEvents", "onCurCompCleanup", "uid", "trigger", "o", "child", "tag", "o1", "o2", "children", "maskFunc", "comp", "k", "prop", "func", "c", "checkDeps", "dep", "id", "list", "recurse", "isChild", "onAdd", "onDestroy", "ev", "ctrl", "cb", "evs", "on", "event", "Registry", "onUpdate", "overload2", "add", "onDraw", "onCollide", "t1", "t2", "b", "col", "onCollideUpdate", "onCollideEnd", "forAllCurrentAndFuture", "onClick", "EventController", "onHover", "onHoverUpdate", "onHoverEnd", "setGravity", "g", "getGravity", "setBackground", "getBackground", "dest", "speed", "diff", "isFixed", "toFixed", "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", "polygon", "rect", "uvquad", "circle", "outline", "actions", "curTimer", "newAction", "from", "to", "duration", "setValue", "curTime", "lerp", "DEF_JUMP_FORCE", "MAX_VEL", "body", "curPlatform", "lastPlatformPos", "wantFall", "tmass", "col2", "prevVelY", "force", "doubleJump", "numJumps", "jumpsLeft", "stay", "scenesToStay", "health", "hp", "maxHP", "origHP", "lifespan", "fade", "wait", "state", "initState", "stateList", "transitions", "initStateEvents", "didFirstEnter", "oldState", "available", "fadeIn", "done", "drawon", "scene", "def", "go", "initEvents", "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", "loop", "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", "handleErr", "textStyle", "title", "onCleanup", "quit", "numTextureUnits", "unit", "isFirstFrame", "updateViewport", "pd", "rc", "rg", "sw", "sh", "clamp", "Line", "RNG", "randi", "randSeed", "hsl2rgb", "choose", "chance", "mapc", "rad2deg", "testLineLine", "testRectRect", "testRectLine", "testCirclePolygon", "testLinePoint", "testLineCircle", "download", "downloadJSON", "downloadText"]
}
