From ce970dc27a60e26803284983df3ab6dfdd4224a3 Mon Sep 17 00:00:00 2001 From: lajbel Date: Fri, 29 Nov 2024 23:23:24 -0300 Subject: [PATCH 01/22] feat: add better coloring, text rendering and stuff --- game/src/components/resizablePos.js | 22 ++ game/src/data/dialog.json | 10 +- game/src/data/themes.js | 33 ++ game/src/kaplay.js | 1 + game/src/scenes/endGame.js | 2 + game/src/scenes/game.js | 577 ++++++++++++++++------------ 6 files changed, 396 insertions(+), 249 deletions(-) create mode 100644 game/src/components/resizablePos.js create mode 100644 game/src/data/themes.js diff --git a/game/src/components/resizablePos.js b/game/src/components/resizablePos.js new file mode 100644 index 0000000..f0e19b9 --- /dev/null +++ b/game/src/components/resizablePos.js @@ -0,0 +1,22 @@ +/** + * @typedef {import("../types").Vec2} Vec2 + */ + +export let resizableObjects = []; + +/** + * Set the position on resize + * + * @param {() => Vec2} posFunc + */ +export const resizablePos = (posFunc) => ({ + id: "resizablePos", + posFunc, + add() { + resizableObjects.push(this); + this.pos = this.posFunc(); + }, + updatePos() { + this.pos = this.posFunc(); + }, +}); diff --git a/game/src/data/dialog.json b/game/src/data/dialog.json index f2ffd76..9a5e7b5 100644 --- a/game/src/data/dialog.json +++ b/game/src/data/dialog.json @@ -2,12 +2,12 @@ "blocks": [ [ "function isUnique(str) {\n", - "▯▯▯▯let charSet = new Set();\n", - "\n", + "▯▯▯▯let charSet = new Set()[i];\n", + "▯▯▯▯\n", "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", - "▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", - "▯▯▯▯return false;\n", - "▯▯▯▯}\n", + "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", + "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", + "▯▯▯▯▯▯▯▯}\n", "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", "▯▯▯▯}\n", "▯▯▯▯return true;\n", diff --git a/game/src/data/themes.js b/game/src/data/themes.js new file mode 100644 index 0000000..278b026 --- /dev/null +++ b/game/src/data/themes.js @@ -0,0 +1,33 @@ +// @ts-check + +export const themes = [ + { + name: "default", + tokens: { + functions: "#569CD6", + classes: "#3DC9B0", + brackets: "#FFD700", + keywords: "#569CD6", + comments: "#00FF00", + strings: "#FF00FF", + numbers: "#FFFF00", + variables: "#00FFFF", + types: "#FFA500", + operators: "#A52A2A", + punctuation: "#808080", + attributes: "#FFC0CB", + tags: "#800080", + text: "#000000", + background: "#FFFFFF", + }, + associations: { + // functions: /(?:function\s+(\w+)|(\w+)\s*=\s*\(.*\)\s*=>)/g, + functions: /function\s*|=>\s*/g, + // for words starting with a capital letter + classes: /\b[A-Z]\w*\b/g, + brackets: /[\(\)\[\]\{\}]/g, + keywords: + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await)\b/g, + }, + }, +]; diff --git a/game/src/kaplay.js b/game/src/kaplay.js index c3a9644..0ca748c 100644 --- a/game/src/kaplay.js +++ b/game/src/kaplay.js @@ -5,4 +5,5 @@ import kaplay from "kaplay"; export const k = kaplay({ background: [10, 10, 27, 0], font: "monogram", + maxFPS: 60, }); diff --git a/game/src/scenes/endGame.js b/game/src/scenes/endGame.js index 97e90dd..21c6f42 100644 --- a/game/src/scenes/endGame.js +++ b/game/src/scenes/endGame.js @@ -1,3 +1,5 @@ +import { totalCorrectChars } from "./game.js"; + scene("endgame", () => { const endgameLabel = add([ text("Analytics", { size: 48 }), diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index 566055f..b97cccf 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -1,16 +1,14 @@ // @ts-check + import { - charSpacing, - goalBlocks, jsonData, lineHeight, marginvisiblebox, - maxMistakes, maxtime, - startmoveline, } from "../constants.js"; import { k } from "../kaplay.js"; -import colorTags from "../data/colorTags.json"; +import { themes } from "../data/themes.js"; +import { resizableObjects, resizablePos } from "../components/resizablePos.js"; let COLOR_TEXT_DEFAULT = k.Color.fromHex("#553d4d"); let COLOR_TEXT_RIVAL = k.Color.fromHex("#fbf236"); @@ -18,13 +16,24 @@ let COLOR_TEXT_CORRECT = k.Color.WHITE; let COLOR_TEXT_INCORRECT = k.Color.RED; let OmitedtagsLengths = { "▯": 0 }; let completedBlocks = 0; -let totalCorrectChars = 0; +export let totalCorrectChars = 0; let totalIncorrectChars = 0; let totalCorrectLines = 0; let timeLeft = maxtime; let currentMistakes = 0; let font_size = 24; -let currentline = 0; +let errorCharsIndexes = []; +let errorCharsReplaces = {}; +// this is the text taken from the json file +let originalText = ""; +// this is the rendered text +let renderedText = ""; +// this is the text without any special character (for compare with user input) +let fixedText = ""; +let curLine = 0; +const theme = themes[0]; +const themeTokens = theme.tokens; +const themeAssociations = theme.associations; k.scene("game", () => { const speedX = 0.1; @@ -38,6 +47,41 @@ k.scene("game", () => { let offsetY = 0; animateBackground(); + /** + * @param {number} i + */ + const matchColorToken = (i, ch) => { + if (ch === " ") return COLOR_TEXT_DEFAULT; + if (cursorPos - 1 < i) return COLOR_TEXT_DEFAULT; + + const words = originalText.split(" "); + let wordCharsIndex = 0; + const word = + words.find((w) => { + const found = w.length + wordCharsIndex >= i; + wordCharsIndex += w.length + 1; + return found; + }) || ""; + + if (errorCharsIndexes.includes(i)) { + return COLOR_TEXT_INCORRECT; + } + + if (ch.match(themeAssociations.brackets)) { + return k.Color.fromHex(themeTokens.brackets); + } + + if (word.match(themeAssociations.classes)) { + return k.CYAN; + } else if (word.match(themeAssociations.functions)) { + return k.Color.fromHex(themeTokens.functions); + } else if (word.match(themeAssociations.keywords)) { + return k.Color.fromHex(themeTokens.keywords); + } else { + return new k.Color(255, 255, 255); + } + }; + function animateBackground() { offsetX += speedX; offsetY += speedY; @@ -54,7 +98,19 @@ k.scene("game", () => { k.opacity(0), ]); - const spritetextbox = k.add([ + const textboxBackParent = k.add([ + k.rect(k.width() * 0.7, k.height() * 0.5), + k.pos(0), + k.anchor("center"), + k.color(), + k.rotate(0), + k.scale(1), + k.z(10), + k.mask("intersect"), + resizablePos(() => k.vec2(k.width() / 2, k.height() / 2).add(0, 4)), + ]); + + const textboxBack = k.add([ k.sprite("bg2"), k.pos(k.center()), k.anchor("center"), @@ -64,7 +120,7 @@ k.scene("game", () => { k.scale(1), ]); - const backtextbox = k.add([ + const textboxBorder = k.add([ k.sprite("bgpng"), k.pos(k.center()), k.anchor("center"), @@ -73,6 +129,17 @@ k.scene("game", () => { k.scale(1), ]); + const textboxText = textboxBackParent.add([ + k.text("", { + size: font_size, + transform: (idx, ch) => ({ + color: matchColorToken(idx, ch), + }), + }), + k.anchor("top"), + k.pos(0, -textbox.height / 2 + 10), + ]); + const timerLabel = k.add([ k.text(String(timeLeft), { size: 48, @@ -84,7 +151,7 @@ k.scene("game", () => { const cursorPointer = k.add([ k.text("_", { size: 16 }), - k.pos(0, 0), + k.pos(k.vec2(textboxText.pos).add(0, font_size)), k.opacity(0.6), k.anchor("left"), k.color(255, 255, 255), @@ -98,22 +165,24 @@ k.scene("game", () => { k.color(COLOR_TEXT_RIVAL), ]); - spritetextbox.onUpdate(() => { + textboxBackParent.onUpdate(() => { const scaleFactorX = k.width() / 1920; const scaleFactorY = k.height() / 1080; const scaleFactor = Math.min(scaleFactorX, scaleFactorY); - spritetextbox.scale = k.vec2(scaleFactor); - spritetextbox.pos = k.vec2(k.width() / 2, k.height() / 2); + textboxBack.scale = k.vec2(scaleFactor); + textboxBack.pos = k.vec2(k.width() / 2, k.height() / 2); + textboxBackParent.width = textboxBack.width * scaleFactor - 20; + textboxBackParent.height = textboxBack.height * scaleFactor - 36; }); - backtextbox.onUpdate(() => { + textboxBorder.onUpdate(() => { const scaleFactorX = k.width() / 1920; const scaleFactorY = k.height() / 1080; const scaleFactor = Math.min(scaleFactorX, scaleFactorY); - backtextbox.scale = k.vec2(scaleFactor); - backtextbox.pos = k.vec2(k.width() / 2, k.height() / 2); + textboxBorder.scale = k.vec2(scaleFactor); + textboxBorder.pos = k.vec2(k.width() / 2, k.height() / 2); }); updateLineVisibility(); @@ -152,7 +221,23 @@ k.scene("game", () => { }); } - let tagPositions = {}; + /** + * @param {string} group + */ + const logGroupWithColor = (group) => { + if (k.debug.inspect !== true) return; + + const curChar = group[cursorPos]; + const groupFrom = group.substring(0, cursorPos); + const groupTo = group.substring(cursorPos + 1); + + console.log( + `%c${groupFrom}%c${curChar}%c${groupTo}`, + "color: inherit;", + "color: #f00;", + "color: inherit;", + ); + }; function updateDialog() { completedBlocks++; @@ -163,73 +248,67 @@ k.scene("game", () => { txtCharacters.length = 0; timeLeft = maxtime; + // the sentences const currentGroup = getCurrentGroup(); - let totalTextWidth = currentGroup.reduce((width, line) => { - return width + line.length * charSpacing; - }, 0); + // we replace [] characters with \[ and \] to avoid them being interpreted as tags + // also ▯ is replaced with a space - let initialPosX = - Math.max(0, (textbox.width - totalTextWidth) / 2.2) + - textbox.pos.x - - textbox.width / 2.2; - let verticalOffset = textbox.pos.y * 0.7; + originalText = currentGroup.join(""); - const textboxTop = textbox.pos.y - textbox.height / 2; - const textboxBottom = textbox.pos.y + textbox.height / 2.5; - - for (let line of currentGroup) { - let i = 0; - while (i < line.length) { - const char = line[i]; - let tagFound = false; - for (let tag in OmitedtagsLengths) { - if (line.startsWith(tag, i)) { - totalCorrectChars++; - i += OmitedtagsLengths[tag]; - tagFound = true; - break; - } - } - if (!tagFound) { - const charPosY = verticalOffset; - const isVisible = - charPosY >= textboxTop && charPosY <= textboxBottom; - - const charText = k.add([ - k.text(char, { size: font_size, font: "monogram" }), - k.pos(initialPosX + i * charSpacing, verticalOffset), - k.anchor("left"), - k.color(COLOR_TEXT_DEFAULT), - k.opacity(isVisible ? 1 : 0), - { - originalChar: char, - originalColor: COLOR_TEXT_DEFAULT, - isModified: false, - }, - ]); - txtCharacters.push(charText); - } - i++; - } - verticalOffset += lineHeight; - } + const fixedGroup = currentGroup + .join("") + .replace(/\[/g, "\\[") + .replace(/\]/g, "\\]") + .replace(/▯/g, " "); + + fixedText = currentGroup.join("").replace(/▯/g, " "); + renderedText = fixedGroup; + textboxText.text = renderedText; - updateCursorPosition(); applyRivalColor(); } - function updateCursorPosition() { - if (cursorPos < txtCharacters.length && txtCharacters[cursorPos]) { - const currentChar = txtCharacters[cursorPos]; - cursorPointer.pos = k.vec2( - currentChar.pos.x, - currentChar.pos.y * 1.02, - ); - // debug.log(cursorPos); - } else { - console.warn("undefined or exceeded range"); - } + function updateDialogErrors() { + renderedText = fixedText + .split("") + .map((char, index) => { + if (errorCharsIndexes.includes(index)) { + console.log(char, index); + return errorCharsReplaces[index]; + } else { + return char; + } + }) + .join("") + .replace(/\[/g, "\\[") + .replace(/\]/g, "\\]"); + + textboxText.text = renderedText; + } + + function prevChar() { + cursorPos--; + cursorPointer.pos = k.vec2(cursorPointer.pos).sub(12, 0); + logGroupWithColor(fixedText); + } + + function nextChar() { + cursorPos++; + cursorPointer.pos = k.vec2(cursorPointer.pos).add(12, 0); + logGroupWithColor(fixedText); + } + + function nextLine() { + curLine++; + const line = fixedText.split("\n")[curLine]; + const lineIdent = line.match(/^\s+/)?.[0].length || 0; + cursorPos += lineIdent; + + cursorPointer.pos = k.vec2( + textboxText.pos.x + 12 * lineIdent, + cursorPointer.pos.y + lineHeight, + ); } function startTimer() { @@ -273,189 +352,199 @@ k.scene("game", () => { updateLineVisibility(); } - let spacePositions = []; - - window.addEventListener("keydown", (event) => { - const key = event.key; - - if (key === "Backspace" && cursorPos > 0) { - const currentChar = txtCharacters[cursorPos - 1]; - const nextChar = - cursorPos < txtCharacters.length - ? txtCharacters[cursorPos] - : null; + k.onKeyPress((key) => { + // only letters on this hanadler + let isCorrect = false; + let isNextLine = false; + const correctChar = fixedText[cursorPos]; - if ( - cursorPos === 1 && - tagPositions.hasOwnProperty(currentChar.originalChar) - ) { - cursorPos--; - updateCursorPosition(); - return; - } - - if (currentChar.text !== currentChar.originalChar) { - currentChar.text = currentChar.originalChar; - } - - if (currentChar.originalChar === "\n") { - totalCorrectLines--; - currentline--; - if (currentline >= startmoveline - 1) { - shiftLines("down"); - } - } - - if (currentChar.color.eq(COLOR_TEXT_INCORRECT)) { - currentMistakes--; - } - - if (nextChar && nextChar.color.eq(COLOR_TEXT_RIVAL)) { - currentChar.color = COLOR_TEXT_RIVAL; + if (key.length == 1) { + if (k.isKeyDown("shift")) { + key = key.toUpperCase(); + isCorrect = key === correctChar; } else { - currentChar.color = currentChar.originalColor; + isCorrect = key === correctChar; } - currentChar.isModified = false; - cursorPos--; - updateCursorPosition(); - applyTagColor(); + } else if (key === "space") { + isCorrect = " " === correctChar; + } else if (key === "enter") { + isCorrect = correctChar === "\n"; + if (isCorrect) isNextLine = true; + } else if (key.length > 1) { return; } - if (currentMistakes >= maxMistakes) { - return; + if (isCorrect && isNextLine) { + totalCorrectChars++; + nextChar(); + nextLine(); + } else if (isCorrect) { + totalCorrectChars++; + nextChar(); + } else { + errorCharsIndexes.push(cursorPos); + errorCharsReplaces[cursorPos] = key === "space" ? "_" : key; + updateDialogErrors(); + nextChar(); } - if (cursorPos < txtCharacters.length) { - const currentChar = txtCharacters[cursorPos]; - applyTagColor(); - - if (isTag(currentChar.originalChar)) { - cursorPos++; - totalCorrectChars++; - updateCursorPosition(); - return; - } - - if (currentChar.originalChar === "\n") { - if (key === "Enter" && currentMistakes == 0) { - currentChar.color = COLOR_TEXT_CORRECT; - totalCorrectChars++; - totalCorrectLines++; - cursorPos++; - currentline++; - updateCursorPosition(); - - if (currentline >= startmoveline) { - shiftLines("up"); - } - updateCursorPosition(); - - if (cursorPos >= txtCharacters.length) { - const noInvalidColors = txtCharacters.every( - (char) => - !char.color.eq(COLOR_TEXT_INCORRECT) && - !char.color.eq(COLOR_TEXT_RIVAL) && - !char.color.eq(COLOR_TEXT_DEFAULT), - ); - if (noInvalidColors) { - currentGroupIndex++; - if ( - currentGroupIndex >= - selectCurrentBlock().length / maxLines - ) { - if (completedBlocks >= goalBlocks) { - k.go("endgame"); - return; - } - currentBlockIndex++; - if ( - currentBlockIndex >= jsonData.blocks.length - ) { - currentBlockIndex = 0; - } - updateDialog(); - } else { - updateDialog(); - } - } - } - } - return; - } - - if (key.length === 1 || key === " ") { - const isCorrect = currentChar.text === key; - - if (isCorrect) { - currentChar.color = COLOR_TEXT_CORRECT; - totalCorrectChars++; - } else { - currentChar.color = COLOR_TEXT_INCORRECT; - currentChar.text = key; + console.log("cursorPos", cursorPos); + }); - if (currentChar.text === " ") { - currentChar.text = "_"; - } + k.onKeyPressRepeat("backspace", () => { + if (cursorPos <= 0) return; // prevent negative index - totalIncorrectChars++; - currentMistakes++; + prevChar(); - if (currentChar.originalChar === " ") { - currentChar.text = key; - spacePositions.push(cursorPos); - } - } - cursorPos++; - updateCursorPosition(); - } + if (errorCharsIndexes.includes(cursorPos)) { + errorCharsIndexes = errorCharsIndexes.filter( + (index) => index !== cursorPos, + ); } + + updateDialogErrors(); }); - function applyTagColor() { - if (colorTags && currentBlockIndex !== undefined) { - // debug.log(` ${cursorPos}`); - const currentBlock = colorTags[currentBlockIndex]; - if (currentBlock) { - for (const [tag, positions] of Object.entries(currentBlock)) { - //debug.log(`Checking tag ${tag} with positions ${positions}`); - - if (positions.includes(cursorPos)) { - switch (tag) { - case "/C1": - COLOR_TEXT_CORRECT = k.Color.fromHex("#ff37b1"); - // debug.log("/C1"); - break; - case "/C2": - COLOR_TEXT_CORRECT = k.Color.fromHex("#22fcff"); - // debug.log(" /C2"); - break; - case "/C3": - COLOR_TEXT_CORRECT = k.Color.WHITE; - // debug.log("/C3"); - break; - case "/C4": - COLOR_TEXT_CORRECT = k.Color.WHITE; - // debug.log("/C4"); - break; - case "/C5": - COLOR_TEXT_CORRECT = k.Color.fromHex("#32ed67"); - // debug.log("/C5"); - break; - default: - console.warn(`warn: ${tag}`); - break; - } - break; - } - } - } - } - } + k.onResize(() => { + resizableObjects.forEach((obj) => obj.updatePos()); + }); - function isTag(character) { - return tagPositions.hasOwnProperty(character); - } + // window.addEventListener("keydown", (event) => { + // const key = event.key; + + // if (key === "Backspace" && cursorPos > 0) { + // const currentChar = txtCharacters[cursorPos - 1]; + // const nextChar = + // cursorPos < txtCharacters.length + // ? txtCharacters[cursorPos] + // : null; + + // if ( + // cursorPos === 1 && + // tagPositions.hasOwnProperty(currentChar.originalChar) + // ) { + // cursorPos--; + // updateCursorPosition(); + // return; + // } + + // if (currentChar.text !== currentChar.originalChar) { + // currentChar.text = currentChar.originalChar; + // } + + // if (currentChar.originalChar === "\n") { + // totalCorrectLines--; + // currentline--; + // if (currentline >= startmoveline - 1) { + // shiftLines("down"); + // } + // } + + // if (currentChar.color.eq(COLOR_TEXT_INCORRECT)) { + // currentMistakes--; + // } + + // if (nextChar && nextChar.color.eq(COLOR_TEXT_RIVAL)) { + // currentChar.color = COLOR_TEXT_RIVAL; + // } else { + // currentChar.color = currentChar.originalColor; + // } + // currentChar.isModified = false; + // cursorPos--; + // updateCursorPosition(); + // applyTagColor(); + // return; + // } + + // if (currentMistakes >= maxMistakes) { + // return; + // } + + // if (cursorPos < text.text.length) { + // const currentChar = txtCharacters[cursorPos]; + // applyTagColor(); + + // if (isTag(currentChar.originalChar)) { + // cursorPos++; + // totalCorrectChars++; + // updateCursorPosition(); + // return; + // } + + // if (currentChar.originalChar === "\n") { + // if (key === "Enter" && currentMistakes == 0) { + // currentChar.color = COLOR_TEXT_CORRECT; + // totalCorrectChars++; + // totalCorrectLines++; + // cursorPos++; + // currentline++; + // updateCursorPosition(); + + // if (currentline >= startmoveline) { + // shiftLines("up"); + // } + // updateCursorPosition(); + + // if (cursorPos >= txtCharacters.length) { + // const noInvalidColors = txtCharacters.every( + // (char) => + // !char.color.eq(COLOR_TEXT_INCORRECT) && + // !char.color.eq(COLOR_TEXT_RIVAL) && + // !char.color.eq(COLOR_TEXT_DEFAULT), + // ); + // if (noInvalidColors) { + // currentGroupIndex++; + // if ( + // currentGroupIndex >= + // selectCurrentBlock().length / maxLines + // ) { + // if (completedBlocks >= goalBlocks) { + // k.go("endgame"); + // return; + // } + // currentBlockIndex++; + // if ( + // currentBlockIndex >= jsonData.blocks.length + // ) { + // currentBlockIndex = 0; + // } + // updateDialog(); + // } else { + // updateDialog(); + // } + // } + // } + // } + // return; + // } + + // if (key.length === 1 || key === " ") { + // const isCorrect = currentChar.text === key; + + // if (isCorrect) { + // currentChar.color = COLOR_TEXT_CORRECT; + // totalCorrectChars++; + // } else { + // currentChar.color = COLOR_TEXT_INCORRECT; + // currentChar.text = key; + + // if (currentChar.text === " ") { + // currentChar.text = "_"; + // } + + // totalIncorrectChars++; + // currentMistakes++; + + // if (currentChar.originalChar === " ") { + // currentChar.text = key; + // spacePositions.push(cursorPos); + // } + // } + // cursorPos++; + // updateCursorPosition(); + // } + // } + // }); startTimer(); updateDialog(); From b422be618ad4bae691e9403a05d864af567fdbed Mon Sep 17 00:00:00 2001 From: lajbel Date: Wed, 4 Dec 2024 22:54:20 -0300 Subject: [PATCH 02/22] chore: some adjusutments --- game/src/scenes/game.js | 184 +++++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 77 deletions(-) diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index b97cccf..6b8899e 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -11,17 +11,17 @@ import { themes } from "../data/themes.js"; import { resizableObjects, resizablePos } from "../components/resizablePos.js"; let COLOR_TEXT_DEFAULT = k.Color.fromHex("#553d4d"); -let COLOR_TEXT_RIVAL = k.Color.fromHex("#fbf236"); +let COLOR_TEXT_RIVAL = k.Color.fromHex("#718703"); let COLOR_TEXT_CORRECT = k.Color.WHITE; let COLOR_TEXT_INCORRECT = k.Color.RED; -let OmitedtagsLengths = { "▯": 0 }; let completedBlocks = 0; export let totalCorrectChars = 0; let totalIncorrectChars = 0; let totalCorrectLines = 0; let timeLeft = maxtime; let currentMistakes = 0; -let font_size = 24; +let fontSize = 24; +let fontWidth = 12; let errorCharsIndexes = []; let errorCharsReplaces = {}; // this is the text taken from the json file @@ -30,7 +30,6 @@ let originalText = ""; let renderedText = ""; // this is the text without any special character (for compare with user input) let fixedText = ""; -let curLine = 0; const theme = themes[0]; const themeTokens = theme.tokens; const themeAssociations = theme.associations; @@ -41,8 +40,18 @@ k.scene("game", () => { const maxLines = 20; let currentBlockIndex = 0; let currentGroupIndex = 0; - let txtCharacters = []; + // #region PLAYER variables let cursorPos = 0; + let curLine = 0; + let curIdentSize = 0; + let txtCharacters = []; + // #endregion + // #region RIVAL variables + let rivalCursorPos = 0; + let curRivalLine = 0; + let rivalTxtCharacters = []; + // #endregion + let offsetX = 0; let offsetY = 0; animateBackground(); @@ -52,7 +61,12 @@ k.scene("game", () => { */ const matchColorToken = (i, ch) => { if (ch === " ") return COLOR_TEXT_DEFAULT; - if (cursorPos - 1 < i) return COLOR_TEXT_DEFAULT; + if (cursorPos - 1 < i) { + if (rivalCursorPos + 1 > i) { + return COLOR_TEXT_RIVAL; + } + return COLOR_TEXT_DEFAULT; + } const words = originalText.split(" "); let wordCharsIndex = 0; @@ -131,13 +145,12 @@ k.scene("game", () => { const textboxText = textboxBackParent.add([ k.text("", { - size: font_size, + size: fontSize, transform: (idx, ch) => ({ color: matchColorToken(idx, ch), }), }), - k.anchor("top"), - k.pos(0, -textbox.height / 2 + 10), + k.pos(-textbox.width / 4, -textbox.height / 2 + 10), ]); const timerLabel = k.add([ @@ -151,15 +164,16 @@ k.scene("game", () => { const cursorPointer = k.add([ k.text("_", { size: 16 }), - k.pos(k.vec2(textboxText.pos).add(0, font_size)), + k.pos(textboxBackParent.pos.add(textboxText.pos).add(0, fontSize)), k.opacity(0.6), k.anchor("left"), k.color(255, 255, 255), + k.z(10), ]); const rivalPointer = k.add([ k.text("_", { size: 16 }), - k.pos(0, 0), + k.pos(textboxBackParent.pos.add(textboxText.pos).add(0, fontSize)), k.opacity(0.6), k.anchor("left"), k.color(COLOR_TEXT_RIVAL), @@ -185,7 +199,7 @@ k.scene("game", () => { textboxBorder.pos = k.vec2(k.width() / 2, k.height() / 2); }); - updateLineVisibility(); + // updateLineVisibility(); function selectCurrentBlock() { if (jsonData.blocks && jsonData.blocks[currentBlockIndex]) { @@ -203,24 +217,6 @@ k.scene("game", () => { return currentBlock.slice(0, visibleLines); } - function applyRivalColor() { - let rivalIndex = 0; - const currentBlockId = currentBlockIndex; - k.loop(0.3, () => { - if ( - rivalIndex < txtCharacters.length && - currentBlockIndex === currentBlockId - ) { - const char = txtCharacters[rivalIndex]; - if (char.color.eq(COLOR_TEXT_DEFAULT)) { - char.color = COLOR_TEXT_RIVAL; - } - rivalPointer.pos = k.vec2(char.pos.x, char.pos.y * 1.02); - rivalIndex++; - } - }); - } - /** * @param {string} group */ @@ -265,8 +261,6 @@ k.scene("game", () => { fixedText = currentGroup.join("").replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; - - applyRivalColor(); } function updateDialogErrors() { @@ -287,70 +281,102 @@ k.scene("game", () => { textboxText.text = renderedText; } - function prevChar() { - cursorPos--; - cursorPointer.pos = k.vec2(cursorPointer.pos).sub(12, 0); - logGroupWithColor(fixedText); + function prevChar(rival = false) { + if (rival) { + rivalCursorPos--; + rivalPointer.pos = k.vec2(rivalPointer.pos).sub(fontWidth, 0); + logGroupWithColor(fixedText); + } else { + cursorPos--; + cursorPointer.pos = k.vec2(cursorPointer.pos).sub(fontWidth, 0); + logGroupWithColor(fixedText); + } } - function nextChar() { - cursorPos++; - cursorPointer.pos = k.vec2(cursorPointer.pos).add(12, 0); - logGroupWithColor(fixedText); - } + function nextChar(rival = false) { + if (rival) { + rivalCursorPos++; + rivalPointer.pos = k.vec2(rivalPointer.pos).add(fontWidth, 0); + logGroupWithColor(fixedText); - function nextLine() { - curLine++; - const line = fixedText.split("\n")[curLine]; - const lineIdent = line.match(/^\s+/)?.[0].length || 0; - cursorPos += lineIdent; + if (fixedText[rivalCursorPos] === "\n") { + nextLine(true); + } + } else { + cursorPos++; + cursorPointer.pos = k.vec2(cursorPointer.pos).add(fontWidth, 0); + logGroupWithColor(fixedText); + } + } - cursorPointer.pos = k.vec2( - textboxText.pos.x + 12 * lineIdent, - cursorPointer.pos.y + lineHeight, - ); + function nextLine(rival = false) { + if (rival) { + curRivalLine++; + const line = fixedText.split("\n")[curRivalLine]; + const lineIdent = line.match(/^\s+/)?.[0].length || 0; + rivalCursorPos += lineIdent; + + rivalPointer.pos = k.vec2( + textboxBackParent.pos.add(textboxText.pos).x + + lineIdent * fontWidth, + rivalPointer.pos.y + lineHeight, + ); + } else { + curLine++; + const line = fixedText.split("\n")[curLine]; + const lineIdent = line.match(/^\s+/)?.[0].length || 0; + cursorPos += lineIdent; + curIdentSize = lineIdent; + + cursorPointer.pos = k.vec2( + textboxBackParent.pos.add(textboxText.pos).x + + lineIdent * fontWidth, + cursorPointer.pos.y + lineHeight, + ); + } } function startTimer() { k.loop(1, () => { timeLeft--; timerLabel.text = String(timeLeft); - // console.log(totalCorrectChars); - // console.log(totalIncorrectChars); - // console.log(totalCorrectLines); if (timeLeft <= 0) { k.go("endgame"); } }); + + k.loop(0.3, () => { + nextChar(true); + }); } - function updateLineVisibility() { - const textboxTop = textbox.pos.y - textbox.height / 2; - const textboxBottom = textbox.pos.y + textbox.height / 2; - const adjustedTextboxTop = textboxTop - marginvisiblebox; - const adjustedTextboxBottom = textboxBottom + marginvisiblebox; + // function updateLineVisibility() { + // const textboxTop = textbox.pos.y - textbox.height / 2; + // const textboxBottom = textbox.pos.y + textbox.height / 2; + // const adjustedTextboxTop = textboxTop - marginvisiblebox; + // const adjustedTextboxBottom = textboxBottom + marginvisiblebox; - for (let char of txtCharacters) { - if (!char || !char.pos) { - console.warn("Invalid character:", char); - continue; - } - const isVisible = - char.pos.y >= adjustedTextboxTop && - char.pos.y <= adjustedTextboxBottom; - char.opacity = isVisible ? 1 : 0; - } - } + // for (let char of txtCharacters) { + // if (!char || !char.pos) { + // console.warn("Invalid character:", char); + // continue; + // } + // const isVisible = + // char.pos.y >= adjustedTextboxTop && + // char.pos.y <= adjustedTextboxBottom; + // char.opacity = isVisible ? 1 : 0; + // } + // } - function shiftLines(direction) { - const shiftAmount = direction === "up" ? -lineHeight : lineHeight; - for (let char of txtCharacters) { - char.pos.y += shiftAmount; - rivalPointer.pos = k.vec2(char.pos.x, char.pos.y * 1.02); - } + // function shiftLines(direction) { + // const shiftAmount = direction === "up" ? -lineHeight : lineHeight; + // for (let char of txtCharacters) { + // char.pos.y += shiftAmount; + // rivalPointer.pos = k.vec2(char.pos.x, char.pos.y * 1.02); + // } - updateLineVisibility(); - } + // updateLineVisibility(); + // } k.onKeyPress((key) => { // only letters on this hanadler @@ -358,6 +384,10 @@ k.scene("game", () => { let isNextLine = false; const correctChar = fixedText[cursorPos]; + if (errorCharsIndexes.length > 1) { + return k.shake(5); + } + if (key.length == 1) { if (k.isKeyDown("shift")) { key = key.toUpperCase(); From a3ac960768f62fca0a8667fba379f3b487f4340a Mon Sep 17 00:00:00 2001 From: lajbel Date: Fri, 6 Dec 2024 22:47:38 -0300 Subject: [PATCH 03/22] chore: no new line with errors --- game/src/scenes/game.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index 6b8899e..1260c82 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -388,6 +388,10 @@ k.scene("game", () => { return k.shake(5); } + if(correctChar === "\n" && errorCharsIndexes.length > 0) { + return k.shake(5); + } + if (key.length == 1) { if (k.isKeyDown("shift")) { key = key.toUpperCase(); @@ -417,8 +421,6 @@ k.scene("game", () => { updateDialogErrors(); nextChar(); } - - console.log("cursorPos", cursorPos); }); k.onKeyPressRepeat("backspace", () => { From b1d33664c185bf80d55ed20b46291b011c3e022d Mon Sep 17 00:00:00 2001 From: lajbel Date: Mon, 9 Dec 2024 10:04:39 -0300 Subject: [PATCH 04/22] feat: update resizing, responsive, positions and fix writing --- game/src/components/resizablePos.js | 25 +- game/src/components/resizableRect.js | 29 ++ game/src/constants.js | 9 + game/src/scenes/game.js | 455 +++++++++------------------ 4 files changed, 207 insertions(+), 311 deletions(-) create mode 100644 game/src/components/resizableRect.js diff --git a/game/src/components/resizablePos.js b/game/src/components/resizablePos.js index f0e19b9..f6a6135 100644 --- a/game/src/components/resizablePos.js +++ b/game/src/components/resizablePos.js @@ -1,22 +1,31 @@ /** - * @typedef {import("../types").Vec2} Vec2 + * @typedef {import("kaplay").Vec2} Vec2 + * @typedef {import("kaplay").GameObj} GameObj + * @typedef {import("kaplay").PosComp} PosComp */ -export let resizableObjects = []; +import { data } from "../constants.js"; + /** * Set the position on resize * - * @param {() => Vec2} posFunc + * @param {() => Vec2} sizeFunc */ -export const resizablePos = (posFunc) => ({ +export const resizablePos = (sizeFunc) => ({ id: "resizablePos", - posFunc, + sizeFunc, add() { - resizableObjects.push(this); - this.pos = this.posFunc(); + data.resizableObjects.push(this); + this.pos = this.sizeFunc(); }, + /** + * @type { GameObj } this + */ updatePos() { - this.pos = this.posFunc(); + this.pos = this.sizeFunc(); }, + destroy() { + data.resizableObjects = data.resizableObjects.filter((obj) => obj !== this); + } }); diff --git a/game/src/components/resizableRect.js b/game/src/components/resizableRect.js new file mode 100644 index 0000000..f583878 --- /dev/null +++ b/game/src/components/resizableRect.js @@ -0,0 +1,29 @@ +/** + * @typedef {import("kaplay").Vec2} Vec2 + * @typedef {import("kaplay").GameObj} GameObj + * @typedef {import("kaplay").RectComp} RectComp + */ + +import { data } from "../constants.js"; +import { k } from "../kaplay.js"; + +/** + * Set the rect on resize + * + * @param {() => Vec2} resizeFunc + */ +export const resizableRect = (resizeFunc) => ({ + id: "resizableRect", + resizeFunc, + add() { + this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); + }, + updateRectSize() { + this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); + }, + destroy() { + data.resizableObjects = data.resizableObjects.filter( + (obj) => obj !== this, + ); + }, +}); diff --git a/game/src/constants.js b/game/src/constants.js index cc4173b..1c30a73 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -10,3 +10,12 @@ export const charSpacing = 10; export const startmoveline = 1; export const marginvisiblebox = 1; export const jsonData = dialogs; +// modifiable data in game +export const data = { + /** + * Allocated resizable objects for update on resize + * + * @type {import("kaplay").GameObj[]} + */ + resizableObjects: [], +}; diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index 1260c82..1b09b73 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -1,6 +1,7 @@ // @ts-check import { + data, jsonData, lineHeight, marginvisiblebox, @@ -8,8 +9,8 @@ import { } from "../constants.js"; import { k } from "../kaplay.js"; import { themes } from "../data/themes.js"; -import { resizableObjects, resizablePos } from "../components/resizablePos.js"; - +import { resizablePos } from "../components/resizablePos.js"; +import { resizableRect } from "../components/resizableRect.js"; let COLOR_TEXT_DEFAULT = k.Color.fromHex("#553d4d"); let COLOR_TEXT_RIVAL = k.Color.fromHex("#718703"); let COLOR_TEXT_CORRECT = k.Color.WHITE; @@ -30,26 +31,52 @@ let originalText = ""; let renderedText = ""; // this is the text without any special character (for compare with user input) let fixedText = ""; + +// allocating all resizable objects in one const theme = themes[0]; const themeTokens = theme.tokens; const themeAssociations = theme.associations; k.scene("game", () => { - const speedX = 0.1; - const speedY = 0.3; - const maxLines = 20; + const BG_SPEED_X = 0.1; + const BG_SPEED_Y = 0.3; let currentBlockIndex = 0; - let currentGroupIndex = 0; - // #region PLAYER variables - let cursorPos = 0; - let curLine = 0; - let curIdentSize = 0; - let txtCharacters = []; - // #endregion - // #region RIVAL variables - let rivalCursorPos = 0; - let curRivalLine = 0; - let rivalTxtCharacters = []; + + // #region PLAYER & RIVAL VARIABLES + /** + * @typedef {Object} PlayerState + * @property {number} cursorPos + * @property {string} line + * @property {number} curLineCount + * @property {number} curCharInLine + * @property {number} curIdentSize + * @property {import("kaplay").GameObj | null} cursorPointer + */ + + /** + * @type {PlayerState} + */ + const playerState = { + cursorPos: 0, + line: "", + curLineCount: 0, + curCharInLine: 0, + curIdentSize: 0, + cursorPointer: null, + }; + + /** + * @type {PlayerState} + */ + const rivalState = { + cursorPos: 0, + line: "", + curLineCount: 0, + curCharInLine: 0, + curIdentSize: 0, + cursorPointer: null, + }; + // #endregion let offsetX = 0; @@ -61,8 +88,8 @@ k.scene("game", () => { */ const matchColorToken = (i, ch) => { if (ch === " ") return COLOR_TEXT_DEFAULT; - if (cursorPos - 1 < i) { - if (rivalCursorPos + 1 > i) { + if (playerState.cursorPos - 1 < i) { + if (rivalState.cursorPos + 1 > i) { return COLOR_TEXT_RIVAL; } return COLOR_TEXT_DEFAULT; @@ -97,50 +124,34 @@ k.scene("game", () => { }; function animateBackground() { - offsetX += speedX; - offsetY += speedY; + offsetX += BG_SPEED_X; + offsetY += BG_SPEED_Y; document.body.style.backgroundPosition = `${offsetX}px ${offsetY}px`; requestAnimationFrame(animateBackground); } + // fondo + const textboxSize = () => k.vec2(k.width() * 0.7, k.height()); + const textPadding = k.vec2(12, 12); + const textbox = k.add([ - k.rect(k.width() * 0.7, k.height() * 0.5), - k.anchor("center"), - k.pos(k.center().x, k.height() - k.height() * 0.5), + resizableRect(textboxSize), + resizablePos(() => k.vec2(0 + textboxSize().x / 2, 0)), + k.anchor("topleft"), k.color(23, 9, 39), - k.opacity(0), + k.opacity(0.5), ]); const textboxBackParent = k.add([ - k.rect(k.width() * 0.7, k.height() * 0.5), - k.pos(0), - k.anchor("center"), + resizableRect(textboxSize), + resizablePos(() => k.vec2(0 + textboxSize().x / 2, 0)), + k.anchor("topleft"), k.color(), k.rotate(0), k.scale(1), k.z(10), - k.mask("intersect"), - resizablePos(() => k.vec2(k.width() / 2, k.height() / 2).add(0, 4)), - ]); - - const textboxBack = k.add([ - k.sprite("bg2"), - k.pos(k.center()), - k.anchor("center"), - k.color(), - k.rotate(0), - k.opacity(0.7), - k.scale(1), - ]); - - const textboxBorder = k.add([ - k.sprite("bgpng"), - k.pos(k.center()), - k.anchor("center"), - k.color(), - k.rotate(0), - k.scale(1), + k.opacity(0), ]); const textboxText = textboxBackParent.add([ @@ -150,7 +161,7 @@ k.scene("game", () => { color: matchColorToken(idx, ch), }), }), - k.pos(-textbox.width / 4, -textbox.height / 2 + 10), + resizablePos(() => k.vec2(textPadding)), ]); const timerLabel = k.add([ @@ -158,13 +169,26 @@ k.scene("game", () => { size: 48, font: "monogram", }), - k.pos(k.width() * 0.8, k.height() * 0.25), - k.anchor("topright"), + resizablePos(() => k.vec2(k.width(), k.height())), + k.anchor("botright"), ]); + const cursorPos = (rival = false) => { + const player = rival ? rivalState : playerState; + + return k.vec2( + textboxBackParent.pos + .add(textboxText.pos) + .add( + player.curCharInLine * fontWidth, + (player.curLineCount + 1) * lineHeight, + ), + ); + }; + const cursorPointer = k.add([ k.text("_", { size: 16 }), - k.pos(textboxBackParent.pos.add(textboxText.pos).add(0, fontSize)), + resizablePos(() => cursorPos()), k.opacity(0.6), k.anchor("left"), k.color(255, 255, 255), @@ -173,33 +197,14 @@ k.scene("game", () => { const rivalPointer = k.add([ k.text("_", { size: 16 }), - k.pos(textboxBackParent.pos.add(textboxText.pos).add(0, fontSize)), + resizablePos(() => cursorPos(true)), k.opacity(0.6), k.anchor("left"), k.color(COLOR_TEXT_RIVAL), ]); - textboxBackParent.onUpdate(() => { - const scaleFactorX = k.width() / 1920; - const scaleFactorY = k.height() / 1080; - const scaleFactor = Math.min(scaleFactorX, scaleFactorY); - - textboxBack.scale = k.vec2(scaleFactor); - textboxBack.pos = k.vec2(k.width() / 2, k.height() / 2); - textboxBackParent.width = textboxBack.width * scaleFactor - 20; - textboxBackParent.height = textboxBack.height * scaleFactor - 36; - }); - - textboxBorder.onUpdate(() => { - const scaleFactorX = k.width() / 1920; - const scaleFactorY = k.height() / 1080; - const scaleFactor = Math.min(scaleFactorX, scaleFactorY); - - textboxBorder.scale = k.vec2(scaleFactor); - textboxBorder.pos = k.vec2(k.width() / 2, k.height() / 2); - }); - - // updateLineVisibility(); + playerState.cursorPointer = cursorPointer; + rivalState.cursorPointer = rivalPointer; function selectCurrentBlock() { if (jsonData.blocks && jsonData.blocks[currentBlockIndex]) { @@ -223,9 +228,9 @@ k.scene("game", () => { const logGroupWithColor = (group) => { if (k.debug.inspect !== true) return; - const curChar = group[cursorPos]; - const groupFrom = group.substring(0, cursorPos); - const groupTo = group.substring(cursorPos + 1); + const curChar = group[playerState.cursorPos]; + const groupFrom = group.substring(0, playerState.cursorPos); + const groupTo = group.substring(playerState.cursorPos + 1); console.log( `%c${groupFrom}%c${curChar}%c${groupTo}`, @@ -237,11 +242,8 @@ k.scene("game", () => { function updateDialog() { completedBlocks++; - currentGroupIndex = 0; - cursorPos = 0; + playerState.cursorPos = 0; currentMistakes = 0; - txtCharacters.forEach((char) => char.destroy()); - txtCharacters.length = 0; timeLeft = maxtime; // the sentences @@ -261,6 +263,8 @@ k.scene("game", () => { fixedText = currentGroup.join("").replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; + playerState.line = fixedText.split("\n")[0]; + rivalState.line = fixedText.split("\n")[0]; } function updateDialogErrors() { @@ -268,7 +272,6 @@ k.scene("game", () => { .split("") .map((char, index) => { if (errorCharsIndexes.includes(index)) { - console.log(char, index); return errorCharsReplaces[index]; } else { return char; @@ -281,58 +284,58 @@ k.scene("game", () => { textboxText.text = renderedText; } - function prevChar(rival = false) { - if (rival) { - rivalCursorPos--; - rivalPointer.pos = k.vec2(rivalPointer.pos).sub(fontWidth, 0); - logGroupWithColor(fixedText); - } else { - cursorPos--; - cursorPointer.pos = k.vec2(cursorPointer.pos).sub(fontWidth, 0); - logGroupWithColor(fixedText); - } + function nextChar(rival = false) { + const player = rival ? rivalState : playerState; + if (!player.cursorPointer) return; + + player.cursorPos++; + player.curCharInLine++; + player.cursorPointer.pos = cursorPos(rival); + logGroupWithColor(fixedText); } - function nextChar(rival = false) { - if (rival) { - rivalCursorPos++; - rivalPointer.pos = k.vec2(rivalPointer.pos).add(fontWidth, 0); - logGroupWithColor(fixedText); + function prevChar(rival = false) { + const player = rival ? rivalState : playerState; + if (!player.cursorPointer) return; - if (fixedText[rivalCursorPos] === "\n") { - nextLine(true); - } - } else { - cursorPos++; - cursorPointer.pos = k.vec2(cursorPointer.pos).add(fontWidth, 0); - logGroupWithColor(fixedText); - } + player.cursorPos--; + player.curCharInLine--; + player.cursorPointer.pos = cursorPos(); + logGroupWithColor(fixedText); } function nextLine(rival = false) { - if (rival) { - curRivalLine++; - const line = fixedText.split("\n")[curRivalLine]; - const lineIdent = line.match(/^\s+/)?.[0].length || 0; - rivalCursorPos += lineIdent; - - rivalPointer.pos = k.vec2( - textboxBackParent.pos.add(textboxText.pos).x + - lineIdent * fontWidth, - rivalPointer.pos.y + lineHeight, - ); + const player = rival ? rivalState : playerState; + if (!player.cursorPointer) return; + + player.curLineCount++; + + const line = fixedText.split("\n")[player.curLineCount]; + if (!line) return; + const lineIdent = line.match(/^\s+/)?.[0].length || 0; + + player.line = line; + player.cursorPos += lineIdent; + player.curIdentSize = lineIdent; + player.curCharInLine = lineIdent; + + player.cursorPointer.pos = cursorPos(rival); + } + + function rivalWrite() { + const isFinalLine = + rivalState.curLineCount === fixedText.split("\n").length - 1; + const isFinalLineChar = + rivalState.curCharInLine === rivalState.line.length; + + if (isFinalLineChar) { + if (isFinalLine) { + return k.go("endgame"); + } + + nextLine(true); } else { - curLine++; - const line = fixedText.split("\n")[curLine]; - const lineIdent = line.match(/^\s+/)?.[0].length || 0; - cursorPos += lineIdent; - curIdentSize = lineIdent; - - cursorPointer.pos = k.vec2( - textboxBackParent.pos.add(textboxText.pos).x + - lineIdent * fontWidth, - cursorPointer.pos.y + lineHeight, - ); + nextChar(true); } } @@ -345,50 +348,22 @@ k.scene("game", () => { } }); - k.loop(0.3, () => { - nextChar(true); + k.loop(0.2, () => { + rivalWrite(); }); } - // function updateLineVisibility() { - // const textboxTop = textbox.pos.y - textbox.height / 2; - // const textboxBottom = textbox.pos.y + textbox.height / 2; - // const adjustedTextboxTop = textboxTop - marginvisiblebox; - // const adjustedTextboxBottom = textboxBottom + marginvisiblebox; - - // for (let char of txtCharacters) { - // if (!char || !char.pos) { - // console.warn("Invalid character:", char); - // continue; - // } - // const isVisible = - // char.pos.y >= adjustedTextboxTop && - // char.pos.y <= adjustedTextboxBottom; - // char.opacity = isVisible ? 1 : 0; - // } - // } - - // function shiftLines(direction) { - // const shiftAmount = direction === "up" ? -lineHeight : lineHeight; - // for (let char of txtCharacters) { - // char.pos.y += shiftAmount; - // rivalPointer.pos = k.vec2(char.pos.x, char.pos.y * 1.02); - // } - - // updateLineVisibility(); - // } - k.onKeyPress((key) => { // only letters on this hanadler let isCorrect = false; let isNextLine = false; - const correctChar = fixedText[cursorPos]; + const correctChar = fixedText[playerState.cursorPos]; if (errorCharsIndexes.length > 1) { return k.shake(5); } - if(correctChar === "\n" && errorCharsIndexes.length > 0) { + if (correctChar === "\n" && errorCharsIndexes.length > 0) { return k.shake(5); } @@ -416,21 +391,29 @@ k.scene("game", () => { totalCorrectChars++; nextChar(); } else { - errorCharsIndexes.push(cursorPos); - errorCharsReplaces[cursorPos] = key === "space" ? "_" : key; + errorCharsIndexes.push(playerState.cursorPos); + errorCharsReplaces[playerState.cursorPos] = + key === "space" ? "_" : key; updateDialogErrors(); nextChar(); } }); k.onKeyPressRepeat("backspace", () => { - if (cursorPos <= 0) return; // prevent negative index + if (playerState.cursorPos <= 0) return; // prevent negative index - prevChar(); + if ( + playerState.curCharInLine === playerState.curIdentSize && + playerState.curLineCount > 0 + ) { + return k.shake(5); + } else { + prevChar(); + } - if (errorCharsIndexes.includes(cursorPos)) { + if (errorCharsIndexes.includes(playerState.cursorPos)) { errorCharsIndexes = errorCharsIndexes.filter( - (index) => index !== cursorPos, + (index) => index !== playerState.cursorPos, ); } @@ -438,146 +421,12 @@ k.scene("game", () => { }); k.onResize(() => { - resizableObjects.forEach((obj) => obj.updatePos()); + for (const obj of data.resizableObjects) { + if (obj.is("resizablePos")) obj.updatePos(); + if (obj.is("resizableRect")) obj.updateRectSize(); + } }); - // window.addEventListener("keydown", (event) => { - // const key = event.key; - - // if (key === "Backspace" && cursorPos > 0) { - // const currentChar = txtCharacters[cursorPos - 1]; - // const nextChar = - // cursorPos < txtCharacters.length - // ? txtCharacters[cursorPos] - // : null; - - // if ( - // cursorPos === 1 && - // tagPositions.hasOwnProperty(currentChar.originalChar) - // ) { - // cursorPos--; - // updateCursorPosition(); - // return; - // } - - // if (currentChar.text !== currentChar.originalChar) { - // currentChar.text = currentChar.originalChar; - // } - - // if (currentChar.originalChar === "\n") { - // totalCorrectLines--; - // currentline--; - // if (currentline >= startmoveline - 1) { - // shiftLines("down"); - // } - // } - - // if (currentChar.color.eq(COLOR_TEXT_INCORRECT)) { - // currentMistakes--; - // } - - // if (nextChar && nextChar.color.eq(COLOR_TEXT_RIVAL)) { - // currentChar.color = COLOR_TEXT_RIVAL; - // } else { - // currentChar.color = currentChar.originalColor; - // } - // currentChar.isModified = false; - // cursorPos--; - // updateCursorPosition(); - // applyTagColor(); - // return; - // } - - // if (currentMistakes >= maxMistakes) { - // return; - // } - - // if (cursorPos < text.text.length) { - // const currentChar = txtCharacters[cursorPos]; - // applyTagColor(); - - // if (isTag(currentChar.originalChar)) { - // cursorPos++; - // totalCorrectChars++; - // updateCursorPosition(); - // return; - // } - - // if (currentChar.originalChar === "\n") { - // if (key === "Enter" && currentMistakes == 0) { - // currentChar.color = COLOR_TEXT_CORRECT; - // totalCorrectChars++; - // totalCorrectLines++; - // cursorPos++; - // currentline++; - // updateCursorPosition(); - - // if (currentline >= startmoveline) { - // shiftLines("up"); - // } - // updateCursorPosition(); - - // if (cursorPos >= txtCharacters.length) { - // const noInvalidColors = txtCharacters.every( - // (char) => - // !char.color.eq(COLOR_TEXT_INCORRECT) && - // !char.color.eq(COLOR_TEXT_RIVAL) && - // !char.color.eq(COLOR_TEXT_DEFAULT), - // ); - // if (noInvalidColors) { - // currentGroupIndex++; - // if ( - // currentGroupIndex >= - // selectCurrentBlock().length / maxLines - // ) { - // if (completedBlocks >= goalBlocks) { - // k.go("endgame"); - // return; - // } - // currentBlockIndex++; - // if ( - // currentBlockIndex >= jsonData.blocks.length - // ) { - // currentBlockIndex = 0; - // } - // updateDialog(); - // } else { - // updateDialog(); - // } - // } - // } - // } - // return; - // } - - // if (key.length === 1 || key === " ") { - // const isCorrect = currentChar.text === key; - - // if (isCorrect) { - // currentChar.color = COLOR_TEXT_CORRECT; - // totalCorrectChars++; - // } else { - // currentChar.color = COLOR_TEXT_INCORRECT; - // currentChar.text = key; - - // if (currentChar.text === " ") { - // currentChar.text = "_"; - // } - - // totalIncorrectChars++; - // currentMistakes++; - - // if (currentChar.originalChar === " ") { - // currentChar.text = key; - // spacePositions.push(cursorPos); - // } - // } - // cursorPos++; - // updateCursorPosition(); - // } - // } - // }); - startTimer(); updateDialog(); }); From 6b380fd9e53686d26d6e6a51897d0980d1400233 Mon Sep 17 00:00:00 2001 From: lajbel Date: Thu, 12 Dec 2024 13:03:38 -0300 Subject: [PATCH 05/22] chore: change dialogs parsing --- game/package.json | 3 +- game/src/constants.js | 10 ++- game/src/data/dialogs.json | 38 ++++++++++ game/src/data/themes.js | 30 ++++++++ game/src/main.js | 5 +- game/src/scenes/game.js | 139 +++++++++++++++++++++---------------- game/src/types.js | 14 ++++ 7 files changed, 174 insertions(+), 65 deletions(-) create mode 100644 game/src/data/dialogs.json create mode 100644 game/src/types.js diff --git a/game/package.json b/game/package.json index 0cdb0b2..706bf96 100644 --- a/game/package.json +++ b/game/package.json @@ -14,5 +14,6 @@ "devDependencies": { "prettier": "^3.4.1", "vite": "^5.4.11" - } + }, + "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1" } diff --git a/game/src/constants.js b/game/src/constants.js index 1c30a73..70e3c0c 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -1,7 +1,8 @@ // @ts-check -import dialogs from "./data/dialog.json"; +import dialogs from "./data/dialogs.json"; +export const EASY_RIVAL_SPEED = 0.3; export const goalBlocks = 2; export const maxtime = 500; export const maxMistakes = 2; @@ -9,7 +10,8 @@ export const lineHeight = 24; export const charSpacing = 10; export const startmoveline = 1; export const marginvisiblebox = 1; -export const jsonData = dialogs; +export const dialogsData = dialogs; + // modifiable data in game export const data = { /** @@ -18,4 +20,8 @@ export const data = { * @type {import("kaplay").GameObj[]} */ resizableObjects: [], + /** + * Current block + */ + currentBlock: 0, }; diff --git a/game/src/data/dialogs.json b/game/src/data/dialogs.json new file mode 100644 index 0000000..24f58fa --- /dev/null +++ b/game/src/data/dialogs.json @@ -0,0 +1,38 @@ +[ + { + "id": 1, + "title": "isUnique", + "language": "js", + "blocks": [ + "function isUnique(str) {\n", + "▯▯▯▯let charSet = new Set();\n", + "▯▯▯▯\n", + "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", + "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", + "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", + "▯▯▯▯▯▯▯▯}\n", + "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", + "▯▯▯▯}\n", + "▯▯▯▯return true;\n", + "}\n" + ] + }, + { + "id": 2, + "title": "isUnique", + "language": "ts", + "blocks": [ + "function isUnique(str: string): boolean {\n", + "▯▯▯▯let charSet = new Set();\n", + "▯▯▯▯\n", + "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", + "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", + "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", + "▯▯▯▯▯▯▯▯}\n", + "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", + "▯▯▯▯}\n", + "▯▯▯▯return true;\n", + "}\n" + ] + } +] diff --git a/game/src/data/themes.js b/game/src/data/themes.js index 278b026..dbc8d72 100644 --- a/game/src/data/themes.js +++ b/game/src/data/themes.js @@ -3,6 +3,7 @@ export const themes = [ { name: "default", + language: "js", tokens: { functions: "#569CD6", classes: "#3DC9B0", @@ -30,4 +31,33 @@ export const themes = [ /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await)\b/g, }, }, + { + name: "default-ts", + language: "ts", + tokens: { + functions: "#569CD6", + classes: "#3DC9B0", + brackets: "#FFD700", + keywords: "#569CD6", + comments: "#00FF00", + strings: "#FF00FF", + numbers: "#FFFF00", + variables: "#00FFFF", + types: "#FFA500", + operators: "#A52A2A", + punctuation: "#808080", + attributes: "#FFC0CB", + tags: "#800080", + text: "#000000", + background: "#FFFFFF", + }, + associations: { + functions: /function\s*|=>\s*/g, + classes: /\b[A-Z]\w*\b/g, + brackets: /[\(\)\[\]\{\}]/g, + keywords: + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await)\b/g, + types: /\b(?:string|number|boolean|void|any|never|unknown)\b/g, + }, + }, ]; diff --git a/game/src/main.js b/game/src/main.js index 0f66588..96add0c 100644 --- a/game/src/main.js +++ b/game/src/main.js @@ -4,5 +4,8 @@ import { k } from "./kaplay.js"; // init game lib import "./assets.js"; // load assets import "./scenes/game.js"; // load game scene import "./scenes/endGame.js"; // load endGame scene +import { EASY_RIVAL_SPEED } from "./constants.js"; -k.go("game"); +k.go("game", { + rivalSpeed: EASY_RIVAL_SPEED, +}); diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index 1b09b73..aee33fd 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -1,57 +1,55 @@ // @ts-check - +import "../types.js"; import { data, - jsonData, + dialogsData, lineHeight, - marginvisiblebox, maxtime, + EASY_RIVAL_SPEED, } from "../constants.js"; import { k } from "../kaplay.js"; import { themes } from "../data/themes.js"; import { resizablePos } from "../components/resizablePos.js"; import { resizableRect } from "../components/resizableRect.js"; + let COLOR_TEXT_DEFAULT = k.Color.fromHex("#553d4d"); let COLOR_TEXT_RIVAL = k.Color.fromHex("#718703"); -let COLOR_TEXT_CORRECT = k.Color.WHITE; let COLOR_TEXT_INCORRECT = k.Color.RED; + let completedBlocks = 0; export let totalCorrectChars = 0; -let totalIncorrectChars = 0; -let totalCorrectLines = 0; let timeLeft = maxtime; -let currentMistakes = 0; let fontSize = 24; let fontWidth = 12; let errorCharsIndexes = []; let errorCharsReplaces = {}; -// this is the text taken from the json file + +/** + * Text taken from the dialogs.json file + */ let originalText = ""; -// this is the rendered text +/** + * The rendered and escaped text + */ let renderedText = ""; -// this is the text without any special character (for compare with user input) +/** + * Text for comparison with user input + */ let fixedText = ""; -// allocating all resizable objects in one -const theme = themes[0]; -const themeTokens = theme.tokens; -const themeAssociations = theme.associations; - -k.scene("game", () => { +/** + * @param {GameParams} params + */ +const gameScene = (params) => { const BG_SPEED_X = 0.1; const BG_SPEED_Y = 0.3; + let theme = themes[0]; + let offsetX = 0; + let offsetY = 0; let currentBlockIndex = 0; + let rivalSpeed = params.rivalSpeed ?? EASY_RIVAL_SPEED; // #region PLAYER & RIVAL VARIABLES - /** - * @typedef {Object} PlayerState - * @property {number} cursorPos - * @property {string} line - * @property {number} curLineCount - * @property {number} curCharInLine - * @property {number} curIdentSize - * @property {import("kaplay").GameObj | null} cursorPointer - */ /** * @type {PlayerState} @@ -79,14 +77,15 @@ k.scene("game", () => { // #endregion - let offsetX = 0; - let offsetY = 0; animateBackground(); /** * @param {number} i */ const matchColorToken = (i, ch) => { + const themeTokens = theme.tokens; + const themeAssociations = theme.associations; + if (ch === " ") return COLOR_TEXT_DEFAULT; if (playerState.cursorPos - 1 < i) { if (rivalState.cursorPos + 1 > i) { @@ -131,13 +130,38 @@ k.scene("game", () => { requestAnimationFrame(animateBackground); } - // fondo - const textboxSize = () => k.vec2(k.width() * 0.7, k.height()); + // background + // Files & Folders + const filesFoldersSize = () => { + if (k.width() > 1080) { + return k.vec2(323, k.height()); + } else { + return k.vec2(k.width() * 0.3, k.height()); + } + }; + const filesFoldersPos = () => k.vec2(0, 0); + + k.add([ + resizableRect(filesFoldersSize), + resizablePos(filesFoldersPos), + k.anchor("topleft"), + k.color(k.RED), + k.opacity(0.5), + ]); + + const textboxSize = () => k.vec2(k.width(), k.height()); + const textboxPos = () => { + if (k.width() > 1080) { + return k.vec2(323, 0); + } + + return k.vec2(k.width() * 0.3, 0); + }; const textPadding = k.vec2(12, 12); const textbox = k.add([ resizableRect(textboxSize), - resizablePos(() => k.vec2(0 + textboxSize().x / 2, 0)), + resizablePos(textboxPos), k.anchor("topleft"), k.color(23, 9, 39), k.opacity(0.5), @@ -145,7 +169,7 @@ k.scene("game", () => { const textboxBackParent = k.add([ resizableRect(textboxSize), - resizablePos(() => k.vec2(0 + textboxSize().x / 2, 0)), + resizablePos(textboxPos), k.anchor("topleft"), k.color(), k.rotate(0), @@ -206,22 +230,15 @@ k.scene("game", () => { playerState.cursorPointer = cursorPointer; rivalState.cursorPointer = rivalPointer; - function selectCurrentBlock() { - if (jsonData.blocks && jsonData.blocks[currentBlockIndex]) { - return jsonData.blocks[currentBlockIndex]; + function getCurrentDialog() { + if (dialogsData && dialogsData[currentBlockIndex]) { + return dialogsData[currentBlockIndex]; } else { - console.error("jsonData.blocks is undefined or out of range"); - return []; + console.error("dialogs.json is undefined or out of range"); + return dialogsData[0]; } } - function getCurrentGroup() { - const currentBlock = selectCurrentBlock(); - const visibleLines = Math.floor(textbox.height / lineHeight); - - return currentBlock.slice(0, visibleLines); - } - /** * @param {string} group */ @@ -241,26 +258,31 @@ k.scene("game", () => { }; function updateDialog() { + const currentDialog = getCurrentDialog(); completedBlocks++; playerState.cursorPos = 0; - currentMistakes = 0; timeLeft = maxtime; + // theme + const themesByLanguage = themes.filter( + (t) => t.language === currentDialog.language, + ); + theme = themesByLanguage[0] || themes[0]; + // the sentences - const currentGroup = getCurrentGroup(); + const currentBlocks = currentDialog.blocks; // we replace [] characters with \[ and \] to avoid them being interpreted as tags // also ▯ is replaced with a space + originalText = currentBlocks.join(""); - originalText = currentGroup.join(""); - - const fixedGroup = currentGroup + const fixedGroup = currentBlocks .join("") .replace(/\[/g, "\\[") .replace(/\]/g, "\\]") .replace(/▯/g, " "); - fixedText = currentGroup.join("").replace(/▯/g, " "); + fixedText = currentBlocks.join("").replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; playerState.line = fixedText.split("\n")[0]; @@ -300,7 +322,7 @@ k.scene("game", () => { player.cursorPos--; player.curCharInLine--; - player.cursorPointer.pos = cursorPos(); + player.cursorPointer.pos = cursorPos(rival); logGroupWithColor(fixedText); } @@ -323,16 +345,9 @@ k.scene("game", () => { } function rivalWrite() { - const isFinalLine = - rivalState.curLineCount === fixedText.split("\n").length - 1; - const isFinalLineChar = - rivalState.curCharInLine === rivalState.line.length; - - if (isFinalLineChar) { - if (isFinalLine) { - return k.go("endgame"); - } + const curChar = fixedText[rivalState.cursorPos]; + if (curChar === "\n") { nextLine(true); } else { nextChar(true); @@ -348,7 +363,7 @@ k.scene("game", () => { } }); - k.loop(0.2, () => { + k.loop(rivalSpeed, () => { rivalWrite(); }); } @@ -429,4 +444,6 @@ k.scene("game", () => { startTimer(); updateDialog(); -}); +}; + +k.scene("game", gameScene); diff --git a/game/src/types.js b/game/src/types.js new file mode 100644 index 0000000..3cde2af --- /dev/null +++ b/game/src/types.js @@ -0,0 +1,14 @@ +/** + * @typedef {Object} GameParams + * @property {number} rivalSpeed + */ + +/** + * @typedef {Object} PlayerState + * @property {number} cursorPos + * @property {string} line + * @property {number} curLineCount + * @property {number} curCharInLine + * @property {number} curIdentSize + * @property {import("kaplay").GameObj | null} cursorPointer + */ From a9ee508559e71ba1aaf03e52177f80587b725316 Mon Sep 17 00:00:00 2001 From: lajbel Date: Fri, 13 Dec 2024 21:19:13 -0300 Subject: [PATCH 06/22] chore: some stuff --- game/src/constants.js | 2 +- game/src/data/dialogs.json | 14 +++++++++++++- game/src/scenes/game.js | 31 +++++++++++++++++++------------ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/game/src/constants.js b/game/src/constants.js index 70e3c0c..fc295dd 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -2,7 +2,7 @@ import dialogs from "./data/dialogs.json"; -export const EASY_RIVAL_SPEED = 0.3; +export const EASY_RIVAL_SPEED = 1; export const goalBlocks = 2; export const maxtime = 500; export const maxMistakes = 2; diff --git a/game/src/data/dialogs.json b/game/src/data/dialogs.json index 24f58fa..e690155 100644 --- a/game/src/data/dialogs.json +++ b/game/src/data/dialogs.json @@ -1,6 +1,18 @@ [ { "id": 1, + "title": "test", + "language": "js", + "blocks": [ + "class Test {\n", + " constructor() {\n", + " this.name = \"test\";\n", + " }\n", + "}\n" + ] + }, + { + "id": 2, "title": "isUnique", "language": "js", "blocks": [ @@ -18,7 +30,7 @@ ] }, { - "id": 2, + "id": 3, "title": "isUnique", "language": "ts", "blocks": [ diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index aee33fd..a05d573 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -94,6 +94,8 @@ const gameScene = (params) => { return COLOR_TEXT_DEFAULT; } + let charColor = COLOR_TEXT_DEFAULT; + const words = originalText.split(" "); let wordCharsIndex = 0; const word = @@ -104,22 +106,27 @@ const gameScene = (params) => { }) || ""; if (errorCharsIndexes.includes(i)) { - return COLOR_TEXT_INCORRECT; + charColor = COLOR_TEXT_INCORRECT; + } else if (ch.match(themeAssociations.brackets)) { + charColor = k.Color.fromHex(themeTokens.brackets); + } else if (word.match(themeAssociations.classes)) { + charColor = k.Color.fromHex(themeTokens.classes); + } else if (word.match(themeAssociations.functions)) { + charColor = k.Color.fromHex(themeTokens.functions); + } else if (word.match(themeAssociations.keywords)) { + charColor = k.Color.fromHex(themeTokens.keywords); + } else if (word.match(themeAssociations.strings)) { + charColor = k.Color.fromHex(themeTokens.strings); } - if (ch.match(themeAssociations.brackets)) { - return k.Color.fromHex(themeTokens.brackets); + if ( + rivalState.cursorPos < playerState.cursorPos && + rivalState.cursorPos > i + ) { + return charColor.darken(80); } - if (word.match(themeAssociations.classes)) { - return k.CYAN; - } else if (word.match(themeAssociations.functions)) { - return k.Color.fromHex(themeTokens.functions); - } else if (word.match(themeAssociations.keywords)) { - return k.Color.fromHex(themeTokens.keywords); - } else { - return new k.Color(255, 255, 255); - } + return charColor; }; function animateBackground() { From 62244f25fa05967b2804f52d490128c7c77e6eb6 Mon Sep 17 00:00:00 2001 From: lajbel Date: Wed, 18 Dec 2024 16:41:42 -0300 Subject: [PATCH 07/22] Fix bugs in text writing and line jump --- game/src/components/resizablePos.js | 11 +-- game/src/components/resizableRect.js | 4 +- game/src/constants.js | 8 +- game/src/data/colorTags.json | 33 ------- game/src/data/dialogs.json | 36 ++++---- game/src/data/themes.js | 73 ++++++--------- game/src/scenes/game.js | 129 ++++++++++++++++++--------- game/src/types.js | 2 + 8 files changed, 143 insertions(+), 153 deletions(-) delete mode 100644 game/src/data/colorTags.json diff --git a/game/src/components/resizablePos.js b/game/src/components/resizablePos.js index f6a6135..5f73c09 100644 --- a/game/src/components/resizablePos.js +++ b/game/src/components/resizablePos.js @@ -4,8 +4,7 @@ * @typedef {import("kaplay").PosComp} PosComp */ -import { data } from "../constants.js"; - +import { gameState } from "../constants.js"; /** * Set the position on resize @@ -16,7 +15,7 @@ export const resizablePos = (sizeFunc) => ({ id: "resizablePos", sizeFunc, add() { - data.resizableObjects.push(this); + gameState.resizableObjects.push(this); this.pos = this.sizeFunc(); }, /** @@ -26,6 +25,8 @@ export const resizablePos = (sizeFunc) => ({ this.pos = this.sizeFunc(); }, destroy() { - data.resizableObjects = data.resizableObjects.filter((obj) => obj !== this); - } + gameState.resizableObjects = gameState.resizableObjects.filter( + (obj) => obj !== this, + ); + }, }); diff --git a/game/src/components/resizableRect.js b/game/src/components/resizableRect.js index f583878..da7631d 100644 --- a/game/src/components/resizableRect.js +++ b/game/src/components/resizableRect.js @@ -4,7 +4,7 @@ * @typedef {import("kaplay").RectComp} RectComp */ -import { data } from "../constants.js"; +import { gameState } from "../constants.js"; import { k } from "../kaplay.js"; /** @@ -22,7 +22,7 @@ export const resizableRect = (resizeFunc) => ({ this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); }, destroy() { - data.resizableObjects = data.resizableObjects.filter( + gameState.resizableObjects = gameState.resizableObjects.filter( (obj) => obj !== this, ); }, diff --git a/game/src/constants.js b/game/src/constants.js index fc295dd..923a686 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -3,8 +3,8 @@ import dialogs from "./data/dialogs.json"; export const EASY_RIVAL_SPEED = 1; +export const MAX_TIME = 60; export const goalBlocks = 2; -export const maxtime = 500; export const maxMistakes = 2; export const lineHeight = 24; export const charSpacing = 10; @@ -13,7 +13,7 @@ export const marginvisiblebox = 1; export const dialogsData = dialogs; // modifiable data in game -export const data = { +export const gameState = { /** * Allocated resizable objects for update on resize * @@ -21,7 +21,7 @@ export const data = { */ resizableObjects: [], /** - * Current block + * Time left */ - currentBlock: 0, + timeLeft: 0, }; diff --git a/game/src/data/colorTags.json b/game/src/data/colorTags.json deleted file mode 100644 index af7c754..0000000 --- a/game/src/data/colorTags.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "0": { - "/C1": [ - 0, 7, 25, 27, 39, 42, 51, 54, 56, 59, 71, 83, 90, 92, 117, 123, 156, 162 - ], - "/C2": [9, 16, 43, 45, 102, 104, 141, 141, 143], - "/C3": [ - 17, 24, 28, 36, 46, 50, 55, 55, 60, 61, 65, 68, 86, 89, 93, 101, 105, 116, - 129, 140, 144, 155, 167, 170 - ], - "/C4": [37, 38, 62, 63, 69, 70, 84, 85], - "/C5": [64, 64, 124, 128, 163, 166] - }, - "1": { - "/C1": [ - 0, 8, 32, 37, 58, 61, 63, 66, 116, 119, 135, 138, 162, 165, 167, 170, 199, - 201, 223, 225, 436, 441 - ], - "/C2": [9, 20, 91, 95], - "/C3": [ - 21, 31, 38, 39, 42, 57, 62, 67, 72, 74, 76, 83, 86, 90, 96, 100, 102, 109, - 112, 115, 120, 125, 128, 134, 139, 143, 146, 154, 161, 166, 171, 172, 175, - 183, 186, 192, 195, 196, 202, 209, 211, 216, 221, 227, 229, 233, 268, 271, - 281, 285, 311, 315, 328, 331, 348, 352, 377, 381, 387, 391, 422, 426, 433, - 443, 452 - ], - "/C4": [ - 40, 41, 73, 84, 110, 111, 126, 144, 145, 148, 149, 152, 173, 174, 184, - 185, 193, 194, 210, 214, 231, 269, 283, 313, 330, 350, 379, 389, 424 - ], - "/C5": [75, 101, 150, 151] - } -} diff --git a/game/src/data/dialogs.json b/game/src/data/dialogs.json index e690155..ea3b3ff 100644 --- a/game/src/data/dialogs.json +++ b/game/src/data/dialogs.json @@ -17,15 +17,15 @@ "language": "js", "blocks": [ "function isUnique(str) {\n", - "▯▯▯▯let charSet = new Set();\n", - "▯▯▯▯\n", - "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", - "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", - "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", - "▯▯▯▯▯▯▯▯}\n", - "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", - "▯▯▯▯}\n", - "▯▯▯▯return true;\n", + " let charSet = new Set();\n", + " \n", + " for (let i = 0; i < str.length; i++) {\n", + " if (charSet.has(str[i])) {\n", + " return false;\n", + " }\n", + " charSet.add(str[i]);\n", + " }\n", + " return true;\n", "}\n" ] }, @@ -35,15 +35,15 @@ "language": "ts", "blocks": [ "function isUnique(str: string): boolean {\n", - "▯▯▯▯let charSet = new Set();\n", - "▯▯▯▯\n", - "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", - "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", - "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", - "▯▯▯▯▯▯▯▯}\n", - "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", - "▯▯▯▯}\n", - "▯▯▯▯return true;\n", + " let charSet = new Set();\n", + " \n", + " for (let i = 0; i < str.length; i++) {\n", + " if (charSet.has(str[i])) {\n", + " return false;\n", + " }\n", + " charSet.add(str[i]);\n", + " }\n", + " return true;\n", "}\n" ] } diff --git a/game/src/data/themes.js b/game/src/data/themes.js index dbc8d72..70468f7 100644 --- a/game/src/data/themes.js +++ b/game/src/data/themes.js @@ -3,61 +3,38 @@ export const themes = [ { name: "default", - language: "js", tokens: { - functions: "#569CD6", - classes: "#3DC9B0", - brackets: "#FFD700", - keywords: "#569CD6", - comments: "#00FF00", - strings: "#FF00FF", - numbers: "#FFFF00", - variables: "#00FFFF", - types: "#FFA500", - operators: "#A52A2A", - punctuation: "#808080", - attributes: "#FFC0CB", - tags: "#800080", - text: "#000000", - background: "#FFFFFF", + functions: "#61AFEF", + classes: "#E5C07B", + brackets: "#ABB2BF", + keywords: "#C678DD", + comments: "#5C6370", + strings: "#98C379", + numbers: "#D19A66", + variables: "#E06C75", + types: "#E5C07B", + operators: "#56B6C2", + punctuation: "#ABB2BF", + attributes: "#D19A66", + tags: "#E06C75", + text: "#ABB2BF", + background: "#282C34", + constants: "#D19A66", + decorators: "#C678DD", + regex: "#98C379", + foreground: "#ABB2BF", }, associations: { - // functions: /(?:function\s+(\w+)|(\w+)\s*=\s*\(.*\)\s*=>)/g, functions: /function\s*|=>\s*/g, - // for words starting with a capital letter classes: /\b[A-Z]\w*\b/g, brackets: /[\(\)\[\]\{\}]/g, keywords: - /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await)\b/g, - }, - }, - { - name: "default-ts", - language: "ts", - tokens: { - functions: "#569CD6", - classes: "#3DC9B0", - brackets: "#FFD700", - keywords: "#569CD6", - comments: "#00FF00", - strings: "#FF00FF", - numbers: "#FFFF00", - variables: "#00FFFF", - types: "#FFA500", - operators: "#A52A2A", - punctuation: "#808080", - attributes: "#FFC0CB", - tags: "#800080", - text: "#000000", - background: "#FFFFFF", - }, - associations: { - functions: /function\s*|=>\s*/g, - classes: /\b[A-Z]\w*\b/g, - brackets: /[\(\)\[\]\{\}]/g, - keywords: - /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await)\b/g, - types: /\b(?:string|number|boolean|void|any|never|unknown)\b/g, + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor)\b/g, + constants: /\b[A-Z_][A-Z0-9_]*\b/g, + decorators: /@\w+/g, + regex: /\/(\\\/|[^\/\n])+\/[gimsuy]*/g, + strings: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g, + punctuation: /[\.,;:]/g, }, }, ]; diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index a05d573..b9c0506 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -1,10 +1,10 @@ // @ts-check import "../types.js"; import { - data, + gameState, dialogsData, lineHeight, - maxtime, + MAX_TIME, EASY_RIVAL_SPEED, } from "../constants.js"; import { k } from "../kaplay.js"; @@ -18,7 +18,6 @@ let COLOR_TEXT_INCORRECT = k.Color.RED; let completedBlocks = 0; export let totalCorrectChars = 0; -let timeLeft = maxtime; let fontSize = 24; let fontWidth = 12; let errorCharsIndexes = []; @@ -46,8 +45,12 @@ const gameScene = (params) => { let theme = themes[0]; let offsetX = 0; let offsetY = 0; - let currentBlockIndex = 0; + let currentBlockIndex = -1; let rivalSpeed = params.rivalSpeed ?? EASY_RIVAL_SPEED; + let curBlockData = { + lineCount: 0, + }; + let defaultTime = params.time ?? MAX_TIME; // #region PLAYER & RIVAL VARIABLES @@ -61,6 +64,16 @@ const gameScene = (params) => { curCharInLine: 0, curIdentSize: 0, cursorPointer: null, + reset: () => { + playerState.cursorPos = 0; + playerState.line = ""; + playerState.curLineCount = 0; + playerState.curCharInLine = 0; + playerState.curIdentSize = 0; + if (playerState.cursorPointer) { + playerState.cursorPointer.pos = cursorPos(); + } + }, }; /** @@ -73,6 +86,16 @@ const gameScene = (params) => { curCharInLine: 0, curIdentSize: 0, cursorPointer: null, + reset: () => { + rivalState.cursorPos = 0; + rivalState.line = ""; + rivalState.curLineCount = 0; + rivalState.curCharInLine = 0; + rivalState.curIdentSize = 0; + if (rivalState.cursorPointer) { + rivalState.cursorPointer.pos = cursorPos(true); + } + }, }; // #endregion @@ -109,6 +132,8 @@ const gameScene = (params) => { charColor = COLOR_TEXT_INCORRECT; } else if (ch.match(themeAssociations.brackets)) { charColor = k.Color.fromHex(themeTokens.brackets); + } else if (ch.match(themeAssociations.punctuation)) { + charColor = k.Color.fromHex(themeTokens.punctuation); } else if (word.match(themeAssociations.classes)) { charColor = k.Color.fromHex(themeTokens.classes); } else if (word.match(themeAssociations.functions)) { @@ -117,6 +142,8 @@ const gameScene = (params) => { charColor = k.Color.fromHex(themeTokens.keywords); } else if (word.match(themeAssociations.strings)) { charColor = k.Color.fromHex(themeTokens.strings); + } else { + charColor = k.Color.fromHex(themeTokens.text); } if ( @@ -196,7 +223,7 @@ const gameScene = (params) => { ]); const timerLabel = k.add([ - k.text(String(timeLeft), { + k.text(String(gameState.timeLeft), { size: 48, font: "monogram", }), @@ -265,19 +292,20 @@ const gameScene = (params) => { }; function updateDialog() { - const currentDialog = getCurrentDialog(); + currentBlockIndex++; completedBlocks++; - playerState.cursorPos = 0; - timeLeft = maxtime; + playerState.reset(); + rivalState.reset(); + + gameState.timeLeft = MAX_TIME; + const currentDialog = getCurrentDialog(); // theme - const themesByLanguage = themes.filter( - (t) => t.language === currentDialog.language, - ); - theme = themesByLanguage[0] || themes[0]; + theme = themes[0]; // the sentences const currentBlocks = currentDialog.blocks; + curBlockData.lineCount = currentBlocks.length; // we replace [] characters with \[ and \] to avoid them being interpreted as tags // also ▯ is replaced with a space @@ -301,6 +329,7 @@ const gameScene = (params) => { .split("") .map((char, index) => { if (errorCharsIndexes.includes(index)) { + if (char === "\n") return `${errorCharsReplaces[index]}\n`; return errorCharsReplaces[index]; } else { return char; @@ -333,6 +362,10 @@ const gameScene = (params) => { logGroupWithColor(fixedText); } + function preventError() { + k.shake(5); + } + function nextLine(rival = false) { const player = rival ? rivalState : playerState; if (!player.cursorPointer) return; @@ -355,6 +388,7 @@ const gameScene = (params) => { const curChar = fixedText[rivalState.cursorPos]; if (curChar === "\n") { + nextChar(true); nextLine(true); } else { nextChar(true); @@ -363,9 +397,9 @@ const gameScene = (params) => { function startTimer() { k.loop(1, () => { - timeLeft--; - timerLabel.text = String(timeLeft); - if (timeLeft <= 0) { + gameState.timeLeft--; + timerLabel.text = String(gameState.timeLeft); + if (gameState.timeLeft <= 0) { k.go("endgame"); } }); @@ -375,52 +409,61 @@ const gameScene = (params) => { }); } - k.onKeyPress((key) => { - // only letters on this hanadler - let isCorrect = false; - let isNextLine = false; + k.onKeyPress((keyPressed) => { const correctChar = fixedText[playerState.cursorPos]; + const shifting = k.isKeyDown("shift"); + let key = keyPressed; + let errorKey = key; + let isCorrect = false; - if (errorCharsIndexes.length > 1) { - return k.shake(5); + if (key == "enter" || key == "backspace") { + return; } - if (correctChar === "\n" && errorCharsIndexes.length > 0) { - return k.shake(5); + if (errorCharsIndexes.length > 1) { + return preventError(); } + // Setting key if (key.length == 1) { - if (k.isKeyDown("shift")) { - key = key.toUpperCase(); - isCorrect = key === correctChar; - } else { - isCorrect = key === correctChar; - } - } else if (key === "space") { - isCorrect = " " === correctChar; - } else if (key === "enter") { - isCorrect = correctChar === "\n"; - if (isCorrect) isNextLine = true; - } else if (key.length > 1) { + key = shifting ? key.toUpperCase() : key; + } else if (key == "space") { + key = " "; + errorKey = "_"; + } else { return; } - if (isCorrect && isNextLine) { - totalCorrectChars++; - nextChar(); - nextLine(); - } else if (isCorrect) { + isCorrect = key === correctChar; + + if (isCorrect) { totalCorrectChars++; nextChar(); } else { errorCharsIndexes.push(playerState.cursorPos); - errorCharsReplaces[playerState.cursorPos] = - key === "space" ? "_" : key; + errorCharsReplaces[playerState.cursorPos] = errorKey; updateDialogErrors(); nextChar(); } }); + // Line jump + k.onKeyPress("enter", () => { + const correctChar = fixedText[playerState.cursorPos]; + const isCorrect = "\n" === correctChar; + + if (errorCharsIndexes.length > 0 || !isCorrect) { + return preventError(); + } + + if (playerState.curLineCount >= curBlockData.lineCount - 1) { + return updateDialog(); + } + + nextChar(); + nextLine(); + }); + k.onKeyPressRepeat("backspace", () => { if (playerState.cursorPos <= 0) return; // prevent negative index @@ -443,7 +486,7 @@ const gameScene = (params) => { }); k.onResize(() => { - for (const obj of data.resizableObjects) { + for (const obj of gameState.resizableObjects) { if (obj.is("resizablePos")) obj.updatePos(); if (obj.is("resizableRect")) obj.updateRectSize(); } diff --git a/game/src/types.js b/game/src/types.js index 3cde2af..b1ff784 100644 --- a/game/src/types.js +++ b/game/src/types.js @@ -1,6 +1,7 @@ /** * @typedef {Object} GameParams * @property {number} rivalSpeed + * @property {number} time */ /** @@ -11,4 +12,5 @@ * @property {number} curCharInLine * @property {number} curIdentSize * @property {import("kaplay").GameObj | null} cursorPointer + * @property {Function} reset */ From 84d091ce18eb13a3bf895a1adccd3d89a086c917 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Tue, 29 Apr 2025 11:07:14 -0300 Subject: [PATCH 08/22] Content update for release - New assets added - Mechanics updated and various fixes - About scene added and new command interface - Scene refactoring and save changes - Font changed -Update kaplay 4.0 --- game/package-lock.json | 13 +- game/package.json | 2 +- game/public/fonts/jetbrains.ttf | Bin 0 -> 277828 bytes game/public/fonts/thaleahFat.ttf | Bin 0 -> 10080 bytes game/public/sounds/code_sound.mp3 | Bin 0 -> 1401 bytes game/public/sounds/endgame.mp3 | Bin 0 -> 631643 bytes game/public/sounds/videogame.mp3 | Bin 0 -> 276639 bytes game/public/sounds/wrong typing.mp3 | Bin 0 -> 2252 bytes game/public/sprites/BG_AWPM_IN_GAME.png | Bin 0 -> 246 bytes game/public/sprites/BG_TIME_IN_GAME.png | Bin 0 -> 365 bytes game/public/sprites/BG_WPM_IN_GAME.png | Bin 0 -> 383 bytes game/public/sprites/SilverDev_logo.png | Bin 0 -> 1161 bytes game/public/sprites/WPM.png | Bin 0 -> 3041 bytes game/public/sprites/arrow_yellow.png | Bin 0 -> 217 bytes game/public/sprites/bg.png | Bin 0 -> 2731 bytes game/public/sprites/bg2.png | Bin 8191 -> 16970 bytes game/public/sprites/bg4.png | Bin 0 -> 2716 bytes game/public/sprites/icon_01.png | Bin 0 -> 227 bytes game/public/sprites/icon_02.png | Bin 0 -> 252 bytes game/public/sprites/icon_03.png | Bin 0 -> 221 bytes game/public/sprites/icon_04.png | Bin 0 -> 281 bytes game/public/sprites/icon_05.png | Bin 0 -> 251 bytes game/public/sprites/muteOFF.png | Bin 0 -> 640 bytes game/public/sprites/muteON.png | Bin 0 -> 406 bytes game/public/style.css | 64 +- game/src/assets.js | 20 +- game/src/components/resizablePos.js | 2 +- game/src/components/resizableRect.js | 4 +- game/src/constants.js | 26 +- game/src/data/changeStyle.js | 37 ++ game/src/data/dialogs.json | 360 +++++++++++- game/src/data/themes.js | 80 ++- game/src/kaplay.js | 21 +- game/src/main.js | 8 +- game/src/scenes/about.js | 104 ++++ game/src/scenes/endGame.js | 149 ++++- game/src/scenes/game.js | 644 ++++++++++++++++----- game/src/scenes/selectionScene.js | 379 ++++++++++++ game/src/systems/preferences.js | 16 + game/src/systems/saves.js | 55 ++ game/src/types.js | 1 + package-lock.json | 6 + website/public/favicon.ico | Bin 25931 -> 4286 bytes website/public/fonts/jetbrains.ttf | Bin 0 -> 277828 bytes website/public/game/game.js | 347 ++++++++--- website/public/sounds/code_sound.mp3 | Bin 0 -> 1401 bytes website/public/sounds/endgame.mp3 | Bin 0 -> 631643 bytes website/public/sounds/videogame.mp3 | Bin 0 -> 276639 bytes website/public/sounds/wrong typing.mp3 | Bin 0 -> 2252 bytes website/public/sprites/BG_AWPM_IN_GAME.png | Bin 0 -> 192 bytes website/public/sprites/BG_TIME_IN_GAME.png | Bin 0 -> 224 bytes website/public/sprites/BG_WPM_IN_GAM.png | Bin 0 -> 247 bytes website/public/sprites/BG_WPM_IN_GAME.png | Bin 0 -> 383 bytes website/public/sprites/SilverDev_logo.png | Bin 0 -> 755 bytes website/public/sprites/WPM.png | Bin 0 -> 1553 bytes website/public/sprites/arrow_yellow.png | Bin 0 -> 188 bytes website/public/sprites/bg.png | Bin 0 -> 121 bytes website/public/sprites/bg2.png | Bin 0 -> 1879 bytes website/public/sprites/bg4.png | Bin 0 -> 112 bytes website/public/sprites/icon_01.png | Bin 0 -> 213 bytes website/public/sprites/icon_02.png | Bin 0 -> 221 bytes website/public/sprites/icon_03.png | Bin 0 -> 200 bytes website/public/sprites/icon_04.png | Bin 0 -> 224 bytes website/public/sprites/icon_05.png | Bin 0 -> 207 bytes website/public/sprites/muteOFF.png | Bin 0 -> 396 bytes website/public/sprites/muteON.png | Bin 0 -> 255 bytes website/public/style.css | 0 website/src/styles/game.css | 0 68 files changed, 1998 insertions(+), 340 deletions(-) create mode 100644 game/public/fonts/jetbrains.ttf create mode 100644 game/public/fonts/thaleahFat.ttf create mode 100644 game/public/sounds/code_sound.mp3 create mode 100644 game/public/sounds/endgame.mp3 create mode 100644 game/public/sounds/videogame.mp3 create mode 100644 game/public/sounds/wrong typing.mp3 create mode 100644 game/public/sprites/BG_AWPM_IN_GAME.png create mode 100644 game/public/sprites/BG_TIME_IN_GAME.png create mode 100644 game/public/sprites/BG_WPM_IN_GAME.png create mode 100644 game/public/sprites/SilverDev_logo.png create mode 100644 game/public/sprites/WPM.png create mode 100644 game/public/sprites/arrow_yellow.png create mode 100644 game/public/sprites/bg.png create mode 100644 game/public/sprites/bg4.png create mode 100644 game/public/sprites/icon_01.png create mode 100644 game/public/sprites/icon_02.png create mode 100644 game/public/sprites/icon_03.png create mode 100644 game/public/sprites/icon_04.png create mode 100644 game/public/sprites/icon_05.png create mode 100644 game/public/sprites/muteOFF.png create mode 100644 game/public/sprites/muteON.png create mode 100644 game/src/data/changeStyle.js create mode 100644 game/src/scenes/about.js create mode 100644 game/src/scenes/selectionScene.js create mode 100644 game/src/systems/preferences.js create mode 100644 game/src/systems/saves.js create mode 100644 package-lock.json create mode 100644 website/public/fonts/jetbrains.ttf create mode 100644 website/public/sounds/code_sound.mp3 create mode 100644 website/public/sounds/endgame.mp3 create mode 100644 website/public/sounds/videogame.mp3 create mode 100644 website/public/sounds/wrong typing.mp3 create mode 100644 website/public/sprites/BG_AWPM_IN_GAME.png create mode 100644 website/public/sprites/BG_TIME_IN_GAME.png create mode 100644 website/public/sprites/BG_WPM_IN_GAM.png create mode 100644 website/public/sprites/BG_WPM_IN_GAME.png create mode 100644 website/public/sprites/SilverDev_logo.png create mode 100644 website/public/sprites/WPM.png create mode 100644 website/public/sprites/arrow_yellow.png create mode 100644 website/public/sprites/bg.png create mode 100644 website/public/sprites/bg2.png create mode 100644 website/public/sprites/bg4.png create mode 100644 website/public/sprites/icon_01.png create mode 100644 website/public/sprites/icon_02.png create mode 100644 website/public/sprites/icon_03.png create mode 100644 website/public/sprites/icon_04.png create mode 100644 website/public/sprites/icon_05.png create mode 100644 website/public/sprites/muteOFF.png create mode 100644 website/public/sprites/muteON.png create mode 100644 website/public/style.css create mode 100644 website/src/styles/game.css diff --git a/game/package-lock.json b/game/package-lock.json index 86ac54c..b55bcc1 100644 --- a/game/package-lock.json +++ b/game/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "mygame", "dependencies": { - "kaplay": "^3001.0.2" + "kaplay": "^4000.0.0-alpha.17" }, "devDependencies": { "prettier": "^3.4.1", @@ -718,10 +718,13 @@ } }, "node_modules/kaplay": { - "version": "3001.0.2", - "resolved": "https://registry.npmjs.org/kaplay/-/kaplay-3001.0.2.tgz", - "integrity": "sha512-4gyknxI8mSKOywjs7QmWTYjW/tAFJwYRzjWFXnJccHi6okRh1YxNKc5B2oR5CSU5WY75QmdxlAM+u+bpXaIgRw==", - "license": "MIT" + "version": "4000.0.0-alpha.17", + "resolved": "https://registry.npmjs.org/kaplay/-/kaplay-4000.0.0-alpha.17.tgz", + "integrity": "sha512-x7BEaFkGP78ShkPVMQaQ68n1ql/W/AavC4kyr3d1YofqOWyw42YMa7okBDzSBgx8GabV7XK2brA68UfUMQSwNQ==", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/kaplay" + } }, "node_modules/nanoid": { "version": "3.3.7", diff --git a/game/package.json b/game/package.json index 706bf96..c716a03 100644 --- a/game/package.json +++ b/game/package.json @@ -9,7 +9,7 @@ "fmt": "prettier --write ." }, "dependencies": { - "kaplay": "^3001.0.2" + "kaplay": "^4000.0.0-alpha.17" }, "devDependencies": { "prettier": "^3.4.1", diff --git a/game/public/fonts/jetbrains.ttf b/game/public/fonts/jetbrains.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c93043de6454ad2d5575f0751150c6551d9c588 GIT binary patch literal 277828 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

^Q2@p_nJptvCyhdNtfUDv9XvP^J$Tq^Yf}I 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 s3n!(`lCJDArN|NmBd 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

Zh7cd=34FaGWy`SDvi)66*nbC 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 RXt+-ctVzYaTEQjd{{RH8A$|Y= literal 0 HcmV?d00001 diff --git a/game/public/fonts/thaleahFat.ttf b/game/public/fonts/thaleahFat.ttf new file mode 100644 index 0000000000000000000000000000000000000000..91fc7dc3916500aaa192c2fd9da4467af1e5870a GIT binary patch literal 10080 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 literal 0 HcmV?d00001 diff --git a/game/public/sounds/endgame.mp3 b/game/public/sounds/endgame.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..05c74d491a3e3dabaa8ff4a9d59807db090d1da8 GIT binary patch literal 631643 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%0Dm?~C$LrskglMqmMakNPweh%KSbmiD)T67IeQ(&; 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

*t0s)aPYY^Y*+yOvDNz3t6o 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

Lqdqx|#OiOhdskJC= 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 literal 0 HcmV?d00001 diff --git a/game/public/sounds/wrong typing.mp3 b/game/public/sounds/wrong typing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..aedc1fed5a8e7f8e51a61c95c1ec672bed2f4748 GIT binary patch literal 2252 zcma)-c~leE9>;GcA(@0B2?`n>L`VpWKr{#_B4T7K2~ZaC2-RxPh)5Om`Q*5?G8h!f zA}FBX8jwu^MJz}aA)q3tSY)f<1}M*9pEkTBpaq#X7u$2*AO6u#P9`&RC!h11@BPgk znYR-SK!jndR{4;>YyhYMk?~QB9T$)viDYK*^M;rV`@f?v@5*AM;>ZyW`85UrRRaNu z17r!r6B0-g0Z~HYAp1xTL9!sHASEQ#keiTJNEgX-$Oz;;gdl;HkR@*-OLkfS5B@?# z3;Dc@su}#YJ;bDu5->UffVfP+qW}>Ntm0ZaodN~)FA`Rf^OnVc5_l+VN{Hw0{$%!QYfjWJ}2%G=VD--&;fWqf= zT~eqKh7^@Fp@6EjSMUpP)S5ZygDt;JnCce!jkyWsS#`QSjt$#>psn6OGgRRU=%;aXhw1$)ro@g+R|ClUKk%cm zVhdXUEXjMN;eOxu4aNyw-6sW3NisIeIUu!P*6L$&XGQYt9<1WT*59HoDw~SR=UF6I z>aBB`lW{=ylQo4HXi{b1&~KQjdv35s6|jhly~>jUpCUwR8I4)twrn88xha4`eAseV zQ2KVAI>(#UZ_b!Fy@d^yW5)(u8Fbfi8G@s$6!U8=s)Y1 zREG-|ulK^&lUbTbc|PKy2PuJnk_<>P64H-7VEU+;@|1+H_#)3ruF zM+y6f+6%8Z*S1MmR_dy;LF8J@ zlIvEcy~(ALGi-$8ve%S2L(^H zlT&rP1wC)i6kdPuqr&g}4(RvI)a|4HN~J4UFdx*@pQ7c5V z%Ao)2OkFiIj2fiip#wZMe7-Q#Ff1RpwZ|hhhA7w>Ww5BfNPMTzY#D-7JZ{t2@Emeh zmEWm*-t)fkZLxgmSWuB0n;m^CNjp+V-!JGyt`w`!d+>yC2XfX6qa8ygN;a|AoW(^zC$&$K{5*-JL0V->qIw zy&&w^8~Xa7o6E3G<t_l0F8sJA-A75{jx@n$P6#L1Fl=@uu9UE8*4!nX9C z@$SxNedb);0{Z0~T^`y+Whz*h6eZUmSHzt!$0Q2vA`qz|^RFrL!YN$^d9|5E_hQ9+ zwO7xH_m`#}bvs->@oCeB#17vS3$J`~F*Ge{DS37vZS;m+Mn6Tu@_)H_>3!&zadhd7 zPL;iaWgtb#1%b@pT#j7q@qxAp) literal 0 HcmV?d00001 diff --git a/game/public/sprites/BG_AWPM_IN_GAME.png b/game/public/sprites/BG_AWPM_IN_GAME.png new file mode 100644 index 0000000000000000000000000000000000000000..364fddaeeb71e80d12a8e67ead8186c7e0930e8e GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3r!3HEB&RrV}q!^2X+?^QKos)S9eFOTF5W()exuCHl_t;b_RM)0Ec^50y!5Fvx>WC9ygc2wcgzopr00jwYhyVZp literal 0 HcmV?d00001 diff --git a/game/public/sprites/BG_TIME_IN_GAME.png b/game/public/sprites/BG_TIME_IN_GAME.png new file mode 100644 index 0000000000000000000000000000000000000000..86a05daeb949dfe8f6a8fd678ba153611341a4c2 GIT binary patch literal 365 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 KN1c24_x}OExOVyg literal 0 HcmV?d00001 diff --git a/game/public/sprites/arrow_yellow.png b/game/public/sprites/arrow_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..b9fae10b52254f6598101ab76fce5e821d5bb615 GIT binary patch literal 217 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 literal 8191 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 diff --git a/game/public/sprites/bg4.png b/game/public/sprites/bg4.png new file mode 100644 index 0000000000000000000000000000000000000000..13b8a373faff0c469b429722cc80d757c7a1565f GIT binary patch literal 2716 zcmV;N3S;$&P)uJ@VVD_U zC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1Q zpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X z6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv1)yUy0P^?0*fb9UASvow z`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q{wNRKos+;6rV8ldy0Owz z(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E` zvOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G41dM~{UdP z6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4Es0sQWIt5*Tu0n&*J!lk~ zf_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+AA{TB3-ERLHar49hi4Ih z5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=natP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+e zdD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVb znL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0WMyP6Wy582WNT#4$d1qu znl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8dZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iutvy=3T65Yu+7a4Yv^%sX zb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i^lS773}6Fm1Fpe-gF!>I zp{*g$u-szvGhed; zvo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*ZvFf(^Xl-N7w{EeXveC4O zv)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChY zI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_WICNY@+|jrX%s^&6b2i>5 zeqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!ql}XcFH*PieWwLj2ZSq`7 zV9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I-?$tAVKYn8-l({mqQ$Q8{ zO!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;cwT88(J6|n-WB%w`m$h~4 zpmp)YIh_3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dlbFb#!9eY1iCsp6Bajj|H zr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syTu9enWavU5N9)I?I-1m1* z_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$mU2Q)a|9JSc+Uc4zvS-T9 z63!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;;JuhGEb?H5K#o@~7t9DmU zU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX=)z6+o0o6-+`4{y+3mqQ z%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@>;2q1Vm)$Z)P1z?N$8UY zW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHsy69KwU-!MxeeuI@&cF4| zM9z%APx#ok>JNR9J=WmN5>1APhx|adzW;oXzvOaRHn#0b`+5V;cV3h_r#1mP!Nw06>Fl zd{4@J+W3n_nCLg2ZjgwGw*3$#i@_IbMf~ktW{j?1B$b-%!HiK+*Vm@%nw0L7oX3pO zR*mKxw%$W_UvJIE;B!2>KI4cAGc1zVVOpa@6Rn47jSj)h_>38&t;tkVcQgC<_2xOu d7zF^##t9X6A;sEdT+sjk002ovPDHLkV1kjyU(o;n literal 0 HcmV?d00001 diff --git a/game/public/sprites/icon_02.png b/game/public/sprites/icon_02.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab7fd4db8e90f81ad65aee1349f42c8c4b4a705 GIT binary patch literal 252 zcmVPx#wn;=mR7i>KmeCD>APhv&xP?o(g)_MYOF4&rkr-_2wYE_s@6*KdxSl{tjmEp_ znCF|LmPPZV)$6=GhnVQHPO#8CW=_*ZYk=R@W2p~|X!Ni$5+o%}k`kOza(o_KEuP~u zKNH$fw}g=@P^s5OIRjUFWH@A^^{VGFn-fGjiKHCa(Jnbo0_v!7i&1a%5~R^GE^G0v zNLsbgGOCD6$t|tO+tZyx0ye7oSm^bx@R^gT@mqE^tSvHC5SX?A0000AMCj9qjHTE=QUS2)pM8Sy$h8Vja=MNk>An>6?=_Fg;gmdl>CnvE@isLEg zy(yq-t&+$frgg=jnek+;vzkj}M_|jmcPAKsoKaBw(jMM%h{4cKUFplj&#V_y-%Q}V zsQ5Tw(jvL&Et3LyCI;*BZx&d(bP0l+XkK&T>!k literal 0 HcmV?d00001 diff --git a/game/public/sprites/icon_04.png b/game/public/sprites/icon_04.png new file mode 100644 index 0000000000000000000000000000000000000000..62771c66e858fac3d311df597a05af251a13564b GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^CO|B~!3HF^irrfVq!^2X+?^QKos)S9}8TcQl?KF%@+pDcgT&^vgTt|Q~Sr2bpE!&Je}+36t8>b zrzWqjzqOxp9`Q^OR4XTai<^Zp)52A$|)(PG$bH z{ZKCvw>7nQYH-K(3DdsIEc_?5a;0%r(Ff*A>09d^8)TX0TCfLPDT-Rm^?#pBPH}>J zxXo#cPx#wMj%lR7i>Kmcb2xAPhx|@yyL3Sj07)%{5%aA-uT&o=AW|`69%Cz8j<|s`;zT8S-mrbc6%FPx%I!Q!9RCt{2-0hBoAP|M&na$q+Ewg{tiU>HsXi?uMX|ib%?PhZLsI3S900000 zxCgZ~3L+soz;w)rtIvmd{j?qs7ta~a?jQHkT%aQ76%oaWRB`wWA*mJBeerDD=-O1H zCZ?JTqWeo>c!xbfL&#K+Q~l)n$(;|c(>BDPQKb1~rZ^!Y$q-r@j<+xLCtlo-9!(om zy&@WS)wM{HTp{O*t%l@;L0^H2j1?(!P8ih+G(?X=i(-+Mj#Y{iE&3C5kuTDG+vBY& zVB^=Nmk{rJ;!;SyQO`apvS{{NqGw@keuk{lc0+b z_FG5gIp;JLx+KBKwpQB5NJ2eX>;HOu4!XaB`iWT(p@DCLE^f}tX zGk1Q=d-3>Cq-73m<)5G;<^9ms&3wF`e}Wzrp=y{tNk!f_hpfHdZ+_(Lo1oU!`eaF} z|GfL~==bgX3bZ!oY}w2QB0fXB<>O1sX8xCXY!TfxF=xH*G(k0b*yM{-WZm#z`#kfe zXFSqag7$2}=Qs1a7fxp^X5uutaC+R$6J*H7h(71?N z@2D>o>e^2^Nh_DsH&2{(e)XjHVl{fRh~*6X=X#T!IVldbeJ812obBI9`uvsOKfQZe zU>x6z$JA^?{1x|eX8PloMsQr9SKe$q(WX7-a5#jfDaNnc;Yv*fO0fU{0000000000 an8P3Eb~Iw4dZnQN00004Of literal 0 HcmV?d00001 diff --git a/game/public/sprites/muteON.png b/game/public/sprites/muteON.png new file mode 100644 index 0000000000000000000000000000000000000000..f2065da624e837021b0bba8ac5ba520c56e934fc GIT binary patch literal 406 zcmV;H0crk;P)Px$P)S5VRCt{2+uM$UFcbw)I+_3fWqg=8BB8bAA_uzGlL_@uwApPzhXDWp0000u zP0Ae@$1!{8Q>~Oa9)FZzt!xpG)Vjxt2X1inOeu zYe`T-lb{*BtszU-d*&l&2|E0J0b9R>r5bzG?VSNiXr}myJ#GNWVL)&8~^|S07*qoM6N<$f ({ * @type { GameObj } this */ updatePos() { - this.pos = this.sizeFunc(); + // this.pos = this.sizeFunc(); }, destroy() { gameState.resizableObjects = gameState.resizableObjects.filter( diff --git a/game/src/components/resizableRect.js b/game/src/components/resizableRect.js index da7631d..3fe3bee 100644 --- a/game/src/components/resizableRect.js +++ b/game/src/components/resizableRect.js @@ -16,10 +16,10 @@ export const resizableRect = (resizeFunc) => ({ id: "resizableRect", resizeFunc, add() { - this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); + // this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); }, updateRectSize() { - this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); + // this.use(k.rect(this.resizeFunc().x, this.resizeFunc().y)); }, destroy() { gameState.resizableObjects = gameState.resizableObjects.filter( diff --git a/game/src/constants.js b/game/src/constants.js index 923a686..2b13dc0 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -1,18 +1,28 @@ // @ts-check import dialogs from "./data/dialogs.json"; - -export const EASY_RIVAL_SPEED = 1; +export const EASY_RIVAL_SPEED = 0.35; +export const HARD_RIVAL_SPEED = 0.18; export const MAX_TIME = 60; -export const goalBlocks = 2; -export const maxMistakes = 2; -export const lineHeight = 24; -export const charSpacing = 10; -export const startmoveline = 1; +export const goalBlocks = 5; +export const maxMistakes = 1; +export const lineHeight = 28; +export const startmoveline = 3; export const marginvisiblebox = 1; export const dialogsData = dialogs; +export const ICON_START_Y = 0.15; +export const TEXT_START_Y = 0.15; +export const SPACING = 0.05; +export const MAX_BLOCKS = 5; +/** + * @type {number} + */ +// reduce for a jump line after x lines +export const JUMP_AFTER = 40; -// modifiable data in game +/** + * Object for manage different states and configurations in the game + */ export const gameState = { /** * Allocated resizable objects for update on resize diff --git a/game/src/data/changeStyle.js b/game/src/data/changeStyle.js new file mode 100644 index 0000000..ffbc80c --- /dev/null +++ b/game/src/data/changeStyle.js @@ -0,0 +1,37 @@ +//CSS +const style = document.createElement("style"); +style.innerHTML = ` + :root { + --bg: hsl(0, 3.60%, 11.00%); + --gray1: #0a080a; + --gray2: #110b11; + } + + body { + margin: 0; + overflow: hidden; + background: var(--bg); + position: relative; + } + + body::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + linear-gradient(45deg, var(--gray1) 25%, transparent 25%), + linear-gradient(-45deg, var(--gray1) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, var(--gray1) 75%), + linear-gradient(-45deg, transparent 75%, var(--gray1) 75%), + rgba(0, 0, 0, 0.81); + background-size: 15px 15px, 15px 15px, 15px 15px, 15px 15px, cover; + background-position: 0 0, 0 7.5px, 7.5px -7.5px, -7.5px 0, center; + background-blend-mode: multiply; + backdrop-filter: blur(10px); + z-index: -1; + } + `; +document.head.appendChild(style); \ No newline at end of file diff --git a/game/src/data/dialogs.json b/game/src/data/dialogs.json index ea3b3ff..057444d 100644 --- a/game/src/data/dialogs.json +++ b/game/src/data/dialogs.json @@ -1,50 +1,360 @@ [ { "id": 1, - "title": "test", + "title": "twoSum", "language": "js", "blocks": [ - "class Test {\n", - " constructor() {\n", - " this.name = \"test\";\n", + "var twoSum = function(nums, target) {\n", + " let map = {};\n", + " \n", + " for (let i = 0; i < nums.length; i++) {\n", + " let other = target - nums[i];\n", + " \n", + " if (other in map) {\n", + " return [i, map[other]];\n", + " }\n", + " \n", + " map[nums[i]] = i;\n", " }\n", - "}\n" + " \n", + " return [];\n", + "};\n" ] }, { "id": 2, - "title": "isUnique", + "title": "isPalindrome", "language": "js", "blocks": [ - "function isUnique(str) {\n", - " let charSet = new Set();\n", + "var isPalindrome = function(x) {\n", + " if (x < 0) {\n", + " return false;\n", + " }\n", " \n", - " for (let i = 0; i < str.length; i++) {\n", - " if (charSet.has(str[i])) {\n", - " return false;\n", + " let reverse = 0;\n", + " let xcopy = x;\n", + " \n", + " while (x > 0) {\n", + " reverse = (reverse * 10) + (x % 10);\n", + " x = Math.floor(x / 10);\n", + " }\n", + " \n", + " return reverse === xcopy;\n", + "};\n" + ] + }, + { + "id": 5, + "title": "longestCommonPrefix", + "language": "js", + "blocks": [ + "var longestCommonPrefix = function(strs) {\n", + " return strs.reduce((prev, next) => {\n", + " let i = 0;\n", + " while (prev[i] && next[i] && prev[i] === next[i]) i++;\n", + " return prev.slice(0, i);\n", + " });\n", + "};\n" + ] + }, + { + "id": 6, + "title": "mergeTwoLists", + "language": "js", + "blocks": [ + "var mergeTwoLists = function(list1, list2) {\n", + " let dummy = new ListNode();\n", + " let cur = dummy;\n", + " \n", + " while (list1 && list2) {\n", + " if (list1.val > list2.val) {\n", + " cur.next = list2;\n", + " list2 = list2.next;\n", + " } else {\n", + " cur.next = list1;\n", + " list1 = list1.next;\n", " }\n", - " charSet.add(str[i]);\n", + " cur = cur.next;\n", " }\n", - " return true;\n", - "}\n" + " \n", + " cur.next = list1 || list2;\n", + " \n", + " return dummy.next;\n", + "};\n" ] }, { - "id": 3, - "title": "isUnique", - "language": "ts", + "id": 7, + "title": "removeDuplicates", + "language": "js", "blocks": [ - "function isUnique(str: string): boolean {\n", - " let charSet = new Set();\n", + "var removeDuplicates = function(nums) {\n", + " let i = 1;\n", " \n", - " for (let i = 0; i < str.length; i++) {\n", - " if (charSet.has(str[i])) {\n", - " return false;\n", + " for (let j = 1; j < nums.length; j++) {\n", + " if (nums[j] !== nums[i - 1]) {\n", + " nums[i] = nums[j];\n", + " i++;\n", + " }\n", + " }\n", + " \n", + " return i;\n", + "};\n" + ] + }, + { + "id": 8, + "title": "strStr", + "language": "js", + "blocks": [ + "var strStr = function(haystack, needle) {\n", + " if (haystack.length < needle.length) {\n", + " return -1;\n", + " }\n", + " \n", + " for (let i = 0; i <= haystack.length - needle.length; i++) {\n", + " if (haystack.substring(i, i + needle.length) === needle) {\n", + " return i;\n", + " }\n", + " }\n", + " \n", + " return -1;\n", + "};\n" + ] + }, + { + "id": 9, + "title": "searchInsert", + "language": "js", + "blocks": [ + "var searchInsert = function(nums, target) {\n", + " let left = 0;\n", + " let right = nums.length - 1;\n", + " \n", + " while (left <= right) {\n", + " let mid = Math.floor((left + right) / 2);\n", + " \n", + " if (nums[mid] === target) {\n", + " return mid;\n", + " } else if (nums[mid] > target) {\n", + " right = mid - 1;\n", + " } else {\n", + " left = mid + 1;\n", + " }\n", + " }\n", + " \n", + " return left;\n", + "};\n" + ] + }, + { + "id": 10, + "title": "lengthOfLastWord", + "language": "js", + "blocks": [ + "var lengthOfLastWord = function(s) {\n", + " let length = 0;\n", + " for (let i = s.length - 1; i >= 0; i--) {\n", + " if (s[i] !== ' ') {\n", + " length++;\n", + " } else if (length > 0) {\n", + " break;\n", + " }\n", + " }\n", + " \n", + " return length;\n", + "};\n" + ] + }, + { + "id": 11, + "title": "plusOne", + "language": "js", + "blocks": [ + "var plusOne = function(digits) {\n", + " for (let i = digits.length - 1; i >= 0; i--) {\n", + " if (digits[i] + 1 !== 10) {\n", + " digits[i] += 1;\n", + " return digits;\n", + " }\n", + " digits[i] = 0;\n", + " if (i === 0) {\n", + " digits.unshift(1);\n", + " return digits;\n", " }\n", - " charSet.add(str[i]);\n", " }\n", - " return true;\n", - "}\n" + "};\n" + ] + }, + { + "id": 12, + "title": "addBinary", + "language": "js", + "blocks": [ + "var addBinary = function(a, b) {\n", + " let carry = 0;\n", + " let res = '';\n", + " let i = a.length - 1;\n", + " let j = b.length - 1;\n", + " \n", + " while (i >= 0 || j >= 0 || carry) {\n", + " let sum = carry;\n", + " if (i >= 0) sum += parseInt(a[i]);\n", + " if (j >= 0) sum += parseInt(b[j]);\n", + " \n", + " res = (sum % 2) + res;\n", + " carry = Math.floor(sum / 2);\n", + " \n", + " i--;\n", + " j--;\n", + " }\n", + " \n", + " return res;\n", + "};\n" + ] + }, + { + "id": 13, + "title": "mySqrt", + "language": "js", + "blocks": [ + "var mySqrt = function(x) {\n", + " var left = 1;\n", + " var right = Math.floor(x / 2) + 1;\n", + " var mid;\n", + " \n", + " while (left <= right) {\n", + " mid = Math.floor((left + right) / 2);\n", + " \n", + " if (mid * mid > x) {\n", + " right = mid - 1;\n", + " } else if (mid * mid < x) {\n", + " left = mid + 1;\n", + " } else {\n", + " return mid;\n", + " }\n", + " }\n", + " \n", + " return right;\n", + "};\n" + ] + }, + { + "id": 14, + "title": "climbStairs", + "language": "js", + "blocks": [ + "var climbStairs = function(n) {\n", + " if (n <= 3) return n;\n", + " \n", + " let prev1 = 3;\n", + " let prev2 = 2;\n", + " let cur = 0;\n", + " \n", + " for (let i = 3; i < n; i++) {\n", + " cur = prev1 + prev2;\n", + " prev2 = prev1;\n", + " prev1 = cur;\n", + " }\n", + " \n", + " return cur;\n", + "};\n" + ] + }, + { + "id": 15, + "title": "deleteDuplicates", + "language": "js", + "blocks": [ + "var deleteDuplicates = function(head) {\n", + " let res = head;\n", + " \n", + " while (head && head.next) {\n", + " if (head.val === head.next.val) {\n", + " head.next = head.next.next;\n", + " } else {\n", + " head = head.next;\n", + " }\n", + " }\n", + " \n", + " return res;\n", + "};\n" + ] + }, + { + "id": 16, + "title": "mergeSortedArray", + "language": "js", + "blocks": [ + "var merge = function(nums1, m, nums2, n) {\n", + " for (let i = m, j = 0; j < n; i++, j++) {\n", + " nums1[i] = nums2[j];\n", + " }\n", + " nums1.sort((a, b) => a - b);\n", + "};\n" + ] + }, + { + "id": 17, + "title": "inorderTraversal", + "language": "js", + "blocks": [ + "var inorderTraversal = function(root) {\n", + " const res = [];\n", + " \n", + " function inorder(node) {\n", + " if (!node) {\n", + " return;\n", + " }\n", + " inorder(node.left);\n", + " res.push(node.val);\n", + " inorder(node.right);\n", + " }\n", + " \n", + " inorder(root);\n", + " return res;\n", + "};\n" + ] + }, + { + "id": 17, + "title": "isSameTree", + "language": "js", + "blocks": [ + "var isSameTree = function(p, q) {\n", + " if (!p && !q) {\n", + " return true;\n", + " }\n", + " \n", + " if (p && q && p.val === q.val) {\n", + " return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);\n", + " }\n", + " \n", + " return false;\n", + "};\n" + ] + }, + { + "id": 18, + "title": "isSymmetric", + "language": "js", + "blocks": [ + "var isSymmetric = function(root) {\n", + " const isMirror = (n1, n2) => {\n", + " if (!n1 && !n2) {\n", + " return true;\n", + " }\n", + " \n", + " if (!n1 || !n2) {\n", + " return false;\n", + " }\n", + " const leftMirror = isMirror(n1.left, n2.right);\n", + " const rightMirror = isMirror(n1.right, n2.left);\n", + " return n1.val === n2.val && leftMirror && rightMirror;\n", + " };\n", + " \n", + " return isMirror(root.left, root.right);\n", + "};\n" ] } ] diff --git a/game/src/data/themes.js b/game/src/data/themes.js index 70468f7..73ae43f 100644 --- a/game/src/data/themes.js +++ b/game/src/data/themes.js @@ -2,39 +2,89 @@ export const themes = [ { - name: "default", + name: "default", + tokens: { + functions: "#2688ff", + classes: "#fc7e05", + brackets: "#F2F6FF", + keywords: "#df75ff", + comments: "#5C6370", + strings: "#97ff4d", + numbers: "#fc7e05", + variables: "#8ae2ff", + types: "#ff9e42", + operators: "#F2F6FF", + punctuation: "#F2F6FF", + attributes: "#fc7e05", + tags: "#8ae2ff", + text: "#F2F6FF", + background: "#282C34", + constants: "#fc7e05", + decorators: "#df75ff", + regex: "#97ff4d", + foreground: "#F2F6FF", + }, + associations: { + functions: /function\s*|=>\s*/, + classes: /\b(?:class|interface|enum)\s+[A-Z]\w*\b/, + brackets: /[\(\)\[\]\{\}<>]/, + keywords: + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/, + types: /:\s*[A-Za-z_$][\w$<>, ]*/, + decorators: /@\w+/, + regex: /\/(\\\/|[^\/\n])+\/[gimsuy]*/, + strings: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/, + numbers: /\b\d+(\.\d+)?\b/, + punctuation: /[\.,;:]/, + operators: /[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/, + variables: /\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/, + tags: /<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/, + attributes: /\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/, + constants: /\b[A-Z0-9_]+\b/, + generics: /<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/, + }, + }, + { + name: "ts", tokens: { functions: "#61AFEF", - classes: "#E5C07B", - brackets: "#ABB2BF", - keywords: "#C678DD", + classes: "#f27c0c", + brackets: "#e6eeff", + keywords: "#e48aff", comments: "#5C6370", strings: "#98C379", - numbers: "#D19A66", + numbers: "#f27c0c", variables: "#E06C75", types: "#E5C07B", operators: "#56B6C2", - punctuation: "#ABB2BF", - attributes: "#D19A66", + punctuation: "#e6eeff", + attributes: "#f27c0c", tags: "#E06C75", - text: "#ABB2BF", + text: "#e6eeff", background: "#282C34", - constants: "#D19A66", - decorators: "#C678DD", + constants: "#f27c0c", + decorators: "#e48aff", regex: "#98C379", - foreground: "#ABB2BF", + foreground: "#e6eeff", }, associations: { functions: /function\s*|=>\s*/g, - classes: /\b[A-Z]\w*\b/g, - brackets: /[\(\)\[\]\{\}]/g, + classes: /\b(?:class|interface|enum)\s+[A-Z]\w*\b/g, + brackets: /[\(\)\[\]\{\}<>]/g, keywords: - /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor)\b/g, - constants: /\b[A-Z_][A-Z0-9_]*\b/g, + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g, + types: /:\s*[A-Za-z_$][\w$<>, ]*/g, decorators: /@\w+/g, regex: /\/(\\\/|[^\/\n])+\/[gimsuy]*/g, strings: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g, + numbers: /\b\d+(\.\d+)?\b/g, punctuation: /[\.,;:]/g, + operators: /[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g, + variables: /\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g, + tags: /<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g, + attributes: /\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g, + constants: /\b[A-Z0-9_]+\b/g, + generics: /<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g, }, }, ]; diff --git a/game/src/kaplay.js b/game/src/kaplay.js index 0ca748c..6db1499 100644 --- a/game/src/kaplay.js +++ b/game/src/kaplay.js @@ -3,7 +3,22 @@ import kaplay from "kaplay"; export const k = kaplay({ - background: [10, 10, 27, 0], - font: "monogram", - maxFPS: 60, + loadingScreen: false, + background: [0, 0, 0, 0], + font: "jetbrains", + maxFPS: 120, + backgroundAudio: false, + width: 1920, + height: 1080, + letterbox: true, + pixelDensity: 3, + crisp: false, + texFilter: "linear", }); +k.onLoading((progress) => { +}); +window.addEventListener("keydown", (e) => { + if (e.key === "/" || e.key === "?") { + e.preventDefault(); + } + }); \ No newline at end of file diff --git a/game/src/main.js b/game/src/main.js index 96add0c..e5100fe 100644 --- a/game/src/main.js +++ b/game/src/main.js @@ -4,8 +4,6 @@ import { k } from "./kaplay.js"; // init game lib import "./assets.js"; // load assets import "./scenes/game.js"; // load game scene import "./scenes/endGame.js"; // load endGame scene -import { EASY_RIVAL_SPEED } from "./constants.js"; - -k.go("game", { - rivalSpeed: EASY_RIVAL_SPEED, -}); +import "./scenes/selectionScene.js"; +import "./scenes/about.js"; +k.go("selection"); diff --git a/game/src/scenes/about.js b/game/src/scenes/about.js new file mode 100644 index 0000000..e1af30a --- /dev/null +++ b/game/src/scenes/about.js @@ -0,0 +1,104 @@ +import { k } from "../kaplay.js"; +import { resizablePos } from "../components/resizablePos.js"; +import { settings } from "./selectionScene.js"; +k.scene("about", () => { + const blockWidth = k.width() * 0.8; + const startX = (k.width() - blockWidth) / 2; + const startY = k.height() * 0.4 + 20; + const fontSize = 18; + const lineSpacing = 8; + k.add([ + k.sprite("bg2"), + k.pos(k.width() / 2, k.height() / 2), + k.anchor("center"), + k.z(18), + ]); + const title = k.add([ + k.sprite("WPM"), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.25)), + k.anchor("center"), + k.z(18), + ]); + k.add([ + k.text( + `Typing is one of the most under-rated coding skills.\n\n` + + `We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive.\n\n` + + `It is also a key predictor of interview performance. Slow coding gets an “instant no” in any competitive interview process, and interviewers almost never tell candidates this is why, because it is embarrasing and even conflictive.\n\n` + + `Many developers get publicly angry at the suggestion that typing speed is irrelevant. I say to you - do you want to be upset or do you want to pass interviews?\n\n` + + `WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment.\n\n` + + `To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`, + { + size: fontSize, + width: blockWidth, + align: "left", + lineSpacing: lineSpacing, + } + ), + k.pos(startX, startY), + k.anchor("topleft"), + k.color(k.WHITE), + k.z(30), + ]); + const url = "https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub"; + const urlY = startY + 17.5 * (fontSize + lineSpacing) + 10; + const link = k.add([ + k.text(url, { + size: fontSize, + width: blockWidth, + align: "left", + }), + k.pos(startX, urlY), + k.anchor("topleft"), + k.color(k.YELLOW), + k.area(), + k.z(30), + ]); + + link.onClick(() => window.open(url, "_blank")); + link.onHover( + () => document.body.style.cursor = "pointer", + () => document.body.style.cursor = "default" + ); + + onKeyPress("escape", () => { + k.go("selection"); + }); + const button_muteON = k.add([ + k.sprite("muteON"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(1), + k.animate(), + k.z(50), + ]); + const button_muteOFF = k.add([ + k.sprite("muteOff"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(0), + k.animate(), + k.z(50), + ]); + if (settings.mute) { + button_muteON.opacity = 0; + button_muteOFF.opacity = 1; + } + else { + button_muteON.opacity = 1; + button_muteOFF.opacity = 0; + } + const rest_text = k.add([ + k.text("ESC to return", { size: 20 }), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.94)), + k.anchor("center"), + k.color(k.rgb(127, 134, 131)), + k.animate(), + k.z(19), + ]); + const atributions = k.add([ + k.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ", { size: 16 }), + resizablePos(() => k.vec2(k.width() * 0.8, k.height() * 0.98)), + k.anchor("center"), + k.color(k.rgb(127, 134, 131)), + k.animate(), + k.z(19), + ]); +}); \ No newline at end of file diff --git a/game/src/scenes/endGame.js b/game/src/scenes/endGame.js index 21c6f42..374e859 100644 --- a/game/src/scenes/endGame.js +++ b/game/src/scenes/endGame.js @@ -1,9 +1,144 @@ -import { totalCorrectChars } from "./game.js"; +import { k } from "../kaplay"; +import { goal_acc, goal_lpm, goal_wpm, goal_awpm, goalCompletedBlocks, lastChallenge, blockNamesString, goal_time } from "./game.js"; +import { savePlay, getPlay, } from "../systems/saves.js"; +import { saveMute } from "../systems/preferences.js"; +import { settings } from "./selectionScene.js"; +import { resizablePos } from "../components/resizablePos.js"; +import "../types.js"; +import { MAX_BLOCKS, goalBlocks } from "../constants.js"; +k.scene("endgame", () => { + let fontsize = 18; + let record_blocks = goalCompletedBlocks; + let record_challenges = lastChallenge; -scene("endgame", () => { - const endgameLabel = add([ - text("Analytics", { size: 48 }), - pos(center().x, center().y - 100), - anchor("center"), + let wpm = parseFloat((goal_wpm || 0).toFixed(0)); + let lpm = parseFloat((goal_lpm || 0).toFixed(0)); + let acc = parseFloat((goal_acc || 0).toFixed(0)); + let awpm = parseFloat((goal_awpm || 0).toFixed(0)); + + const saved = getPlay() || {}; + const best_wpm = Math.max(parseFloat(saved.bestWpm) || 0, wpm); + + wpm = parseFloat((wpm || 0).toFixed(0)); + lpm = parseFloat((lpm || 0).toFixed(0)); + acc = parseFloat((acc || 0).toFixed(0)); + + const currentResults = { + wpm: wpm, + awpm: awpm, + lpm: lpm, + acc: acc, + }; + savePlay({ + wpm: wpm, + bestWpm: best_wpm, + lpm: lpm, + acc: acc, + blockNames: blockNamesString + }); + + saveMute(settings.mute); + k.setVolume(1); + const music = k.play("endgame"); + music.loop = true; + music.volume = 0; + const maxVolume = 0.05; + const volumeStep = 0.01; + const intervalTime = 100; + let volumeIncrease; + + function updateMusicVolume() { + clearInterval(volumeIncrease); + + if (settings.mute) { + music.volume = 0.0; + } else { + let currentVolume = 0.0; + volumeIncrease = setInterval(() => { + if (currentVolume < maxVolume) { + currentVolume += volumeStep; + music.volume = Math.min(currentVolume, maxVolume); + } else { + clearInterval(volumeIncrease); + } + }, intervalTime); + } + } + + const center = () => k.vec2(k.width() / 2, k.height() / 2); + const offsetX = k.width() * 0.10; + const offsetY = k.height() * 0.20; + const pos = (dx, dy) => resizablePos(() => center().add(k.vec2(dx, dy))); + const labelX = -offsetX - 45; + const baseY = offsetY * 0.45; + const textSpacing = fontsize + 20; + const labelOffset = 4 * fontsize * 0.6; + //sprites + k.add([k.sprite("bg2"), k.pos(center()), k.anchor("center"), k.z(10)]); + k.add([k.sprite("WPM"), resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.25)), k.anchor("center"), k.z(18)]); + //box + k.add([k.rect(1080, 925, { radius: 36 }), k.pos(center()), k.anchor("center"), k.color(k.rgb(53, 53, 71)), k.z(10), k.opacity(0.3)]); + k.add([k.rect(290, 280, { radius: 36 }), pos(-offsetX - 145, -offsetY + 130), k.color(k.rgb(53, 53, 71)), k.z(10), k.opacity(0.3)]); + k.add([k.rect(290, 280, { radius: 36 }), pos(+offsetX - 145, -offsetY + 130), k.color(k.rgb(53, 53, 71)), k.z(10), k.opacity(0.3)]); + //texts + k.add([k.text("WPM", { size: 32 }), pos(-offsetX, -offsetY / 10), k.anchor("center"), k.color(k.WHITE), k.z(19)]); + k.add([k.text(wpm.toFixed(0), { size: 42 }), pos(-offsetX, offsetY * 0.2), k.anchor("center"), k.color(k.YELLOW), k.z(19)]); + k.add([k.text("BEST", { size: fontsize }), pos(labelX, baseY), k.anchor("left"), k.color(k.WHITE), k.z(20)]); + k.add([k.text(best_wpm.toFixed(0), { size: fontsize }), pos(labelX + labelOffset + 20, baseY), k.anchor("left"), k.color(k.WHITE), k.z(20)]); + k.add([k.text("ACC", { size: fontsize }), pos(labelX, baseY + textSpacing), k.anchor("left"), k.color(k.YELLOW), k.z(19)]); + k.add([k.text(`${acc.toFixed(0)}%`, { size: fontsize }), pos(labelX + labelOffset + 20, baseY + textSpacing), k.anchor("left"), k.color(k.YELLOW), k.z(19)]); + k.add([k.text("SCORE", { size: 32 }), pos(+offsetX, -offsetY / 10), k.anchor("center"), k.color(k.WHITE), k.z(19)]); + k.add([k.text(`${record_blocks}/${goalBlocks}`, { size: 42 }), pos(+offsetX, +offsetY * 0.2), k.anchor("center"), k.color(k.YELLOW), k.z(18)]); + k.add([k.text("last challenge", { size: fontsize }), pos(+offsetX, +offsetY * 0.45), k.anchor("center"), k.color(k.WHITE), k.z(18)]); + k.add([k.text(record_challenges, { size: fontsize }), pos(+offsetX, +offsetY * 0.4 + 50), k.anchor("center"), k.color(k.YELLOW), k.z(18)]); + k.add([k.text("ChallengeSet:", { size: fontsize + 2 }), k.pos(k.width() * 0.45, k.height() * 0.74), k.anchor("left"), k.color(k.YELLOW), k.z(18)]); + + const lineHeight = fontsize + 15; + blockNamesString.forEach((title, i) => { + k.add([ + k.text(title, { size: fontsize + 2 }), + resizablePos(() => k.vec2(k.width() * 0.45, k.height() * 0.78 + i * lineHeight)), + k.anchor("left"), k.color(k.WHITE), k.z(18) ]); -}); + }); + const button_muteON = k.add([ + k.sprite("muteON"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(1), + k.animate(), + k.z(50), + ]); + const button_muteOFF = k.add([ + k.sprite("muteOff"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(0), + k.animate(), + k.z(50), + ]); + + if (settings.mute) { + button_muteON.opacity = 0; + button_muteOFF.opacity = 1; + updateMusicVolume(); + } + else { + button_muteON.opacity = 1; + button_muteOFF.opacity = 0; + updateMusicVolume(); + } + const rest_text = k.add([ + k.text("ESC to retry", { size: 20 }), + resizablePos(() => k.vec2(k.width() * 0.1 + 20, k.height() * 0.94)), + k.anchor("center"), + k.color(k.rgb(127, 134, 131)), + k.animate(), + k.z(19), + ]); + onKeyPress("escape", () => { + record_blocks = 0; + record_challenges = ""; + music.stop(); + k.go("game"); + }); + +}); \ No newline at end of file diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index b9c0506..9b0f496 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -6,22 +6,50 @@ import { lineHeight, MAX_TIME, EASY_RIVAL_SPEED, + HARD_RIVAL_SPEED, + JUMP_AFTER, + TEXT_START_Y, + SPACING, + MAX_BLOCKS, + goalBlocks, + maxMistakes, + ICON_START_Y } from "../constants.js"; +import { savePlay, getPlay } from "../systems/saves.js"; import { k } from "../kaplay.js"; import { themes } from "../data/themes.js"; import { resizablePos } from "../components/resizablePos.js"; import { resizableRect } from "../components/resizableRect.js"; +import { settings } from "./selectionScene.js"; -let COLOR_TEXT_DEFAULT = k.Color.fromHex("#553d4d"); -let COLOR_TEXT_RIVAL = k.Color.fromHex("#718703"); -let COLOR_TEXT_INCORRECT = k.Color.RED; +let titles = dialogsData.map((item) => item.title); +let COLOR_TEXT_DEFAULT = k.Color.fromHex("#6a717d"); +let COLOR_TEXT_RIVAL = k.YELLOW; +let COLOR_TEXT_INCORRECT = k.Color.RED; let completedBlocks = 0; -export let totalCorrectChars = 0; -let fontSize = 24; -let fontWidth = 12; +let fontSize = 18; +let fontWidth = 16.4; let errorCharsIndexes = []; let errorCharsReplaces = {}; +let playerStartedTyping = false; +export let actual_wpm = 0; +export let actual_lpm = 0; +export let actual_acc = 0; +export let actual_awpm = 0; +export let totalCorrectChars = 0; +export let totalIcorrectCorrectChars = 0; +export let totalTypedCharacters = 0; +export let totalCorrectlines = 0; +export let startTime = 0; +export let goal_wpm = actual_wpm; +export let goal_awpm = actual_awpm; +export let goal_lpm = actual_lpm; +export let goal_acc = actual_acc; +export let goal_time = startTime; +export let goalCompletedBlocks = completedBlocks; +export let lastChallenge = ""; +export let blockNamesString = []; /** * Text taken from the dialogs.json file @@ -39,18 +67,49 @@ let fixedText = ""; /** * @param {GameParams} params */ + const gameScene = (params) => { - const BG_SPEED_X = 0.1; - const BG_SPEED_Y = 0.3; + + k.loadMusic("endgame", "/sounds/endgame.mp3"); + k.loadSprite("arrow_yellow", "/sprites/arrow_yellow.png"); + + let jumpCount = 0; let theme = themes[0]; - let offsetX = 0; - let offsetY = 0; let currentBlockIndex = -1; - let rivalSpeed = params.rivalSpeed ?? EASY_RIVAL_SPEED; + let rivalSpeed = settings.rivalSpeed; let curBlockData = { lineCount: 0, }; - let defaultTime = params.time ?? MAX_TIME; + + // Music + const music = k.play("videogame"); + let musicRate = 0.95; + music.loop = true; + music.volume = 0; + const maxVolume = 0.3; + const volumeStep = 0.01; + const intervalTime = 100; + let volumeIncrease; + + function updateMusicVolume() { + clearInterval(volumeIncrease); + + if (settings.mute) { + music.volume = 0.0; + } else { + let currentVolume = 0.0; + volumeIncrease = setInterval(() => { + if (currentVolume < maxVolume) { + currentVolume += volumeStep; + music.volume = Math.min(currentVolume, maxVolume); + } else { + clearInterval(volumeIncrease); + } + }, intervalTime); + } + } + + titles = shuffle(dialogsData); // #region PLAYER & RIVAL VARIABLES @@ -58,6 +117,7 @@ const gameScene = (params) => { * @type {PlayerState} */ const playerState = { + cursorPos: 0, line: "", curLineCount: 0, @@ -100,107 +160,322 @@ const gameScene = (params) => { // #endregion - animateBackground(); - + /** + * @param {number} i + */ /** * @param {number} i */ const matchColorToken = (i, ch) => { - const themeTokens = theme.tokens; - const themeAssociations = theme.associations; + const T = theme.tokens; + const A = theme.associations; - if (ch === " ") return COLOR_TEXT_DEFAULT; - if (playerState.cursorPos - 1 < i) { - if (rivalState.cursorPos + 1 > i) { - return COLOR_TEXT_RIVAL; - } + if (errorCharsIndexes.includes(i)) { + return COLOR_TEXT_INCORRECT; + } + if (i === rivalState.cursorPos) { + return COLOR_TEXT_RIVAL; + } + if (ch === " ") { return COLOR_TEXT_DEFAULT; } - - let charColor = COLOR_TEXT_DEFAULT; - - const words = originalText.split(" "); - let wordCharsIndex = 0; - const word = - words.find((w) => { - const found = w.length + wordCharsIndex >= i; - wordCharsIndex += w.length + 1; - return found; - }) || ""; - - if (errorCharsIndexes.includes(i)) { - charColor = COLOR_TEXT_INCORRECT; - } else if (ch.match(themeAssociations.brackets)) { - charColor = k.Color.fromHex(themeTokens.brackets); - } else if (ch.match(themeAssociations.punctuation)) { - charColor = k.Color.fromHex(themeTokens.punctuation); - } else if (word.match(themeAssociations.classes)) { - charColor = k.Color.fromHex(themeTokens.classes); - } else if (word.match(themeAssociations.functions)) { - charColor = k.Color.fromHex(themeTokens.functions); - } else if (word.match(themeAssociations.keywords)) { - charColor = k.Color.fromHex(themeTokens.keywords); - } else if (word.match(themeAssociations.strings)) { - charColor = k.Color.fromHex(themeTokens.strings); - } else { - charColor = k.Color.fromHex(themeTokens.text); + if (i > playerState.cursorPos - 1) { + return i < rivalState.cursorPos + 1 + ? COLOR_TEXT_RIVAL + : COLOR_TEXT_DEFAULT; } - - if ( - rivalState.cursorPos < playerState.cursorPos && - rivalState.cursorPos > i - ) { - return charColor.darken(80); + if (ch.match(A.brackets)) return k.Color.fromHex(T.brackets); + if (ch.match(A.operators)) return k.Color.fromHex(T.operators); + if (ch.match(A.punctuation)) return k.Color.fromHex(T.punctuation); + if (ch === '"' || ch === "'") return k.Color.fromHex(T.strings); + + const tokenPattern = /[\w$]+|[^\s\w]/g; + const matches = Array.from(originalText.matchAll(tokenPattern)); + let token = ""; + for (const m of matches) { + const start = m.index; + const end = start + m[0].length; + if (i >= start && i < end) { + token = m[0]; + break; + } } - return charColor; + if (A.tags.test(token)) return k.Color.fromHex(T.tags); + if (A.numbers.test(token)) return k.Color.fromHex(T.numbers); + if (A.classes.test(token)) return k.Color.fromHex(T.classes); + if (A.functions.test(token)) return k.Color.fromHex(T.functions); + if (A.keywords.test(token)) return k.Color.fromHex(T.keywords); + if (A.strings.test(token)) return k.Color.fromHex(T.strings); + if (/^[A-Za-z_$][\w$]*$/.test(token)) { + return k.Color.fromHex(T.variables); + } + return k.Color.fromHex(T.text); }; - function animateBackground() { - offsetX += BG_SPEED_X; - offsetY += BG_SPEED_Y; - document.body.style.backgroundPosition = `${offsetX}px ${offsetY}px`; + let rivalTimer = 0; + + k.onUpdate(() => { + analitycs_calculate(); + if (playerStartedTyping) { + startTime += k.dt(); + rivalTimer += k.dt(); + if (rivalTimer >= rivalSpeed) { + rivalTimer -= rivalSpeed; + if (rivalState.curLineCount < curBlockData.lineCount - 1) { + rivalWrite(); + } else { + music.stop(); + StatsforAnalitics(); + resetGameStats(); + k.go("endgame"); + } + } + } + const totalEventsLast60 = eventBuffer.reduce((sum, count) => sum + count, 0); + const awpm = totalEventsLast60 / 5; + actual_awpm = awpm; + }); + + function escapeForRender(str) { + + return str + .replace(/\\/g, "\\\\") + .replace(/\[/g, "\\[") + .replace(/\]/g, "\\]") + .replace(/\{/g, "\\{") + .replace(/\}/g, "\\}") + .replace(/'/g, "\\'"); + } + function StatsforAnalitics() { + goal_wpm = actual_wpm; + goal_awpm = actual_awpm; + goal_lpm = actual_lpm; + goal_acc = actual_acc; + goal_time = startTime; + goalCompletedBlocks = completedBlocks; + } - requestAnimationFrame(animateBackground); + function resetGameStats() { + playerStartedTyping =false; + completedBlocks = 0; + startTime = 0; + actual_wpm = 0; + actual_awpm = 0; + actual_lpm = 0; + actual_acc = 0; + totalCorrectChars = 0; + totalIcorrectCorrectChars = 0; + totalTypedCharacters = 0; + totalCorrectlines = 0; + rivalSpeed = EASY_RIVAL_SPEED; + errorCharsIndexes = []; + errorCharsReplaces = {}; } // background // Files & Folders const filesFoldersSize = () => { if (k.width() > 1080) { - return k.vec2(323, k.height()); + return k.vec2(328, k.height()); } else { return k.vec2(k.width() * 0.3, k.height()); } }; const filesFoldersPos = () => k.vec2(0, 0); + const wmp_text = k.add([ + k.anchor("left"), + k.pos(k.width() * 0.25+90, k.height() * 0.025), + k.text("0", { + size: 18, + }), + k.color(k.YELLOW), + k.z(21), + ]); + const time_text = k.add([ + k.anchor("left"), + k.pos(k.width() * 0.35+90, k.height() * 0.025), + k.text("time: ", { + size: 18, + }), + k.color(k.YELLOW), + k.z(22), + ]); k.add([ - resizableRect(filesFoldersSize), + k.sprite("BG_WPM_IN_GAME"), + k.pos(k.width() * 0.25, k.height() * 0.02 + 5), + k.anchor("left"), + k.z(20), + ]); + k.add([ + k.sprite("BG_TIME_IN_GAME"), + k.pos(k.width() * 0.35, k.height() * 0.02 + 5), + k.anchor("left"), + k.z(20), + ]); + k.add([ resizablePos(filesFoldersPos), + k.sprite("bg2"), k.anchor("topleft"), - k.color(k.RED), - k.opacity(0.5), + k.opacity(1), + ]); + k.add([ + k.pos(k.width() * 0.01+10, k.height() * 0.01-10), + k.sprite("SilverDevs"), + k.anchor("topleft"), + k.opacity(1), + k.z(51), + ]); + const textboxBack = k.add([ + k.rect(2000, 54, { radius: 0 }), + k.pos(1000, 0), + k.color(k.rgb(7, 7, 7)), + k.outline(2), + k.anchor("top"), + k.z(10), + ]); + const text_challenge = k.add([ + k.text("Challenges", { size: 20 }), + resizablePos(() => k.vec2(k.width() * 0.05, k.height() * 0.1)), + k.color(k.WHITE), + k.opacity(1), + ]); + const rest_text = k.add([ + k.text("ESC to retry", { size: 20 }), + resizablePos(() => k.vec2(k.width() * 0.1 + 20, k.height() * 0.94)), + k.anchor("center"), + k.color(k.rgb(127, 134, 131)), + k.animate(), + k.z(19), + ]); + const button_muteON = k.add([ + k.sprite("muteON"), + k.pos(k.width() * 0.9, k.height() * 0+5), + k.opacity(1), + k.animate(), + k.z(50), + ]); + const button_muteOFF = k.add([ + k.sprite("muteOff"), + k.pos(k.width() * 0.9, k.height() * 0+5), + k.opacity(0), + k.animate(), + k.z(50), + ]); + + const languageIconMap = { + js: "icon_02", + ts: "icon_01", + go: "icon_03", + react: "icon_04", + py: "icon_05", + default: "icon_02", + }; + + const texts = dialogsData.map(item => ({ + title: item.title, + language: item.language || "default", + })); + + const visibleTexts = texts.slice(0, MAX_BLOCKS); + blockNamesString = visibleTexts.map(item => item.title); + visibleTexts.forEach(({ title, language }, index) => { + const spriteKey = languageIconMap[language] ?? languageIconMap.default; + + k.add([ + k.sprite(spriteKey), + resizablePos(() => + k.vec2( + k.width() * 0.02, + k.height() * (ICON_START_Y + SPACING * index) + ) + ), + k.opacity(1), + k.z(55), + "challengeIcon", + ]); + + k.add([ + k.text(title, { size: 20 }), + resizablePos(() => + k.vec2( + k.width() * 0.05, + k.height() * (TEXT_START_Y + SPACING * index) + ) + ), + k.color(k.WHITE), + k.opacity(1), + "menuItem", + { menuIndex: index }, + ]); + }); + + if (settings.mute) { + button_muteON.opacity = 0; + button_muteOFF.opacity = 1; + updateMusicVolume(); + } + else { + button_muteON.opacity = 1; + button_muteOFF.opacity = 0; + updateMusicVolume(); + } + + k.onKeyPress(["escape"], () => { + music.stop(); + resetGameStats(); + k.go("game"); + }); + + const arrow = k.add([ + k.sprite("arrow_yellow"), + k.pos(k.width() * 0.1, k.height() * (TEXT_START_Y - SPACING * 0.5)), + k.opacity(1), + k.animate(), ]); + let currentIndex = -1; + let arrow_ypos = arrow.pos.y; + + function moveArrow() { + const newY = k.height() * (TEXT_START_Y + SPACING * currentIndex); + arrow.pos = k.vec2(arrow.pos.x, newY); + arrow.animate("pos", [k.vec2(10, newY), k.vec2(20, newY)], { + duration: 0.5, + direction: "ping-pong", + }); + + k.get("menuItem").forEach((item) => { + if (item.menuIndex === currentIndex) { + item.color = k.YELLOW; + } else { + item.color = k.WHITE; + } + }); + } + const textboxSize = () => k.vec2(k.width(), k.height()); const textboxPos = () => { if (k.width() > 1080) { - return k.vec2(323, 0); + return k.vec2(450, 0); } return k.vec2(k.width() * 0.3, 0); }; - const textPadding = k.vec2(12, 12); + + const textPadding = k.vec2(50, 103); + + k.setVolume(0.5); const textbox = k.add([ - resizableRect(textboxSize), + k.rect(1920, 1080, { radius: 8 }), + k.color(k.rgb(53, 53, 71)), resizablePos(textboxPos), k.anchor("topleft"), - k.color(23, 9, 39), - k.opacity(0.5), + k.opacity(0.3), + k.z(0), ]); - const textboxBackParent = k.add([ resizableRect(textboxSize), resizablePos(textboxPos), @@ -212,42 +487,46 @@ const gameScene = (params) => { k.opacity(0), ]); + + const textboxTextPos = () => { + matchColorToken + return k.vec2(textPadding).sub(0, lineHeight * (JUMP_AFTER * jumpCount)); + } + const textboxText = textboxBackParent.add([ k.text("", { size: fontSize, + lineSpacing: 12, + letterSpacing: 2, transform: (idx, ch) => ({ color: matchColorToken(idx, ch), }), }), - resizablePos(() => k.vec2(textPadding)), + k.pos(0, 0), + resizablePos(textboxTextPos), ]); - const timerLabel = k.add([ - k.text(String(gameState.timeLeft), { - size: 48, - font: "monogram", - }), - resizablePos(() => k.vec2(k.width(), k.height())), - k.anchor("botright"), - ]); + const lineSpacing = 12; + const actualLineHeight = fontSize + lineSpacing; + const cursorVerticalOffset = (actualLineHeight - fontSize) / 2; + const CURSOR_EXTRA_OFFSET = 10; const cursorPos = (rival = false) => { const player = rival ? rivalState : playerState; - - return k.vec2( - textboxBackParent.pos - .add(textboxText.pos) - .add( - player.curCharInLine * fontWidth, - (player.curLineCount + 1) * lineHeight, - ), - ); + const displayLine = player.curLineCount - jumpCount * JUMP_AFTER; + const x = player.curCharInLine * fontWidth; + const y = displayLine * actualLineHeight + + cursorVerticalOffset + + CURSOR_EXTRA_OFFSET; + return textboxBackParent.pos + .add(textboxText.pos) + .add(x, y); }; const cursorPointer = k.add([ k.text("_", { size: 16 }), resizablePos(() => cursorPos()), - k.opacity(0.6), + k.opacity(1), k.anchor("left"), k.color(255, 255, 255), k.z(10), @@ -256,11 +535,19 @@ const gameScene = (params) => { const rivalPointer = k.add([ k.text("_", { size: 16 }), resizablePos(() => cursorPos(true)), - k.opacity(0.6), + k.opacity(1), k.anchor("left"), k.color(COLOR_TEXT_RIVAL), ]); + makeBlink(cursorPointer); + makeBlink(rivalPointer); + + function makeBlink(entity) { + k.loop(0.5, () => { + entity.opacity = entity.opacity === 0 ? 0.8 : 0; + }); + } playerState.cursorPointer = cursorPointer; rivalState.cursorPointer = rivalPointer; @@ -290,38 +577,73 @@ const gameScene = (params) => { "color: inherit;", ); }; - function updateDialog() { currentBlockIndex++; - completedBlocks++; + if(currentBlockIndex>0) + { + completedBlocks++; + } + musicRate += 0.05; + updateMusic(); + if (completedBlocks === goalBlocks) { + completedBlocks = goalBlocks; + StatsforAnalitics(); + resetGameStats(); + music.stop(); + k.go("endgame"); + return; + } + const startSpeed = EASY_RIVAL_SPEED; + const endSpeed = HARD_RIVAL_SPEED; + const steps = 4; + if (completedBlocks > 0) { + + const t = Math.min(completedBlocks, steps) / steps; + rivalSpeed = startSpeed * Math.pow(endSpeed / startSpeed, t); + } else { + rivalSpeed = startSpeed; + } + k.play playerState.reset(); rivalState.reset(); + arrow.pos = k.vec2(arrow.pos.x, arrow_ypos); + + if (currentIndex < Math.min(texts.length, MAX_BLOCKS) - 1) { + currentIndex++; + moveArrow(); + } gameState.timeLeft = MAX_TIME; - const currentDialog = getCurrentDialog(); + jumpCount = 0; + textboxText.updatePos(); - // theme - theme = themes[0]; + const currentDialog = getCurrentDialog(); - // the sentences + const lang = currentDialog.language ?? "default"; + theme = themes.find(t => t.name === lang) || themes[0]; const currentBlocks = currentDialog.blocks; curBlockData.lineCount = currentBlocks.length; - // we replace [] characters with \[ and \] to avoid them being interpreted as tags - // also ▯ is replaced with a space originalText = currentBlocks.join(""); + const fixedGroup = escapeForRender(originalText); + renderedText = fixedGroup; + textboxText.text = renderedText; - const fixedGroup = currentBlocks - .join("") - .replace(/\[/g, "\\[") - .replace(/\]/g, "\\]") - .replace(/▯/g, " "); - fixedText = currentBlocks.join("").replace(/▯/g, " "); + fixedText = originalText.replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; + playerState.line = fixedText.split("\n")[0]; - rivalState.line = fixedText.split("\n")[0]; + rivalState.line = playerState.line; + + lastChallenge = currentDialog.title; + cursorPointer.updatePos(); + rivalPointer.updatePos(); + } + + function updateMusic() { + music.speed = musicRate; } function updateDialogErrors() { @@ -336,9 +658,7 @@ const gameScene = (params) => { } }) .join("") - .replace(/\[/g, "\\[") - .replace(/\]/g, "\\]"); - + renderedText = escapeForRender(renderedText); textboxText.text = renderedText; } @@ -363,15 +683,25 @@ const gameScene = (params) => { } function preventError() { - k.shake(5); + k.shake(2); + if (!settings.mute) { + k.play("wrong_typing"); + } } - function nextLine(rival = false) { - const player = rival ? rivalState : playerState; + function nextLine(isRival = false) { + const player = isRival ? rivalState : playerState; if (!player.cursorPointer) return; - player.curLineCount++; - + if (JUMP_AFTER == 1) { + jumpCount++; + } + else if (playerState.curLineCount >= JUMP_AFTER * (jumpCount + 1)) { + jumpCount++; + } + if (!isRival) { + totalCorrectlines++; + } const line = fixedText.split("\n")[player.curLineCount]; if (!line) return; const lineIdent = line.match(/^\s+/)?.[0].length || 0; @@ -381,7 +711,10 @@ const gameScene = (params) => { player.curIdentSize = lineIdent; player.curCharInLine = lineIdent; - player.cursorPointer.pos = cursorPos(rival); + textboxText.updatePos(); + player.cursorPointer.pos = cursorPos(isRival); + cursorPointer.updatePos(); + rivalPointer.updatePos(); } function rivalWrite() { @@ -395,58 +728,89 @@ const gameScene = (params) => { } } - function startTimer() { - k.loop(1, () => { - gameState.timeLeft--; - timerLabel.text = String(gameState.timeLeft); - if (gameState.timeLeft <= 0) { - k.go("endgame"); + function shuffle(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; + } + + function analitycs_calculate() { + time_text.text = startTime.toFixed(1); + if (startTime > 0 && totalCorrectChars > 5) { + actual_wpm = (totalCorrectChars && startTime > 1) ? (totalCorrectChars / 5) / (startTime / 60) : 0; + actual_lpm = (totalCorrectlines && startTime > 1) ? (totalCorrectlines) / (startTime / 60) : 0; + actual_acc = totalTypedCharacters > 0 ? (totalCorrectChars / totalTypedCharacters) * 100 : 100; + + if (isNaN(actual_acc)) { + actual_acc = 100; } - }); - k.loop(rivalSpeed, () => { - rivalWrite(); - }); + wmp_text.text = Math.round(actual_wpm || 0).toString(); + } + + } + + const BUFFER_SIZE = 60; + let eventBuffer = new Array(BUFFER_SIZE).fill(0); + let lastSecond = Math.floor(k.time()); + + function addCorrectEvent() { + let currentSec = Math.floor(k.time()); + if (currentSec !== lastSecond) { + for (let sec = lastSecond + 1; sec <= currentSec; sec++) { + let index = sec % BUFFER_SIZE; + eventBuffer[index] = 0; + } + lastSecond = currentSec; + } + let idx = currentSec % BUFFER_SIZE; + eventBuffer[idx]++; } k.onKeyPress((keyPressed) => { + const curChar = fixedText[playerState.cursorPos]; + const prevChar = playerState.cursorPos > 0 ? fixedText[playerState.cursorPos] : ''; + if (prevChar === "\n") return; const correctChar = fixedText[playerState.cursorPos]; const shifting = k.isKeyDown("shift"); let key = keyPressed; let errorKey = key; let isCorrect = false; - if (key == "enter" || key == "backspace") { - return; - } - - if (errorCharsIndexes.length > 1) { - return preventError(); - } + if (key === "backspace" || key === "enter" || key === "shift") return; - // Setting key - if (key.length == 1) { + if (key.length === 1) { key = shifting ? key.toUpperCase() : key; - } else if (key == "space") { + } else if (key === "space") { key = " "; errorKey = "_"; } else { return; } - + totalTypedCharacters++; isCorrect = key === correctChar; if (isCorrect) { + if (!settings.mute) k.play("code_sound"); totalCorrectChars++; + addCorrectEvent(); nextChar(); } else { + if (errorCharsIndexes.length > maxMistakes) return preventError(); + errorCharsIndexes.push(playerState.cursorPos); errorCharsReplaces[playerState.cursorPos] = errorKey; updateDialogErrors(); nextChar(); + if (!settings.mute) k.play("wrong_typing"); + totalIcorrectCorrectChars++; + } + if (!playerStartedTyping && (totalCorrectChars > 0 || totalIcorrectCorrectChars > 0)) { + playerStartedTyping = true; } }); - // Line jump k.onKeyPress("enter", () => { const correctChar = fixedText[playerState.cursorPos]; @@ -459,6 +823,7 @@ const gameScene = (params) => { if (playerState.curLineCount >= curBlockData.lineCount - 1) { return updateDialog(); } + // totalCorrectlines++; nextChar(); nextLine(); @@ -471,7 +836,7 @@ const gameScene = (params) => { playerState.curCharInLine === playerState.curIdentSize && playerState.curLineCount > 0 ) { - return k.shake(5); + return k.shake(2); } else { prevChar(); } @@ -492,8 +857,7 @@ const gameScene = (params) => { } }); - startTimer(); updateDialog(); }; -k.scene("game", gameScene); +k.scene("game", gameScene); \ No newline at end of file diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js new file mode 100644 index 0000000..c5c4f05 --- /dev/null +++ b/game/src/scenes/selectionScene.js @@ -0,0 +1,379 @@ +import { k } from "../kaplay.js"; +import { getMute, saveMute } from "../systems/preferences.js"; +import { resizablePos } from "../components/resizablePos.js"; + +export const settings = { + mute: false, +}; +function isMobile() { + return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i + .test(navigator.userAgent); +} +function escapeBackslashes(str) { + return str.replace(/\\/g, "\\\\"); +} +k.scene("selection", () => { + k.loadSprite("icon_05", "/sprites/icon_04.png"); + k.loadSprite("icon_04", "/sprites/icon_04.png"); + k.loadSprite("icon_03", "/sprites/icon_03.png"); + k.loadSprite("icon_02", "/sprites/icon_02.png"); + k.loadSprite("icon_01", "/sprites/icon_01.png"); + k.loadSprite("BG_WPM_IN_GAME", "/sprites/BG_WPM_IN_GAME.png"); + k.loadSprite("BG_TIME_IN_GAME", "/sprites/BG_TIME_IN_GAME.png"); + k.loadSprite("SilverDevs", "/sprites/SilverDev_logo.png"); + k.loadMusic("videogame", "/sounds/videogame.mp3"); + + const commands = ["about", "github", "start with sound", "start muted"]; + const fontsize = 18; + const boxWidth = 800; + const textY = k.height() * 0.85; + const underscoreY = k.height() * 0.86; + const boxY = k.height() * 0.66; + const boxX = k.width() * 0.30 - 10; + const boxCenterX = boxX + boxWidth / 2; + const arrowYOffset = 0; + const buttonLeftX = k.width() * 0.35 - 40; + const buttonRightX = k.width() * 0.6 - 40; + const buttonTopY = boxY + 80; + const buttonGap = 50; + settings.mute = getMute(); + k.setVolume(settings.mute ? 0 : 0.5); + + k.add([ + k.sprite("bg2"), + k.pos(k.width() / 2, k.height() / 2), + k.anchor("center"), + k.z(18), + ]); + k.add([ + k.pos(boxCenterX, k.height() * 0.50), + k.anchor("center"), + k.text("Get faster and better at technical interviewing", { size: 22 }), + k.color(k.WHITE), + k.z(21), + ]); + k.add([ + k.pos(boxCenterX, k.height() * 0.55), + k.anchor("center"), + k.text("by practicing typing code.", { size: 22 }), + k.color(k.WHITE), + k.z(21), + ]); + const title = k.add([ + k.sprite("WPM"), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.25)), + k.anchor("center"), + k.z(18), + ]); + if (isMobile()) { + k.add([ + k.text("WPM is a desktop-only experience", { size: 32 }), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.8)), + k.anchor("center"), + k.color(k.YELLOW), + k.z(18), + ]); + return; + } + isMobile(); + + const outsideBox = k.add([k.rect(810, 260, { radius: 0 }), k.pos(k.width() * 0.30 - 15, boxY), k.color(k.rgb(52, 53, 54)), k.z(20), k.opacity(0.3)]); + const outerBox = k.add([k.rect(790, 230, { radius: 1 }), k.pos(k.width() * 0.30 - 5, boxY + 20), k.color(0, 0, 0), k.z(20), k.opacity(1)]); + const StartText = k.add([k.anchor("left"), k.text("Start with sound", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY)), k.opacity(1), k.z(21)]); + const muteText = k.add([k.anchor("left"), k.text("Start muted", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); + const gitText = k.add([k.anchor("left"), k.text("Github", { size: fontsize }), resizablePos(() => k.vec2(buttonRightX, buttonTopY)), k.opacity(1), k.z(21)]); + const aboutText = k.add([k.anchor("left"), k.text("About", { size: fontsize }), resizablePos(() => k.vec2(buttonRightX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); + + const button_muteON = k.add([ + k.sprite("muteON"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(1), + k.animate(), + k.z(50), + ]); + const button_muteOFF = k.add([ + k.sprite("muteOff"), + k.pos(k.width() * 0.9, k.height() * 0 + 5), + k.opacity(0), + k.animate(), + k.z(50), + ]); + const commandArrow = k.add([ + k.text("←", { size: 22 }), + resizablePos(() => k.vec2(0, 0)), + k.anchor("left"), + k.color(k.rgb(3, 255, 87)), + k.opacity(1), + k.z(22), + k.animate(), + ]); + + function calcNewTarget(input) { + if (input === "") return "Start with sound"; + const found = commands.find(cmd => cmd.startsWith(input.toLowerCase())); + return found ? found : "Start with sound"; + } + + function moveArrow(targetObj) { + const newY = targetObj.pos.y + arrowYOffset; + const newX = targetObj.pos.x + targetObj.text.length * 16; + commandArrow.pos = k.vec2(newX, newY); + commandArrow.animate("pos", [k.vec2(newX, newY), k.vec2(newX + 10, newY)], { + duration: 0.5, + loop: true, + direction: "ping-pong", + }); + } + + let targetText = "Start with sound"; + let maxLength = targetText.length; + const letterSpacing = 14; + const fixedStartX = k.width() / 2.58 - ((maxLength - 1) * letterSpacing) / 2; + let letterObjects = []; + let underscoreObjects = []; + updateTextColors(); + + function createLetterObjects() { + letterObjects.forEach(obj => k.destroy(obj)); + underscoreObjects.forEach(obj => k.destroy(obj)); + letterObjects = []; + underscoreObjects = []; + + for (let i = 0; i < maxLength; i++) { + const letter = k.add([ + k.text(targetText[i], { size: fontsize }), + k.pos(fixedStartX + i * letterSpacing, textY), + k.anchor("center"), + k.color(k.rgb(128, 128, 128)), + k.z(22), + k.animate(), + ]); + + letterObjects.push(letter); + + const underscore = k.add([ + k.text("_", { size: fontsize + 4 }), + k.pos(fixedStartX + i * letterSpacing, underscoreY), + k.anchor("center"), + k.color(k.rgb(3, 255, 87)), + k.opacity(i === 0 ? 1 : 0), + k.z(20), + ]); + underscoreObjects.push(underscore); + } + } + createLetterObjects(); + + function updateTextColors() { + const targetLower = targetText.toLowerCase(); + + const allCommands = [ + { textObj: StartText, label: "start with sound" }, + { textObj: muteText, label: "start muted" }, + { textObj: gitText, label: "github" }, + { textObj: aboutText, label: "about" }, + ]; + + let targetObj = null; + + allCommands.forEach(({ textObj, label }) => { + const isSelected = targetLower === label.toLowerCase(); + textObj.color = isSelected ? k.rgb(3, 255, 87) : k.rgb(255, 255, 255); + if (isSelected) { + targetObj = textObj; + } + }); + + if (targetObj) { + commandArrow.opacity = 1; + moveArrow(targetObj); + } else { + commandArrow.opacity = 0; + } + } + + settings.mute = getMute(); + k.setVolume(settings.mute ? 0 : 0.5); + button_muteON.opacity = settings.mute ? 0 : 1; + button_muteOFF.opacity = settings.mute ? 1 : 0; + + const name = k.add([ + k.text("", { size: fontsize }), + k.pos(fixedStartX, textY), + k.anchor("left"), + k.color(k.YELLOW), + k.opacity(0), + k.z(21), + ]); + const slashChar = k.add([ + k.text("$-", { size: fontsize }), + k.pos(name.pos.x - 40, textY), + k.anchor("left"), + k.color(k.rgb(3, 255, 87)), + k.z(21), + ]); + + button_muteON.opacity = settings.mute ? 0 : 1; + button_muteOFF.opacity = settings.mute ? 1 : 0; + + let isPreventingError = false; + let previousInput = ""; + let lastErrorCount = 0; + let rawInput = ""; + function preventError() { + if (isPreventingError) return; + isPreventingError = true; + k.shake(2); + if (!settings.mute) { + k.play("wrong_typing"); + } + k.wait(0.3, () => { isPreventingError = false; }); + } + + function handleInputUpdate(input) { + + const candidate = calcNewTarget(input); + if (!input || candidate.toLowerCase().startsWith(input.toLowerCase())) { + if (candidate !== targetText) { + targetText = candidate; + maxLength = targetText.length; + createLetterObjects(); + } + } + + let localErrorCount = 0; + let lastErrorIndex = -1; + for (let i = 0; i < input.length; i++) { + if (input[i].toLowerCase() !== targetText[i]?.toLowerCase()) { + localErrorCount++; + lastErrorIndex = i; + } + } + + const maxError = 3; + const isTooLongTotal = input.length > targetText.length; + const isGrowingWithErrors = input.length > previousInput.length && localErrorCount >= maxError; + const hasAdvancedPastError = localErrorCount >= 2 && input.length > lastErrorIndex + 1; + + //check long and max error count + if (isTooLongTotal || isGrowingWithErrors) { + preventError(); + rawInput = previousInput; + name.text = escapeBackslashes(rawInput); + return; + } + + if (localErrorCount > lastErrorCount) { + preventError(); + } + lastErrorCount = localErrorCount; + + if (hasAdvancedPastError) { + rawInput = input.slice(0, lastErrorIndex + 1); + name.text = escapeBackslashes(rawInput); + return; + } + + rawInput = input; + previousInput = rawInput; + + letterObjects.forEach((letterObj, i) => { + const correct = targetText[i]; + const char = input[i]; + const displayChar = !char + ? correct + : (char === " " && correct !== " " ? "_" : char); + + letterObj.text = escapeBackslashes(displayChar); + letterObj.color = !char + ? k.rgb(128, 128, 128) + : (char.toLowerCase() !== correct.toLowerCase() || (char === " " && correct !== " ")) + ? k.rgb(255, 0, 0) + : k.rgb(3, 255, 87); + }); + + underscoreObjects.forEach((uObj, i) => { + if (i === input.length) { + uObj.color = k.rgb(3, 255, 87); + uObj.opacity = Math.abs(Math.sin(k.time() * 5)); + } else { + uObj.opacity = 0; + } + }); + + switch (input.toLowerCase()) { + case "github": + window.open("https://github.com/conanbatt/wpm", "_blank"); + ResetGame(); + break; + case "about": + k.go("about"); + break; + case "start with sound": + settings.mute = false; saveMute(false); + k.setVolume(0.5); + k.go("game"); + break; + case "start muted": + settings.mute = true; saveMute(true); + k.setVolume(0); + k.go("game"); + break; + } + updateTextColors(); + } + + function ResetGame() { + rawInput = ""; + previousInput = ""; + lastErrorCount = 0; + targetText = "Start with sound"; + maxLength = targetText.length; + createLetterObjects(); + updateTextColors(); + name.text = ""; + } + + k.onKeyPress((ch) => { + if (ch.length !== 1) return; + const shifting = k.isKeyDown("shift"); + const char = shifting ? ch.toUpperCase() : ch; + previousInput = rawInput; + rawInput += char; + name.text = escapeBackslashes(rawInput); + handleInputUpdate(rawInput); + + if (char !== ' ' && !settings.mute) { + k.play('code_sound'); + } + }); + + k.onKeyPress('backspace', () => { + if (!rawInput) return; + rawInput = rawInput.slice(0, -1); + name.text = escapeBackslashes(rawInput); + handleInputUpdate(rawInput); + }); + + k.onKeyPress("space", () => { + previousInput = rawInput; + rawInput += " "; + name.text = escapeBackslashes(rawInput); + handleInputUpdate(rawInput); + }); + + k.onKeyDown("escape", () => { + ResetGame(); + }); + + k.onUpdate(() => { + underscoreObjects.forEach((uObj, i) => { + if (i === rawInput.length) { + uObj.color = k.rgb(3, 255, 87); + uObj.opacity = Math.abs(Math.sin(k.time() * 5)); + } else { + uObj.opacity = 0; + } + }); + }); +}); diff --git a/game/src/systems/preferences.js b/game/src/systems/preferences.js new file mode 100644 index 0000000..244fe24 --- /dev/null +++ b/game/src/systems/preferences.js @@ -0,0 +1,16 @@ +/** + * save mute preference in localStorage + * @param {boolean} mute + */ +export const saveMute = (mute) => { + localStorage.setItem('playMute', JSON.stringify(mute)); + }; + + /** + * @returns {boolean} + */ + export const getMute = () => { + const item = localStorage.getItem('playMute'); + return item ? JSON.parse(item) : false; + }; + \ No newline at end of file diff --git a/game/src/systems/saves.js b/game/src/systems/saves.js new file mode 100644 index 0000000..c209a20 --- /dev/null +++ b/game/src/systems/saves.js @@ -0,0 +1,55 @@ +// @ts-check + +/** + * @typedef {Object} PlaySave + * @property {number} wpm + * @property {number} lpm + * @property {number} acc + * @property {number} bestWpm + * @property {string} blockNames + * @property {string} loadDate + */ + +/** + * @param {{ wpm: number, lpm: number, acc: number, bestWpm: number, blockNames: string }} stats + */ +export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames }) => { + const previousSave = getPlay(); + const payload = { + wpm, + lpm, + acc, + bestWpm: Math.max(bestWpm, previousSave?.bestWpm || 0), + blockNames, + loadDate: new Date().toISOString(), + }; + const encoded = encodeURIComponent(JSON.stringify(payload)); + const maxAge = 60 * 60 * 24 * 30; + + document.cookie = + `playerData=${encoded}; ` + + `path=/; ` + + `max-age=${maxAge}; ` + + `SameSite=Lax`; +}; + +/** + * @returns {PlaySave | null} + */ +export const getPlay = () => { + const prefix = 'playerData='; + const entry = document.cookie + .split('; ') + .find(c => c.startsWith(prefix)); + if (!entry) return null; + + try { + const raw = entry.substring(prefix.length); + return /** @type {PlaySave} */ ( + JSON.parse(decodeURIComponent(raw)) + ); + } catch (e) { + console.error('Error parsing playerData cookie:', e); + return null; + } +}; diff --git a/game/src/types.js b/game/src/types.js index b1ff784..8c0c2b1 100644 --- a/game/src/types.js +++ b/game/src/types.js @@ -2,6 +2,7 @@ * @typedef {Object} GameParams * @property {number} rivalSpeed * @property {number} time + * @property {string} userName */ /** diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..eed1878 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "wpm", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/website/public/favicon.ico b/website/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..96910ef300b7bfb7130ff226f02441d97064a122 100644 GIT binary patch literal 4286 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 LrJugUA?W`A8`#=m diff --git a/website/public/fonts/jetbrains.ttf b/website/public/fonts/jetbrains.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c93043de6454ad2d5575f0751150c6551d9c588 GIT binary patch literal 277828 zcmc${4V;zJ`u~5e`(A4|J*eq9O~#(RXKJb`(Uei6Ml(I=fh0_cW@@4+LWdASNJ0o9 zgd8F4k|Tr;Ax;P(2|Xc%oD-sl`Ms~b_Rer}e&6r^`~AKCdA)tsz1FqXy4JeZec$W8 z_skwKBGQomS;_2M*1J!W_3mZ~m+Te^+VvfL?C}r2P|m<0V*IJa$ZFRaWPUD`~$K z>>xnn0xnmn|+eoKybiewd!KYMg##;LDu6FIwp68fO)s5trUE~yNPXAu~Z=M`bUG04ccbkH!n0r6_kXo$+q9aj>(B^Q6|39Q2 zZ7YLd;GZyn{5p`? zFUp$Jr=o4gK*x6sl%>*ooaPA9`{QWxwSLF_@W1J^uD|;Gp%r=Qar`Ge7Q32ca{Ncq zV^zPq{XgU&+E%nbUC;ZYFZqRV7^pve{)eR7P(3u&rl$9Y`o$Hg`gJtDZvQ7bgm#n@ zAuEN(Go7xLN*{uzVo?3N{xmKchsqkXBz@GMpy$FZ zu)k~N{$l*UnU_nye_YRctoi>H^t`W$j-}{N*xz|pfbE}AW8SNGv99)mXzcYm_(x74 zFOB+B`Un0iWBcEnXC1rxq36)U@EB;kb?$V{q_63!YMZ`CaXv{tq|dkX`P7g+z4mKe zElanf>vOq<(0<4ym-}^#qMk zI<9)n84SA4|LC{+sBLP#`keMV?WgAJwNuXNw=Zb2BjIK=R{n6`} z`cuRtz%I;MXxLB zlg31k)kf3mi`uES18pNs&2v!eXt}EPoAycT)dQV7Juh^OI(OQJ*4Ox{YPrr=`dHU$ z7HC-&=(-vS>GHJd8qhL5);6_mUH^K`QD1c4(|)S0=BX;0pH@w4I}K9#YL_nWkV@-% zQor;#-H)c#whWF3J@2}w&^6QrN>i$7wbPhs9ko^eG<^l!3^&3wm;qP8RJaZg@TT)s6VBiLN%*-ibu-GK9A?|ne*_8tN&gYw%DL<|zPoa%nKcjuoIh1b%`q}djcq4_T(`?0V7JhO*q-}Pc zOL`0WjD2r_&O_?}KJUVQH*wp0vS)Y9+iJhN9dmREQ~`C8bEekp_!jgUcCSzCdQaYS zG`8$blWS7DD-PddX ze*90`lK;E9HIB7TO`CmfX?uE}sHWk#dYeb{(rMMSO**e;dChdvb|v3s9f5J@ysJ zc3Pr}_Ol$ur_i+8?T6&Ku5Ip*uH-A)CUujx$C0LeJ|jrJm#co5<2q38(fvd+J{r3k z{iWAjvg}97BA|XU=488i&Hpo)&*ZbMwx@H~9v+9O?5iw$s-5h$osCIsx7UXPU{|gFXvMFc-JE+8GWy ze$HLpyX?Dm3TZw62Bw}DR4jy$>(dPyB|o#%<522|aBS;;#|ME6_?WMjERX}_5II6F zHHVtZ%q(-Wxy#&V66P(l+PrJlm=DZav(BtHUz%^skES}v3OWae2g8DAgJr>M!Rx^% z!M}o^LmSo$8-$I*tS}zthehFE!b`&$;mmMWcwhK%mt^=wNUx7}>1J=Tt} zBke8rF8hF8WS_Rr*^lgJ_AC2iov*X6%DyN2m#B%>jb=uhM4Lrp(cEb3Xs2jlv|F@i zv`=(m^up*x(J9euqYI;tN0&sOkG_}_vJ6yq>cr=i{8uaz4-5n)7w6UaWDfX{==|JC+w~A3Gve9P1G)jrEQl z9UBlE6dM{lDK;i{UTjM2+Snbj2V+ZOOJmQ+R>WS7y%BpWwmP;c_Cwso>&9Ee501Bv z=f~T}FN$9mzcv0?{H^%j+??FpyxDp8=G~X~Xx^&4xAWf5`y%g~yzldVYCWO#*{!c> zeP5f#ZJM@e-ll7tbK1;qb5EOB+pKT%O`D(FHf!6z?euoiF4Dey!~Gkc+&gM-b@j>B zr&RB$t|poX@abqL=_d0`p}8>`sd?rJ^X4BS^@aJ`>@d577Qtc3NIgTOUL{g%laZ1z zvM*A3Vb^dHk(x%NZU}D*9|#`_7lm(x?^|Q*+bo-FyW28*oITafvUl41?c?@u_F22u zuD4t44k9&`NX<({sxgsjk&4t|(IcY8(J~@6DH*A$(MSIfsirvx)`--MoLM<{6RG=i z9?W?-6{*!k>Qf^1C6SU?eInI@NX27qVukx6)puW{M#j#FT@YDOx2lJj#u@k;&+x>jH0Q`McTkFTCuJ+1n(>PxFH zNfjq$?}vNuy>~+01olbMwu$w(uGK=8kH=>E=y0Z~pt{Gd5Li&f1*4 zx#{KuHisMMZM<{KsNg_nZ< z;dmQptCp8<)@tgvf8oyX*Kl{Z*ILWf6PpZQ=Iv}9+vqpjR7riTT4-ATZ)3K=cCvj) zjex7|T)WsV;XGPqU$86et9GS*!>+dLC{s55)|%svsQ=s?xYNzk^#1>)Eq$q*>aK9J ze{bog)5Z;{@)_=ajvfJimc$X|RDNP#YN1=|-f(ZZ_3odV7YQQ7G?E&5Boe6?Vbqak zkz`~dts<=U2y+=(8F{N#X06nWWE5tMO}F^(n!&x8AFLVT`S5tFj^P<$x9}BP zDjVJEkQxVDrm$&oxM;=WcQrE;tsC&$Y$ z87>uakxY?Gmb%1v^!JS-QR{_>W*Ag{`MvP#~S zHL^~=lTGrud}A_1_fTWa>&kPP)OSfebMXO(Pj z$^_F%ZsX^eYRfD9#L`ariz(uM`;#0f@5=?In_O*_{TAI2ac`8=MiG8H^9k3eFB@1rvjF zg4=@IgE_$s!7ag!!Og+!;HKc#;N0NO;I7~f?&v?6RpvYMt=VpVF#lxlwaxsCz1Rl! zVJpq+<_+@?c4%*#ci5x7$1d%Cv(aoaTg+zjx%t9;#SUPr`JP?Ck3l`&P1O$?1dW2m zLDQgF(42k2fk7TWZIvIi3EBqjf(}8)pnzRnQE)`iB1wGkml$briQD$$@i~V6~AVFDRg5E(8^a;YC zZ(xId@>g?~JYde02h9X&C~rz*KH;bV8#&Fi zmD5c-8Ee|h7?Uq&nL}lw=`81%LOIuTk+aQVa*H`xZZ)UK?PjFhVJhWLGfM67Kc5xP@{DYj1dxh)9S+77l^_=_DBuCX1%_2H-XP&+z&$ClV0;b-Aj+>xTT zw(V(KhF{tScDT*92Zg)1TfNIpJJTLu8`}Ee&*3&(%x?Qgdonxj#LIgyUyL@u5lCG zneJXU*4^%|cDJ}$+^6n#H@n;1ICr5t*WKV|xXJEeH^(h-=eRrEweBHzk-OgA<<4_| z;jVU;dyxC!csJes)lGEwxy#%c?gDqYd%#U`XS+%65qH14$IW)Py7S$9cZr+pu5_on zi`}Jenmf&HaPPauy=uFPe-hOXGPa=qM0*Wd1RBV5$=aR<7dcCQ=kdb@*NGnelI*Vcu0 ztKH^|{iprXiT%NT;mY07_8WJS>u0}qRqkZ_y&LU@+wW|(-EKd3C%V4&D>upwv){Uy z%W-j+>)N>1F3%m}y1LG;ovZCK-2u+JPVR75$2I2J;ZC0Q=GwdMJ@#HZ&)#Pru@Bn? z_96RM`=Fg~ALSWvseOj0!FTNY_7l6&zH2|QpW0147k+Htvmf$wxY@4Z*<%CG9_x4l zSz%vc@AP;38qbc)?MwFAaA0^$I3OGp9>;$9Z{aiHlJM#9sc-SG_ zEIJ^?aj3qnP>zQ|a10CswNolUcZbSFpmo?MvUBrwwBF?~G{vKI0NLY=2mJfV*1RF93LBR!$oR(RMe3VSin^XMoT4Ie;Nicion zDK?^~!RfFAba$-mhH)u)ZW3K{V04}88UmAvj`tXzZ1l|%Kc6i|V|2F1#L$TzL+s@o zI2Rj@`FS3r@tou_8iT)hjLz}-Z~^w}%VfBaw6?7=0K+jq5uPN}wV?3;r{~Tko>14t zr5>yP%=3gVq8bkf4?*wugfF8Hc*1|6^F84T^g&PfCi+*8({?nL;GRYocp_8Lhdpj7 z`iRH8iazQIH4Y0sHV1vo6Y3gy+~b}>pYTLxpb3wA4%Kx7_F!}|Jjqxrs^5!Z@n)0z5;A zEKku0{dH=jPIlviN2fSO!U1JmFSujqtW+MOh!LQp=2PiLfiPJ2HQx3$w0sL7=vp4@5#65_7pm%A3P=p{inxt zME~V6x~_J3jK=pzkLiy7q6%% zIcEo>wLQ8Pcy3K1QM9f{*9XtENq8zwUZa!OY1Wjf@6r7N&$vl+z38<&dHv2s8+vr@ z@C2NMCu-4adh)tXe0VBOqWcJ=V*p)8JS8X5`#(?3Ns{qyK^k}(7oMP#Xl(V~ki0+S zqgftZgFIpT-n)iHp^%4BPd7TVe&j0TU|rRb#xS}V*`yp&u2+=AHZ{)N9VYmNB0Um$9Xg+thwa6>y36up=*J) zn_Rzx&_hya+;qM`_bEIFdN|}+Fp2Incqa5{+`4*n&%wI~;T?dF+Yu<}zJqrG9*vdG z7wEo&_Y)qCkIpaXzC_n_5{;qGBj_H*l%&uY>b!vNS$MbM(Rh}6bkCyq?<5*S9Y5%v zg?Aqwjay%j?rV5A;?dY1o#G(0zeo2ty!-G(QJrhhJp%7gJURy&8_+!t?^rw~l|4DS*I(HybQJoh>$E|Y#av3@-h0e`zk6eN3 zyeK*!I%bfoP@NY==Rn5^G7TM>Lg%T%BUhr8DReG%oFFsN(J6G?RUWwx9g{-m<}{DY zKu=Gh^EcKb^U!fAH17M@@Lfaefky+@36gq!rdE{R7>=fG1M32lx&q<*^p6ii& zP>qeEK5AS+_gTE-@MxdsdvxDqE=ZwmO!nv=O80-sJ>X*Wq8eOG8gviD+qB=fgf!?r z$!NS4wbfWEy6$fD@b*oNjv06lC+22PxDvf9MN@R1NB6(xz7(C%Cp`M;v`M5O-sVk@ z{zjsC%cFZ7vpPkHzMCQsU6W!c`aud^Yim>Jx?Gn+*XH^Zx;DS?=yRC)(v!RweoY#5 zuWi0bQH1XB=rf%8(WCcOv)jX4M=^Umy2mklJ;^}ZRf#4ZWg!L9Y>xr;dgJqrw>n(T{USm&t75cg- z!g>psHzjfn`jIDcIl9ghA@0G)o(Sh!zk2WG)YeLSCB+sFYS&6WgL*`V8 zEJlg35~%;oX%b=*GLPX5@^v1VM@A6-q!b+4QK<8p3^oH8dG;A+60=CW*oK|v?TowO8oVmfx&m13&h@R zL|c2z7PO7WY(`lZwk95cNkJ*ZL@R;w>j&KMzJJ3$hnYmKm3!w{X)}!qT z-ALn~?GB}+)vq$>O&Xu{U6>MR|9w4y`qdAPCLf<{e;7bo`yc2D)UQDvy?)qZ;8<)} z)0Xw51UffEJOO^#<2`}S-%yWUhwKTS;865LD5tKDV;Br4%{cAJ9=$%<5gxs^S+4I& zpmRLZ6EJsnmPfDs_9joz5WU%BenxNc1Uff&ddyDrE>BR5-tRHLpbvP0Bhkk_=2!Fy zPtXHRc+4(zktgVh{>`J;b^Ej@C_$g~=r!Ix=LwEN*Lw7NZ$I(`y-==;ieC3E*G45E zuJ%(8r-RtfJb}hp*BJzQ-sswbfY{qFJOLG~u4xE#E$BLfAVhWjL7?kmhbOS;j~+hL zkvd;{^tzTk)uZoevM=}Oo+bMVkG|u{zS5)no$P5IeaDl1l}GnG+4p$l8g!mVh+X!5 z9({L^eZPlKktAE&1$i5t@8Odr$<}s3-&tgp_tS%6d@r9ZdFOkJLh+^vKKT z5)YqzN%m77eJ_*E`ccH8tRF?+>trwW@Clh@KjYEo{%qEj!l!1E&AL+b`9FJ^hfmTZ z`+1K(_h-N0(f8BYFM9NyMD}uzzMsz4{y^VJWa}6}-&JR;-=Oa&vej3Rj_4~MeOHnF zsz={>XKOq_-*aT^+=0Fu&enK^D97{FnWfN5-RX zd-VA)d$mWZ(04rg%$fbJN8iO}zvt2C&g?ZFIURl9qtBq(A9!Re`k_akN3%Ik6&Zta zo+|n*o4wAX?`N|=_ULnGHs`J)6H(4xh0i1uXe0@XDK`u;WhUmkrH$>utv=sVi%A3gf4 zlKqoM-_d6O?9u0y?42Ir9LxU2qt7c*;|W>s(Yl_H^&ZXigv?2_F*IRsF$`_y2{|vK zE#N@%8E>?uCuFXoS)Pz_MO(o^*f3YoY)^P9dax&Cy+xxQw;av!IL?`9%o7s#Xs##h zj<)uMtmkMak39k`Mh)wVWN*t765gPNjXHn)> z(Px*OjvluHE%E5SA!mliRioE=++K8+$6kQmqO3H9`_~6wMDVh zP(7yH-iUJDP~0XFLXpIdL5)ZE^s&IB``1|L38@pa9ypOwnv`{VsTHn9@S$AneUj68SJ5G8)#3uHCpJg zqtPy&kQm0gdMxWY#`R0FJyzTnM7drlj6)3MF)Bu=WBeB$IU>G z@wmyT#t+=XsKyN39F%iIaSKq5E4Xt|jU~7{P|hXAU5j%5EAAomM33V-6z5u?xa-k! zkK;U!5A(S5(BU5U7xZM0n~IL`xUU7 z+T-p+t32*9RM!f)GtkpK?gI35kGmYzxPp5C)p-Xu1=Tv>&PH`jfSZJ>Pv9Owb=`ow zAJy@Iy9d=e_~mA!I=|q~M>T%n=A$}C;4VS6U2t`m26}yBO6NgS!;f z^#N`gs<8p5W7YV9+knpSxcAZPJnl90R*$<1)%bzF+l#9otW$d!s^bBBII8EvJkniI zoofhxLUsJiU$_I+v4QQ6YFvqx?T6|bg7BZ{0#En@`miV5j_RC3_!0W3N8cO97kX@O z^f8YuL*MeauhCtwoAG{+?t#6e=_^+}?mN^#K>n|22$uARsPnjWXvE_dqqRKl6*R-+ zoxpPT^*rtq^Z<{09j)(iJJALn_cNO5ac`pyJ?>q!k;kn;8++V) zXcLcn2W{$c+t6kn#~kD~_c-P=w}r>8L=W`1573q#$K2&+K`Z9uWAq@8`xMRgxF6Aj zJxr72Mm_EqG{@ssqj8UW6(s-kHHb2ycDhjX=0>U<{?k}0L$9W z({{mWKg39J1t>96ENdx`7%BSxGLIN3PJJXsitC2zc)*>25+lVOixMNnsVy;5+z}`- zQrz(wyw4#Z{ujOL51b#7nWPu{`3XxKmN$rC8QUUd-c$qQp*d z>PxQ29f{_7Tm{&iFW=)%LEC!lF0`G;4ME#`oQ_-P5uD~}48ZAFJ9=CR zdWgre#_~FO?7vWrF}PCnFpp#Wd7V8@*Gr+t6`@@`PUo+y#~pAZILIAWhy>~X3(N8mIjJv^=#+SB7kqB`qkez>Pq4Jm8|J_6@EN z+S}t;6M1?JPTTJ5v3t>e9yb_0+T*mI_6Lr2kf&nbe1^G1N5* zE=09muv<}`FRUstHPgK_v=zIS>UH3p(B=1Cz{Q*76qn{Pzm3y4(Fptx5 z4ENY?(33q*>*;)f({byX1N$|q>l<7Zs`Cy`>s5H{_h_ZZjYda#oc5!~V827PKG zjK^+APxIK%(bGLn$28XCG$!Lb`q@U_86Kzooau2ozVROWEjq#DV(3{OmxG=S6Y)Qe zp5t+C&~rVmHF}=M<)M>2?hy1Z9;fU5e2>%f;{uOshfemm+USKImx*5FaR;Cmdz?k5 zcw8s+5|7h!=u(fXgI?xwjnSzddp~+POlLmtM6dPON6;A_`!IT)$1Xr;dhA2!^&b0I z^ahW85WUf3=cBVc_EGdExP`u+MrV8M1L&=AFZm16d2k=;m8kkbJ^Kc_*kj*8pY+)G z(Ip=JJS^`ikKKs=&12t1wLh>Qpi4dWQ}h{+-Gn~tu^*w&dF;pNGLL-^ecod~L|^dO z&(Ie=b~C!%W7nX6_t>@QOCGxcec5BTpesCf9r}t#Kj+JP6_^97<*$3Jwx@Fe_BHe$ z9;^PY@>uQvEsxbc-}YD?pZdg{Sslk09;?253Ez;fZG7*sI_{r5mhrXbTu>qv=-Hk~ zC3=m=5vSJk;6Ba^;@F0Drntw^rXKeM+T7z3XjhM0gmQi<;Xsu3mGBsJq9+`Ha;_=i zAe8l^*jv!Ka1UwCV-A(@IFvb5!l5X0s)XO8j9m#?BW)PF60#QBZ1sdo(62lp>!!`u zo{;s`hIvv#)=`@u;b;22U8HR@k1a*}d&2Kf=BMp+>`&PDDiJ#CknF?`NJwsi_SQqJQ3toK9eCCGJ14;R8~$-LWU)zG+staQd-fgL&6j! zq7|ogNCXA(oOn)$L|725dNOR%RC<*r8ka^ZDtavnnw0ihloysJg3_UrqltQP5~Y<@ z2|IZ5Vt&bxW)eALTIFc&;`&WZuU1i#@m`A?o5qyI6Ee7b%&^7Hj9PX`*n&jZKGC$a zT>DEjD=keKWJRl@iRFV6w)ODE`R0Jq-lKabBE8FV5@Fu3At#q(oHe67nixEotde0_ z(L|A^iiQn~F7noRluuUbD4OV`<(<@W`QY*>voWJGny53lyn>vlmetWzS50-T$f_7N zY*-evm8e%bIw3>K6EZ-Jb2!c#kjU0l_JGQznKD`}mO2?VY*>iTA2Z1fxz%n9(?rsMW4RqIN-4y{*r%tc=10e@iNcsYyjy z(%U)(i)+`H(%!w=r-ZSEr8r0-uOO^&C5zWHMw3mc7 zURmb5IN(pJCvvGp<$Xh|S*gCR|9Gz_58%%t^d>}E@tk4pSi}tq76n1?L{(*3heT!p zLx@Hb4NCj#$Vd>OM5Z1M;V3g1uZA>~nVgg;b1)jm6Aeo%qBAO@iH1yDheV@-0Yl3d z*{ZT(xrqbD#3y%1G%gr$T={_GeP&h;`HhqLO$ruCqtX+~7d2{BnlP2U5)IqyDaX?4 zwWxvqFO&ZzOfzB;<_#`iq~{^i)oTV3rrXSRIdQ6`)2s(A*D9RJS~`r8^u_VI3mScy+Vd)SrsvqgCD=u+pyG714?Oo1AQKQ(o#`OG|O<_T_OVaZ$ zwC3CC{qL6vu0H$qR`aD9cXIxf^@tZODl|=XtX-K82C&~c6`U-UMI91{7j$f1+#yl) ze=}uakH-86LL|-dq8+1s^^(BU9zA15-*{gxLFL@|xax98Dl(>N6K1#@*RE!X=9pP7 zr+G=UMfIdtqHbyXF*7>GqtW6SwAualX3>tmy+kD5D{UQ3ROmIOx^iZj_WrJ9ODn24`M9Zav9qO>S)?n5aeeq>ol0Ee z`XBF8S(Fv0hdzuGN%lf}`{@Kn^pYImB0?}63ywR;A3UMOO1)dD6CwXkT}glIi^Wo$ zo{K0RxYnt;h!-V4odX>?yG z5|KQPj;3he-o*#;-&bBmJQXdj{2dZK)4e5UKNYSD-QfIj$mtN5aQ*10v)CumytI69 z7WdR>@vx4II+-S%w@3Z1bV%0V-<9_IU1_>*&G!CSqqHE=t$j^{bft8MWd(`u?Psw3 zbdAm6O#d_A2x!MdCtU2E9I`Is)_&$I*`W3EL)YaT=S=I!ndb-8r(jVX?lrpllPmwf zx1{^-Z-M=PS;acvdL1i{7iHztST8xlQhxU30^F^AdRF>z)V+O<#!TlWHJW`>a5PiU z)Sve3PB_CGcT9BUEbsp(`2%RqG-;eT9Gig!i6f9fI*YxT?r0xw!s*#Mra%{TVi41O zYyr={eMk%@VKi}E!D5rl8A2kNbG+L0rD&+yXyOF5(Zq>rqluFWc$Sb-Qstz$x04!H z@TBp1!%6wPlhw{>=?Jw;rcP12Wa?D4OQuF@pS>}w&^|R$seNibZyuVs zmksOHK9Mmd5#|n_oW7xV5FP+m4q-cKZs1<$ANeLOl3KlZzCP;E94GDcprqb0e8EQ7 zjMf<~YPmY8tRX@Fphu)**QnKVW(7<&hHJOV-7#VXqgYWZ!?9_l$(x z(--BM>BsT3Fuh!ltI8JT>+#YI@flJ!ENf94&3ZOtsu)``ee}?zB?bDgq~745Ur-du zkF<2Ie!Hcn`l^Jzo*Q}DlddWvWjqW2xBgusm+*T@6M}U-AGhY&dtk7IZ#?Z({d4s| zN`5O_SEF=GaL9iu4;!WGpCl*AAihJXd-cVpr22f0lE+~Wb7@#=E=>7Zg|2~ZoV^xW zK{4?5!;FV%Fc;VpnN@&YfL(xHPzVEoHi9WI8y510p&wMhWZ21@j!dAwzRlK8-`!N+ zPRs$`R76&a)G7ki4I&v6fqpW!z;2P+O`rhEfPQMzPi^|CO+U3)z9RKPUYBGPCC&|V|jYeajEX|FN;Hl8oiBp*tk945kaSOC~J z!M+LhO|fqpg(4UXyG5EcfdVK4+HW=qXtNn@Hm?wAfp0CUV2Vgf+RJJIl(#B`C9n#% z0Bs$_@j)CP#PPwc0GorUe=x_CJWK;@+hW^p0dLK)VVf`QX`?;)bSVWbpcC|i3YZMD0J{S0 z3e=AJ9Wo&wN}wDj^26&3VFj!g=~M)RMGkEROJEgj5jku(KU~lFc!ZJ8v{Oia7wU9f zCUSTcOo7=zTZfZ>_7ZA_MmPL>h{Eko+AJs zdeTqNEg~iTfHq1d0&SOU;OdR-Q5+vN9Ttl8Y6bXNid`vvmCl7FKpSP#faBiS^e%*f zz&LtOf!TmvZ|r*0SMS~IXqrF)l)(sgFGVmI#==yX0|~&Fz8ly@aC|g<96c9ktN#vu zd0@H7z*&5e4D|$5D3NYLOwWU?yKE(*)@E_-!IX zEmXl2m<QlR}4xB4%kIjIG@0PypqwIb!6 zU?psTog%|BAs=XOxCQ(gPCvs3LKWc4aC{k#FT+=eoJ{%2l%Gub$&{Zw326Id+CF)^ z$cPLmfI0kP_+Y-ohPF?|cH{`awvzrU`#}XvhFP!xXrq!gMv*s)ywUhFn!ZNU*J$cj zMFG1pV`003E<1vGFSquU<*(-j>`Z|ZU&%uXtrotSc-*cz&3+TlnlUngh zw)k}ZJdq1%`+@}`lj-L|h4wC7$QRk<1MOTi8D_z5k&CAQ{aiesFSMcF6!I>q0BkOq z4zzb^E))X3Tsjoy0PSD86jt&J>XctrEHbqUCIMr(oW3rn?aMcaTu~0#T}k~bSMiJJ zbNMB8%C9Pdts+-X2im-v@m#%J8)VC$hFkDb{>CwmT}CO4A{=tEppvhSivu; zPXzL2Vl#6o(D(J@VVcMd7N~avz*Z|u_X3gdcPYPiY%!HjHHGH)_)d>?i17Z?xtaQ}L~Lp*)MV^=`lAw(Q=|!~jWDzWZ75u_I`Ae3&leBPgM`S_ z)Ln{yOBeDbLuD`@sQWDSo~5m4xAP@KbAi0)sQcU&*v%IXHGu-4&ax4F;m}~dTnK$} zk_c|d@=U;f`Feg4jk1@pOR}0T7Fx!a361BAgzCW*pv_ll|FvSkua%u(1z#M*+`Ud? zZ! z+Wm43zwnk1wEGopentM*)cYDAzMb40dJ=F4>ofWCg9uODW@ zLRbac__CdPPyhpAJj{fJunM;EOZWAl00zQ%mJ7Xrs0XXXgp*)4%!d_X>_FHi#udUeF%cd=BD2KQ z;?u}lTf}4x6;peOu+s^!Z!lL(W)q;l%q6f! zOhb+v4(1DXEG&ebVj7phP@oR`b<=n&Z(?$x0yu8MaZ~Cy#kN_onCAG{9KV~-hE=d$ zObgm&KWmQTKW8BR4P4Ea*WlwZv-q+a z+8c~-$Km^Nv^#|K@%VZCG9Ha-cj!*Oh=#ULoGs=g^4X`E@+gol-yvogb%vwtxy;Gb zJ(;#gSSSSi7%@-GDfM8Lm{TXGzF=mGmyQ#PJ9A2Jt@7c*rj?B>f`7VxDl zlwXRkmsa^NZMlr`Tt@w=^fz@dEE97%<(DU5y_hRXV5gWXv76RU%vDjC46DUlT?n&* z@@q1n0#=EcUIbf#{A;Oy?Ic(N_%Nd$41}3tu3IaHJ&n1Zer}+x8yMq_=q%d0DIaL( zrj>ko%uq46kblc`pv~E|Ih%U3X9IrRnh7Js+|~qU!93U|=JrmoM9iFAAny*^yMuan zY!`DUY4$AU&aGnZngZC*rR;7C^mF$PG4~V$dG}5dGq07H`|0EU)nXo)3M<6SFB9|N zcrkyC0`?Cr5VHWAhskF@VIEl}=26NXoe7jLEQf_+9%}(pV7-{f#{zawP&YAK%%Wl- ze=&VNNgGd&_pf)@8<-_)#XLp+-^l-43G5W}^kAUvr5rD%-ZS&WJUargeU7r{CIjPL zMmx_(f&QLPheY!%-XRUz# zH(0=a!%{IDvDrvFo2CGDH|GQC&9uLz9#p{sF`v`s=M}IJwu||qAIyX;V!kYcgqW=v zfX!CYU(v@`MKBF$>ucKj8oRG)`)iKBA^i>gZ6kl%MA#zc+ZIp-3t*d=?>Yg;-z^vO zeJ0TM_tf1Ug~_m9%nyYy9kz=3=U|}jzXZx*iI^SO?x5a|d9a-?I-=hnsr%y!F+XL% zK$r&0#Qec$jg_- zrUPwt#3F_5*$u>5p{~F)2&2;?sFw5ULe7dlVG<5JzBv)m2-9A%cg#>*m@5^!D-4gJADL8tl1pTc91E@Q& z32c{O5O(Y%f@5i8F!sllNHC<81jn}k#y6BcPnayhiS&Eo5(!SKf-Mr1qr;Sy5)AJL zt0Z905R5=i!S7Qo(C0|f6}f;9l^j=Ykzf>gqiAdNdI_qq9|NcDlwfQ<3C3kga7K{? zXHJ%2{B#K>PLxe}Z^O@i~Vn>1g7^9z8o$yS03w@EOC zvP-s0aOntGBf(|!B$!Is)K-A~<)klPF2NO55?o38%9#>Oqih;>SIw2+>P|p^*WkUV<6)dtE)4D#1+3XKs+-`dJd(Pyh=gxRJ6Ose2>s-nd1ASp$JKZX%y|5W&s4 zPzDJJZlSMRroj#gW>*2@m`(e)VS5{Pw_$hNN(pWsD*^ZIU=Ha!GbOldyaaPsNN{(# z1ozO!J@|63g#{AKn<&A3%-?<3-k%R8fG-bV`vBvZzg>dA7E18YG6^20orl*-@W> zh1C)~-3rFSDhZYjmEalLer6z0_AF)3Rsd~2R{-?&+zttrVZRLf=dpbr+vjHj{X9?k z^DALJY?t5#3oW1k=<@~Ie}TF$Oo3TIofj#85#L_aH1(Euf=Pg{e{TY_C3vX}sPocJ z30^J+@?OTj6@@Sr$bW@;ugnF~uMP!#dX+X`T>|*@Ds8{IoiB>Rr`K8lKD|}~*uI8O zuPp#F>RK*eb!A z*%G`@AMa!H0X}@NR)P<)`>+BQNU$~+iuV!9aN#DwXLq4Qq_!Md(y=xlc?M>n2sZ!; zPM6S_@Fd|cwv4o-%&{UFwIUAtu%U}IZ{N9LPQyIIpCM~F+|1v5gDKd%rU`%eb={uU z6N2u0X7Ei@f#}7x3w_j*OerX7dw}5vHc*%iV}r4DR5ZxZC4ZLX7?Ii;nAK|7uwkV3 zf$cjt?%X)uCSI#?=Qgcdw~0h*#h2dq%+&ms@_WuMsGAvvnRT_JMT<=H6^9<%sL`>V zXpFxZmh3P58=p5CGHOL`3P$ZWpTC({BY(HFi7eBcAfolOo$7;wF8r)?n@G}fUwis@ z0)Ojg_rCn+|0G}k&gK5>U;JJEZ~o5yll)t1F*IW>is=k zk1_YCk^fSS{4O=}U;bVGGyB@VA)T-N2l_d$pZ9yx`5ONk@t745=zVeeaG(7hzq6ma zFMp2a>pH5=4~}9THI;1XR&sb2Z&S>`M*L9502Z$`5jz&6FbGE{*HkT+UQ^ARQKf0q zoVL@ewr=OF=0}a}UN+>9i>*#UPNM@)?AD=2 z=Nijy-&nrh=d=Fp$lu2J?7sZlQ)A(MQ&7TK8t@~ZJxe$vCCmuI(|ISVBQ)xYM4o_2Am@LuWs#w7*I~rcvHp#IbHO0X&A3}y?JQiEw?P( zyY-6bA?Fna>&|@XtoO!0^%Q@C=v4J9*?%%7E$Ah6j&N4<8wUK{n|1ssYD>d*{wQ@zuyce!ieputg4*?j=QBrnq{zsrVN}}gVAU({u2Gh zXG{%n<#Xe3b*XTjS+)I9`JlR%8orhm>EW2o%FM=E#?12Y&@+y$dt*UKF_;XB>9S

^Q2@p_nJptvCyhdNtfUDv9XvP^J$Tq^Yf}I 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 s3n!(`lCJDArN|NmBd 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

Zh7cd=34FaGWy`SDvi)66*nbC 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 RXt+-ctVzYaTEQjd{{RH8A$|Y= literal 0 HcmV?d00001 diff --git a/website/public/game/game.js b/website/public/game/game.js index 71a4230..12a1341 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var El=Object.defineProperty;var Ml=(t,e,r)=>e in t?El(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var v=(t,e,r)=>Ml(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Sl=Object.defineProperty,o=(t,e)=>Sl(t,"name",{value:e,configurable:!0}),Rl=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,a=0;i>4,s[a++]=l<<4|c>>2,s[a++]=c<<6|u}return s}})(),_,J=(_=class{constructor(e,r,n){v(this,"r",255);v(this,"g",255);v(this,"b",255);this.r=Ze(e,0,255),this.g=Ze(r,0,255),this.b=Ze(n,0,255)}static fromArray(e){return new _(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new _(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new _(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new _(255*n,255*n,255*n);let s=o((u,d,g)=>(g<0&&(g+=1),g>1&&(g-=1),g<1/6?u+(d-u)*6*g:g<1/2?d:g<2/3?u+(d-u)*(2/3-g)*6:u),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,a=2*n-i,h=s(a,i,e+1/3),l=s(a,i,e),c=s(a,i,e-1/3);return new _(Math.round(h*255),Math.round(l*255),Math.round(c*255))}clone(){return new _(this.r,this.g,this.b)}lighten(e){return new _(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new _(255-this.r,255-this.g,255-this.b)}mult(e){return new _(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new _(ke(this.r,e.r,r),ke(this.g,e.g,r),ke(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),a=(s+i)/2,h=a,l=a;if(s==i)a=h=0;else{let c=s-i;switch(h=l>.5?c/(2-s-i):c/(s+i),s){case e:a=(r-n)/c+(rJ.fromHSL(t,e,r),"hsl2rgb");function ge(t){return t*Math.PI/180}o(ge,"deg2rad");function At(t){return t*180/Math.PI}o(At,"rad2deg");function Ze(t,e,r){return e>r?Ze(t,r,e):Math.min(Math.max(t,e),r)}o(Ze,"clamp");function ke(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof M&&e instanceof M||t instanceof J&&e instanceof J)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(ke,"lerp");function Ke(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(Ke,"map");function ai(t,e,r,n,s){return Ze(Ke(t,e,r,n,s),n,s)}o(ai,"mapc");var oe,M=(oe=class{constructor(e=0,r=e){v(this,"x",0);v(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=ge(e);return new oe(Math.cos(r),Math.sin(r))}static fromArray(e){return new oe(e[0],e[1])}clone(){return new oe(this.x,this.y)}add(...e){let r=b(...e);return new oe(this.x+r.x,this.y+r.y)}sub(...e){let r=b(...e);return new oe(this.x-r.x,this.y-r.y)}scale(...e){let r=b(...e);return new oe(this.x*r.x,this.y*r.y)}dist(...e){let r=b(...e);return this.sub(r).len()}sdist(...e){let r=b(...e);return this.sub(r).slen()}len(){return Math.sqrt(this.dot(this))}slen(){return this.dot(this)}unit(){let e=this.len();return e===0?new oe(0):this.scale(1/e)}normal(){return new oe(this.y,-this.x)}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}angle(...e){let r=b(...e);return At(Math.atan2(this.y-r.y,this.x-r.x))}angleBetween(...e){let r=b(...e);return At(Math.atan2(this.cross(r),this.dot(r)))}lerp(e,r){return new oe(ke(this.x,e.x,r),ke(this.y,e.y,r))}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}isZero(){return this.x===0&&this.y===0}toFixed(e){return new oe(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new me(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(oe,"Vec2"),v(oe,"LEFT",new oe(-1,0)),v(oe,"RIGHT",new oe(1,0)),v(oe,"UP",new oe(0,-1)),v(oe,"DOWN",new oe(0,1)),oe);function b(...t){if(t.length===1){if(t[0]instanceof M)return new M(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new M(...t[0])}return new M(...t)}o(b,"vec2");var gt,ae=(gt=class{constructor(e,r,n,s){v(this,"x",0);v(this,"y",0);v(this,"w",1);v(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new gt(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new M(this.x,this.y)}clone(){return new gt(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(gt,"Quad"),gt);function de(t,e,r,n){return new ae(t,e,r,n)}o(de,"quad");var Ge,$r=(Ge=class{constructor(e,r,n,s){v(this,"a");v(this,"b");v(this,"c");v(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new Ge(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return b(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new Ge(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new Ge(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(b(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return At(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new M(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new M(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new M(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],a=this.m[8]*this.m[14]-this.m[12]*this.m[10],h=this.m[8]*this.m[13]-this.m[12]*this.m[9],l=this.m[6]*this.m[15]-this.m[14]*this.m[7],c=this.m[5]*this.m[15]-this.m[13]*this.m[7],u=this.m[5]*this.m[14]-this.m[13]*this.m[6],d=this.m[4]*this.m[15]-this.m[12]*this.m[7],g=this.m[4]*this.m[14]-this.m[12]*this.m[6],m=this.m[5]*this.m[15]-this.m[13]*this.m[7],f=this.m[4]*this.m[13]-this.m[12]*this.m[5],A=this.m[6]*this.m[11]-this.m[10]*this.m[7],y=this.m[5]*this.m[11]-this.m[9]*this.m[7],V=this.m[5]*this.m[10]-this.m[9]*this.m[6],I=this.m[4]*this.m[11]-this.m[8]*this.m[7],L=this.m[4]*this.m[10]-this.m[8]*this.m[6],K=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*a),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*h,e[12]=-(this.m[4]*s-this.m[5]*a+this.m[6]*h),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*a,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*h),e[13]=this.m[0]*s-this.m[1]*a+this.m[2]*h,e[2]=this.m[1]*l-this.m[2]*c+this.m[3]*u,e[6]=-(this.m[0]*l-this.m[2]*d+this.m[3]*g),e[10]=this.m[0]*m-this.m[1]*d+this.m[3]*f,e[14]=-(this.m[0]*u-this.m[1]*g+this.m[2]*f),e[3]=-(this.m[1]*A-this.m[2]*y+this.m[3]*V),e[7]=this.m[0]*A-this.m[2]*I+this.m[3]*L,e[11]=-(this.m[0]*y-this.m[1]*I+this.m[3]*K),e[15]=this.m[0]*V-this.m[1]*L+this.m[2]*K;let D=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let w=0;w<4;w++)for(let x=0;x<4;x++)e[w*4+x]*=1/D;return new Ve(e)}clone(){return new Ve([...this.m])}toString(){return this.m.toString()}},o(Ve,"Mat4"),Ve);function Xn(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(Xn,"wave");var Bl=1103515245,Tl=12345,ei=2147483648,Yt,li=(Yt=class{constructor(e){v(this,"seed");this.seed=e}gen(){return this.seed=(Bl*this.seed+Tl)%ei,this.seed/ei}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new M(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new J(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof M)return this.genVec2(b(0,0),e[0]);if(e[0]instanceof J)return this.genColor(se(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof M&&e[1]instanceof M)return this.genVec2(e[0],e[1]);if(e[0]instanceof J&&e[1]instanceof J)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(Yt,"RNG"),Yt),On=new li(Date.now());function ui(t){return t!=null&&(On.seed=t),On.seed}o(ui,"randSeed");function ye(...t){return On.genAny(...t)}o(ye,"rand");function Jn(...t){return Math.floor(ye(...t))}o(Jn,"randi");function hi(t){return ye()<=t}o(hi,"chance");function Zn(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Zn,"shuffle");function ci(t,e){return t.length<=e?t.slice():Zn(t.slice()).slice(0,e)}o(ci,"chooseMultiple");function di(t){return t[Jn(t.length)]}o(di,"choose");function $n(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(fi,"testLineLineT");function un(t,e){let r=fi(t,e);return r?b(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(un,"testLineLine");function hn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,a=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,a)),s=Math.min(s,Math.max(i,a))}if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,a=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,a)),s=Math.min(s,Math.max(i,a))}return s>=n&&s>=0&&n<=1}o(hn,"testRectLine");function cn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(dn,"testLinePoint");function gr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),a=s.dot(s)-e.radius*e.radius,h=i*i-4*n*a;if(n<=Number.EPSILON||h<0)return!1;if(h==0){let l=-i/(2*n);if(l>=0&&l<=1)return!0}else{let l=(-i+Math.sqrt(h))/(2*n),c=(-i-Math.sqrt(h))/(2*n);if(l>=0&&l<=1||c>=0&&c<=1)return!0}return kr(e,t.p1)}o(gr,"testLineCircle");function fn(t,e){if(ot(e,t.p1)||ot(e,t.p2))return!0;for(let r=0;rot(e,r))||e.pts.some(r=>ot(t,r)))}o(ts,"testPolygonPolygon");function ot(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(ot,"testPolygonPoint");function pn(t,e){e=e.sub(t.center);let r=ge(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,a=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+a*a/(t.radiusY*t.radiusY)<1}o(pn,"testEllipsePoint");function Sr(t,e){let r=e.center.sub(t.center),n=ge(t.angle),s=Math.cos(n),i=Math.sin(n),a=r.x*s+r.y*i,h=-r.x*i+r.y*s;return pn(new at(b(),t.radiusX+e.radius,t.radiusY+e.radius,0),b(a,h))}o(Sr,"testEllipseCircle");function rs(t,e){let r=t.toMat2().inverse;return e=new Te(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),gr(e,new Oe(b(),1))}o(rs,"testEllipseLine");function gi(t,e){if(t.radiusX===t.radiusY)return Sr(e,new Oe(t.center,t.radiusX));if(e.radiusX===e.radiusY)return Sr(t,new Oe(e.center,e.radiusX));let r=new Ar(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Ar(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,a=e.center.x,h=e.center.y,l=ge(t.angle),c=ge(e.angle),u=new Ar(Math.cos(l),-Math.sin(l),s,Math.sin(l),Math.cos(l),i,0,0,1),d=new Ar(Math.cos(c),-Math.sin(c),a,Math.sin(c),Math.cos(c),h,0,0,1),g=u.inverse,m=d.inverse,f=g.transpose.mul(r).mul(g),A=m.transpose.mul(n).mul(m),y=f.m11,V=f.m12,I=f.m13,L=f.m21,K=f.m22,D=f.m23,w=f.m31,x=f.m32,C=f.m33,P=A.m11,k=A.m12,N=A.m13,q=A.m21,H=A.m22,W=A.m23,Z=A.m31,Q=A.m32,Y=A.m33,te=y*K*C-y*D*x-V*L*C+V*D*w+I*L*x-I*K*w,$=(y*K*Y-y*D*Q-y*x*W+y*C*H-V*L*Y+V*D*Z+V*w*W-V*C*q+I*L*Q-I*K*Z-I*w*H+I*x*q+L*x*N-L*C*k-K*w*N+K*C*P+D*w*k-D*x*P)/te,F=(y*H*Y-y*W*Q-V*q*Y+V*W*Z+I*q*Q-I*H*Z-L*k*Y+L*N*Q+K*P*Y-K*N*Z-D*P*Q+D*k*Z+w*k*W-w*N*H-x*P*W+x*N*q+C*P*H-C*k*q)/te,j=(P*H*Y-P*W*Q-k*q*Y+k*W*Z+N*q*Q-N*H*Z)/te;if($>=0){let O=-3*F+$**2,re=3*$*j+F*$**2-4*F**2,le=-27*j**2+18*j*$*F+$**2*F**2-4*$**3*j-4*F**3;return!(O>0&&re<0&&le>0)}else{let O=-3*F+$**2,re=-27*j**2+18*j*$*F+$**2*F**2-4*$**3*j-4*F**3;return!(O>0&&re>0)}}o(gi,"testEllipseEllipse");function ns(t,e){return gn(t,new Ne(e.points()))}o(ns,"testEllipseRect");function gn(t,e){let r=t.toMat2().inverse;return e=new Ne(e.pts.map(n=>r.transform(n.sub(t.center)))),Or(new Oe(b(),1),e)}o(gn,"testEllipsePolygon");function mi(t,e){return t.x===e.x&&t.y===e.y}o(mi,"testPointPoint");function wi(t,e){return e instanceof M?mi(e,t.pt):e instanceof Oe?kr(e,t.pt):e instanceof Te?dn(e,t.pt):e instanceof me?cn(e,t.pt):e instanceof Ne?ot(e,t.pt):e instanceof at?pn(e,t.pt):!1}o(wi,"testPointShape");function yi(t,e){return e instanceof M?dn(t,e):e instanceof Oe?gr(t,e):e instanceof Te?un(t,e)!=null:e instanceof me?hn(e,t):e instanceof Ne?fn(t,e):e instanceof at?rs(e,t):!1}o(yi,"testLineShape");function Ai(t,e){return e instanceof M?kr(t,e):e instanceof Oe?pi(t,e):e instanceof Te?gr(e,t):e instanceof me?_n(e,t):e instanceof Ne?Or(t,e):e instanceof at?Sr(e,t):!1}o(Ai,"testCircleShape");function xi(t,e){return e instanceof M?cn(t,e):e instanceof Oe?_n(t,e):e instanceof Te?hn(t,e):e instanceof me?$n(t,e):e instanceof Ne?es(t,e):e instanceof at?ns(e,t):!1}o(xi,"testRectShape");function vi(t,e){return e instanceof M?ot(t,e):e instanceof Oe?Or(e,t):e instanceof Te?fn(e,t):e instanceof me?es(e,t):e instanceof Ne?ts(e,t):e instanceof at?gn(e,t):!1}o(vi,"testPolygonShape");function bi(t,e){return e instanceof M?pn(t,e):e instanceof Oe?Sr(t,e):e instanceof Te?rs(t,e):e instanceof me?ns(t,e):e instanceof Ne?gn(t,e):e instanceof at?gi(e,t):!1}o(bi,"testEllipseShape");function ss(t,e,r){let n=t,s=r.p1,i=r.p2,a=e,h=i.sub(s),l=a.cross(h);if(Math.abs(l)=1)return null;let d=c.cross(a)/l;if(d<=0||d>=1)return null;let g=h.normal().unit();return e.dot(g)>0&&(g.x*=-1,g.y*=-1),{point:n.add(a.scale(u)),normal:g,fraction:u}}o(ss,"raycastLine");function Vi(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let a=(r.pos.x-t.x)/e.x,h=(r.pos.x+r.width-t.x)/e.x;i=b(-Math.sign(e.x),0),n=Math.max(n,Math.min(a,h)),s=Math.min(s,Math.max(a,h))}if(t.y!=0){let a=(r.pos.y-t.y)/e.y,h=(r.pos.y+r.height-t.y)/e.y;Math.min(a,h)>n&&(i=b(0,-Math.sign(e.y))),n=Math.max(n,Math.min(a,h)),s=Math.min(s,Math.max(a,h))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Vi,"raycastRect");function is(t,e,r){let n=t,s=r.center,i=e,a=i.dot(i),h=n.sub(s),l=2*i.dot(h),c=h.dot(h)-r.radius*r.radius,u=l*l-4*a*c;if(a<=Number.EPSILON||u<0)return null;if(u==0){let d=-l/(2*a);if(d>=0&&d<=1){let g=n.add(i.scale(d));return{point:g,normal:g.sub(s),fraction:d}}}else{let d=(-l+Math.sqrt(u))/(2*a),g=(-l-Math.sqrt(u))/(2*a),m=null;if(d>=0&&d<=1&&(m=d),g>=0&&g<=1&&(m=Math.min(g,m??g)),m!=null){let f=n.add(i.scale(m));return{point:f,normal:f.sub(s).unit(),fraction:m}}}return null}o(is,"raycastCircle");function Ei(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let a=0;al.fraction)&&(s=l),i=h}return s}o(Ei,"raycastPolygon");function Mi(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),a=s.transform(e),h=is(i,a,new Oe(b(),1));if(h){let l=$r.rotation(ge(-r.angle)),c=$r.scale(r.radiusX,r.radiusY).transform(h.point),u=n.transform(h.point).add(r.center),d=u.dist(t)/e.len();return{point:u,normal:l.transform(b(r.radiusY**2*c.x,r.radiusX**2*c.y)).unit(),fraction:d}}return h}o(Mi,"raycastEllipse");function Si(t,e,r,n=64){let s=t,i=e.len(),a=e.scale(1/i),h=0,l=b(Math.floor(t.x),Math.floor(t.y)),c=b(a.x>0?1:-1,a.y>0?1:-1),u=b(Math.abs(1/a.x),Math.abs(1/a.y)),d=b(c.x>0?l.x+1-t.x:t.x-l.x,c.y>0?l.y+1-t.y:t.y-l.y),g=b(u.x<1/0?u.x*d.x:1/0,u.y<1/0?u.y*d.y:1/0),m=-1;for(;h<=n;){let f=r(l);if(f===!0)return{point:s.add(a.scale(h)),normal:b(m===0?-c.x:0,m===1?-c.y:0),fraction:h/i,gridPos:l};if(f)return f;g.xe.multVec2(r)))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new yt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return xi(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Vi(e,r,this)}random(){return this.pos.add(ye(this.width),ye(this.height))}},o(yt,"Rect"),yt),Bt,Oe=(Bt=class{constructor(e,r){v(this,"center");v(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return me.fromPoints(this.center.sub(b(this.radius)),this.center.add(b(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Bt(this.center,this.radius)}collides(e){return Ai(this,e)}contains(e){return this.collides(e)}raycast(e,r){return is(e,r,this)}random(){return this.center.add(M.fromAngle(ye(360)).scale(ye(this.radius)))}},o(Bt,"Circle"),Bt),je,at=(je=class{constructor(e,r,n,s=0){v(this,"center");v(this,"radiusX");v(this,"radiusY");v(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[a,h]=n.eigenvectors(s,i),[l,c]=[1/Math.sqrt(s),1/Math.sqrt(i)];return l>c?new je(b(),l,c,At(Math.atan2(-a[1],a[0]))):new je(b(),c,l,At(Math.atan2(-h[1],h[0])))}toMat2(){let e=ge(this.angle),r=Math.cos(e),n=Math.sin(e);return new $r(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new je(e.multVec2(this.center),e.m[0]*this.radiusX,e.m[5]*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Ar.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=je.fromMat2(r);return i.center=e.multVec2(this.center),i}}bbox(){if(this.angle==0)return me.fromPoints(this.center.sub(b(this.radiusX,this.radiusY)),this.center.add(b(this.radiusX,this.radiusY)));{let e=ge(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,a=this.radiusY*n,h=this.radiusY*r,l=Math.sqrt(s*s+a*a),c=Math.sqrt(i*i+h*h);return me.fromPoints(this.center.sub(b(l,c)),this.center.add(b(l,c)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new je(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return bi(this,e)}contains(e){e=e.sub(this.center);let r=ge(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,a=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+a*a/(this.radiusY*this.radiusY)<1}raycast(e,r){return Mi(e,r,this)}random(){return this.center}},o(je,"Ellipse"),je);function Ri(t,e,r,n){let s=e.sub(t),i=n.sub(r),a=s.cross(i);return a<1e-5&&a>-1e-5||(a=r.sub(t).cross(i)/a,a<0||a>1)?null:t.add(s.scale(a))}o(Ri,"segmentLineIntersection");var Xe,Ne=(Xe=class{constructor(e){v(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new Xe(this.pts.map(r=>e.multVec2(r)))}bbox(){let e=b(Number.MAX_VALUE),r=b(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return me.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return vi(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Ei(e,r,this)}random(){return b()}cut(e,r){new Te(e,r);let n=[],s=[],i=r.sub(e),a=this.pts[this.pts.length-1],h=a.sub(e),l=i.cross(h)>0;return this.pts.forEach(c=>{h=c.sub(e);let u=i.cross(h)>0;if(l!=u){let d=Ri(a,c,e,r);n.push(d),s.push(d),l=u}(u?n:s).push(c),a=c}),[n.length?new Xe(n):null,s.length?new Xe(s):null]}},o(Xe,"Polygon"),Xe);function Ci(t,e,r,n){let s=n*n,i=1-n,a=i*i;return t.scale(a).add(e.scale(2*i*n)).add(r.scale(s))}o(Ci,"evaluateQuadratic");function Bi(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(Bi,"evaluateQuadraticFirstDerivative");function Ti(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(Ti,"evaluateQuadraticSecondDerivative");function mn(t,e,r,n,s){let i=s*s,a=i*s,h=1-s,l=h*h,c=l*h;return t.scale(c).add(e.scale(3*l*s)).add(r.scale(3*h*i)).add(n.scale(a))}o(mn,"evaluateBezier");function Pi(t,e,r,n,s){let i=s*s,a=1-s,h=a*a;return e.sub(t).scale(3*h).add(r.sub(e).scale(6*a*s)).add(n.sub(r).scale(3*i))}o(Pi,"evaluateBezierFirstDerivative");function Di(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Di,"evaluateBezierSecondDerivative");function Ii(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),a=.5*((3*s-5)*s*s+2),h=.5*(((-3*s+4)*s+1)*s),l=.5*((s-1)*s*s);return t.scale(i).add(e.scale(a)).add(r.scale(h)).add(n.scale(l))}o(Ii,"evaluateCatmullRom");function Fi(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),a=.5*((9*s-10)*s),h=.5*((-9*s+8)*s+1),l=.5*((3*s-2)*s);return t.scale(i).add(e.scale(a)).add(r.scale(h)).add(n.scale(l))}o(Fi,"evaluateCatmullRomFirstDerivative");function ki(t){let e=os(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(ki,"normalizedCurve");function os(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,a=0,h=t(0),l=0;for(let c=1;c{if(u){let d=c;if(d<=0)return 0;if(d>=a)return 1;let g=0;for(;n[g+1]=1)return n[e-1];let d=0;for(;s[d+1]{let c=l*l,u=c*l;return s*u+i*c+a*l+h}}o(mr,"hermite");function as(t,e,r,n,s,i=mr){let a=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),h=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return l=>new M(a(l),h(l))}o(as,"cardinal");function Rr(t,e,r,n,s=mr){return as(t,e,r,n,.5,s)}o(Rr,"catmullRom");function Oi(t,e,r,n,s=mr){return Rr(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Oi,"bezier");function Ui(t,e,r,n,s,i,a,h=mr){let l=h(e.x,.5*(1-s)*(1+a)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-a)*(1-i)*(r.x-e.x),.5*(1-s)*(1+a)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-a)*(1+i)*(n.x-r.x),r.x),c=h(e.y,.5*(1-s)*(1+a)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-a)*(1-i)*(r.y-e.y),.5*(1-s)*(1+a)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-a)*(1+i)*(n.y-r.y),r.y);return u=>new M(l(u),c(u))}o(Ui,"kochanekBartels");function Ni(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,a=e;return h=>{let l=h*h;return 3*s*l+2*i*h+a}}o(Ni,"hermiteFirstDerivative");function Nt(t){return 0<=t&&t<=1}o(Nt,"inZeroOneDomain");function Wr(t,e){return Math.abs(t-e)<=Number.EPSILON}o(Wr,"approximately");function Lt(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(Lt,"cubeRoot");function Li(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,a=t,h=-t+3*e-3*r+n;if(Wr(h,0)){if(Wr(s,0))return Wr(i,0)?[]:[-a/i].filter(Nt);let y=Math.sqrt(i*i-4*s*a),V=2*s;return[(y-i)/V,(-i-y)/V].filter(Nt)}s/=h,i/=h,a/=h;let l=(3*i-s*s)/3,c=l/3,u=(2*s*s*s-9*s*i+27*a)/27,d=u/2,g=d*d+c*c*c;if(g<0){let y=-l/3,V=y*y*y,I=Math.sqrt(V),L=-u/(2*I),K=L<-1?-1:L>1?1:L,D=Math.acos(K),w=2*Lt(I),x=w*Math.cos(D/3)-s/3,C=w*Math.cos((D+2*Math.PI)/3)-s/3,P=w*Math.cos((D+4*Math.PI)/3)-s/3;return[x,C,P].filter(Nt)}if(g===0){let y=d<0?Lt(-d):-Lt(d),V=2*y-s/3,I=-y-s/3;return[V,I].filter(Nt)}let m=Math.sqrt(g),f=Lt(m-d),A=Lt(m+d);return[f-A-s/3].filter(Nt)}o(Li,"getCubicRoots");function qi(t,e,r,n,s){let i=Li(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?mn(t,e,r,n,i[0]).y:NaN}o(qi,"cubicBezierYforX");function Gi(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return Ke(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(Gi,"easingLinear");function ji(t,e){return r=>qi(b(0,0),t,e,b(1,1),r)}o(ji,"easingCubicBezier");function Ki(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),a=n?i:0;return h=>{let l=Math.floor(h/r);return a+l*i}}o(Ki,"easingSteps");function Hi(t,e){let r=Number.MAX_VALUE,n={normal:b(0),distance:0};for(let s of[t,e])for(let i=0;i=0}o(ls,"isOrientedCcw");function Yi(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(Xr,"onSameSide");function zi(t,e,r,n){return Xr(t,e,r,n)&&Xr(t,r,e,n)&&Xr(t,n,e,r)}o(zi,"pointInTriangle");function Qi(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&zi(s,e,r,n))return!0;return!1}o(Qi,"someInTriangle");function Wi(t,e,r,n){return ls(t,e,r)&&!Qi(n,t,e,r)}o(Wi,"isEar");function us(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let d=0;d3;){c=e[h],u=r[h];let d=t[u],g=t[h],m=t[c];if(Wi(d,g,m,s))i.push([d,g,m]),e[u]=c,r[c]=u,s.splice(s.indexOf(g),1),--a,l=0;else if(++l>a)return[];h=c}return c=e[h],u=r[h],i.push([t[u],t[h],t[c]]),i}o(us,"triangulate");function Xi(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),a=s.cross(i);for(;n+1t[0]instanceof J,"arrayIsColor"),Il=o(t=>t[0]instanceof M,"arrayIsVec2"),Fl=o(t=>typeof t[0]=="number","arrayIsNumber"),zt,Ji=(zt=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),kl=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function yn(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let a of s){let h=t[a],l=e[a];if(!yn(h,l))return!1}return!0}return!1}o(yn,"deepEq");var Qt,to=(Qt=class extends Map{constructor(){super(...arguments);v(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(Qt,"Registry"),Qt),Tt,Ft=(Tt=class{constructor(e){v(this,"paused",!1);v(this,"cancel");this.cancel=e}static join(e){let r=new Tt(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(Tt,"KEventController"),Tt),Wt,Se=(Wt=class{constructor(){v(this,"handlers",new to)}add(e){let r=this.handlers.pushd((...s)=>{n.paused||e(...s)}),n=new Ft(r);return n}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>r(...e))}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Wt,"KEvent"),Wt),Xt,Cr=(Xt=class{constructor(){v(this,"handlers",{});v(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new Se),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(Xt,"KEventHandler"),Xt),Ol=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function _r(t,e){return Number(t.toFixed(e))}o(_r,"toFixed");function fe(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(fe,"overload2");var Ul=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function ro(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Mt,"betweenInclusive");var Pe=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ze=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),Kr=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),Nl=(()=>{let t=0;return()=>t++})(),Ll={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},ql=o(()=>St.lastInputDevice,"getLastInputDeviceType"),Gl=o(()=>{let t=St.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(a=>{Kr(St.buttonsByKey,a,e)}),n&&n.forEach(a=>{Kr(St.buttonsByKeyCode,a,e)}),s&&s.forEach(a=>{Kr(St.buttonsByGamepad,a,e)}),i&&i.forEach(a=>{Kr(St.buttonsByMouse,a,e)})}},"parseButtonBindings"),Jt,Vr=(Jt=class{constructor(){v(this,"pressed",new Set([]));v(this,"pressedRepeat",new Set([]));v(this,"released",new Set([]));v(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Jt,"ButtonState"),Jt),Zt,jl=(Zt=class{constructor(){v(this,"buttonState",new Vr);v(this,"stickState",new Map)}},o(Zt,"GamepadState"),Zt),$t,Kl=($t=class{constructor(){v(this,"dts",[]);v(this,"timer",0);v(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o($t,"FPSCounter"),$t),St,ti=Ll,Hl=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Kl,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new M(0),mouseDeltaPos:new M(0),keyState:new Vr,mouseState:new Vr,mergedGamepadState:new jl,gamepadStates:new Map,lastInputDevice:null,buttonState:new Vr,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new Cr}},"initAppState"),Yl=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Hl(t);St=e,Gl();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function a(){return e.time}o(a,"time");function h(){return e.fpsCounter.fps}o(h,"fps");function l(){return e.numFrames}o(l,"numFrames");function c(){return e.canvas.toDataURL()}o(c,"screenshot");function u(p){e.canvas.style.cursor=p}o(u,"setCursor");function d(){return e.canvas.style.cursor}o(d,"getCursor");function g(p){if(p)try{let E=e.canvas.requestPointerLock();E.catch&&E.catch(R=>console.error(R))}catch(E){console.error(E)}else document.exitPointerLock()}o(g,"setCursorLocked");function m(){return!!document.pointerLockElement}o(m,"isCursorLocked");function f(p){p.requestFullscreen?p.requestFullscreen():p.webkitRequestFullscreen&&p.webkitRequestFullscreen()}o(f,"enterFullscreen");function A(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(A,"exitFullscreen");function y(p=!0){p?f(e.canvas):A()}o(y,"setFullscreen");function V(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(V,"isFullscreen");function I(){e.stopped=!0;let p=Object.entries(Me),E=Object.entries(Dn),R=Object.entries(jr);for(let[U,z]of p)e.canvas.removeEventListener(U,z);for(let[U,z]of E)document.removeEventListener(U,z);for(let[U,z]of R)window.removeEventListener(U,z);_s.disconnect()}o(I,"quit");function L(p,E){e.loopID!==null&&cancelAnimationFrame(e.loopID);let R=0,U=0,z=o(ie=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(z);return}let Ae=ie/1e3,ce=Math.min(Ae-e.realTime,.25),tt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ae,U+=ce,U>tt){if(!e.skipTime){for(R+=U,e.dt=e.fixedDt,e.restDt=0;R>e.fixedDt;)R-=e.fixedDt,R0}o(K,"isTouchscreen");function D(){return e.mousePos.clone()}o(D,"mousePos");function w(){return e.mouseDeltaPos.clone()}o(w,"mouseDeltaPos");function x(p="left"){return e.mouseState.pressed.has(p)}o(x,"isMousePressed");function C(p="left"){return e.mouseState.down.has(p)}o(C,"isMouseDown");function P(p="left"){return e.mouseState.released.has(p)}o(P,"isMouseReleased");function k(){return e.isMouseMoved}o(k,"isMouseMoved");function N(p){return p===void 0?e.keyState.pressed.size>0:ze(e.keyState.pressed,p)}o(N,"isKeyPressed");function q(p){return p===void 0?e.keyState.pressedRepeat.size>0:ze(e.keyState.pressedRepeat,p)}o(q,"isKeyPressedRepeat");function H(p){return p===void 0?e.keyState.down.size>0:ze(e.keyState.down,p)}o(H,"isKeyDown");function W(p){return p===void 0?e.keyState.released.size>0:ze(e.keyState.released,p)}o(W,"isKeyReleased");function Z(p){return p===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ze(e.mergedGamepadState.buttonState.pressed,p)}o(Z,"isGamepadButtonPressed");function Q(p){return p===void 0?e.mergedGamepadState.buttonState.down.size>0:ze(e.mergedGamepadState.buttonState.down,p)}o(Q,"isGamepadButtonDown");function Y(p){return p===void 0?e.mergedGamepadState.buttonState.released.size>0:ze(e.mergedGamepadState.buttonState.released,p)}o(Y,"isGamepadButtonReleased");function te(p){return p===void 0?e.buttonState.pressed.size>0:ze(e.buttonState.pressed,p)}o(te,"isButtonPressed");function $(p){return p===void 0?e.buttonState.down.size>0:ze(e.buttonState.down,p)}o($,"isButtonDown");function F(p){return p===void 0?e.buttonState.released.size>0:ze(e.buttonState.released,p)}o(F,"isButtonReleased");function j(p){var E;return(E=e.buttons)==null?void 0:E[p]}o(j,"getButton");function O(p,E){e.buttons[p]={...e.buttons[p],...E}}o(O,"setButton");function re(p){e.buttonState.press(p),e.events.trigger("buttonPress",p)}o(re,"pressButton");function le(p){e.buttonState.release(p),e.events.trigger("buttonRelease",p)}o(le,"releaseButton");function ee(p){return e.events.on("resize",p)}o(ee,"onResize");let be=fe(p=>e.events.on("keyDown",p),(p,E)=>e.events.on("keyDown",R=>Pe(p,R)&&E(R))),ht=fe(p=>e.events.on("keyPress",E=>p(E)),(p,E)=>e.events.on("keyPress",R=>Pe(p,R)&&E(R))),Sn=fe(p=>e.events.on("keyPressRepeat",p),(p,E)=>e.events.on("keyPressRepeat",R=>Pe(p,R)&&E(R))),Rn=fe(p=>e.events.on("keyRelease",p),(p,E)=>e.events.on("keyRelease",R=>Pe(p,R)&&E(R))),Cn=fe(p=>e.events.on("mouseDown",E=>p(E)),(p,E)=>e.events.on("mouseDown",R=>Pe(p,R)&&E(R))),Bn=fe(p=>e.events.on("mousePress",E=>p(E)),(p,E)=>e.events.on("mousePress",R=>Pe(p,R)&&E(R))),Gr=fe(p=>e.events.on("mouseRelease",E=>p(E)),(p,E)=>e.events.on("mouseRelease",R=>R===p&&E(R)));function Le(p){return e.events.on("mouseMove",()=>p(D(),w()))}o(Le,"onMouseMove");function et(p){return e.events.on("charInput",p)}o(et,"onCharInput");function wr(p){return e.events.on("touchStart",p)}o(wr,"onTouchStart");function Ee(p){return e.events.on("touchMove",p)}o(Ee,"onTouchMove");function Ot(p){return e.events.on("touchEnd",p)}o(Ot,"onTouchEnd");function He(p){return e.events.on("scroll",p)}o(He,"onScroll");function yr(p){return e.events.on("hide",p)}o(yr,"onHide");function qs(p){return e.events.on("show",p)}o(qs,"onShow");let wl=fe(p=>e.events.on("gamepadButtonPress",(E,R)=>p(E,R)),(p,E)=>e.events.on("gamepadButtonPress",(R,U)=>Pe(p,R)&&E(R,U))),yl=fe(p=>e.events.on("gamepadButtonDown",(E,R)=>p(E,R)),(p,E)=>e.events.on("gamepadButtonDown",(R,U)=>Pe(p,R)&&E(R,U))),Al=fe(p=>e.events.on("gamepadButtonRelease",(E,R)=>p(E,R)),(p,E)=>e.events.on("gamepadButtonRelease",(R,U)=>Pe(p,R)&&E(R,U)));function Gs(p,E){return e.events.on("gamepadStick",(R,U,z)=>R===p&&E(U,z))}o(Gs,"onGamepadStick");function js(p){e.events.on("gamepadConnect",p)}o(js,"onGamepadConnect");function Ks(p){e.events.on("gamepadDisconnect",p)}o(Ks,"onGamepadDisconnect");function Hs(p){return e.mergedGamepadState.stickState.get(p)||new M(0)}o(Hs,"getGamepadStick");function Ys(){return[...e.charInputted]}o(Ys,"charInputted");function Tn(){return[...e.gamepads]}o(Tn,"getGamepads");let xl=fe(p=>e.events.on("buttonPress",E=>p(E)),(p,E)=>e.events.on("buttonPress",R=>Pe(p,R)&&E(R))),vl=fe(p=>e.events.on("buttonDown",E=>p(E)),(p,E)=>e.events.on("buttonDown",R=>Pe(p,R)&&E(R))),bl=fe(p=>e.events.on("buttonRelease",E=>p(E)),(p,E)=>e.events.on("buttonRelease",R=>Pe(p,R)&&E(R)));function zs(){e.events.trigger("input"),e.keyState.down.forEach(p=>e.events.trigger("keyDown",p)),e.mouseState.down.forEach(p=>e.events.trigger("mouseDown",p)),e.buttonState.down.forEach(p=>{e.events.trigger("buttonDown",p)}),Xs()}o(zs,"processInput");function Qs(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((p,E)=>{e.mergedGamepadState.stickState.set(E,new M(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new M(0),e.gamepadStates.forEach(p=>{p.buttonState.update(),p.stickState.forEach((E,R)=>{p.stickState.set(R,new M(0))})})}o(Qs,"resetInput");function Pn(p){let E={index:p.index,isPressed:o(R=>{var U;return((U=e.gamepadStates.get(p.index))==null?void 0:U.buttonState.pressed.has(R))||!1},"isPressed"),isDown:o(R=>{var U;return((U=e.gamepadStates.get(p.index))==null?void 0:U.buttonState.down.has(R))||!1},"isDown"),isReleased:o(R=>{var U;return((U=e.gamepadStates.get(p.index))==null?void 0:U.buttonState.released.has(R))||!1},"isReleased"),getStick:o(R=>{var U;return((U=e.gamepadStates.get(p.index))==null?void 0:U.stickState.get(R))||b()},"getStick")};return e.gamepads.push(E),e.gamepadStates.set(p.index,{buttonState:new Vr,stickState:new Map([["left",new M(0)],["right",new M(0)]])}),E}o(Pn,"registerGamepad");function Ws(p){e.gamepads=e.gamepads.filter(E=>E.index!==p.index),e.gamepadStates.delete(p.index)}o(Ws,"removeGamepad");function Xs(){var p,E;for(let R of navigator.getGamepads())R&&!e.gamepadStates.has(R.index)&&Pn(R);for(let R of e.gamepads){let U=navigator.getGamepads()[R.index];if(!U)continue;let z=(t.gamepads??{})[U.id]||ti[U.id]||ti.default,ie=e.gamepadStates.get(R.index);if(ie){for(let Ae=0;Ae{e.buttonState.press(rt),e.events.trigger("buttonPress",rt)})),e.mergedGamepadState.buttonState.press(ce),ie.buttonState.press(ce),e.events.trigger("gamepadButtonPress",ce,R)}else ie.buttonState.down.has(ce)&&(Ye&&((E=e.buttonsByGamepad.get(ce))==null||E.forEach(rt=>{e.buttonState.release(rt),e.events.trigger("buttonRelease",rt)})),e.mergedGamepadState.buttonState.release(ce),ie.buttonState.release(ce),e.events.trigger("gamepadButtonRelease",ce,R))}for(let Ae in z.sticks){let ce=z.sticks[Ae];if(!ce)continue;let tt=new M(U.axes[ce.x],U.axes[ce.y]);ie.stickState.set(Ae,tt),e.mergedGamepadState.stickState.set(Ae,tt),e.events.trigger("gamepadStick",Ae,tt,R)}}}}o(Xs,"processGamepad");let Me={},Dn={},jr={},Js=t.pixelDensity||1;Me.mousemove=p=>{let E=new M(p.offsetX,p.offsetY),R=new M(p.movementX,p.movementY);if(V()){let U=e.canvas.width/Js,z=e.canvas.height/Js,ie=window.innerWidth,Ae=window.innerHeight,ce=ie/Ae,tt=U/z;if(ce>tt){let Ye=Ae/z,rt=(ie-U*Ye)/2;E.x=Ke(p.offsetX-rt,0,U*Ye,0,U),E.y=Ke(p.offsetY,0,z*Ye,0,z)}else{let Ye=ie/U,rt=(Ae-z*Ye)/2;E.x=Ke(p.offsetX,0,U*Ye,0,U),E.y=Ke(p.offsetY-rt,0,z*Ye,0,z)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=E,e.mouseDeltaPos=R,e.events.trigger("mouseMove")})};let Zs=["left","middle","right","back","forward"];Me.mousedown=p=>{e.events.onOnce("input",()=>{var R;let E=Zs[p.button];E&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(E)&&((R=e.buttonsByMouse.get(E))==null||R.forEach(U=>{e.buttonState.press(U),e.events.trigger("buttonPress",U)})),e.mouseState.press(E),e.events.trigger("mousePress",E))})},Me.mouseup=p=>{e.events.onOnce("input",()=>{var R;let E=Zs[p.button];E&&(e.buttonsByMouse.has(E)&&((R=e.buttonsByMouse.get(E))==null||R.forEach(U=>{e.buttonState.release(U),e.events.trigger("buttonRelease",U)})),e.mouseState.release(E),e.events.trigger("mouseRelease",E))})};let Vl=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),$s={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};Me.keydown=p=>{Vl.has(p.key)&&p.preventDefault(),e.events.onOnce("input",()=>{var U,z;let E=$s[p.key]||p.key.toLowerCase(),R=p.code;if(E===void 0)throw new Error(`Unknown key: ${p.key}`);E.length===1?(e.events.trigger("charInput",E),e.charInputted.push(E)):E==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),p.repeat?(e.keyState.pressRepeat(E),e.events.trigger("keyPressRepeat",E)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(E)&&((U=e.buttonsByKey.get(E))==null||U.forEach(ie=>{e.buttonState.press(ie),e.events.trigger("buttonPress",ie)})),e.buttonsByKeyCode.has(R)&&((z=e.buttonsByKeyCode.get(R))==null||z.forEach(ie=>{e.buttonState.press(ie),e.events.trigger("buttonPress",ie)})),e.keyState.press(E),e.events.trigger("keyPressRepeat",E),e.events.trigger("keyPress",E))})},Me.keyup=p=>{e.events.onOnce("input",()=>{var U,z;let E=$s[p.key]||p.key.toLowerCase(),R=p.code;e.buttonsByKey.has(E)&&((U=e.buttonsByKey.get(E))==null||U.forEach(ie=>{e.buttonState.release(ie),e.events.trigger("buttonRelease",ie)})),e.buttonsByKeyCode.has(R)&&((z=e.buttonsByKeyCode.get(R))==null||z.forEach(ie=>{e.buttonState.release(ie),e.events.trigger("buttonRelease",ie)})),e.keyState.release(E),e.events.trigger("keyRelease",E)})},Me.touchstart=p=>{p.preventDefault(),e.events.onOnce("input",()=>{var U;let E=[...p.changedTouches],R=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new M(E[0].clientX-R.x,E[0].clientY-R.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((U=e.buttonsByMouse.get("left"))==null||U.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),E.forEach(z=>{e.events.trigger("touchStart",new M(z.clientX-R.x,z.clientY-R.y),z)})})},Me.touchmove=p=>{p.preventDefault(),e.events.onOnce("input",()=>{let E=[...p.changedTouches],R=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let U=e.mousePos;e.mousePos=new M(E[0].clientX-R.x,E[0].clientY-R.y),e.mouseDeltaPos=e.mousePos.sub(U),e.events.trigger("mouseMove")}E.forEach(U=>{e.events.trigger("touchMove",new M(U.clientX-R.x,U.clientY-R.y),U)})})},Me.touchend=p=>{e.events.onOnce("input",()=>{var U;let E=[...p.changedTouches],R=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new M(E[0].clientX-R.x,E[0].clientY-R.y),e.mouseDeltaPos=new M(0,0),e.buttonsByMouse.has("left")&&((U=e.buttonsByMouse.get("left"))==null||U.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),E.forEach(z=>{e.events.trigger("touchEnd",new M(z.clientX-R.x,z.clientY-R.y),z)})})},Me.touchcancel=p=>{e.events.onOnce("input",()=>{let E=[...p.changedTouches],R=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new M(E[0].clientX-R.x,E[0].clientY-R.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),E.forEach(U=>{e.events.trigger("touchEnd",new M(U.clientX-R.x,U.clientY-R.y),U)})})},Me.wheel=p=>{p.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new M(p.deltaX,p.deltaY))})},Me.contextmenu=p=>p.preventDefault(),Dn.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},jr.gamepadconnected=p=>{let E=Pn(p.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",E)})},jr.gamepaddisconnected=p=>{let E=Tn().filter(R=>R.index===p.gamepad.index)[0];Ws(p.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",E)})};for(let[p,E]of Object.entries(Me))e.canvas.addEventListener(p,E);for(let[p,E]of Object.entries(Dn))document.addEventListener(p,E);for(let[p,E]of Object.entries(jr))window.addEventListener(p,E);let _s=new ResizeObserver(p=>{for(let E of p)if(E.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return _s.observe(e.canvas),{dt:r,fixedDt:n,restDt:s,time:a,run:L,canvas:e.canvas,fps:h,numFrames:l,quit:I,isHidden:i,setFullscreen:y,isFullscreen:V,setCursor:u,screenshot:c,getGamepads:Tn,getCursor:d,setCursorLocked:g,isCursorLocked:m,isTouchscreen:K,mousePos:D,mouseDeltaPos:w,isKeyDown:H,isKeyPressed:N,isKeyPressedRepeat:q,isKeyReleased:W,isMouseDown:C,isMousePressed:x,isMouseReleased:P,isMouseMoved:k,isGamepadButtonPressed:Z,isGamepadButtonDown:Q,isGamepadButtonReleased:Y,getGamepadStick:Hs,isButtonPressed:te,isButtonDown:$,isButtonReleased:F,setButton:O,getButton:j,pressButton:re,releaseButton:le,charInputted:Ys,onResize:ee,onKeyDown:be,onKeyPress:ht,onKeyPressRepeat:Sn,onKeyRelease:Rn,onMouseDown:Cn,onMousePress:Bn,onMouseRelease:Gr,onMouseMove:Le,onCharInput:et,onTouchStart:wr,onTouchMove:Ee,onTouchEnd:Ot,onScroll:He,onHide:yr,onShow:qs,onGamepadButtonDown:yl,onGamepadButtonPress:wl,onGamepadButtonRelease:Al,onGamepadStick:Gs,onGamepadConnect:js,onGamepadDisconnect:Ks,onButtonPress:xl,onButtonDown:vl,onButtonRelease:bl,getLastInputDeviceType:ql,events:e.events}},"initApp");function lt(){return T.dt()*ne.timeScale}o(lt,"dt");function fo(){return T.fixedDt()*ne.timeScale}o(fo,"fixedDt");function po(){return T.restDt()*ne.timeScale}o(po,"restDt");var zl=new M(-1,-1),Ql=new M(0,-1),Wl=new M(1,-1),Xl=new M(-1,0),Jl=new M(0,0),Zl=new M(1,0),$l=new M(-1,1),_l=new M(0,1),eu=new M(1,1);function kt(t){switch(t){case"topleft":return zl;case"top":return Ql;case"topright":return Wl;case"left":return Xl;case"center":return Jl;case"right":return Zl;case"botleft":return $l;case"bot":return _l;case"botright":return eu;default:return t}}o(kt,"anchorPt");function mo(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(mo,"alignPt");function wo(t){return t.createBuffer(1,1,44100)}o(wo,"createEmptyAudioBuffer");var Hr=2.5949095,ri=1.70158+1,ni=2*Math.PI/3,si=2*Math.PI/4.5,Jr={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ri*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ri*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Hr+1)*2*t-Hr)/2:(Math.pow(2*t-2,2)*((Hr+1)*(t*2-2)+Hr)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ni),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ni)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*si))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*si)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Jr.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Jr.easeOutBounce(1-2*t))/2:(1+Jr.easeOutBounce(2*t-1))/2,"easeInOutBounce")},Br=Jr;function yo(t,e,r){let n=[],s=e;for(n.push(s);s!==t;){if(s=r.get(s),s==null)return null;n.push(s)}return n.reverse()}o(yo,"buildPath");function Ao(t,e,r){var a;let n=new Ji((h,l)=>h.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(er,"NavPolygon"),er),tr,nu=(tr=class{constructor(){v(this,"_polygons");v(this,"_pointCache");v(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new ru(this._polygons.length),n=e.map((s,i)=>new tu(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),a=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,a])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,a=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+a*a)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Ao(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),a=this._getLocation(r);if(i===void 0||a===void 0)return[];let h=this.getPath(i.id,a.id);if(!h)return[];if(s==="edges"){let l=[];for(let c=1;cthis._polygons[l].centroid),r]}},o(tr,"NavMesh"),tr);function Kt(t){let e=new $e;return t.pos&&e.translate(t.pos),t.scale&&e.scale(t.scale),t.angle&&e.rotate(t.angle),t.parent?e.mult(t.parent.transform):e}o(Kt,"calcTransform");function xo(t){return new M(t.x/xe()*2-1,-t.y/ve()*2+1)}o(xo,"screen2ndc");function qt(t,e,r,n,s,i=1){n=ge(n%360),s=ge(s%360),s<=n&&(s+=Math.PI*2);let a=[],h=Math.ceil((s-n)/ge(8)*i),l=(s-n)/h,c=b(Math.cos(n),Math.sin(n)),u=b(Math.cos(l),Math.sin(l));for(let d=0;d<=h;d++)a.push(t.add(e*c.x,r*c.y)),c=b(c.x*u.x-c.y*u.y,c.x*u.y+c.y*u.x);return a}o(qt,"getArcPts");function vo(...t){let e=se(...t),r=t[3]??1;B.bgColor=e,B.bgAlpha=r,B.ggl.gl.clearColor(e.r/255,e.g/255,e.b/255,r)}o(vo,"setBackground");function bo(){var t,e;return((e=(t=B.bgColor)==null?void 0:t.clone)==null?void 0:e.call(t))??null}o(bo,"getBackground");function he(...t){if(t[0]===void 0)return;let e=b(...t);e.x===0&&e.y===0||B.transform.translate(e)}o(he,"pushTranslate");function Ie(){B.transformStack.push(B.transform.clone())}o(Ie,"pushTransform");function Vo(t){B.transform=t.clone()}o(Vo,"pushMatrix");function fr(...t){if(t[0]===void 0)return;let e=b(...t);e.x===1&&e.y===1||B.transform.scale(e)}o(fr,"pushScale");function It(t){t&&B.transform.rotate(t)}o(It,"pushRotate");function Re(){B.transformStack.length>0&&(B.transform=B.transformStack.pop())}o(Re,"popTransform");function Ce(){B.renderer.flush()}o(Ce,"flush");function xe(){return B.width}o(xe,"width");function ve(){return B.height}o(ve,"height");function cs(){return(B.viewport.width+B.viewport.height)/(B.width+B.height)}o(cs,"getViewportScale");function Eo(t){return new M(t.x*B.viewport.width/B.width,t.y*B.viewport.height/B.height)}o(Eo,"contentToView");function Mo(t){return new M((t.x-B.viewport.x)*xe()/B.viewport.width,(t.y-B.viewport.y)*ve()/B.viewport.height)}o(Mo,"windowToContent");function ds(){return Mo(T.mousePos())}o(ds,"mousePos");function Tr(){return b(xe()/2,ve()/2)}o(Tr,"center");var So=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",xn="topleft",su="monospace",en="monospace",Ln="linear",fs=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],iu=fs.reduce((t,e)=>t+e.size,0),Ro=2048,ou=Ro*4*iu,au=Ro*6,lu=` +var Wu=Object.defineProperty;var Xu=(t,e,r)=>e in t?Wu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Xu(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Yu=Object.defineProperty,o=(t,e)=>Yu(t,"name",{value:e,configurable:!0}),Ju=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],B=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*B-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*B-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var Zu=1103515245,_u=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(Zu*this.seed+_u)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),B=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=B.m11,L=B.m12,D=B.m13,O=B.m21,j=B.m22,$=B.m23,G=B.m31,Y=B.m32,te=B.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ia(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ia,"testRectShape");function Ba(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ba,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var dt,Re=(dt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new dt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let B=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(B,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new dt(i):null,l.length?new dt(l):null]}},o(dt,"Polygon"),dt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),B=cr(v+m);return[g-B-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",eh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],th=ti.reduce((t,e)=>t+e.size,0),oo=2048,rh=oo*4*th,nh=oo*6,sh=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -7,8 +7,14 @@ varying vec2 v_pos; varying vec2 v_uv; varying vec4 v_color; +uniform float width; +uniform float height; +uniform mat4 camera; +uniform mat4 transform; + vec4 def_vert() { - return vec4(a_pos, 0.0, 1.0); + vec4 pos = camera * transform * vec4(a_pos, 0.0, 1.0); + return vec4(pos.x / width * 2.0 - 1.0, pos.y / -height * 2.0 + 1.0, pos.z, pos.w); } {{user}} @@ -20,7 +26,7 @@ void main() { v_color = a_color; gl_Position = pos; } -`,uu=` +`,ih=` precision mediump float; varying vec2 v_pos; @@ -30,7 +36,8 @@ varying vec4 v_color; uniform sampler2D u_tex; vec4 def_frag() { - return v_color * texture2D(u_tex, v_uv); + vec4 texColor = texture2D(u_tex, v_uv); + return vec4((v_color.rgb * texColor.rgb), texColor.a) * v_color.a; } {{user}} @@ -41,100 +48,272 @@ void main() { discard; } } -`,qn=` +`,bs=` vec4 vert(vec2 pos, vec2 uv, vec4 color) { return def_vert(); } -`,Gn=` +`,Es=` vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,hu=new Set(["id","require"]),cu=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),du=200,fu=640,pu=65536,rr,gu=(rr=class{constructor(e,r,n){v(this,"textures",[]);v(this,"bigTextures",[]);v(this,"canvas");v(this,"c2d");v(this,"x",0);v(this,"y",0);v(this,"curHeight",0);v(this,"gfx");this.gfx=e,this.canvas=document.createElement("canvas"),this.canvas.width=r,this.canvas.height=n,this.textures=[ft.fromImage(e,this.canvas)],this.bigTextures=[];let s=this.canvas.getContext("2d");if(!s)throw new Error("Failed to get 2d context");this.c2d=s}add(e){if(e.width>this.canvas.width||e.height>this.canvas.height){let s=ft.fromImage(this.gfx,e);return this.bigTextures.push(s),[s,new ae(0,0,1,1)]}this.x+e.width>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+e.height>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(ft.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let r=this.textures[this.textures.length-1],n=new M(this.x,this.y);return this.x+=e.width,e.height>this.curHeight&&(this.curHeight=e.height),e instanceof ImageData?this.c2d.putImageData(e,n.x,n.y):this.c2d.drawImage(e,n.x,n.y),r.update(this.canvas),[r,new ae(n.x/this.canvas.width,n.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height)]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}},o(rr,"TexPacker"),rr);function Be(t){return typeof t!="string"||eo(t)?t:X.urlPrefix+t}o(Be,"fixURL");var Pt,Ue=(Pt=class{constructor(e){v(this,"loaded",!1);v(this,"data",null);v(this,"error",null);v(this,"onLoadEvents",new Se);v(this,"onErrorEvents",new Se);v(this,"onFinishEvents",new Se);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new Pt(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o(Pt,"Asset"),Pt),nr,Ut=(nr=class{constructor(){v(this,"assets",new Map);v(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new Ue(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=Ue.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}},o(nr,"AssetBucket"),nr);function vn(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(vn,"fetchURL");function Ur(t){return vn(t).then(e=>e.json())}o(Ur,"fetchJSON");function Co(t){return vn(t).then(e=>e.text())}o(Co,"fetchText");function Bo(t){return vn(t).then(e=>e.arrayBuffer())}o(Bo,"fetchArrayBuffer");function To(t){return t!==void 0&&(X.urlPrefix=t),X.urlPrefix}o(To,"loadRoot");function Po(t,e){return X.custom.add(t,Ur(Be(e)))}o(Po,"loadJSON");function Nr(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(Nr,"loadImg");function xt(){let t=[X.sprites,X.sounds,X.shaders,X.fonts,X.bitmapFonts,X.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(xt,"loadProgress");function Do(t){return X.custom.get(t)??null}o(Do,"getAsset");function tn(t){return X.custom.add(null,t)}o(tn,"load");var mu=o(t=>({urlPrefix:"",sprites:new Ut,fonts:new Ut,bitmapFonts:new Ut,sounds:new Ut,shaders:new Ut,custom:new Ut,music:{},packer:new gu(t,2048,2048),loaded:!1}),"initAssets"),wu="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",Je,vt=(Je=class{constructor(e,r,n={},s=null){v(this,"tex");v(this,"frames",[new ae(0,0,1,1)]);v(this,"anims",{});v(this,"slice9",null);this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?Je.fromURL(e,r):Promise.resolve(Je.fromImage(e,r))}static fromImage(e,r={}){let[n,s]=X.packer.add(e),i=r.frames?r.frames.map(a=>new ae(s.x+a.x*s.w,s.y+a.y*s.h,a.w*s.w,a.h*s.h)):gs(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new Je(n,i,r.anims,r.slice9)}static fromURL(e,r={}){return Nr(e).then(n=>Je.fromImage(n,r))}},o(Je,"SpriteData"),Je);function Er(t){if(typeof t=="string"){let e=ps(t);if(e)return e;if(xt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof vt)return Ue.loaded(t);if(t instanceof Ue)return t;throw new Error(`Invalid sprite: ${t}`)}}o(Er,"resolveSprite");function ps(t){return X.sprites.get(t)??null}o(ps,"getSprite");function Ht(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Be(e),Array.isArray(e)?e.some(n=>typeof n=="string")?X.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?Nr(n):Promise.resolve(n))).then(n=>jn(n,r))):X.sprites.addLoaded(t,jn(e,r)):typeof e=="string"?X.sprites.add(t,vt.from(e,r)):X.sprites.addLoaded(t,vt.fromImage(e,r))}o(Ht,"loadSprite");function gs(t=1,e=1,r=0,n=0,s=1,i=1){let a=[],h=s/t,l=i/e;for(let c=0;c{h instanceof ImageData?i.putImageData(h,l*n,0):i.drawImage(h,l*n,0)});let a=i.getImageData(0,0,t.length*n,s);return vt.fromImage(a,{...e,sliceX:t.length,sliceY:1})}o(jn,"createSpriteSheet");function Io(t="bean"){return Ht(t,wu)}o(Io,"loadBean");function Fo(t,e,r){e=Be(e),r=Be(r),typeof e=="string"&&!r&&(r=kl(e)+".json");let n=typeof r=="string"?Ur(r):Promise.resolve(r);return X.sprites.add(t,n.then(s=>{let i=s.meta.size,a=s.frames.map(l=>new ae(l.frame.x/i.w,l.frame.y/i.h,l.frame.w/i.w,l.frame.h/i.h)),h={};for(let l of s.meta.frameTags)l.from===l.to?h[l.name]=l.from:h[l.name]={from:l.from,to:l.to,speed:10,loop:!0,pingpong:l.direction==="pingpong"};return vt.from(e,{frames:a,anims:h})}))}o(Fo,"loadAseprite");var sr,Zr=(sr=class{constructor(e,r={}){v(this,"fontface");v(this,"filter",Ln);v(this,"outline",null);v(this,"size",64);if(this.fontface=e,this.filter=r.filter??Ln,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:se(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(sr,"FontData"),sr);function ms(t){if(!t)return ms(ue.font??su);if(typeof t=="string"){let e=ys(t),r=ws(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(xt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof Ue)return t.data?t.data:t;return t}o(ms,"resolveFont");function ws(t){return X.fonts.get(t)??null}o(ws,"getFont");function ko(t,e,r={}){let n=Be(e),s=new FontFace(t,typeof e=="string"?`url(${n})`:n);return document.fonts.add(s),X.fonts.add(t,s.load().catch(i=>{throw new Error(`Failed to load font from "${n}": ${i}`)}).then(i=>new Zr(i,r)))}o(ko,"loadFont");function Oo(t,e,r,n){let s=t.width/e,i={},a=n.split("").entries();for(let[h,l]of a)i[l]=new ae(h%s*e,Math.floor(h/s)*r,e,r);return{tex:t,map:i,size:r}}o(Oo,"makeFont");function ys(t){return X.bitmapFonts.get(t)??null}o(ys,"getBitmapFont");function Uo(t,e,r,n,s={}){let i=Be(e);return X.bitmapFonts.add(t,Nr(i).then(a=>Oo(ft.fromImage(B.ggl,a,s),r,n,s.chars??So)))}o(Uo,"loadBitmapFont");function No(t,e){return e=Be(e),X.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await Ur(e):e,s=await Promise.all(n.frames.map(Nr)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let a=i.getContext("2d");if(!a)throw new Error("Failed to create canvas context");s.forEach((l,c)=>{a.drawImage(l,0,c*n.height)});let h=await Ht(null,i,{sliceY:n.frames.length,anims:n.anims});r(h)}))}o(No,"loadPedit");var ir,yu=(ir=class{constructor(e,r,n,s){v(this,"ctx");v(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,a=i.createShader(i.VERTEX_SHADER),h=i.createShader(i.FRAGMENT_SHADER);if(!a||!h)throw new Error("Failed to create shader");i.shaderSource(a,r),i.shaderSource(h,n),i.compileShader(a),i.compileShader(h);let l=i.createProgram();if(this.glProgram=l,i.attachShader(l,a),i.attachShader(l,h),s.forEach((c,u)=>i.bindAttribLocation(l,u,c)),i.linkProgram(l),!i.getProgramParameter(l,i.LINK_STATUS)){let c=i.getShaderInfoLog(a);if(c)throw new Error("VERTEX SHADER "+c);let u=i.getShaderInfoLog(h);if(u)throw new Error("FRAGMENT SHADER "+u)}i.deleteShader(a),i.deleteShader(h)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof $e)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof J)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof M)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],Fl(s)?r.uniform1fv(i,s):Il(s)?r.uniform2fv(i,s.map(a=>[a.x,a.y]).flat()):Dl(s)&&r.uniform3fv(i,s.map(a=>[a.r,a.g,a.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(ir,"Shader"),ir);function bn(t,e=qn,r=Gn){let n=lu.replace("{{user}}",e??qn),s=uu.replace("{{user}}",r??Gn);try{return new yu(t,n,s,fs.map(i=>i.name))}catch(i){let a=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,h=Ol(i).match(a);if(!(h!=null&&h.groups))throw i;let l=Number(h.groups.line)-14,c=h.groups.msg.trim(),u=h.groups.type.toLowerCase();throw new Error(`${u} shader line ${l}: ${c}`)}}o(bn,"makeShader");function Lo(t){if(!t)return B.defShader;if(typeof t=="string"){let e=As(t);if(e)return e.data??e;if(xt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof Ue)return t.data?t.data:t;return t}o(Lo,"resolveShader");function As(t){return X.shaders.get(t)??null}o(As,"getShader");function qo(t,e,r){return X.shaders.addLoaded(t,bn(B.ggl,e,r))}o(qo,"loadShader");function Go(t,e,r){e=Be(e),r=Be(r);let n=o(i=>i?Co(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,a])=>bn(B.ggl,i,a));return X.shaders.add(t,s)}o(Go,"loadShaderURL");var it,Pr=(it=class{constructor(e){v(this,"buf");this.buf=e}static fromArrayBuffer(e){return new Promise((r,n)=>pe.ctx.decodeAudioData(e,r,n)).then(r=>new it(r))}static fromURL(e){return eo(e)?it.fromArrayBuffer($i(e)):Bo(e).then(r=>it.fromArrayBuffer(r))}},o(it,"SoundData"),it);function jo(t){if(typeof t=="string"){let e=xs(t);if(e)return e;if(xt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof Pr)return Ue.loaded(t);if(t instanceof Ue)return t;throw new Error(`Invalid sound: ${t}`)}}o(jo,"resolveSound");function xs(t){return X.sounds.get(t)??null}o(xs,"getSound");function Ko(t,e){return e=Be(e),X.sounds.add(t,typeof e=="string"?Pr.fromURL(e):Pr.fromArrayBuffer(e))}o(Ko,"loadSound");function Ho(t,e){let r=Be(e),n=new Audio(r);return n.preload="auto",X.music[t]=r}o(Ho,"loadMusic");function vs(t,e){return t=Be(t),tn(typeof e=="string"?new Promise((r,n)=>{Ur(e).then(s=>{vs(t,s).then(r).catch(n)})}):vt.from(t).then(r=>{let n={};for(let s in e){let i=e[s],a=r.frames[0],h=2048*a.w,l=2048*a.h,c=i.frames?i.frames.map(d=>new ae(a.x+(i.x+d.x)/h*a.w,a.y+(i.y+d.y)/l*a.h,d.w/h*a.w,d.h/l*a.h)):gs(i.sliceX||1,i.sliceY||1,a.x+i.x/h*a.w,a.y+i.y/l*a.h,i.width/h*a.w,i.height/l*a.h),u=new vt(r.tex,c,i.anims);X.sprites.addLoaded(s,u),n[s]=u}return n}))}o(vs,"loadSpriteAtlas");function ut(t,e,r=!1,n,s,i={}){let a=n??B.defTex,h=s??B.defShader,l=Lo(h);if(!l||l instanceof Ue)return;let c=B.fixed||r?B.transform:S.cam.transform.mult(B.transform),u=[];for(let d of t){let g=xo(c.multVec2(d.pos));u.push(g.x,g.y,d.uv.x,d.uv.y,d.color.r/255,d.color.g/255,d.color.b/255,d.opacity)}B.renderer.push(B.ggl.gl.TRIANGLES,u,e,l,a,i)}o(ut,"drawRaw");function dt(t){if(!t.pts)throw new Error('drawPolygon() requires property "pts".');let e=t.pts.length;if(!(e<3)){if(Ie(),he(t.pos),fr(t.scale),It(t.angle),he(t.offset),t.fill!==!1){let r=t.color??J.WHITE,n=t.pts.map((i,a)=>({pos:new M(i.x,i.y),uv:t.uv?t.uv[a]:new M(0,0),color:t.colors&&t.colors[a]?t.colors[a].mult(r):r,opacity:t.opacity??1})),s;t.triangulate?s=us(t.pts).map(i=>i.map(a=>t.pts.indexOf(a))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),ut(n,t.indices??s,t.fixed,t.uv?t.tex:B.defTex,t.shader,t.uniform??void 0)}t.outline&&Vn({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Re()}}o(dt,"drawPolygon");function bs(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=kt(t.anchor??"center").scale(new M(-t.radiusX,-t.radiusY)),s=qt(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&dt(Object.assign({},i,{outline:null})),dt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}dt(i)}o(bs,"drawEllipse");function Lr(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&bs(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(Lr,"drawCircle");function Gt(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=[e.sub(s),e.add(s),r.add(s),r.sub(s)].map(a=>({pos:new M(a.x,a.y),uv:new M(0),color:t.color??J.WHITE,opacity:t.opacity??1}));ut(i,[0,1,3,1,2,3],t.fixed,B.defTex,t.shader,t.uniform??void 0)}o(Gt,"drawLine");function Yo(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||b(0,0),a;s?a=e[0].sub(e[e.length-2]):a=e[1].sub(e[0]);let h=a.len(),l=a.normal().scale(-n/h),c,u=e[0];if(!s)switch(t.cap){case"square":{let f=a.scale(-n/h);r.push(u.add(f).add(l)),r.push(u.add(f).sub(l));break}case"round":{let f=Math.max(n,10),A=Math.PI/f,y=l.scale(-1),V=Math.cos(A),I=Math.sin(A);for(let L=0;L0?(r.push(c.add(K)),r.push(c.sub(l)),r.push(c.add(K)),r.push(c.sub(V))):(r.push(c.add(l)),r.push(c.sub(K)),r.push(c.add(V)),r.push(c.sub(K))),a=A,h=y,l=V}if(!s)switch(r.push(u.add(l)),r.push(u.sub(l)),t.cap){case"square":{let f=a.scale(n/h);r.push(u.add(f).add(l)),r.push(u.add(f).sub(l));break}case"round":{let f=Math.max(n,10),A=Math.PI/f,y=l.scale(1),V=Math.cos(A),I=Math.sin(A);for(let L=0;L({pos:i.add(f),uv:b(),color:t.color||J.WHITE,opacity:t.opacity??1})),g=[],m=0;for(let f=0;f0){let D=c.add(K),w=Math.max(n,10),x=ge(l.angleBetween(V)/w),C=l,P=Math.cos(x),k=Math.sin(x);for(let N=0;N({pos:i.add(f),uv:b(),color:t.color||J.WHITE,opacity:t.opacity??1})),g=[],m=0;for(let f=0;f({pos:i.add(f),uv:b(),color:t.color||J.WHITE,opacity:t.opacity??1})),g=[],m=0;for(let f=0;f2)switch(t.join){case"bevel":return Yo(t);case"round":return zo(t);case"miter":return Qo(t)}if(t.radius&&e.length>=3){Gt(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;nmn(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Wo,"drawBezier");var Dt,ft=(Dt=class{constructor(e,r,n,s={}){v(this,"ctx");v(this,"src",null);v(this,"glTex");v(this,"width");v(this,"height");this.ctx=e;let i=e.gl,a=e.gl.createTexture();if(!a)throw new Error("Failed to create texture");this.glTex=a,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let h={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],l={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,l),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,l),this.unbind()}static fromImage(e,r,n={}){let s=new Dt(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(Dt,"Texture"),Dt),or,rn=(or=class{constructor(e,r,n,s={}){v(this,"ctx");v(this,"tex");v(this,"glFramebuffer");v(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new ft(e,r,n,s);let a=i.createFramebuffer(),h=i.createRenderbuffer();if(!a||!h)throw new Error("Failed to create framebuffer");this.glFramebuffer=a,this.glRenderbuffer=h,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let a=i*n,h=(this.height-i-1)*n;s.set(r.subarray(a,a+n)),r.copyWithin(a,h,h+n),r.set(s,h)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(or,"FrameBuffer"),or),ar,Au=(ar=class{constructor(e,r,n,s){v(this,"ctx");v(this,"glVBuf");v(this,"glIBuf");v(this,"vqueue",[]);v(this,"iqueue",[]);v(this,"stride");v(this,"maxVertices");v(this,"maxIndices");v(this,"vertexFormat");v(this,"numDraws",0);v(this,"curPrimitive",null);v(this,"curTex",null);v(this,"curShader",null);v(this,"curUniform",{});let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((h,l)=>h+l.size,0),this.maxVertices=n,this.maxIndices=s;let a=i.createBuffer();if(!a)throw new Error("Failed to create vertex buffer");this.glVBuf=a,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,a={}){(e!==this.curPrimitive||i!==this.curTex||s!==this.curShader||!yn(this.curUniform,a)||this.vqueue.length+r.length*this.stride>this.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&this.flush();let h=this.vqueue.length/this.stride;for(let l of r)this.vqueue.push(l);for(let l of n)this.iqueue.push(l+h);this.curPrimitive=e,this.curShader=s,this.curTex=i,this.curUniform=a}flush(){var r,n;if(!this.curPrimitive||!this.curShader||this.vqueue.length===0||this.iqueue.length===0)return;let e=this.ctx.gl;this.ctx.pushArrayBuffer(this.glVBuf),e.bufferSubData(e.ARRAY_BUFFER,0,new Float32Array(this.vqueue)),this.ctx.pushElementArrayBuffer(this.glIBuf),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,new Uint16Array(this.iqueue)),this.ctx.setVertexFormat(this.vertexFormat),this.curShader.bind(),this.curShader.send(this.curUniform),(r=this.curTex)==null||r.bind(),e.drawElements(this.curPrimitive,this.iqueue.length,e.UNSIGNED_SHORT,0),(n=this.curTex)==null||n.unbind(),this.curShader.unbind(),this.ctx.popArrayBuffer(),this.ctx.popElementArrayBuffer(),this.vqueue=[],this.iqueue=[],this.numDraws++}free(){let e=this.ctx.gl;e.deleteBuffer(this.glVBuf),e.deleteBuffer(this.glIBuf)}},o(ar,"BatchRenderer"),ar);function ct(t){let e=[],r=o(i=>{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(ct,"genStack");function Xo(t,e={}){let r=[];function n(D){r.push(D)}o(n,"onDestroy");function s(){r.forEach(w=>w());let D=t.getExtension("WEBGL_lose_context");D&&D.loseContext()}o(s,"destroy");let i=null;function a(D){if(yn(D,i))return;i=D;let w=D.reduce((x,C)=>x+C.size,0);D.reduce((x,C,P)=>(t.vertexAttribPointer(P,C.size,t.FLOAT,!1,w*4,x),t.enableVertexAttribArray(P),x+C.size*4),0)}o(a,"setVertexFormat");let[h,l]=ct(D=>t.bindTexture(t.TEXTURE_2D,D)),[c,u]=ct(D=>t.bindBuffer(t.ARRAY_BUFFER,D)),[d,g]=ct(D=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,D)),[m,f]=ct(D=>t.bindFramebuffer(t.FRAMEBUFFER,D)),[A,y]=ct(D=>t.bindRenderbuffer(t.RENDERBUFFER,D)),[V,I]=ct(D=>{if(!D)return;let{x:w,y:x,w:C,h:P}=D;t.viewport(w,x,C,P)}),[L,K]=ct(D=>t.useProgram(D));return V({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:h,popTexture2D:l,pushArrayBuffer:c,popArrayBuffer:u,pushElementArrayBuffer:d,popElementArrayBuffer:g,pushFramebuffer:m,popFramebuffer:f,pushRenderbuffer:A,popRenderbuffer:y,pushViewport:V,popViewport:I,pushProgram:L,popProgram:K,setVertexFormat:a}}o(Xo,"initGfx");var In={};function Kn(t,e){e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(b(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Kn,"applyCharTransform");function nn(t){let e={},r="",n=[],s=String(t),i=o(a=>{n.length>0&&(e[r.length]=n.slice()),r+=a},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let a=/^\[(\/)?(\w+?)\]/.exec(s);if(!a){i(s[0]),s=s.slice(1);continue}let[h,l,c]=a;if(l!==void 0){let u=n.pop();if(u!==c)throw u!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${u}], got [/${c}]`):new Error(`Styled text error: stray end tag [/${c}]`)}else n.push(c);s=s.slice(h.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(nn,"compileStyledText");function bt(t){var I,L,K;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=ms(t.font);if(!t.text||t.text===""||e instanceof Ue||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=nn(t.text+""),s=ro(n);if(e instanceof Zr||typeof e=="string"){let D=e instanceof Zr?e.fontface.family:e,w=e instanceof Zr?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ln},x=In[D]??{font:{tex:new ft(B.ggl,2048,2048,{filter:w.filter}),map:{},size:64},cursor:new M(0),outline:w.outline};In[D]||(In[D]=x),e=x.font;for(let C of s)if(!x.font.map[C]){let P=pl;if(!P)throw new Error("fontCacheC2d is not defined.");if(!Rt)throw new Error("fontCacheCanvas is not defined.");P.clearRect(0,0,Rt.width,Rt.height),P.font=`${e.size}px ${D}`,P.textBaseline="top",P.textAlign="left",P.fillStyle="#ffffff";let k=P.measureText(C),N=Math.ceil(k.width);if(!N)continue;let q=k.fontBoundingBoxAscent+k.fontBoundingBoxDescent;x.outline&&x.outline.width&&x.outline.color&&(P.lineJoin="round",P.lineWidth=x.outline.width*2,P.strokeStyle=x.outline.color.toHex(),P.strokeText(C,x.outline.width,x.outline.width),N+=x.outline.width*2,q+=x.outline.width*3),P.fillText(C,((I=x.outline)==null?void 0:I.width)??0,((L=x.outline)==null?void 0:L.width)??0);let H=P.getImageData(0,0,N,q);if(x.cursor.x+N>2048&&(x.cursor.x=0,x.cursor.y+=q,x.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(H,x.cursor.x,x.cursor.y),e.map[C]=new ae(x.cursor.x,x.cursor.y,N,q),x.cursor.x+=N}}let i=t.size||e.size,a=b(t.scale??1).scale(i/e.size),h=t.lineSpacing??0,l=t.letterSpacing??0,c=0,u=0,d=0,g=[],m=[],f=0,A=null,y=0;for(;ft.width&&(d+=i+h,A!=null&&(f-=m.length-A,D=s[f],w=e.map[D],x=w.w*a.x,m=m.slice(0,A-1),c=y),A=null,y=0,g.push({width:c-l,chars:m}),c=0,m=[]),m.push({tex:e.tex,width:w.w,height:w.h,quad:new ae(w.x/e.tex.width,w.y/e.tex.height,w.w/e.tex.width,w.h/e.tex.height),ch:D,pos:new M(c,d),opacity:t.opacity??1,color:t.color??J.WHITE,scale:b(a),angle:0}),D===" "&&(A=m.length,y=c),c+=x,u=Math.max(u,c),c+=l}}f++}g.push({width:c-l,chars:m}),d+=i,t.width&&(u=t.width);let V=[];for(let D=0;D{pr({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Re()}o(Vt,"drawFormattedText");function Fe(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=kt(t.anchor||xn).add(1,1).scale(new M(e,r).scale(-.5)),s=[new M(0,0),new M(e,0),new M(e,r),new M(0,r)];if(t.radius){let i=Math.min(e,r)/2,a=Array.isArray(t.radius)?t.radius.map(h=>Math.min(i,h)):new Array(4).fill(Math.min(i,t.radius));s=[new M(a[0],0),...a[1]?qt(new M(e-a[1],a[1]),a[1],a[1],270,360):[b(e,0)],...a[2]?qt(new M(e-a[2],r-a[2]),a[2],a[2],0,90):[b(e,r)],...a[3]?qt(new M(a[3],r-a[3]),a[3],a[3],90,180):[b(0,r)],...a[0]?qt(new M(a[0],a[0]),a[0],a[0],180,270):[]]}dt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Fe,"drawRect");function st(t){Ce();let e=B.width,r=B.height;B.width=B.viewport.width,B.height=B.viewport.height,t(),Ce(),B.width=e,B.height=r}o(st,"drawUnscaled");function Hn(t,e){st(()=>{let r=b(8);Ie(),he(t);let n=bt({text:e,font:en,size:16,pos:r,color:se(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=xe()&&he(b(-s,0)),t.y+i>=ve()&&he(b(0,-i)),Fe({width:s,height:i,color:se(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Re()})}o(Hn,"drawInspectText");function Es(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return dt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Es,"drawTriangle");function Jo(){if(ne.inspect){let t=null;for(let e of S.root.get("*",{recursive:!0}))if(e.c("area")&&e.isHovering()){t=e;break}if(S.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(`${r[n]}`):e.push(`${n}`);Hn(Eo(ds()),e.join(` -`))}Hn(b(8),`FPS: ${ne.fps()}`)}ne.paused&&st(()=>{Ie(),he(xe(),0),he(-8,8);let t=32;Fe({width:t,height:t,anchor:"topright",color:se(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Fe({width:4,height:t*.6,anchor:"center",pos:b(-t/3*e,t*.5),color:se(255,255,255),radius:2,fixed:!0});Re()}),ne.timeScale!==1&&st(()=>{Ie(),he(xe(),ve()),he(-8,-8);let t=8,e=bt({text:ne.timeScale.toFixed(1),font:en,size:16,color:se(255,255,255),pos:b(-t),anchor:"botright",fixed:!0});Fe({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:se(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=ne.timeScale<1;Es({p1:b(-e.width-t*(n?2:3.5),-t),p2:b(-e.width-t*(n?2:3.5),-t-e.height),p3:b(-e.width-t*(n?3.5:2),-t-e.height/2),pos:b(-r*t*1+(n?-t*.5:0),0),color:se(255,255,255),fixed:!0})}Vt(e),Re()}),ne.curRecording&&st(()=>{Ie(),he(0,ve()),he(24,-24),Lr({radius:12,color:se(255,0,0),opacity:Xn(0,1,T.time()*4),fixed:!0}),Re()}),ne.showLog&&S.logs.length>0&&st(()=>{Ie(),he(0,ve()),he(8,-8);let t=8,e=[];for(let n of S.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${sn(n.msg)}[/${i}]`,e.push(s)}S.logs=S.logs.filter(n=>T.time()-n.time<(ue.logTime||4));let r=bt({text:e.join(` -`),font:en,pos:b(t,-t),anchor:"botleft",size:16,width:xe()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:se(127,127,127)},info:{color:se(255,255,255)},error:{color:se(255,0,127)}}});Fe({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:se(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Re()})}o(Jo,"drawDebug");function sn(t,e=!1){var r="",n;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(r=["[",t.map(s=>sn(s,!0)).join(", "),"]"].join(""),t=r),typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(r+=t.constructor.name+" "),r+=["{",(n=Object.getOwnPropertyNames(t).map(s=>`${/^\w+$/.test(s)?s:JSON.stringify(s)}: ${sn(t[s],!0)}`).join(", "))?` ${n} `:"","}"].join(""),t=r),String(t).replaceAll(new RegExp("(?0?S.events.trigger("loading",t):st(()=>{let e=xe()/2,r=24,n=b(xe()/2,ve()/2).sub(b(e/2,r/2));Fe({pos:b(0),width:xe(),height:ve(),color:se(0,0,0)}),Fe({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Fe({pos:n,width:e*t,height:r})})}o($o,"drawLoadScreen");function Ms(t,e,r){let n=B.ggl.gl;Ce(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ce(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ce(),n.disable(n.STENCIL_TEST)}o(Ms,"drawStenciled");function _o(t,e){let r=B.ggl.gl;Ms(t,e,r.EQUAL)}o(_o,"drawMasked");function Dr(t){if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new ae(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=new M(1);if(t.tiled){let i=kt(t.anchor||xn).add(new M(1,1)).scale(.5).scale(t.width||r,t.height||n),a=(t.width||r)/r,h=(t.height||n)/n,l=Math.floor(a),c=Math.floor(h),u=a-l,d=h-c,g=(l+u?1:0)*(c+d?1:0),m=new Array(g*6),f=new Array(g*4),A=0,y=o((V,I,L,K,D)=>{m[A*6+0]=A*4+0,m[A*6+1]=A*4+1,m[A*6+2]=A*4+3,m[A*6+3]=A*4+1,m[A*6+4]=A*4+2,m[A*6+5]=A*4+3,f[A*4+0]={pos:new M(V-i.x,I-i.y),uv:new M(D.x,D.y),color:t.color||J.WHITE,opacity:t.opacity||1},f[A*4+1]={pos:new M(V+L-i.x,I-i.y),uv:new M(D.x+D.w,D.y),color:t.color||J.WHITE,opacity:t.opacity||1},f[A*4+2]={pos:new M(V+L-i.x,I+K-i.y),uv:new M(D.x+D.w,D.y+D.h),color:t.color||J.WHITE,opacity:t.opacity||1},f[A*4+3]={pos:new M(V-i.x,I+K-i.y),uv:new M(D.x,D.y+D.h),color:t.color||J.WHITE,opacity:t.opacity||1},A++},"addQuad");for(let V=0;V{let r=bn(e,qn,Gn),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,a=ft.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),h=t.width&&t.height?new rn(e,t.width*n*s,t.height*n*s):new rn(e,i.drawingBufferWidth,i.drawingBufferHeight),l=null,c=1;t.background&&(typeof t.background=="string"?l=se(t.background):(l=se(...t.background),c=t.background[3]??1),i.clearColor(l.r/255,l.g/255,l.b/255,c??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let u=new Au(e,fs,ou,au),d=ft.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"});return{lastDrawCalls:0,ggl:e,defShader:r,defTex:a,frameBuffer:h,postShader:null,postShaderUniform:null,renderer:u,transform:new $e,transformStack:[],bgTex:d,bgColor:l,bgAlpha:c,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Ss(){let t=Qe,e=B.ggl.gl.drawingBufferWidth/t,r=B.ggl.gl.drawingBufferHeight/t;if(ue.letterbox){if(!ue.width||!ue.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=ue.width/ue.height;if(n>s){let i=r*s,a=(e-i)/2;B.viewport={x:a,y:0,width:i,height:r}}else{let i=e/s,a=(r-i)/2;B.viewport={x:0,y:a,width:e,height:i}}return}if(ue.stretch&&(!ue.width||!ue.height))throw new Error("Stretching requires width and height defined.");B.viewport={x:0,y:0,width:e,height:r}}o(Ss,"updateViewport");function pt(t){return t.fixed?!0:t.parent?pt(t.parent):!1}o(pt,"isFixed");function Et(t){return{color:t.color,opacity:t.opacity,anchor:t.anchor,outline:t.outline,shader:t.shader,uniform:t.uniform}}o(Et,"getRenderProps");function ra(t,e={}){return{id:"circle",radius:t,draw(){Lr(Object.assign(Et(this),{radius:this.radius,fill:e.fill}))},renderArea(){return new me(new M(this.anchor?0:-this.radius),this.radius*2,this.radius*2)},inspect(){return`radius: ${Math.ceil(this.radius)}`}}}o(ra,"circle");function Rs(...t){return{id:"color",color:se(...t),inspect(){return`color: ${this.color.toString()}`}}}o(Rs,"color");function na(t){return{add(){this.canvas=t}}}o(na,"drawon");function sa(t=1){let e,r=0,n=!1;return{require:["opacity"],add(){e=this.opacity,this.opacity=0},update(){n||(r+=lt(),this.opacity=Ke(r,0,t,0,e),r>=t&&(this.opacity=e,n=!0))}}}o(sa,"fadeIn");function ia(t="intersect"){return{id:"mask",mask:t}}o(ia,"mask");function Cs(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=G.easings.linear){return S.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=G.easings.linear){return S.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${_r(this.opacity,1)}`}}}o(Cs,"opacity");function oa(t=1,e=se(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(oa,"outline");var lr,vu=(lr=class{constructor(){v(this,"pos",b(0));v(this,"vel",b(0));v(this,"acc",b(0));v(this,"angle",0);v(this,"angularVelocity",0);v(this,"damping",0);v(this,"t");v(this,"lt",null);v(this,"gc");this.t=0,this.gc=!0}get progress(){return this.lt?this.t/this.lt:this.t}},o(lr,"Particle"),lr);function aa(t,e){let r=e.lifetime,n=[],s=t.colors||[J.WHITE],i=t.opacities||[1],a=t.quads||[new ae(0,0,1,1)],h=t.scales||[1],l=t.lifeTime,c=e.direction,u=e.spread,d=t.speed||[0,0],g=t.angle||[0,0],m=t.angularVelocity||[0,0],f=t.acceleration||[b(0),b(0)],A=t.damping||[0,0],y=[],V=new Array(t.max),I=0,L=0;for(let w=0;w=x.lt){x.gc=!0,I--;continue}x.vel=x.vel.add(x.acc.scale(w)).scale(1-x.damping*w),x.pos=x.pos.add(x.vel.scale(w)),x.angle+=x.angularVelocity*w}for(r!==void 0&&(r-=w,r<=0&&K.trigger()),L+=w;Ie.rate;)this.emit(1),I++,L-=e.rate},draw(){if(!(r!==void 0&&r<=0)){for(let w=0;w`[${r.x},${r.y}]`).join(",")}`}}}o(la,"polygon");function Bs(t,e,r){let n;return S.root.get("area").forEach(s=>{if(r&&r.some(a=>s.is(a)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fraction0&&(S.cam.pos=b(...t)),S.cam.pos?S.cam.pos.clone():Tr()}o(ha,"camPos");function ca(...t){return t.length>0&&(S.cam.scale=b(...t)),S.cam.scale.clone()}o(ca,"camScale");function da(t){return t!==void 0&&(S.cam.angle=t),S.cam.angle}o(da,"camRot");function fa(t=se(255,255,255),e=1){let r=S.root.add([Ts(xe(),ve()),Rs(t),Cs(1),Ls()]),n=r.fadeOut(e);return n.onEnd(()=>Fs(r)),n}o(fa,"camFlash");function pa(){return S.cam.transform.clone()}o(pa,"camTransform");function ga(t=12){S.cam.shake+=t}o(ga,"shake");function ma(t){return S.cam.transform.multVec2(t)}o(ma,"toScreen");function wa(t){return S.cam.transform.invert().multVec2(t)}o(wa,"toWorld");function ya(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=S.root.add([Ir(e.pos??b(0))]),n=t.length,s=0,i=null,a=null,h=null,l=null,c=o(w=>w.x+w.y*s,"tile2Hash"),u=o(w=>b(Math.floor(w%s),Math.floor(w/s)),"hash2Tile"),d=o(()=>{i=[];for(let w of r.children)g(w)},"createSpatialMap"),g=o(w=>{let x=c(w.tilePos);i[x]?i[x].push(w):i[x]=[w]},"insertIntoSpatialMap"),m=o(w=>{let x=c(w.tilePos);if(i[x]){let C=i[x].indexOf(w);C>=0&&i[x].splice(C,1)}},"removeFromSpatialMap"),f=o(()=>{let w=!1;for(let x of r.children){let C=r.pos2Tile(x.pos);(x.tilePos.x!=C.x||x.tilePos.y!=C.y)&&(w=!0,m(x),x.tilePos.x=C.x,x.tilePos.y=C.y,g(x))}w&&r.trigger("spatialMapChanged")},"updateSpatialMap"),A=o(()=>{let w=r.getSpatialMap(),x=r.numRows()*r.numColumns();a?a.length=x:a=new Array(x),a.fill(1,0,x);for(let C=0;C{let w=r.getSpatialMap(),x=r.numRows()*r.numColumns();h?h.length=x:h=new Array(x),h.fill(15,0,x);for(let C=0;C{let w=r.numRows()*r.numColumns(),x=o((P,k)=>{let N=[];for(N.push(P);N.length>0;){let q=N.pop();K(q).forEach(H=>{l[H]<0&&(l[H]=k,N.push(H))})}},"traverse");l?l.length=w:l=new Array(w),l.fill(-1,0,w);let C=0;for(let P=0;P=0){C++;continue}x(P,C),C++}},"createConnectivityMap"),I=o((w,x)=>a[x],"getCost"),L=o((w,x)=>{let C=u(w),P=u(x);return C.dist(P)},"getHeuristic"),K=o((w,x)=>{let C=[],P=Math.floor(w%s),k=P>0&&h[w]&1&&a[w-1]!==1/0,N=w>=s&&h[w]&2&&a[w-s]!==1/0,q=P{if(typeof w=="string"){if(e.tiles[w]){if(typeof e.tiles[w]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[w](C)}else if(e.wildcardTile)return e.wildcardTile(w,C)}else{if(Array.isArray(w))return w;throw new Error("Expected a symbol or a component list")}})();if(!P)return null;let k=!1,N=!1;for(let H of P)H.id==="tile"&&(N=!0),H.id==="pos"&&(k=!0);k||P.push(Ir(this.tile2Pos(C))),N||P.push(ks());let q=r.add(P);return k&&(q.tilePosOffset=q.pos.clone()),q.tilePos=C,q.transform=Kt(q),i&&(g(q),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),q},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...w){return b(...w).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...w){let x=b(...w);return b(Math.floor(x.x/this.tileWidth()),Math.floor(x.y/this.tileHeight()))},getSpatialMap(){return i||d(),i},onSpatialMapChanged(w){return this.on("spatialMapChanged",w)},onNavigationMapInvalid(w){return this.on("navigationMapInvalid",w)},getAt(w){i||d();let x=c(w);return i[x]||[]},raycast(w,x){let C=this.toWorld(w),P=this.toWorld(w.add(x)).sub(C),k=1/this.tileWidth(),N=w.scale(k),q=Si(N,x,H=>{let W=this.getAt(H);if(W.some(Q=>Q.isObstacle))return!0;let Z=null;for(let Q of W)if(Q.is("area")){let Y=Q.worldArea().raycast(C,P);Y&&(Z?Y.fraction=s||w.y<0||w.y>=n||x.x<0||x.x>=s||x.y<0||x.y>=n)return null;let P=c(w),k=c(x);if(a[k]===1/0)return null;if(P===k)return[];if(l[P]!=-1&&l[P]!==l[k])return null;let N=new Ji((te,$)=>te.cost<$.cost);N.insert({cost:0,node:P});let q=new Map;q.set(P,P);let H=new Map;for(H.set(P,0);N.length!==0;){let te=(Y=N.remove())==null?void 0:Y.node;if(te===k)break;let $=K(te,C.allowDiagonals);for(let F of $){let j=(H.get(te)||0)+I(te,F)+L(F,k);(!H.has(F)||jq.scale(P,k).add(P/2,k/2)),x]:null}};return r.use(D),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((w,x)=>{let C=w.split("");s=Math.max(C.length,s),C.forEach((P,k)=>{r.spawn(P,b(k,x))})}),r}o(ya,"addLevel");function _e(t,e,r){return S.objEvents.registers[t]||(S.objEvents.registers[t]=new to),S.objEvents.on(t,(n,...s)=>{n.is(e)&&r(n,...s)})}o(_e,"on");var bu=fe(t=>{let e=S.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>_e("fixedUpdate",t,e)),Vu=fe(t=>{let e=S.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>_e("update",t,e)),Eu=fe(t=>{let e=S.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>_e("draw",t,e)),Aa=fe(t=>S.events.on("add",t),(t,e)=>_e("add",t,e)),Mu=fe(t=>S.events.on("destroy",t),(t,e)=>_e("destroy",t,e));function xa(t,e,r){return _e("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(xa,"onCollide");function va(t,e,r){return _e("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(va,"onCollideUpdate");function ba(t,e,r){return _e("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(ba,"onCollideEnd");function qr(t,e){S.root.get(t,{recursive:!0}).forEach(e),Aa(t,e)}o(qr,"forAllCurrentAndFuture");var Su=fe(t=>T.onMousePress(t),(t,e)=>{let r=[];return qr(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),Ft.join(r)});function Va(t,e){let r=[];return qr(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),Ft.join(r)}o(Va,"onHover");function Ea(t,e){let r=[];return qr(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),Ft.join(r)}o(Ea,"onHoverUpdate");function Ma(t,e){let r=[];return qr(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),Ft.join(r)}o(Ma,"onHoverEnd");function Sa(t){S.events.on("loading",t)}o(Sa,"onLoading");function Ra(t){T.onResize(t)}o(Ra,"onResize");function Ca(t){S.events.on("error",t)}o(Ca,"onError");function En(t){X.loaded?t():S.events.on("load",t)}o(En,"onLoad");function Mn(t=[]){let e=new Map,r=[],n={},s=new Cr,i=[],a=null,h=!1,l={id:Nl(),hidden:!1,transform:new $e,children:[],parent:null,set paused(u){if(u!==h){h=u;for(let d of i)d.paused=u}},get paused(){return h},get tags(){let u=[];for(let[d,g]of e.entries())Object.keys(g).length==1&&u.push(d);return u},add(u){let d=Array.isArray(u)?Mn(u):u;if(d.parent)throw new Error("Cannot add a game obj that already has a parent.");return d.parent=this,d.transform=Kt(d),this.children.push(d),d.trigger("add",d),S.events.trigger("add",d),d},readd(u){let d=this.children.indexOf(u);return d!==-1&&(this.children.splice(d,1),this.children.push(u)),u},remove(u){let d=this.children.indexOf(u);if(d!==-1){u.parent=null,this.children.splice(d,1);let g=o(m=>{m.trigger("destroy"),S.events.trigger("destroy",m),m.children.forEach(f=>g(f))},"trigger");g(u)}},removeAll(u){if(u)this.get(u).forEach(d=>this.remove(d));else for(let d of[...this.children])this.remove(d)},fixedUpdate(){this.paused||(this.children.forEach(u=>u.fixedUpdate()),this.trigger("fixedUpdate"))},update(){this.paused||(this.children.forEach(u=>u.update()),this.trigger("update"))},draw(){if(this.hidden)return;this.canvas&&(Ce(),this.canvas.bind());let u=B.fixed;this.fixed&&(B.fixed=!0),Ie(),he(this.pos),fr(this.scale),It(this.angle);let d=this.children.sort((g,m)=>{let f=g.layerIndex??S.defaultLayerIndex,A=m.layerIndex??S.defaultLayerIndex;return f-A||(g.z??0)-(m.z??0)});if(this.mask){let g={intersect:G.drawMasked,subtract:G.drawSubtracted}[this.mask];if(!g)throw new Error(`Invalid mask func: "${this.mask}"`);g(()=>{d.forEach(m=>m.draw())},()=>{this.trigger("draw")})}else this.trigger("draw"),d.forEach(g=>g.draw());Re(),B.fixed=u,this.canvas&&(Ce(),this.canvas.unbind())},drawInspect(){this.hidden||(Ie(),he(this.pos),fr(this.scale),It(this.angle),this.children.forEach(u=>u.drawInspect()),this.trigger("drawInspect"),Re())},use(u){if(!u)return;if(typeof u=="string")return this.use({id:u});let d=[];u.id?(this.unuse(u.id),n[u.id]=[],d=n[u.id],e.set(u.id,u)):r.push(u);for(let m in u){if(hu.has(m))continue;let f=Object.getOwnPropertyDescriptor(u,m);if(f)if(typeof f.value=="function"&&(u[m]=u[m].bind(this)),f.set&&Object.defineProperty(u,m,{set:f.set.bind(this)}),f.get&&Object.defineProperty(u,m,{get:f.get.bind(this)}),cu.has(m)){let A=m==="add"?()=>{var y;a=o(V=>d.push(V),"onCurCompCleanup"),(y=u[m])==null||y.call(u),a=null}:u[m];d.push(this.on(m,A).cancel)}else if(this[m]===void 0)Object.defineProperty(this,m,{get:o(()=>u[m],"get"),set:o(A=>u[m]=A,"set"),configurable:!0,enumerable:!0}),d.push(()=>delete this[m]);else throw new Error(`Duplicate component property: "${m}"`)}let g=o(()=>{if(u.require){for(let m of u.require)if(!this.c(m))throw new Error(`Component "${u.id}" requires component "${m}"`)}},"checkDeps");u.destroy&&d.push(u.destroy.bind(this)),this.exists()?(g(),u.add&&(a=o(m=>d.push(m),"onCurCompCleanup"),u.add.call(this),a=null)):u.require&&d.push(this.on("add",g).cancel)},unuse(u){if(e.has(u)){for(let d of e.values())if(d.require&&d.require.includes(u))throw new Error(`Can't unuse. Component "${d.id}" requires component "${u}"`);e.delete(u)}n[u]&&(n[u].forEach(d=>d()),delete n[u])},c(u){return e.get(u)??null},get(u,d={}){let g=d.recursive?this.children.flatMap(o(function m(f){return[f,...f.children.flatMap(m)]},"recurse")):this.children;if(g=g.filter(m=>u?m.is(u):!0),d.liveUpdate){let m=o(A=>d.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),f=[];f.push(G.onAdd(A=>{m(A)&&A.is(u)&&g.push(A)})),f.push(G.onDestroy(A=>{if(m(A)&&A.is(u)){let y=g.findIndex(V=>V.id===A.id);y!==-1&&g.splice(y,1)}})),this.onDestroy(()=>{for(let A of f)A.cancel()})}return g},query(u){let d=u.hierarchy||"children",g=u.include,m=u.exclude,f=[];switch(d){case"children":f=this.children;break;case"siblings":f=this.parent?this.parent.children.filter(y=>y!==this):[];break;case"ancestors":let A=this.parent;for(;A;)f.push(A),A=A.parent;break;case"descendants":f=this.children.flatMap(o(function y(V){return[V,...V.children.flatMap(y)]},"recurse"));break}if(g&&((u.includeOp||"and")==="and"||!Array.isArray(u.include)?f=f.filter(A=>A.is(g)):f=f.filter(A=>u.include.some(y=>A.is(y)))),m&&((u.includeOp||"and")==="and"||!Array.isArray(u.include)?f=f.filter(A=>!A.is(m)):f=f.filter(A=>!u.exclude.some(y=>A.is(y)))),u.visible===!0&&(f=f.filter(A=>A.visible)),u.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let A=u.distanceOp||"near",y=u.distance*u.distance;A==="near"?f=f.filter(V=>V.pos&&this.pos.sdist(V.pos)<=y):f=f.filter(V=>V.pos&&this.pos.sdist(V.pos)>y)}return u.name&&(f=f.filter(A=>A.name===u.name)),f},isAncestorOf(u){return u.parent?u.parent===this||this.isAncestorOf(u.parent):!1},exists(){return S.root.isAncestorOf(this)},is(u){if(u==="*")return!0;if(Array.isArray(u)){for(let d of u)if(!this.c(d))return!1;return!0}else return this.c(u)!=null},on(u,d){let g=s.on(u,d.bind(this));return a&&a(()=>g.cancel()),g},trigger(u,...d){s.trigger(u,...d),S.objEvents.trigger(u,this,...d)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var d;let u={};for(let[g,m]of e)u[g]=((d=m.inspect)==null?void 0:d.call(m))??null;for(let[g,m]of r.entries()){if(m.inspect){u[g]=m.inspect();continue}for(let[f,A]of Object.entries(m))typeof A!="function"&&(u[f]=`${f}: ${A}`)}return u},onAdd(u){return this.on("add",u)},onFixedUpdate(u){return this.on("fixedUpdate",u)},onUpdate(u){return this.on("update",u)},onDraw(u){return this.on("draw",u)},onDestroy(u){return this.on("destroy",u)},clearEvents(){s.clear()}},c=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let u of c)l[u]=(...d)=>{var m;let g=(m=T[u])==null?void 0:m.call(T,...d);return i.push(g),l.onDestroy(()=>g.cancel()),l.on("sceneEnter",()=>{var A;i.splice(i.indexOf(g),1);let f=(A=T[u])==null?void 0:A.call(T,...d);Ft.replace(g,f),i.push(g)}),g};for(let u of t)l.use(u);return l}o(Mn,"make");var Ru=o(()=>({events:new Cr,objEvents:new Cr,root:Mn([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new M(1),angle:0,shake:0,transform:new $e}}),"initGame");function Ba(t){S.gravity=t?(S.gravity||b(0,1)).unit().scale(t):null}o(Ba,"setGravity");function Ta(){return S.gravity?S.gravity.len():0}o(Ta,"getGravity");function Pa(t){S.gravity=t.unit().scale(S.gravity?S.gravity.len():1)}o(Pa,"setGravityDirection");function Da(){return S.gravity?S.gravity.unit():b(0,1)}o(Da,"getGravityDirection");var Cu=Rl("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L5QNSqT5iiySS9Ja2SV//5ME0ak//+4KgAAABgQBAADAMDgYCAEgCteQ0fZH6+ICXA357+MPfhR/+ywRf/U///LVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JknQAFoWhGLm5gBClBmT3GiAAAAAGkHAAAIAAANIOAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"),Bu=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new Pr(wo(t));return t.decodeAudioData(Cu.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function Ia(t,e={}){let r=new Se,n=new Audio(t);pe.ctx.createMediaElementSource(n).connect(pe.masterNode);function s(){ne.paused||T.isHidden()&&!ue.backgroundAudio||pe.ctx.resume()}o(s,"resumeAudioCtx");function i(){s(),n.play()}return o(i,"play"),e.paused||i(),n.onended=()=>r.trigger(),{play(){i()},seek(a){n.currentTime=a},stop(){n.pause(),this.seek(0)},set loop(a){n.loop=a},get loop(){return n.loop},set paused(a){a?n.pause():i()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(a){n.volume=Ze(a,0,1)},get volume(){return n.volume},set speed(a){n.playbackRate=Math.max(a,0)},get speed(){return n.playbackRate},set detune(a){},get detune(){return 0},onEnd(a){return r.add(a)},then(a){return this.onEnd(a)}}}o(Ia,"playMusic");function Ps(t,e={}){if(typeof t=="string"&&X.music[t])return Ia(X.music[t],e);let r=pe.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new Se,a=r.createGain(),h=r.createStereoPanner(),l=e.seek??0,c=0,u=0,d=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(h),s.onended=()=>{var y;f()>=(((y=s.buffer)==null?void 0:y.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},h.pan.value=e.pan??0,h.connect(a),a.connect(pe.masterNode),a.gain.value=e.volume??1;let g=o(y=>{s.buffer=y.buf,n||(c=r.currentTime,s.start(0,l),d=!0)},"start"),m=jo(t);m instanceof Ue&&m.onLoad(g);let f=o(()=>{if(!s.buffer)return 0;let y=n?u-c:r.currentTime-c,V=s.buffer.duration;return s.loop?y%V:Math.min(y,V)},"getTime"),A=o(y=>{let V=r.createBufferSource();return V.buffer=y.buffer,V.loop=y.loop,V.playbackRate.value=y.playbackRate.value,V.detune.value=y.detune.value,V.onended=y.onended,V.connect(h),V},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(y){if(n!==y)if(n=y,y)d&&(s.stop(),d=!1),u=r.currentTime;else{s=A(s);let V=u-c;s.start(0,V),d=!0,c=r.currentTime-V,u=0}},get paused(){return n},play(y=0){this.seek(y),this.paused=!1},seek(y){var V;(V=s.buffer)!=null&&V.duration&&(y>s.buffer.duration||(n?(s=A(s),c=u-y):(s.stop(),s=A(s),c=r.currentTime-y,s.start(0,y),d=!0,u=0)))},set speed(y){s.playbackRate.value=y},get speed(){return s.playbackRate.value},set detune(y){s.detune.value=y},get detune(){return s.detune.value},set volume(y){a.gain.value=Math.max(y,0)},get volume(){return a.gain.value},set pan(y){h.pan.value=y},get pan(){return h.pan.value},set loop(y){s.loop=y},get loop(){return s.loop},duration(){var y;return((y=s.buffer)==null?void 0:y.duration)??0},time(){return f()%this.duration()},onEnd(y){return i.add(y)},then(y){return this.onEnd(y)}}}o(Ps,"play");function Ds(t){return Ps(pe.burpSnd,t)}o(Ds,"burp");function Fa(t){return t!==void 0&&(pe.masterNode.gain.value=t),pe.masterNode.gain.value}o(Fa,"volume");function Is(){T.onHide(()=>{ue.backgroundAudio||pe.ctx.suspend()}),T.onShow(()=>{!ue.backgroundAudio&&!ne.paused&&pe.ctx.resume()}),T.onResize(()=>{if(T.isFullscreen())return;let t=ue.width&&ue.height;t&&!ue.stretch&&!ue.letterbox||(we.width=we.offsetWidth*Qe,we.height=we.offsetHeight*Qe,Ss(),t||(B.frameBuffer.free(),B.frameBuffer=new rn(B.ggl,B.ggl.gl.drawingBufferWidth,B.ggl.gl.drawingBufferHeight),B.width=B.ggl.gl.drawingBufferWidth/Qe/Mr,B.height=B.ggl.gl.drawingBufferHeight/Qe/Mr))}),ue.debug!==!1&&(T.onKeyPress(ue.debugKey??"f1",()=>ne.inspect=!ne.inspect),T.onKeyPress("f2",()=>ne.clearLog()),T.onKeyPress("f8",()=>ne.paused=!ne.paused),T.onKeyPress("f7",()=>{ne.timeScale=_r(Ze(ne.timeScale-.2,0,2),1)}),T.onKeyPress("f9",()=>{ne.timeScale=_r(Ze(ne.timeScale+.2,0,2),1)}),T.onKeyPress("f10",()=>ne.stepFrame())),ue.burp&&T.onKeyPress("b",()=>Ds())}o(Is,"initEvents");function ka(t,e={}){let r=S.root.add([Ir(t),Ns()]),n=(e.speed||1)*5,s=e.scale||1;r.add([on(ml),Fr(0),ln("center"),Qn(n,s),...e.comps??[]]);let i=r.add([on(gl),Fr(0),ln("center"),an(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(Qn(n,s))),i.onDestroy(()=>r.destroy()),r}o(ka,"addKaboom");var Tu=o(function(t,e){if(S.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");S.layers=t,S.defaultLayerIndex=r},"layers");function Fs(t){t.destroy()}o(Fs,"destroy");function Oa(){return S.root}o(Oa,"getTreeRoot");function Ua(t,e){S.scenes[t]=e}o(Ua,"scene");function Na(t,...e){if(!S.scenes[t])throw new Error(`Scene not found: ${t}`);S.events.onOnce("frameEnd",()=>{S.events.trigger("sceneLeave",t),T.events.clear(),S.events.clear(),S.objEvents.clear(),[...S.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?S.root.remove(r):r.trigger("sceneEnter",t)}),S.root.clearEvents(),Is(),S.cam={pos:null,scale:b(1),angle:0,shake:0,transform:new $e},S.scenes[t](...e)}),S.currentScene=t}o(Na,"go");function La(t){return S.events.on("sceneLeave",t)}o(La,"onSceneLeave");function qa(){return S.currentScene}o(qa,"getSceneName");function on(t,e={}){let r=null,n=null,s=null,i=new Se;if(!t)throw new Error("Please pass the resource name or data to sprite()");let a=o((l,c,u,d)=>{let g=b(1,1);return u&&d?(g.x=u/(l.width*c.w),g.y=d/(l.height*c.h)):u?(g.x=u/(l.width*c.w),g.y=g.x):d&&(g.y=d/(l.height*c.h),g.x=g.y),g},"calcTexScale"),h=o((l,c)=>{if(!c)return;let u=c.frames[0].clone();e.quad&&(u=u.scale(e.quad));let d=a(c.tex,u,e.width,e.height);l.width=c.tex.width*u.w*d.x,l.height=c.tex.height*u.h*d.y,e.anim&&l.play(e.anim),r=c,i.trigger(r)},"setSpriteData");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new ae(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(l){let c=Er(l);c&&c.onLoad(u=>h(this,u))},get animFrame(){if(!r||!n||s===null)return this.frame;let l=r.anims[n.name];return typeof l=="number"?l:this.frame-Math.min(l.from,l.to)},draw(){if(!r)return;let l=r.frames[this.frame??0];if(!l)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:c,right:u,top:d,bottom:g}=r.slice9,m=r.tex.width*l.w,f=r.tex.height*l.h,A=this.width-c-u,y=this.height-d-g,V=c/m,I=u/m,L=1-V-I,K=d/f,D=g/f,w=1-K-D,x=[de(0,0,V,K),de(V,0,L,K),de(V+L,0,I,K),de(0,K,V,w),de(V,K,L,w),de(V+L,K,I,w),de(0,K+w,V,D),de(V,K+w,L,D),de(V+L,K+w,I,D),de(0,0,c,d),de(c,0,A,d),de(c+A,0,u,d),de(0,d,c,y),de(c,d,A,y),de(c+A,d,u,y),de(0,d+y,c,g),de(c,d+y,A,g),de(c+A,d+y,u,g)];for(let C=0;C<9;C++){let P=x[C],k=x[C+9];Dr(Object.assign(Et(this),{pos:k.pos(),tex:r.tex,quad:l.scale(P),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:k.w,height:k.h}))}}else Dr(Object.assign(Et(this),{tex:r.tex,quad:l.scale(this.quad??new ae(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let l=Er(t);l?l.onLoad(c=>h(this,c)):En(()=>h(this,Er(t).data))},update(){if(!r||!n||s===null)return;let l=r.anims[n.name];if(typeof l=="number"){this.frame=l;return}if(l.speed===0)throw new Error("Sprite anim speed cannot be 0");n.timer+=lt()*this.animSpeed,n.timer>=1/n.speed&&(n.timer=0,this.frame+=s,(this.frameMath.max(l.from,l.to))&&(n.loop?n.pingpong?(this.frame-=s,s*=-1,this.frame+=s):this.frame=l.from:n.pingpong?s===Math.sign(l.to-l.from)?(this.frame=l.to,s*=-1,this.frame+=s):(this.frame=l.from,n.onEnd(),this.stop()):(this.frame=l.to,n.onEnd(),this.stop())))},play(l,c={}){if(!r){i.add(()=>this.play(l,c));return}let u=r.anims[l];if(u===void 0)throw new Error(`Anim not found: ${l}`);n&&this.stop(),n=typeof u=="number"?{name:l,timer:0,loop:!1,pingpong:!1,speed:0,onEnd:o(()=>{},"onEnd")}:{name:l,timer:0,loop:c.loop??u.loop??!1,pingpong:c.pingpong??u.pingpong??!1,speed:c.speed??u.speed??10,onEnd:c.onEnd??(()=>{})},s=typeof u=="number"?null:u.fromr(this))},draw(){Vt(r(this))},renderArea(){return new me(b(0),this.width,this.height)}};return r(n),n}o(Ga,"text");function ja(t,e){return{id:"rect",width:t,height:e,draw(){pr(Object.assign(Et(this),{width:this.width,height:this.height}))},renderArea(){return new me(b(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(ja,"uvquad");function Ka(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(Ka,"agent");function Ha(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.is("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(Ha,"pathfinder");function Ya(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=e!=null;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(a){r=a},get waypoints(){return e},set waypoints(a){e=a,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let a=this.nextLocation;if(!(!e||!a||i)&&(this.moveTo(a,r),this.pos.sdist(a)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(a){return this.on("patrolFinished",a)}}}o(Ya,"patrol");function za(t,e={}){let r=typeof t=="function"?t:()=>S.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?M.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?M.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(a){this.direction=a!==void 0?M.fromAngle(a):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(a,h,l){let c=(typeof h=="number"?M.fromAngle(h):h)||s,u=l||e.fieldOfView;if(!c||!u||u>=360)return!0;let d=u/2;return a.pos&&c.angleBetween(a.pos.sub(this.pos))<=d},hasLineOfSight(a){let h=Bs(this.pos,a.pos.sub(this.pos),e.raycastExclude);return h!=null&&h.object===a},update(){if(i+=lt(),i>n){i-=n;let a=r();if(a.length&&s&&this.fieldOfView&&this.fieldOfView<360){let h=this.fieldOfView/2;a=a.filter(l=>l.pos&&s.angleBetween(l.pos.sub(this.pos))<=h)}a.length&&e.lineOfSight&&(a=a.filter(h=>h.pos&&this.hasLineOfSight(h))),a.length>0&&(this.spotted=a,this.trigger("objectSpotted",a))}},onObjectsSpotted(a){return this.on("objectSpotted",a)}}}o(za,"sentry");function ks(t={}){let e=b(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let h={left:1,top:2,right:4,bottom:8};return s.map(l=>h[l]||0).reduce((l,c)=>l|c,0)},"getEdgeMask"),a=i();return{id:"tile",tilePosOffset:t.offset??b(0),set tilePos(h){let l=this.getLevel();e=h.clone(),this.pos=b(this.tilePos.x*l.tileWidth(),this.tilePos.y*l.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(h){r!==h&&(r=h,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(h){n!==h&&(n=h,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(h){s=h,a=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return a},getLevel(){return this.parent},moveLeft(){this.tilePos=this.tilePos.add(b(-1,0))},moveRight(){this.tilePos=this.tilePos.add(b(1,0))},moveUp(){this.tilePos=this.tilePos.add(b(0,-1))},moveDown(){this.tilePos=this.tilePos.add(b(0,1))}}}o(ks,"tile");var ur,Os=(ur=class{constructor(e,r,n){v(this,"name");v(this,"duration");v(this,"loops");v(this,"direction");v(this,"easing");v(this,"interpolation");v(this,"isFinished");v(this,"timing");v(this,"easings");v(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||Br.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0];let a=Math.trunc(i);if(i-=a,(this.direction=="reverse"||this.direction=="ping-pong"&&a&1)&&(i=1-i),n){let h=0;for(;n[h+1]!==void 0&&n[h+1]=s?[s,0]:[h,(i-n[h])/(n[h+1]-n[h])]}else{let h=Math.floor((r-1)*i);return[h,(i-h/s)*s]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=Br.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(ur,"AnimateChannel"),ur);function zn(t,e){return e.add(e.sub(t))}o(zn,"reflect");var hr,Pu=(hr=class extends Os{constructor(r,n,s,i){super(r,s,i);v(this,"keys");this.keys=n}update(r,n){let[s,i]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let a=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,ke(this.keys[s],this.keys[s+1],a(i)))}return i==1}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(hr,"AnimateChannelNumber"),hr),cr,Du=(cr=class extends Os{constructor(r,n,s,i,a){var h;super(r,s,i);v(this,"keys");v(this,"curves");v(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],a&&(this.dcurves=[]);for(let l=0;l0?this.keys[l-1]:zn(d,c),m=u[r.x,r.y])})}},o(cr,"AnimateChannelVec2"),cr),dr,Iu=(dr=class extends Os{constructor(r,n,s,i){super(r,s,i);v(this,"keys");this.keys=n}update(r,n){let[s,i]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let a=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],a(i)))}return i==1}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(dr,"AnimateChannelColor"),dr);function Qa(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:b(0,0),angle:0,scale:b(1,1),opacity:1},add(){t.relative&&(this.is("pos")&&(this.base.pos=this.pos.clone()),this.is("rotate")&&(this.base.angle=this.angle),this.is("scale")&&(this.base.scale=this.scale),this.is("opacity")&&(this.base.opacity=this.opacity))},update(){let s=!0,i;r+=lt();for(let a of e)i=a.update(this,r),i&&!a.isFinished&&(a.isFinished=!0,this.trigger("animateChannelFinished",a.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,a){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Pu(s,i,a,t.relative||!1)):i[0]instanceof M?e.push(new Du(s,i,a,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof J&&e.push(new Iu(s,i,a,t.relative||!1))},unanimate(s){let i=e.findIndex(a=>a.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(Qa,"animate");function Us(t,e){let r={name:t.name};return t.is("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.is("named")).map(n=>Us(n,n.name))),r}o(Us,"serializeAnimation");function Qn(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=b(n),r+=lt()}}}o(Qn,"boom");function Wa(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Wa,"health");function Xa(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],async add(){await S.root.wait(t),this.opacity=this.opacity??1,r>0&&await S.root.tween(this.opacity,0,r,n=>this.opacity=n,Br.linear),this.destroy()}}}o(Xa,"lifespan");function Ja(t){return{id:"named",name:t}}o(Ja,"named");function Za(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(l){n[l]||(n[l]={enter:new Se,end:new Se,update:new Se,draw:new Se})}o(s,"initStateEvents");function i(l,c,u){return s(c),n[c][l].add(u)}o(i,"on");function a(l,c,...u){s(c),n[c][l].trigger(...u)}o(a,"trigger");let h=!1;return{id:"state",state:t,enterState(l,...c){if(h=!0,e&&!e.includes(l))throw new Error(`State not found: ${l}`);let u=this.state;if(r){if(!(r!=null&&r[u]))return;let d=typeof r[u]=="string"?[r[u]]:r[u];if(!d.includes(l))throw new Error(`Cannot transition state from "${u}" to "${l}". Available transitions: ${d.map(g=>`"${g}"`).join(", ")}`)}a("end",u,...c),this.state=l,a("enter",l,...c),a("enter",`${u} -> ${l}`,...c)},onStateTransition(l,c,u){return i("enter",`${l} -> ${c}`,u)},onStateEnter(l,c){return i("enter",l,c)},onStateUpdate(l,c){return i("update",l,c)},onStateDraw(l,c){return i("draw",l,c)},onStateEnd(l,c){return i("end",l,c)},update(){h||(a("enter",t),h=!0),a("update",this.state)},draw(){a("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(Za,"state");function Ns(t){return{id:"stay",stay:!0,scenesToStay:t}}o(Ns,"stay");function $a(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],add(){r=G.onCharInput(s=>{this.hasFocus&&(!e||this.text.length{this.hasFocus&&(this.text=this.text.slice(0,-1))})},destroy(){r.cancel(),n.cancel()}}}o($a,"textInput");function an(){return{id:"timer",wait(t,e){let r=[];e&&r.push(e);let n=0,s=this.onUpdate(()=>{n+=G.dt(),n>=t&&(r.forEach(i=>i()),s.cancel())});return{get paused(){return s.paused},set paused(i){s.paused=i},cancel:s.cancel,onEnd(i){r.push(i)},then(i){return this.onEnd(i),this}}},loop(t,e){let r=null,n=o(()=>{r=this.wait(t,n),e()},"newAction");return r=this.wait(0,n),{get paused(){return(r==null?void 0:r.paused)??!1},set paused(s){r&&(r.paused=s)},cancel:o(()=>r==null?void 0:r.cancel(),"cancel")}},tween(t,e,r,n,s=Br.linear){let i=0,a=[],h=this.onUpdate(()=>{i+=G.dt();let l=Math.min(i/r,1);n(ke(t,e,s(l))),l===1&&(h.cancel(),n(e),a.forEach(c=>c()))});return{get paused(){return h.paused},set paused(l){h.paused=l},onEnd(l){a.push(l)},then(l){return this.onEnd(l),this},cancel(){h.cancel()},finish(){h.cancel(),n(e),a.forEach(l=>l())}}}}}o(an,"timer");var Wn=0;function _a(){return Wn>0}o(_a,"usesArea");function el(t={}){let e={},r=new Set;return{id:"area",collisionIgnore:t.collisionIgnore??[],add(){Wn++,this.area.cursor&&this.onHover(()=>T.setCursor(this.area.cursor)),this.onCollideUpdate((n,s)=>{if(!n.id)throw new Error("area() requires the object to have an id");e[n.id]||this.trigger("collide",n,s),s&&(e[n.id]=s,r.add(n.id))})},destroy(){Wn--},fixedUpdate(){for(let n in e)r.has(Number(n))||(this.trigger("collideEnd",e[n].target),delete e[n]);r.clear()},drawInspect(){let n=this.localArea();G.pushTransform(),G.pushTranslate(this.area.offset);let s={outline:{width:4/cs(),color:se(0,0,255)},anchor:this.anchor,fill:!1,fixed:pt(this)};n instanceof G.Rect?G.drawRect({...s,pos:n.pos,width:n.width*this.area.scale.x,height:n.height*this.area.scale.y}):n instanceof G.Polygon?G.drawPolygon({...s,pts:n.pts,scale:this.area.scale}):n instanceof G.Circle&&G.drawCircle({...s,pos:n.center,radius:n.radius}),G.popTransform()},area:{shape:t.shape??null,scale:t.scale?b(t.scale):b(1),offset:t.offset??b(0),cursor:t.cursor??null},isClicked(){return T.isMousePressed()&&this.isHovering()},isHovering(){let n=pt(this)?G.mousePos():G.toWorld(G.mousePos());return this.hasPoint(n)},checkCollision(n){if(!n.id)throw new Error("checkCollision() requires the object to have an id");return e[n.id]??null},getCollisions(){return Object.values(e)},isColliding(n){if(!n.id)throw new Error("isColliding() requires the object to have an id");return!!e[n.id]},isOverlapping(n){if(!n.id)throw new Error("isOverlapping() requires the object to have an id");let s=e[n.id];return s&&s.hasOverlap()},onClick(n,s="left"){let i=T.onMousePress(s,()=>{this.isHovering()&&n()});return this.onDestroy(()=>i.cancel()),i},onHover(n){let s=!1;return this.onUpdate(()=>{s?s=this.isHovering():this.isHovering()&&(s=!0,n())})},onHoverUpdate(n){return this.onUpdate(()=>{this.isHovering()&&n()})},onHoverEnd(n){let s=!1;return this.onUpdate(()=>{s?this.isHovering()||(s=!1,n()):s=this.isHovering()})},onCollide(n,s){if(typeof n=="function"&&s===void 0)return this.on("collide",n);if(typeof n=="string")return this.onCollide((i,a)=>{i.is(n)&&(s==null||s(i,a))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(n,s){if(typeof n=="function"&&s===void 0)return this.on("collideUpdate",n);if(typeof n=="string")return this.on("collideUpdate",(i,a)=>i.is(n)&&(s==null?void 0:s(i,a)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(n,s){if(typeof n=="function"&&s===void 0)return this.on("collideEnd",n);if(typeof n=="string")return this.on("collideEnd",i=>i.is(n)&&(s==null?void 0:s(i)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(n){return ot(this.worldArea(),n)},resolveCollision(n){let s=this.checkCollision(n);s&&!s.resolved&&(this.pos=this.pos.add(s.displacement),s.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let n=this.localArea();if(!(n instanceof G.Polygon||n instanceof G.Rect))throw new Error("Only support polygon and rect shapes for now");let s=this.transform.clone().translate(this.area.offset).scale(b(this.area.scale??1));if(n instanceof G.Rect){let i=kt(this.anchor||xn).add(1,1).scale(-.5).scale(n.width,n.height);s.translate(i)}return n.transform(s)},screenArea(){let n=this.worldArea();return pt(this)?n:n.transform(S.cam.transform)},inspect(){var n,s,i,a,h,l,c;return((n=this.area.scale)==null?void 0:n.x)==((s=this.area.scale)==null?void 0:s.y)?`area: ${(a=(i=this.area.scale)==null?void 0:i.x)==null?void 0:a.toFixed(1)}x`:`area: (${(l=(h=this.area.scale)==null?void 0:h.x)==null?void 0:l.toFixed(1)}x, ${(c=this.area.scale.y)==null?void 0:c.toFixed(1)}y)`}}}o(el,"area");function tl(t={}){let e=null,r=null,n=!1,s=b(0),i=null,a=null,h;return{id:"body",require:["pos"],vel:b(0),drag:t.drag??0,jumpForce:t.jumpForce??fu,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),a=this.pos.clone(),h=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.is("area")&&(this.onCollideUpdate((l,c)=>{if(!c||!l.is("body")||c.resolved)return;this.trigger("beforePhysicsResolve",c);let u=c.reverse();if(l.trigger("beforePhysicsResolve",u),!(c.resolved||u.resolved)&&!(this.isStatic&&l.isStatic)){if(!this.isStatic&&!l.isStatic){let d=this.mass+l.mass;this.pos=this.pos.add(c.displacement.scale(l.mass/d)),l.pos=l.pos.add(c.displacement.scale(-this.mass/d)),this.transform=Kt(this),l.transform=Kt(l)}else{let d=!this.isStatic&&l.isStatic?c:c.reverse();d.source.pos=d.source.pos.add(d.displacement),d.source.transform=Kt(d.source)}c.resolved=!0,this.trigger("physicsResolve",c),l.trigger("physicsResolve",c.reverse())}}),this.onPhysicsResolve(l=>{if(S.gravity)if(l.isBottom()&&this.isFalling()){this.vel=this.vel.reject(S.gravity.unit());let c=e;e=l.target,c!=e&&(r=l.target.pos),n?n=!1:c||(this.trigger("ground",e),l.target.trigger("land",this))}else l.isTop()&&this.isJumping()&&(this.vel=this.vel.reject(S.gravity.unit()),this.trigger("headbutt",l.target),l.target.trigger("headbutted",this))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.is("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let l=G.restDt();l&&(this.pos.x==h.x&&(this.pos.x=G.lerp(i.x,a.x,l/G.fixedDt()),h.x=this.pos.x),this.pos.y==h.y&&(this.pos.y=G.lerp(i.y,a.y,l/G.fixedDt()),h.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==h.x&&(this.pos.x=i.x),this.pos.y==h.y&&(this.pos.y=i.y),i=null),S.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.is("body"))&&(n=!0);let l=this.vel.clone();this.vel=this.vel.add(S.gravity.scale(this.gravityScale*G.dt()));let c=t.maxVelocity??pu;this.vel.slen()>c*c&&(this.vel=this.vel.unit().scale(c)),l.dot(S.gravity)<0&&this.vel.dot(S.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*G.dt(),this.vel.y+=s.y*G.dt(),this.vel.x*=1-this.drag*G.dt(),this.vel.y*=1-this.drag*G.dt(),this.move(this.vel),G.restDt()){i=this.pos.clone();let l=this.vel.add(s.scale(G.dt()));a=this.pos.add(l.scale(G.dt())),h=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(l){return this.on("physicsResolve",l)},onBeforePhysicsResolve(l){return this.on("beforePhysicsResolve",l)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(G.getGravityDirection())>0},isJumping(){return this.vel.dot(G.getGravityDirection())<0},applyImpulse(l){this.vel=this.vel.add(l)},addForce(l){s.x+=l.x/this.mass,s.y+=l.y/this.mass},jump(l){e=null,r=null,this.vel=G.getGravityDirection().scale(-l||-this.jumpForce)},onGround(l){return this.on("ground",l)},onFall(l){return this.on("fall",l)},onFallOff(l){return this.on("fallOff",l)},onHeadbutt(l){return this.on("headbutt",l)},onLand(l){return this.on("land",l)},onHeadbutted(l){return this.on("headbutted",l)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(tl,"body");function rl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var a;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(a=n==null?void 0:n.scale(this.speed))==null?void 0:a.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(nl,"surfaceEffector");function sl(t){return{id:"areaEffector",require:["area"],useGlobalAngle:t.useGlobalAngle||!1,forceAngle:t.forceAngle,forceMagnitude:t.forceMagnitude,forceVariation:t.forceVariation??0,linearDrag:t.linearDrag??0,add(){this.onCollideUpdate("body",(e,r)=>{let n=M.fromAngle(this.forceAngle).scale(this.forceMagnitude);e.addForce(n),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(sl,"areaEffector");function il(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,forceVariation:t.forceVariation??0,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate("body",(e,r)=>{let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,a=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,h=n.scale(this.forceMagnitude*a/s);e.addForce(h),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(il,"pointEffector");function ol(t){return{id:"constantForce",require:["body"],force:t.force,update(){this.force&&this.addForce(this.force)}}}o(ol,"constantForce");function al(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate("body",(e,r)=>{let n=e,s=n.worldArea(),[i,a]=s.cut(b(-100,this.surfaceLevel),b(100,this.surfaceLevel));i&&(this.applyBuoyancy(n,i),this.applyDrag(n,i)),this.flowMagnitude&&n.addForce(M.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=b(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(al,"buoyancyEffector");function ln(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(ln,"anchor");function Ls(){return{id:"fixed",fixed:!0}}o(Ls,"fixed");function ll(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??b(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(ll,"follow");function ul(t){var r;let e=(r=S.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=S.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=S.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(ul,"layer");function hl(t,e){let r=typeof t=="number"?M.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(hl,"move");function cl(t={}){let e=t.distance??du,r=!1;return{id:"offscreen",require:["pos"],isOffScreen(){let n=this.screenPos();if(!n)return!1;let s=new me(b(0),G.width(),G.height());return!G.testRectPoint(s,n)&&s.sdistToPoint(n)>e*e},onExitScreen(n){return this.on("exitView",n)},onEnterScreen(n){return this.on("enterView",n)},update(){this.isOffScreen()?(r||(this.trigger("exitView"),r=!0),t.hide&&(this.hidden=!0),t.pause&&(this.paused=!0),t.destroy&&this.destroy()):(r&&(this.trigger("enterView"),r=!1),t.hide&&(this.hidden=!1),t.pause&&(this.paused=!1))}}}o(cl,"offscreen");function Ir(...t){return{id:"pos",pos:b(...t),moveBy(...e){this.pos=this.pos.add(b(...e))},move(...e){this.moveBy(b(...e).scale(G.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(b(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=b(r);return}let s=r.sub(this.pos);if(s.len()<=n*G.dt()){this.pos=b(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.multVec2(this.pos):this.pos},toWorld(e){return this.parent?this.parent.transform.multVec2(this.pos.add(e)):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.invert().multVec2(e).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?pt(this)?r:G.toScreen(r):null}},toScreen(e){let r=this.toWorld(e);return pt(this)?r:G.toScreen(r)},fromScreen(e){return pt(this)?this.fromWorld(e):this.fromWorld(G.toWorld(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){G.drawCircle({color:G.rgb(255,0,0),radius:4/cs()})}}}o(Ir,"pos");function dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(dl,"rotate");function Fr(...t){if(t.length===0)return Fr(1);let e=b(...t);return{id:"scale",set scale(r){if(!(r instanceof M))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=b(r)},get scale(){return e},scaleTo(...r){e=b(...r)},scaleBy(...r){e=e.scale(b(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(Fr,"scale");function fl(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(fl,"z");var Fu="data:image/png;base64,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",ku="data:image/png;base64,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",Ou="3001.0.0",G,ue,B,S,T,X,Rt,pl,ne,pe,Qe,we,Mr,gl,ml,Uu=o((t={})=>{ue=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%"),we=t.canvas??e.appendChild(document.createElement("canvas")),Mr=t.scale??1;let r=t.width&&t.height&&!t.stretch&&!t.letterbox;r?(we.width=t.width*Mr,we.height=t.height*Mr):(we.width=we.parentElement.offsetWidth,we.height=we.parentElement.offsetHeight);let n=["outline: none","cursor: default"];if(r){let F=we.width,j=we.height;n.push(`width: ${F}px`),n.push(`height: ${j}px`)}else n.push("width: 100%"),n.push("height: 100%");t.crisp&&(n.push("image-rendering: pixelated"),n.push("image-rendering: crisp-edges")),we.style.cssText=n.join(";"),Qe=t.pixelDensity||1,we.width*=Qe,we.height*=Qe,we.tabIndex=0,Rt=document.createElement("canvas"),Rt.width=256,Rt.height=256,pl=Rt.getContext("2d",{willReadFrequently:!0}),T=Yl({canvas:we,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});let s=[],i=T.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!i)throw new Error("WebGL not supported");let a=i,h=Xo(a,{texFilter:t.texFilter});B=xu(t,h),pe=Bu(),X=mu(h),S=Ru(),S.root.use(an());function l(F,j){let O=new rn(h,F,j);return{clear:o(()=>O.clear(),"clear"),free:o(()=>O.free(),"free"),toDataURL:o(()=>O.toDataURL(),"toDataURL"),toImageData:o(()=>O.toImageData(),"toImageData"),width:O.width,height:O.height,draw:o(re=>{Ce(),O.bind(),re(),Ce(),O.unbind()},"draw")}}o(l,"makeCanvas");function c(){a.clear(a.COLOR_BUFFER_BIT),B.frameBuffer.bind(),a.clear(a.COLOR_BUFFER_BIT),B.bgColor||st(()=>{pr({width:xe(),height:ve(),quad:new ae(0,0,xe()/64,ve()/64),tex:B.bgTex,fixed:!0})}),B.renderer.numDraws=0,B.fixed=!1,B.transformStack.length=0,B.transform=new $e}o(c,"frameStart");function u(F,j){B.postShader=F,B.postShaderUniform=j??null}o(u,"usePostEffect");function d(){Ce(),B.lastDrawCalls=B.renderer.numDraws,B.frameBuffer.unbind(),a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight);let F=B.width,j=B.height;B.width=a.drawingBufferWidth/Qe,B.height=a.drawingBufferHeight/Qe,Dr({flipY:!0,tex:B.frameBuffer.tex,pos:new M(B.viewport.x,B.viewport.y),width:B.viewport.width,height:B.viewport.height,shader:B.postShader,uniform:typeof B.postShaderUniform=="function"?B.postShaderUniform():B.postShaderUniform,fixed:!0}),Ce(),B.width=F,B.height=j}o(d,"frameEnd");let g=!1;ne={inspect:!1,timeScale:1,showLog:!0,fps:o(()=>T.fps(),"fps"),numFrames:o(()=>T.numFrames(),"numFrames"),stepFrame:N,drawCalls:o(()=>B.lastDrawCalls,"drawCalls"),clearLog:o(()=>S.logs=[],"clearLog"),log:o((...F)=>{let j=t.logMax??8,O=F.length>1?F.concat(" ").join(" "):F[0];S.logs.unshift({msg:O,time:T.time()}),S.logs.length>j&&(S.logs=S.logs.slice(0,j))},"log"),error:o(F=>ne.log(new Error(F.toString?F.toString():F)),"error"),curRecording:null,numObjects:o(()=>D("*",{recursive:!0}).length,"numObjects"),get paused(){return g},set paused(F){g=F,F?pe.ctx.suspend():pe.ctx.resume()}};function m(F,j){try{return JSON.parse(window.localStorage[F])}catch{return j?(f(F,j),j):null}}o(m,"getData");function f(F,j){window.localStorage[F]=JSON.stringify(j)}o(f,"setData");function A(F,...j){let O=F(G),re;typeof O=="function"?re=O(...j)(G):re=O;for(let le in re)G[le]=re[le],t.global!==!1&&(window[le]=re[le]);return G}o(A,"plug");function y(F){let j=T.canvas.captureStream(F),O=pe.ctx.createMediaStreamDestination();pe.masterNode.connect(O);let re=new MediaRecorder(j),le=[];return re.ondataavailable=ee=>{ee.data.size>0&&le.push(ee.data)},re.onerror=()=>{pe.masterNode.disconnect(O),j.getTracks().forEach(ee=>ee.stop())},re.start(),{resume(){re.resume()},pause(){re.pause()},stop(){return re.stop(),pe.masterNode.disconnect(O),j.getTracks().forEach(ee=>ee.stop()),new Promise(ee=>{re.onstop=()=>{ee(new Blob(le,{type:"video/mp4"}))}})},download(ee="kaboom.mp4"){this.stop().then(be=>Un(ee,be))}}}o(y,"record");function V(){return document.activeElement===T.canvas}o(V,"isFocused");let I=S.root.add.bind(S.root),L=S.root.readd.bind(S.root),K=S.root.removeAll.bind(S.root),D=S.root.get.bind(S.root),w=S.root.wait.bind(S.root),x=S.root.loop.bind(S.root),C=S.root.query.bind(S.root),P=S.root.tween.bind(S.root);gl=Ht(null,ku),ml=Ht(null,Fu);function k(){S.root.fixedUpdate()}o(k,"fixedUpdateFrame");function N(){S.root.update()}o(N,"updateFrame");const $=class ${constructor(j,O,re,le,ee=!1){v(this,"source");v(this,"target");v(this,"normal");v(this,"distance");v(this,"resolved",!1);this.source=j,this.target=O,this.normal=re,this.distance=le,this.resolved=ee}get displacement(){return this.normal.scale(this.distance)}reverse(){return new $(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(S.gravity||b(0,1))>0}isRight(){return this.displacement.cross(S.gravity||b(0,1))<0}isTop(){return this.displacement.dot(S.gravity||b(0,1))>0}isBottom(){return this.displacement.dot(S.gravity||b(0,1))<0}preventResolution(){this.resolved=!0}};o($,"Collision");let q=$;function H(){if(!_a())return;let F={},j=t.hashGridSize||64,O=new $e,re=[];function le(ee){if(re.push(O.clone()),ee.pos&&O.translate(ee.pos),ee.scale&&O.scale(ee.scale),ee.angle&&O.rotate(ee.angle),ee.transform=O.clone(),ee.c("area")&&!ee.paused){let be=ee,ht=be.worldArea().bbox(),Sn=Math.floor(ht.pos.x/j),Rn=Math.floor(ht.pos.y/j),Cn=Math.ceil((ht.pos.x+ht.width)/j),Bn=Math.ceil((ht.pos.y+ht.height)/j),Gr=new Set;for(let Le=Sn;Le<=Cn;Le++)for(let et=Rn;et<=Bn;et++)if(!F[Le])F[Le]={},F[Le][et]=[be];else if(!F[Le][et])F[Le][et]=[be];else{let wr=F[Le][et];e:for(let Ee of wr){if(Ee.paused||!Ee.exists()||Gr.has(Ee.id))continue;for(let He of be.collisionIgnore)if(Ee.is(He))continue e;for(let He of Ee.collisionIgnore)if(be.is(He))continue e;let Ot=Hi(be.worldArea(),Ee.worldArea());if(Ot){let He=new q(be,Ee,Ot.normal,Ot.distance);be.trigger("collideUpdate",Ee,He);let yr=He.reverse();yr.resolved=He.resolved,Ee.trigger("collideUpdate",be,yr)}Gr.add(Ee.id)}wr.push(be)}}ee.children.forEach(le),O=re.pop()}o(le,"checkObj"),le(S.root)}o(H,"checkFrame");function W(F){console.error(F),pe.ctx.suspend();let j=F.message??String(F)??"Unknown error, check console for more info";T.run(()=>{},()=>{c(),st(()=>{let O=xe(),re=ve(),le={size:36,width:O-32*2,letterSpacing:4,lineSpacing:4,font:en,fixed:!0};Fe({width:O,height:re,color:se(0,0,255),fixed:!0});let ee=bt({...le,text:"Error",pos:b(32),color:se(255,128,0),fixed:!0});Vt(ee),Yn({...le,text:j,pos:b(32,32+ee.height+16),fixed:!0}),Re(),S.events.trigger("error",F)}),d()})}o(W,"handleErr");function Z(F){s.push(F)}o(Z,"onCleanup");function Q(){S.events.onOnce("frameEnd",()=>{T.quit(),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT|a.STENCIL_BUFFER_BIT);let F=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS);for(let j=0;jj())})}o(Q,"quit");let Y=!0;T.run(()=>{try{X.loaded&&(ne.paused||k(),H())}catch(F){W(F)}},(F,j)=>{try{F(),X.loaded||xt()===1&&!Y&&(X.loaded=!0,S.events.trigger("load")),!X.loaded&&t.loadingScreen!==!1||Y?(c(),$o(),d()):(ne.paused||N(),H(),c(),Zo(),t.debug!==!1&&Jo(),d()),Y&&(Y=!1),S.events.trigger("frameEnd"),j()}catch(O){W(O)}}),Ss(),Is(),G={VERSION:Ou,loadRoot:To,loadProgress:xt,loadSprite:Ht,loadSpriteAtlas:vs,loadSound:Ko,loadMusic:Ho,loadBitmapFont:Uo,loadFont:ko,loadShader:qo,loadShaderURL:Go,loadAseprite:Fo,loadPedit:No,loadBean:Io,loadJSON:Po,load:tn,getSound:xs,getFont:ws,getBitmapFont:ys,getSprite:ps,getShader:As,getAsset:Do,Asset:Ue,SpriteData:vt,SoundData:Pr,width:xe,height:ve,center:Tr,dt:lt,fixedDt:fo,restDt:po,time:T.time,screenshot:T.screenshot,record:y,isFocused:V,setCursor:T.setCursor,getCursor:T.getCursor,setCursorLocked:T.setCursorLocked,isCursorLocked:T.isCursorLocked,setFullscreen:T.setFullscreen,isFullscreen:T.isFullscreen,isTouchscreen:T.isTouchscreen,onLoad:En,onLoading:Sa,onResize:Ra,onGamepadConnect:T.onGamepadConnect,onGamepadDisconnect:T.onGamepadDisconnect,onError:Ca,onCleanup:Z,camPos:ha,camScale:ca,camFlash:fa,camRot:da,camTransform:pa,shake:ga,toScreen:ma,toWorld:wa,setGravity:Ba,getGravity:Ta,setGravityDirection:Pa,getGravityDirection:Da,setBackground:vo,getBackground:bo,getGamepads:T.getGamepads,getTreeRoot:Oa,add:I,make:Mn,destroy:Fs,destroyAll:K,get:D,query:C,readd:L,pos:Ir,scale:Fr,rotate:dl,color:Rs,opacity:Cs,anchor:ln,area:el,sprite:on,text:Ga,polygon:la,rect:Ts,circle:ra,uvquad:ja,outline:oa,particles:aa,body:tl,surfaceEffector:nl,areaEffector:sl,pointEffector:il,buoyancyEffector:al,constantForce:ol,doubleJump:rl,shader:ua,textInput:$a,timer:an,fixed:Ls,stay:Ns,health:Wa,lifespan:Xa,named:Ja,state:Za,z:fl,layer:ul,move:hl,offscreen:cl,follow:ll,fadeIn:sa,mask:ia,drawon:na,raycast:Bs,tile:ks,animate:Qa,serializeAnimation:Us,agent:Ka,sentry:za,patrol:Ya,pathfinder:Ha,on:_e,onFixedUpdate:bu,onUpdate:Vu,onDraw:Eu,onAdd:Aa,onDestroy:Mu,onClick:Su,onCollide:xa,onCollideUpdate:va,onCollideEnd:ba,onHover:Va,onHoverUpdate:Ea,onHoverEnd:Ma,onKeyDown:T.onKeyDown,onKeyPress:T.onKeyPress,onKeyPressRepeat:T.onKeyPressRepeat,onKeyRelease:T.onKeyRelease,onMouseDown:T.onMouseDown,onMousePress:T.onMousePress,onMouseRelease:T.onMouseRelease,onMouseMove:T.onMouseMove,onCharInput:T.onCharInput,onTouchStart:T.onTouchStart,onTouchMove:T.onTouchMove,onTouchEnd:T.onTouchEnd,onScroll:T.onScroll,onHide:T.onHide,onShow:T.onShow,onGamepadButtonDown:T.onGamepadButtonDown,onGamepadButtonPress:T.onGamepadButtonPress,onGamepadButtonRelease:T.onGamepadButtonRelease,onGamepadStick:T.onGamepadStick,onButtonPress:T.onButtonPress,onButtonDown:T.onButtonDown,onButtonRelease:T.onButtonRelease,mousePos:ds,mouseDeltaPos:T.mouseDeltaPos,isKeyDown:T.isKeyDown,isKeyPressed:T.isKeyPressed,isKeyPressedRepeat:T.isKeyPressedRepeat,isKeyReleased:T.isKeyReleased,isMouseDown:T.isMouseDown,isMousePressed:T.isMousePressed,isMouseReleased:T.isMouseReleased,isMouseMoved:T.isMouseMoved,isGamepadButtonPressed:T.isGamepadButtonPressed,isGamepadButtonDown:T.isGamepadButtonDown,isGamepadButtonReleased:T.isGamepadButtonReleased,getGamepadStick:T.getGamepadStick,isButtonPressed:T.isButtonPressed,isButtonDown:T.isButtonDown,isButtonReleased:T.isButtonReleased,setButton:T.setButton,getButton:T.getButton,pressButton:T.pressButton,releaseButton:T.releaseButton,getLastInputDeviceType:T.getLastInputDeviceType,charInputted:T.charInputted,loop:x,wait:w,play:Ps,volume:Fa,burp:Ds,audioCtx:pe.ctx,Line:Te,Rect:me,Circle:Oe,Ellipse:at,Point:Pl,Polygon:Ne,Vec2:M,Color:J,Mat4:$e,Quad:ae,RNG:li,rand:ye,randi:Jn,randSeed:ui,vec2:b,rgb:se,hsl2rgb:Cl,quad:de,choose:di,chooseMultiple:ci,shuffle:Zn,chance:hi,lerp:ke,tween:P,easings:Br,map:Ke,mapc:ai,wave:Xn,deg2rad:ge,rad2deg:At,clamp:Ze,evaluateQuadratic:Ci,evaluateQuadraticFirstDerivative:Bi,evaluateQuadraticSecondDerivative:Ti,evaluateBezier:mn,evaluateBezierFirstDerivative:Pi,evaluateBezierSecondDerivative:Di,evaluateCatmullRom:Ii,evaluateCatmullRomFirstDerivative:Fi,curveLengthApproximation:os,normalizedCurve:ki,hermite:mr,cardinal:as,catmullRom:Rr,bezier:Oi,kochanekBartels:Ui,easingSteps:Ki,easingLinear:Gi,easingCubicBezier:ji,testLineLine:un,testRectRect:$n,testRectLine:hn,testRectPoint:cn,testCirclePolygon:Or,testLinePoint:dn,testLineCircle:gr,isConvex:Xi,triangulate:us,NavMesh:nu,drawSprite:ea,drawText:Yn,formatText:bt,drawRect:Fe,drawLine:Gt,drawLines:Vn,drawTriangle:Es,drawCircle:Lr,drawEllipse:bs,drawUVQuad:pr,drawPolygon:dt,drawCurve:Vs,drawBezier:Wo,drawFormattedText:Vt,drawMasked:_o,drawSubtracted:ta,pushTransform:Ie,popTransform:Re,pushTranslate:he,pushScale:fr,pushRotate:It,pushMatrix:Vo,usePostEffect:u,makeCanvas:l,debug:ne,scene:Ua,getSceneName:qa,go:Na,onSceneLeave:La,layers:Tu,addLevel:ya,getData:m,setData:f,download:wn,downloadJSON:_i,downloadText:hs,downloadBlob:Un,plug:A,ASCII_CHARS:So,canvas:T.canvas,addKaboom:ka,LEFT:M.LEFT,RIGHT:M.RIGHT,UP:M.UP,DOWN:M.DOWN,RED:J.RED,GREEN:J.GREEN,BLUE:J.BLUE,YELLOW:J.YELLOW,MAGENTA:J.MAGENTA,CYAN:J.CYAN,WHITE:J.WHITE,BLACK:J.BLACK,quit:Q,KEvent:Se,KEventHandler:Cr,KEventController:Ft};let te=t.plugins;if(te&&te.forEach(A),t.global!==!1)for(let F in G)window[F]=G[F];return t.focus!==!1&&T.canvas.focus(),G},"kaplay"),Nu=Uu;const Lu=[[`function isUnique(str) { -`,` const n = matrix.length; -`,` -`,` for (let layer = 0; layer < Math.floor(n / 2); layer++) { -`,` let charSet = new Set(); -`,` -`,` for (let i = 0; i < str.length; i++) { -`,` if (charSet.has(str[i])) { -`,` return false; +`,ah=new Set(["id","require"]),oh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),lh=200,uh=640,hh=65536,lo=Symbol.for("kaplay.cancel"),wr,ch=(wr=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new ch)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),dh=o(t=>t[0]instanceof ne,"arrayIsColor"),fh=o(t=>t[0]instanceof k,"arrayIsVec2"),ph=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),gh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,mh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function ce(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(ce,"overload2");var yh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ht=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),wh=(()=>{let t=0;return()=>t++})(),Ah={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},xh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),vh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,bh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Eh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=Ah,Sh=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Eh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new bh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Mh=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Sh(t);Yt=e,vh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let I=e.canvas.requestPointerLock();I!=null&&I.catch&&I.catch(F=>console.error(F))}catch(I){console.error(I)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function B(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(B,"exitFullscreen");function f(x=!0){x?g(e.canvas):B()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),I=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of I)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,I){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(he=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Be=he/1e3,be=Math.min(Be-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ht(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ht(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ht(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ht(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ht(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ht(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ht(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ht(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ht(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ht(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var I;return(I=e.buttons)==null?void 0:I[x]}o(V,"getButton");function X(x,I){e.buttons[x]={...e.buttons[x],...I}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=ce(x=>e.events.on("keyDown",x),(x,I)=>e.events.on("keyDown",F=>Je(x,F)&&I(F))),xe=ce(x=>e.events.on("keyPress",I=>x(I)),(x,I)=>e.events.on("keyPress",F=>Je(x,F)&&I(F))),We=ce(x=>e.events.on("keyPressRepeat",x),(x,I)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&I(F))),mt=ce(x=>e.events.on("keyRelease",x),(x,I)=>e.events.on("keyRelease",F=>Je(x,F)&&I(F))),yt=ce(x=>e.events.on("mouseDown",I=>x(I)),(x,I)=>e.events.on("mouseDown",F=>Je(x,F)&&I(F))),ge=ce(x=>e.events.on("mousePress",I=>x(I)),(x,I)=>e.events.on("mousePress",F=>Je(x,F)&&I(F))),Xe=ce(x=>e.events.on("mouseRelease",I=>x(I)),(x,I)=>e.events.on("mouseRelease",F=>F===x&&I(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=ce(x=>e.events.on("gamepadButtonPress",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&I(F,z))),ve=ce(x=>e.events.on("gamepadButtonDown",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&I(F,z))),Ae=ce(x=>e.events.on("gamepadButtonRelease",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&I(F,z)));function _e(x,I){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&I(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=ce(x=>e.events.on("buttonPress",I=>x(I)),(x,I)=>e.events.on("buttonPress",F=>Je(x,F)&&I(F))),wt=ce(x=>e.events.on("buttonDown",I=>x(I)),(x,I)=>e.events.on("buttonDown",F=>Je(x,F)&&I(F))),Ie=ce(x=>e.events.on("buttonRelease",I=>x(I)),(x,I)=>e.events.on("buttonRelease",F=>Je(x,F)&&I(F)));function lt(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(lt,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,I)=>{e.mergedGamepadState.stickState.set(I,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((I,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let I={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(I),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),I}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(I=>I.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,I;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,he=e.gamepadStates.get(F.index);if(he){for(let Be=0;Be{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),he.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else he.buttonState.down.has(be)&&(ut&&((I=e.buttonsByGamepad.get(be))==null||I.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),he.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Be in Q.sticks){let be=Q.sticks[Be];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);he.stickState.set(Be,At),e.mergedGamepadState.stickState.set(Be,At),e.events.trigger("gamepadStick",Be,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let I=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,he=window.innerWidth,Be=window.innerHeight,be=he/Be,At=z/Q;if(be>At){let ut=Be/Q,xt=(he-z*ut)/2;I.x=nt(x.offsetX-xt,0,z*ut,0,z),I.y=nt(x.offsetY,0,Q*ut,0,Q)}else{let ut=he/z,xt=(Be-Q*ut)/2;I.x=nt(x.offsetX,0,z*ut,0,z),I.y=nt(x.offsetY-xt,0,Q*ut,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=I,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let I=Yi[x.button];I&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(I),e.events.trigger("mousePress",I))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let I=Yi[x.button];I&&(e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(I),e.events.trigger("mouseRelease",I))})};let Ku=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Ku.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(I===void 0)throw new Error(`Unknown key: ${x.key}`);I.length===1?(e.events.trigger("charInput",I),e.charInputted.push(I)):I==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(I),e.events.trigger("keyPressRepeat",I)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(he=>{e.buttonState.press(he),e.events.trigger("buttonPress",he)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(he=>{e.buttonState.press(he),e.events.trigger("buttonPress",he)})),e.keyState.press(I),e.events.trigger("keyPressRepeat",I),e.events.trigger("keyPress",I))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(he=>{e.buttonState.release(he),e.events.trigger("buttonRelease",he)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(he=>{e.buttonState.release(he),e.events.trigger("buttonRelease",he)})),e.keyState.release(I),e.events.trigger("keyRelease",I)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),I.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}I.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let I=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",I)})},An.gamepaddisconnected=x=>{let I=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",I)})};for(let[x,I]of Object.entries(je))e.canvas.addEventListener(x,I);for(let[x,I]of Object.entries(cs))document.addEventListener(x,I);for(let[x,I]of Object.entries(An))window.addEventListener(x,I);let Qi=new ResizeObserver(x=>{for(let I of x)if(I.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:mt,onMouseDown:yt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:wt,onButtonRelease:Ie,getLastInputDeviceType:xh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),Ph=new k(-1,-1),Ch=new k(0,-1),qh=new k(1,-1),kh=new k(-1,0),Th=new k(0,0),Ih=new k(1,0),Bh=new k(-1,1),Rh=new k(0,1),Fh=new k(1,1);function ir(t){switch(t){case"topleft":return Ph;case"top":return Ch;case"topright":return qh;case"left":return kh;case"center":return Th;case"right":return Ih;case"botleft":return Bh;case"bot":return Rh;case"botright":return Fh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Oh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Lh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function In(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(In,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=In(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=In(h,c,c),i=In(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,zh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new Nh(this._polygons.length),n=e.map((s,i)=>new Uh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Ir,na=(Ir=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Ir,"Edge"),Ir),Br,jh=(Br=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Vh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],B=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Gh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Hh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=gh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Kh="data:image/png;base64,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",Lr,Bn=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??eh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new Bn(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Wh=o((t="happy",e)=>fi(t,Kh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Xh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],ph(s)?r.uniform1fv(i,s):fh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):dh(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=sh.replace("{{user}}",e??bs),s=ih.replace("{{user}}",r??Es);try{return new Xh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=mh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var ft,gr=(ft=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new ft(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new ft(r))}static fromURL(e){return po(e)?ft.fromArrayBuffer(co(e)):Qo(e).then(r=>ft.fromArrayBuffer(r))}},o(ft,"SoundData"),ft);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Yh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",pt,rr=(pt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?pt.fromURL(e,r):Promise.resolve(pt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new pt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>pt.fromImage(n,r))}},o(pt,"SpriteData"),pt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Yh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,B=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/B,A=v/B,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(gt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(gt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(gt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(gt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Jh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,Qh=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,Zh=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Jh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new Qh(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new Zh(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var _h=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Is(){return Ts>0}o(Is,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??uh,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??hh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Il(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Il,"platformEffector");function Bl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Bl,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??lh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Ii(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),B=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var $h=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),ec=ce(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=ce(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),tc=ce(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Bs=ce(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=ce(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=ce(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=ce(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=ce(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),rc=ce(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Bs(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var nc=ce(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Ii(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Ii,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:wh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(ah.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),oh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},B=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of B)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var sc=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var ic=Ju("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var ac=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(ic.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),B=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=B(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=B(s),u=p-f):(s.stop(),s=B(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Bi(t){return d.k.play(d.audio.burpSnd,t)}o(Bi,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Bi())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),oc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?oc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new uc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,lc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,B=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(It,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=It(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=It(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=It(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=It(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[B,f]=It(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=It(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=It(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:B,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(-1),w=Math.cos(B),S=Math.sin(B);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=B,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(1),w=Math.cos(B),S=Math.sin(B);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Iu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Iu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof Bn||typeof e=="string"){let A=e instanceof Bn?e.fontface.family:e,E=e instanceof Bn?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,B=null,f=0,w;for(;gt.width&&(m+=i+c,B!=null&&(g-=v.length-B,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,B-1),u=f),B=null,f=0,y.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new we(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new k(u,m),opacity:t.opacity??1,color:t.color??ne.WHITE,scale:C(l),angle:0}),A===" "&&(B=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}y.push({width:u-h,chars:v}),m+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Vt,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n).add(1,1).scale(new k(e,r).scale(-.5)),s=[new k(0,0),new k(e,0),new k(e,r),new k(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new k(l[0],0),...l[1]?fr(new k(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?fr(new k(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?fr(new k(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?fr(new k(l[0],l[0]),l[0],l[0],180,270):[]]}Pt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function St(t){Ge();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ge(),d.gfx.width=e,d.gfx.height=r}o(St,"drawUnscaled");function Os(t,e){St(()=>{let r=C(8);He(),Qe(t);let n=jt({text:e,font:On,size:16,pos:r,color:ue(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=Ce()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Ue()})}o(Os,"drawInspectText");function Vi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Pt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Vi,"drawTriangle");function Bu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Os(vu(ls()),e.join(` +`))}Os(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&St(()=>{He(),et(Me(),0),et(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&St(()=>{He(),et(Me(),Ce()),et(-8,-8);let t=8,e=jt({text:d.debug.timeScale.toFixed(1),font:On,size:16,color:ue(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Vi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Vt(e),Ue()}),d.debug.curRecording&&St(()=>{He(),et(0,Ce()),et(24,-24),ar({radius:12,color:ue(255,0,0),opacity:zs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&St(()=>{He(),et(0,Ce()),et(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Gn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=jt({text:e.join(` +`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Bu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,B=m-v,f=(y+g?1:0)*(v+B?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new lc(e,ti,rh,nh),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),cc="data:image/png;base64,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",dc="data:image/png;base64,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",fc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,pc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Mh({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=hc(t,v);d.gfx=g;let B=ac();d.audio=B;let f=Gh(v,t.spriteAtlasPadding??0);d.assets=f;let w=sc();d.game=w,w.root.use(Nn()),ua("collision",yt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?B.ctx.suspend():B.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=B.ctx.createMediaStreamDestination();B.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{B.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),B.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,dc),X=mr(null,cc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new jh,We=!1;function mt(){if(Is()){if(!We){We=!0,Bs(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(mt,"broadPhase");function yt(){if(Is())return mt()}o(yt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),B.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Bu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:fc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Wh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Ii,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Bl,platformEffector:Il,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:_h,trigger:$h,on:ze,onFixedUpdate:ec,onUpdate:zl,onDraw:tc,onAdd:Bs,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:rc,onClick:nc,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Bi,audioCtx:B.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:$u,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:Qu,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:zh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Iu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),gc=pc;const a=gc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:1920,height:1080,letterbox:!0,pixelDensity:3,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const mc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { +`,` let map = {}; +`,` +`,` for (let i = 0; i < nums.length; i++) { +`,` let other = target - nums[i]; +`,` +`,` if (other in map) { +`,` return [i, map[other]]; `,` } -`,` charSet.add(str[i]); +`,` +`,` map[nums[i]] = i; +`,` } +`,` +`,` return []; +`,`}; +`]},{id:2,title:"isPalindrome",language:"js",blocks:[`var isPalindrome = function(x) { +`,` if (x < 0) { +`,` return false; +`,` } +`,` +`,` let reverse = 0; +`,` let xcopy = x; +`,` +`,` while (x > 0) { +`,` reverse = (reverse * 10) + (x % 10); +`,` x = Math.floor(x / 10); +`,` } +`,` +`,` return reverse === xcopy; +`,`}; +`]},{id:5,title:"longestCommonPrefix",language:"js",blocks:[`var longestCommonPrefix = function(strs) { +`,` return strs.reduce((prev, next) => { +`,` let i = 0; +`,` while (prev[i] && next[i] && prev[i] === next[i]) i++; +`,` return prev.slice(0, i); +`,` }); +`,`}; +`]},{id:6,title:"mergeTwoLists",language:"js",blocks:[`var mergeTwoLists = function(list1, list2) { +`,` let dummy = new ListNode(); +`,` let cur = dummy; +`,` +`,` while (list1 && list2) { +`,` if (list1.val > list2.val) { +`,` cur.next = list2; +`,` list2 = list2.next; +`,` } else { +`,` cur.next = list1; +`,` list1 = list1.next; `,` } +`,` cur = cur.next; `,` } -`,` return matrix; +`,` +`,` cur.next = list1 || list2; +`,` +`,` return dummy.next; +`,`}; +`]},{id:7,title:"removeDuplicates",language:"js",blocks:[`var removeDuplicates = function(nums) { +`,` let i = 1; +`,` +`,` for (let j = 1; j < nums.length; j++) { +`,` if (nums[j] !== nums[i - 1]) { +`,` nums[i] = nums[j]; +`,` i++; `,` } -`,` -`,`} -`],[`function rotateMatrix(matrix) { -`,` const n = matrix.length; -`,` -`,` for (let layer = 0; layer < Math.floor(n / 2); layer++) { -`,` let first = layer; -`,` let last = n - 1 - layer; -`,` matrix[first][i] = matrix[last - offset][first]; -`,` matrix[last - offset][first] = matrix[last][last - offset]; -`,` matrix[last][last - offset] = matrix[i][last]; -`," matrix[i][last] = top;n",` } +`,` } +`,` +`,` return i; +`,`}; +`]},{id:8,title:"strStr",language:"js",blocks:[`var strStr = function(haystack, needle) { +`,` if (haystack.length < needle.length) { +`,` return -1; +`,` } +`,` +`,` for (let i = 0; i <= haystack.length - needle.length; i++) { +`,` if (haystack.substring(i, i + needle.length) === needle) { +`,` return i; `,` } +`,` } +`,` +`,` return -1; +`,`}; +`]},{id:9,title:"searchInsert",language:"js",blocks:[`var searchInsert = function(nums, target) { +`,` let left = 0; +`,` let right = nums.length - 1; +`,` +`,` while (left <= right) { +`,` let mid = Math.floor((left + right) / 2); `,` -`,` return matrix; +`,` if (nums[mid] === target) { +`,` return mid; +`,` } else if (nums[mid] > target) { +`,` right = mid - 1; +`,` } else { +`,` left = mid + 1; `,` } -`],[`class Node { -`,` constructor(data) { -`,` this.data = data; -`,` this.next = null; -`,` } -`,`} -`,` -`,`class LinkedList { -`,` constructor() { -`,` } -`,` -`,` append(data) { -`,` if (this.head === null) { -`,` this.head = new Node(data); -`,` return; -`,` append(data) { -`,` if (this.head === null) { -`,` this.head = new Node(data); +`,` } +`,` +`,` return left; +`,`}; +`]},{id:10,title:"lengthOfLastWord",language:"js",blocks:[`var lengthOfLastWord = function(s) { +`,` let length = 0; +`,` for (let i = s.length - 1; i >= 0; i--) { +`,` if (s[i] !== ' ') { +`,` length++; +`,` } else if (length > 0) { +`,` break; +`,` } +`,` } +`,` +`,` return length; +`,`}; +`]},{id:11,title:"plusOne",language:"js",blocks:[`var plusOne = function(digits) { +`,` for (let i = digits.length - 1; i >= 0; i--) { +`,` if (digits[i] + 1 !== 10) { +`,` digits[i] += 1; +`,` return digits; +`,` } +`,` digits[i] = 0; +`,` if (i === 0) { +`,` digits.unshift(1); +`,` return digits; +`,` } +`,` } +`,`}; +`]},{id:12,title:"addBinary",language:"js",blocks:[`var addBinary = function(a, b) { +`,` let carry = 0; +`,` let res = ''; +`,` let i = a.length - 1; +`,` let j = b.length - 1; +`,` +`,` while (i >= 0 || j >= 0 || carry) { +`,` let sum = carry; +`,` if (i >= 0) sum += parseInt(a[i]); +`,` if (j >= 0) sum += parseInt(b[j]); +`,` +`,` res = (sum % 2) + res; +`,` carry = Math.floor(sum / 2); +`,` +`,` i--; +`,` j--; +`,` } +`,` +`,` return res; +`,`}; +`]},{id:13,title:"mySqrt",language:"js",blocks:[`var mySqrt = function(x) { +`,` var left = 1; +`,` var right = Math.floor(x / 2) + 1; +`,` var mid; +`,` +`,` while (left <= right) { +`,` mid = Math.floor((left + right) / 2); +`,` +`,` if (mid * mid > x) { +`,` right = mid - 1; +`,` } else if (mid * mid < x) { +`,` left = mid + 1; +`,` } else { +`,` return mid; +`,` } +`,` } +`,` +`,` return right; +`,`}; +`]},{id:14,title:"climbStairs",language:"js",blocks:[`var climbStairs = function(n) { +`,` if (n <= 3) return n; +`,` +`,` let prev1 = 3; +`,` let prev2 = 2; +`,` let cur = 0; +`,` +`,` for (let i = 3; i < n; i++) { +`,` cur = prev1 + prev2; +`,` prev2 = prev1; +`,` prev1 = cur; +`,` } +`,` +`,` return cur; +`,`}; +`]},{id:15,title:"deleteDuplicates",language:"js",blocks:[`var deleteDuplicates = function(head) { +`,` let res = head; +`,` +`,` while (head && head.next) { +`,` if (head.val === head.next.val) { +`,` head.next = head.next.next; +`,` } else { +`,` head = head.next; +`,` } +`,` } +`,` +`,` return res; +`,`}; +`]},{id:16,title:"mergeSortedArray",language:"js",blocks:[`var merge = function(nums1, m, nums2, n) { +`,` for (let i = m, j = 0; j < n; i++, j++) { +`,` nums1[i] = nums2[j]; +`,` } +`,` nums1.sort((a, b) => a - b); +`,`}; +`]},{id:17,title:"inorderTraversal",language:"js",blocks:[`var inorderTraversal = function(root) { +`,` const res = []; +`,` +`,` function inorder(node) { +`,` if (!node) { `,` return; `,` } -`,` let current = this.head; -`,` while (current.next !== null) { -`,` current = current.next; +`,` inorder(node.left); +`,` res.push(node.val); +`,` inorder(node.right); +`,` } +`,` +`,` inorder(root); +`,` return res; +`,`}; +`]},{id:17,title:"isSameTree",language:"js",blocks:[`var isSameTree = function(p, q) { +`,` if (!p && !q) { +`,` return true; +`,` } +`,` +`,` if (p && q && p.val === q.val) { +`,` return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); +`,` } +`,` +`,` return false; +`,`}; +`]},{id:18,title:"isSymmetric",language:"js",blocks:[`var isSymmetric = function(root) { +`,` const isMirror = (n1, n2) => { +`,` if (!n1 && !n2) { +`,` return true; `,` } -`,` current.next = new Node(data); +`,` +`,` if (!n1 || !n2) { +`,` return false; `,` } -`,`} -`],[`import React, { useState } from 'react';{ -`,` -`,`const SignupForm = () => { -`,` const [formData, setFormData] = useState({ -`,` email: '', -`,` password: '' -`,` }); -`,` -`,` const [submitted, setSubmitted] = useState(false); -`,` -`,` const handleChange = (e) => { -`,` setFormData({ -`,` ...formData, -`,` [e.target.name]: e.target.value -`,` }); -`,` }; -`,` -`,` const handleSubmit = (e) => { -`,` e.preventDefault(); -`,` setSubmitted(true); -`,` }; -`,` -`,` return ( -`]],qu={blocks:Lu};Nu({background:[255,209,253]});const Fn=Color.fromArray([0,0,255]),kn=Color.fromArray([128,128,255]),Yr=Color.GREEN,zr=Color.RED,Gu=Color.fromArray([255,215,0]);let ii=0,De=0,qe=0,nt=0,Ct=0,xr=0,vr=0,jt=0;const ju=2;let br=60;const Ku=2;let Qr=0;const oi=qu;scene("game",()=>{let t=0,e=0;const r=8;let n=[],s=0;add([rect(width()-100,640,{radius:32}),anchor("center"),pos(center().x,height()/2),outline(4)]);const i=add([text(`[yellow]${br}[/yellow]`,{size:32,styles:{yellow:{color:Gu}}}),pos(center().x-40,height()/2-250),anchor("top")]),a=add([text("_",{size:32,color:zr}),pos(0,0),anchor("center")]);function h(){return oi.blocks[t]}function l(){const m=h(),f=e*r;return m.slice(f,f+r)}function c(){let m=0;loop(.3,()=>{if(m=ju){go("endgame");return}t++,t>=oi.blocks.length&&(t=0),u();return}n.forEach(V=>V.destroy()),n.length=0,s=0,Qr=0;const f=30,A=17;let y=height()/2-f*m.length/2;for(let V of m){for(let I=0;I{if(br--,i.text=`[yellow]${br}[/yellow]`,br<=0){i.text="[yellow]0[/yellow]";const m=h().join("").length,f=De+qe;jt+=Math.max(0,m-f),console.log(`Missin Characters: ${jt}`),go("endgame")}})}window.addEventListener("keydown",m=>{const f=m.key;if(f==="Backspace"&&s>0){const A=n[s-1],y=s=Ku)&&s=n.length&&n.every(V=>V.color.eq(Yr))&&(e++,u())}}),g(),u()});scene("endgame",()=>{add([text("Analytics",{size:48}),pos(center().x,center().y-100),anchor("center")]);const t=Ct+xr+jt,e=t>0?Ct/t*100:0,r=60-br,n=Ct/5/(r/60),s=vr/r*60;add([text(`Accuracy: ${e.toFixed(2)}%`,{size:32}),pos(center().x,center().y),anchor("center")]),add([text(`WPM: ${n.toFixed(2)}`,{size:32}),pos(center().x,center().y+40),anchor("center")]),add([text(`LOC: ${s.toFixed(2)}`,{size:32}),pos(center().x,center().y+80),anchor("center")]),add([text(`Missing Characters: ${jt}`,{size:32}),pos(center().x,center().y+120),anchor("center")])});go("game"); -//# sourceMappingURL=index-Cv33lXux.js.map +`,` const leftMirror = isMirror(n1.left, n2.right); +`,` const rightMirror = isMirror(n1.right, n2.left); +`,` return n1.val === n2.val && leftMirror && rightMirror; +`,` }; +`,` +`,` return isMirror(root.left, root.right); +`,`}; +`]}],ca=.35,yc=.18,wc=60,Ds=5,Ac=1,xc=28,Xt=mc,vc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},bc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Uu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Uu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],de=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Ec=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function Sc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),Sc()){a.add([a.text("WPM is a desktop-only experience",{size:32}),de(()=>a.vec2(a.width()*.5,a.height()*.8)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]);return}a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),de(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),de(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("Github",{size:e}),de(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),de(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),de(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var yt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,mt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,mt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,Mc=a.Color.RED,Bt=0,ws=18,Pc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,Nu=_r,zu=Fn,ju=Rn,Vu=dr,Hu=Bt,Gu="",Ns=[],Cn="",Tt="",$e="";const Cc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},B=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return Mc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){Nu=_r,zu=Fn,ju=Rn,Vu=dr,Hu=Bt}function q(){Sn=!1,Bt=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([de(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),de(()=>a.vec2(a.width()*.02,a.height()*(vc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),de(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Ec(Y),de(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,xc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:B(U,H)})}),a.pos(0,0),de(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Pc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),de(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),de(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);mt(xe),mt(We);function mt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function yt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&Bt++,c+=.05,Ye(),Bt===Ds){Bt=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=yc,_=4;if(Bt>0){const lt=Math.min(Bt,_)/_;s=U*Math.pow(H/U,lt)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jlt.name===me)||ms[0];const wt=se.blocks;i.lineCount=wt.length,Cn=wt.join("");const Ie=w(Cn);Tt=Ie,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Ie,V.text=Tt,v.line=$e.split(` +`)[0],g.line=v.line,Gu=se.title,xe.updatePos(),We.updatePos()}function Ye(){l.speed=c}function qe(){Tt=$e.split("").map((U,H)=>bt.includes(H)?U===` +`?`${En[H]} +`:En[H]:U).join(""),Tt=w(Tt),V.text=Tt}function Se(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos++,H.curCharInLine++,H.cursorPointer.pos=Te(U),ge($e))}function Kt(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos--,H.curCharInLine--,H.cursorPointer.pos=Te(U),ge($e))}function ot(){a.shake(2),ye.mute||a.play("wrong_typing")}function N(U=!1){var me;const H=U?g:v;if(!H.cursorPointer)return;H.curLineCount++,v.curLineCount>=gs*(e+1)&&e++,U||Pn++;const _=$e.split(` +`)[H.curLineCount];if(!_)return;const se=((me=_.match(/^\s+/))==null?void 0:me[0].length)||0;H.line=_,H.cursorPos+=se,H.curIdentSize=se,H.curCharInLine=se,V.updatePos(),H.cursorPointer.pos=Te(U),xe.updatePos(),We.updatePos()}function K(){$e[g.cursorPos]===` +`?(Se(!0),N(!0)):Se(!0)}function J(U){for(let H=U.length-1;H>0;H--){const _=Math.floor(Math.random()*(H+1));[U[H],U[_]]=[U[_],U[H]]}return U}function ae(){A.text=kt.toFixed(1),kt>0&&Wt>5&&(_r=Wt&&kt>1?Wt/5/(kt/60):0,Rn=Pn&&kt>1?Pn/(kt/60):0,dr=Mn>0?Wt/Mn*100:100,isNaN(dr)&&(dr=100),P.text=Math.round(_r||0).toString())}const ve=60;let Ae=new Array(ve).fill(0),_e=Math.floor(a.time());function wn(){let U=Math.floor(a.time());if(U!==_e){for(let _=_e+1;_<=U;_++){let se=_%ve;Ae[se]=0}_e=U}let H=U%ve;Ae[H]++}a.onKeyPress(U=>{if($e[v.cursorPos],(v.cursorPos>0?$e[v.cursorPos]:"")===` +`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,wt=me,Ie=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me;else if(me==="space")me=" ",wt="_";else return;if(Mn++,Ie=me===_,Ie)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ac)return ot();bt.push(v.cursorPos),En[v.cursorPos]=wt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` +`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Cc);a.scene("endgame",()=>{let t=18,e=Hu,r=Gu,n=parseFloat((Nu||0).toFixed(0)),s=parseFloat((ju||0).toFixed(0)),i=parseFloat((Vu||0).toFixed(0));parseFloat((zu||0).toFixed(0));const l=Uu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),bc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),B=a.width()*.1,f=a.height()*.2,w=(R,L)=>de(()=>g().add(a.vec2(R,L))),S=-B-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-B,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+B,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("last challenge",{size:t}),w(+B,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+B,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),de(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. + +We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. + +It is also a key predictor of interview performance. Slow coding gets an “instant no” in any competitive interview process, and interviewers almost never tell candidates this is why, because it is embarrasing and even conflictive. + +Many developers get publicly angry at the suggestion that typing speed is irrelevant. I say to you - do you want to be upset or do you want to pass interviews? + +WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment. + +To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),de(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),de(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});a.go("selection"); +//# sourceMappingURL=index-BC0a59As.js.map diff --git a/website/public/sounds/code_sound.mp3 b/website/public/sounds/code_sound.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..89b4bd3cf329580730cd8663b8a59a1520b2f626 GIT binary patch literal 1401 zcmeZtF=k-^0i}@OU{@f`$H2hslUSB!W~c{*1_oeB2=V`S01^*7(=#tEA1K2Q#M}%F ztiB9ZFyIFRNia|b1D!B17X~)Mz!4a@0RwMf;6Dt2Tmp1*GSJD!dLRxAsIUY=n5@3n z4cjV-MFfdsE|13YFj-6K{!=WHi*fP}fi$raA zGuy!gGgi6(zlBod85nJO)~`)fU<28+fPs-!rQAjm6yOXd%|OCNMKH_ur}eRdu{np3yn$Z4@2ivvuG>;Gl0P5;cUyKn->QWixw^~=*1 z@iw*SyxtKB@{lC+hmYJL?I{jSAd4O_Ffw&0$MvWODkKIsKpzp)>IpzH;-?8 ztLSk2&>XXR`{6Pv{gY2PwM2mFXMuEzLltarAXH24&Dt zYyjk;F#Zn>Y?qkb;Px=SkaXkaNlJiv2%A2V#Xug)=>L$z7Rc;xzytDHNI;7+6R*6;lTQ&q37P literal 0 HcmV?d00001 diff --git a/website/public/sounds/endgame.mp3 b/website/public/sounds/endgame.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..05c74d491a3e3dabaa8ff4a9d59807db090d1da8 GIT binary patch literal 631643 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%0Dm?~C$LrskglMqmMakNPweh%KSbmiD)T67IeQ(&; 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

*t0s)aPYY^Y*+yOvDNz3t6o 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

Lqdqx|#OiOhdskJC= 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 literal 0 HcmV?d00001 diff --git a/website/public/sounds/wrong typing.mp3 b/website/public/sounds/wrong typing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..aedc1fed5a8e7f8e51a61c95c1ec672bed2f4748 GIT binary patch literal 2252 zcma)-c~leE9>;GcA(@0B2?`n>L`VpWKr{#_B4T7K2~ZaC2-RxPh)5Om`Q*5?G8h!f zA}FBX8jwu^MJz}aA)q3tSY)f<1}M*9pEkTBpaq#X7u$2*AO6u#P9`&RC!h11@BPgk znYR-SK!jndR{4;>YyhYMk?~QB9T$)viDYK*^M;rV`@f?v@5*AM;>ZyW`85UrRRaNu z17r!r6B0-g0Z~HYAp1xTL9!sHASEQ#keiTJNEgX-$Oz;;gdl;HkR@*-OLkfS5B@?# z3;Dc@su}#YJ;bDu5->UffVfP+qW}>Ntm0ZaodN~)FA`Rf^OnVc5_l+VN{Hw0{$%!QYfjWJ}2%G=VD--&;fWqf= zT~eqKh7^@Fp@6EjSMUpP)S5ZygDt;JnCce!jkyWsS#`QSjt$#>psn6OGgRRU=%;aXhw1$)ro@g+R|ClUKk%cm zVhdXUEXjMN;eOxu4aNyw-6sW3NisIeIUu!P*6L$&XGQYt9<1WT*59HoDw~SR=UF6I z>aBB`lW{=ylQo4HXi{b1&~KQjdv35s6|jhly~>jUpCUwR8I4)twrn88xha4`eAseV zQ2KVAI>(#UZ_b!Fy@d^yW5)(u8Fbfi8G@s$6!U8=s)Y1 zREG-|ulK^&lUbTbc|PKy2PuJnk_<>P64H-7VEU+;@|1+H_#)3ruF zM+y6f+6%8Z*S1MmR_dy;LF8J@ zlIvEcy~(ALGi-$8ve%S2L(^H zlT&rP1wC)i6kdPuqr&g}4(RvI)a|4HN~J4UFdx*@pQ7c5V z%Ao)2OkFiIj2fiip#wZMe7-Q#Ff1RpwZ|hhhA7w>Ww5BfNPMTzY#D-7JZ{t2@Emeh zmEWm*-t)fkZLxgmSWuB0n;m^CNjp+V-!JGyt`w`!d+>yC2XfX6qa8ygN;a|AoW(^zC$&$K{5*-JL0V->qIw zy&&w^8~Xa7o6E3G<t_l0F8sJA-A75{jx@n$P6#L1Fl=@uu9UE8*4!nX9C z@$SxNedb);0{Z0~T^`y+Whz*h6eZUmSHzt!$0Q2vA`qz|^RFrL!YN$^d9|5E_hQ9+ zwO7xH_m`#}bvs->@oCeB#17vS3$J`~F*Ge{DS37vZS;m+Mn6Tu@_)H_>3!&zadhd7 zPL;iaWgtb#1%b@pT#j7q@qxAp) literal 0 HcmV?d00001 diff --git a/website/public/sprites/BG_AWPM_IN_GAME.png b/website/public/sprites/BG_AWPM_IN_GAME.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc70559ddabcaeafadeebb715152ec137b4cf50 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3r$P6TJ2ipq(DVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}YymzYuI>ds|Nk>=n&x{BBwZ5Z7tG-B>_!@poz-!}Qy-^BeOY`=t;b lo`1OE9Mi1!V^T&83^{UcBDyC|O8|{!@O1TaS?83{1OT}NMBM-Y literal 0 HcmV?d00001 diff --git a/website/public/sprites/BG_TIME_IN_GAME.png b/website/public/sprites/BG_TIME_IN_GAME.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b9b25a3ac130891b864480ce3bb70549ac9a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<9i5Wdsyu7?X-v9p$y3^an<#eY-Jw;g|Ez4cG(2i`**{@r>yZk{mMFLG?m%6Wt4{N;9eu#Ukg(;s;@qPV ROMn(Kc)I$ztaD0e0svH=P~89k literal 0 HcmV?d00001 diff --git a/website/public/sprites/BG_WPM_IN_GAM.png b/website/public/sprites/BG_WPM_IN_GAM.png new file mode 100644 index 0000000000000000000000000000000000000000..d0db1e14e77bcddb6fdc53e4fd4e166539055731 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<9g&9b`uJ61Aq*&4&eH|GXHuiJ>Nn{1`8H0fo(zIA5_%5}frneU<7hC;z1pr>Fl9Q$>&y{HP1OVI~43-`?)Vh z?fT!C_1)W+T2{C;JA9bLw$r{yf3Me;EvgBPy^`okO zQ=XeO9(y3j%XHA&@6z@;ZcM6~0vu(z6End2Eaf4Bx(Rt39 Blh^Px#7*I@9MMrQ<4Gj$d009600O;oOuB^WG^Yhu+;f<@S zt^fc40d!JMQvg8b*k%9#0&Gb{K~z}7?b$(Y+b|G?;UYJ9jjVOr8yGr)fIqW0Pxmb?}DUA%TAg=0jdPz&f);`aVQQA``fo;eEIS4bI0T9696B6XvgFG(*Zny8wczg z*zF%U?j5-Eckq4zhhZ2bJr2WgejLg;Ur!vs1k}!fdIxYAl%R$C$$%XWFbc+w=S%6c zqtxLdO}jcQf=wk^Z~!DMmIx#@Aplt13bdDj=E58>SBFRNCHwCT7amIll9~_z{Lfo~ z!(Cv?3!|`U4fL4PdrS*4Uyf&Hp|n7c8E9T2W&rc~W#G9ydkttFLI~j^d=2a!nLmdR zLQv-sJXT<0A&(^jBzdgBJh2VvaRFX!F?3hy`&7UMn92ikDv+_M@qOUqFuZGvdoL}^ zTA+a5k(PXYq*S&&Ml_E)7;6DF-*oF&fn{P1jOnaRvbY9DQlUJi?B?7BVri8fjJ1H8 zN#|-C@bn7@e3D-Q1J)B%(|0Ldvx21&;jsXx`jRS;&eb)r?BsiaqnvA?#|%vAyHvmi zIORr^Ud1J(0?i}l@n68VTy=H>RL;62%>8Idk4?D|)y~{Cr@S0?=Ocg~SB*OLxl*Xw zj~bv)>4-I*xo-2Ie>iP#%9%+#~a|e0?+pv zaNK(22@{^!b2$J$#ooFH?okI1gdH%{(_vwNE^$Y9nfX8n$2k-zM lzytV|fX6>gn}ItYe*r<8GEw7s4 zB)S}zB4InZWG<1&eYr$PJL~)f=l$V*KkxH=p3mobKF{;MsT4Y|zSwG!D;`?|hz>*;tm3-VcVDD<-@>3;lVGKt%2VQHJH_7F(mK>$B!W#& zEUvDIN*_Jnf70#JPhL3H@dONJZ+MBFVlEv!V& z=mT9!)soBYREum!ta^$Jc>*obGWiGa@FecIJ)+07Sqx+3PVX+JLDHUxo?oy7V6|kk z0p%Wi6Gxa`D|OT?z*7jB{@2QFk?So6loDw_rD7^%QUi&-e*f&0ZeUa?zLFcQKWmVdCb`{h_ zEN}?MkROn?68T0V${<6d#3*J@T>&&ZkEZu2sjKoB3aoh_4&G+QOTmV{J`(Y0KHx3} z{pnZV+vOKsfF1R^6j#n=OV0iMaQ+_Ej6w4oR?PO70UR_iLr7&g%6g_48T*B-d+Zq5D#wh6de?rOZg zuuLeW=g!!cg|dxK(pPWkA5l-OUL^M`s>U6w3;QR+V}#fgoz7L3m)6OKCWZuqL*QGv zkiAK^R@EpbI}1g(rTLzzH@53r$@;J}(kaTU4tfHwsB!b=gTHZ$4|;^3_B{7|x0j4z z#&kfWb7bofd)xb0iy%G3W(wK&(D@@VKEgSGhR4p_; zTYFw;2n;pdm~OrHnL`pE4W7u?Enb*Z8*ZP3LPiF!DHYpm}Ymi0an{yKMpyp;x)lqDEOe&4r(zDww!BHQDJK3g`N-KcgNo%912W@ zNN0K#)eq&WhdA*=+5IHuM)+gG8r!y36x{#xQFK(rY%gQf>PR0LE`i_!z?%=TrGwyU zu94S62gw*LQm(@|UFUc78aExWlnWu7nCmAP5e3NC8LvtF5w zYMFMmtjH#rHR({s^slpI$3@3(-9&VZyH-j*hBi55d{bepk<8hSQ_}$qPOfq~&G$gL zN)-g@dC|=0LANEN*Rcqudov;9=r=>@S{;gZiN|-N*Kz>28cdAc4C@RpoO%b|(Bm1UcSuz;+gdUwYrpnI7^Z>ZQ2v%vi>of<)$uj@ z0l&4E+UvpxXgwnvuiI-+79GbPx8}Hp<@v{jn~k=&`P^8{FY0bEdlR3yZsInXs^8Eb z7Rk4(FfVZN$6T*ETUtL|*cNtpw4o@-JO+~5nh1&y_W#z)cKrF@n4`K?`P=!7Q)%(5 z!Y>QSePdn^Uk%`ey$IFs)Y+y>N%!){Fk^}o~%WNTbdluvt< z>W@5WqQ1Q62qwi9Cr?6?GEzV+3Jx7?Pim}_QBKAK5H{&NdG)0YLW0Q2QSjs9MN$)c zO)m>Oh#lV9lL~%fHjzUORv9uyKqI(M#MGnK>P9FFG<*)R^IOkw9cE+b;v9FU*?(GM zd$_55D~ZEZE>5Xdka5b1PA+Z2TA&lft{}%uiXO!to(;Uf8cZ literal 0 HcmV?d00001 diff --git a/website/public/sprites/arrow_yellow.png b/website/public/sprites/arrow_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..57613fdeb09882865fe20de208d5d0ce1219ed0d GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g##0(_QNw{1FQY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|I0Jk_T-^(NfXx42Snm7Xy$4cJ666=m;PC858j$1S>Eal|aXmSqq2a;> z0S-~FMT^38OBsT-nHxfGtO`}|ycoKA8I$HUoee6=ik>X2qAgmD84X#-)mS%+z2aCg dc>!Mw14Fxyc6+{;$a0{044$rjF6*2UngF2PHVgm& literal 0 HcmV?d00001 diff --git a/website/public/sprites/bg.png b/website/public/sprites/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1fceeeafd12dcd6843929cbaee5b209714d95f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%Ak0G|+7QDq%bC9OZQjW>WIf}SppAsp9}f1E$iAet!tm!F|-KmW&9pM|dj PB^f+j{an^LB{Ts5%s(F| literal 0 HcmV?d00001 diff --git a/website/public/sprites/bg2.png b/website/public/sprites/bg2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed02e7ca3d086dc6284424547b3c6be1ca49cac GIT binary patch literal 1879 zcmc(g!D|yy5XPUI#7&dtAPNnwP<2nmK(~TY@K6&{YfwWe1#czdK@Y`CMZ`;M@lp&a zh>C*v4+wERc<>z&hi8-{vMrdbEiAVZ8iY%wSB~CNa zz*xb~CRg|c=QIl(*Tmug#sSQo6fYKa!ups^)k3Nn*TAQc(P)D#CsZ_tQ*Tgv6FXrW zIL~H-eaK=00Hz78bCJ9B0h2D!5A=|wkpu#k?%>%Gqwxw+O>-fjHw|WkVu3)}dsd<$O#c?l5`e?Tfqg8YIR9G=}s19D*{=SX3oTlAG+WOwPZiExsq4ku$lX%YQTDJQ?dR71iLS=_G2(oOR&W~ZerR~P z=Iey#M$!{*TiWRDt}C5Y^M#$Ma2xt+5r>mdKI;Vst E0PdsGoJ4p>MU1AJ4ob={Po0{$ibH`N%n)=^T4msu>Hj}wBX`}Q) z)x{<2+UCnH|Fh$b?#z&7hQ9aax}7>v@$GI_%AET?e`il_F#P(hT(8Q^>b=YB2fu+9 OGI+ZBxvXdsKxV+xiTAEGM}Sn61o;IsI6S+N1`_skaSV~ToSdM*X3*Bw zX4KNwwqWzou(eU5yRxo&v4@x?i%pPaJraE3X0WsK;%RMZi5r$PUe!rGa(dsK<29dzpKx)9|ox?3GxeOaCmkj4amvxba4!kxZHboBkv&x z0hf!V1*#YLRdWug?+{uizq^_D&uSHei(CSeZO?iLe=KJ!*zYK$JbT$Lecj?~?6O&r zWxNr`IepG9>&TVOijCc8x+Y`R(OZderds*Z;fmEqo0UC|=G7QdAP;7tG-B>_!@p6XNOO7$R{wIYEK# z#{d8S8~-ym|78p@`@A}I^|kum^nFpyC*xYD?*0FN)%u0;&W1M>Og-NGU%2ogyTQ%Z yk_Wsl-1z;!{=lhw%qoUA1^hq!w{JLijE^CXD?ab`W;D literal 0 HcmV?d00001 diff --git a/website/public/sprites/muteOFF.png b/website/public/sprites/muteOFF.png new file mode 100644 index 0000000000000000000000000000000000000000..1c07bfa801e958b348cb0aff6c7f0331ea39f171 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^D}dO5i5W=#5V*++q*&4&eH|GXHuiJ>Nn{1`8Hs-Ickr#bN_?j6VByI7d|gg{vi^#D?Ou(-&EoA6j`bNtht951`Fy%*$J?y1|2ZI zAk%jrXi)&SEaQSr7plY<^p84dPc{9%_yRYBERWF_8A}ez7bHC1ytpeOu_Eq)%YEM9f}qC9&mQN0cQEE`n4G%% oMJNM{@Yei8pZ=KtORQlkid-&q*DmfUFt8XrUHx3vIVCg!088wh#Q*>R literal 0 HcmV?d00001 diff --git a/website/public/sprites/muteON.png b/website/public/sprites/muteON.png new file mode 100644 index 0000000000000000000000000000000000000000..93bb0e486506c592ed9f5e647b285ecdd3fdcfb1 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^D}dO5kr_zt->~>5kYY)9^mSxl*x1kgCy^D%XDkkK zcVbv~PUa<$!xrEZ;_6=D^Z)<<`BN4-gQQD>{DK)Ap4~_Ta=JWS978NlCnreAHT-9A zW=vi5l|AK$hEVFi`Z+uMMFQ)NJ?EXzA7Z!R=l|dT&;OT~ka+T6zM?1k%faX8?H4Yp z=ji_`mnWqR;m8SF40=k$n?4W2eFXMB%^u-){f6cMv}C z?x-FYU;MNGZyhdn{o+r!$Y0@_IZ@7yk%NI@bLZ*h*Q!<<0bRx5>FVdQ&MBb@04OnM AmjD0& literal 0 HcmV?d00001 diff --git a/website/public/style.css b/website/public/style.css new file mode 100644 index 0000000..e69de29 diff --git a/website/src/styles/game.css b/website/src/styles/game.css new file mode 100644 index 0000000..e69de29 From 800ad141f9a7b78531ad566c6980da33700cb9c0 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Mon, 5 May 2025 13:03:05 -0300 Subject: [PATCH 09/22] Add style and mobile resolution --- game/src/kaplay.js | 43 ++++++++++++++---------- game/src/main.js | 1 + game/src/scenes/selectionScene.js | 29 +++++++++------- website/public/game/game.js | 55 ++++++++++++++++++++++++------- 4 files changed, 89 insertions(+), 39 deletions(-) diff --git a/game/src/kaplay.js b/game/src/kaplay.js index 6db1499..c7b727b 100644 --- a/game/src/kaplay.js +++ b/game/src/kaplay.js @@ -2,23 +2,32 @@ import kaplay from "kaplay"; +function isMobile() { + return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i + .test(navigator.userAgent); +} + +const width = isMobile() ? 640 : 1920; +const height = isMobile() ? 480 : 1080; + export const k = kaplay({ - loadingScreen: false, - background: [0, 0, 0, 0], - font: "jetbrains", - maxFPS: 120, - backgroundAudio: false, - width: 1920, - height: 1080, - letterbox: true, - pixelDensity: 3, - crisp: false, - texFilter: "linear", -}); -k.onLoading((progress) => { + loadingScreen: false, + background: [0, 0, 0, 0], + font: "jetbrains", + maxFPS: 120, + backgroundAudio: false, + width, + height, + letterbox: true, + pixelDensity: 1, + crisp: false, + texFilter: "linear", }); + +k.onLoading((progress) => {}); + window.addEventListener("keydown", (e) => { - if (e.key === "/" || e.key === "?") { - e.preventDefault(); - } - }); \ No newline at end of file + if (e.key === "/" || e.key === "?") { + e.preventDefault(); + } +}); \ No newline at end of file diff --git a/game/src/main.js b/game/src/main.js index e5100fe..bdcfac8 100644 --- a/game/src/main.js +++ b/game/src/main.js @@ -6,4 +6,5 @@ import "./scenes/game.js"; // load game scene import "./scenes/endGame.js"; // load endGame scene import "./scenes/selectionScene.js"; import "./scenes/about.js"; +import "./data/changeStyle.js"; k.go("selection"); diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index c5c4f05..f7d1c5c 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -39,6 +39,24 @@ k.scene("selection", () => { settings.mute = getMute(); k.setVolume(settings.mute ? 0 : 0.5); + if (isMobile()) { + k.add([ + k.text("WPM is a desktop-only experience", { size: 18 }), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.5)), + k.anchor("center"), + k.color(k.YELLOW), + k.z(18), + ]); + const title = k.add([ + k.sprite("WPM"), + resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.25)), + k.anchor("center"), + k.scale(0.5), + k.z(18), + ]); + return; + } + isMobile(); k.add([ k.sprite("bg2"), k.pos(k.width() / 2, k.height() / 2), @@ -65,17 +83,6 @@ k.scene("selection", () => { k.anchor("center"), k.z(18), ]); - if (isMobile()) { - k.add([ - k.text("WPM is a desktop-only experience", { size: 32 }), - resizablePos(() => k.vec2(k.width() * 0.5, k.height() * 0.8)), - k.anchor("center"), - k.color(k.YELLOW), - k.z(18), - ]); - return; - } - isMobile(); const outsideBox = k.add([k.rect(810, 260, { radius: 0 }), k.pos(k.width() * 0.30 - 15, boxY), k.color(k.rgb(52, 53, 54)), k.z(20), k.opacity(0.3)]); const outerBox = k.add([k.rect(790, 230, { radius: 1 }), k.pos(k.width() * 0.30 - 5, boxY + 20), k.color(0, 0, 0), k.z(20), k.opacity(1)]); diff --git a/website/public/game/game.js b/website/public/game/game.js index 12a1341..0519184 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var Wu=Object.defineProperty;var Xu=(t,e,r)=>e in t?Wu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Xu(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Yu=Object.defineProperty,o=(t,e)=>Yu(t,"name",{value:e,configurable:!0}),Ju=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],B=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*B-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*B-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var Zu=1103515245,_u=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(Zu*this.seed+_u)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),B=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=B.m11,L=B.m12,D=B.m13,O=B.m21,j=B.m22,$=B.m23,G=B.m31,Y=B.m32,te=B.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ia(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ia,"testRectShape");function Ba(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ba,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var dt,Re=(dt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new dt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let B=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(B,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new dt(i):null,l.length?new dt(l):null]}},o(dt,"Polygon"),dt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),B=cr(v+m);return[g-B-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",eh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],th=ti.reduce((t,e)=>t+e.size,0),oo=2048,rh=oo*4*th,nh=oo*6,sh=` +var Yu=Object.defineProperty;var Ju=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Ju(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Qu=Object.defineProperty,o=(t,e)=>Qu(t,"name",{value:e,configurable:!0}),Zu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],I=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*I-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*I-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var $u=1103515245,eh=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=($u*this.seed+eh)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),I=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=I.m11,L=I.m12,D=I.m13,O=I.m21,j=I.m22,$=I.m23,G=I.m31,Y=I.m32,te=I.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ba(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ba,"testRectShape");function Ia(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ia,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var dt,Re=(dt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new dt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let I=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(I,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new dt(i):null,l.length?new dt(l):null]}},o(dt,"Polygon"),dt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),I=cr(v+m);return[g-I-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",rh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],nh=ti.reduce((t,e)=>t+e.size,0),oo=2048,sh=oo*4*nh,ih=oo*6,ah=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -26,7 +26,7 @@ void main() { v_color = a_color; gl_Position = pos; } -`,ih=` +`,oh=` precision mediump float; varying vec2 v_pos; @@ -56,10 +56,10 @@ vec4 vert(vec2 pos, vec2 uv, vec4 color) { vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,ah=new Set(["id","require"]),oh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),lh=200,uh=640,hh=65536,lo=Symbol.for("kaplay.cancel"),wr,ch=(wr=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new ch)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),dh=o(t=>t[0]instanceof ne,"arrayIsColor"),fh=o(t=>t[0]instanceof k,"arrayIsVec2"),ph=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),gh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,mh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function ce(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(ce,"overload2");var yh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ht=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),wh=(()=>{let t=0;return()=>t++})(),Ah={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},xh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),vh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,bh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Eh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=Ah,Sh=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Eh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new bh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Mh=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Sh(t);Yt=e,vh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let I=e.canvas.requestPointerLock();I!=null&&I.catch&&I.catch(F=>console.error(F))}catch(I){console.error(I)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function B(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(B,"exitFullscreen");function f(x=!0){x?g(e.canvas):B()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),I=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of I)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,I){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(he=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Be=he/1e3,be=Math.min(Be-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ht(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ht(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ht(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ht(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ht(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ht(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ht(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ht(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ht(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ht(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var I;return(I=e.buttons)==null?void 0:I[x]}o(V,"getButton");function X(x,I){e.buttons[x]={...e.buttons[x],...I}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=ce(x=>e.events.on("keyDown",x),(x,I)=>e.events.on("keyDown",F=>Je(x,F)&&I(F))),xe=ce(x=>e.events.on("keyPress",I=>x(I)),(x,I)=>e.events.on("keyPress",F=>Je(x,F)&&I(F))),We=ce(x=>e.events.on("keyPressRepeat",x),(x,I)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&I(F))),mt=ce(x=>e.events.on("keyRelease",x),(x,I)=>e.events.on("keyRelease",F=>Je(x,F)&&I(F))),yt=ce(x=>e.events.on("mouseDown",I=>x(I)),(x,I)=>e.events.on("mouseDown",F=>Je(x,F)&&I(F))),ge=ce(x=>e.events.on("mousePress",I=>x(I)),(x,I)=>e.events.on("mousePress",F=>Je(x,F)&&I(F))),Xe=ce(x=>e.events.on("mouseRelease",I=>x(I)),(x,I)=>e.events.on("mouseRelease",F=>F===x&&I(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=ce(x=>e.events.on("gamepadButtonPress",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&I(F,z))),ve=ce(x=>e.events.on("gamepadButtonDown",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&I(F,z))),Ae=ce(x=>e.events.on("gamepadButtonRelease",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&I(F,z)));function _e(x,I){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&I(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=ce(x=>e.events.on("buttonPress",I=>x(I)),(x,I)=>e.events.on("buttonPress",F=>Je(x,F)&&I(F))),wt=ce(x=>e.events.on("buttonDown",I=>x(I)),(x,I)=>e.events.on("buttonDown",F=>Je(x,F)&&I(F))),Ie=ce(x=>e.events.on("buttonRelease",I=>x(I)),(x,I)=>e.events.on("buttonRelease",F=>Je(x,F)&&I(F)));function lt(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(lt,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,I)=>{e.mergedGamepadState.stickState.set(I,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((I,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let I={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(I),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),I}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(I=>I.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,I;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,he=e.gamepadStates.get(F.index);if(he){for(let Be=0;Be{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),he.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else he.buttonState.down.has(be)&&(ut&&((I=e.buttonsByGamepad.get(be))==null||I.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),he.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Be in Q.sticks){let be=Q.sticks[Be];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);he.stickState.set(Be,At),e.mergedGamepadState.stickState.set(Be,At),e.events.trigger("gamepadStick",Be,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let I=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,he=window.innerWidth,Be=window.innerHeight,be=he/Be,At=z/Q;if(be>At){let ut=Be/Q,xt=(he-z*ut)/2;I.x=nt(x.offsetX-xt,0,z*ut,0,z),I.y=nt(x.offsetY,0,Q*ut,0,Q)}else{let ut=he/z,xt=(Be-Q*ut)/2;I.x=nt(x.offsetX,0,z*ut,0,z),I.y=nt(x.offsetY-xt,0,Q*ut,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=I,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let I=Yi[x.button];I&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(I),e.events.trigger("mousePress",I))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let I=Yi[x.button];I&&(e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(I),e.events.trigger("mouseRelease",I))})};let Ku=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Ku.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(I===void 0)throw new Error(`Unknown key: ${x.key}`);I.length===1?(e.events.trigger("charInput",I),e.charInputted.push(I)):I==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(I),e.events.trigger("keyPressRepeat",I)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(he=>{e.buttonState.press(he),e.events.trigger("buttonPress",he)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(he=>{e.buttonState.press(he),e.events.trigger("buttonPress",he)})),e.keyState.press(I),e.events.trigger("keyPressRepeat",I),e.events.trigger("keyPress",I))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(he=>{e.buttonState.release(he),e.events.trigger("buttonRelease",he)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(he=>{e.buttonState.release(he),e.events.trigger("buttonRelease",he)})),e.keyState.release(I),e.events.trigger("keyRelease",I)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),I.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}I.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let I=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",I)})},An.gamepaddisconnected=x=>{let I=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",I)})};for(let[x,I]of Object.entries(je))e.canvas.addEventListener(x,I);for(let[x,I]of Object.entries(cs))document.addEventListener(x,I);for(let[x,I]of Object.entries(An))window.addEventListener(x,I);let Qi=new ResizeObserver(x=>{for(let I of x)if(I.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:mt,onMouseDown:yt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:wt,onButtonRelease:Ie,getLastInputDeviceType:xh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),Ph=new k(-1,-1),Ch=new k(0,-1),qh=new k(1,-1),kh=new k(-1,0),Th=new k(0,0),Ih=new k(1,0),Bh=new k(-1,1),Rh=new k(0,1),Fh=new k(1,1);function ir(t){switch(t){case"topleft":return Ph;case"top":return Ch;case"topright":return qh;case"left":return kh;case"center":return Th;case"right":return Ih;case"botleft":return Bh;case"bot":return Rh;case"botright":return Fh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Oh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Lh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function In(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(In,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=In(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=In(h,c,c),i=In(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,zh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new Nh(this._polygons.length),n=e.map((s,i)=>new Uh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Ir,na=(Ir=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Ir,"Edge"),Ir),Br,jh=(Br=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Vh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],B=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Gh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Hh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=gh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Kh="data:image/png;base64,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",Lr,Bn=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??eh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new Bn(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Wh=o((t="happy",e)=>fi(t,Kh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Xh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],ph(s)?r.uniform1fv(i,s):fh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):dh(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=sh.replace("{{user}}",e??bs),s=ih.replace("{{user}}",r??Es);try{return new Xh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=mh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var ft,gr=(ft=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new ft(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new ft(r))}static fromURL(e){return po(e)?ft.fromArrayBuffer(co(e)):Qo(e).then(r=>ft.fromArrayBuffer(r))}},o(ft,"SoundData"),ft);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Yh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",pt,rr=(pt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?pt.fromURL(e,r):Promise.resolve(pt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new pt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>pt.fromImage(n,r))}},o(pt,"SpriteData"),pt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Yh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,B=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/B,A=v/B,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(gt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(gt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(gt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(gt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Jh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,Qh=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,Zh=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Jh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new Qh(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new Zh(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var _h=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Is(){return Ts>0}o(Is,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??uh,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??hh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Il(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Il,"platformEffector");function Bl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Bl,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??lh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Ii(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),B=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var $h=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),ec=ce(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=ce(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),tc=ce(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Bs=ce(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=ce(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=ce(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=ce(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=ce(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),rc=ce(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Bs(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var nc=ce(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Ii(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Ii,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:wh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(ah.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),oh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},B=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of B)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var sc=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var ic=Ju("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var ac=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(ic.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),B=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=B(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=B(s),u=p-f):(s.stop(),s=B(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Bi(t){return d.k.play(d.audio.burpSnd,t)}o(Bi,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Bi())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),oc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?oc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new uc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,lc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,B=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(It,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=It(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=It(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=It(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=It(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[B,f]=It(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=It(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=It(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:B,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(-1),w=Math.cos(B),S=Math.sin(B);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=B,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(1),w=Math.cos(B),S=Math.sin(B);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Iu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Iu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof Bn||typeof e=="string"){let A=e instanceof Bn?e.fontface.family:e,E=e instanceof Bn?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,B=null,f=0,w;for(;gt.width&&(m+=i+c,B!=null&&(g-=v.length-B,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,B-1),u=f),B=null,f=0,y.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new we(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new k(u,m),opacity:t.opacity??1,color:t.color??ne.WHITE,scale:C(l),angle:0}),A===" "&&(B=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}y.push({width:u-h,chars:v}),m+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Vt,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n).add(1,1).scale(new k(e,r).scale(-.5)),s=[new k(0,0),new k(e,0),new k(e,r),new k(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new k(l[0],0),...l[1]?fr(new k(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?fr(new k(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?fr(new k(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?fr(new k(l[0],l[0]),l[0],l[0],180,270):[]]}Pt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function St(t){Ge();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ge(),d.gfx.width=e,d.gfx.height=r}o(St,"drawUnscaled");function Os(t,e){St(()=>{let r=C(8);He(),Qe(t);let n=jt({text:e,font:On,size:16,pos:r,color:ue(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=Ce()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Ue()})}o(Os,"drawInspectText");function Vi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Pt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Vi,"drawTriangle");function Bu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Os(vu(ls()),e.join(` +`,lh=new Set(["id","require"]),uh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),hh=200,ch=640,dh=65536,lo=Symbol.for("kaplay.cancel"),wr,fh=(wr=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new fh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),ph=o(t=>t[0]instanceof ne,"arrayIsColor"),gh=o(t=>t[0]instanceof k,"arrayIsVec2"),mh=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),yh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,wh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function de(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(de,"overload2");var Ah=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ht=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),xh=(()=>{let t=0;return()=>t++})(),vh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},bh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),Eh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,Sh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Mh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=vh,Ph=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Mh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new Sh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Ch=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Ph(t);Yt=e,Eh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function I(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(I,"exitFullscreen");function f(x=!0){x?g(e.canvas):I()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),B=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of B)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(ce=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Ie=ce/1e3,be=Math.min(Ie-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ie,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ht(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ht(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ht(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ht(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ht(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ht(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ht(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ht(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ht(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ht(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var B;return(B=e.buttons)==null?void 0:B[x]}o(V,"getButton");function X(x,B){e.buttons[x]={...e.buttons[x],...B}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=de(x=>e.events.on("keyDown",x),(x,B)=>e.events.on("keyDown",F=>Je(x,F)&&B(F))),xe=de(x=>e.events.on("keyPress",B=>x(B)),(x,B)=>e.events.on("keyPress",F=>Je(x,F)&&B(F))),We=de(x=>e.events.on("keyPressRepeat",x),(x,B)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&B(F))),mt=de(x=>e.events.on("keyRelease",x),(x,B)=>e.events.on("keyRelease",F=>Je(x,F)&&B(F))),yt=de(x=>e.events.on("mouseDown",B=>x(B)),(x,B)=>e.events.on("mouseDown",F=>Je(x,F)&&B(F))),ge=de(x=>e.events.on("mousePress",B=>x(B)),(x,B)=>e.events.on("mousePress",F=>Je(x,F)&&B(F))),Xe=de(x=>e.events.on("mouseRelease",B=>x(B)),(x,B)=>e.events.on("mouseRelease",F=>F===x&&B(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=de(x=>e.events.on("gamepadButtonPress",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&B(F,z))),ve=de(x=>e.events.on("gamepadButtonDown",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&B(F,z))),Ae=de(x=>e.events.on("gamepadButtonRelease",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&B(F,z)));function _e(x,B){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&B(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=de(x=>e.events.on("buttonPress",B=>x(B)),(x,B)=>e.events.on("buttonPress",F=>Je(x,F)&&B(F))),wt=de(x=>e.events.on("buttonDown",B=>x(B)),(x,B)=>e.events.on("buttonDown",F=>Je(x,F)&&B(F))),Be=de(x=>e.events.on("buttonRelease",B=>x(B)),(x,B)=>e.events.on("buttonRelease",F=>Je(x,F)&&B(F)));function lt(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(lt,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,B)=>{e.mergedGamepadState.stickState.set(B,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((B,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let B={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),B}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(B=>B.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,ce=e.gamepadStates.get(F.index);if(ce){for(let Ie=0;Ie{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),ce.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else ce.buttonState.down.has(be)&&(ut&&((B=e.buttonsByGamepad.get(be))==null||B.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),ce.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Ie in Q.sticks){let be=Q.sticks[Ie];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);ce.stickState.set(Ie,At),e.mergedGamepadState.stickState.set(Ie,At),e.events.trigger("gamepadStick",Ie,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let B=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,ce=window.innerWidth,Ie=window.innerHeight,be=ce/Ie,At=z/Q;if(be>At){let ut=Ie/Q,xt=(ce-z*ut)/2;B.x=nt(x.offsetX-xt,0,z*ut,0,z),B.y=nt(x.offsetY,0,Q*ut,0,Q)}else{let ut=ce/z,xt=(Ie-Q*ut)/2;B.x=nt(x.offsetX,0,z*ut,0,z),B.y=nt(x.offsetY-xt,0,Q*ut,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Xu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Xu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(B===void 0)throw new Error(`Unknown key: ${x.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}B.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let B=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},An.gamepaddisconnected=x=>{let B=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[x,B]of Object.entries(je))e.canvas.addEventListener(x,B);for(let[x,B]of Object.entries(cs))document.addEventListener(x,B);for(let[x,B]of Object.entries(An))window.addEventListener(x,B);let Qi=new ResizeObserver(x=>{for(let B of x)if(B.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:mt,onMouseDown:yt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:wt,onButtonRelease:Be,getLastInputDeviceType:bh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),qh=new k(-1,-1),kh=new k(0,-1),Th=new k(1,-1),Bh=new k(-1,0),Ih=new k(0,0),Rh=new k(1,0),Fh=new k(-1,1),Oh=new k(0,1),Lh=new k(1,1);function ir(t){switch(t){case"topleft":return qh;case"top":return kh;case"topright":return Th;case"left":return Bh;case"center":return Ih;case"right":return Rh;case"botleft":return Fh;case"bot":return Oh;case"botright":return Lh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Dh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Uh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function Bn(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(Bn,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=Bn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=Bn(h,c,c),i=Bn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,Vh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new jh(this._polygons.length),n=e.map((s,i)=>new zh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Br,na=(Br=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Br,"Edge"),Br),Ir,Hh=(Ir=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Gh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],I=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Wh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Kh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=yh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Xh="data:image/png;base64,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",Lr,In=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??rh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new In(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Yh=o((t="happy",e)=>fi(t,Xh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Jh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],mh(s)?r.uniform1fv(i,s):gh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):ph(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=ah.replace("{{user}}",e??bs),s=oh.replace("{{user}}",r??Es);try{return new Jh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=wh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var ft,gr=(ft=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new ft(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new ft(r))}static fromURL(e){return po(e)?ft.fromArrayBuffer(co(e)):Qo(e).then(r=>ft.fromArrayBuffer(r))}},o(ft,"SoundData"),ft);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Qh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",pt,rr=(pt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?pt.fromURL(e,r):Promise.resolve(pt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new pt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>pt.fromImage(n,r))}},o(pt,"SpriteData"),pt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Qh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,I=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/I,A=v/I,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(gt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(gt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(gt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(gt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Zh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,_h=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,$h=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Zh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new _h(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new $h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var ec=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Bs(){return Ts>0}o(Bs,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??ch,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??dh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Bl(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Bl,"platformEffector");function Il(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Il,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??hh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Bi(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),I=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var tc=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),rc=de(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=de(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),nc=de(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Is=de(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=de(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=de(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=de(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=de(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),sc=de(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Is(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var ic=de(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Bi(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Bi,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:xh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(lh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),uh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},I=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of I)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var ac=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var oc=Zu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var lc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(oc.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),I=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=I(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=I(s),u=p-f):(s.stop(),s=I(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Ii(t){return d.k.play(d.audio.burpSnd,t)}o(Ii,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Ii())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),uc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?uc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new cc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,hc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,I=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Bt,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Bt(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Bt(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=Bt(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Bt(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[I,f]=Bt(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Bt(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=Bt(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:I,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(-1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=I,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Bu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Bu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof In||typeof e=="string"){let A=e instanceof In?e.fontface.family:e,E=e instanceof In?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,I=null,f=0,w;for(;gt.width&&(m+=i+c,I!=null&&(g-=v.length-I,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,I-1),u=f),I=null,f=0,y.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new we(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new k(u,m),opacity:t.opacity??1,color:t.color??ne.WHITE,scale:C(l),angle:0}),A===" "&&(I=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}y.push({width:u-h,chars:v}),m+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Vt,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n).add(1,1).scale(new k(e,r).scale(-.5)),s=[new k(0,0),new k(e,0),new k(e,r),new k(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new k(l[0],0),...l[1]?fr(new k(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?fr(new k(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?fr(new k(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?fr(new k(l[0],l[0]),l[0],l[0],180,270):[]]}Pt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function St(t){Ge();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ge(),d.gfx.width=e,d.gfx.height=r}o(St,"drawUnscaled");function Os(t,e){St(()=>{let r=C(8);He(),Qe(t);let n=jt({text:e,font:On,size:16,pos:r,color:ue(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=Ce()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Ue()})}o(Os,"drawInspectText");function Vi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Pt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Vi,"drawTriangle");function Iu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Os(vu(ls()),e.join(` `))}Os(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&St(()=>{He(),et(Me(),0),et(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&St(()=>{He(),et(Me(),Ce()),et(-8,-8);let t=8,e=jt({text:d.debug.timeScale.toFixed(1),font:On,size:16,color:ue(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Vi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Vt(e),Ue()}),d.debug.curRecording&&St(()=>{He(),et(0,Ce()),et(24,-24),ar({radius:12,color:ue(255,0,0),opacity:zs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&St(()=>{He(),et(0,Ce()),et(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Gn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=jt({text:e.join(` -`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Bu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,B=m-v,f=(y+g?1:0)*(v+B?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new lc(e,ti,rh,nh),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),cc="data:image/png;base64,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",dc="data:image/png;base64,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",fc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,pc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Mh({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=hc(t,v);d.gfx=g;let B=ac();d.audio=B;let f=Gh(v,t.spriteAtlasPadding??0);d.assets=f;let w=sc();d.game=w,w.root.use(Nn()),ua("collision",yt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?B.ctx.suspend():B.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=B.ctx.createMediaStreamDestination();B.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{B.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),B.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,dc),X=mr(null,cc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new jh,We=!1;function mt(){if(Is()){if(!We){We=!0,Bs(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(mt,"broadPhase");function yt(){if(Is())return mt()}o(yt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),B.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Bu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:fc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Wh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Ii,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Bl,platformEffector:Il,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:_h,trigger:$h,on:ze,onFixedUpdate:ec,onUpdate:zl,onDraw:tc,onAdd:Bs,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:rc,onClick:nc,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Bi,audioCtx:B.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:$u,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:Qu,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:zh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Iu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),gc=pc;const a=gc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:1920,height:1080,letterbox:!0,pixelDensity:3,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const mc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { +`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Iu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,I=m-v,f=(y+g?1:0)*(v+I?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new hc(e,ti,sh,ih),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),fc="data:image/png;base64,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",pc="data:image/png;base64,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",gc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,mc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ch({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=dc(t,v);d.gfx=g;let I=lc();d.audio=I;let f=Wh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ac();d.game=w,w.root.use(Nn()),ua("collision",yt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?I.ctx.suspend():I.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=I.ctx.createMediaStreamDestination();I.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,pc),X=mr(null,fc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new Hh,We=!1;function mt(){if(Bs()){if(!We){We=!0,Is(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(mt,"broadPhase");function yt(){if(Bs())return mt()}o(yt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),I.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Iu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:gc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Bi,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Il,platformEffector:Bl,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:ec,trigger:tc,on:ze,onFixedUpdate:rc,onUpdate:zl,onDraw:nc,onAdd:Is,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:sc,onClick:ic,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Ii,audioCtx:I.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:th,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:_u,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:Vh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Bu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),yc=mc;function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const wc=Uu()?640:1920,Ac=Uu()?480:1080,a=yc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:wc,height:Ac,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const xc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { `,` let map = {}; `,` `,` for (let i = 0; i < nums.length; i++) { @@ -298,14 +298,14 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return isMirror(root.left, root.right); `,`}; -`]}],ca=.35,yc=.18,wc=60,Ds=5,Ac=1,xc=28,Xt=mc,vc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},bc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Uu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Uu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],de=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Ec=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function Sc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),Sc()){a.add([a.text("WPM is a desktop-only experience",{size:32}),de(()=>a.vec2(a.width()*.5,a.height()*.8)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]);return}a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),de(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),de(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("Github",{size:e}),de(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),de(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),de(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var yt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,mt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,mt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,Mc=a.Color.RED,Bt=0,ws=18,Pc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,Nu=_r,zu=Fn,ju=Rn,Vu=dr,Hu=Bt,Gu="",Ns=[],Cn="",Tt="",$e="";const Cc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},B=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return Mc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){Nu=_r,zu=Fn,ju=Rn,Vu=dr,Hu=Bt}function q(){Sn=!1,Bt=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([de(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),de(()=>a.vec2(a.width()*.02,a.height()*(vc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),de(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Ec(Y),de(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,xc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:B(U,H)})}),a.pos(0,0),de(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Pc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),de(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),de(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);mt(xe),mt(We);function mt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function yt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&Bt++,c+=.05,Ye(),Bt===Ds){Bt=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=yc,_=4;if(Bt>0){const lt=Math.min(Bt,_)/_;s=U*Math.pow(H/U,lt)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jlt.name===me)||ms[0];const wt=se.blocks;i.lineCount=wt.length,Cn=wt.join("");const Ie=w(Cn);Tt=Ie,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Ie,V.text=Tt,v.line=$e.split(` -`)[0],g.line=v.line,Gu=se.title,xe.updatePos(),We.updatePos()}function Ye(){l.speed=c}function qe(){Tt=$e.split("").map((U,H)=>bt.includes(H)?U===` +`]}],ca=.35,vc=.18,bc=60,Ds=5,Ec=1,Sc=28,Xt=xc,Mc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},Pc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Nu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],he=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Cc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function qc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),qc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),he(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),he(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),he(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),I=a.add([a.anchor("left"),a.text("Github",{size:e}),he(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),he(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),he(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var yt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,mt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,mt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,kc=a.Color.RED,It=0,ws=18,Tc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It,Ku="",Ns=[],Cn="",Tt="",$e="";const Bc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},I=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return kc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It}function q(){Sn=!1,It=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([he(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),he(()=>a.vec2(a.width()*.02,a.height()*(Mc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),he(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Cc(Y),he(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,Sc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:I(U,H)})}),a.pos(0,0),he(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Tc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),he(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),he(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);mt(xe),mt(We);function mt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function yt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&It++,c+=.05,Ye(),It===Ds){It=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=vc,_=4;if(It>0){const lt=Math.min(It,_)/_;s=U*Math.pow(H/U,lt)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jlt.name===me)||ms[0];const wt=se.blocks;i.lineCount=wt.length,Cn=wt.join("");const Be=w(Cn);Tt=Be,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Be,V.text=Tt,v.line=$e.split(` +`)[0],g.line=v.line,Ku=se.title,xe.updatePos(),We.updatePos()}function Ye(){l.speed=c}function qe(){Tt=$e.split("").map((U,H)=>bt.includes(H)?U===` `?`${En[H]} `:En[H]:U).join(""),Tt=w(Tt),V.text=Tt}function Se(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos++,H.curCharInLine++,H.cursorPointer.pos=Te(U),ge($e))}function Kt(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos--,H.curCharInLine--,H.cursorPointer.pos=Te(U),ge($e))}function ot(){a.shake(2),ye.mute||a.play("wrong_typing")}function N(U=!1){var me;const H=U?g:v;if(!H.cursorPointer)return;H.curLineCount++,v.curLineCount>=gs*(e+1)&&e++,U||Pn++;const _=$e.split(` `)[H.curLineCount];if(!_)return;const se=((me=_.match(/^\s+/))==null?void 0:me[0].length)||0;H.line=_,H.cursorPos+=se,H.curIdentSize=se,H.curCharInLine=se,V.updatePos(),H.cursorPointer.pos=Te(U),xe.updatePos(),We.updatePos()}function K(){$e[g.cursorPos]===` `?(Se(!0),N(!0)):Se(!0)}function J(U){for(let H=U.length-1;H>0;H--){const _=Math.floor(Math.random()*(H+1));[U[H],U[_]]=[U[_],U[H]]}return U}function ae(){A.text=kt.toFixed(1),kt>0&&Wt>5&&(_r=Wt&&kt>1?Wt/5/(kt/60):0,Rn=Pn&&kt>1?Pn/(kt/60):0,dr=Mn>0?Wt/Mn*100:100,isNaN(dr)&&(dr=100),P.text=Math.round(_r||0).toString())}const ve=60;let Ae=new Array(ve).fill(0),_e=Math.floor(a.time());function wn(){let U=Math.floor(a.time());if(U!==_e){for(let _=_e+1;_<=U;_++){let se=_%ve;Ae[se]=0}_e=U}let H=U%ve;Ae[H]++}a.onKeyPress(U=>{if($e[v.cursorPos],(v.cursorPos>0?$e[v.cursorPos]:"")===` -`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,wt=me,Ie=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me;else if(me==="space")me=" ",wt="_";else return;if(Mn++,Ie=me===_,Ie)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ac)return ot();bt.push(v.cursorPos),En[v.cursorPos]=wt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` -`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Cc);a.scene("endgame",()=>{let t=18,e=Hu,r=Gu,n=parseFloat((Nu||0).toFixed(0)),s=parseFloat((ju||0).toFixed(0)),i=parseFloat((Vu||0).toFixed(0));parseFloat((zu||0).toFixed(0));const l=Uu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),bc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),B=a.width()*.1,f=a.height()*.2,w=(R,L)=>de(()=>g().add(a.vec2(R,L))),S=-B-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-B,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+B,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("last challenge",{size:t}),w(+B,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+B,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),de(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. +`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,wt=me,Be=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me;else if(me==="space")me=" ",wt="_";else return;if(Mn++,Be=me===_,Be)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ec)return ot();bt.push(v.cursorPos),En[v.cursorPos]=wt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` +`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Bc);a.scene("endgame",()=>{let t=18,e=Gu,r=Ku,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Hu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Pc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),I=a.width()*.1,f=a.height()*.2,w=(R,L)=>he(()=>g().add(a.vec2(R,L))),S=-I-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-I,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+I,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("last challenge",{size:t}),w(+I,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+I,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),he(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. @@ -315,5 +315,38 @@ Many developers get publicly angry at the suggestion that typing speed is irrele WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment. -To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),de(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),de(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});a.go("selection"); -//# sourceMappingURL=index-BC0a59As.js.map +To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),he(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),he(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Wu=document.createElement("style");Wu.innerHTML=` + :root { + --bg: hsl(0, 3.60%, 11.00%); + --gray1: #0a080a; + --gray2: #110b11; + } + + body { + margin: 0; + overflow: hidden; + background: var(--bg); + position: relative; + } + + body::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + linear-gradient(45deg, var(--gray1) 25%, transparent 25%), + linear-gradient(-45deg, var(--gray1) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, var(--gray1) 75%), + linear-gradient(-45deg, transparent 75%, var(--gray1) 75%), + rgba(0, 0, 0, 0.81); + background-size: 15px 15px, 15px 15px, 15px 15px, 15px 15px, cover; + background-position: 0 0, 0 7.5px, 7.5px -7.5px, -7.5px 0, center; + background-blend-mode: multiply; + backdrop-filter: blur(10px); + z-index: -1; + } + `;document.head.appendChild(Wu);a.go("selection"); +//# sourceMappingURL=index-B2iEUwsK.js.map From 412ea6f39e40f5445b1e219be3d3c92303c92241 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Mon, 5 May 2025 14:39:06 -0300 Subject: [PATCH 10/22] Case change in the errokey --- game/src/scenes/endGame.js | 2 +- game/src/scenes/game.js | 5 +++-- game/src/scenes/selectionScene.js | 13 ++++++------- website/public/game/game.js | 14 +++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/game/src/scenes/endGame.js b/game/src/scenes/endGame.js index 374e859..9a087da 100644 --- a/game/src/scenes/endGame.js +++ b/game/src/scenes/endGame.js @@ -89,7 +89,7 @@ k.scene("endgame", () => { k.add([k.text(`${acc.toFixed(0)}%`, { size: fontsize }), pos(labelX + labelOffset + 20, baseY + textSpacing), k.anchor("left"), k.color(k.YELLOW), k.z(19)]); k.add([k.text("SCORE", { size: 32 }), pos(+offsetX, -offsetY / 10), k.anchor("center"), k.color(k.WHITE), k.z(19)]); k.add([k.text(`${record_blocks}/${goalBlocks}`, { size: 42 }), pos(+offsetX, +offsetY * 0.2), k.anchor("center"), k.color(k.YELLOW), k.z(18)]); - k.add([k.text("last challenge", { size: fontsize }), pos(+offsetX, +offsetY * 0.45), k.anchor("center"), k.color(k.WHITE), k.z(18)]); + k.add([k.text("Last challenge", { size: fontsize }), pos(+offsetX, +offsetY * 0.45), k.anchor("center"), k.color(k.WHITE), k.z(18)]); k.add([k.text(record_challenges, { size: fontsize }), pos(+offsetX, +offsetY * 0.4 + 50), k.anchor("center"), k.color(k.YELLOW), k.z(18)]); k.add([k.text("ChallengeSet:", { size: fontsize + 2 }), k.pos(k.width() * 0.45, k.height() * 0.74), k.anchor("left"), k.color(k.YELLOW), k.z(18)]); diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index 9b0f496..ed02dd9 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -768,7 +768,7 @@ const gameScene = (params) => { let idx = currentSec % BUFFER_SIZE; eventBuffer[idx]++; } - + let errorKey; k.onKeyPress((keyPressed) => { const curChar = fixedText[playerState.cursorPos]; const prevChar = playerState.cursorPos > 0 ? fixedText[playerState.cursorPos] : ''; @@ -776,13 +776,14 @@ const gameScene = (params) => { const correctChar = fixedText[playerState.cursorPos]; const shifting = k.isKeyDown("shift"); let key = keyPressed; - let errorKey = key; + let errorKey; let isCorrect = false; if (key === "backspace" || key === "enter" || key === "shift") return; if (key.length === 1) { key = shifting ? key.toUpperCase() : key; + errorKey = key; } else if (key === "space") { key = " "; errorKey = "_"; diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index f7d1c5c..9451e44 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -38,7 +38,12 @@ k.scene("selection", () => { const buttonGap = 50; settings.mute = getMute(); k.setVolume(settings.mute ? 0 : 0.5); - + k.add([ + k.sprite("bg2"), + k.pos(k.width() / 2, k.height() / 2), + k.anchor("center"), + k.z(18), + ]); if (isMobile()) { k.add([ k.text("WPM is a desktop-only experience", { size: 18 }), @@ -57,12 +62,6 @@ k.scene("selection", () => { return; } isMobile(); - k.add([ - k.sprite("bg2"), - k.pos(k.width() / 2, k.height() / 2), - k.anchor("center"), - k.z(18), - ]); k.add([ k.pos(boxCenterX, k.height() * 0.50), k.anchor("center"), diff --git a/website/public/game/game.js b/website/public/game/game.js index 0519184..aa609fc 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var Yu=Object.defineProperty;var Ju=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Ju(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Qu=Object.defineProperty,o=(t,e)=>Qu(t,"name",{value:e,configurable:!0}),Zu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],I=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*I-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*I-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var $u=1103515245,eh=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=($u*this.seed+eh)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),I=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=I.m11,L=I.m12,D=I.m13,O=I.m21,j=I.m22,$=I.m23,G=I.m31,Y=I.m32,te=I.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ba(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ba,"testRectShape");function Ia(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ia,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var dt,Re=(dt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new dt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let I=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(I,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new dt(i):null,l.length?new dt(l):null]}},o(dt,"Polygon"),dt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),I=cr(v+m);return[g-I-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",rh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],nh=ti.reduce((t,e)=>t+e.size,0),oo=2048,sh=oo*4*nh,ih=oo*6,ah=` +var Yu=Object.defineProperty;var Ju=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Ju(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Qu=Object.defineProperty,o=(t,e)=>Qu(t,"name",{value:e,configurable:!0}),Zu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],I=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*I-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*I-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var $u=1103515245,eh=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=($u*this.seed+eh)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),I=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=I.m11,L=I.m12,D=I.m13,O=I.m21,j=I.m22,$=I.m23,G=I.m31,Y=I.m32,te=I.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ba(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ba,"testRectShape");function Ia(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ia,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var ft,Re=(ft=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new ft(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let I=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(I,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new ft(i):null,l.length?new ft(l):null]}},o(ft,"Polygon"),ft);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),I=cr(v+m);return[g-I-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",rh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],nh=ti.reduce((t,e)=>t+e.size,0),oo=2048,sh=oo*4*nh,ih=oo*6,ah=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -56,10 +56,10 @@ vec4 vert(vec2 pos, vec2 uv, vec4 color) { vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,lh=new Set(["id","require"]),uh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),hh=200,ch=640,dh=65536,lo=Symbol.for("kaplay.cancel"),wr,fh=(wr=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new fh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),ph=o(t=>t[0]instanceof ne,"arrayIsColor"),gh=o(t=>t[0]instanceof k,"arrayIsVec2"),mh=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),yh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,wh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function de(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(de,"overload2");var Ah=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ht=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),xh=(()=>{let t=0;return()=>t++})(),vh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},bh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),Eh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,Sh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Mh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=vh,Ph=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Mh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new Sh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Ch=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Ph(t);Yt=e,Eh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function I(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(I,"exitFullscreen");function f(x=!0){x?g(e.canvas):I()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),B=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of B)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(ce=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Ie=ce/1e3,be=Math.min(Ie-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ie,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ht(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ht(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ht(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ht(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ht(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ht(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ht(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ht(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ht(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ht(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var B;return(B=e.buttons)==null?void 0:B[x]}o(V,"getButton");function X(x,B){e.buttons[x]={...e.buttons[x],...B}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=de(x=>e.events.on("keyDown",x),(x,B)=>e.events.on("keyDown",F=>Je(x,F)&&B(F))),xe=de(x=>e.events.on("keyPress",B=>x(B)),(x,B)=>e.events.on("keyPress",F=>Je(x,F)&&B(F))),We=de(x=>e.events.on("keyPressRepeat",x),(x,B)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&B(F))),mt=de(x=>e.events.on("keyRelease",x),(x,B)=>e.events.on("keyRelease",F=>Je(x,F)&&B(F))),yt=de(x=>e.events.on("mouseDown",B=>x(B)),(x,B)=>e.events.on("mouseDown",F=>Je(x,F)&&B(F))),ge=de(x=>e.events.on("mousePress",B=>x(B)),(x,B)=>e.events.on("mousePress",F=>Je(x,F)&&B(F))),Xe=de(x=>e.events.on("mouseRelease",B=>x(B)),(x,B)=>e.events.on("mouseRelease",F=>F===x&&B(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=de(x=>e.events.on("gamepadButtonPress",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&B(F,z))),ve=de(x=>e.events.on("gamepadButtonDown",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&B(F,z))),Ae=de(x=>e.events.on("gamepadButtonRelease",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&B(F,z)));function _e(x,B){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&B(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=de(x=>e.events.on("buttonPress",B=>x(B)),(x,B)=>e.events.on("buttonPress",F=>Je(x,F)&&B(F))),wt=de(x=>e.events.on("buttonDown",B=>x(B)),(x,B)=>e.events.on("buttonDown",F=>Je(x,F)&&B(F))),Be=de(x=>e.events.on("buttonRelease",B=>x(B)),(x,B)=>e.events.on("buttonRelease",F=>Je(x,F)&&B(F)));function lt(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(lt,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,B)=>{e.mergedGamepadState.stickState.set(B,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((B,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let B={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),B}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(B=>B.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,ce=e.gamepadStates.get(F.index);if(ce){for(let Ie=0;Ie{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),ce.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else ce.buttonState.down.has(be)&&(ut&&((B=e.buttonsByGamepad.get(be))==null||B.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),ce.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Ie in Q.sticks){let be=Q.sticks[Ie];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);ce.stickState.set(Ie,At),e.mergedGamepadState.stickState.set(Ie,At),e.events.trigger("gamepadStick",Ie,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let B=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,ce=window.innerWidth,Ie=window.innerHeight,be=ce/Ie,At=z/Q;if(be>At){let ut=Ie/Q,xt=(ce-z*ut)/2;B.x=nt(x.offsetX-xt,0,z*ut,0,z),B.y=nt(x.offsetY,0,Q*ut,0,Q)}else{let ut=ce/z,xt=(Ie-Q*ut)/2;B.x=nt(x.offsetX,0,z*ut,0,z),B.y=nt(x.offsetY-xt,0,Q*ut,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Xu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Xu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(B===void 0)throw new Error(`Unknown key: ${x.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}B.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let B=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},An.gamepaddisconnected=x=>{let B=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[x,B]of Object.entries(je))e.canvas.addEventListener(x,B);for(let[x,B]of Object.entries(cs))document.addEventListener(x,B);for(let[x,B]of Object.entries(An))window.addEventListener(x,B);let Qi=new ResizeObserver(x=>{for(let B of x)if(B.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:mt,onMouseDown:yt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:wt,onButtonRelease:Be,getLastInputDeviceType:bh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),qh=new k(-1,-1),kh=new k(0,-1),Th=new k(1,-1),Bh=new k(-1,0),Ih=new k(0,0),Rh=new k(1,0),Fh=new k(-1,1),Oh=new k(0,1),Lh=new k(1,1);function ir(t){switch(t){case"topleft":return qh;case"top":return kh;case"topright":return Th;case"left":return Bh;case"center":return Ih;case"right":return Rh;case"botleft":return Fh;case"bot":return Oh;case"botright":return Lh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Dh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Uh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function Bn(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(Bn,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=Bn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=Bn(h,c,c),i=Bn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,Vh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new jh(this._polygons.length),n=e.map((s,i)=>new zh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Br,na=(Br=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Br,"Edge"),Br),Ir,Hh=(Ir=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Gh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],I=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Wh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Kh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=yh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Xh="data:image/png;base64,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",Lr,In=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??rh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new In(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Yh=o((t="happy",e)=>fi(t,Xh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Jh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],mh(s)?r.uniform1fv(i,s):gh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):ph(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=ah.replace("{{user}}",e??bs),s=oh.replace("{{user}}",r??Es);try{return new Jh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=wh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var ft,gr=(ft=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new ft(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new ft(r))}static fromURL(e){return po(e)?ft.fromArrayBuffer(co(e)):Qo(e).then(r=>ft.fromArrayBuffer(r))}},o(ft,"SoundData"),ft);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Qh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",pt,rr=(pt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?pt.fromURL(e,r):Promise.resolve(pt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new pt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>pt.fromImage(n,r))}},o(pt,"SpriteData"),pt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Qh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,I=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/I,A=v/I,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(gt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(gt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(gt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(gt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Zh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,_h=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,$h=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Zh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new _h(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new $h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var ec=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Bs(){return Ts>0}o(Bs,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??ch,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??dh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Bl(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Bl,"platformEffector");function Il(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Il,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??hh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Bi(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),I=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var tc=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),rc=de(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=de(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),nc=de(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Is=de(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=de(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=de(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=de(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=de(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),sc=de(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Is(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var ic=de(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Bi(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Bi,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:xh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(lh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),uh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},I=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of I)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var ac=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var oc=Zu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var lc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(oc.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),I=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=I(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=I(s),u=p-f):(s.stop(),s=I(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Ii(t){return d.k.play(d.audio.burpSnd,t)}o(Ii,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Ii())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),uc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?uc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new cc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,hc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,I=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Bt,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Bt(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Bt(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=Bt(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Bt(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[I,f]=Bt(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Bt(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=Bt(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:I,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(-1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=I,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Bu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Bu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof In||typeof e=="string"){let A=e instanceof In?e.fontface.family:e,E=e instanceof In?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,I=null,f=0,w;for(;gthis.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new fh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),ph=o(t=>t[0]instanceof ne,"arrayIsColor"),gh=o(t=>t[0]instanceof k,"arrayIsVec2"),mh=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),yh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,wh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function de(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(de,"overload2");var Ah=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ct=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),xh=(()=>{let t=0;return()=>t++})(),vh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},bh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),Eh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,Sh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Mh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=vh,Ph=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Mh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new Sh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Ch=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Ph(t);Yt=e,Eh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function I(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(I,"exitFullscreen");function f(x=!0){x?g(e.canvas):I()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),B=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of B)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(ce=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Ie=ce/1e3,be=Math.min(Ie-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ie,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ct(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ct(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ct(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ct(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ct(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ct(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ct(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ct(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ct(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ct(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var B;return(B=e.buttons)==null?void 0:B[x]}o(V,"getButton");function X(x,B){e.buttons[x]={...e.buttons[x],...B}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=de(x=>e.events.on("keyDown",x),(x,B)=>e.events.on("keyDown",F=>Je(x,F)&&B(F))),xe=de(x=>e.events.on("keyPress",B=>x(B)),(x,B)=>e.events.on("keyPress",F=>Je(x,F)&&B(F))),We=de(x=>e.events.on("keyPressRepeat",x),(x,B)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&B(F))),yt=de(x=>e.events.on("keyRelease",x),(x,B)=>e.events.on("keyRelease",F=>Je(x,F)&&B(F))),wt=de(x=>e.events.on("mouseDown",B=>x(B)),(x,B)=>e.events.on("mouseDown",F=>Je(x,F)&&B(F))),ge=de(x=>e.events.on("mousePress",B=>x(B)),(x,B)=>e.events.on("mousePress",F=>Je(x,F)&&B(F))),Xe=de(x=>e.events.on("mouseRelease",B=>x(B)),(x,B)=>e.events.on("mouseRelease",F=>F===x&&B(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=de(x=>e.events.on("gamepadButtonPress",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&B(F,z))),ve=de(x=>e.events.on("gamepadButtonDown",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&B(F,z))),Ae=de(x=>e.events.on("gamepadButtonRelease",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&B(F,z)));function _e(x,B){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&B(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=de(x=>e.events.on("buttonPress",B=>x(B)),(x,B)=>e.events.on("buttonPress",F=>Je(x,F)&&B(F))),lt=de(x=>e.events.on("buttonDown",B=>x(B)),(x,B)=>e.events.on("buttonDown",F=>Je(x,F)&&B(F))),Be=de(x=>e.events.on("buttonRelease",B=>x(B)),(x,B)=>e.events.on("buttonRelease",F=>Je(x,F)&&B(F)));function ut(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(ut,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,B)=>{e.mergedGamepadState.stickState.set(B,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((B,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let B={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),B}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(B=>B.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,ce=e.gamepadStates.get(F.index);if(ce){for(let Ie=0;Ie{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),ce.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else ce.buttonState.down.has(be)&&(ht&&((B=e.buttonsByGamepad.get(be))==null||B.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),ce.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Ie in Q.sticks){let be=Q.sticks[Ie];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);ce.stickState.set(Ie,At),e.mergedGamepadState.stickState.set(Ie,At),e.events.trigger("gamepadStick",Ie,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let B=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,ce=window.innerWidth,Ie=window.innerHeight,be=ce/Ie,At=z/Q;if(be>At){let ht=Ie/Q,xt=(ce-z*ht)/2;B.x=nt(x.offsetX-xt,0,z*ht,0,z),B.y=nt(x.offsetY,0,Q*ht,0,Q)}else{let ht=ce/z,xt=(Ie-Q*ht)/2;B.x=nt(x.offsetX,0,z*ht,0,z),B.y=nt(x.offsetY-xt,0,Q*ht,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Xu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Xu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(B===void 0)throw new Error(`Unknown key: ${x.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}B.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let B=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},An.gamepaddisconnected=x=>{let B=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[x,B]of Object.entries(je))e.canvas.addEventListener(x,B);for(let[x,B]of Object.entries(cs))document.addEventListener(x,B);for(let[x,B]of Object.entries(An))window.addEventListener(x,B);let Qi=new ResizeObserver(x=>{for(let B of x)if(B.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:yt,onMouseDown:wt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:lt,onButtonRelease:Be,getLastInputDeviceType:bh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),qh=new k(-1,-1),kh=new k(0,-1),Th=new k(1,-1),Bh=new k(-1,0),Ih=new k(0,0),Rh=new k(1,0),Fh=new k(-1,1),Oh=new k(0,1),Lh=new k(1,1);function ir(t){switch(t){case"topleft":return qh;case"top":return kh;case"topright":return Th;case"left":return Bh;case"center":return Ih;case"right":return Rh;case"botleft":return Fh;case"bot":return Oh;case"botright":return Lh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Dh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Uh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function Bn(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(Bn,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=Bn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=Bn(h,c,c),i=Bn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,Vh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new jh(this._polygons.length),n=e.map((s,i)=>new zh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Br,na=(Br=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Br,"Edge"),Br),Ir,Hh=(Ir=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Gh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],I=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Wh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Kh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=yh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Xh="data:image/png;base64,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",Lr,In=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??rh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new In(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Yh=o((t="happy",e)=>fi(t,Xh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Jh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],mh(s)?r.uniform1fv(i,s):gh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):ph(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=ah.replace("{{user}}",e??bs),s=oh.replace("{{user}}",r??Es);try{return new Jh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=wh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var pt,gr=(pt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new pt(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new pt(r))}static fromURL(e){return po(e)?pt.fromArrayBuffer(co(e)):Qo(e).then(r=>pt.fromArrayBuffer(r))}},o(pt,"SoundData"),pt);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Qh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",gt,rr=(gt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?gt.fromURL(e,r):Promise.resolve(gt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new gt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>gt.fromImage(n,r))}},o(gt,"SpriteData"),gt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Qh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,I=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/I,A=v/I,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(mt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(mt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(mt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(mt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Zh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,_h=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,$h=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Zh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new _h(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new $h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var ec=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Bs(){return Ts>0}o(Bs,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??ch,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??dh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Bl(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Bl,"platformEffector");function Il(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Il,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??hh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Bi(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),I=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var tc=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),rc=de(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=de(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),nc=de(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Is=de(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=de(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=de(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=de(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=de(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),sc=de(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Is(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var ic=de(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Bi(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Bi,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:xh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(lh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),uh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},I=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of I)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var ac=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var oc=Zu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var lc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(oc.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),I=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=I(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=I(s),u=p-f):(s.stop(),s=I(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Ii(t){return d.k.play(d.audio.burpSnd,t)}o(Ii,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Ii())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),uc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?uc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new cc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,hc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,I=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Bt,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Bt(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Bt(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=Bt(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Bt(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[I,f]=Bt(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Bt(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=Bt(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:I,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(-1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=I,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Bu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Bu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof In||typeof e=="string"){let A=e instanceof In?e.fontface.family:e,E=e instanceof In?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,I=null,f=0,w;for(;gt.width&&(m+=i+c,I!=null&&(g-=v.length-I,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,I-1),u=f),I=null,f=0,y.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new we(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new k(u,m),opacity:t.opacity??1,color:t.color??ne.WHITE,scale:C(l),angle:0}),A===" "&&(I=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}y.push({width:u-h,chars:v}),m+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Vt,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n).add(1,1).scale(new k(e,r).scale(-.5)),s=[new k(0,0),new k(e,0),new k(e,r),new k(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new k(l[0],0),...l[1]?fr(new k(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?fr(new k(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?fr(new k(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?fr(new k(l[0],l[0]),l[0],l[0],180,270):[]]}Pt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function St(t){Ge();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ge(),d.gfx.width=e,d.gfx.height=r}o(St,"drawUnscaled");function Os(t,e){St(()=>{let r=C(8);He(),Qe(t);let n=jt({text:e,font:On,size:16,pos:r,color:ue(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=Ce()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Ue()})}o(Os,"drawInspectText");function Vi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Pt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Vi,"drawTriangle");function Iu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Os(vu(ls()),e.join(` `))}Os(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&St(()=>{He(),et(Me(),0),et(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&St(()=>{He(),et(Me(),Ce()),et(-8,-8);let t=8,e=jt({text:d.debug.timeScale.toFixed(1),font:On,size:16,color:ue(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Vi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Vt(e),Ue()}),d.debug.curRecording&&St(()=>{He(),et(0,Ce()),et(24,-24),ar({radius:12,color:ue(255,0,0),opacity:zs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&St(()=>{He(),et(0,Ce()),et(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Gn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=jt({text:e.join(` -`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Iu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,I=m-v,f=(y+g?1:0)*(v+I?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new hc(e,ti,sh,ih),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),fc="data:image/png;base64,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",pc="data:image/png;base64,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",gc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,mc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ch({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=dc(t,v);d.gfx=g;let I=lc();d.audio=I;let f=Wh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ac();d.game=w,w.root.use(Nn()),ua("collision",yt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?I.ctx.suspend():I.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=I.ctx.createMediaStreamDestination();I.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,pc),X=mr(null,fc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new Hh,We=!1;function mt(){if(Bs()){if(!We){We=!0,Is(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(mt,"broadPhase");function yt(){if(Bs())return mt()}o(yt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),I.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Iu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:gc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Bi,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Il,platformEffector:Bl,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:ec,trigger:tc,on:ze,onFixedUpdate:rc,onUpdate:zl,onDraw:nc,onAdd:Is,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:sc,onClick:ic,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Ii,audioCtx:I.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:th,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:_u,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:Vh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Bu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),yc=mc;function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const wc=Uu()?640:1920,Ac=Uu()?480:1080,a=yc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:wc,height:Ac,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const xc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { +`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Iu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,I=m-v,f=(y+g?1:0)*(v+I?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new hc(e,ti,sh,ih),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),fc="data:image/png;base64,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",pc="data:image/png;base64,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",gc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,mc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ch({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=dc(t,v);d.gfx=g;let I=lc();d.audio=I;let f=Wh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ac();d.game=w,w.root.use(Nn()),ua("collision",wt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?I.ctx.suspend():I.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=I.ctx.createMediaStreamDestination();I.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,pc),X=mr(null,fc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new Hh,We=!1;function yt(){if(Bs()){if(!We){We=!0,Is(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(yt,"broadPhase");function wt(){if(Bs())return yt()}o(wt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),I.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Iu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:gc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Bi,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Il,platformEffector:Bl,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:ec,trigger:tc,on:ze,onFixedUpdate:rc,onUpdate:zl,onDraw:nc,onAdd:Is,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:sc,onClick:ic,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Ii,audioCtx:I.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:th,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:_u,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:Vh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Bu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),yc=mc;function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const wc=Uu()?640:1920,Ac=Uu()?480:1080,a=yc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:wc,height:Ac,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const xc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { `,` let map = {}; `,` `,` for (let i = 0; i < nums.length; i++) { @@ -298,14 +298,14 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return isMirror(root.left, root.right); `,`}; -`]}],ca=.35,vc=.18,bc=60,Ds=5,Ec=1,Sc=28,Xt=xc,Mc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},Pc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Nu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],he=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Cc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function qc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),qc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),he(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),he(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),he(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),I=a.add([a.anchor("left"),a.text("Github",{size:e}),he(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),he(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),he(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var yt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,mt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,mt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,kc=a.Color.RED,It=0,ws=18,Tc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It,Ku="",Ns=[],Cn="",Tt="",$e="";const Bc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},I=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return kc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It}function q(){Sn=!1,It=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([he(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),he(()=>a.vec2(a.width()*.02,a.height()*(Mc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),he(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Cc(Y),he(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,Sc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:I(U,H)})}),a.pos(0,0),he(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Tc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),he(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),he(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);mt(xe),mt(We);function mt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function yt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&It++,c+=.05,Ye(),It===Ds){It=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=vc,_=4;if(It>0){const lt=Math.min(It,_)/_;s=U*Math.pow(H/U,lt)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jlt.name===me)||ms[0];const wt=se.blocks;i.lineCount=wt.length,Cn=wt.join("");const Be=w(Cn);Tt=Be,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Be,V.text=Tt,v.line=$e.split(` +`]}],ca=.35,vc=.18,bc=60,Ds=5,Ec=1,Sc=28,Xt=xc,Mc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},Pc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Nu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],he=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Cc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function qc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),qc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),he(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),he(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),he(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),I=a.add([a.anchor("left"),a.text("Github",{size:e}),he(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),he(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),he(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var wt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,yt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,yt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,kc=a.Color.RED,It=0,ws=18,Tc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It,Ku="",Ns=[],Cn="",Tt="",$e="";const Bc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},I=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return kc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It}function q(){Sn=!1,It=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([he(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),he(()=>a.vec2(a.width()*.02,a.height()*(Mc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),he(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Cc(Y),he(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,Sc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:I(U,H)})}),a.pos(0,0),he(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Tc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),he(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),he(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);yt(xe),yt(We);function yt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function wt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&It++,c+=.05,Ye(),It===Ds){It=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=vc,_=4;if(It>0){const ut=Math.min(It,_)/_;s=U*Math.pow(H/U,ut)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jut.name===me)||ms[0];const lt=se.blocks;i.lineCount=lt.length,Cn=lt.join("");const Be=w(Cn);Tt=Be,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Be,V.text=Tt,v.line=$e.split(` `)[0],g.line=v.line,Ku=se.title,xe.updatePos(),We.updatePos()}function Ye(){l.speed=c}function qe(){Tt=$e.split("").map((U,H)=>bt.includes(H)?U===` `?`${En[H]} `:En[H]:U).join(""),Tt=w(Tt),V.text=Tt}function Se(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos++,H.curCharInLine++,H.cursorPointer.pos=Te(U),ge($e))}function Kt(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos--,H.curCharInLine--,H.cursorPointer.pos=Te(U),ge($e))}function ot(){a.shake(2),ye.mute||a.play("wrong_typing")}function N(U=!1){var me;const H=U?g:v;if(!H.cursorPointer)return;H.curLineCount++,v.curLineCount>=gs*(e+1)&&e++,U||Pn++;const _=$e.split(` `)[H.curLineCount];if(!_)return;const se=((me=_.match(/^\s+/))==null?void 0:me[0].length)||0;H.line=_,H.cursorPos+=se,H.curIdentSize=se,H.curCharInLine=se,V.updatePos(),H.cursorPointer.pos=Te(U),xe.updatePos(),We.updatePos()}function K(){$e[g.cursorPos]===` `?(Se(!0),N(!0)):Se(!0)}function J(U){for(let H=U.length-1;H>0;H--){const _=Math.floor(Math.random()*(H+1));[U[H],U[_]]=[U[_],U[H]]}return U}function ae(){A.text=kt.toFixed(1),kt>0&&Wt>5&&(_r=Wt&&kt>1?Wt/5/(kt/60):0,Rn=Pn&&kt>1?Pn/(kt/60):0,dr=Mn>0?Wt/Mn*100:100,isNaN(dr)&&(dr=100),P.text=Math.round(_r||0).toString())}const ve=60;let Ae=new Array(ve).fill(0),_e=Math.floor(a.time());function wn(){let U=Math.floor(a.time());if(U!==_e){for(let _=_e+1;_<=U;_++){let se=_%ve;Ae[se]=0}_e=U}let H=U%ve;Ae[H]++}a.onKeyPress(U=>{if($e[v.cursorPos],(v.cursorPos>0?$e[v.cursorPos]:"")===` -`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,wt=me,Be=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me;else if(me==="space")me=" ",wt="_";else return;if(Mn++,Be=me===_,Be)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ec)return ot();bt.push(v.cursorPos),En[v.cursorPos]=wt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` -`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Bc);a.scene("endgame",()=>{let t=18,e=Gu,r=Ku,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Hu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Pc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),I=a.width()*.1,f=a.height()*.2,w=(R,L)=>he(()=>g().add(a.vec2(R,L))),S=-I-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-I,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+I,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("last challenge",{size:t}),w(+I,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+I,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),he(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. +`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,lt,Be=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me,lt=me;else if(me==="space")me=" ",lt="_";else return;if(Mn++,Be=me===_,Be)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ec)return ot();bt.push(v.cursorPos),En[v.cursorPos]=lt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` +`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Bc);a.scene("endgame",()=>{let t=18,e=Gu,r=Ku,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Hu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Pc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),I=a.width()*.1,f=a.height()*.2,w=(R,L)=>he(()=>g().add(a.vec2(R,L))),S=-I-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-I,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+I,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+I,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+I,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),he(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. @@ -349,4 +349,4 @@ To beat this game you will need to master touch-typing, and fix hand positioning z-index: -1; } `;document.head.appendChild(Wu);a.go("selection"); -//# sourceMappingURL=index-B2iEUwsK.js.map +//# sourceMappingURL=index-DWNHszku.js.map From 52bf26c456f4749b0b2db60392a5c470de18bbc1 Mon Sep 17 00:00:00 2001 From: Gabriel Benmergui Date: Wed, 7 May 2025 06:08:10 -0700 Subject: [PATCH 11/22] adding subdomain support --- game/src/systems/saves.js | 1 + 1 file changed, 1 insertion(+) diff --git a/game/src/systems/saves.js b/game/src/systems/saves.js index c209a20..89173bc 100644 --- a/game/src/systems/saves.js +++ b/game/src/systems/saves.js @@ -30,6 +30,7 @@ export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames }) => { `playerData=${encoded}; ` + `path=/; ` + `max-age=${maxAge}; ` + + `domain=.silver.dev; ` + `SameSite=Lax`; }; From cc0973fa3f63e72f2a72bd31d10bc42e7145e003 Mon Sep 17 00:00:00 2001 From: Gabriel Benmergui Date: Thu, 8 May 2025 14:23:08 -0300 Subject: [PATCH 12/22] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9e15bd9 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +## Contributing to WPM From 31d458bae981f5493d5c8459fb2e243785cd7edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pujia?= Date: Tue, 6 May 2025 18:34:54 -0300 Subject: [PATCH 13/22] fix cookie domain --- game/src/systems/saves.js | 1 + 1 file changed, 1 insertion(+) diff --git a/game/src/systems/saves.js b/game/src/systems/saves.js index 89173bc..b3ed192 100644 --- a/game/src/systems/saves.js +++ b/game/src/systems/saves.js @@ -28,6 +28,7 @@ export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames }) => { document.cookie = `playerData=${encoded}; ` + + `domain=silver.dev; ` + `path=/; ` + `max-age=${maxAge}; ` + `domain=.silver.dev; ` + From 567b7cb7cdf8f690992045e02b332c45e0316312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pujia?= Date: Tue, 6 May 2025 18:44:58 -0300 Subject: [PATCH 14/22] add best level to cookie --- game/src/scenes/endGame.js | 1 + game/src/systems/saves.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/game/src/scenes/endGame.js b/game/src/scenes/endGame.js index 9a087da..6d2f6a9 100644 --- a/game/src/scenes/endGame.js +++ b/game/src/scenes/endGame.js @@ -31,6 +31,7 @@ k.scene("endgame", () => { }; savePlay({ wpm: wpm, + bestLvl: record_blocks, bestWpm: best_wpm, lpm: lpm, acc: acc, diff --git a/game/src/systems/saves.js b/game/src/systems/saves.js index b3ed192..d50487f 100644 --- a/game/src/systems/saves.js +++ b/game/src/systems/saves.js @@ -11,14 +11,15 @@ */ /** - * @param {{ wpm: number, lpm: number, acc: number, bestWpm: number, blockNames: string }} stats + * @param {{ wpm: number, lpm: number, acc: number, bestWpm: number, blockNames: string, bestLvl: number }} stats */ -export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames }) => { +export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames, bestLvl }) => { const previousSave = getPlay(); const payload = { wpm, lpm, acc, + bestLvl, bestWpm: Math.max(bestWpm, previousSave?.bestWpm || 0), blockNames, loadDate: new Date().toISOString(), From 8001e430136d92fc9b6c24a2f4e1e4dd8f46c29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pujia?= Date: Mon, 12 May 2025 16:11:15 -0300 Subject: [PATCH 15/22] remove incorrect domain in cookie see https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#write_a_new_cookie --- game/src/systems/saves.js | 1 - 1 file changed, 1 deletion(-) diff --git a/game/src/systems/saves.js b/game/src/systems/saves.js index d50487f..4cc75ae 100644 --- a/game/src/systems/saves.js +++ b/game/src/systems/saves.js @@ -32,7 +32,6 @@ export const savePlay = ({ wpm, lpm, acc, bestWpm, blockNames, bestLvl }) => { `domain=silver.dev; ` + `path=/; ` + `max-age=${maxAge}; ` + - `domain=.silver.dev; ` + `SameSite=Lax`; }; From e9fd20fcd9993d7c30ca6392004057383c4f5684 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Wed, 14 May 2025 16:28:59 -0300 Subject: [PATCH 16/22] Update game Add game mode Add analitycs reference Add readme revision Remove old files --- README.md | 14 ++ game/index.html | 2 +- game/src/constants.js | 2 +- .../data/{dialogs.json => CodeBlocks.json} | 0 game/src/data/dialog.json | 96 -------- game/src/kaplay.js | 69 +++++- game/src/scenes/game.js | 153 ++++++------ game/src/scenes/selectionScene.js | 224 +++++++++++++----- website/public/game/game.js | 38 +-- 9 files changed, 350 insertions(+), 248 deletions(-) rename game/src/data/{dialogs.json => CodeBlocks.json} (100%) delete mode 100644 game/src/data/dialog.json diff --git a/README.md b/README.md index 9e15bd9..81c4d18 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ ## Contributing to WPM +add new challenges +locate code blocks in data folder and add the block with the following format example considering spaces and line breaks \n + +"id": 1, +"title": "Hello World", +"language": "js", +"blocks": [ + "console.log(\"Hello, World!\");\n" +] + +update build +open command console in game folder and type npm run build +this will be located in the dist\assets inside game folder. +rename to game and replace the existing version inside website\public\game diff --git a/game/index.html b/game/index.html index 0f6a54a..f99de2c 100644 --- a/game/index.html +++ b/game/index.html @@ -1,7 +1,7 @@ - mygame + WPM diff --git a/game/src/constants.js b/game/src/constants.js index 2b13dc0..f8bbb98 100644 --- a/game/src/constants.js +++ b/game/src/constants.js @@ -1,6 +1,6 @@ // @ts-check -import dialogs from "./data/dialogs.json"; +import dialogs from "./data/CodeBlocks.json"; export const EASY_RIVAL_SPEED = 0.35; export const HARD_RIVAL_SPEED = 0.18; export const MAX_TIME = 60; diff --git a/game/src/data/dialogs.json b/game/src/data/CodeBlocks.json similarity index 100% rename from game/src/data/dialogs.json rename to game/src/data/CodeBlocks.json diff --git a/game/src/data/dialog.json b/game/src/data/dialog.json deleted file mode 100644 index 9a5e7b5..0000000 --- a/game/src/data/dialog.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "blocks": [ - [ - "function isUnique(str) {\n", - "▯▯▯▯let charSet = new Set()[i];\n", - "▯▯▯▯\n", - "▯▯▯▯for (let i = 0; i < str.length; i++) {\n", - "▯▯▯▯▯▯▯▯if (charSet.has(str[i])) {\n", - "▯▯▯▯▯▯▯▯▯▯▯▯return false;\n", - "▯▯▯▯▯▯▯▯}\n", - "▯▯▯▯▯▯▯▯charSet.add(str[i]);\n", - "▯▯▯▯}\n", - "▯▯▯▯return true;\n", - "}\n" - ], - [ - "function rotateMatrix(matrix) {\n", - "▯▯▯▯const n = matrix.length;\n", - "\n", - "▯▯▯▯for (let layer = 0; layer < Math.floor(n / 2); layer++) {\n", - "▯▯▯▯▯▯▯▯let first = layer;\n", - "▯▯▯▯▯▯▯▯let last = n - 1 - layer;\n", - "\n", - "▯▯▯▯▯▯▯▯for (let i = first; i < last; i++) {\n", - "▯▯▯▯▯▯▯▯▯▯▯▯let offset = i - first;\n", - "▯▯▯▯▯▯▯▯▯▯▯▯let top = matrix[first][i];\n", - "\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[first][i] = matrix[last - offset][first];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[last - offset][first] = matrix[last][last - offset];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[last][last - offset] = matrix[i][last];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[i][last] = top;\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[first][i] = matrix[last - offset][first];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[last - offset][first] = matrix[last][last - offset];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[last][last - offset] = matrix[i][last];\n", - "▯▯▯▯▯▯▯▯▯▯▯▯matrix[i][last] = top;\n", - "▯▯▯▯▯▯▯▯}\n", - "▯▯▯▯}\n", - "▯▯▯▯}\n", - "}\n" - ], - [ - "class Node {\n", - " constructor(data) {\n", - " this.data = data;\n", - " this.next = null;\n", - " }\n", - "}\n", - "\n", - "class LinkedList {\n", - " constructor() {\n", - " }\n", - "\n", - " append(data) {\n", - " if (this.head === null) {\n", - " this.head = new Node(data);\n", - " return;\n", - " append(data) {\n", - " if (this.head === null) {\n", - " this.head = new Node(data);\n", - " return;\n", - " }\n", - " let current = this.head;\n", - " while (current.next !== null) {\n", - " current = current.next;\n", - " }\n", - " current.next = new Node(data);\n", - " }\n", - "}\n" - ], - [ - "import React, { useState } from 'react';{\n", - "\n", - "const SignupForm = () => {\n", - " const [formData, setFormData] = useState({\n", - " email: '',\n", - " password: ''\n", - " });\n", - "\n", - " const [submitted, setSubmitted] = useState(false);\n", - "\n", - " const handleChange = (e) => {\n", - " setFormData({\n", - " ...formData,\n", - " [e.target.name]: e.target.value\n", - " });\n", - " };\n", - "\n", - " const handleSubmit = (e) => {\n", - " e.preventDefault();\n", - " setSubmitted(true);\n", - " };\n", - "\n", - " return (\n" - ] - ] -} diff --git a/game/src/kaplay.js b/game/src/kaplay.js index c7b727b..9ac4d4d 100644 --- a/game/src/kaplay.js +++ b/game/src/kaplay.js @@ -1,10 +1,59 @@ -// @ts-check +// kaplay.js -import kaplay from "kaplay"; +import kaplay from 'kaplay'; +export const MEASUREMENT_ID = 'G-6CCP4C6VS7'; + +/** + * @param {string} measurementId + * @param {Function} [callback] + */ +export function loadGtag(measurementId, callback) { + if (window.gtag) { + callback && callback(); + return; + } + + const script = document.createElement('script'); + script.async = true; + script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`; + script.onload = () => { + window.dataLayer = window.dataLayer || []; + window.gtag = function() { window.dataLayer.push(arguments); }; + window.gtag('js', new Date()); + window.gtag('config', measurementId, { + }) + callback && callback(); + }; + document.head.appendChild(script); +} + +export function onGameStart() { + if (window.gtag) { + window.gtag('event', 'game_start', { event_category: 'game' }); + } +} + +export function onBlockReached(blockIndex, blockName) { + if (window.gtag) { + window.gtag('event', 'block_reached', { + event_category: 'game', + block_index: blockIndex, + block_name: blockName, + }); + } +} + +export function onWpm(wpmValue) { + if (window.gtag) { + window.gtag('event', 'wpm', { + event_category: 'game', + value: wpmValue, + }); + } +} function isMobile() { - return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i - .test(navigator.userAgent); + return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } const width = isMobile() ? 640 : 1920; @@ -13,7 +62,7 @@ const height = isMobile() ? 480 : 1080; export const k = kaplay({ loadingScreen: false, background: [0, 0, 0, 0], - font: "jetbrains", + font: 'jetbrains', maxFPS: 120, backgroundAudio: false, width, @@ -21,13 +70,15 @@ export const k = kaplay({ letterbox: true, pixelDensity: 1, crisp: false, - texFilter: "linear", + texFilter: 'linear', }); -k.onLoading((progress) => {}); +k.onLoading((progress) => { +}); -window.addEventListener("keydown", (e) => { - if (e.key === "/" || e.key === "?") { +// Avoid the default behavior of '/' and '?' in browser +window.addEventListener('keydown', (e) => { + if (e.key === '/' || e.key === '?') { e.preventDefault(); } }); \ No newline at end of file diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index ed02dd9..bf91863 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -16,12 +16,11 @@ import { ICON_START_Y } from "../constants.js"; import { savePlay, getPlay } from "../systems/saves.js"; -import { k } from "../kaplay.js"; +import { k, loadGtag, onBlockReached, onGameStart, MEASUREMENT_ID } from "../kaplay.js"; import { themes } from "../data/themes.js"; import { resizablePos } from "../components/resizablePos.js"; import { resizableRect } from "../components/resizableRect.js"; import { settings } from "./selectionScene.js"; - let titles = dialogsData.map((item) => item.title); let COLOR_TEXT_DEFAULT = k.Color.fromHex("#6a717d"); @@ -70,9 +69,13 @@ let fixedText = ""; const gameScene = (params) => { + loadGtag(MEASUREMENT_ID, () => { + onGameStart(); + }); + k.loadMusic("endgame", "/sounds/endgame.mp3"); k.loadSprite("arrow_yellow", "/sprites/arrow_yellow.png"); - + let jumpCount = 0; let theme = themes[0]; let currentBlockIndex = -1; @@ -167,48 +170,48 @@ const gameScene = (params) => { * @param {number} i */ const matchColorToken = (i, ch) => { - const T = theme.tokens; - const A = theme.associations; + const { tokens: T, associations: A } = theme; + const { cursorPos: pPos } = playerState; + const { cursorPos: rPos } = rivalState; - if (errorCharsIndexes.includes(i)) { - return COLOR_TEXT_INCORRECT; - } - if (i === rivalState.cursorPos) { + if (errorCharsIndexes.includes(i)) return COLOR_TEXT_INCORRECT; + if (!settings.practiceMode && (i === rPos || (i > pPos - 1 && i < rPos + 1))) return COLOR_TEXT_RIVAL; + if (ch === " " || i > pPos - 1) return COLOR_TEXT_DEFAULT; + + const singleCharRules = [ + { test: () => A.brackets.test(ch), color: T.brackets }, + { test: () => A.operators.test(ch), color: T.operators }, + { test: () => A.punctuation.test(ch), color: T.punctuation }, + { test: () => ch === '"' || ch === "'", color: T.strings }, + ]; + for (const { test, color } of singleCharRules) { + if (test()) return k.Color.fromHex(color); } - if (ch === " ") { - return COLOR_TEXT_DEFAULT; - } - if (i > playerState.cursorPos - 1) { - return i < rivalState.cursorPos + 1 - ? COLOR_TEXT_RIVAL - : COLOR_TEXT_DEFAULT; - } - if (ch.match(A.brackets)) return k.Color.fromHex(T.brackets); - if (ch.match(A.operators)) return k.Color.fromHex(T.operators); - if (ch.match(A.punctuation)) return k.Color.fromHex(T.punctuation); - if (ch === '"' || ch === "'") return k.Color.fromHex(T.strings); const tokenPattern = /[\w$]+|[^\s\w]/g; - const matches = Array.from(originalText.matchAll(tokenPattern)); let token = ""; - for (const m of matches) { + for (const m of originalText.matchAll(tokenPattern)) { + const [text] = m; const start = m.index; - const end = start + m[0].length; + const end = start + text.length; if (i >= start && i < end) { - token = m[0]; + token = text; break; } } - if (A.tags.test(token)) return k.Color.fromHex(T.tags); - if (A.numbers.test(token)) return k.Color.fromHex(T.numbers); - if (A.classes.test(token)) return k.Color.fromHex(T.classes); - if (A.functions.test(token)) return k.Color.fromHex(T.functions); - if (A.keywords.test(token)) return k.Color.fromHex(T.keywords); - if (A.strings.test(token)) return k.Color.fromHex(T.strings); - if (/^[A-Za-z_$][\w$]*$/.test(token)) { - return k.Color.fromHex(T.variables); + const tokenRules = [ + { test: t => A.tags.test(t), color: T.tags }, + { test: t => A.numbers.test(t), color: T.numbers }, + { test: t => A.classes.test(t), color: T.classes }, + { test: t => A.functions.test(t), color: T.functions }, + { test: t => A.keywords.test(t), color: T.keywords }, + { test: t => A.strings.test(t), color: T.strings }, + { test: t => /^[A-Za-z_$][\w$]*$/.test(t), color: T.variables }, + ]; + for (const { test, color } of tokenRules) { + if (test(token)) return k.Color.fromHex(color); } return k.Color.fromHex(T.text); }; @@ -217,26 +220,38 @@ const gameScene = (params) => { k.onUpdate(() => { analitycs_calculate(); - if (playerStartedTyping) { - startTime += k.dt(); + if (!playerStartedTyping) { + updateAWPM(); + return; + } + + startTime += k.dt(); + if (!settings.practiceMode) { rivalTimer += k.dt(); - if (rivalTimer >= rivalSpeed) { - rivalTimer -= rivalSpeed; - if (rivalState.curLineCount < curBlockData.lineCount - 1) { - rivalWrite(); - } else { - music.stop(); - StatsforAnalitics(); - resetGameStats(); - k.go("endgame"); - } + if (rivalTimer < rivalSpeed) { + updateAWPM(); + return; + } + rivalTimer %= rivalSpeed; + if (rivalState.curLineCount < curBlockData.lineCount - 1) { + rivalWrite(); + } else { + music.stop(); + StatsforAnalitics(); + resetGameStats(); + onBlockReached(completedBlocks, lastChallenge); + k.go("endgame"); + return; } } - const totalEventsLast60 = eventBuffer.reduce((sum, count) => sum + count, 0); - const awpm = totalEventsLast60 / 5; - actual_awpm = awpm; + updateAWPM(); }); - + + function updateAWPM() { + const totalEventsLast60 = eventBuffer.reduce((sum, count) => sum + count, 0); + actual_awpm = totalEventsLast60 / 5; + } + function escapeForRender(str) { return str @@ -257,7 +272,7 @@ const gameScene = (params) => { } function resetGameStats() { - playerStartedTyping =false; + playerStartedTyping = false; completedBlocks = 0; startTime = 0; actual_wpm = 0; @@ -285,7 +300,7 @@ const gameScene = (params) => { const filesFoldersPos = () => k.vec2(0, 0); const wmp_text = k.add([ k.anchor("left"), - k.pos(k.width() * 0.25+90, k.height() * 0.025), + k.pos(k.width() * 0.25 + 90, k.height() * 0.025), k.text("0", { size: 18, }), @@ -294,13 +309,12 @@ const gameScene = (params) => { ]); const time_text = k.add([ k.anchor("left"), - k.pos(k.width() * 0.35+90, k.height() * 0.025), - k.text("time: ", { - size: 18, - }), + k.pos(k.width() * 0.35 + 90, k.height() * 0.025), + k.text("time: ", { size: 18 }), k.color(k.YELLOW), k.z(22), - ]); + k.opacity(settings.practiceMode ? 0 : 1), + ]); k.add([ k.sprite("BG_WPM_IN_GAME"), @@ -313,6 +327,7 @@ const gameScene = (params) => { k.pos(k.width() * 0.35, k.height() * 0.02 + 5), k.anchor("left"), k.z(20), + k.opacity(settings.practiceMode ? 0 : 1), ]); k.add([ resizablePos(filesFoldersPos), @@ -321,7 +336,7 @@ const gameScene = (params) => { k.opacity(1), ]); k.add([ - k.pos(k.width() * 0.01+10, k.height() * 0.01-10), + k.pos(k.width() * 0.01 + 10, k.height() * 0.01 - 10), k.sprite("SilverDevs"), k.anchor("topleft"), k.opacity(1), @@ -351,14 +366,14 @@ const gameScene = (params) => { ]); const button_muteON = k.add([ k.sprite("muteON"), - k.pos(k.width() * 0.9, k.height() * 0+5), + k.pos(k.width() * 0.9, k.height() * 0 + 5), k.opacity(1), k.animate(), k.z(50), ]); const button_muteOFF = k.add([ k.sprite("muteOff"), - k.pos(k.width() * 0.9, k.height() * 0+5), + k.pos(k.width() * 0.9, k.height() * 0 + 5), k.opacity(0), k.animate(), k.z(50), @@ -382,7 +397,7 @@ const gameScene = (params) => { blockNamesString = visibleTexts.map(item => item.title); visibleTexts.forEach(({ title, language }, index) => { const spriteKey = languageIconMap[language] ?? languageIconMap.default; - + k.add([ k.sprite(spriteKey), resizablePos(() => @@ -395,7 +410,7 @@ const gameScene = (params) => { k.z(55), "challengeIcon", ]); - + k.add([ k.text(title, { size: 20 }), resizablePos(() => @@ -535,13 +550,16 @@ const gameScene = (params) => { const rivalPointer = k.add([ k.text("_", { size: 16 }), resizablePos(() => cursorPos(true)), - k.opacity(1), + k.opacity(settings.practiceMode ? 0 : 1), k.anchor("left"), k.color(COLOR_TEXT_RIVAL), - ]); + ]); makeBlink(cursorPointer); - makeBlink(rivalPointer); + + if (!settings.practiceMode) { + makeBlink(rivalPointer); + } function makeBlink(entity) { k.loop(0.5, () => { @@ -579,8 +597,7 @@ const gameScene = (params) => { }; function updateDialog() { currentBlockIndex++; - if(currentBlockIndex>0) - { + if (currentBlockIndex > 0) { completedBlocks++; } musicRate += 0.05; @@ -618,7 +635,6 @@ const gameScene = (params) => { textboxText.updatePos(); const currentDialog = getCurrentDialog(); - const lang = currentDialog.language ?? "default"; theme = themes.find(t => t.name === lang) || themes[0]; const currentBlocks = currentDialog.blocks; @@ -629,14 +645,12 @@ const gameScene = (params) => { renderedText = fixedGroup; textboxText.text = renderedText; - fixedText = originalText.replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; playerState.line = fixedText.split("\n")[0]; rivalState.line = playerState.line; - lastChallenge = currentDialog.title; cursorPointer.updatePos(); rivalPointer.updatePos(); @@ -805,6 +819,7 @@ const gameScene = (params) => { errorCharsReplaces[playerState.cursorPos] = errorKey; updateDialogErrors(); nextChar(); + k.shake(2); if (!settings.mute) k.play("wrong_typing"); totalIcorrectCorrectChars++; } diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index 9451e44..774b46c 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -1,9 +1,10 @@ -import { k } from "../kaplay.js"; import { getMute, saveMute } from "../systems/preferences.js"; import { resizablePos } from "../components/resizablePos.js"; - +import { k } from "../kaplay.js"; export const settings = { mute: false, + practiceMode: false, + rivalSpeed: 0, }; function isMobile() { return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i @@ -12,6 +13,7 @@ function isMobile() { function escapeBackslashes(str) { return str.replace(/\\/g, "\\\\"); } + k.scene("selection", () => { k.loadSprite("icon_05", "/sprites/icon_04.png"); k.loadSprite("icon_04", "/sprites/icon_04.png"); @@ -22,8 +24,7 @@ k.scene("selection", () => { k.loadSprite("BG_TIME_IN_GAME", "/sprites/BG_TIME_IN_GAME.png"); k.loadSprite("SilverDevs", "/sprites/SilverDev_logo.png"); k.loadMusic("videogame", "/sounds/videogame.mp3"); - - const commands = ["about", "github", "start with sound", "start muted"]; + let commands = []; const fontsize = 18; const boxWidth = 800; const textY = k.height() * 0.85; @@ -35,7 +36,8 @@ k.scene("selection", () => { const buttonLeftX = k.width() * 0.35 - 40; const buttonRightX = k.width() * 0.6 - 40; const buttonTopY = boxY + 80; - const buttonGap = 50; + const buttonGap = 30; + let stage = 0; settings.mute = getMute(); k.setVolume(settings.mute ? 0 : 0.5); k.add([ @@ -85,10 +87,9 @@ k.scene("selection", () => { const outsideBox = k.add([k.rect(810, 260, { radius: 0 }), k.pos(k.width() * 0.30 - 15, boxY), k.color(k.rgb(52, 53, 54)), k.z(20), k.opacity(0.3)]); const outerBox = k.add([k.rect(790, 230, { radius: 1 }), k.pos(k.width() * 0.30 - 5, boxY + 20), k.color(0, 0, 0), k.z(20), k.opacity(1)]); - const StartText = k.add([k.anchor("left"), k.text("Start with sound", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY)), k.opacity(1), k.z(21)]); - const muteText = k.add([k.anchor("left"), k.text("Start muted", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); - const gitText = k.add([k.anchor("left"), k.text("Github", { size: fontsize }), resizablePos(() => k.vec2(buttonRightX, buttonTopY)), k.opacity(1), k.z(21)]); - const aboutText = k.add([k.anchor("left"), k.text("About", { size: fontsize }), resizablePos(() => k.vec2(buttonRightX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); + const StartText = k.add([k.anchor("left"), k.text("Start", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY)), k.opacity(1), k.z(21)]); + const gitText = k.add([k.anchor("left"), k.text("Github", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); + const aboutText = k.add([k.anchor("left"), k.text("About", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap * 2)), k.opacity(1), k.z(21)]); const button_muteON = k.add([ k.sprite("muteON"), @@ -104,6 +105,8 @@ k.scene("selection", () => { k.animate(), k.z(50), ]); + audioUpadte(); + const commandArrow = k.add([ k.text("←", { size: 22 }), resizablePos(() => k.vec2(0, 0)), @@ -113,13 +116,54 @@ k.scene("selection", () => { k.z(22), k.animate(), ]); + function updateStageCommands() { + switch (stage) { + case 0: + commands = ["about", "github", "start"]; + StartText.text = "Start"; + gitText.text = "Github"; + aboutText.text = "About"; + break; + case 1: + commands = ["yes", "no"]; + StartText.text = "Play with Audio"; + gitText.text = "Yes"; + aboutText.text = "No"; + break; + case 2: + commands = ["interview", "practice"]; + StartText.text = "Mode"; + gitText.text = "Interview"; + aboutText.text = "Practice"; + break; + } + updateTextColors(); + } function calcNewTarget(input) { - if (input === "") return "Start with sound"; + if (input === "") { + switch (stage) { + case 1: + return "Yes"; + case 2: + return "Interview"; + default: + return "Start"; + } + } + const found = commands.find(cmd => cmd.startsWith(input.toLowerCase())); - return found ? found : "Start with sound"; + if (found) return found; + + switch (stage) { + case 1: + return "Yes"; + case 2: + return "Interview"; + default: + return "Start"; + } } - function moveArrow(targetObj) { const newY = targetObj.pos.y + arrowYOffset; const newX = targetObj.pos.x + targetObj.text.length * 16; @@ -131,10 +175,10 @@ k.scene("selection", () => { }); } - let targetText = "Start with sound"; + let targetText = "Start"; let maxLength = targetText.length; const letterSpacing = 14; - const fixedStartX = k.width() / 2.58 - ((maxLength - 1) * letterSpacing) / 2; + const fixedStartX = k.width() / 2.88 - ((maxLength - 1) * letterSpacing) / 2; let letterObjects = []; let underscoreObjects = []; updateTextColors(); @@ -171,28 +215,45 @@ k.scene("selection", () => { createLetterObjects(); function updateTextColors() { - const targetLower = targetText.toLowerCase(); - - const allCommands = [ - { textObj: StartText, label: "start with sound" }, - { textObj: muteText, label: "start muted" }, - { textObj: gitText, label: "github" }, - { textObj: aboutText, label: "about" }, - ]; - - let targetObj = null; - - allCommands.forEach(({ textObj, label }) => { - const isSelected = targetLower === label.toLowerCase(); - textObj.color = isSelected ? k.rgb(3, 255, 87) : k.rgb(255, 255, 255); - if (isSelected) { - targetObj = textObj; + StartText.color = k.rgb(255, 255, 255); + gitText.color = k.rgb(255, 255, 255); + aboutText.color = k.rgb(255, 255, 255); + + const cmdLower = targetText.toLowerCase(); + let commandList; + + if (stage === 1) { + commandList = [ + { obj: gitText, label: "yes" }, + { obj: aboutText, label: "no" } + ]; + } else if (stage === 2) { + commandList = [ + { obj: gitText, label: "interview" }, + { obj: aboutText, label: "practice" } + ]; + } else { + commandList = [ + { obj: StartText, label: "start" }, + { obj: gitText, label: "github" }, + { obj: aboutText, label: "about" } + ]; + } + + let selected = null; + commandList.forEach(({ obj, label }) => { + if (cmdLower === label) { + obj.color = k.rgb(3, 255, 87); + selected = obj; } }); - - if (targetObj) { + + if (selected) { + commandArrow.opacity = 1; + moveArrow(selected); + } else if (commandList.length) { commandArrow.opacity = 1; - moveArrow(targetObj); + moveArrow(commandList[0].obj); } else { commandArrow.opacity = 0; } @@ -212,15 +273,17 @@ k.scene("selection", () => { k.z(21), ]); const slashChar = k.add([ - k.text("$-", { size: fontsize }), - k.pos(name.pos.x - 40, textY), + k.text("-", { size: fontsize }), + k.pos(name.pos.x - 30, textY), k.anchor("left"), k.color(k.rgb(3, 255, 87)), k.z(21), ]); - button_muteON.opacity = settings.mute ? 0 : 1; - button_muteOFF.opacity = settings.mute ? 1 : 0; + function audioUpadte() { + button_muteON.opacity = settings.mute ? 0 : 1; + button_muteOFF.opacity = settings.mute ? 1 : 0; + } let isPreventingError = false; let previousInput = ""; @@ -237,7 +300,6 @@ k.scene("selection", () => { } function handleInputUpdate(input) { - const candidate = calcNewTarget(input); if (!input || candidate.toLowerCase().startsWith(input.toLowerCase())) { if (candidate !== targetText) { @@ -261,7 +323,6 @@ k.scene("selection", () => { const isGrowingWithErrors = input.length > previousInput.length && localErrorCount >= maxError; const hasAdvancedPastError = localErrorCount >= 2 && input.length > lastErrorIndex + 1; - //check long and max error count if (isTooLongTotal || isGrowingWithErrors) { preventError(); rawInput = previousInput; @@ -309,37 +370,93 @@ k.scene("selection", () => { switch (input.toLowerCase()) { case "github": - window.open("https://github.com/conanbatt/wpm", "_blank"); - ResetGame(); + if (stage === 0) { + window.open("https://github.com/conanbatt/wpm", "_blank"); + ResetGame(); + } break; case "about": - k.go("about"); + if (stage === 0) { + k.go("about"); + } + break; + case "start": + if (stage === 0) { + advanceStage(); + updateStageCommands(); + const candidate = calcNewTarget(""); + if (candidate !== targetText) { + targetText = candidate; + maxLength = targetText.length; + createLetterObjects(); + } + } + break; + case "yes": + if (stage === 1) { + settings.mute = false; + saveMute(false); + k.setVolume(0.5); + audioUpadte(); + advanceStage(); + } break; - case "start with sound": - settings.mute = false; saveMute(false); - k.setVolume(0.5); - k.go("game"); + case "no": + if (stage === 1) { + settings.mute = true; + saveMute(true); + k.setVolume(0); + audioUpadte(); + advanceStage(); + } break; - case "start muted": - settings.mute = true; saveMute(true); - k.setVolume(0); - k.go("game"); + case "interview": + if (stage === 2) { + k.go("game"); + } break; + case "practice": + if (stage === 2) { + settings.practiceMode = true; + k.go("game"); + } + break; + } updateTextColors(); } - - function ResetGame() { + + function resetCommon(initialTarget) { rawInput = ""; previousInput = ""; lastErrorCount = 0; - targetText = "Start with sound"; + updateStageCommands(); + targetText = initialTarget; maxLength = targetText.length; createLetterObjects(); updateTextColors(); name.text = ""; } + function ResetGame() { + stage = 0; + resetCommon("Start"); + } + function resetInputUI() { + if (stage === 1) { + resetCommon("Yes"); + } else if (stage === 2) { + resetCommon("Interview"); + } else { + resetCommon(commands[0]); + } + } + + function advanceStage() { + stage++; + resetInputUI(); + } + k.onKeyPress((ch) => { if (ch.length !== 1) return; const shifting = k.isKeyDown("shift"); @@ -382,4 +499,5 @@ k.scene("selection", () => { } }); }); + updateStageCommands(); }); diff --git a/website/public/game/game.js b/website/public/game/game.js index aa609fc..ab05ca4 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var Yu=Object.defineProperty;var Ju=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Ju(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Qu=Object.defineProperty,o=(t,e)=>Qu(t,"name",{value:e,configurable:!0}),Zu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,ne=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=st(e,0,255),this.g=st(r,0,255),this.b=st(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,m,y)=>(y<0&&(y+=1),y>1&&(y-=1),y<1/6?p+(m-p)*6*y:y<1/2?m:y<2/3?p+(m-p)*(2/3-y)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Oe(this.r,e.r,r),Oe(this.g,e.g,r),Oe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rne.fromHSL(t,e,r),"hsl2rgb");function fe(t){return t*Math.PI/180}o(fe,"deg2rad");function Ct(t){return t*180/Math.PI}o(Ct,"rad2deg");function st(t,e,r){return e>r?st(t,r,e):Math.min(Math.max(t,e),r)}o(st,"clamp");function Oe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof k&&e instanceof k||t instanceof ne&&e instanceof ne)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function nt(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(nt,"map");function ma(t,e,r,n,s){return st(nt(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,k=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=fe(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=fe(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return Ct(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return Ct(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Oe(this.x,e.x,r),Oe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new pe(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof k)return new k(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new k(...t[0])}return new k(...t)}o(C,"vec2");var Ft,we=(Ft=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new k(this.x,this.y)}clone(){return new Ft(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ft,"Quad"),Ft);function Ee(t,e,r,n){return new we(t,e,r,n)}o(Ee,"quad");var tt,rn=(tt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new tt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new tt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new tt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Ct(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new k(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new k(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new k(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],m=this.m[4]*this.m[15]-this.m[12]*this.m[7],y=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],I=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],q=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*m+this.m[3]*y),e[10]=this.m[0]*v-this.m[1]*m+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*y+this.m[2]*g),e[3]=-(this.m[1]*I-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*I-this.m[2]*S+this.m[3]*q,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*q+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function zs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(zs,"wave");var $u=1103515245,eh=12345,Zi=2147483648,yr,ya=(yr=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=($u*this.seed+eh)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new k(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new ne(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof k)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof ne)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof k&&e[1]instanceof k)return this.genVec2(e[0],e[1]);if(e[0]instanceof ne&&e[1]instanceof ne)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(yr,"RNG"),yr),xs=new ya(Date.now());function wa(t){return t!=null&&(xs.seed=t),xs.seed}o(wa,"randSeed");function Pe(...t){return xs.genAny(...t)}o(Pe,"rand");function js(...t){return Math.floor(Pe(...t.length>0?t:[2]))}o(js,"randi");function Aa(t){return Pe()<=t}o(Aa,"chance");function Vs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Vs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Vs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[js(t.length)]}o(va,"choose");function Hs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Wn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Wn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(k.addScaled(e.p1,n,Math.max(s,0),r.p1),k.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Xn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Xn,"testRectLine");function dn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Yn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,u,r.p2)):(k.addScaled(e.p1,n,u,r.p1),k.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),m=u>=0&&u<=1,y=p>=0&&p<=1;if(m&&y)return k.addScaled(e.p1,n,u,r.p1),k.addScaled(e.p1,n,p,r.p2),!0;if(m||y){let v=m?u:p;return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.addScaled(e.p1,n,v,r.p2)):(k.addScaled(e.p1,n,v,r.p1),k.copy(e.p2,r.p2)),!0}}return Rt(t,e.p1)?(k.copy(e.p1,r.p1),k.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function Xr(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Xr,"testLineCircle");function Jn(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let r=0;rUt(e,r))||e.pts.some(r=>Ut(t,r)))}o(Ws,"testPolygonPolygon");function Ut(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(Ut,"testPolygonPoint");function Qn(t,e){e=e.sub(t.center);let r=fe(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o(Qn,"testEllipsePoint");function nn(t,e){let r=e.center.sub(t.center),n=fe(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return Qn(new at(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(nn,"testEllipseCircle");function Xs(t,e){let r=t.toMat2().inverse;return e=new Ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),Xr(e,new Le(C(),1))}o(Xs,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return nn(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return nn(t,new Le(e.center,e.radiusX));let r=new Zr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new Zr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=fe(t.angle),u=fe(e.angle),p=new Zr(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),m=new Zr(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),y=p.inverse,v=m.inverse,g=y.transpose.mul(r).mul(y),I=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,q=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=I.m11,L=I.m12,D=I.m13,O=I.m21,j=I.m22,$=I.m23,G=I.m31,Y=I.m32,te=I.m33,W=f*T*M-f*P*E-w*q*M+w*P*A+S*q*E-S*T*A,re=(f*T*te-f*P*Y-f*E*$+f*M*j-w*q*te+w*P*G+w*A*$-w*M*O+S*q*Y-S*T*G-S*A*j+S*E*O+q*E*D-q*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/W,ee=(f*j*te-f*$*Y-w*O*te+w*$*G+S*O*Y-S*j*G-q*L*te+q*D*Y+T*R*te-T*D*G-P*R*Y+P*L*G+A*L*$-A*D*j-E*R*$+E*D*O+M*R*j-M*L*O)/W,V=(R*j*te-R*$*Y-L*O*te+L*$*G+D*O*Y-D*j*G)/W;if(re>=0){let X=-3*ee+re**2,le=3*re*V+ee*re**2-4*ee**2,oe=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le<0&&oe>0)}else{let X=-3*ee+re**2,le=-27*V**2+18*V*re*ee+re**2*ee**2-4*re**3*V-4*ee**3;return!(X>0&&le>0)}}o(Pa,"testEllipseEllipse");function Ys(t,e){return Zn(t,new Re(e.points()))}o(Ys,"testEllipseRect");function Zn(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),fn(new Le(C(),1),e)}o(Zn,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function qa(t,e){return e instanceof k?Ca(e,t.pt):e instanceof Le?Rt(e,t.pt):e instanceof Ke?Yn(e,t.pt):e instanceof pe?dn(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof at?Qn(e,t.pt):!1}o(qa,"testPointShape");function ka(t,e){return e instanceof k?Yn(t,e):e instanceof Le?Xr(t,e):e instanceof Ke?Wn(t,e)!=null:e instanceof pe?Xn(e,t):e instanceof Re?Jn(t,e):e instanceof at?Xs(e,t):!1}o(ka,"testLineShape");function Ta(t,e){return e instanceof k?Rt(t,e):e instanceof Le?Ma(t,e):e instanceof Ke?Xr(e,t):e instanceof pe?Gs(e,t):e instanceof Re?fn(t,e):e instanceof at?nn(e,t):!1}o(Ta,"testCircleShape");function Ba(t,e){return e instanceof k?dn(t,e):e instanceof Le?Gs(t,e):e instanceof Ke?Xn(t,e):e instanceof pe?Hs(t,e):e instanceof Re?Ks(t,e):e instanceof at?Ys(e,t):!1}o(Ba,"testRectShape");function Ia(t,e){return e instanceof k?Ut(t,e):e instanceof Le?fn(e,t):e instanceof Ke?Jn(e,t):e instanceof pe?Ks(e,t):e instanceof Re?Ws(e,t):e instanceof at?Zn(e,t):!1}o(Ia,"testPolygonShape");function Ra(t,e){return e instanceof k?Qn(t,e):e instanceof Le?nn(t,e):e instanceof Ke?Xs(t,e):e instanceof pe?Ys(t,e):e instanceof Re?Zn(t,e):e instanceof at?Pa(e,t):!1}o(Ra,"testEllipseShape");function Js(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let m=u.cross(l)/h;if(m<=0||m>=1)return null;let y=c.normal().unit();return e.dot(y)>0&&(y.x*=-1,y.y*=-1),{point:n.add(l.scale(p)),normal:y,fraction:p}}o(Js,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function Qs(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let m=-h/(2*l);if(m>=0&&m<=1){let y=n.add(i.scale(m));return{point:y,normal:y.sub(s),fraction:m}}}else{let m=(-h+Math.sqrt(p))/(2*l),y=(-h-Math.sqrt(p))/(2*l),v=null;if(m>=0&&m<=1&&(v=m),y>=0&&y<=1&&(v=Math.min(y,v??y)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(Qs,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=Qs(i,l,new Le(C(),1));if(c){let h=rn.rotation(fe(-r.angle)),u=rn.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),m=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:m}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),m=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),y=C(p.x<1/0?p.x*m.x:1/0,p.y<1/0?p.y*m.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;y.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Pe(this.width),Pe(this.height))}},o(Dt,"Rect"),Dt),Zt,Le=(Zt=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new at(this.center,this.radius,this.radius).transform(e)}bbox(){return pe.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Qs(e,r,this)}random(){return this.center.add(k.fromAngle(Pe(360)).scale(Pe(this.radius)))}},o(Zt,"Circle"),Zt),rt,at=(rt=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new rt(C(),h,u,Ct(Math.atan2(-l[1],l[0]))):new rt(C(),u,h,Ct(Math.atan2(-c[1],c[0])))}toMat2(){let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e);return new rn(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new rt(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=Zr.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=rt.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return pe.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=fe(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return pe.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new rt(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=fe(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(rt,"Ellipse"),rt);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var ft,Re=(ft=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new ft(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return pe.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new Ke(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((m,y)=>{u=m.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,m,e,r);if(i.push(g),l.push(g),n&&s){let I=n[y===0?n.length-1:y-1],f=n[y],w=m.sub(h),S=g.sub(h).dot(w)/w.dot(w),q=Oe(I,f,S);s[0].push(q),s[1].push(q)}p=v}(v?i:l).push(m),n&&s&&(v?s[0]:s[1]).push(n[y]),h=m}),[i.length?new ft(i):null,l.length?new ft(l):null]}},o(ft,"Polygon"),ft);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function _n(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(_n,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ha(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ha,"evaluateBezierSecondDerivative");function Ga(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ga,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=Zs(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function Zs(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let m=u;if(m<=0)return 0;if(m>=l)return 1;let y=0;for(;n[y+1]=1)return n[e-1];let m=0;for(;s[m+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o(Yr,"hermite");function _s(t,e,r,n,s,i=Yr){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new k(l(h),c(h))}o(_s,"cardinal");function sn(t,e,r,n,s=Yr){return _s(t,e,r,n,.5,s)}o(sn,"catmullRom");function Xa(t,e,r,n,s=Yr){return sn(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Xa,"bezier");function Ya(t,e,r,n,s,i,l,c=Yr){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new k(h(p),u(p))}o(Ya,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function hr(t){return 0<=t&&t<=1}o(hr,"inZeroOneDomain");function qn(t,e){return Math.abs(t-e)<=Number.EPSILON}o(qn,"approximately");function cr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(cr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(qn(c,0)){if(qn(s,0))return qn(i,0)?[]:[-l/i].filter(hr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(hr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,m=p/2,y=m*m+u*u*u;if(y<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),q=-p/(2*S),T=q<-1?-1:q>1?1:q,P=Math.acos(T),A=2*cr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(hr)}if(y===0){let f=m<0?cr(-m):-cr(m),w=2*f-s/3,S=-f-s/3;return[w,S].filter(hr)}let v=Math.sqrt(y),g=cr(v-m),I=cr(v+m);return[g-I-s/3].filter(hr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?_n(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return nt(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function $s(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o($s,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(kn,"onSameSide");function ro(t,e,r,n){return kn(t,e,r,n)&&kn(t,r,e,n)&&kn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return $s(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ei(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let m=0;m3;){u=e[c],p=r[c];let m=t[p],y=t[c],v=t[u];if(so(m,y,v,s))i.push([m,y,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(y),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ei,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",$n="topleft",rh="monospace",On="monospace",vs="linear",ti=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],nh=ti.reduce((t,e)=>t+e.size,0),oo=2048,sh=oo*4*nh,ih=oo*6,ah=` +var Yu=Object.defineProperty;var Xu=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Xu(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Ju=Object.defineProperty,o=(t,e)=>Ju(t,"name",{value:e,configurable:!0}),Qu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,se=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=at(e,0,255),this.g=at(r,0,255),this.b=at(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,y,m)=>(m<0&&(m+=1),m>1&&(m-=1),m<1/6?p+(y-p)*6*m:m<1/2?y:m<2/3?p+(y-p)*(2/3-m)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Fe(this.r,e.r,r),Fe(this.g,e.g,r),Fe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rse.fromHSL(t,e,r),"hsl2rgb");function ye(t){return t*Math.PI/180}o(ye,"deg2rad");function qt(t){return t*180/Math.PI}o(qt,"rad2deg");function at(t,e,r){return e>r?at(t,r,e):Math.min(Math.max(t,e),r)}o(at,"clamp");function Fe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof q&&e instanceof q||t instanceof se&&e instanceof se)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Fe,"lerp");function it(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(it,"map");function ma(t,e,r,n,s){return at(it(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,q=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=ye(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=ye(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return qt(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return qt(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Fe(this.x,e.x,r),Fe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new we(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof q)return new q(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new q(...t[0])}return new q(...t)}o(C,"vec2");var Lt,Ae=(Lt=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Lt(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new q(this.x,this.y)}clone(){return new Lt(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Lt,"Quad"),Lt);function Se(t,e,r,n){return new Ae(t,e,r,n)}o(Se,"quad");var nt,an=(nt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new nt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new nt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new nt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return qt(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new q(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new q(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new q(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],y=this.m[4]*this.m[15]-this.m[12]*this.m[7],m=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],B=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],k=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*y+this.m[3]*m),e[10]=this.m[0]*v-this.m[1]*y+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*m+this.m[2]*g),e[3]=-(this.m[1]*B-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*B-this.m[2]*S+this.m[3]*k,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*k+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function Vs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(Vs,"wave");var _u=1103515245,$u=12345,Zi=2147483648,br,ya=(br=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(_u*this.seed+$u)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new q(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new se(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof q)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof se)return this.genColor(ce(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof q&&e[1]instanceof q)return this.genVec2(e[0],e[1]);if(e[0]instanceof se&&e[1]instanceof se)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(br,"RNG"),br),vs=new ya(Date.now());function wa(t){return t!=null&&(vs.seed=t),vs.seed}o(wa,"randSeed");function Ce(...t){return vs.genAny(...t)}o(Ce,"rand");function Gs(...t){return Math.floor(Ce(...t.length>0?t:[2]))}o(Gs,"randi");function Aa(t){return Ce()<=t}o(Aa,"chance");function Hs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Hs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Hs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[Gs(t.length)]}o(va,"choose");function Ks(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Jn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Jn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(q.addScaled(e.p1,n,Math.max(s,0),r.p1),q.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Qn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Qn,"testRectLine");function gn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Zn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.addScaled(e.p1,n,u,r.p2)):(q.addScaled(e.p1,n,u,r.p1),q.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),y=u>=0&&u<=1,m=p>=0&&p<=1;if(y&&m)return q.addScaled(e.p1,n,u,r.p1),q.addScaled(e.p1,n,p,r.p2),!0;if(y||m){let v=y?u:p;return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.addScaled(e.p1,n,v,r.p2)):(q.addScaled(e.p1,n,v,r.p1),q.copy(e.p2,r.p2)),!0}}return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function _r(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Ot(e,t.p1)}o(_r,"testLineCircle");function _n(t,e){if(zt(e,t.p1)||zt(e,t.p2))return!0;for(let r=0;rzt(e,r))||e.pts.some(r=>zt(t,r)))}o(Xs,"testPolygonPolygon");function zt(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(zt,"testPolygonPoint");function $n(t,e){e=e.sub(t.center);let r=ye(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o($n,"testEllipsePoint");function on(t,e){let r=e.center.sub(t.center),n=ye(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return $n(new lt(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(on,"testEllipseCircle");function Js(t,e){let r=t.toMat2().inverse;return e=new We(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),_r(e,new Oe(C(),1))}o(Js,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return on(e,new Oe(t.center,t.radiusX));if(e.radiusX===e.radiusY)return on(t,new Oe(e.center,e.radiusX));let r=new en(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new en(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=ye(t.angle),u=ye(e.angle),p=new en(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),y=new en(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),m=p.inverse,v=y.inverse,g=m.transpose.mul(r).mul(m),B=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,k=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=B.m11,L=B.m12,D=B.m13,O=B.m21,j=B.m22,_=B.m23,K=B.m31,J=B.m32,te=B.m33,ne=f*T*M-f*P*E-w*k*M+w*P*A+S*k*E-S*T*A,W=(f*T*te-f*P*J-f*E*_+f*M*j-w*k*te+w*P*K+w*A*_-w*M*O+S*k*J-S*T*K-S*A*j+S*E*O+k*E*D-k*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/ne,re=(f*j*te-f*_*J-w*O*te+w*_*K+S*O*J-S*j*K-k*L*te+k*D*J+T*R*te-T*D*K-P*R*J+P*L*K+A*L*_-A*D*j-E*R*_+E*D*O+M*R*j-M*L*O)/ne,G=(R*j*te-R*_*J-L*O*te+L*_*K+D*O*J-D*j*K)/ne;if(W>=0){let ve=-3*re+W**2,je=3*W*G+re*W**2-4*re**2,Ve=-27*G**2+18*G*W*re+W**2*re**2-4*W**3*G-4*re**3;return!(ve>0&&je<0&&Ve>0)}else{let ve=-3*re+W**2,je=-27*G**2+18*G*W*re+W**2*re**2-4*W**3*G-4*re**3;return!(ve>0&&je>0)}}o(Pa,"testEllipseEllipse");function Qs(t,e){return es(t,new Re(e.points()))}o(Qs,"testEllipseRect");function es(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),mn(new Oe(C(),1),e)}o(es,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function ka(t,e){return e instanceof q?Ca(e,t.pt):e instanceof Oe?Ot(e,t.pt):e instanceof We?Zn(e,t.pt):e instanceof we?gn(e,t.pt):e instanceof Re?zt(e,t.pt):e instanceof lt?$n(e,t.pt):!1}o(ka,"testPointShape");function qa(t,e){return e instanceof q?Zn(t,e):e instanceof Oe?_r(t,e):e instanceof We?Jn(t,e)!=null:e instanceof we?Qn(e,t):e instanceof Re?_n(t,e):e instanceof lt?Js(e,t):!1}o(qa,"testLineShape");function Ta(t,e){return e instanceof q?Ot(t,e):e instanceof Oe?Ma(t,e):e instanceof We?_r(e,t):e instanceof we?Ws(e,t):e instanceof Re?mn(t,e):e instanceof lt?on(e,t):!1}o(Ta,"testCircleShape");function Ia(t,e){return e instanceof q?gn(t,e):e instanceof Oe?Ws(t,e):e instanceof We?Qn(t,e):e instanceof we?Ks(t,e):e instanceof Re?Ys(t,e):e instanceof lt?Qs(e,t):!1}o(Ia,"testRectShape");function Ba(t,e){return e instanceof q?zt(t,e):e instanceof Oe?mn(e,t):e instanceof We?_n(e,t):e instanceof we?Ys(e,t):e instanceof Re?Xs(e,t):e instanceof lt?es(e,t):!1}o(Ba,"testPolygonShape");function Ra(t,e){return e instanceof q?$n(t,e):e instanceof Oe?on(t,e):e instanceof We?Js(t,e):e instanceof we?Qs(t,e):e instanceof Re?es(t,e):e instanceof lt?Pa(e,t):!1}o(Ra,"testEllipseShape");function Zs(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let y=u.cross(l)/h;if(y<=0||y>=1)return null;let m=c.normal().unit();return e.dot(m)>0&&(m.x*=-1,m.y*=-1),{point:n.add(l.scale(p)),normal:m,fraction:p}}o(Zs,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function _s(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let y=-h/(2*l);if(y>=0&&y<=1){let m=n.add(i.scale(y));return{point:m,normal:m.sub(s),fraction:y}}}else{let y=(-h+Math.sqrt(p))/(2*l),m=(-h-Math.sqrt(p))/(2*l),v=null;if(y>=0&&y<=1&&(v=y),m>=0&&m<=1&&(v=Math.min(m,v??m)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(_s,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=_s(i,l,new Oe(C(),1));if(c){let h=an.rotation(ye(-r.angle)),u=an.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),y=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:y}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),y=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),m=C(p.x<1/0?p.x*y.x:1/0,p.y<1/0?p.y*y.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;m.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Nt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Ce(this.width),Ce(this.height))}},o(Nt,"Rect"),Nt),_t,Oe=(_t=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new lt(this.center,this.radius,this.radius).transform(e)}bbox(){return we.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new _t(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return _s(e,r,this)}random(){return this.center.add(q.fromAngle(Ce(360)).scale(Ce(this.radius)))}},o(_t,"Circle"),_t),st,lt=(st=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new st(C(),h,u,qt(Math.atan2(-l[1],l[0]))):new st(C(),u,h,qt(Math.atan2(-c[1],c[0])))}toMat2(){let e=ye(this.angle),r=Math.cos(e),n=Math.sin(e);return new an(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new st(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=en.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=st.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return we.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=ye(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return we.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new st(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=ye(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(st,"Ellipse"),st);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var gt,Re=(gt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new gt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return we.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new We(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((y,m)=>{u=y.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,y,e,r);if(i.push(g),l.push(g),n&&s){let B=n[m===0?n.length-1:m-1],f=n[m],w=y.sub(h),S=g.sub(h).dot(w)/w.dot(w),k=Fe(B,f,S);s[0].push(k),s[1].push(k)}p=v}(v?i:l).push(y),n&&s&&(v?s[0]:s[1]).push(n[m]),h=y}),[i.length?new gt(i):null,l.length?new gt(l):null]}},o(gt,"Polygon"),gt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function ts(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(ts,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ga(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ga,"evaluateBezierSecondDerivative");function Ha(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ha,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=$s(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function $s(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let y=u;if(y<=0)return 0;if(y>=l)return 1;let m=0;for(;n[m+1]=1)return n[e-1];let y=0;for(;s[y+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o($r,"hermite");function ei(t,e,r,n,s,i=$r){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new q(l(h),c(h))}o(ei,"cardinal");function ln(t,e,r,n,s=$r){return ei(t,e,r,n,.5,s)}o(ln,"catmullRom");function Ya(t,e,r,n,s=$r){return ln(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Ya,"bezier");function Xa(t,e,r,n,s,i,l,c=$r){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new q(h(p),u(p))}o(Xa,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function gr(t){return 0<=t&&t<=1}o(gr,"inZeroOneDomain");function In(t,e){return Math.abs(t-e)<=Number.EPSILON}o(In,"approximately");function mr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(mr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(In(c,0)){if(In(s,0))return In(i,0)?[]:[-l/i].filter(gr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(gr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,y=p/2,m=y*y+u*u*u;if(m<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),k=-p/(2*S),T=k<-1?-1:k>1?1:k,P=Math.acos(T),A=2*mr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(gr)}if(m===0){let f=y<0?mr(-y):-mr(y),w=2*f-s/3,S=-f-s/3;return[w,S].filter(gr)}let v=Math.sqrt(m),g=mr(v-y),B=mr(v+y);return[g-B-s/3].filter(gr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?ts(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return it(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function ti(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o(ti,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(Bn,"onSameSide");function ro(t,e,r,n){return Bn(t,e,r,n)&&Bn(t,r,e,n)&&Bn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return ti(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ri(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let y=0;y3;){u=e[c],p=r[c];let y=t[p],m=t[c],v=t[u];if(so(y,m,v,s))i.push([y,m,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(m),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ri,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",rs="topleft",th="monospace",Un="monospace",bs="linear",ni=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],rh=ni.reduce((t,e)=>t+e.size,0),oo=2048,nh=oo*4*rh,sh=oo*6,ih=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -26,7 +26,7 @@ void main() { v_color = a_color; gl_Position = pos; } -`,oh=` +`,ah=` precision mediump float; varying vec2 v_pos; @@ -48,18 +48,18 @@ void main() { discard; } } -`,bs=` +`,Es=` vec4 vert(vec2 pos, vec2 uv, vec4 color) { return def_vert(); } -`,Es=` +`,Ss=` vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,lh=new Set(["id","require"]),uh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),hh=200,ch=640,dh=65536,lo=Symbol.for("kaplay.cancel"),wr,fh=(wr=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(wr,"Registry"),wr),_t,sr=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new _t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o(_t,"KEventController"),_t),Ar,ke=(Ar=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new fh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new sr(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Ar,"KEvent"),Ar),xr,es=(xr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new ke),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(xr,"KEventHandler"),xr),ph=o(t=>t[0]instanceof ne,"arrayIsColor"),gh=o(t=>t[0]instanceof k,"arrayIsVec2"),mh=o(t=>typeof t[0]=="number","arrayIsNumber"),vr,uo=(vr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),yh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function rs(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!rs(c,h))return!1}return!0}return!1}o(rs,"deepEq");var _i=new Set,wh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Ht(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Ln(t,e){return Number(t.toFixed(e))}o(Ln,"toFixed");function de(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(de,"overload2");var Ah=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Gt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ct=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),xn=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),xh=(()=>{let t=0;return()=>t++})(),vh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},bh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),Eh=o(()=>{let t=Yt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{xn(Yt.buttonsByKey,l,e)}),n&&n.forEach(l=>{xn(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{xn(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{xn(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),br,$r=(br=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(br,"ButtonState"),br),Er,Sh=(Er=class{constructor(){b(this,"buttonState",new $r);b(this,"stickState",new Map)}},o(Er,"GamepadState"),Er),Sr,Mh=(Sr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(Sr,"FPSCounter"),Sr),Yt,$i=vh,Ph=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Mh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new k(0),mouseDeltaPos:new k(0),keyState:new $r,mouseState:new $r,mergedGamepadState:new Sh,gamepadStates:new Map,lastInputDevice:null,buttonState:new $r,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new es}},"initAppState"),Ch=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Ph(t);Yt=e,Eh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function m(){return e.canvas.style.cursor}o(m,"getCursor");function y(x){if(x)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(y,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function I(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(I,"exitFullscreen");function f(x=!0){x?g(e.canvas):I()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(je),B=Object.entries(cs),F=Object.entries(An);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of B)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function q(x,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(ce=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Ie=ce/1e3,be=Math.min(Ie-e.realTime,.25),At=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ie,z+=be,z>At){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ct(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ct(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ct(e.keyState.down,x)}o(j,"isKeyDown");function $(x){return x===void 0?e.keyState.released.size>0:ct(e.keyState.released,x)}o($,"isKeyReleased");function G(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ct(e.mergedGamepadState.buttonState.pressed,x)}o(G,"isGamepadButtonPressed");function Y(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ct(e.mergedGamepadState.buttonState.down,x)}o(Y,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ct(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function W(x){return x===void 0?e.buttonState.pressed.size>0:ct(e.buttonState.pressed,x)}o(W,"isButtonPressed");function re(x){return x===void 0?e.buttonState.down.size>0:ct(e.buttonState.down,x)}o(re,"isButtonDown");function ee(x){return x===void 0?e.buttonState.released.size>0:ct(e.buttonState.released,x)}o(ee,"isButtonReleased");function V(x){var B;return(B=e.buttons)==null?void 0:B[x]}o(V,"getButton");function X(x,B){e.buttons[x]={...e.buttons[x],...B}}o(X,"setButton");function le(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(le,"pressButton");function oe(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(oe,"releaseButton");function Fe(x){return e.events.on("resize",x)}o(Fe,"onResize");let Te=de(x=>e.events.on("keyDown",x),(x,B)=>e.events.on("keyDown",F=>Je(x,F)&&B(F))),xe=de(x=>e.events.on("keyPress",B=>x(B)),(x,B)=>e.events.on("keyPress",F=>Je(x,F)&&B(F))),We=de(x=>e.events.on("keyPressRepeat",x),(x,B)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&B(F))),yt=de(x=>e.events.on("keyRelease",x),(x,B)=>e.events.on("keyRelease",F=>Je(x,F)&&B(F))),wt=de(x=>e.events.on("mouseDown",B=>x(B)),(x,B)=>e.events.on("mouseDown",F=>Je(x,F)&&B(F))),ge=de(x=>e.events.on("mousePress",B=>x(B)),(x,B)=>e.events.on("mousePress",F=>Je(x,F)&&B(F))),Xe=de(x=>e.events.on("mouseRelease",B=>x(B)),(x,B)=>e.events.on("mouseRelease",F=>F===x&&B(F)));function Ye(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(Ye,"onMouseMove");function qe(x){return e.events.on("charInput",x)}o(qe,"onCharInput");function Se(x){return e.events.on("touchStart",x)}o(Se,"onTouchStart");function Kt(x){return e.events.on("touchMove",x)}o(Kt,"onTouchMove");function ot(x){return e.events.on("touchEnd",x)}o(ot,"onTouchEnd");function N(x){return e.events.on("scroll",x)}o(N,"onScroll");function K(x){return e.events.on("hide",x)}o(K,"onHide");function J(x){return e.events.on("show",x)}o(J,"onShow");let ae=de(x=>e.events.on("gamepadButtonPress",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&B(F,z))),ve=de(x=>e.events.on("gamepadButtonDown",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&B(F,z))),Ae=de(x=>e.events.on("gamepadButtonRelease",(B,F)=>x(B,F)),(x,B)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&B(F,z)));function _e(x,B){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&B(z,Q))}o(_e,"onGamepadStick");function wn(x){return e.events.on("gamepadConnect",x)}o(wn,"onGamepadConnect");function U(x){return e.events.on("gamepadDisconnect",x)}o(U,"onGamepadDisconnect");function H(x){return e.mergedGamepadState.stickState.get(x)||new k(0)}o(H,"getGamepadStick");function _(){return[...e.charInputted]}o(_,"charInputted");function se(){return[...e.gamepads]}o(se,"getGamepads");let me=de(x=>e.events.on("buttonPress",B=>x(B)),(x,B)=>e.events.on("buttonPress",F=>Je(x,F)&&B(F))),lt=de(x=>e.events.on("buttonDown",B=>x(B)),(x,B)=>e.events.on("buttonDown",F=>Je(x,F)&&B(F))),Be=de(x=>e.events.on("buttonRelease",B=>x(B)),(x,B)=>e.events.on("buttonRelease",F=>Je(x,F)&&B(F)));function ut(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),Wi()}o(ut,"processInput");function Jr(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,B)=>{e.mergedGamepadState.stickState.set(B,new k(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new k(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((B,F)=>{x.stickState.set(F,new k(0))})})}o(Jr,"resetInput");function Qr(x){let B={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(x.index,{buttonState:new $r,stickState:new Map([["left",new k(0)],["right",new k(0)]])}),B}o(Qr,"registerGamepad");function Ki(x){e.gamepads=e.gamepads.filter(B=>B.index!==x.index),e.gamepadStates.delete(x.index)}o(Ki,"removeGamepad");function Wi(){var x,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&Qr(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,ce=e.gamepadStates.get(F.index);if(ce){for(let Ie=0;Ie{e.buttonState.press(xt),e.events.trigger("buttonPress",xt)})),e.mergedGamepadState.buttonState.press(be),ce.buttonState.press(be),e.events.trigger("gamepadButtonPress",be,F)}else ce.buttonState.down.has(be)&&(ht&&((B=e.buttonsByGamepad.get(be))==null||B.forEach(xt=>{e.buttonState.release(xt),e.events.trigger("buttonRelease",xt)})),e.mergedGamepadState.buttonState.release(be),ce.buttonState.release(be),e.events.trigger("gamepadButtonRelease",be,F))}for(let Ie in Q.sticks){let be=Q.sticks[Ie];if(!be)continue;let At=new k(z.axes[be.x],z.axes[be.y]);ce.stickState.set(Ie,At),e.mergedGamepadState.stickState.set(Ie,At),e.events.trigger("gamepadStick",Ie,At,F)}}}}o(Wi,"processGamepad");let je={},cs={},An={},Xi=t.pixelDensity||1;je.mousemove=x=>{let B=new k(x.offsetX,x.offsetY),F=new k(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Xi,Q=e.canvas.height/Xi,ce=window.innerWidth,Ie=window.innerHeight,be=ce/Ie,At=z/Q;if(be>At){let ht=Ie/Q,xt=(ce-z*ht)/2;B.x=nt(x.offsetX-xt,0,z*ht,0,z),B.y=nt(x.offsetY,0,Q*ht,0,Q)}else{let ht=ce/z,xt=(Ie-Q*ht)/2;B.x=nt(x.offsetX,0,z*ht,0,z),B.y=nt(x.offsetY-xt,0,Q*ht,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Yi=["left","middle","right","back","forward"];je.mousedown=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},je.mouseup=x=>{e.events.onOnce("input",()=>{var F;let B=Yi[x.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Xu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};je.keydown=x=>{Xu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(B===void 0)throw new Error(`Unknown key: ${x.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.press(ce),e.events.trigger("buttonPress",ce)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},je.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let B=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(B)&&((z=e.buttonsByKey.get(B))==null||z.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(ce=>{e.buttonState.release(ce),e.events.trigger("buttonRelease",ce)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},je.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Q=>{e.events.trigger("touchStart",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}B.forEach(z=>{e.events.trigger("touchMove",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.touchend=x=>{e.events.onOnce("input",()=>{var z;let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new k(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Q=>{e.events.trigger("touchEnd",new k(Q.clientX-F.x,Q.clientY-F.y),Q)})})},je.touchcancel=x=>{e.events.onOnce("input",()=>{let B=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new k(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(z=>{e.events.trigger("touchEnd",new k(z.clientX-F.x,z.clientY-F.y),z)})})},je.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new k(x.deltaX,x.deltaY))})},je.contextmenu=x=>x.preventDefault(),cs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},An.gamepadconnected=x=>{let B=Qr(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},An.gamepaddisconnected=x=>{let B=se().filter(F=>F.index===x.gamepad.index)[0];Ki(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[x,B]of Object.entries(je))e.canvas.addEventListener(x,B);for(let[x,B]of Object.entries(cs))document.addEventListener(x,B);for(let[x,B]of Object.entries(An))window.addEventListener(x,B);let Qi=new ResizeObserver(x=>{for(let B of x)if(B.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:q,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:se,getCursor:m,setCursorLocked:y,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:$,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:G,isGamepadButtonDown:Y,isGamepadButtonReleased:te,getGamepadStick:H,isButtonPressed:W,isButtonDown:re,isButtonReleased:ee,setButton:X,getButton:V,pressButton:le,releaseButton:oe,charInputted:_,onResize:Fe,onKeyDown:Te,onKeyPress:xe,onKeyPressRepeat:We,onKeyRelease:yt,onMouseDown:wt,onMousePress:ge,onMouseRelease:Xe,onMouseMove:Ye,onCharInput:qe,onTouchStart:Se,onTouchMove:Kt,onTouchEnd:ot,onScroll:N,onHide:K,onShow:J,onGamepadButtonDown:ve,onGamepadButtonPress:ae,onGamepadButtonRelease:Ae,onGamepadStick:_e,onGamepadConnect:wn,onGamepadDisconnect:U,onButtonPress:me,onButtonDown:lt,onButtonRelease:Be,getLastInputDeviceType:bh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),qh=new k(-1,-1),kh=new k(0,-1),Th=new k(1,-1),Bh=new k(-1,0),Ih=new k(0,0),Rh=new k(1,0),Fh=new k(-1,1),Oh=new k(0,1),Lh=new k(1,1);function ir(t){switch(t){case"topleft":return qh;case"top":return kh;case"topright":return Th;case"left":return Bh;case"center":return Ih;case"right":return Rh;case"botleft":return Fh;case"bot":return Oh;case"botright":return Lh;default:return t}}o(ir,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var vn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Tn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((vn+1)*2*t-vn)/2:(Math.pow(2*t-2,2)*((vn+1)*(t*2-2)+vn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Tn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Tn.easeOutBounce(1-2*t))/2:(1+Tn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},an=Tn,Mr,Dh=(Mr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new k(e.x,e.y);return k.unit(r,r),k.scale(r,this.radius,r),k.add(r,this.center,r),r}},o(Mr,"CircleCollider"),Mr),Pr,Uh=(Pr=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new k(e.x,e.y);return k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.add(r,this.center,r),r}else{let r=new k(e.x,e.y);return k.rotateByAngle(r,-this.angle,r),k.unit(r,r),k.scalec(r,this.radiusX,this.radiusY,r),k.rotateByAngle(r,this.angle,r),k.add(r,this.center,r),r}}},o(Pr,"EllipseCollider"),Pr),Cr,ds=(Cr=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Cr,"PolygonCollider"),Cr);function ni(t,e,r){let n=new k(-r.x,-r.y),s=t.support(r),i=e.support(n);return new k(s.x-i.x,s.y-i.y)}o(ni,"calculateSupport");function qo(t,e,r,n){var s=ni(e,r,n);return t.push(s),n.dot(s)>=0}o(qo,"addSupport");function Bn(t,e,r){let n=t.x*e.y-t.y*e.x;return new k(-n*r.y,n*r.x)}o(Bn,"tripleProduct");function si(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new k(t[1].x-t[0].x,t[1].y-t[0].y),c=new k(-t[0].x,-t[0].y),h=Bn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new k(-t[2].x,-t[2].y),c=new k(t[1].x-t[2].x,t[1].y-t[2].y),h=new k(t[0].x-t[2].x,t[0].y-t[2].y);var s=Bn(h,c,c),i=Bn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return qo(t,e,r,n)?2:0}o(si,"evolveSimplex");function ko(t,e){let r=[],n=new k;for(var s=2;s===2;)s=si(r,t,e,n);return s===1}o(ko,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new k,s=0,i=new k,l=new k;for(let h=0;h=t.length&&(u=0),k.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}k.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new k;for(let y=0;yc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(kr,"NavPolygon"),kr),Tr,Vh=(Tr=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new jh(this._polygons.length),n=e.map((s,i)=>new zh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Tr,"NavMesh"),Tr);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function fr(t,e,r,n,s,i=1){n=fe(n%360),s=fe(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/fe(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let m=0;m<=c;m++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(fr,"getArcPts");var Br,na=(Br=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Br,"Edge"),Br),Ir,Hh=(Ir=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Jt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Ho(t="intersect"){return{id:"mask",mask:t}}o(Ho,"mask");function ai(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Ln(this.opacity,1)}`}}}o(ai,"opacity");function Go(t=1,e=ue(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Go,"outline");var Rr,Gh=(Rr=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Rr,"Particle"),Rr);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[ne.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],m=t.angle||[0,0],y=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],I=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&q.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Xo,"polygon");function oi(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Mt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new k(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new k(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Fr,"TexPacker"),Fr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var $t,it=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new ke);b(this,"onErrorEvents",new ke);b(this,"onFinishEvents",new ke);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new $t(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Or,or=(Or=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new it(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=it.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Or,"AssetBucket"),Or);function ss(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(ss,"fetchURL");function pn(t){return ss(t).then(e=>e.json())}o(pn,"fetchJSON");function Jo(t){return ss(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return ss(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,pn(Ze(e)))}o(_o,"loadJSON");function gn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(gn,"loadImg");function Nt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(Nt,"loadProgress");function ui(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ui,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function Dn(t){return d.assets.custom.add(null,t)}o(Dn,"load");var Wh=o((t,e)=>({urlPrefix:"",sprites:new or,fonts:new or,bitmapFonts:new or,sounds:new or,shaders:new or,custom:new or,music:{},packer:new Kh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=yh(e)+".json");let n=typeof r=="string"?pn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return rr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Xh="data:image/png;base64,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",Lr,In=(Lr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",vs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??vs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(Lr,"FontData"),Lr);function hi(t){if(!t)return hi(d.globalOpt.font??rh);if(typeof t=="string"){let e=di(t),r=ci(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(Nt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(hi,"resolveFont");function ci(t){return d.assets.fonts.get(t)??null}o(ci,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new In(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function di(t){return d.assets.bitmapFonts.get(t)??null}o(di,"getBitmapFont");function fi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,gn(i).then(l=>rl(Mt.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(fi,"loadBitmapFont");var Yh=o((t="happy",e)=>fi(t,Xh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await pn(e):e,s=await Promise.all(n.frames.map(gn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await mr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Dr,Jh=(Dr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Kn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ne)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof k)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],mh(s)?r.uniform1fv(i,s):gh(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):ph(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Dr,"Shader"),Dr);function is(t,e=bs,r=Es){let n=ah.replace("{{user}}",e??bs),s=oh.replace("{{user}}",r??Es);try{return new Jh(t,n,s,ti.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=wh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(is,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=pi(t);if(e)return e.data??e;if(Nt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof it)return t.data?t.data:t;return t}o(sl,"resolveShader");function pi(t){return d.assets.shaders.get(t)??null}o(pi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,is(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>is(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var pt,gr=(pt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new pt(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new pt(r))}static fromURL(e){return po(e)?pt.fromArrayBuffer(co(e)):Qo(e).then(r=>pt.fromArrayBuffer(r))}},o(pt,"SoundData"),pt);function ol(t){if(typeof t=="string"){let e=gi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof gr)return it.loaded(t);if(t instanceof it)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function gi(t){return d.assets.sounds.get(t)??null}o(gi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=gr.fromURL(r):r instanceof ArrayBuffer?n=gr.fromArrayBuffer(r):n=Promise.resolve(gr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function mi(t,e){return t=Ze(t),Dn(typeof e=="string"?new Promise((r,n)=>{pn(e).then(s=>{mi(t,s).then(r).catch(n)})}):rr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(m=>new we(l.x+(i.x+m.x)/c*l.w,l.y+(i.y+m.y)/h*l.h,m.w/c*l.w,m.h/h*l.h)):wi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new rr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(mi,"loadSpriteAtlas");var Qh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",gt,rr=(gt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?gt.fromURL(e,r):Promise.resolve(gt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):wi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new gt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return gn(e).then(n=>gt.fromImage(n,r))}},o(gt,"SpriteData"),gt);function en(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(Nt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof it)return t;throw new Error(`Invalid sprite: ${t}`)}}o(en,"resolveSprite");function yi(t){return d.assets.sprites.get(t)??null}o(yi,"getSprite");function mr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?gn(n):Promise.resolve(n))).then(n=>Cs(n,r))):d.assets.sprites.addLoaded(t,Cs(e,r)):typeof e=="string"?d.assets.sprites.add(t,rr.from(e,r)):d.assets.sprites.addLoaded(t,rr.fromImage(e,r))}o(mr,"loadSprite");function wi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return rr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Cs,"createSpriteSheet");function hl(t="bean"){return mr(t,Qh)}o(hl,"loadBean");function Un(t,e={}){let r=null,n=null,s=null,i=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,m,y)=>{let v=C(1,1);return m&&y?(v.x=m/(u.width*p.w),v.y=y/(u.height*p.h)):m?(v.x=m/(u.width*p.w),v.y=v.x):y&&(v.y=y/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let m=p.frames[0].clone();e.quad&&(m=m.scale(e.quad));let y=l(p.tex,m,e.width,e.height);if(u.width=p.tex.width*m.w*y.x,u.height=p.tex.height*m.h*y.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let m=Math.abs(u.to-u.from)+1;for(let y=0;y0;y--)p.push(p[y]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=en(u);p&&p.onLoad(m=>c(this,m))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:m,top:y,bottom:v}=r.slice9,g=r.tex.width*u.w,I=r.tex.height*u.h,f=this.width-p-m,w=this.height-y-v,S=p/g,q=m/g,T=1-S-q,P=y/I,A=v/I,E=1-P-A,M=[Ee(0,0,S,P),Ee(S,0,T,P),Ee(S+T,0,q,P),Ee(0,P,S,E),Ee(S,P,T,E),Ee(S+T,P,q,E),Ee(0,P+E,S,A),Ee(S,P+E,T,A),Ee(S+T,P+E,q,A),Ee(0,0,p,y),Ee(p,0,f,y),Ee(p+f,0,m,y),Ee(0,y,p,w),Ee(p,y,f,w),Ee(p+f,y,m,w),Ee(0,y+w,p,v),Ee(p,y+w,f,v),Ee(p+f,y+w,m,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cn(Object.assign(mt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cn(Object.assign(mt(this),{tex:r.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=en(t);u?u.onLoad(p=>c(this,p)):as(()=>c(this,en(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let m=r.anims[u];if(m===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof m=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??m.loop??!1,pingpong:p.pingpong??m.pingpong??!1,speed:p.speed??m.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof m=="number"?null:1,this.frame=typeof m=="number"?m:m.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(Un,"sprite");function cl(t,e={}){function r(s){var l,c;let i=jt(Object.assign(mt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Hn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Hn(t).text:"",add(){as(()=>r(this))},draw(){Vt(r(this))},renderArea(){return new pe(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(mt(this),{width:this.width,height:this.height}))},renderArea(){return new pe(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Mt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new pe(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?k.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?k.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?k.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let m=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=m},hasLineOfSight(l){let c=oi(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function Ai(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(Ai,"tile");var Ur,xi=(Ur=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||an.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=an.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Ur,"AnimateChannel"),Ur);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Nr,Zh=(Nr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Nr,"AnimateChannelNumber"),Nr),zr,_h=(zr=class extends xi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(m,u),v=p[r.x,r.y])})}},o(zr,"AnimateChannelVec2"),zr),jr,$h=(jr=class extends xi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(jr,"AnimateChannelColor"),jr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=st(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Zh(s,i,l,t.relative||!1)):i[0]instanceof k?e.push(new _h(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ne&&e.push(new $h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function vi(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>vi(n,n.name))),r}o(vi,"serializeAnimation");function ks(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(ks,"boom");var ec=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=ls())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,an.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new ke,end:new ke,update:new ke,draw:new ke})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let m=typeof r[p]=="string"?[r[p]]:r[p];if(!m.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${m.map(y=>`"${y}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function bi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(bi,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Nn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new ke,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=an.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Oe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Nn,"timer");var Ts=0;function Bs(){return Ts>0}o(Bs,"usesArea");var vt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!vt&&!sa&&(vt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Ts++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Ts--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),et(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Ui(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:Et(this)};s instanceof pe?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?Pt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&ar({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return vt?vt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(vt){let i=Et(this)?vt.pos:d.k.toWorld(vt.pos);return this.hasPoint(i)}let s=Et(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){vt&&vt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof pe){let l=ir(this.anchor||$n).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Et(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??ch,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let m=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/m)),h.pos=h.pos.add(u.displacement.scale(-this.mass/m)),Jt(this,this.transform),Jt(h,h.transform)}else{let m=!this.isStatic&&h.isStatic?u:u.reverse();m.source.pos=m.source.pos.add(m.displacement),Jt(m.source,m.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),m=this.vel.project(h.normal),y=this.vel.sub(m);this.vel.dot(h.normal)<0&&(this.vel=y.sub(m.scale(u))),p!=0&&(this.vel=this.vel.sub(y.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??dh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(tn())>0},isJumping(){return this.vel.dot(tn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=tn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function ql(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(ql,"areaEffector");function kl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(kl,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Bl(t={}){return t.ignoreSides??(t.ignoreSides=[k.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Bl,"platformEffector");function Il(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(k.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Il,"buoyancyEffector");function zn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(zn,"anchor");function Ei(){return{id:"fixed",fixed:!0}}o(Ei,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?k.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??hh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new pe(C(0),Me(),Ce());return!dn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function ln(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Et(this)?r:jn(r):null}},toScreen(e){let r=this.toWorld(e);return Et(this)?r:jn(r)},fromScreen(e){return Et(this)?this.fromWorld(e):this.fromWorld(Bi(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){ar({color:ue(255,0,0),radius:4/Ui()})}}}o(ln,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function un(...t){if(t.length===0)return un(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof k))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(un,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([ln(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),m=o(()=>{i=[];for(let A of r.children)y(A)},"createSpatialMap"),y=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,y(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),I=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),q=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(ln(this.tile2Pos(M))),D||R.push(Ai());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(y(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||m(),i},removeFromSpatialMap:v,insertIntoSpatialMap:y,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||m();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let $=this.getAt(j);if($.some(Y=>Y.isObstacle))return!0;let G=null;for(let Y of $)if(Y.has("area")){let te=Y.worldArea().raycast(M,R);te&&(G?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((W,re)=>W.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var tc=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),rc=de(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=de(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),nc=de(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Is=de(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=de(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=de(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=de(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=de(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),sc=de(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Hl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideUpdate");function Gl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideEnd");function mn(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Is(t,e),jl((r,n)=>{n===t&&e(r)})}o(mn,"forAllCurrentAndFuture");var ic=de(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return mn(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),sr.join(r)});function Kl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),sr.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),sr.join(r)}o(Wl,"onHoverUpdate");function Xl(t,e){let r=[];return mn(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),sr.join(r)}o(Xl,"onHoverEnd");function Yl(t){return d.game.events.on("loading",t)}o(Yl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function as(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(as,"onLoad");function Zl(t){if(d.assets.loaded)ui().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Si(...t){d.game.cam.pos=C(...t)}o(Si,"setCamPos");function Mi(){return d.game.cam.pos?d.game.cam.pos.clone():hn()}o(Mi,"getCamPos");function Pi(...t){d.game.cam.scale=C(...t)}o(Pi,"setCamScale");function Ci(){return d.game.cam.scale.clone()}o(Ci,"getCamScale");function qi(t){d.game.cam.angle=t}o(qi,"setCamRot");function ki(){return d.game.cam.angle}o(ki,"getCamRot");function yn(){return d.game.cam.transform.clone()}o(yn,"getCamTransform");function Ti(t=ue(255,255,255),e=1){let r=d.game.root.add([li(Me(),Ce()),ii(t),ai(1),Ei()]),n=r.fadeOut(e);return n.onEnd(()=>Di(r)),n}o(Ti,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function jn(t){return d.game.cam.transform.transformPoint(t,C())}o(jn,"toScreen");function Bi(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Bi,"toWorld");function $l(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&Si(...t),Mi()}o($l,"camPos");function eu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Pi(...t),Ci()}o(eu,"camScale");function tu(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&qi(t),ki()}o(tu,"camRot");function ru(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Ti(t,e)}o(ru,"camFlash");function nu(){return Ht("camTransform","getCamTransform"),yn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function os(t=[]){let e=new Map,r=[],n={},s=new es,i=new ke,l=new ke,c=new ke,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,m=null,y=!1,v,g={id:xh(),hidden:!1,transform:new tr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,q=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),q.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=q.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(q.getScale()))),this.parent=f},set paused(f){if(f!==y){y=f;for(let w of h)w.paused=f}},get paused(){return y},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?os(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(q=>w(q))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ge(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Wr(this.scale),nr(this.angle);let w=this.children.sort((S,q)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=q.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(q.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let q=0;q{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var q;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(m=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),m=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(lh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),uh.has(T)){let A=T==="add"?()=>{var E;m=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),m=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(q=e.values().find(E=>E[T]!==void 0))==null?void 0:q.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),q=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(q=q.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&q.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=q.findIndex(M=>M.id===A.id);E!==-1&&q.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&q.findIndex(M=>M.id===A.id)==-1&&q.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=q.findIndex(R=>R.id===A.id);M!==-1&&q.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return q},query(f){let w=f.hierarchy||"children",S=f.include,q=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),q&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(q)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(q=>{switch(f){case"fixedUpdate":return i.add(q);case"update":return l.add(q);case"draw":return c.add(q);default:return s.on(f,q)}})(w.bind(this));return m&&m(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,q]of e)f[S]=((w=q.inspect)==null?void 0:w.call(q))??null;for(let[S,q]of r.entries()){if(q.inspect){f[S]=q.inspect();continue}for(let[T,P]of Object.entries(q))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},I=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of I)g[f]=(...w)=>{var q,T;let S=(T=(q=d.app)[f])==null?void 0:T.call(q,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);sr.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(os,"make");var ac=o(()=>({events:new es,root:os([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new k(1),angle:0,shake:0,transform:new tr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function tn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(tn,"getGravityDirection");var oc=Zu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var lc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new gr(lu(t));return t.decodeAudioData(oc.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new ke,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=st(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new ke,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,m=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let y=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),m=!0)},"start"),v=ol(t);v instanceof it&&v.onLoad(y);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),I=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)m&&(s.stop(),m=!1),p=r.currentTime;else{s=I(s);let w=p-u;s.start(0,w),m=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=I(s),u=p-f):(s.stop(),s=I(s),u=r.currentTime-f,s.start(0,f),m=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Ii(t){return d.k.play(d.audio.burpSnd,t)}o(Ii,"burp");function Ri(t){d.audio.masterNode.gain.value=t}o(Ri,"setVolume");function Fi(){return d.audio.masterNode.gain.value}o(Fi,"getVolume");function cu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ri(t),Fi()}o(cu,"volume");function Oi(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Gi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Vn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ln(st(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Ii())}o(Oi,"initEvents");function du(t,e={}){let r=d.game.root.add([ln(t),bi()]),n=(e.speed||1)*5,s=e.scale||1;r.add([Un(d.boomSprite),un(0),zn("center"),ks(n,s),...e.comps??[]]);let i=r.add([Un(d.kaSprite),un(0),zn("center"),Nn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(ks(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Li(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Li,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Ht("layers","setLayers"),Li(t,e)}o(gu,"layers");function Di(t){t.destroy()}o(Di,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Oi(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new tr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Rs(t){return d.game.events.on("sceneLeave",t)}o(Rs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function et(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(et,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Wr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Wr,"pushScaleV");function nr(t){t&&d.gfx.transform.rotateSelf(t)}o(nr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ge(){d.gfx.renderer.flush(Me(),Ce())}o(Ge,"flush");function Me(){return d.gfx.width}o(Me,"width");function Ce(){return d.gfx.height}o(Ce,"height");function Ui(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Ui,"getViewportScale");function vu(t){return new k(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new k((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Ce()/d.gfx.viewport.height)}o(bu,"windowToContent");function ls(){return bu(d.app.mousePos())}o(ls,"mousePos");function hn(){return C(Me()/2,Ce()/2)}o(hn,"center");var Vr,Ni=(Vr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Vr,"Picture"),Vr),uc=new Kn;function zi(t,e){let r=Me(),n=Ce();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,m=null;for(let y of t.commands){let v=y.material.tex??d.gfx.defTex,g=y.material.shader??d.gfx.defShader;y.material.blend&&d.gfx.renderer.setBlend(y.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?uc:yn(),transform:s})),y.material.uniform&&(g==null||g.send(y.material.uniform)),v!=m&&(m==null||m.unbind(),v==null||v.bind(),m=v),l.drawElements(l.TRIANGLES,y.count,l.UNSIGNED_SHORT,y.index*2)}p==null||p.unbind(),m==null||m.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(zi,"drawPicture");function Eu(t){t??(t=new Ni),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new Ni),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new cc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var er,Mt=(er=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new er(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(er,"Texture"),er),la=new Kn,Hr,hc=(Hr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,I=this.picture.vertices.length/this.stride,f=r.length;for(let q=0;qthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let m=this.vqueue.length/this.stride,y=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Bt,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(rs(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Bt(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Bt(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[m,y]=Bt(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Bt(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[I,f]=Bt(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Bt(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[q,T]=Bt(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:m,popElementArrayBuffer:y,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:I,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:q,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Kr,Vn=(Kr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Mt(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Kr,"FrameBuffer"),Kr),lr=new k;function qt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof it)return;let p=d.gfx.transform,m=t.pos.length/2,y=new Array(m*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),qt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&hs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(Pt,"drawPolygon");function us(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ir(t.anchor??"center").scale(new k(-t.radiusX,-t.radiusY)),s=fr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&Pt(Object.assign({},i,{outline:null})),Pt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Pt(i)}o(us,"drawEllipse");function ar(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&us(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(ar,"drawCircle");function pr(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??ne.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};qt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(pr,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(-1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=I,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),I=Math.PI/g,f=h.scale(1),w=Math.cos(I),S=Math.sin(I);for(let q=0;q0){let P=u.add(T),A=Math.max(n,10),E=fe(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||ne.WHITE,opacity:t.opacity??1}));let m=[],y=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return qu(t);case"miter":return ku(t)}if(t.radius&&e.length>=3){pr(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;n_n(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ne.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,m=l.x+u,y=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),nr(t.angle),Wr(t.scale),et(s,i),qt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?m+v:m,t.flipY?y:y+g,t.flipX?m+v:m,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y+g:y,t.flipX?m:m+v,t.flipY?y:y+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(zt,"drawUVQuad");function Bu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Bu,"drawCanvas");var fs={};function Fs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Fs,"applyCharTransform");function Hn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Hn,"compileStyledText");function jt(t){var q,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=hi(t.font);if(!t.text||t.text===""||e instanceof it||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Hn(t.text+""),s=mo(n);if(e instanceof In||typeof e=="string"){let A=e instanceof In?e.fontface.family:e,E=e instanceof In?{outline:e.outline,filter:e.filter}:{outline:null,filter:vs},M=fs[A]??{font:{tex:new Mt(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new k(0),maxHeight:0,outline:E.outline};fs[A]||(fs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((q=M.outline)==null?void 0:q.width)??0,((T=M.outline)==null?void 0:T.width)??0);let $=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update($,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,m=0,y=[],v=[],g=0,I=null,f=0,w;for(;gt.width&&(m+=i+c,I!=null&&(g-=v.length-I,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,I-1),u=f),I=null,f=0,y.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new we(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new k(u,m),opacity:t.opacity??1,color:t.color??ne.WHITE,scale:C(l),angle:0}),A===" "&&(I=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}y.push({width:u-h,chars:v}),m+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Vt,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ir(t.anchor||$n).add(1,1).scale(new k(e,r).scale(-.5)),s=[new k(0,0),new k(e,0),new k(e,r),new k(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new k(l[0],0),...l[1]?fr(new k(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?fr(new k(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?fr(new k(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?fr(new k(l[0],l[0]),l[0],l[0],180,270):[]]}Pt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function St(t){Ge();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ge(),d.gfx.width=e,d.gfx.height=r}o(St,"drawUnscaled");function Os(t,e){St(()=>{let r=C(8);He(),Qe(t);let n=jt({text:e,font:On,size:16,pos:r,color:ue(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=Ce()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),Ue()})}o(Os,"drawInspectText");function Vi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Pt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Vi,"drawTriangle");function Iu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Os(vu(ls()),e.join(` -`))}Os(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&St(()=>{He(),et(Me(),0),et(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&St(()=>{He(),et(Me(),Ce()),et(-8,-8);let t=8,e=jt({text:d.debug.timeScale.toFixed(1),font:On,size:16,color:ue(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Vi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Vt(e),Ue()}),d.debug.curRecording&&St(()=>{He(),et(0,Ce()),et(24,-24),ar({radius:12,color:ue(255,0,0),opacity:zs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&St(()=>{He(),et(0,Ce()),et(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Gn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=jt({text:e.join(` -`),font:On,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),Ue()})}o(Iu,"drawDebug");function Gn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Gn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Gn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):St(()=>{let e=Me()/2,r=24,n=C(Me()/2,Ce()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:Ce(),color:ue(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Hi(t,e,r){let n=d.gfx.ggl.gl;Ge(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ge(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ge(),n.disable(n.STENCIL_TEST)}o(Hi,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Hi(t,e,r.EQUAL)}o(Ou,"drawMasked");function cn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=k.ONE;if(t.tiled){let c=ir(t.anchor||$n),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,m=(t.height||n)/n,y=Math.floor(p),v=Math.floor(m),g=p-y,I=m-v,f=(y+g?1:0)*(v+I?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},q=0,T=t.color||ne.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[q*6+0]=q*4+0,w[q*6+1]=q*4+1,w[q*6+2]=q*4+3,w[q*6+3]=q*4+1,w[q*6+4]=q*4+2,w[q*6+5]=q*4+3;let O=q*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,q++},"addQuad");for(let E=0;E{let r=is(e,bs,Es),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Vn(e,t.width*n*s,t.height*n*s):new Vn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new hc(e,ti,sh,ih),m=Mt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),y=new Array(32).fill(0).map(v=>new tr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new tr,transformStack:y,transformStackIndex:-1,bgTex:m,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Gi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Gi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),fc="data:image/png;base64,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",pc="data:image/png;base64,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",gc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,mc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=r.width,K=r.height;i.push(`width: ${N}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ch({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],m=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!m)throw new Error("WebGL not supported");let y=m,v=Pu(y,{texFilter:t.texFilter}),g=dc(t,v);d.gfx=g;let I=lc();d.audio=I;let f=Wh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ac();d.game=w,w.root.use(Nn()),ua("collision",wt,[4,3]);function S(N,K){let J=new Vn(v,N,K);return{clear:o(()=>J.clear(),"clear"),free:o(()=>J.free(),"free"),toDataURL:o(()=>J.toDataURL(),"toDataURL"),toImageData:o(()=>J.toImageData(),"toImageData"),width:J.width,height:J.height,draw:o(ae=>{Ge(),J.bind(),ae(),Ge(),J.unbind()},"draw"),get fb(){return J}}}o(S,"makeCanvas");function q(){y.clear(y.COLOR_BUFFER_BIT),g.frameBuffer.bind(),y.clear(y.COLOR_BUFFER_BIT),g.bgColor||St(()=>{zt({width:Me(),height:Ce(),quad:new we(0,0,Me()/64,Ce()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(q,"frameStart");function T(N,K){g.postShader=N,g.postShaderUniform=K??null}o(T,"usePostEffect");function P(){Ge(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),y.viewport(0,0,y.drawingBufferWidth,y.drawingBufferHeight);let N=g.width,K=g.height;g.width=y.drawingBufferWidth/l,g.height=y.drawingBufferHeight/l,cn({flipY:!0,tex:g.frameBuffer.tex,pos:new k(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ge(),g.width=N,g.height=K}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:oe,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let K=t.logMax??8,J=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:J,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:o(N=>E.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>Y("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(N){A=N,N?I.ctx.suspend():I.ctx.resume()}};d.debug=E;function M(N,K){try{return JSON.parse(window.localStorage[N])}catch{return K?(R(N,K),K):null}}o(M,"getData");function R(N,K){window.localStorage[N]=JSON.stringify(K)}o(R,"setData");function L(N,...K){let J=N(Se),ae;typeof J=="function"?ae=J(...K)(Se):ae=J;for(let ve in ae)Se[ve]=ae[ve],t.global!==!1&&(window[ve]=ae[ve]);return Se}o(L,"plug");function D(N){let K=u.canvas.captureStream(N),J=I.ctx.createMediaStreamDestination();I.masterNode.connect(J);let ae=new MediaRecorder(K),ve=[];return ae.ondataavailable=Ae=>{Ae.data.size>0&&ve.push(Ae.data)},ae.onerror=()=>{I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),I.masterNode.disconnect(J),K.getTracks().forEach(Ae=>Ae.stop()),new Promise(Ae=>{ae.onstop=()=>{Ae(new Blob(ve,{type:"video/mp4"}))}})},download(Ae="kaboom.mp4"){this.stop().then(_e=>Ss(Ae,_e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),$=w.root.readd.bind(w.root),G=w.root.removeAll.bind(w.root),Y=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),W=w.root.loop.bind(w.root),re=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),V=mr(null,pc),X=mr(null,fc);d.kaSprite=V,d.boomSprite=X;function le(){w.root.fixedUpdate()}o(le,"fixedUpdateFrame");function oe(){w.root.update()}o(oe,"updateFrame");const ot=class ot{constructor(K,J,ae,ve,Ae=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=K,this.target=J,this.normal=ae,this.distance=ve,this.resolved=Ae}get displacement(){return this.normal.scale(this.distance)}reverse(){return new ot(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(ot,"Collision");let Fe=ot;function Te(N,K){if(K.paused||!K.exists())return!1;for(let ae of N.collisionIgnore)if(K.is(ae))return!1;for(let ae of K.collisionIgnore)if(N.is(ae))return!1;let J=Ps(N.worldArea(),K.worldArea());if(J){let ae=new Fe(N,K,J.normal,J.distance);N.trigger("collideUpdate",K,ae);let ve=ae.reverse();ve.resolved=ae.resolved,K.trigger("collideUpdate",N,ve)}return!0}o(Te,"narrowPhase");let xe=new Hh,We=!1;function yt(){if(Bs()){if(!We){We=!0,Is(N=>{N.has("area")&&xe.add(N)}),ia(N=>{xe.remove(N)}),aa((N,K)=>{K==="area"&&xe.add(N)}),oa((N,K)=>{K==="area"&&xe.remove(N)}),Rs(N=>{We=!1,xe.clear()});for(let N of Y("*",{recursive:!0}))N.has("area")&&xe.add(N)}xe.update();for(let[N,K]of xe)Te(N,K)}}o(yt,"broadPhase");function wt(){if(Bs())return yt()}o(wt,"checkFrame");function ge(N){if(ha)return;ha=!0,console.error(N),I.ctx.suspend();let K=N.message??String(N)??"Unknown error, check console for more info",J=!1;u.run(()=>{},()=>{J||(J=!0,q(),St(()=>{let ae=Me(),ve=Ce(),Ae={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:On,fixed:!0};Ne({width:ae,height:ve,color:ue(0,0,255),fixed:!0});let _e=jt({...Ae,text:"Error",pos:C(32),color:ue(255,128,0),fixed:!0});Vt(_e),Ls({...Ae,text:K,pos:C(32,32+_e.height+16),fixed:!0}),Ue(),w.events.trigger("error",N)}),P())})}o(ge,"handleErr"),d.handleErr=ge;function Xe(N){p.push(N)}o(Xe,"onCleanup");function Ye(){w.events.onOnce("frameEnd",()=>{u.quit(),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT|y.STENCIL_BUFFER_BIT);let N=y.getParameter(y.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}o(Ye,"quit");let qe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let N of d.systemsByEvent[1])N.run();le();for(let N of d.systemsByEvent[4])N.run()}}catch(N){ge(N)}},(N,K)=>{try{if(N(),f.loaded||Nt()===1&&!qe&&(f.loaded=!0,ui().forEach(J=>w.events.trigger("loadError",...J)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||qe)q(),Fu(),P();else{if(!E.paused){for(let J of d.systemsByEvent[0])J.run();oe();for(let J of d.systemsByEvent[3])J.run()}q();for(let J of d.systemsByEvent[2])J.run();Ru(),t.debug!==!1&&Iu();for(let J of d.systemsByEvent[5])J.run();P()}qe&&(qe=!1),w.events.trigger("frameEnd"),K()}catch(J){ge(J)}}),Gi(),Oi();let Se={_k:d,VERSION:gc,loadRoot:Zo,loadProgress:Nt,loadSprite:mr,loadSpriteAtlas:mi,loadSound:ll,loadMusic:ul,loadBitmapFont:fi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:Dn,getSound:gi,getFont:ci,getBitmapFont:di,getSprite:yi,getShader:pi,getAsset:$o,Asset:it,SpriteData:rr,SoundData:gr,width:Me,height:Ce,center:hn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:as,onLoadError:Zl,onLoading:Yl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:Xe,flash:Ti,setCamPos:Si,getCamPos:Mi,setCamRot:qi,getCamRot:ki,setCamScale:Pi,getCamScale:Ci,getCamTransform:yn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:jn,toWorld:Bi,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:tn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:os,destroy:Di,destroyAll:G,get:Y,query:re,readd:$,pos:ln,scale:un,rotate:Dl,color:ii,blend:Uo,opacity:ai,anchor:zn,area:Sl,sprite:Un,text:cl,polygon:Xo,rect:li,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Go,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:ql,pointEffector:kl,buoyancyEffector:Il,platformEffector:Bl,constantForce:Tl,doubleJump:Pl,shader:Yo,textInput:El,timer:Nn,fixed:Ei,stay:bi,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Ho,drawon:zo,raycast:oi,tile:Ai,animate:wl,serializeAnimation:vi,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:ec,trigger:tc,on:ze,onFixedUpdate:rc,onUpdate:zl,onDraw:nc,onAdd:Is,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:sc,onClick:ic,onCollide:Vl,onCollideUpdate:Hl,onCollideEnd:Gl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Xl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:ls,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:W,wait:te,play:hu,setVolume:Ri,getVolume:Fi,volume:cu,burp:Ii,audioCtx:I.ctx,Line:Ke,Rect:pe,Circle:Le,Ellipse:at,Point:th,Polygon:Re,Vec2:k,Color:ne,Mat4:Kn,Mat23:tr,Quad:we,RNG:ya,rand:Pe,randi:js,randSeed:wa,vec2:C,rgb:ue,hsl2rgb:_u,quad:Ee,choose:va,chooseMultiple:xa,shuffle:Vs,chance:Aa,lerp:Oe,tween:ee,easings:an,map:nt,mapc:ma,wave:zs,deg2rad:fe,rad2deg:Ct,clamp:st,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:_n,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ha,evaluateCatmullRom:Ga,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:Zs,normalizedCurve:Wa,hermite:Yr,cardinal:_s,catmullRom:sn,bezier:Xa,kochanekBartels:Ya,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Wn,testRectRect:Hs,testRectLine:Xn,testRectPoint:dn,testCirclePolygon:fn,testLinePoint:Yn,testLineCircle:Xr,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Ps,isConvex:io,triangulate:ei,NavMesh:Vh,drawSprite:Lu,drawText:Ls,formatText:jt,drawRect:Ne,drawLine:pr,drawLines:hs,drawTriangle:Vi,drawCircle:ar,drawEllipse:us,drawUVQuad:zt,drawPolygon:Pt,drawCurve:ji,drawBezier:Tu,drawFormattedText:Vt,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:zi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Wr,pushRotate:nr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Bu,Picture:Ni,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Rs,layers:gu,getLayers:fu,setLayers:Li,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ts,downloadJSON:fo,downloadText:ri,downloadBlob:Ss,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:k.LEFT,RIGHT:k.RIGHT,UP:k.UP,DOWN:k.DOWN,RED:ne.RED,GREEN:ne.GREEN,BLUE:ne.BLUE,YELLOW:ne.YELLOW,MAGENTA:ne.MAGENTA,CYAN:ne.CYAN,WHITE:ne.WHITE,BLACK:ne.BLACK,quit:Ye,KEvent:ke,KEventHandler:es,KEventController:sr,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=Se;let Kt=t.plugins;if(Kt&&Kt.forEach(L),t.global!==!1)for(let N in Se)window[N]=Se[N];return t.focus!==!1&&u.canvas.focus(),Se},"kaplay"),yc=mc;function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const wc=Uu()?640:1920,Ac=Uu()?480:1080,a=yc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:wc,height:Ac,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const xc=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { +`,oh=new Set(["id","require"]),lh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),uh=200,hh=640,ch=65536,lo=Symbol.for("kaplay.cancel"),Er,dh=(Er=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(Er,"Registry"),Er),$t,ir=($t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new $t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o($t,"KEventController"),$t),Sr,qe=(Sr=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new dh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new ir(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Sr,"KEvent"),Sr),Mr,ns=(Mr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new qe),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(Mr,"KEventHandler"),Mr),fh=o(t=>t[0]instanceof se,"arrayIsColor"),ph=o(t=>t[0]instanceof q,"arrayIsVec2"),gh=o(t=>typeof t[0]=="number","arrayIsNumber"),Pr,uo=(Pr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),mh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function is(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!is(c,h))return!1}return!0}return!1}o(is,"deepEq");var _i=new Set,yh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Kt(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Kt,"deprecateMsg");function Nn(t,e){return Number(t.toFixed(e))}o(Nn,"toFixed");function fe(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(fe,"overload2");var wh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Wt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ft=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),En=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),Ah=(()=>{let t=0;return()=>t++})(),xh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},vh=o(()=>Jt.lastInputDevice,"getLastInputDeviceType"),bh=o(()=>{let t=Jt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{En(Jt.buttonsByKey,l,e)}),n&&n.forEach(l=>{En(Jt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{En(Jt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{En(Jt.buttonsByMouse,l,e)})}},"parseButtonBindings"),Cr,rn=(Cr=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Cr,"ButtonState"),Cr),kr,Eh=(kr=class{constructor(){b(this,"buttonState",new rn);b(this,"stickState",new Map)}},o(kr,"GamepadState"),kr),qr,Sh=(qr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(qr,"FPSCounter"),qr),Jt,$i=xh,Mh=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Sh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new q(0),mouseDeltaPos:new q(0),keyState:new rn,mouseState:new rn,mergedGamepadState:new Eh,gamepadStates:new Map,lastInputDevice:null,buttonState:new rn,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new ns}},"initAppState"),Ph=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Mh(t);Jt=e,bh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function y(){return e.canvas.style.cursor}o(y,"getCursor");function m(x){if(x)try{let I=e.canvas.requestPointerLock();I!=null&&I.catch&&I.catch(F=>console.error(F))}catch(I){console.error(I)}else document.exitPointerLock()}o(m,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function B(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(B,"exitFullscreen");function f(x=!0){x?g(e.canvas):B()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(be),I=Object.entries(hr),F=Object.entries(cr);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of I)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function k(x,I){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(de=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Be=de/1e3,Ee=Math.min(Be-e.realTime,.25),xt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,z+=Ee,z>xt){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ft(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ft(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ft(e.keyState.down,x)}o(j,"isKeyDown");function _(x){return x===void 0?e.keyState.released.size>0:ft(e.keyState.released,x)}o(_,"isKeyReleased");function K(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ft(e.mergedGamepadState.buttonState.pressed,x)}o(K,"isGamepadButtonPressed");function J(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ft(e.mergedGamepadState.buttonState.down,x)}o(J,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ft(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function ne(x){return x===void 0?e.buttonState.pressed.size>0:ft(e.buttonState.pressed,x)}o(ne,"isButtonPressed");function W(x){return x===void 0?e.buttonState.down.size>0:ft(e.buttonState.down,x)}o(W,"isButtonDown");function re(x){return x===void 0?e.buttonState.released.size>0:ft(e.buttonState.released,x)}o(re,"isButtonReleased");function G(x){var I;return(I=e.buttons)==null?void 0:I[x]}o(G,"getButton");function ve(x,I){e.buttons[x]={...e.buttons[x],...I}}o(ve,"setButton");function je(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(je,"pressButton");function Ve(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(Ve,"releaseButton");function Ye(x){return e.events.on("resize",x)}o(Ye,"onResize");let Y=fe(x=>e.events.on("keyDown",x),(x,I)=>e.events.on("keyDown",F=>Je(x,F)&&I(F))),ee=fe(x=>e.events.on("keyPress",I=>x(I)),(x,I)=>e.events.on("keyPress",F=>Je(x,F)&&I(F))),oe=fe(x=>e.events.on("keyPressRepeat",x),(x,I)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&I(F))),Te=fe(x=>e.events.on("keyRelease",x),(x,I)=>e.events.on("keyRelease",F=>Je(x,F)&&I(F))),_e=fe(x=>e.events.on("mouseDown",I=>x(I)),(x,I)=>e.events.on("mouseDown",F=>Je(x,F)&&I(F))),ut=fe(x=>e.events.on("mousePress",I=>x(I)),(x,I)=>e.events.on("mousePress",F=>Je(x,F)&&I(F))),At=fe(x=>e.events.on("mouseRelease",I=>x(I)),(x,I)=>e.events.on("mouseRelease",F=>F===x&&I(F)));function ht(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(ht,"onMouseMove");function Xe(x){return e.events.on("charInput",x)}o(Xe,"onCharInput");function le(x){return e.events.on("touchStart",x)}o(le,"onTouchStart");function Ie(x){return e.events.on("touchMove",x)}o(Ie,"onTouchMove");function Le(x){return e.events.on("touchEnd",x)}o(Le,"onTouchEnd");function U(x){return e.events.on("scroll",x)}o(U,"onScroll");function H(x){return e.events.on("hide",x)}o(H,"onHide");function X(x){return e.events.on("show",x)}o(X,"onShow");let ae=fe(x=>e.events.on("gamepadButtonPress",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&I(F,z))),Pe=fe(x=>e.events.on("gamepadButtonDown",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&I(F,z))),xe=fe(x=>e.events.on("gamepadButtonRelease",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&I(F,z)));function $e(x,I){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&I(z,Q))}o($e,"onGamepadStick");function lr(x){return e.events.on("gamepadConnect",x)}o(lr,"onGamepadConnect");function vn(x){return e.events.on("gamepadDisconnect",x)}o(vn,"onGamepadDisconnect");function N(x){return e.mergedGamepadState.stickState.get(x)||new q(0)}o(N,"getGamepadStick");function V(){return[...e.charInputted]}o(V,"charInputted");function $(){return[...e.gamepads]}o($,"getGamepads");let ue=fe(x=>e.events.on("buttonPress",I=>x(I)),(x,I)=>e.events.on("buttonPress",F=>Je(x,F)&&I(F))),ge=fe(x=>e.events.on("buttonDown",I=>x(I)),(x,I)=>e.events.on("buttonDown",F=>Je(x,F)&&I(F))),et=fe(x=>e.events.on("buttonRelease",I=>x(I)),(x,I)=>e.events.on("buttonRelease",F=>Je(x,F)&&I(F)));function ct(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),me()}o(ct,"processInput");function It(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,I)=>{e.mergedGamepadState.stickState.set(I,new q(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new q(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((I,F)=>{x.stickState.set(F,new q(0))})})}o(It,"resetInput");function ur(x){let I={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(I),e.gamepadStates.set(x.index,{buttonState:new rn,stickState:new Map([["left",new q(0)],["right",new q(0)]])}),I}o(ur,"registerGamepad");function bn(x){e.gamepads=e.gamepads.filter(I=>I.index!==x.index),e.gamepadStates.delete(x.index)}o(bn,"removeGamepad");function me(){var x,I;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&ur(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,de=e.gamepadStates.get(F.index);if(de){for(let Be=0;Be{e.buttonState.press(vt),e.events.trigger("buttonPress",vt)})),e.mergedGamepadState.buttonState.press(Ee),de.buttonState.press(Ee),e.events.trigger("gamepadButtonPress",Ee,F)}else de.buttonState.down.has(Ee)&&(dt&&((I=e.buttonsByGamepad.get(Ee))==null||I.forEach(vt=>{e.buttonState.release(vt),e.events.trigger("buttonRelease",vt)})),e.mergedGamepadState.buttonState.release(Ee),de.buttonState.release(Ee),e.events.trigger("gamepadButtonRelease",Ee,F))}for(let Be in Q.sticks){let Ee=Q.sticks[Be];if(!Ee)continue;let xt=new q(z.axes[Ee.x],z.axes[Ee.y]);de.stickState.set(Be,xt),e.mergedGamepadState.stickState.set(Be,xt),e.events.trigger("gamepadStick",Be,xt,F)}}}}o(me,"processGamepad");let be={},hr={},cr={},Yi=t.pixelDensity||1;be.mousemove=x=>{let I=new q(x.offsetX,x.offsetY),F=new q(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Yi,Q=e.canvas.height/Yi,de=window.innerWidth,Be=window.innerHeight,Ee=de/Be,xt=z/Q;if(Ee>xt){let dt=Be/Q,vt=(de-z*dt)/2;I.x=it(x.offsetX-vt,0,z*dt,0,z),I.y=it(x.offsetY,0,Q*dt,0,Q)}else{let dt=de/z,vt=(Be-Q*dt)/2;I.x=it(x.offsetX,0,z*dt,0,z),I.y=it(x.offsetY-vt,0,Q*dt,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=I,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Xi=["left","middle","right","back","forward"];be.mousedown=x=>{e.events.onOnce("input",()=>{var F;let I=Xi[x.button];I&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(I),e.events.trigger("mousePress",I))})},be.mouseup=x=>{e.events.onOnce("input",()=>{var F;let I=Xi[x.button];I&&(e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(I),e.events.trigger("mouseRelease",I))})};let Wu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};be.keydown=x=>{Wu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(I===void 0)throw new Error(`Unknown key: ${x.key}`);I.length===1?(e.events.trigger("charInput",I),e.charInputted.push(I)):I==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(I),e.events.trigger("keyPressRepeat",I)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(de=>{e.buttonState.press(de),e.events.trigger("buttonPress",de)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(de=>{e.buttonState.press(de),e.events.trigger("buttonPress",de)})),e.keyState.press(I),e.events.trigger("keyPressRepeat",I),e.events.trigger("keyPress",I))})},be.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(de=>{e.buttonState.release(de),e.events.trigger("buttonRelease",de)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(de=>{e.buttonState.release(de),e.events.trigger("buttonRelease",de)})),e.keyState.release(I),e.events.trigger("keyRelease",I)})},be.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),I.forEach(Q=>{e.events.trigger("touchStart",new q(Q.clientX-F.x,Q.clientY-F.y),Q)})})},be.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}I.forEach(z=>{e.events.trigger("touchMove",new q(z.clientX-F.x,z.clientY-F.y),z)})})},be.touchend=x=>{e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=new q(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(Q=>{e.events.trigger("touchEnd",new q(Q.clientX-F.x,Q.clientY-F.y),Q)})})},be.touchcancel=x=>{e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(z=>{e.events.trigger("touchEnd",new q(z.clientX-F.x,z.clientY-F.y),z)})})},be.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new q(x.deltaX,x.deltaY))})},be.contextmenu=x=>x.preventDefault(),hr.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},cr.gamepadconnected=x=>{let I=ur(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",I)})},cr.gamepaddisconnected=x=>{let I=$().filter(F=>F.index===x.gamepad.index)[0];bn(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",I)})};for(let[x,I]of Object.entries(be))e.canvas.addEventListener(x,I);for(let[x,I]of Object.entries(hr))document.addEventListener(x,I);for(let[x,I]of Object.entries(cr))window.addEventListener(x,I);let Qi=new ResizeObserver(x=>{for(let I of x)if(I.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:k,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:$,getCursor:y,setCursorLocked:m,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:_,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:K,isGamepadButtonDown:J,isGamepadButtonReleased:te,getGamepadStick:N,isButtonPressed:ne,isButtonDown:W,isButtonReleased:re,setButton:ve,getButton:G,pressButton:je,releaseButton:Ve,charInputted:V,onResize:Ye,onKeyDown:Y,onKeyPress:ee,onKeyPressRepeat:oe,onKeyRelease:Te,onMouseDown:_e,onMousePress:ut,onMouseRelease:At,onMouseMove:ht,onCharInput:Xe,onTouchStart:le,onTouchMove:Ie,onTouchEnd:Le,onScroll:U,onHide:H,onShow:X,onGamepadButtonDown:Pe,onGamepadButtonPress:ae,onGamepadButtonRelease:xe,onGamepadStick:$e,onGamepadConnect:lr,onGamepadDisconnect:vn,onButtonPress:ue,onButtonDown:ge,onButtonRelease:et,getLastInputDeviceType:vh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),Ch=new q(-1,-1),kh=new q(0,-1),qh=new q(1,-1),Th=new q(-1,0),Ih=new q(0,0),Bh=new q(1,0),Rh=new q(-1,1),Fh=new q(0,1),Oh=new q(1,1);function ar(t){switch(t){case"topleft":return Ch;case"top":return kh;case"topright":return qh;case"left":return Th;case"center":return Ih;case"right":return Bh;case"botleft":return Rh;case"bot":return Fh;case"botright":return Oh;default:return t}}o(ar,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var Sn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Rn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Sn+1)*2*t-Sn)/2:(Math.pow(2*t-2,2)*((Sn+1)*(t*2-2)+Sn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Rn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Rn.easeOutBounce(1-2*t))/2:(1+Rn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},un=Rn,Tr,Lh=(Tr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new q(e.x,e.y);return q.unit(r,r),q.scale(r,this.radius,r),q.add(r,this.center,r),r}},o(Tr,"CircleCollider"),Tr),Ir,Dh=(Ir=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new q(e.x,e.y);return q.unit(r,r),q.scalec(r,this.radiusX,this.radiusY,r),q.add(r,this.center,r),r}else{let r=new q(e.x,e.y);return q.rotateByAngle(r,-this.angle,r),q.unit(r,r),q.scalec(r,this.radiusX,this.radiusY,r),q.rotateByAngle(r,this.angle,r),q.add(r,this.center,r),r}}},o(Ir,"EllipseCollider"),Ir),Br,ps=(Br=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Br,"PolygonCollider"),Br);function ii(t,e,r){let n=new q(-r.x,-r.y),s=t.support(r),i=e.support(n);return new q(s.x-i.x,s.y-i.y)}o(ii,"calculateSupport");function ko(t,e,r,n){var s=ii(e,r,n);return t.push(s),n.dot(s)>=0}o(ko,"addSupport");function Fn(t,e,r){let n=t.x*e.y-t.y*e.x;return new q(-n*r.y,n*r.x)}o(Fn,"tripleProduct");function ai(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new q(t[1].x-t[0].x,t[1].y-t[0].y),c=new q(-t[0].x,-t[0].y),h=Fn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new q(-t[2].x,-t[2].y),c=new q(t[1].x-t[2].x,t[1].y-t[2].y),h=new q(t[0].x-t[2].x,t[0].y-t[2].y);var s=Fn(h,c,c),i=Fn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return ko(t,e,r,n)?2:0}o(ai,"evolveSimplex");function qo(t,e){let r=[],n=new q;for(var s=2;s===2;)s=ai(r,t,e,n);return s===1}o(qo,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new q,s=0,i=new q,l=new q;for(let h=0;h=t.length&&(u=0),q.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}q.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new q;for(let m=0;mc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(Fr,"NavPolygon"),Fr),Or,jh=(Or=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new zh(this._polygons.length),n=e.map((s,i)=>new Nh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Or,"NavMesh"),Or);function Qt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Qt,"calcTransform");function wr(t,e,r,n,s,i=1){n=ye(n%360),s=ye(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/ye(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let y=0;y<=c;y++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(wr,"getArcPts");var Lr,na=(Lr=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Lr,"Edge"),Lr),Dr,Vh=(Dr=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Qt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Go(t="intersect"){return{id:"mask",mask:t}}o(Go,"mask");function li(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Nn(this.opacity,1)}`}}}o(li,"opacity");function Ho(t=1,e=ce(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Ho,"outline");var Ur,Gh=(Ur=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Ur,"Particle"),Ur);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[se.WHITE],i=t.opacities||[1],l=t.quads||[new Ae(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],y=t.angle||[0,0],m=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],B=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&k.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Yo,"polygon");function ui(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Ct.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new q(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new q(e.width,e.height),texture:s}),this.lastTextureId++,[s,new Ae(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Nr,"TexPacker"),Nr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var er,ot=(er=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new qe);b(this,"onErrorEvents",new qe);b(this,"onFinishEvents",new qe);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new er(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o(er,"Asset"),er),zr,dr=(zr=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new ot(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=ot.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(zr,"AssetBucket"),zr);function os(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(os,"fetchURL");function yn(t){return os(t).then(e=>e.json())}o(yn,"fetchJSON");function Jo(t){return os(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return os(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,yn(Ze(e)))}o(_o,"loadJSON");function wn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(wn,"loadImg");function jt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(jt,"loadProgress");function ci(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ci,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function zn(t){return d.assets.custom.add(null,t)}o(zn,"load");var Kh=o((t,e)=>({urlPrefix:"",sprites:new dr,fonts:new dr,bitmapFonts:new dr,sounds:new dr,shaders:new dr,custom:new dr,music:{},packer:new Hh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=mh(e)+".json");let n=typeof r=="string"?yn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new Ae(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return nr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Wh="data:image/png;base64,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",jr,On=(jr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",bs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??bs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ce(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(jr,"FontData"),jr);function di(t){if(!t)return di(d.globalOpt.font??th);if(typeof t=="string"){let e=pi(t),r=fi(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(jt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof ot)return t.data?t.data:t;return t}o(di,"resolveFont");function fi(t){return d.assets.fonts.get(t)??null}o(fi,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new On(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new Ae(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function pi(t){return d.assets.bitmapFonts.get(t)??null}o(pi,"getBitmapFont");function gi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,wn(i).then(l=>rl(Ct.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(gi,"loadBitmapFont");var Yh=o((t="happy",e)=>gi(t,Wh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await yn(e):e,s=await Promise.all(n.frames.map(wn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await vr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Vr,Xh=(Vr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Xn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof rr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof se)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof q)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],gh(s)?r.uniform1fv(i,s):ph(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):fh(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Vr,"Shader"),Vr);function ls(t,e=Es,r=Ss){let n=ih.replace("{{user}}",e??Es),s=ah.replace("{{user}}",r??Ss);try{return new Xh(t,n,s,ni.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=yh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(ls,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=mi(t);if(e)return e.data??e;if(jt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof ot)return t.data?t.data:t;return t}o(sl,"resolveShader");function mi(t){return d.assets.shaders.get(t)??null}o(mi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,ls(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>ls(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var mt,xr=(mt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new mt(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new mt(r))}static fromURL(e){return po(e)?mt.fromArrayBuffer(co(e)):Qo(e).then(r=>mt.fromArrayBuffer(r))}},o(mt,"SoundData"),mt);function ol(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof xr)return ot.loaded(t);if(t instanceof ot)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function yi(t){return d.assets.sounds.get(t)??null}o(yi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=xr.fromURL(r):r instanceof ArrayBuffer?n=xr.fromArrayBuffer(r):n=Promise.resolve(xr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function wi(t,e){return t=Ze(t),zn(typeof e=="string"?new Promise((r,n)=>{yn(e).then(s=>{wi(t,s).then(r).catch(n)})}):nr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(y=>new Ae(l.x+(i.x+y.x)/c*l.w,l.y+(i.y+y.y)/h*l.h,y.w/c*l.w,y.h/h*l.h)):xi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new nr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(wi,"loadSpriteAtlas");var Jh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",yt,nr=(yt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new Ae(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?yt.fromURL(e,r):Promise.resolve(yt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new Ae(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):xi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new yt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return wn(e).then(n=>yt.fromImage(n,r))}},o(yt,"SpriteData"),yt);function nn(t){if(typeof t=="string"){let e=Ai(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof ot)return t;throw new Error(`Invalid sprite: ${t}`)}}o(nn,"resolveSprite");function Ai(t){return d.assets.sprites.get(t)??null}o(Ai,"getSprite");function vr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?wn(n):Promise.resolve(n))).then(n=>ks(n,r))):d.assets.sprites.addLoaded(t,ks(e,r)):typeof e=="string"?d.assets.sprites.add(t,nr.from(e,r)):d.assets.sprites.addLoaded(t,nr.fromImage(e,r))}o(vr,"loadSprite");function xi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return nr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(ks,"createSpriteSheet");function hl(t="bean"){return vr(t,Jh)}o(hl,"loadBean");function jn(t,e={}){let r=null,n=null,s=null,i=new qe;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,y,m)=>{let v=C(1,1);return y&&m?(v.x=y/(u.width*p.w),v.y=m/(u.height*p.h)):y?(v.x=y/(u.width*p.w),v.y=v.x):m&&(v.y=m/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let y=p.frames[0].clone();e.quad&&(y=y.scale(e.quad));let m=l(p.tex,y,e.width,e.height);if(u.width=p.tex.width*y.w*m.x,u.height=p.tex.height*y.h*m.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let y=Math.abs(u.to-u.from)+1;for(let m=0;m0;m--)p.push(p[m]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new Ae(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=nn(u);p&&p.onLoad(y=>c(this,y))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:y,top:m,bottom:v}=r.slice9,g=r.tex.width*u.w,B=r.tex.height*u.h,f=this.width-p-y,w=this.height-m-v,S=p/g,k=y/g,T=1-S-k,P=m/B,A=v/B,E=1-P-A,M=[Se(0,0,S,P),Se(S,0,T,P),Se(S+T,0,k,P),Se(0,P,S,E),Se(S,P,T,E),Se(S+T,P,k,E),Se(0,P+E,S,A),Se(S,P+E,T,A),Se(S+T,P+E,k,A),Se(0,0,p,m),Se(p,0,f,m),Se(p+f,0,y,m),Se(0,m,p,w),Se(p,m,f,w),Se(p+f,m,y,w),Se(0,m+w,p,v),Se(p,m+w,f,v),Se(p+f,m+w,y,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];pn(Object.assign(wt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else pn(Object.assign(wt(this),{tex:r.tex,quad:u.scale(this.quad??new Ae(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=nn(t);u?u.onLoad(p=>c(this,p)):us(()=>c(this,nn(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let y=r.anims[u];if(y===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof y=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??y.loop??!1,pingpong:p.pingpong??y.pingpong??!1,speed:p.speed??y.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof y=="number"?null:1,this.frame=typeof y=="number"?y:y.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new we(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(jn,"sprite");function cl(t,e={}){function r(s){var l,c;let i=Gt(Object.assign(wt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Wn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Wn(t).text:"",add(){us(()=>r(this))},draw(){Ht(r(this))},renderArea(){return new we(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){Vt(Object.assign(wt(this),{width:this.width,height:this.height}))},renderArea(){return new we(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Ct(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?Vt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new we(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?q.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?q.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let y=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=y},hasLineOfSight(l){let c=ui(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function vi(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(vi,"tile");var Gr,bi=(Gr=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||un.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=un.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Gr,"AnimateChannel"),Gr);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Hr,Qh=(Hr=class extends bi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Fe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Hr,"AnimateChannelNumber"),Hr),Kr,Zh=(Kr=class extends bi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(y,u),v=p[r.x,r.y])})}},o(Kr,"AnimateChannelVec2"),Kr),Wr,_h=(Wr=class extends bi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Wr,"AnimateChannelColor"),Wr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=at(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Qh(s,i,l,t.relative||!1)):i[0]instanceof q?e.push(new Zh(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof se&&e.push(new _h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function Ei(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>Ei(n,n.name))),r}o(Ei,"serializeAnimation");function Ts(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(Ts,"boom");var $h=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=cs())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,un.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new qe,end:new qe,update:new qe,draw:new qe})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let y=typeof r[p]=="string"?[r[p]]:r[p];if(!y.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${y.map(m=>`"${m}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function Si(t){return{id:"stay",stay:!0,scenesToStay:t}}o(Si,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Vn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new qe,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=un.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Fe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Vn,"timer");var Is=0;function Bs(){return Is>0}o(Bs,"usesArea");var bt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!bt&&!sa&&(bt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Is++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Is--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),rt(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/zi(),color:ce(0,0,255)},anchor:this.anchor,fill:!1,fixed:Mt(this)};s instanceof we?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?kt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Oe&&or({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return bt?bt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(bt){let i=Mt(this)?bt.pos:d.k.toWorld(bt.pos);return this.hasPoint(i)}let s=Mt(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){bt&&bt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof we){let l=ar(this.anchor||rs).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Mt(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??hh,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let y=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/y)),h.pos=h.pos.add(u.displacement.scale(-this.mass/y)),Qt(this,this.transform),Qt(h,h.transform)}else{let y=!this.isStatic&&h.isStatic?u:u.reverse();y.source.pos=y.source.pos.add(y.displacement),Qt(y.source,y.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),y=this.vel.project(h.normal),m=this.vel.sub(y);this.vel.dot(h.normal)<0&&(this.vel=m.sub(y.scale(u))),p!=0&&(this.vel=this.vel.sub(m.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Fe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Fe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??ch;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(sn())>0},isJumping(){return this.vel.dot(sn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=sn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function kl(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(kl,"areaEffector");function ql(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(ql,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Il(t={}){return t.ignoreSides??(t.ignoreSides=[q.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Il,"platformEffector");function Bl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(q.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Bl,"buoyancyEffector");function Gn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(Gn,"anchor");function Mi(){return{id:"fixed",fixed:!0}}o(Mi,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?q.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??uh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new we(C(0),Me(),ke());return!gn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function cn(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Mt(this)?r:Hn(r):null}},toScreen(e){let r=this.toWorld(e);return Mt(this)?r:Hn(r)},fromScreen(e){return Mt(this)?this.fromWorld(e):this.fromWorld(Ri(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){or({color:ce(255,0,0),radius:4/zi()})}}}o(cn,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function dn(...t){if(t.length===0)return dn(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof q))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(dn,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([cn(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),y=o(()=>{i=[];for(let A of r.children)m(A)},"createSpatialMap"),m=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,m(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),B=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),k=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(cn(this.tile2Pos(M))),D||R.push(vi());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Qt(O,O.transform),i&&(m(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||y(),i},removeFromSpatialMap:v,insertIntoSpatialMap:m,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||y();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let _=this.getAt(j);if(_.some(J=>J.isObstacle))return!0;let K=null;for(let J of _)if(J.has("area")){let te=J.worldArea().raycast(M,R);te&&(K?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((ne,W)=>ne.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var ec=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),tc=fe(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=fe(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),rc=fe(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Rs=fe(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=fe(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=fe(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=fe(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=fe(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),nc=fe(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Gl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideUpdate");function Hl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideEnd");function An(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Rs(t,e),jl((r,n)=>{n===t&&e(r)})}o(An,"forAllCurrentAndFuture");var sc=fe(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return An(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),ir.join(r)});function Kl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),ir.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),ir.join(r)}o(Wl,"onHoverUpdate");function Yl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),ir.join(r)}o(Yl,"onHoverEnd");function Xl(t){return d.game.events.on("loading",t)}o(Xl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function us(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(us,"onLoad");function Zl(t){if(d.assets.loaded)ci().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Pi(...t){d.game.cam.pos=C(...t)}o(Pi,"setCamPos");function Ci(){return d.game.cam.pos?d.game.cam.pos.clone():fn()}o(Ci,"getCamPos");function ki(...t){d.game.cam.scale=C(...t)}o(ki,"setCamScale");function qi(){return d.game.cam.scale.clone()}o(qi,"getCamScale");function Ti(t){d.game.cam.angle=t}o(Ti,"setCamRot");function Ii(){return d.game.cam.angle}o(Ii,"getCamRot");function xn(){return d.game.cam.transform.clone()}o(xn,"getCamTransform");function Bi(t=ce(255,255,255),e=1){let r=d.game.root.add([hi(Me(),ke()),oi(t),li(1),Mi()]),n=r.fadeOut(e);return n.onEnd(()=>Ni(r)),n}o(Bi,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function Hn(t){return d.game.cam.transform.transformPoint(t,C())}o(Hn,"toScreen");function Ri(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Ri,"toWorld");function $l(...t){return Kt("camPos","setCamPos / getCamPos"),t.length>0&&Pi(...t),Ci()}o($l,"camPos");function eu(...t){return Kt("camScale","setCamScale / getCamScale"),t.length>0&&ki(...t),qi()}o(eu,"camScale");function tu(t){return Kt("camRot","setCamRot / getCamRot"),t!==void 0&&Ti(t),Ii()}o(tu,"camRot");function ru(t=ce(255,255,255),e=1){return Kt("camFlash","flash"),Bi(t,e)}o(ru,"camFlash");function nu(){return Kt("camTransform","getCamTransform"),xn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function hs(t=[]){let e=new Map,r=[],n={},s=new ns,i=new qe,l=new qe,c=new qe,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,y=null,m=!1,v,g={id:Ah(),hidden:!1,transform:new rr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,k=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),k.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=k.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(k.getScale()))),this.parent=f},set paused(f){if(f!==m){m=f;for(let w of h)w.paused=f}},get paused(){return m},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?hs(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Qt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(k=>w(k))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ke(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Zr(this.scale),sr(this.angle);let w=this.children.sort((S,k)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=k.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(k.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let k=0;k{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var k;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(y=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),y=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(oh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),lh.has(T)){let A=T==="add"?()=>{var E;y=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),y=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(k=e.values().find(E=>E[T]!==void 0))==null?void 0:k.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),k=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(k=k.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&k.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=k.findIndex(M=>M.id===A.id);E!==-1&&k.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&k.findIndex(M=>M.id===A.id)==-1&&k.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=k.findIndex(R=>R.id===A.id);M!==-1&&k.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&k.findIndex(M=>M.id===A.id)==-1&&k.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=k.findIndex(R=>R.id===A.id);M!==-1&&k.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return k},query(f){let w=f.hierarchy||"children",S=f.include,k=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),k&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(k)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(k=>{switch(f){case"fixedUpdate":return i.add(k);case"update":return l.add(k);case"draw":return c.add(k);default:return s.on(f,k)}})(w.bind(this));return y&&y(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,k]of e)f[S]=((w=k.inspect)==null?void 0:w.call(k))??null;for(let[S,k]of r.entries()){if(k.inspect){f[S]=k.inspect();continue}for(let[T,P]of Object.entries(k))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},B=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of B)g[f]=(...w)=>{var k,T;let S=(T=(k=d.app)[f])==null?void 0:T.call(k,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);ir.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(hs,"make");var ic=o(()=>({events:new ns,root:hs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new q(1),angle:0,shake:0,transform:new rr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function sn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(sn,"getGravityDirection");var ac=Qu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var oc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new xr(lu(t));return t.decodeAudioData(ac.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new qe,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=at(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new qe,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,y=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let m=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),y=!0)},"start"),v=ol(t);v instanceof ot&&v.onLoad(m);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),B=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)y&&(s.stop(),y=!1),p=r.currentTime;else{s=B(s);let w=p-u;s.start(0,w),y=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=B(s),u=p-f):(s.stop(),s=B(s),u=r.currentTime-f,s.start(0,f),y=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Fi(t){return d.k.play(d.audio.burpSnd,t)}o(Fi,"burp");function Oi(t){d.audio.masterNode.gain.value=t}o(Oi,"setVolume");function Li(){return d.audio.masterNode.gain.value}o(Li,"getVolume");function cu(t){return Kt("volume","setVolume / getVolume"),t!==void 0&&Oi(t),Li()}o(cu,"volume");function Di(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Wi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Kn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Nn(at(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Nn(at(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Fi())}o(Di,"initEvents");function du(t,e={}){let r=d.game.root.add([cn(t),Si()]),n=(e.speed||1)*5,s=e.scale||1;r.add([jn(d.boomSprite),dn(0),Gn("center"),Ts(n,s),...e.comps??[]]);let i=r.add([jn(d.kaSprite),dn(0),Gn("center"),Vn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(Ts(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Ui(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Ui,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Kt("layers","setLayers"),Ui(t,e)}o(gu,"layers");function Ni(t){t.destroy()}o(Ni,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Di(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new rr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Fs(t){return d.game.events.on("sceneLeave",t)}o(Fs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function rt(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(rt,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Zr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Zr,"pushScaleV");function sr(t){t&&d.gfx.transform.rotateSelf(t)}o(sr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ke(){d.gfx.renderer.flush(Me(),ke())}o(Ke,"flush");function Me(){return d.gfx.width}o(Me,"width");function ke(){return d.gfx.height}o(ke,"height");function zi(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(zi,"getViewportScale");function vu(t){return new q(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new q((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*ke()/d.gfx.viewport.height)}o(bu,"windowToContent");function cs(){return bu(d.app.mousePos())}o(cs,"mousePos");function fn(){return C(Me()/2,ke()/2)}o(fn,"center");var Yr,ji=(Yr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Yr,"Picture"),Yr),lc=new Xn;function Vi(t,e){let r=Me(),n=ke();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,y=null;for(let m of t.commands){let v=m.material.tex??d.gfx.defTex,g=m.material.shader??d.gfx.defShader;m.material.blend&&d.gfx.renderer.setBlend(m.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?lc:xn(),transform:s})),m.material.uniform&&(g==null||g.send(m.material.uniform)),v!=y&&(y==null||y.unbind(),v==null||v.bind(),y=v),l.drawElements(l.TRIANGLES,m.count,l.UNSIGNED_SHORT,m.index*2)}p==null||p.unbind(),y==null||y.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(Vi,"drawPicture");function Eu(t){t??(t=new ji),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new ji),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new hc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var tr,Ct=(tr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new tr(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(tr,"Texture"),tr),la=new Xn,Xr,uc=(Xr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,B=this.picture.vertices.length/this.stride,f=r.length;for(let k=0;kthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let y=this.vqueue.length/this.stride,m=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Ft,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(is(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Ft(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Ft(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[y,m]=Ft(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Ft(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[B,f]=Ft(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Ft(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[k,T]=Ft(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:y,popElementArrayBuffer:m,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:B,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:k,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Qr,Kn=(Qr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Ct(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Qr,"FrameBuffer"),Qr),fr=new q;function Tt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof ot)return;let p=d.gfx.transform,y=t.pos.length/2,m=new Array(y*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),Tt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(kt,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ar(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=wr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&kt(Object.assign({},i,{outline:null})),kt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}kt(i)}o(ds,"drawEllipse");function or(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(or,"drawCircle");function Ar(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??se.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};Tt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(Ar,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(-1),w=Math.cos(B),S=Math.sin(B);for(let k=0;k0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=B,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(1),w=Math.cos(B),S=Math.sin(B);for(let k=0;k0){let P=u.add(T),A=Math.max(n,10),E=ye(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return ku(t);case"miter":return qu(t)}if(t.radius&&e.length>=3){Ar(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;nts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function Vt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ar(t.anchor||rs),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new Ae(0,0,1,1),c=t.color||se.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),sr(t.angle),Zr(t.scale),rt(s,i),Tt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?y+v:y,t.flipY?m:m+g,t.flipX?y+v:y,t.flipY?m+g:m,t.flipX?y:y+v,t.flipY?m+g:m,t.flipX?y:y+v,t.flipY?m:m+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(Vt,"drawUVQuad");function Iu(t){let e=t.canvas.fb;Vt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Iu,"drawCanvas");var gs={};function Os(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Os,"applyCharTransform");function Wn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Wn,"compileStyledText");function Gt(t){var k,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=di(t.font);if(!t.text||t.text===""||e instanceof ot||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Wn(t.text+""),s=mo(n);if(e instanceof On||typeof e=="string"){let A=e instanceof On?e.fontface.family:e,E=e instanceof On?{outline:e.outline,filter:e.filter}:{outline:null,filter:bs},M=gs[A]??{font:{tex:new Ct(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:E.outline};gs[A]||(gs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((k=M.outline)==null?void 0:k.width)??0,((T=M.outline)==null?void 0:T.width)??0);let _=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(_,M.cursor.x,M.cursor.y),e.map[R]=new Ae(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,y=0,m=[],v=[],g=0,B=null,f=0,w;for(;gt.width&&(y+=i+c,B!=null&&(g-=v.length-B,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,B-1),u=f),B=null,f=0,m.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new Ae(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new q(u,y),opacity:t.opacity??1,color:t.color??se.WHITE,scale:C(l),angle:0}),A===" "&&(B=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}m.push({width:u-h,chars:v}),y+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{Vt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Ht,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ar(t.anchor||rs).add(1,1).scale(new q(e,r).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,r),new q(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?wr(new q(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?wr(new q(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?wr(new q(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?wr(new q(l[0],l[0]),l[0],l[0],180,270):[]]}kt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function Pt(t){Ke();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ke(),d.gfx.width=e,d.gfx.height=r}o(Pt,"drawUnscaled");function Ls(t,e){Pt(()=>{let r=C(8);He(),Qe(t);let n=Gt({text:e,font:Un,size:16,pos:r,color:ce(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=ke()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ce(0,0,0),radius:4,opacity:.8,fixed:!0}),Ht(n),Ue()})}o(Ls,"drawInspectText");function Hi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return kt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Hi,"drawTriangle");function Bu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Ls(vu(cs()),e.join(` +`))}Ls(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&Pt(()=>{He(),rt(Me(),0),rt(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ce(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ce(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&Pt(()=>{He(),rt(Me(),ke()),rt(-8,-8);let t=8,e=Gt({text:d.debug.timeScale.toFixed(1),font:Un,size:16,color:ce(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ce(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Hi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ce(255,255,255),fixed:!0})}Ht(e),Ue()}),d.debug.curRecording&&Pt(()=>{He(),rt(0,ke()),rt(24,-24),or({radius:12,color:ce(255,0,0),opacity:Vs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&Pt(()=>{He(),rt(0,ke()),rt(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Yn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=Gt({text:e.join(` +`),font:Un,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ce(127,127,127)},info:{color:ce(255,255,255)},error:{color:ce(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ce(0,0,0),radius:4,opacity:.8,fixed:!0}),Ht(r),Ue()})}o(Bu,"drawDebug");function Yn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Yn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Yn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):Pt(()=>{let e=Me()/2,r=24,n=C(Me()/2,ke()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:ke(),color:ce(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Ki(t,e,r){let n=d.gfx.ggl.gl;Ke(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ke(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ke(),n.disable(n.STENCIL_TEST)}o(Ki,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Ki(t,e,r.EQUAL)}o(Ou,"drawMasked");function pn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new Ae(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=ar(t.anchor||rs),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,y=(t.height||n)/n,m=Math.floor(p),v=Math.floor(y),g=p-m,B=y-v,f=(m+g?1:0)*(v+B?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},k=0,T=t.color||se.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[k*6+0]=k*4+0,w[k*6+1]=k*4+1,w[k*6+2]=k*4+3,w[k*6+3]=k*4+1,w[k*6+4]=k*4+2,w[k*6+5]=k*4+3;let O=k*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,k++},"addQuad");for(let E=0;E{let r=ls(e,Es,Ss),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Kn(e,t.width*n*s,t.height*n*s):new Kn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ce(t.background):(h=ce(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new uc(e,ni,nh,sh),y=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(v=>new rr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new rr,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Wi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Wi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),dc="data:image/png;base64,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",fc="data:image/png;base64,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",pc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,gc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let U=r.width,H=r.height;i.push(`width: ${U}px`),i.push(`height: ${H}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ph({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,v=Pu(m,{texFilter:t.texFilter}),g=cc(t,v);d.gfx=g;let B=oc();d.audio=B;let f=Kh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ic();d.game=w,w.root.use(Vn()),ua("collision",_e,[4,3]);function S(U,H){let X=new Kn(v,U,H);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ae=>{Ke(),X.bind(),ae(),Ke(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function k(){m.clear(m.COLOR_BUFFER_BIT),g.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),g.bgColor||Pt(()=>{Vt({width:Me(),height:ke(),quad:new Ae(0,0,Me()/64,ke()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(k,"frameStart");function T(U,H){g.postShader=U,g.postShaderUniform=H??null}o(T,"usePostEffect");function P(){Ke(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let U=g.width,H=g.height;g.width=m.drawingBufferWidth/l,g.height=m.drawingBufferHeight/l,pn({flipY:!0,tex:g.frameBuffer.tex,pos:new q(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ke(),g.width=U,g.height=H}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(U){u.state.timeScale=U},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Ve,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...U)=>{let H=t.logMax??8,X=U.length>1?U.concat(" ").join(" "):U[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>H&&(w.logs=w.logs.slice(0,H))},"log"),error:o(U=>E.log(new Error(U.toString?U.toString():U)),"error"),curRecording:null,numObjects:o(()=>J("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(U){A=U,U?B.ctx.suspend():B.ctx.resume()}};d.debug=E;function M(U,H){try{return JSON.parse(window.localStorage[U])}catch{return H?(R(U,H),H):null}}o(M,"getData");function R(U,H){window.localStorage[U]=JSON.stringify(H)}o(R,"setData");function L(U,...H){let X=U(le),ae;typeof X=="function"?ae=X(...H)(le):ae=X;for(let Pe in ae)le[Pe]=ae[Pe],t.global!==!1&&(window[Pe]=ae[Pe]);return le}o(L,"plug");function D(U){let H=u.canvas.captureStream(U),X=B.ctx.createMediaStreamDestination();B.masterNode.connect(X);let ae=new MediaRecorder(H),Pe=[];return ae.ondataavailable=xe=>{xe.data.size>0&&Pe.push(xe.data)},ae.onerror=()=>{B.masterNode.disconnect(X),H.getTracks().forEach(xe=>xe.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),B.masterNode.disconnect(X),H.getTracks().forEach(xe=>xe.stop()),new Promise(xe=>{ae.onstop=()=>{xe(new Blob(Pe,{type:"video/mp4"}))}})},download(xe="kaboom.mp4"){this.stop().then($e=>Ms(xe,$e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),_=w.root.readd.bind(w.root),K=w.root.removeAll.bind(w.root),J=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),W=w.root.query.bind(w.root),re=w.root.tween.bind(w.root),G=vr(null,fc),ve=vr(null,dc);d.kaSprite=G,d.boomSprite=ve;function je(){w.root.fixedUpdate()}o(je,"fixedUpdateFrame");function Ve(){w.root.update()}o(Ve,"updateFrame");const Le=class Le{constructor(H,X,ae,Pe,xe=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=H,this.target=X,this.normal=ae,this.distance=Pe,this.resolved=xe}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Le(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(Le,"Collision");let Ye=Le;function Y(U,H){if(H.paused||!H.exists())return!1;for(let ae of U.collisionIgnore)if(H.is(ae))return!1;for(let ae of H.collisionIgnore)if(U.is(ae))return!1;let X=Cs(U.worldArea(),H.worldArea());if(X){let ae=new Ye(U,H,X.normal,X.distance);U.trigger("collideUpdate",H,ae);let Pe=ae.reverse();Pe.resolved=ae.resolved,H.trigger("collideUpdate",U,Pe)}return!0}o(Y,"narrowPhase");let ee=new Vh,oe=!1;function Te(){if(Bs()){if(!oe){oe=!0,Rs(U=>{U.has("area")&&ee.add(U)}),ia(U=>{ee.remove(U)}),aa((U,H)=>{H==="area"&&ee.add(U)}),oa((U,H)=>{H==="area"&&ee.remove(U)}),Fs(U=>{oe=!1,ee.clear()});for(let U of J("*",{recursive:!0}))U.has("area")&&ee.add(U)}ee.update();for(let[U,H]of ee)Y(U,H)}}o(Te,"broadPhase");function _e(){if(Bs())return Te()}o(_e,"checkFrame");function ut(U){if(ha)return;ha=!0,console.error(U),B.ctx.suspend();let H=U.message??String(U)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,k(),Pt(()=>{let ae=Me(),Pe=ke(),xe={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:Un,fixed:!0};Ne({width:ae,height:Pe,color:ce(0,0,255),fixed:!0});let $e=Gt({...xe,text:"Error",pos:C(32),color:ce(255,128,0),fixed:!0});Ht($e),Ds({...xe,text:H,pos:C(32,32+$e.height+16),fixed:!0}),Ue(),w.events.trigger("error",U)}),P())})}o(ut,"handleErr"),d.handleErr=ut;function At(U){p.push(U)}o(At,"onCleanup");function ht(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let U=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let H=0;HH())})}o(ht,"quit");let Xe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let U of d.systemsByEvent[1])U.run();je();for(let U of d.systemsByEvent[4])U.run()}}catch(U){ut(U)}},(U,H)=>{try{if(U(),f.loaded||jt()===1&&!Xe&&(f.loaded=!0,ci().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||Xe)k(),Fu(),P();else{if(!E.paused){for(let X of d.systemsByEvent[0])X.run();Ve();for(let X of d.systemsByEvent[3])X.run()}k();for(let X of d.systemsByEvent[2])X.run();Ru(),t.debug!==!1&&Bu();for(let X of d.systemsByEvent[5])X.run();P()}Xe&&(Xe=!1),w.events.trigger("frameEnd"),H()}catch(X){ut(X)}}),Wi(),Di();let le={_k:d,VERSION:pc,loadRoot:Zo,loadProgress:jt,loadSprite:vr,loadSpriteAtlas:wi,loadSound:ll,loadMusic:ul,loadBitmapFont:gi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:zn,getSound:yi,getFont:fi,getBitmapFont:pi,getSprite:Ai,getShader:mi,getAsset:$o,Asset:ot,SpriteData:nr,SoundData:xr,width:Me,height:ke,center:fn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:Zl,onLoading:Xl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:At,flash:Bi,setCamPos:Pi,getCamPos:Ci,setCamRot:Ti,getCamRot:Ii,setCamScale:ki,getCamScale:qi,getCamTransform:xn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:Hn,toWorld:Ri,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:sn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:hs,destroy:Ni,destroyAll:K,get:J,query:W,readd:_,pos:cn,scale:dn,rotate:Dl,color:oi,blend:Uo,opacity:li,anchor:Gn,area:Sl,sprite:jn,text:cl,polygon:Yo,rect:hi,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Ho,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:kl,pointEffector:ql,buoyancyEffector:Bl,platformEffector:Il,constantForce:Tl,doubleJump:Pl,shader:Xo,textInput:El,timer:Vn,fixed:Mi,stay:Si,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Go,drawon:zo,raycast:ui,tile:vi,animate:wl,serializeAnimation:Ei,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:$h,trigger:ec,on:ze,onFixedUpdate:tc,onUpdate:zl,onDraw:rc,onAdd:Rs,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:nc,onClick:sc,onCollide:Vl,onCollideUpdate:Gl,onCollideEnd:Hl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Yl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:te,play:hu,setVolume:Oi,getVolume:Li,volume:cu,burp:Fi,audioCtx:B.ctx,Line:We,Rect:we,Circle:Oe,Ellipse:lt,Point:eh,Polygon:Re,Vec2:q,Color:se,Mat4:Xn,Mat23:rr,Quad:Ae,RNG:ya,rand:Ce,randi:Gs,randSeed:wa,vec2:C,rgb:ce,hsl2rgb:Zu,quad:Se,choose:va,chooseMultiple:xa,shuffle:Hs,chance:Aa,lerp:Fe,tween:re,easings:un,map:it,mapc:ma,wave:Vs,deg2rad:ye,rad2deg:qt,clamp:at,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:ts,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ga,evaluateCatmullRom:Ha,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:$s,normalizedCurve:Wa,hermite:$r,cardinal:ei,catmullRom:ln,bezier:Ya,kochanekBartels:Xa,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Jn,testRectRect:Ks,testRectLine:Qn,testRectPoint:gn,testCirclePolygon:mn,testLinePoint:Zn,testLineCircle:_r,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Cs,isConvex:io,triangulate:ri,NavMesh:jh,drawSprite:Lu,drawText:Ds,formatText:Gt,drawRect:Ne,drawLine:Ar,drawLines:fs,drawTriangle:Hi,drawCircle:or,drawEllipse:ds,drawUVQuad:Vt,drawPolygon:kt,drawCurve:Gi,drawBezier:Tu,drawFormattedText:Ht,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:Vi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Zr,pushRotate:sr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Iu,Picture:ji,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Fs,layers:gu,getLayers:fu,setLayers:Ui,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ss,downloadJSON:fo,downloadText:si,downloadBlob:Ms,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:se.RED,GREEN:se.GREEN,BLUE:se.BLUE,YELLOW:se.YELLOW,MAGENTA:se.MAGENTA,CYAN:se.CYAN,WHITE:se.WHITE,BLACK:se.BLACK,quit:ht,KEvent:qe,KEventHandler:ns,KEventController:ir,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=le;let Ie=t.plugins;if(Ie&&Ie.forEach(L),t.global!==!1)for(let U in le)window[U]=le[U];return t.focus!==!1&&u.canvas.focus(),le},"kaplay"),mc=gc;const yc="G-6CCP4C6VS7";function wc(t,e){if(window.gtag){e&&e();return}const r=document.createElement("script");r.async=!0,r.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,r.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(r)}function Ac(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function xc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const vc=Uu()?640:1920,bc=Uu()?480:1080,a=mc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:vc,height:bc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Ec=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { `,` let map = {}; `,` `,` for (let i = 0; i < nums.length; i++) { @@ -298,14 +298,14 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return isMirror(root.left, root.right); `,`}; -`]}],ca=.35,vc=.18,bc=60,Ds=5,Ec=1,Sc=28,Xt=xc,Mc=.15,ps=.15,bn=.05,da=5,gs=40,Qt={resizableObjects:[],timeLeft:0},Pc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s})=>{const i=Nu(),l={wpm:t,lpm:e,acc:r,bestWpm:Math.max(n,(i==null?void 0:i.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},c=encodeURIComponent(JSON.stringify(l)),h=60*60*24*30;document.cookie=`playerData=${c}; path=/; max-age=${h}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ms=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],he=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Cc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Us=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},ye={mute:!1};function qc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ur(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");const t=["about","github","start with sound","start muted"],e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40,p=a.width()*.6-40,m=i+80,y=50;if(ye.mute=fa(),a.setVolume(ye.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),qc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),he(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start with sound",{size:e}),he(()=>a.vec2(u,m)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Start muted",{size:e}),he(()=>a.vec2(u,m+y)),a.opacity(1),a.z(21)]),I=a.add([a.anchor("left"),a.text("Github",{size:e}),he(()=>a.vec2(p,m)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("About",{size:e}),he(()=>a.vec2(p,m+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),q=a.add([a.text("←",{size:22}),he(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function T(X){if(X==="")return"Start with sound";const le=t.find(oe=>oe.startsWith(X.toLowerCase()));return le||"Start with sound"}function P(X){const le=X.pos.y+h,oe=X.pos.x+X.text.length*16;q.pos=a.vec2(oe,le),q.animate("pos",[a.vec2(oe,le),a.vec2(oe+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start with sound",E=A.length;const M=14,R=a.width()/2.58-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(X=>a.destroy(X)),D.forEach(X=>a.destroy(X)),L=[],D=[];for(let X=0;X{const xe=X===Te.toLowerCase();Fe.color=xe?a.rgb(3,255,87):a.rgb(255,255,255),xe&&(oe=Fe)}),oe?(q.opacity=1,P(oe)):q.opacity=0}ye.mute=fa(),a.setVolume(ye.mute?0:.5),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;const $=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("$-",{size:e}),a.pos($.pos.x-40,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]),w.opacity=ye.mute?0:1,S.opacity=ye.mute?1:0;let G=!1,Y="",te=0,W="";function re(){G||(G=!0,a.shake(2),ye.mute||a.play("wrong_typing"),a.wait(.3,()=>{G=!1}))}function ee(X){var wt;const le=T(X);(!X||le.toLowerCase().startsWith(X.toLowerCase()))&&le!==A&&(A=le,E=A.length,O());let oe=0,Fe=-1;for(let ge=0;geA.length,We=X.length>Y.length&&oe>=Te,yt=oe>=2&&X.length>Fe+1;if(xe||We){re(),W=Y,$.text=ur(W);return}if(oe>te&&re(),te=oe,yt){W=X.slice(0,Fe+1),$.text=ur(W);return}switch(W=X,Y=W,L.forEach((ge,Xe)=>{const Ye=A[Xe],qe=X[Xe],Se=qe?qe===" "&&Ye!==" "?"_":qe:Ye;ge.text=ur(Se),ge.color=qe?qe.toLowerCase()!==Ye.toLowerCase()||qe===" "&&Ye!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((ge,Xe)=>{Xe===X.length?(ge.color=a.rgb(3,255,87),ge.opacity=Math.abs(Math.sin(a.time()*5))):ge.opacity=0}),X.toLowerCase()){case"github":window.open("https://github.com/conanbatt/wpm","_blank"),V();break;case"about":a.go("about");break;case"start with sound":ye.mute=!1,Us(!1),a.setVolume(.5),a.go("game");break;case"start muted":ye.mute=!0,Us(!0),a.setVolume(0),a.go("game");break}j()}function V(){W="",Y="",te=0,A="Start with sound",E=A.length,O(),j(),$.text=""}a.onKeyPress(X=>{if(X.length!==1)return;const oe=a.isKeyDown("shift")?X.toUpperCase():X;Y=W,W+=oe,$.text=ur(W),ee(W),oe!==" "&&!ye.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),$.text=ur(W),ee(W))}),a.onKeyPress("space",()=>{Y=W,W+=" ",$.text=ur(W),ee(W)}),a.onKeyDown("escape",()=>{V()}),a.onUpdate(()=>{D.forEach((X,le)=>{le===W.length?(X.color=a.rgb(3,255,87),X.opacity=Math.abs(Math.sin(a.time()*5))):X.opacity=0})})});Xt.map(t=>t.title);let pa=a.Color.fromHex("#6a717d"),ys=a.YELLOW,kc=a.Color.RED,It=0,ws=18,Tc=16.4,bt=[],En={},Sn=!1,_r=0,Rn=0,dr=0,Fn=0,Wt=0,As=0,Mn=0,Pn=0,kt=0,zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It,Ku="",Ns=[],Cn="",Tt="",$e="";const Bc=t=>{a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ms[0],n=-1,s=ye.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let m;function y(){if(clearInterval(m),ye.mute)l.volume=0;else{let U=0;m=setInterval(()=>{U{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=Te())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=Te(!0))}},I=(U,H)=>{const _=r.tokens,se=r.associations;if(bt.includes(U))return kc;if(U===g.cursorPos)return ys;if(H===" ")return pa;if(U>v.cursorPos-1)return U=Jr&&U{ae(),Sn&&(kt+=a.dt(),f+=a.dt(),f>=s&&(f-=s,g.curLineCount_+se,0)/5});function w(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function S(){zu=_r,ju=Fn,Vu=Rn,Hu=dr,Gu=It}function q(){Sn=!1,It=0,kt=0,_r=0,Fn=0,Rn=0,dr=0,Wt=0,As=0,Mn=0,Pn=0,s=ca,bt=[],En={}}const T=()=>a.vec2(0,0),P=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),A=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([he(T),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),R={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},L=Xt.map(U=>({title:U.title,language:U.language||"default"})),D=L.slice(0,da);Ns=D.map(U=>U.title),D.forEach(({title:U,language:H},_)=>{const se=R[H]??R.default;a.add([a.sprite(se),he(()=>a.vec2(a.width()*.02,a.height()*(Mc+bn*_))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),he(()=>a.vec2(a.width()*.05,a.height()*(ps+bn*_))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:_}])}),ye.mute?(E.opacity=0,M.opacity=1,y()):(E.opacity=1,M.opacity=0,y()),a.onKeyPress(["escape"],()=>{l.stop(),q(),a.go("game")});const O=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ps-bn*.5)),a.opacity(1),a.animate()]);let j=-1,$=O.pos.y;function G(){const U=a.height()*(ps+bn*j);O.pos=a.vec2(O.pos.x,U),O.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(H=>{H.menuIndex===j?H.color=a.YELLOW:H.color=a.WHITE})}const Y=()=>a.vec2(a.width(),a.height()),te=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),he(te),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Cc(Y),he(te),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),ee=()=>a.vec2(W).sub(0,Sc*(gs*e)),V=re.add([a.text("",{size:ws,lineSpacing:12,letterSpacing:2,transform:(U,H)=>({color:I(U,H)})}),a.pos(0,0),he(ee)]),le=ws+12,oe=(le-ws)/2,Fe=10,Te=(U=!1)=>{const H=U?g:v,_=H.curLineCount-e*gs,se=H.curCharInLine*Tc,me=_*le+oe+Fe;return re.pos.add(V.pos).add(se,me)},xe=a.add([a.text("_",{size:16}),he(()=>Te()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),We=a.add([a.text("_",{size:16}),he(()=>Te(!0)),a.opacity(1),a.anchor("left"),a.color(ys)]);yt(xe),yt(We);function yt(U){a.loop(.5,()=>{U.opacity=U.opacity===0?.8:0})}v.cursorPointer=xe,g.cursorPointer=We;function wt(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const ge=U=>{if(a.debug.inspect!==!0)return;const H=U[v.cursorPos],_=U.substring(0,v.cursorPos),se=U.substring(v.cursorPos+1);console.log(`%c${_}%c${H}%c${se}`,"color: inherit;","color: #f00;","color: inherit;")};function Xe(){if(n++,n>0&&It++,c+=.05,Ye(),It===Ds){It=Ds,S(),q(),l.stop(),a.go("endgame");return}const U=ca,H=vc,_=4;if(It>0){const ut=Math.min(It,_)/_;s=U*Math.pow(H/U,ut)}else s=U;a.play,v.reset(),g.reset(),O.pos=a.vec2(O.pos.x,$),jut.name===me)||ms[0];const lt=se.blocks;i.lineCount=lt.length,Cn=lt.join("");const Be=w(Cn);Tt=Be,V.text=Tt,$e=Cn.replace(/▯/g," "),Tt=Be,V.text=Tt,v.line=$e.split(` -`)[0],g.line=v.line,Ku=se.title,xe.updatePos(),We.updatePos()}function Ye(){l.speed=c}function qe(){Tt=$e.split("").map((U,H)=>bt.includes(H)?U===` -`?`${En[H]} -`:En[H]:U).join(""),Tt=w(Tt),V.text=Tt}function Se(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos++,H.curCharInLine++,H.cursorPointer.pos=Te(U),ge($e))}function Kt(U=!1){const H=U?g:v;H.cursorPointer&&(H.cursorPos--,H.curCharInLine--,H.cursorPointer.pos=Te(U),ge($e))}function ot(){a.shake(2),ye.mute||a.play("wrong_typing")}function N(U=!1){var me;const H=U?g:v;if(!H.cursorPointer)return;H.curLineCount++,v.curLineCount>=gs*(e+1)&&e++,U||Pn++;const _=$e.split(` -`)[H.curLineCount];if(!_)return;const se=((me=_.match(/^\s+/))==null?void 0:me[0].length)||0;H.line=_,H.cursorPos+=se,H.curIdentSize=se,H.curCharInLine=se,V.updatePos(),H.cursorPointer.pos=Te(U),xe.updatePos(),We.updatePos()}function K(){$e[g.cursorPos]===` -`?(Se(!0),N(!0)):Se(!0)}function J(U){for(let H=U.length-1;H>0;H--){const _=Math.floor(Math.random()*(H+1));[U[H],U[_]]=[U[_],U[H]]}return U}function ae(){A.text=kt.toFixed(1),kt>0&&Wt>5&&(_r=Wt&&kt>1?Wt/5/(kt/60):0,Rn=Pn&&kt>1?Pn/(kt/60):0,dr=Mn>0?Wt/Mn*100:100,isNaN(dr)&&(dr=100),P.text=Math.round(_r||0).toString())}const ve=60;let Ae=new Array(ve).fill(0),_e=Math.floor(a.time());function wn(){let U=Math.floor(a.time());if(U!==_e){for(let _=_e+1;_<=U;_++){let se=_%ve;Ae[se]=0}_e=U}let H=U%ve;Ae[H]++}a.onKeyPress(U=>{if($e[v.cursorPos],(v.cursorPos>0?$e[v.cursorPos]:"")===` -`)return;const _=$e[v.cursorPos],se=a.isKeyDown("shift");let me=U,lt,Be=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=se?me.toUpperCase():me,lt=me;else if(me==="space")me=" ",lt="_";else return;if(Mn++,Be=me===_,Be)ye.mute||a.play("code_sound"),Wt++,wn(),Se();else{if(bt.length>Ec)return ot();bt.push(v.cursorPos),En[v.cursorPos]=lt,qe(),Se(),ye.mute||a.play("wrong_typing"),As++}!Sn&&(Wt>0||As>0)&&(Sn=!0)}}),a.onKeyPress("enter",()=>{const H=$e[v.cursorPos]===` -`;if(bt.length>0||!H)return ot();if(v.curLineCount>=i.lineCount-1)return Xe();Se(),N()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Kt(),bt.includes(v.cursorPos)&&(bt=bt.filter(U=>U!==v.cursorPos)),qe()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),Xe()};a.scene("game",Bc);a.scene("endgame",()=>{let t=18,e=Gu,r=Ku,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Hu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Pc({wpm:n,bestWpm:c,lpm:s,acc:i,blockNames:Ns}),Us(ye.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,m=100;let y;function v(){if(clearInterval(y),ye.mute)h.volume=0;else{let R=0;y=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),I=a.width()*.1,f=a.height()*.2,w=(R,L)=>he(()=>g().add(a.vec2(R,L))),S=-I-45,q=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+I-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-I,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,q),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,q+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+I,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Ds}`,{size:42}),w(+I,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+I,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+I,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;Ns.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),he(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),he(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),he(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. +`]}],ca=.35,Sc=.18,Mc=60,Us=5,Pc=1,Cc=28,Xt=Ec,kc=.15,ms=.15,Mn=.05,da=5,ys=40,Zt={resizableObjects:[],timeLeft:0},qc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s,bestLvl:i})=>{const l=Nu(),c={wpm:t,lpm:e,acc:r,bestLvl:i,bestWpm:Math.max(n,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ws=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],pe=t=>({id:"resizablePos",sizeFunc:t,add(){Zt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Tc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Ns=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},he={mute:!1,practiceMode:!1,rivalSpeed:0};function Ic(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pr(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const p=i+80,y=30;let m=0;if(he.mute=fa(),a.setVolume(he.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Ic()){a.add([a.text("WPM is a desktop-only experience",{size:18}),pe(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start",{size:e}),pe(()=>a.vec2(u,p)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Github",{size:e}),pe(()=>a.vec2(u,p+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("About",{size:e}),pe(()=>a.vec2(u,p+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),w=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);K();const S=a.add([a.text("←",{size:22}),pe(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function k(){switch(m){case 0:t=["about","github","start"],v.text="Start",g.text="Github",B.text="About";break;case 1:t=["yes","no"],v.text="Play with Audio",g.text="Yes",B.text="No";break;case 2:t=["interview","practice"],v.text="Mode",g.text="Interview",B.text="Practice";break}j()}function T(Y){if(Y==="")switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}const ee=t.find(oe=>oe.startsWith(Y.toLowerCase()));if(ee)return ee;switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}}function P(Y){const ee=Y.pos.y+h,oe=Y.pos.x+Y.text.length*16;S.pos=a.vec2(oe,ee),S.animate("pos",[a.vec2(oe,ee),a.vec2(oe+10,ee)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start",E=A.length;const M=14,R=a.width()/2.88-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(Y=>a.destroy(Y)),D.forEach(Y=>a.destroy(Y)),L=[],D=[];for(let Y=0;Y{Y===_e&&(Te.color=a.rgb(3,255,87),oe=Te)}),oe?(S.opacity=1,P(oe)):ee.length?(S.opacity=1,P(ee[0].obj)):S.opacity=0}he.mute=fa(),a.setVolume(he.mute?0:.5),f.opacity=he.mute?0:1,w.opacity=he.mute?1:0;const _=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(_.pos.x-30,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function K(){f.opacity=he.mute?0:1,w.opacity=he.mute?1:0}let J=!1,te="",ne=0,W="";function re(){J||(J=!0,a.shake(2),he.mute||a.play("wrong_typing"),a.wait(.3,()=>{J=!1}))}function G(Y){var Xe;const ee=T(Y);(!Y||ee.toLowerCase().startsWith(Y.toLowerCase()))&&ee!==A&&(A=ee,E=A.length,O());let oe=0,Te=-1;for(let le=0;leA.length,At=Y.length>te.length&&oe>=_e,ht=oe>=2&&Y.length>Te+1;if(ut||At){re(),W=te,_.text=pr(W);return}if(oe>ne&&re(),ne=oe,ht){W=Y.slice(0,Te+1),_.text=pr(W);return}switch(W=Y,te=W,L.forEach((le,Ie)=>{const Le=A[Ie],U=Y[Ie],H=U?U===" "&&Le!==" "?"_":U:Le;le.text=pr(H),le.color=U?U.toLowerCase()!==Le.toLowerCase()||U===" "&&Le!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((le,Ie)=>{Ie===Y.length?(le.color=a.rgb(3,255,87),le.opacity=Math.abs(Math.sin(a.time()*5))):le.opacity=0}),Y.toLowerCase()){case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),je());break;case"about":m===0&&a.go("about");break;case"start":if(m===0){Ye(),k();const le=T("");le!==A&&(A=le,E=A.length,O())}break;case"yes":m===1&&(he.mute=!1,Ns(!1),a.setVolume(.5),K(),Ye());break;case"no":m===1&&(he.mute=!0,Ns(!0),a.setVolume(0),K(),Ye());break;case"interview":m===2&&a.go("game");break;case"practice":m===2&&(he.practiceMode=!0,a.go("game"));break}j()}function ve(Y){W="",te="",ne=0,k(),A=Y,E=A.length,O(),j(),_.text=""}function je(){m=0,ve("Start")}function Ve(){ve(m===1?"Yes":m===2?"Interview":t[0])}function Ye(){m++,Ve()}a.onKeyPress(Y=>{if(Y.length!==1)return;const oe=a.isKeyDown("shift")?Y.toUpperCase():Y;te=W,W+=oe,_.text=pr(W),G(W),oe!==" "&&!he.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),_.text=pr(W),G(W))}),a.onKeyPress("space",()=>{te=W,W+=" ",_.text=pr(W),G(W)}),a.onKeyDown("escape",()=>{je()}),a.onUpdate(()=>{D.forEach((Y,ee)=>{ee===W.length?(Y.color=a.rgb(3,255,87),Y.opacity=Math.abs(Math.sin(a.time()*5))):Y.opacity=0})}),k()});Xt.map(t=>t.title);let Bc=a.Color.fromHex("#6a717d"),pa=a.YELLOW,Rc=a.Color.RED,St=0,As=18,Fc=16.4,Et=[],Pn={},Cn=!1,tn=0,Ln=0,yr=0,Dn=0,Yt=0,xs=0,kn=0,qn=0,Bt=0,zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St,zs="",js=[],Tn="",Rt="",tt="";const Oc=t=>{wc(yc,()=>{Ac()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ws[0],n=-1,s=he.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let y;function m(){if(clearInterval(y),he.mute)l.volume=0;else{let N=0;y=setInterval(()=>{N{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=ee())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=ee(!0))}},B=(N,V)=>{const{tokens:$,associations:ue}=r,{cursorPos:ge}=v,{cursorPos:et}=g;if(Et.includes(N))return Rc;if(!he.practiceMode&&(N===et||N>ge-1&&Nge-1)return Bc;const ct=[{test:()=>ue.brackets.test(V),color:$.brackets},{test:()=>ue.operators.test(V),color:$.operators},{test:()=>ue.punctuation.test(V),color:$.punctuation},{test:()=>V==='"'||V==="'",color:$.strings}];for(const{test:me,color:be}of ct)if(me())return a.Color.fromHex(be);const It=/[\w$]+|[^\s\w]/g;let ur="";for(const me of Tn.matchAll(It)){const[be]=me,hr=me.index,cr=hr+be.length;if(N>=hr&&Nue.tags.test(me),color:$.tags},{test:me=>ue.numbers.test(me),color:$.numbers},{test:me=>ue.classes.test(me),color:$.classes},{test:me=>ue.functions.test(me),color:$.functions},{test:me=>ue.keywords.test(me),color:$.keywords},{test:me=>ue.strings.test(me),color:$.strings},{test:me=>/^[A-Za-z_$][\w$]*$/.test(me),color:$.variables}];for(const{test:me,color:be}of bn)if(me(ur))return a.Color.fromHex(be);return a.Color.fromHex($.text)};let f=0;a.onUpdate(()=>{if(Pe(),!Cn){w();return}if(Bt+=a.dt(),!he.practiceMode){if(f+=a.dt(),fV+$,0)/5}function S(N){return N.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(){zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St}function T(){Cn=!1,St=0,Bt=0,tn=0,Dn=0,Ln=0,yr=0,Yt=0,xs=0,kn=0,qn=0,s=ca,Et=[],Pn={}}const P=()=>a.vec2(0,0),A=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),E=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(he.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(he.practiceMode?0:1)]),a.add([pe(P),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const M=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),R=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),L={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},D=Xt.map(N=>({title:N.title,language:N.language||"default"})),O=D.slice(0,da);js=O.map(N=>N.title),O.forEach(({title:N,language:V},$)=>{const ue=L[V]??L.default;a.add([a.sprite(ue),pe(()=>a.vec2(a.width()*.02,a.height()*(kc+Mn*$))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(N,{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*(ms+Mn*$))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:$}])}),he.mute?(M.opacity=0,R.opacity=1,m()):(M.opacity=1,R.opacity=0,m()),a.onKeyPress(["escape"],()=>{l.stop(),T(),a.go("game")});const j=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ms-Mn*.5)),a.opacity(1),a.animate()]);let _=-1,K=j.pos.y;function J(){const N=a.height()*(ms+Mn*_);j.pos=a.vec2(j.pos.x,N),j.animate("pos",[a.vec2(10,N),a.vec2(20,N)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(V=>{V.menuIndex===_?V.color=a.YELLOW:V.color=a.WHITE})}const te=()=>a.vec2(a.width(),a.height()),ne=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),pe(ne),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Tc(te),pe(ne),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),G=()=>a.vec2(W).sub(0,Cc*(ys*e)),ve=re.add([a.text("",{size:As,lineSpacing:12,letterSpacing:2,transform:(N,V)=>({color:B(N,V)})}),a.pos(0,0),pe(G)]),Ve=As+12,Ye=(Ve-As)/2,Y=10,ee=(N=!1)=>{const V=N?g:v,$=V.curLineCount-e*ys,ue=V.curCharInLine*Fc,ge=$*Ve+Ye+Y;return re.pos.add(ve.pos).add(ue,ge)},oe=a.add([a.text("_",{size:16}),pe(()=>ee()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Te=a.add([a.text("_",{size:16}),pe(()=>ee(!0)),a.opacity(he.practiceMode?0:1),a.anchor("left"),a.color(pa)]);_e(oe),he.practiceMode||_e(Te);function _e(N){a.loop(.5,()=>{N.opacity=N.opacity===0?.8:0})}v.cursorPointer=oe,g.cursorPointer=Te;function ut(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const At=N=>{if(a.debug.inspect!==!0)return;const V=N[v.cursorPos],$=N.substring(0,v.cursorPos),ue=N.substring(v.cursorPos+1);console.log(`%c${$}%c${V}%c${ue}`,"color: inherit;","color: #f00;","color: inherit;")};function ht(){if(n++,n>0&&St++,c+=.05,Xe(),St===Us){St=Us,k(),T(),l.stop(),a.go("endgame");return}const N=ca,V=Sc,$=4;if(St>0){const It=Math.min(St,$)/$;s=N*Math.pow(V/N,It)}else s=N;a.play,v.reset(),g.reset(),j.pos=a.vec2(j.pos.x,K),_It.name===ge)||ws[0];const et=ue.blocks;i.lineCount=et.length,Tn=et.join("");const ct=S(Tn);Rt=ct,ve.text=Rt,tt=Tn.replace(/▯/g," "),Rt=ct,ve.text=Rt,v.line=tt.split(` +`)[0],g.line=v.line,zs=ue.title,oe.updatePos(),Te.updatePos()}function Xe(){l.speed=c}function le(){Rt=tt.split("").map((N,V)=>Et.includes(V)?N===` +`?`${Pn[V]} +`:Pn[V]:N).join(""),Rt=S(Rt),ve.text=Rt}function Ie(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos++,V.curCharInLine++,V.cursorPointer.pos=ee(N),At(tt))}function Le(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos--,V.curCharInLine--,V.cursorPointer.pos=ee(N),At(tt))}function U(){a.shake(2),he.mute||a.play("wrong_typing")}function H(N=!1){var ge;const V=N?g:v;if(!V.cursorPointer)return;V.curLineCount++,v.curLineCount>=ys*(e+1)&&e++,N||qn++;const $=tt.split(` +`)[V.curLineCount];if(!$)return;const ue=((ge=$.match(/^\s+/))==null?void 0:ge[0].length)||0;V.line=$,V.cursorPos+=ue,V.curIdentSize=ue,V.curCharInLine=ue,ve.updatePos(),V.cursorPointer.pos=ee(N),oe.updatePos(),Te.updatePos()}function X(){tt[g.cursorPos]===` +`?(Ie(!0),H(!0)):Ie(!0)}function ae(N){for(let V=N.length-1;V>0;V--){const $=Math.floor(Math.random()*(V+1));[N[V],N[$]]=[N[$],N[V]]}return N}function Pe(){E.text=Bt.toFixed(1),Bt>0&&Yt>5&&(tn=Yt&&Bt>1?Yt/5/(Bt/60):0,Ln=qn&&Bt>1?qn/(Bt/60):0,yr=kn>0?Yt/kn*100:100,isNaN(yr)&&(yr=100),A.text=Math.round(tn||0).toString())}const xe=60;let $e=new Array(xe).fill(0),lr=Math.floor(a.time());function vn(){let N=Math.floor(a.time());if(N!==lr){for(let $=lr+1;$<=N;$++){let ue=$%xe;$e[ue]=0}lr=N}let V=N%xe;$e[V]++}a.onKeyPress(N=>{if(tt[v.cursorPos],(v.cursorPos>0?tt[v.cursorPos]:"")===` +`)return;const $=tt[v.cursorPos],ue=a.isKeyDown("shift");let ge=N,et,ct=!1;if(!(ge==="backspace"||ge==="enter"||ge==="shift")){if(ge.length===1)ge=ue?ge.toUpperCase():ge,et=ge;else if(ge==="space")ge=" ",et="_";else return;if(kn++,ct=ge===$,ct)he.mute||a.play("code_sound"),Yt++,vn(),Ie();else{if(Et.length>Pc)return U();Et.push(v.cursorPos),Pn[v.cursorPos]=et,le(),Ie(),a.shake(2),he.mute||a.play("wrong_typing"),xs++}!Cn&&(Yt>0||xs>0)&&(Cn=!0)}}),a.onKeyPress("enter",()=>{const V=tt[v.cursorPos]===` +`;if(Et.length>0||!V)return U();if(v.curLineCount>=i.lineCount-1)return ht();Ie(),H()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Le(),Et.includes(v.cursorPos)&&(Et=Et.filter(N=>N!==v.cursorPos)),le()}}),a.onResize(()=>{for(const N of Zt.resizableObjects)N.is("resizablePos")&&N.updatePos(),N.is("resizableRect")&&N.updateRectSize()}),ht()};a.scene("game",Oc);a.scene("endgame",()=>{let t=18,e=Hu,r=zs,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Gu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),qc({wpm:n,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:js}),Ns(he.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,y=100;let m;function v(){if(clearInterval(m),he.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),B=a.width()*.1,f=a.height()*.2,w=(R,L)=>pe(()=>g().add(a.vec2(R,L))),S=-B-45,k=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-B,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,k),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,k),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,k+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,k+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Us}`,{size:42}),w(+B,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+B,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+B,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;js.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),pe(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);he.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. @@ -315,7 +315,7 @@ Many developers get publicly angry at the suggestion that typing speed is irrele WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment. -To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);ye.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),he(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),he(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Wu=document.createElement("style");Wu.innerHTML=` +To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);he.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),pe(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),pe(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Ku=document.createElement("style");Ku.innerHTML=` :root { --bg: hsl(0, 3.60%, 11.00%); --gray1: #0a080a; @@ -348,5 +348,5 @@ To beat this game you will need to master touch-typing, and fix hand positioning backdrop-filter: blur(10px); z-index: -1; } - `;document.head.appendChild(Wu);a.go("selection"); -//# sourceMappingURL=index-DWNHszku.js.map + `;document.head.appendChild(Ku);a.go("selection"); +//# sourceMappingURL=index-CZ0oXV_W.js.map From 347b11d6bba14b25cf6b27daf80c782d68abf3c4 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Wed, 14 May 2025 16:37:59 -0300 Subject: [PATCH 17/22] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 81c4d18..e43f8ae 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,14 @@ ## Contributing to WPM add new challenges -locate code blocks in data folder and add the block with the following format example considering spaces and line breaks \n +locate **CodeBlocks.json** in data folder and add the block with the following format example considering spaces and line breaks **\n** -"id": 1, +

"id": 1,
 "title": "Hello World",
 "language": "js",
 "blocks": [
   "console.log(\"Hello, World!\");\n"
-]
+] 
update build open command console in game folder and type npm run build -this will be located in the dist\assets inside game folder. -rename to game and replace the existing version inside website\public\game +this will be located in the dist\assets inside game folder, rename to game and replace the existing version inside website\public\game From fb1368aeaeb419ffeff2b625e227fd6c05a55686 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Wed, 14 May 2025 18:13:02 -0300 Subject: [PATCH 18/22] Update selection text --- game/src/scenes/selectionScene.js | 4 ++-- website/public/game/game.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index 774b46c..a8663e2 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -126,13 +126,13 @@ k.scene("selection", () => { break; case 1: commands = ["yes", "no"]; - StartText.text = "Play with Audio"; + StartText.text = "Play with Audio?"; gitText.text = "Yes"; aboutText.text = "No"; break; case 2: commands = ["interview", "practice"]; - StartText.text = "Mode"; + StartText.text = "Game Mode"; gitText.text = "Interview"; aboutText.text = "Practice"; break; diff --git a/website/public/game/game.js b/website/public/game/game.js index ab05ca4..c6b2a60 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -298,7 +298,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return isMirror(root.left, root.right); `,`}; -`]}],ca=.35,Sc=.18,Mc=60,Us=5,Pc=1,Cc=28,Xt=Ec,kc=.15,ms=.15,Mn=.05,da=5,ys=40,Zt={resizableObjects:[],timeLeft:0},qc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s,bestLvl:i})=>{const l=Nu(),c={wpm:t,lpm:e,acc:r,bestLvl:i,bestWpm:Math.max(n,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ws=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],pe=t=>({id:"resizablePos",sizeFunc:t,add(){Zt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Tc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Ns=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},he={mute:!1,practiceMode:!1,rivalSpeed:0};function Ic(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pr(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const p=i+80,y=30;let m=0;if(he.mute=fa(),a.setVolume(he.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Ic()){a.add([a.text("WPM is a desktop-only experience",{size:18}),pe(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start",{size:e}),pe(()=>a.vec2(u,p)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Github",{size:e}),pe(()=>a.vec2(u,p+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("About",{size:e}),pe(()=>a.vec2(u,p+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),w=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);K();const S=a.add([a.text("←",{size:22}),pe(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function k(){switch(m){case 0:t=["about","github","start"],v.text="Start",g.text="Github",B.text="About";break;case 1:t=["yes","no"],v.text="Play with Audio",g.text="Yes",B.text="No";break;case 2:t=["interview","practice"],v.text="Mode",g.text="Interview",B.text="Practice";break}j()}function T(Y){if(Y==="")switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}const ee=t.find(oe=>oe.startsWith(Y.toLowerCase()));if(ee)return ee;switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}}function P(Y){const ee=Y.pos.y+h,oe=Y.pos.x+Y.text.length*16;S.pos=a.vec2(oe,ee),S.animate("pos",[a.vec2(oe,ee),a.vec2(oe+10,ee)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start",E=A.length;const M=14,R=a.width()/2.88-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(Y=>a.destroy(Y)),D.forEach(Y=>a.destroy(Y)),L=[],D=[];for(let Y=0;Y{Y===_e&&(Te.color=a.rgb(3,255,87),oe=Te)}),oe?(S.opacity=1,P(oe)):ee.length?(S.opacity=1,P(ee[0].obj)):S.opacity=0}he.mute=fa(),a.setVolume(he.mute?0:.5),f.opacity=he.mute?0:1,w.opacity=he.mute?1:0;const _=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(_.pos.x-30,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function K(){f.opacity=he.mute?0:1,w.opacity=he.mute?1:0}let J=!1,te="",ne=0,W="";function re(){J||(J=!0,a.shake(2),he.mute||a.play("wrong_typing"),a.wait(.3,()=>{J=!1}))}function G(Y){var Xe;const ee=T(Y);(!Y||ee.toLowerCase().startsWith(Y.toLowerCase()))&&ee!==A&&(A=ee,E=A.length,O());let oe=0,Te=-1;for(let le=0;leA.length,At=Y.length>te.length&&oe>=_e,ht=oe>=2&&Y.length>Te+1;if(ut||At){re(),W=te,_.text=pr(W);return}if(oe>ne&&re(),ne=oe,ht){W=Y.slice(0,Te+1),_.text=pr(W);return}switch(W=Y,te=W,L.forEach((le,Ie)=>{const Le=A[Ie],U=Y[Ie],H=U?U===" "&&Le!==" "?"_":U:Le;le.text=pr(H),le.color=U?U.toLowerCase()!==Le.toLowerCase()||U===" "&&Le!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((le,Ie)=>{Ie===Y.length?(le.color=a.rgb(3,255,87),le.opacity=Math.abs(Math.sin(a.time()*5))):le.opacity=0}),Y.toLowerCase()){case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),je());break;case"about":m===0&&a.go("about");break;case"start":if(m===0){Ye(),k();const le=T("");le!==A&&(A=le,E=A.length,O())}break;case"yes":m===1&&(he.mute=!1,Ns(!1),a.setVolume(.5),K(),Ye());break;case"no":m===1&&(he.mute=!0,Ns(!0),a.setVolume(0),K(),Ye());break;case"interview":m===2&&a.go("game");break;case"practice":m===2&&(he.practiceMode=!0,a.go("game"));break}j()}function ve(Y){W="",te="",ne=0,k(),A=Y,E=A.length,O(),j(),_.text=""}function je(){m=0,ve("Start")}function Ve(){ve(m===1?"Yes":m===2?"Interview":t[0])}function Ye(){m++,Ve()}a.onKeyPress(Y=>{if(Y.length!==1)return;const oe=a.isKeyDown("shift")?Y.toUpperCase():Y;te=W,W+=oe,_.text=pr(W),G(W),oe!==" "&&!he.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),_.text=pr(W),G(W))}),a.onKeyPress("space",()=>{te=W,W+=" ",_.text=pr(W),G(W)}),a.onKeyDown("escape",()=>{je()}),a.onUpdate(()=>{D.forEach((Y,ee)=>{ee===W.length?(Y.color=a.rgb(3,255,87),Y.opacity=Math.abs(Math.sin(a.time()*5))):Y.opacity=0})}),k()});Xt.map(t=>t.title);let Bc=a.Color.fromHex("#6a717d"),pa=a.YELLOW,Rc=a.Color.RED,St=0,As=18,Fc=16.4,Et=[],Pn={},Cn=!1,tn=0,Ln=0,yr=0,Dn=0,Yt=0,xs=0,kn=0,qn=0,Bt=0,zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St,zs="",js=[],Tn="",Rt="",tt="";const Oc=t=>{wc(yc,()=>{Ac()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ws[0],n=-1,s=he.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let y;function m(){if(clearInterval(y),he.mute)l.volume=0;else{let N=0;y=setInterval(()=>{N{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=ee())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=ee(!0))}},B=(N,V)=>{const{tokens:$,associations:ue}=r,{cursorPos:ge}=v,{cursorPos:et}=g;if(Et.includes(N))return Rc;if(!he.practiceMode&&(N===et||N>ge-1&&Nge-1)return Bc;const ct=[{test:()=>ue.brackets.test(V),color:$.brackets},{test:()=>ue.operators.test(V),color:$.operators},{test:()=>ue.punctuation.test(V),color:$.punctuation},{test:()=>V==='"'||V==="'",color:$.strings}];for(const{test:me,color:be}of ct)if(me())return a.Color.fromHex(be);const It=/[\w$]+|[^\s\w]/g;let ur="";for(const me of Tn.matchAll(It)){const[be]=me,hr=me.index,cr=hr+be.length;if(N>=hr&&Nue.tags.test(me),color:$.tags},{test:me=>ue.numbers.test(me),color:$.numbers},{test:me=>ue.classes.test(me),color:$.classes},{test:me=>ue.functions.test(me),color:$.functions},{test:me=>ue.keywords.test(me),color:$.keywords},{test:me=>ue.strings.test(me),color:$.strings},{test:me=>/^[A-Za-z_$][\w$]*$/.test(me),color:$.variables}];for(const{test:me,color:be}of bn)if(me(ur))return a.Color.fromHex(be);return a.Color.fromHex($.text)};let f=0;a.onUpdate(()=>{if(Pe(),!Cn){w();return}if(Bt+=a.dt(),!he.practiceMode){if(f+=a.dt(),fV+$,0)/5}function S(N){return N.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(){zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St}function T(){Cn=!1,St=0,Bt=0,tn=0,Dn=0,Ln=0,yr=0,Yt=0,xs=0,kn=0,qn=0,s=ca,Et=[],Pn={}}const P=()=>a.vec2(0,0),A=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),E=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(he.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(he.practiceMode?0:1)]),a.add([pe(P),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const M=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),R=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),L={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},D=Xt.map(N=>({title:N.title,language:N.language||"default"})),O=D.slice(0,da);js=O.map(N=>N.title),O.forEach(({title:N,language:V},$)=>{const ue=L[V]??L.default;a.add([a.sprite(ue),pe(()=>a.vec2(a.width()*.02,a.height()*(kc+Mn*$))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(N,{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*(ms+Mn*$))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:$}])}),he.mute?(M.opacity=0,R.opacity=1,m()):(M.opacity=1,R.opacity=0,m()),a.onKeyPress(["escape"],()=>{l.stop(),T(),a.go("game")});const j=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ms-Mn*.5)),a.opacity(1),a.animate()]);let _=-1,K=j.pos.y;function J(){const N=a.height()*(ms+Mn*_);j.pos=a.vec2(j.pos.x,N),j.animate("pos",[a.vec2(10,N),a.vec2(20,N)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(V=>{V.menuIndex===_?V.color=a.YELLOW:V.color=a.WHITE})}const te=()=>a.vec2(a.width(),a.height()),ne=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),pe(ne),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Tc(te),pe(ne),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),G=()=>a.vec2(W).sub(0,Cc*(ys*e)),ve=re.add([a.text("",{size:As,lineSpacing:12,letterSpacing:2,transform:(N,V)=>({color:B(N,V)})}),a.pos(0,0),pe(G)]),Ve=As+12,Ye=(Ve-As)/2,Y=10,ee=(N=!1)=>{const V=N?g:v,$=V.curLineCount-e*ys,ue=V.curCharInLine*Fc,ge=$*Ve+Ye+Y;return re.pos.add(ve.pos).add(ue,ge)},oe=a.add([a.text("_",{size:16}),pe(()=>ee()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Te=a.add([a.text("_",{size:16}),pe(()=>ee(!0)),a.opacity(he.practiceMode?0:1),a.anchor("left"),a.color(pa)]);_e(oe),he.practiceMode||_e(Te);function _e(N){a.loop(.5,()=>{N.opacity=N.opacity===0?.8:0})}v.cursorPointer=oe,g.cursorPointer=Te;function ut(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const At=N=>{if(a.debug.inspect!==!0)return;const V=N[v.cursorPos],$=N.substring(0,v.cursorPos),ue=N.substring(v.cursorPos+1);console.log(`%c${$}%c${V}%c${ue}`,"color: inherit;","color: #f00;","color: inherit;")};function ht(){if(n++,n>0&&St++,c+=.05,Xe(),St===Us){St=Us,k(),T(),l.stop(),a.go("endgame");return}const N=ca,V=Sc,$=4;if(St>0){const It=Math.min(St,$)/$;s=N*Math.pow(V/N,It)}else s=N;a.play,v.reset(),g.reset(),j.pos=a.vec2(j.pos.x,K),_It.name===ge)||ws[0];const et=ue.blocks;i.lineCount=et.length,Tn=et.join("");const ct=S(Tn);Rt=ct,ve.text=Rt,tt=Tn.replace(/▯/g," "),Rt=ct,ve.text=Rt,v.line=tt.split(` +`]}],ca=.35,Sc=.18,Mc=60,Us=5,Pc=1,Cc=28,Xt=Ec,kc=.15,ms=.15,Mn=.05,da=5,ys=40,Zt={resizableObjects:[],timeLeft:0},qc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s,bestLvl:i})=>{const l=Nu(),c={wpm:t,lpm:e,acc:r,bestLvl:i,bestWpm:Math.max(n,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ws=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],pe=t=>({id:"resizablePos",sizeFunc:t,add(){Zt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Tc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Ns=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},he={mute:!1,practiceMode:!1,rivalSpeed:0};function Ic(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pr(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const p=i+80,y=30;let m=0;if(he.mute=fa(),a.setVolume(he.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Ic()){a.add([a.text("WPM is a desktop-only experience",{size:18}),pe(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start",{size:e}),pe(()=>a.vec2(u,p)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Github",{size:e}),pe(()=>a.vec2(u,p+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("About",{size:e}),pe(()=>a.vec2(u,p+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),w=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);K();const S=a.add([a.text("←",{size:22}),pe(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function k(){switch(m){case 0:t=["about","github","start"],v.text="Start",g.text="Github",B.text="About";break;case 1:t=["yes","no"],v.text="Play with Audio?",g.text="Yes",B.text="No";break;case 2:t=["interview","practice"],v.text="Game Mode",g.text="Interview",B.text="Practice";break}j()}function T(Y){if(Y==="")switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}const ee=t.find(oe=>oe.startsWith(Y.toLowerCase()));if(ee)return ee;switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}}function P(Y){const ee=Y.pos.y+h,oe=Y.pos.x+Y.text.length*16;S.pos=a.vec2(oe,ee),S.animate("pos",[a.vec2(oe,ee),a.vec2(oe+10,ee)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start",E=A.length;const M=14,R=a.width()/2.88-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(Y=>a.destroy(Y)),D.forEach(Y=>a.destroy(Y)),L=[],D=[];for(let Y=0;Y{Y===_e&&(Te.color=a.rgb(3,255,87),oe=Te)}),oe?(S.opacity=1,P(oe)):ee.length?(S.opacity=1,P(ee[0].obj)):S.opacity=0}he.mute=fa(),a.setVolume(he.mute?0:.5),f.opacity=he.mute?0:1,w.opacity=he.mute?1:0;const _=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(_.pos.x-30,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function K(){f.opacity=he.mute?0:1,w.opacity=he.mute?1:0}let J=!1,te="",ne=0,W="";function re(){J||(J=!0,a.shake(2),he.mute||a.play("wrong_typing"),a.wait(.3,()=>{J=!1}))}function G(Y){var Xe;const ee=T(Y);(!Y||ee.toLowerCase().startsWith(Y.toLowerCase()))&&ee!==A&&(A=ee,E=A.length,O());let oe=0,Te=-1;for(let le=0;leA.length,At=Y.length>te.length&&oe>=_e,ht=oe>=2&&Y.length>Te+1;if(ut||At){re(),W=te,_.text=pr(W);return}if(oe>ne&&re(),ne=oe,ht){W=Y.slice(0,Te+1),_.text=pr(W);return}switch(W=Y,te=W,L.forEach((le,Ie)=>{const Le=A[Ie],U=Y[Ie],H=U?U===" "&&Le!==" "?"_":U:Le;le.text=pr(H),le.color=U?U.toLowerCase()!==Le.toLowerCase()||U===" "&&Le!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((le,Ie)=>{Ie===Y.length?(le.color=a.rgb(3,255,87),le.opacity=Math.abs(Math.sin(a.time()*5))):le.opacity=0}),Y.toLowerCase()){case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),je());break;case"about":m===0&&a.go("about");break;case"start":if(m===0){Ye(),k();const le=T("");le!==A&&(A=le,E=A.length,O())}break;case"yes":m===1&&(he.mute=!1,Ns(!1),a.setVolume(.5),K(),Ye());break;case"no":m===1&&(he.mute=!0,Ns(!0),a.setVolume(0),K(),Ye());break;case"interview":m===2&&a.go("game");break;case"practice":m===2&&(he.practiceMode=!0,a.go("game"));break}j()}function ve(Y){W="",te="",ne=0,k(),A=Y,E=A.length,O(),j(),_.text=""}function je(){m=0,ve("Start")}function Ve(){ve(m===1?"Yes":m===2?"Interview":t[0])}function Ye(){m++,Ve()}a.onKeyPress(Y=>{if(Y.length!==1)return;const oe=a.isKeyDown("shift")?Y.toUpperCase():Y;te=W,W+=oe,_.text=pr(W),G(W),oe!==" "&&!he.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),_.text=pr(W),G(W))}),a.onKeyPress("space",()=>{te=W,W+=" ",_.text=pr(W),G(W)}),a.onKeyDown("escape",()=>{je()}),a.onUpdate(()=>{D.forEach((Y,ee)=>{ee===W.length?(Y.color=a.rgb(3,255,87),Y.opacity=Math.abs(Math.sin(a.time()*5))):Y.opacity=0})}),k()});Xt.map(t=>t.title);let Bc=a.Color.fromHex("#6a717d"),pa=a.YELLOW,Rc=a.Color.RED,St=0,As=18,Fc=16.4,Et=[],Pn={},Cn=!1,tn=0,Ln=0,yr=0,Dn=0,Yt=0,xs=0,kn=0,qn=0,Bt=0,zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St,zs="",js=[],Tn="",Rt="",tt="";const Oc=t=>{wc(yc,()=>{Ac()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ws[0],n=-1,s=he.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let y;function m(){if(clearInterval(y),he.mute)l.volume=0;else{let N=0;y=setInterval(()=>{N{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=ee())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=ee(!0))}},B=(N,V)=>{const{tokens:$,associations:ue}=r,{cursorPos:ge}=v,{cursorPos:et}=g;if(Et.includes(N))return Rc;if(!he.practiceMode&&(N===et||N>ge-1&&Nge-1)return Bc;const ct=[{test:()=>ue.brackets.test(V),color:$.brackets},{test:()=>ue.operators.test(V),color:$.operators},{test:()=>ue.punctuation.test(V),color:$.punctuation},{test:()=>V==='"'||V==="'",color:$.strings}];for(const{test:me,color:be}of ct)if(me())return a.Color.fromHex(be);const It=/[\w$]+|[^\s\w]/g;let ur="";for(const me of Tn.matchAll(It)){const[be]=me,hr=me.index,cr=hr+be.length;if(N>=hr&&Nue.tags.test(me),color:$.tags},{test:me=>ue.numbers.test(me),color:$.numbers},{test:me=>ue.classes.test(me),color:$.classes},{test:me=>ue.functions.test(me),color:$.functions},{test:me=>ue.keywords.test(me),color:$.keywords},{test:me=>ue.strings.test(me),color:$.strings},{test:me=>/^[A-Za-z_$][\w$]*$/.test(me),color:$.variables}];for(const{test:me,color:be}of bn)if(me(ur))return a.Color.fromHex(be);return a.Color.fromHex($.text)};let f=0;a.onUpdate(()=>{if(Pe(),!Cn){w();return}if(Bt+=a.dt(),!he.practiceMode){if(f+=a.dt(),fV+$,0)/5}function S(N){return N.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(){zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St}function T(){Cn=!1,St=0,Bt=0,tn=0,Dn=0,Ln=0,yr=0,Yt=0,xs=0,kn=0,qn=0,s=ca,Et=[],Pn={}}const P=()=>a.vec2(0,0),A=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),E=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(he.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(he.practiceMode?0:1)]),a.add([pe(P),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const M=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),R=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),L={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},D=Xt.map(N=>({title:N.title,language:N.language||"default"})),O=D.slice(0,da);js=O.map(N=>N.title),O.forEach(({title:N,language:V},$)=>{const ue=L[V]??L.default;a.add([a.sprite(ue),pe(()=>a.vec2(a.width()*.02,a.height()*(kc+Mn*$))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(N,{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*(ms+Mn*$))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:$}])}),he.mute?(M.opacity=0,R.opacity=1,m()):(M.opacity=1,R.opacity=0,m()),a.onKeyPress(["escape"],()=>{l.stop(),T(),a.go("game")});const j=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ms-Mn*.5)),a.opacity(1),a.animate()]);let _=-1,K=j.pos.y;function J(){const N=a.height()*(ms+Mn*_);j.pos=a.vec2(j.pos.x,N),j.animate("pos",[a.vec2(10,N),a.vec2(20,N)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(V=>{V.menuIndex===_?V.color=a.YELLOW:V.color=a.WHITE})}const te=()=>a.vec2(a.width(),a.height()),ne=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),pe(ne),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Tc(te),pe(ne),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),G=()=>a.vec2(W).sub(0,Cc*(ys*e)),ve=re.add([a.text("",{size:As,lineSpacing:12,letterSpacing:2,transform:(N,V)=>({color:B(N,V)})}),a.pos(0,0),pe(G)]),Ve=As+12,Ye=(Ve-As)/2,Y=10,ee=(N=!1)=>{const V=N?g:v,$=V.curLineCount-e*ys,ue=V.curCharInLine*Fc,ge=$*Ve+Ye+Y;return re.pos.add(ve.pos).add(ue,ge)},oe=a.add([a.text("_",{size:16}),pe(()=>ee()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Te=a.add([a.text("_",{size:16}),pe(()=>ee(!0)),a.opacity(he.practiceMode?0:1),a.anchor("left"),a.color(pa)]);_e(oe),he.practiceMode||_e(Te);function _e(N){a.loop(.5,()=>{N.opacity=N.opacity===0?.8:0})}v.cursorPointer=oe,g.cursorPointer=Te;function ut(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const At=N=>{if(a.debug.inspect!==!0)return;const V=N[v.cursorPos],$=N.substring(0,v.cursorPos),ue=N.substring(v.cursorPos+1);console.log(`%c${$}%c${V}%c${ue}`,"color: inherit;","color: #f00;","color: inherit;")};function ht(){if(n++,n>0&&St++,c+=.05,Xe(),St===Us){St=Us,k(),T(),l.stop(),a.go("endgame");return}const N=ca,V=Sc,$=4;if(St>0){const It=Math.min(St,$)/$;s=N*Math.pow(V/N,It)}else s=N;a.play,v.reset(),g.reset(),j.pos=a.vec2(j.pos.x,K),_It.name===ge)||ws[0];const et=ue.blocks;i.lineCount=et.length,Tn=et.join("");const ct=S(Tn);Rt=ct,ve.text=Rt,tt=Tn.replace(/▯/g," "),Rt=ct,ve.text=Rt,v.line=tt.split(` `)[0],g.line=v.line,zs=ue.title,oe.updatePos(),Te.updatePos()}function Xe(){l.speed=c}function le(){Rt=tt.split("").map((N,V)=>Et.includes(V)?N===` `?`${Pn[V]} `:Pn[V]:N).join(""),Rt=S(Rt),ve.text=Rt}function Ie(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos++,V.curCharInLine++,V.cursorPointer.pos=ee(N),At(tt))}function Le(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos--,V.curCharInLine--,V.cursorPointer.pos=ee(N),At(tt))}function U(){a.shake(2),he.mute||a.play("wrong_typing")}function H(N=!1){var ge;const V=N?g:v;if(!V.cursorPointer)return;V.curLineCount++,v.curLineCount>=ys*(e+1)&&e++,N||qn++;const $=tt.split(` @@ -349,4 +349,4 @@ To beat this game you will need to master touch-typing, and fix hand positioning z-index: -1; } `;document.head.appendChild(Ku);a.go("selection"); -//# sourceMappingURL=index-CZ0oXV_W.js.map +//# sourceMappingURL=index-BlZgGNiy.js.map From 3f7b5311f973da7ea77b09e1c1170cab020b0856 Mon Sep 17 00:00:00 2001 From: Leorrut <53920305+Leorrut@users.noreply.github.com> Date: Thu, 22 May 2025 11:07:50 -0300 Subject: [PATCH 19/22] Improve text input and language selection Changes to text input in selectionScene, added utilities.js, added language selection to the selectionScene interface, expanded themes.js and CodeBlocks.json. --- game/src/data/CodeBlocks.json | 678 ++++++++++++++++++++++++++++-- game/src/data/themes.js | 2 +- game/src/data/utilities.js | 37 ++ game/src/kaplay.js | 2 +- game/src/main.js | 1 + game/src/scenes/game.js | 183 ++++---- game/src/scenes/selectionScene.js | 231 ++++++---- website/public/game/game.js | 444 +++++++++++++++++-- 8 files changed, 1331 insertions(+), 247 deletions(-) create mode 100644 game/src/data/utilities.js diff --git a/game/src/data/CodeBlocks.json b/game/src/data/CodeBlocks.json index 057444d..1c3cae2 100644 --- a/game/src/data/CodeBlocks.json +++ b/game/src/data/CodeBlocks.json @@ -2,7 +2,7 @@ { "id": 1, "title": "twoSum", - "language": "js", + "language": "javascript", "blocks": [ "var twoSum = function(nums, target) {\n", " let map = {};\n", @@ -24,7 +24,7 @@ { "id": 2, "title": "isPalindrome", - "language": "js", + "language": "javascript", "blocks": [ "var isPalindrome = function(x) {\n", " if (x < 0) {\n", @@ -44,9 +44,9 @@ ] }, { - "id": 5, + "id": 3, "title": "longestCommonPrefix", - "language": "js", + "language": "javascript", "blocks": [ "var longestCommonPrefix = function(strs) {\n", " return strs.reduce((prev, next) => {\n", @@ -58,9 +58,9 @@ ] }, { - "id": 6, + "id": 4, "title": "mergeTwoLists", - "language": "js", + "language": "javascript", "blocks": [ "var mergeTwoLists = function(list1, list2) {\n", " let dummy = new ListNode();\n", @@ -84,9 +84,9 @@ ] }, { - "id": 7, + "id": 5, "title": "removeDuplicates", - "language": "js", + "language": "javascript", "blocks": [ "var removeDuplicates = function(nums) {\n", " let i = 1;\n", @@ -103,9 +103,9 @@ ] }, { - "id": 8, + "id": 6, "title": "strStr", - "language": "js", + "language": "javascript", "blocks": [ "var strStr = function(haystack, needle) {\n", " if (haystack.length < needle.length) {\n", @@ -123,9 +123,9 @@ ] }, { - "id": 9, + "id": 7, "title": "searchInsert", - "language": "js", + "language": "javascript", "blocks": [ "var searchInsert = function(nums, target) {\n", " let left = 0;\n", @@ -148,9 +148,9 @@ ] }, { - "id": 10, + "id": 8, "title": "lengthOfLastWord", - "language": "js", + "language": "javascript", "blocks": [ "var lengthOfLastWord = function(s) {\n", " let length = 0;\n", @@ -167,9 +167,9 @@ ] }, { - "id": 11, + "id": 9, "title": "plusOne", - "language": "js", + "language": "javascript", "blocks": [ "var plusOne = function(digits) {\n", " for (let i = digits.length - 1; i >= 0; i--) {\n", @@ -187,9 +187,9 @@ ] }, { - "id": 12, + "id": 10, "title": "addBinary", - "language": "js", + "language": "javascript", "blocks": [ "var addBinary = function(a, b) {\n", " let carry = 0;\n", @@ -214,9 +214,9 @@ ] }, { - "id": 13, + "id": 11, "title": "mySqrt", - "language": "js", + "language": "javascript", "blocks": [ "var mySqrt = function(x) {\n", " var left = 1;\n", @@ -240,9 +240,9 @@ ] }, { - "id": 14, + "id": 12, "title": "climbStairs", - "language": "js", + "language": "javascript", "blocks": [ "var climbStairs = function(n) {\n", " if (n <= 3) return n;\n", @@ -262,9 +262,9 @@ ] }, { - "id": 15, + "id": 13, "title": "deleteDuplicates", - "language": "js", + "language": "javascript", "blocks": [ "var deleteDuplicates = function(head) {\n", " let res = head;\n", @@ -282,9 +282,9 @@ ] }, { - "id": 16, + "id": 14, "title": "mergeSortedArray", - "language": "js", + "language": "javascript", "blocks": [ "var merge = function(nums1, m, nums2, n) {\n", " for (let i = m, j = 0; j < n; i++, j++) {\n", @@ -295,9 +295,9 @@ ] }, { - "id": 17, + "id": 15, "title": "inorderTraversal", - "language": "js", + "language": "javascript", "blocks": [ "var inorderTraversal = function(root) {\n", " const res = [];\n", @@ -317,9 +317,9 @@ ] }, { - "id": 17, + "id": 16, "title": "isSameTree", - "language": "js", + "language": "javascript", "blocks": [ "var isSameTree = function(p, q) {\n", " if (!p && !q) {\n", @@ -335,9 +335,9 @@ ] }, { - "id": 18, + "id": 17, "title": "isSymmetric", - "language": "js", + "language": "javascript", "blocks": [ "var isSymmetric = function(root) {\n", " const isMirror = (n1, n2) => {\n", @@ -356,5 +356,617 @@ " return isMirror(root.left, root.right);\n", "};\n" ] + }, + { + "id": 18, + "title": "twoSum", + "language": "golang", + "blocks": [ + "func twoSum(nums []int, target int) []int {\n", + " m := map[int]int{}\n", + " for i, n := range nums {\n", + " if j, ok := m[target-n]; ok {\n", + " return []int{j, i}\n", + " }\n", + " m[n] = i\n", + " }\n", + " return nil\n", + "}\n" + ] + }, + { + "id": 19, + "title": "isPalindrome", + "language": "golang", + "blocks": [ + "func isPalindrome(x int) bool {\n", + " if x < 0 {\n", + " return false\n", + " }\n", + " orig, rev := x, 0\n", + " for x > 0 {\n", + " rev = rev*10 + x%10\n", + " x /= 10\n", + " }\n", + " return rev == orig\n", + "}\n" + ] + }, + { + "id": 20, + "title": "longestCommonPrefix", + "language": "golang", + "blocks": [ + "func longestCommonPrefix(strs []string) string {\n", + " if len(strs) == 0 {\n", + " return \"\"\n", + " }\n", + " pref := strs[0]\n", + " for _, s := range strs[1:] {\n", + " i := 0\n", + " for i < len(pref) && i < len(s) && pref[i] == s[i] {\n", + " i++\n", + " }\n", + " pref = pref[:i]\n", + " if pref == \"\" {\n", + " break\n", + " }\n", + " }\n", + " return pref\n", + "}\n" + ] + }, + { + "id": 21, + "title": "mergeTwoLists", + "language": "golang", + "blocks": [ + "func mergeTwoLists(l1, l2 *ListNode) *ListNode {\n", + " d := &ListNode{}\n", + " cur := d\n", + " for l1 != nil && l2 != nil {\n", + " if l1.Val < l2.Val {\n", + " cur.Next, l1 = l1, l1.Next\n", + " } else {\n", + " cur.Next, l2 = l2, l2.Next\n", + " }\n", + " cur = cur.Next\n", + " }\n", + " if l1 != nil {\n", + " cur.Next = l1\n", + " } else {\n", + " cur.Next = l2\n", + " }\n", + " return d.Next\n", + "}\n" + ] + }, + { + "id": 22, + "title": "removeDuplicates", + "language": "golang", + "blocks": [ + "func removeDuplicates(nums []int) int {\n", + " i := 1\n", + " for j := 1; j < len(nums); j++ {\n", + " if nums[j] != nums[i-1] {\n", + " nums[i], i = nums[j], i+1\n", + " }\n", + " }\n", + " return i\n", + "}\n" + ] + }, + { + "id": 23, + "title": "strStr", + "language": "golang", + "blocks": [ + "func strStr(haystack, needle string) int {\n", + " if len(needle) == 0 {\n", + " return 0\n", + " }\n", + " for i := 0; i+len(needle) <= len(haystack); i++ {\n", + " if haystack[i:i+len(needle)] == needle {\n", + " return i\n", + " }\n", + " }\n", + " return -1\n", + "}\n" + ] + }, + { + "id": 24, + "title": "searchInsert", + "language": "golang", + "blocks": [ + "func searchInsert(nums []int, target int) int {\n", + " l, r := 0, len(nums)-1\n", + " for l <= r {\n", + " m := (l + r) / 2\n", + " if nums[m] == target {\n", + " return m\n", + " }\n", + " if nums[m] < target {\n", + " l = m + 1\n", + " } else {\n", + " r = m - 1\n", + " }\n", + " }\n", + " return l\n", + "}\n" + ] + }, + { + "id": 25, + "title": "lengthOfLastWord", + "language": "golang", + "blocks": [ + "func lengthOfLastWord(s string) int {\n", + " l := 0\n", + " for i := len(s) - 1; i >= 0; i-- {\n", + " if s[i] != ' ' {\n", + " l++\n", + " } else if l > 0 {\n", + " break\n", + " }\n", + " }\n", + " return l\n", + "}\n" + ] + }, + { + "id": 26, + "title": "plusOne", + "language": "golang", + "blocks": [ + "func plusOne(digits []int) []int {\n", + " for i := len(digits) - 1; i >= 0; i-- {\n", + " digits[i]++\n", + " if digits[i] < 10 {\n", + " return digits\n", + " }\n", + " digits[i] = 0\n", + " }\n", + " return append([]int{1}, digits...)\n", + "}\n" + ] + }, + { + "id": 27, + "title": "addBinary", + "language": "golang", + "blocks": [ + "func addBinary(a, b string) string {\n", + " i, j, carry := len(a)-1, len(b)-1, 0\n", + " res := \"\"\n", + " for i >= 0 || j >= 0 || carry > 0 {\n", + " sum := carry\n", + " if i >= 0 {\n", + " sum += int(a[i] - '0')\n", + " i--\n", + " }\n", + " if j >= 0 {\n", + " sum += int(b[j] - '0')\n", + " j--\n", + " }\n", + " res = string('0'+sum%2) + res\n", + " carry = sum / 2\n", + " }\n", + " return res\n", + "}\n" + ] + }, + { + "id": 28, + "title": "mySqrt", + "language": "golang", + "blocks": [ + "func mySqrt(x int) int {\n", + " l, r := 0, x\n", + " for l <= r {\n", + " m := (l + r) / 2\n", + " if m*m <= x {\n", + " l = m + 1\n", + " } else {\n", + " r = m - 1\n", + " }\n", + " }\n", + " return r\n", + "}\n" + ] + }, + { + "id": 29, + "title": "climbStairs", + "language": "golang", + "blocks": [ + "func climbStairs(n int) int {\n", + " if n <= 3 {\n", + " return n\n", + " }\n", + " a, b := 2, 3\n", + " for i := 4; i <= n; i++ {\n", + " a, b = b, a+b\n", + " }\n", + " return b\n", + "}\n" + ] + }, + { + "id": 30, + "title": "deleteDuplicatesList", + "language": "golang", + "blocks": [ + "func deleteDuplicatesList(head *ListNode) *ListNode {\n", + " cur := head\n", + " for cur != nil && cur.Next != nil {\n", + " if cur.Val == cur.Next.Val {\n", + " cur.Next = cur.Next.Next\n", + " } else {\n", + " cur = cur.Next\n", + " }\n", + " }\n", + " return head\n", + "}\n" + ] + }, + { + "id": 31, + "title": "mergeSortedArray", + "language": "golang", + "blocks": [ + "func merge(nums1 []int, m int, nums2 []int, n int) {\n", + " i, j, k := m-1, n-1, m+n-1\n", + " for j >= 0 {\n", + " if i >= 0 && nums1[i] > nums2[j] {\n", + " nums1[k] = nums1[i]\n", + " i--\n", + " } else {\n", + " nums1[k] = nums2[j]\n", + " j--\n", + " }\n", + " k--\n", + " }\n", + "}\n" + ] + }, + { + "id": 32, + "title": "inorderTraversal", + "language": "golang", + "blocks": [ + "func inorderTraversal(root *TreeNode) []int {\n", + " res := []int{}\n", + " var dfs func(*TreeNode)\n", + " dfs = func(n *TreeNode) {\n", + " if n == nil {\n", + " return\n", + " }\n", + " dfs(n.Left)\n", + " res = append(res, n.Val)\n", + " dfs(n.Right)\n", + " }\n", + " dfs(root)\n", + " return res\n", + "}\n" + ] + }, + { + "id": 33, + "title": "isSameTree", + "language": "golang", + "blocks": [ + "func isSameTree(p, q *TreeNode) bool {\n", + " if p == nil || q == nil {\n", + " return p == q\n", + " }\n", + " if p.Val != q.Val {\n", + " return false\n", + " }\n", + " return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)\n", + "}\n" + ] + }, + { + "id": 34, + "title": "isSymmetric", + "language": "golang", + "blocks": [ + "func isSymmetric(root *TreeNode) bool {\n", + " var check func(a, b *TreeNode) bool\n", + " check = func(a, b *TreeNode) bool {\n", + " if a == nil || b == nil {\n", + " return a == b\n", + " }\n", + " if a.Val != b.Val {\n", + " return false\n", + " }\n", + " return check(a.Left, b.Right) && check(a.Right, b.Left)\n", + " }\n", + " if root == nil {\n", + " return true\n", + " }\n", + " return check(root.Left, root.Right)\n", + "}\n" + ] + }, + { + "id": 35, + "title": "twoSum", + "language": "python", + "blocks": [ + "def twoSum(nums, target):\n", + " lookup = {}\n", + " for i, num in enumerate(nums):\n", + " other = target - num\n", + " if other in lookup:\n", + " return [lookup[other], i]\n", + " lookup[num] = i\n", + " return []\n" + ] + }, + { + "id": 36, + "title": "isPalindrome", + "language": "python", + "blocks": [ + "def isPalindrome(x):\n", + " if x < 0:\n", + " return False\n", + " original, rev = x, 0\n", + " while x > 0:\n", + " rev = rev * 10 + (x % 10)\n", + " x //= 10\n", + " return rev == original\n" + ] + }, + { + "id": 37, + "title": "longestCommonPrefix", + "language": "python", + "blocks": [ + "def longestCommonPrefix(strs):\n", + " if not strs: return \"\"\n", + " prefix = strs[0]\n", + " for s in strs[1:]:\n", + " i = 0\n", + " while i < len(prefix) and i < len(s) and prefix[i] == s[i]:\n", + " i += 1\n", + " prefix = prefix[:i]\n", + " if not prefix:\n", + " break\n", + " return prefix\n" + ] + }, + { + "id": 38, + "title": "mergeTwoLists", + "language": "python", + "blocks": [ + "def mergeTwoLists(l1, l2):\n", + " dummy = ListNode()\n", + " cur = dummy\n", + " while l1 and l2:\n", + " if l1.val <= l2.val:\n", + " cur.next, l1 = l1, l1.next\n", + " else:\n", + " cur.next, l2 = l2, l2.next\n", + " cur = cur.next\n", + " cur.next = l1 or l2\n", + " return dummy.next\n" + ] + }, + { + "id": 39, + "title": "removeDuplicates", + "language": "python", + "blocks": [ + "def removeDuplicates(nums):\n", + " if not nums: return 0\n", + " i = 1\n", + " for j in range(1, len(nums)):\n", + " if nums[j] != nums[i - 1]:\n", + " nums[i] = nums[j]\n", + " i += 1\n", + " return i\n" + ] + }, + { + "id": 40, + "title": "strStr", + "language": "python", + "blocks": [ + "def strStr(haystack, needle):\n", + " if len(needle) == 0:\n", + " return 0\n", + " for i in range(len(haystack) - len(needle) + 1):\n", + " if haystack[i:i + len(needle)] == needle:\n", + " return i\n", + " return -1\n" + ] + }, + { + "id": 41, + "title": "searchInsert", + "language": "python", + "blocks": [ + "def searchInsert(nums, target):\n", + " left, right = 0, len(nums) - 1\n", + " while left <= right:\n", + " mid = (left + right) // 2\n", + " if nums[mid] == target:\n", + " return mid\n", + " elif nums[mid] < target:\n", + " left = mid + 1\n", + " else:\n", + " right = mid - 1\n", + " return left\n" + ] + }, + { + "id": 42, + "title": "lengthOfLastWord", + "language": "python", + "blocks": [ + "def lengthOfLastWord(s):\n", + " length = 0\n", + " for i in range(len(s) - 1, -1, -1):\n", + " if s[i] != ' ':\n", + " length += 1\n", + " elif length > 0:\n", + " break\n", + " return length\n" + ] + }, + { + "id": 43, + "title": "plusOne", + "language": "python", + "blocks": [ + "def plusOne(digits):\n", + " n = len(digits)\n", + " for i in range(n - 1, -1, -1):\n", + " if digits[i] < 9:\n", + " digits[i] += 1\n", + " return digits\n", + " digits[i] = 0\n", + " return [1] + digits\n" + ] + }, + { + "id": 44, + "title": "addBinary", + "language": "python", + "blocks": [ + "def addBinary(a, b):\n", + " i, j, carry = len(a) - 1, len(b) - 1, 0\n", + " res = []\n", + " while i >= 0 || j >= 0 || carry:\n", + " s = carry\n", + " if i >= 0:\n", + " s += int(a[i])\n", + " i -= 1\n", + " if j >= 0:\n", + " s += int(b[j])\n", + " j -= 1\n", + " res.append(str(s % 2))\n", + " carry = s // 2\n", + " return ''.join(reversed(res))\n" + ] + }, + { + "id": 45, + "title": "mySqrt", + "language": "python", + "blocks": [ + "def mySqrt(x):\n", + " left, right = 0, x\n", + " ans = 0\n", + " while left <= right:\n", + " mid = (left + right) // 2\n", + " if mid * mid <= x:\n", + " ans = mid\n", + " left = mid + 1\n", + " else:\n", + " right = mid - 1\n", + " return ans\n" + ] + }, + { + "id": 46, + "title": "climbStairs", + "language": "python", + "blocks": [ + "def climbStairs(n):\n", + " if n <= 3:\n", + " return n\n", + " prev2, prev1 = 2, 3\n", + " for _ in range(4, n + 1):\n", + " next_val = prev1 + prev2\n", + " prev2 = prev1\n", + " prev1 = next_val\n", + " return prev1\n" + ] + }, + { + "id": 47, + "title": "deleteDuplicates", + "language": "python", + "blocks": [ + "def deleteDuplicates(head):\n", + " cur = head\n", + " while cur and cur.next:\n", + " if cur.val == cur.next.val:\n", + " cur.next = cur.next.next\n", + " else:\n", + " cur = cur.next\n", + " return head\n" + ] + }, + { + "id": 48, + "title": "mergeSortedArray", + "language": "python", + "blocks": [ + "def merge(nums1, m, nums2, n):\n", + " # Modifica nums1 en sitio\n", + " i, j, k = m - 1, n - 1, m + n - 1\n", + " while j >= 0:\n", + " if i >= 0 and nums1[i] > nums2[j]:\n", + " nums1[k] = nums1[i]\n", + " i -= 1\n", + " else:\n", + " nums1[k] = nums2[j]\n", + " j -= 1\n", + " k -= 1\n" + ] + }, + { + "id": 49, + "title": "inorderTraversal", + "language": "python", + "blocks": [ + "def inorderTraversal(root):\n", + " res = []\n", + " def dfs(node):\n", + " if not node:\n", + " return\n", + " dfs(node.left)\n", + " res.append(node.val)\n", + " dfs(node.right)\n", + " dfs(root)\n", + " return res\n" + ] + }, + { + "id": 50, + "title": "isSameTree", + "language": "python", + "blocks": [ + "def isSameTree(p, q):\n", + " if not p and not q:\n", + " return True\n", + " if not p or not q or p.val != q.val:\n", + " return False\n", + " return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)\n" + ] + }, + { + "id": 51, + "title": "isSymmetric", + "language": "python", + "blocks": [ + "def isSymmetric(root):\n", + " def isMirror(a, b):\n", + " if not a and not b:\n", + " return True\n", + " if not a or not b or a.val != b.val:\n", + " return False\n", + " return isMirror(a.left, b.right) and isMirror(a.right, b.left)\n", + " if not root:\n", + " return True\n", + " return isMirror(root.left, root.right)\n" + ] } -] +] \ No newline at end of file diff --git a/game/src/data/themes.js b/game/src/data/themes.js index 73ae43f..5af6b6a 100644 --- a/game/src/data/themes.js +++ b/game/src/data/themes.js @@ -29,7 +29,7 @@ export const themes = [ classes: /\b(?:class|interface|enum)\s+[A-Z]\w*\b/, brackets: /[\(\)\[\]\{\}<>]/, keywords: - /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/, + /\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly|def|pass|lambda|nonlocal|global|assert|del|is|not|and|or|True|False|None|elif|except|raise|finally|continue|break|with|as|in|try|yield|await)\b/, types: /:\s*[A-Za-z_$][\w$<>, ]*/, decorators: /@\w+/, regex: /\/(\\\/|[^\/\n])+\/[gimsuy]*/, diff --git a/game/src/data/utilities.js b/game/src/data/utilities.js new file mode 100644 index 0000000..88cd792 --- /dev/null +++ b/game/src/data/utilities.js @@ -0,0 +1,37 @@ +let capsLockActive = false; + +export function toggleCapsLock() { + capsLockActive = !capsLockActive; +} +export function setCapsLockActive(value) { + capsLockActive = value; +} +export function shouldUppercase(k) { + const shift = k.isKeyDown("shift"); + return (shift && !capsLockActive) || (!shift && capsLockActive); +} + +export function escapeBackslashes(str) { + return str.replace(/\\/g, "\\\\"); +} + +export function preventError(k, settings) { + k.shake(2); + if (!settings?.mute) { + k.play("wrong_typing"); + } +} + +export function shuffle(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +} + +export function makeBlink(k, entity) { + k.loop(0.5, () => { + entity.opacity = entity.opacity === 0 ? 0.8 : 0; + }); +} diff --git a/game/src/kaplay.js b/game/src/kaplay.js index 9ac4d4d..6cc53b2 100644 --- a/game/src/kaplay.js +++ b/game/src/kaplay.js @@ -1,7 +1,7 @@ // kaplay.js import kaplay from 'kaplay'; -export const MEASUREMENT_ID = 'G-6CCP4C6VS7'; +export const MEASUREMENT_ID = 'G-2GKHT76YTG'; /** * @param {string} measurementId diff --git a/game/src/main.js b/game/src/main.js index bdcfac8..907fc8b 100644 --- a/game/src/main.js +++ b/game/src/main.js @@ -7,4 +7,5 @@ import "./scenes/endGame.js"; // load endGame scene import "./scenes/selectionScene.js"; import "./scenes/about.js"; import "./data/changeStyle.js"; +import "./data/utilities.js"; k.go("selection"); diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index bf91863..e359f1d 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -15,13 +15,19 @@ import { maxMistakes, ICON_START_Y } from "../constants.js"; -import { savePlay, getPlay } from "../systems/saves.js"; +import { + toggleCapsLock, + shouldUppercase, + preventError, + shuffle, + makeBlink +} from "../data/utilities.js"; + import { k, loadGtag, onBlockReached, onGameStart, MEASUREMENT_ID } from "../kaplay.js"; import { themes } from "../data/themes.js"; import { resizablePos } from "../components/resizablePos.js"; import { resizableRect } from "../components/resizableRect.js"; import { settings } from "./selectionScene.js"; -let titles = dialogsData.map((item) => item.title); let COLOR_TEXT_DEFAULT = k.Color.fromHex("#6a717d"); let COLOR_TEXT_RIVAL = k.YELLOW; @@ -32,6 +38,7 @@ let fontWidth = 16.4; let errorCharsIndexes = []; let errorCharsReplaces = {}; let playerStartedTyping = false; + export let actual_wpm = 0; export let actual_lpm = 0; export let actual_acc = 0; @@ -62,7 +69,7 @@ let renderedText = ""; * Text for comparison with user input */ let fixedText = ""; - +let cachedTokens = []; /** * @param {GameParams} params */ @@ -94,26 +101,13 @@ const gameScene = (params) => { const intervalTime = 100; let volumeIncrease; - function updateMusicVolume() { - clearInterval(volumeIncrease); - - if (settings.mute) { - music.volume = 0.0; - } else { - let currentVolume = 0.0; - volumeIncrease = setInterval(() => { - if (currentVolume < maxVolume) { - currentVolume += volumeStep; - music.volume = Math.min(currentVolume, maxVolume); - } else { - clearInterval(volumeIncrease); - } - }, intervalTime); - } - } - - titles = shuffle(dialogsData); + const filteredDialogs = dialogsData.filter( + item => (item.language || "default") === settings.language + ); + const shuffledDialogs = shuffle([...filteredDialogs]); + //save for analiytics + blockNamesString = shuffledDialogs.slice(0, MAX_BLOCKS).map(item => item.title); // #region PLAYER & RIVAL VARIABLES /** @@ -162,10 +156,6 @@ const gameScene = (params) => { }; // #endregion - - /** - * @param {number} i - */ /** * @param {number} i */ @@ -189,14 +179,10 @@ const gameScene = (params) => { if (test()) return k.Color.fromHex(color); } - const tokenPattern = /[\w$]+|[^\s\w]/g; let token = ""; - for (const m of originalText.matchAll(tokenPattern)) { - const [text] = m; - const start = m.index; - const end = start + text.length; - if (i >= start && i < end) { - token = text; + for (const t of cachedTokens) { + if (i >= t.start && i < t.end) { + token = t.text; break; } } @@ -224,7 +210,6 @@ const gameScene = (params) => { updateAWPM(); return; } - startTime += k.dt(); if (!settings.practiceMode) { rivalTimer += k.dt(); @@ -247,6 +232,23 @@ const gameScene = (params) => { updateAWPM(); }); + function updateMusicVolume() { + clearInterval(volumeIncrease); + + if (settings.mute) { + music.volume = 0.0; + } else { + let currentVolume = 0.0; + volumeIncrease = setInterval(() => { + if (currentVolume < maxVolume) { + currentVolume += volumeStep; + music.volume = Math.min(currentVolume, maxVolume); + } else { + clearInterval(volumeIncrease); + } + }, intervalTime); + } + } function updateAWPM() { const totalEventsLast60 = eventBuffer.reduce((sum, count) => sum + count, 0); actual_awpm = totalEventsLast60 / 5; @@ -262,6 +264,18 @@ const gameScene = (params) => { .replace(/\}/g, "\\}") .replace(/'/g, "\\'"); } + + function prepareTokenCache(text) { + const tokenPattern = /[\w$]+|[^\s\w]/g; + cachedTokens = []; + for (const m of text.matchAll(tokenPattern)) { + cachedTokens.push({ + text: m[0], + start: m.index, + end: m.index + m[0].length, + }); + } + } function StatsforAnalitics() { goal_wpm = actual_wpm; goal_awpm = actual_awpm; @@ -287,7 +301,19 @@ const gameScene = (params) => { errorCharsIndexes = []; errorCharsReplaces = {}; } + function updateTitleTexts() { + const titleTexts = k.get("menuItem"); + for (let i = 0; i < titleTexts.length; i++) { + const textObj = titleTexts[i]; + if (shuffledDialogs[currentBlockIndex + i]) { + textObj.text = shuffledDialogs[currentBlockIndex + i].title; + textObj.color = (currentBlockIndex + i) <= currentBlockIndex ? k.rgb(127, 134, 131) : k.WHITE; + } else { + textObj.text = ""; + } + } + } // background // Files & Folders const filesFoldersSize = () => { @@ -314,7 +340,7 @@ const gameScene = (params) => { k.color(k.YELLOW), k.z(22), k.opacity(settings.practiceMode ? 0 : 1), - ]); + ]); k.add([ k.sprite("BG_WPM_IN_GAME"), @@ -380,21 +406,23 @@ const gameScene = (params) => { ]); const languageIconMap = { - js: "icon_02", + javascript: "icon_02", ts: "icon_01", - go: "icon_03", + golang: "icon_03", react: "icon_04", - py: "icon_05", + python: "icon_05", default: "icon_02", }; - const texts = dialogsData.map(item => ({ - title: item.title, - language: item.language || "default", - })); + const texts = dialogsData + .filter(item => (item.language || "default") === settings.language) + .map(item => ({ + title: item.title, + language: item.language || "default", + })); const visibleTexts = texts.slice(0, MAX_BLOCKS); - blockNamesString = visibleTexts.map(item => item.title); + visibleTexts.forEach(({ title, language }, index) => { const spriteKey = languageIconMap[language] ?? languageIconMap.default; @@ -504,7 +532,6 @@ const gameScene = (params) => { const textboxTextPos = () => { - matchColorToken return k.vec2(textPadding).sub(0, lineHeight * (JUMP_AFTER * jumpCount)); } @@ -553,28 +580,23 @@ const gameScene = (params) => { k.opacity(settings.practiceMode ? 0 : 1), k.anchor("left"), k.color(COLOR_TEXT_RIVAL), - ]); + ]); - makeBlink(cursorPointer); - - if (!settings.practiceMode) { - makeBlink(rivalPointer); - } + makeBlink(k, cursorPointer); - function makeBlink(entity) { - k.loop(0.5, () => { - entity.opacity = entity.opacity === 0 ? 0.8 : 0; - }); + if (!settings.practiceMode) { + makeBlink(k, rivalPointer); } + playerState.cursorPointer = cursorPointer; rivalState.cursorPointer = rivalPointer; function getCurrentDialog() { - if (dialogsData && dialogsData[currentBlockIndex]) { - return dialogsData[currentBlockIndex]; + if (shuffledDialogs[currentBlockIndex]) { + return shuffledDialogs[currentBlockIndex]; } else { - console.error("dialogs.json is undefined or out of range"); - return dialogsData[0]; + console.error("No dialogs found for the selected language"); + return shuffledDialogs[0]; } } @@ -613,6 +635,7 @@ const gameScene = (params) => { const startSpeed = EASY_RIVAL_SPEED; const endSpeed = HARD_RIVAL_SPEED; const steps = 4; + if (completedBlocks > 0) { const t = Math.min(completedBlocks, steps) / steps; @@ -620,7 +643,6 @@ const gameScene = (params) => { } else { rivalSpeed = startSpeed; } - k.play playerState.reset(); rivalState.reset(); arrow.pos = k.vec2(arrow.pos.x, arrow_ypos); @@ -639,12 +661,11 @@ const gameScene = (params) => { theme = themes.find(t => t.name === lang) || themes[0]; const currentBlocks = currentDialog.blocks; curBlockData.lineCount = currentBlocks.length; - originalText = currentBlocks.join(""); - const fixedGroup = escapeForRender(originalText); - renderedText = fixedGroup; - textboxText.text = renderedText; + prepareTokenCache(originalText); + + const fixedGroup = escapeForRender(originalText); fixedText = originalText.replace(/▯/g, " "); renderedText = fixedGroup; textboxText.text = renderedText; @@ -696,13 +717,6 @@ const gameScene = (params) => { logGroupWithColor(fixedText); } - function preventError() { - k.shake(2); - if (!settings.mute) { - k.play("wrong_typing"); - } - } - function nextLine(isRival = false) { const player = isRival ? rivalState : playerState; if (!player.cursorPointer) return; @@ -742,14 +756,6 @@ const gameScene = (params) => { } } - function shuffle(array) { - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [array[i], array[j]] = [array[j], array[i]]; - } - return array; - } - function analitycs_calculate() { time_text.text = startTime.toFixed(1); if (startTime > 0 && totalCorrectChars > 5) { @@ -782,13 +788,19 @@ const gameScene = (params) => { let idx = currentSec % BUFFER_SIZE; eventBuffer[idx]++; } - let errorKey; + + let capsLockActive = false; + k.onKeyPress("capslock", () => { + toggleCapsLock(); + }); + k.onKeyPress((keyPressed) => { - const curChar = fixedText[playerState.cursorPos]; const prevChar = playerState.cursorPos > 0 ? fixedText[playerState.cursorPos] : ''; if (prevChar === "\n") return; + const correctChar = fixedText[playerState.cursorPos]; - const shifting = k.isKeyDown("shift"); + const shouldUpper = shouldUppercase(k); + let key = keyPressed; let errorKey; let isCorrect = false; @@ -796,7 +808,7 @@ const gameScene = (params) => { if (key === "backspace" || key === "enter" || key === "shift") return; if (key.length === 1) { - key = shifting ? key.toUpperCase() : key; + key = shouldUpper ? key.toUpperCase() : key.toLowerCase(); errorKey = key; } else if (key === "space") { key = " "; @@ -804,6 +816,7 @@ const gameScene = (params) => { } else { return; } + totalTypedCharacters++; isCorrect = key === correctChar; @@ -813,7 +826,7 @@ const gameScene = (params) => { addCorrectEvent(); nextChar(); } else { - if (errorCharsIndexes.length > maxMistakes) return preventError(); + if (errorCharsIndexes.length > maxMistakes) return preventError(k, settings); errorCharsIndexes.push(playerState.cursorPos); errorCharsReplaces[playerState.cursorPos] = errorKey; @@ -833,7 +846,7 @@ const gameScene = (params) => { const isCorrect = "\n" === correctChar; if (errorCharsIndexes.length > 0 || !isCorrect) { - return preventError(); + return preventError(k, settings); } if (playerState.curLineCount >= curBlockData.lineCount - 1) { @@ -874,6 +887,8 @@ const gameScene = (params) => { }); updateDialog(); + updateTitleTexts(); + moveArrow(); }; k.scene("game", gameScene); \ No newline at end of file diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index a8663e2..a1969dd 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -1,21 +1,24 @@ +import { + escapeBackslashes, + preventError, + setCapsLockActive +} from "../data/utilities.js"; import { getMute, saveMute } from "../systems/preferences.js"; import { resizablePos } from "../components/resizablePos.js"; import { k } from "../kaplay.js"; export const settings = { mute: false, practiceMode: false, + isCapsOn: false, rivalSpeed: 0, + language: "js" }; function isMobile() { return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i .test(navigator.userAgent); } -function escapeBackslashes(str) { - return str.replace(/\\/g, "\\\\"); -} - k.scene("selection", () => { - k.loadSprite("icon_05", "/sprites/icon_04.png"); + k.loadSprite("icon_05", "/sprites/icon_05.png"); k.loadSprite("icon_04", "/sprites/icon_04.png"); k.loadSprite("icon_03", "/sprites/icon_03.png"); k.loadSprite("icon_02", "/sprites/icon_02.png"); @@ -87,9 +90,10 @@ k.scene("selection", () => { const outsideBox = k.add([k.rect(810, 260, { radius: 0 }), k.pos(k.width() * 0.30 - 15, boxY), k.color(k.rgb(52, 53, 54)), k.z(20), k.opacity(0.3)]); const outerBox = k.add([k.rect(790, 230, { radius: 1 }), k.pos(k.width() * 0.30 - 5, boxY + 20), k.color(0, 0, 0), k.z(20), k.opacity(1)]); - const StartText = k.add([k.anchor("left"), k.text("Start", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY)), k.opacity(1), k.z(21)]); - const gitText = k.add([k.anchor("left"), k.text("Github", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); - const aboutText = k.add([k.anchor("left"), k.text("About", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap * 2)), k.opacity(1), k.z(21)]); + const selecttext = k.add([k.anchor("left"), k.text("", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY)), k.opacity(1), k.z(21)]); + const selecttext2 = k.add([k.anchor("left"), k.text("", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); + const selecttext3 = k.add([k.anchor("left"), k.text("", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX, buttonTopY + buttonGap * 2)), k.opacity(1), k.z(21)]); + const selecttext4 = k.add([k.anchor("left"), k.text("", { size: fontsize }), resizablePos(() => k.vec2(buttonLeftX + 250, buttonTopY + buttonGap)), k.opacity(1), k.z(21)]); const button_muteON = k.add([ k.sprite("muteON"), @@ -120,50 +124,45 @@ k.scene("selection", () => { switch (stage) { case 0: commands = ["about", "github", "start"]; - StartText.text = "Start"; - gitText.text = "Github"; - aboutText.text = "About"; break; case 1: commands = ["yes", "no"]; - StartText.text = "Play with Audio?"; - gitText.text = "Yes"; - aboutText.text = "No"; break; case 2: + commands = ["javascript", "python", "golang"]; + break; + case 3: commands = ["interview", "practice"]; - StartText.text = "Game Mode"; - gitText.text = "Interview"; - aboutText.text = "Practice"; break; } + selecttext.text = stage === 0 ? "Start" + : stage === 1 ? "Play with Audio?" + : stage === 2 ? "Language" + : "Game Mode"; + selecttext2.text = commands[0]; + selecttext3.text = commands[1]; + if (stage === 2) selecttext4.text = commands[2]; + else selecttext4.text = ""; updateTextColors(); } function calcNewTarget(input) { - if (input === "") { - switch (stage) { - case 1: - return "Yes"; - case 2: - return "Interview"; - default: - return "Start"; - } + if (input !== "") { + const match = commands.find(cmd => + cmd.startsWith(input.toLowerCase()) + ); + if (match) return match; } - const found = commands.find(cmd => cmd.startsWith(input.toLowerCase())); - if (found) return found; + const defaults = { + 1: "yes", + 2: "javascript", + 3: "interview" + }; - switch (stage) { - case 1: - return "Yes"; - case 2: - return "Interview"; - default: - return "Start"; - } + return defaults[stage] || "start"; } + function moveArrow(targetObj) { const newY = targetObj.pos.y + arrowYOffset; const newX = targetObj.pos.x + targetObj.text.length * 16; @@ -215,31 +214,44 @@ k.scene("selection", () => { createLetterObjects(); function updateTextColors() { - StartText.color = k.rgb(255, 255, 255); - gitText.color = k.rgb(255, 255, 255); - aboutText.color = k.rgb(255, 255, 255); - + selecttext.color = k.rgb(255, 255, 255); + selecttext2.color = k.rgb(255, 255, 255); + selecttext3.color = k.rgb(255, 255, 255); + const cmdLower = targetText.toLowerCase(); let commandList; - - if (stage === 1) { - commandList = [ - { obj: gitText, label: "yes" }, - { obj: aboutText, label: "no" } - ]; - } else if (stage === 2) { - commandList = [ - { obj: gitText, label: "interview" }, - { obj: aboutText, label: "practice" } - ]; - } else { - commandList = [ - { obj: StartText, label: "start" }, - { obj: gitText, label: "github" }, - { obj: aboutText, label: "about" } - ]; + + switch (stage) { + case 0: + commandList = [ + { obj: selecttext, label: "start" }, + { obj: selecttext2, label: "github" }, + { obj: selecttext3, label: "about" } + ]; + break; + case 1: + commandList = [ + { obj: selecttext2, label: "yes" }, + { obj: selecttext3, label: "no" } + ]; + break; + case 2: + commandList = [ + { obj: selecttext2, label: "javascript" }, + { obj: selecttext3, label: "python" }, + { obj: selecttext4, label: "golang" } + ]; + break; + case 3: + commandList = [ + { obj: selecttext2, label: "interview" }, + { obj: selecttext3, label: "practice" } + ]; + break; + default: + commandList = []; } - + let selected = null; commandList.forEach(({ obj, label }) => { if (cmdLower === label) { @@ -247,7 +259,7 @@ k.scene("selection", () => { selected = obj; } }); - + if (selected) { commandArrow.opacity = 1; moveArrow(selected); @@ -285,19 +297,9 @@ k.scene("selection", () => { button_muteOFF.opacity = settings.mute ? 1 : 0; } - let isPreventingError = false; let previousInput = ""; let lastErrorCount = 0; let rawInput = ""; - function preventError() { - if (isPreventingError) return; - isPreventingError = true; - k.shake(2); - if (!settings.mute) { - k.play("wrong_typing"); - } - k.wait(0.3, () => { isPreventingError = false; }); - } function handleInputUpdate(input) { const candidate = calcNewTarget(input); @@ -324,14 +326,14 @@ k.scene("selection", () => { const hasAdvancedPastError = localErrorCount >= 2 && input.length > lastErrorIndex + 1; if (isTooLongTotal || isGrowingWithErrors) { - preventError(); + preventError(k, settings); rawInput = previousInput; name.text = escapeBackslashes(rawInput); return; } if (localErrorCount > lastErrorCount) { - preventError(); + preventError(k, settings); } lastErrorCount = localErrorCount; @@ -369,6 +371,21 @@ k.scene("selection", () => { }); switch (input.toLowerCase()) { + case "javascript": + case "python": + case "golang": + if (stage === 2) { + settings.language = input.toLowerCase(); + advanceStage(); + updateStageCommands(); + const candidate = calcNewTarget(""); + if (candidate !== targetText) { + targetText = candidate; + maxLength = targetText.length; + createLetterObjects(); + } + } + break; case "github": if (stage === 0) { window.open("https://github.com/conanbatt/wpm", "_blank"); @@ -377,6 +394,7 @@ k.scene("selection", () => { break; case "about": if (stage === 0) { + window.removeEventListener("keydown", handleKeydown); k.go("about"); } break; @@ -411,17 +429,20 @@ k.scene("selection", () => { } break; case "interview": - if (stage === 2) { + if (stage === 3) { + window.removeEventListener("keydown", handleKeydown); + setCapsLockActive(settings.isCapsOn); k.go("game"); } break; case "practice": - if (stage === 2) { + if (stage === 3) { settings.practiceMode = true; + setCapsLockActive(settings.isCapsOn); + window.removeEventListener("keydown", handleKeydown); k.go("game"); } break; - } updateTextColors(); } @@ -442,34 +463,57 @@ k.scene("selection", () => { stage = 0; resetCommon("Start"); } + function resetInputUI() { - if (stage === 1) { - resetCommon("Yes"); - } else if (stage === 2) { - resetCommon("Interview"); - } else { - resetCommon(commands[0]); + switch (stage) { + case 1: + resetCommon("Yes"); + break; + case 2: + resetCommon("javascript"); + break; + case 3: + resetCommon("Interview"); + break; + default: + resetCommon(commands[0]); + break; } } - function advanceStage() { stage++; resetInputUI(); } - k.onKeyPress((ch) => { - if (ch.length !== 1) return; - const shifting = k.isKeyDown("shift"); - const char = shifting ? ch.toUpperCase() : ch; - previousInput = rawInput; - rawInput += char; - name.text = escapeBackslashes(rawInput); - handleInputUpdate(rawInput); + let handleKeydown; - if (char !== ' ' && !settings.mute) { - k.play('code_sound'); - } - }); + function setupKeyboardInput() { + handleKeydown = (e) => { + if (e.getModifierState && typeof e.getModifierState === "function") { + settings.isCapsOn = e.getModifierState("CapsLock"); + } + if (e.key.length === 1) { + previousInput = rawInput; + rawInput += e.key; + name.text = escapeBackslashes(rawInput); + handleInputUpdate(rawInput); + + if (e.key !== " " && !settings.mute) { + k.play("code_sound"); + } + } + + if (e.key === " ") { + e.preventDefault(); + previousInput = rawInput; + rawInput += " "; + name.text = escapeBackslashes(rawInput); + handleInputUpdate(rawInput); + } + }; + + window.addEventListener("keydown", handleKeydown); + } k.onKeyPress('backspace', () => { if (!rawInput) return; @@ -500,4 +544,5 @@ k.scene("selection", () => { }); }); updateStageCommands(); + setupKeyboardInput(); }); diff --git a/website/public/game/game.js b/website/public/game/game.js index c6b2a60..1cdc95b 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var Yu=Object.defineProperty;var Xu=(t,e,r)=>e in t?Yu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var b=(t,e,r)=>Xu(t,typeof e!="symbol"?e+"":e,r);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(s){if(s.ep)return;s.ep=!0;const i=r(s);fetch(s.href,i)}})();var Ju=Object.defineProperty,o=(t,e)=>Ju(t,"name",{value:e,configurable:!0}),Qu=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var n=r.length,s=new Uint8Array((n-(r[n-1]=="=")-(r[n-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|p}return s}})(),ga={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ie,se=(ie=class{constructor(e,r,n){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=at(e,0,255),this.g=at(r,0,255),this.b=at(n,0,255)}static fromArray(e){return new ie(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ie(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new ie(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,n){if(r==0)return new ie(255*n,255*n,255*n);let s=o((p,y,m)=>(m<0&&(m+=1),m>1&&(m-=1),m<1/6?p+(y-p)*6*m:m<1/2?y:m<2/3?p+(y-p)*(2/3-m)*6:p),"hue2rgb"),i=n<.5?n*(1+r):n+r-n*r,l=2*n-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ie(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let r=ga[e];if(!r)throw new Error("Can't use an invalid CSS color");return ie.fromHex(r)}clone(){return new ie(this.r,this.g,this.b)}lighten(e){return new ie(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ie(255-this.r,255-this.g,255-this.b)}mult(e){return new ie(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new ie(Fe(this.r,e.r,r),Fe(this.g,e.g,r),Fe(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,n=this.b/255,s=Math.max(e,r,n),i=Math.min(e,r,n),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(r-n)/u+(rse.fromHSL(t,e,r),"hsl2rgb");function ye(t){return t*Math.PI/180}o(ye,"deg2rad");function qt(t){return t*180/Math.PI}o(qt,"rad2deg");function at(t,e,r){return e>r?at(t,r,e):Math.min(Math.max(t,e),r)}o(at,"clamp");function Fe(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof q&&e instanceof q||t instanceof se&&e instanceof se)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Fe,"lerp");function it(t,e,r,n,s){return n+(t-e)/(r-e)*(s-n)}o(it,"map");function ma(t,e,r,n,s){return at(it(t,e,r,n,s),n,s)}o(ma,"mapc");var Z,q=(Z=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=ye(e);return new Z(Math.cos(r),Math.sin(r))}static fromArray(e){return new Z(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?Z.LEFT:Z.RIGHT:this.y<0?Z.UP:Z.DOWN}clone(){return new Z(this.x,this.y)}static copy(e,r){return r.x=e.x,r.y=e.y,r}add(...e){let r=C(...e);return new Z(this.x+r.x,this.y+r.y)}static addScaled(e,r,n,s){return s.x=e.x+r.x*n,s.y=e.y+r.y*n,s}static addc(e,r,n,s){return s.x=e.x+r,s.y=e.y+n,s}static add(e,r,n){return n.x=e.x+r.x,n.y=e.y+r.y,n}sub(...e){let r=C(...e);return new Z(this.x-r.x,this.y-r.y)}static subc(e,r,n,s){return s.x=e.x-r,s.y=e.y-n,s}static sub(e,r,n){return n.x=e.x-r.x,n.y=e.y-r.y,n}scale(...e){let r=C(...e);return new Z(this.x*r.x,this.y*r.y)}static scale(e,r,n){return n.x=e.x*r,n.y=e.y*r,n}static scalec(e,r,n,s){return s.x=e.x*r,s.y=e.y*n,s}static scalev(e,r,n){return n.x=e.x*r.x,n.y=e.y*r.y,n}invScale(...e){let r=C(...e);return new Z(this.x/r.x,this.y/r.y)}dist(...e){let r=C(...e);return this.sub(r).len()}static dist(e,r){let n=e.x-r.x,s=e.y-r.y;return Math.sqrt(n*n+s*s)}sdist(...e){let r=C(...e);return this.sub(r).slen()}static sdist(e,r){let n=e.x-r.x,s=e.y-r.y;return n*n+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new Z(0):this.scale(1/e)}static unit(e,r){let n=Z.len(e);return r.x=e.x/n,r.y=e.y/n,r}normal(){return new Z(this.y,-this.x)}static normal(e,r){return r.x=e.y,r.y=-e.x,r}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof Z)return new Z(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let r=ye(e),n=Math.cos(r),s=Math.sin(r);return new Z(this.x*n-this.y*s,this.x*s+this.y*n)}}static rotate(e,r,n){let s=e.x;return n.x=e.x*r.x-e.y*r.y,n.y=s*r.y+e.y*r.x,n}static rotateByAngle(e,r,n){let s=Math.cos(r),i=Math.sin(r),l=e.x;return n.x=e.x*s-e.y*i,n.y=l*i+e.y*s,n}invRotate(e){return e instanceof Z?this.rotate(new Z(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,r,n){let s=e.x;return n.x=e.x*r.x+e.y*r.y,n.y=-s*r.y+e.y*r.x,n}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*r.x+e.y*r.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=C(...e);return qt(Math.atan2(this.y-r.y,this.x-r.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let r=C(...e);return qt(Math.atan2(this.cross(r),this.dot(r)))}static angleBetween(e,r){return Math.atan2(Z.cross(e,r),Z.dot(e,r))}lerp(e,r){return new Z(Fe(this.x,e.x,r),Fe(this.y,e.y,r))}static lerp(e,r,n,s){return s.x=e.x*(r.x-e.x)*n,s.y=e.y*(r.y-e.y)*n,s}slerp(e,r){let n=this.dot(e),s=this.cross(e),i=Math.atan2(s,n);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/s)}static slerp(e,r,n,s){let i=Z.dot(e,r),l=Z.cross(e,r),c=Math.atan2(l,i),h=Math.sin((1-n)*c),u=Math.sin(n*c),p=1/l;return s.x=(e.x*h+r.x*u)*p,s.y=(e.y*h+r.y*u)*p,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new Z(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new we(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(Z,"Vec2"),b(Z,"ZERO",new Z(0,0)),b(Z,"ONE",new Z(1,1)),b(Z,"LEFT",new Z(-1,0)),b(Z,"RIGHT",new Z(1,0)),b(Z,"UP",new Z(0,-1)),b(Z,"DOWN",new Z(0,1)),Z);function C(...t){if(t.length===1){if(t[0]instanceof q)return new q(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new q(...t[0])}return new q(...t)}o(C,"vec2");var Lt,Ae=(Lt=class{constructor(e,r,n,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=n,this.h=s}scale(e){return new Lt(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new q(this.x,this.y)}clone(){return new Lt(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Lt,"Quad"),Lt);function Se(t,e,r,n){return new Ae(t,e,r,n)}o(Se,"quad");var nt,an=(nt=class{constructor(e,r,n,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=n,this.d=s}mul(e){return new nt(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return C(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new nt(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new nt(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,n=e+Math.sqrt(e*e-r),s=e-Math.sqrt(e*e-r);return[n,s]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(C(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return qt(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new q(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new q(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new q(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],n=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[5]*this.m[14]-this.m[13]*this.m[6],y=this.m[4]*this.m[15]-this.m[12]*this.m[7],m=this.m[4]*this.m[14]-this.m[12]*this.m[6],v=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[4]*this.m[13]-this.m[12]*this.m[5],B=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],k=this.m[4]*this.m[10]-this.m[8]*this.m[6],T=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*n+this.m[7]*s,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*n-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*r-this.m[2]*n+this.m[3]*s),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*n-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*p,e[6]=-(this.m[0]*h-this.m[2]*y+this.m[3]*m),e[10]=this.m[0]*v-this.m[1]*y+this.m[3]*g,e[14]=-(this.m[0]*p-this.m[1]*m+this.m[2]*g),e[3]=-(this.m[1]*B-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*B-this.m[2]*S+this.m[3]*k,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*T),e[15]=this.m[0]*w-this.m[1]*k+this.m[2]*T;let P=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let E=0;E<4;E++)e[A*4+E]*=1/P;return new De(e)}clone(){return new De([...this.m])}toString(){return this.m.toString()}},o(De,"Mat4"),De);function Vs(t,e,r,n=s=>-Math.cos(s)){return t+(n(r)+1)/2*(e-t)}o(Vs,"wave");var _u=1103515245,$u=12345,Zi=2147483648,br,ya=(br=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(_u*this.seed+$u)%Zi,this.seed/Zi}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new q(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new se(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof q)return this.genVec2(C(0,0),e[0]);if(e[0]instanceof se)return this.genColor(ce(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof q&&e[1]instanceof q)return this.genVec2(e[0],e[1]);if(e[0]instanceof se&&e[1]instanceof se)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(br,"RNG"),br),vs=new ya(Date.now());function wa(t){return t!=null&&(vs.seed=t),vs.seed}o(wa,"randSeed");function Ce(...t){return vs.genAny(...t)}o(Ce,"rand");function Gs(...t){return Math.floor(Ce(...t.length>0?t:[2]))}o(Gs,"randi");function Aa(t){return Ce()<=t}o(Aa,"chance");function Hs(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}o(Hs,"shuffle");function xa(t,e){return t.length<=e?t.slice():Hs(t.slice()).slice(0,e)}o(xa,"chooseMultiple");function va(t){return t[Gs(t.length)]}o(va,"choose");function Ks(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:n}o(ba,"testLineLineT");function Jn(t,e){let r=ba(t,e);return r?C(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}o(Jn,"testLineLine");function Ea(t,e,r){let n=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(n.x!=0){let l=(t.pos.x-e.p1.x)/n.x,c=(t.pos.x+t.width-e.p1.x)/n.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let l=(t.pos.y-e.p1.y)/n.y,c=(t.pos.y+t.height-e.p1.y)/n.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(q.addScaled(e.p1,n,Math.max(s,0),r.p1),q.addScaled(e.p1,n,Math.min(i,1),r.p2),!0):!1}o(Ea,"clipLineToRect");function Qn(t,e){let r=e.p2.sub(e.p1),n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,l=(t.pos.x+t.width-e.p1.x)/r.x;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,l=(t.pos.y+t.height-e.p1.y)/r.y;n=Math.max(n,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=n&&s>=0&&n<=1}o(Qn,"testRectLine");function gn(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=r.dot(n)/n.dot(n);return s>=0&&s<=1}o(Zn,"testLinePoint");function Sa(t,e,r){let n=e.p2.sub(e.p1),s=n.dot(n),i=e.p1.sub(t.center),l=2*n.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.addScaled(e.p1,n,u,r.p2)):(q.addScaled(e.p1,n,u,r.p1),q.copy(e.p2,r.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),p=(-l-Math.sqrt(h))/(2*s),y=u>=0&&u<=1,m=p>=0&&p<=1;if(y&&m)return q.addScaled(e.p1,n,u,r.p1),q.addScaled(e.p1,n,p,r.p2),!0;if(y||m){let v=y?u:p;return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.addScaled(e.p1,n,v,r.p2)):(q.addScaled(e.p1,n,v,r.p1),q.copy(e.p2,r.p2)),!0}}return Ot(t,e.p1)?(q.copy(e.p1,r.p1),q.copy(e.p2,r.p2),!0):!1}o(Sa,"clipLineToCircle");function _r(t,e){let r=t.p2.sub(t.p1),n=r.dot(r),s=t.p1.sub(e.center),i=2*r.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*n*l;if(n<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*n);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*n),u=(-i-Math.sqrt(c))/(2*n);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Ot(e,t.p1)}o(_r,"testLineCircle");function _n(t,e){if(zt(e,t.p1)||zt(e,t.p2))return!0;for(let r=0;rzt(e,r))||e.pts.some(r=>zt(t,r)))}o(Xs,"testPolygonPolygon");function zt(t,e){let r=!1,n=t.pts;for(let s=0,i=n.length-1;se.y!=n[i].y>e.y&&e.x<(n[i].x-n[s].x)*(e.y-n[s].y)/(n[i].y-n[s].y)+n[s].x&&(r=!r);return r}o(zt,"testPolygonPoint");function $n(t,e){e=e.sub(t.center);let r=ye(t.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o($n,"testEllipsePoint");function on(t,e){let r=e.center.sub(t.center),n=ye(t.angle),s=Math.cos(n),i=Math.sin(n),l=r.x*s+r.y*i,c=-r.x*i+r.y*s;return $n(new lt(C(),t.radiusX+e.radius,t.radiusY+e.radius,0),C(l,c))}o(on,"testEllipseCircle");function Js(t,e){let r=t.toMat2().inverse;return e=new We(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),_r(e,new Oe(C(),1))}o(Js,"testEllipseLine");function Pa(t,e){if(t.radiusX===t.radiusY)return on(e,new Oe(t.center,t.radiusX));if(e.radiusX===e.radiusY)return on(t,new Oe(e.center,e.radiusX));let r=new en(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),n=new en(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=ye(t.angle),u=ye(e.angle),p=new en(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),y=new en(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),m=p.inverse,v=y.inverse,g=m.transpose.mul(r).mul(m),B=v.transpose.mul(n).mul(v),f=g.m11,w=g.m12,S=g.m13,k=g.m21,T=g.m22,P=g.m23,A=g.m31,E=g.m32,M=g.m33,R=B.m11,L=B.m12,D=B.m13,O=B.m21,j=B.m22,_=B.m23,K=B.m31,J=B.m32,te=B.m33,ne=f*T*M-f*P*E-w*k*M+w*P*A+S*k*E-S*T*A,W=(f*T*te-f*P*J-f*E*_+f*M*j-w*k*te+w*P*K+w*A*_-w*M*O+S*k*J-S*T*K-S*A*j+S*E*O+k*E*D-k*M*L-T*A*D+T*M*R+P*A*L-P*E*R)/ne,re=(f*j*te-f*_*J-w*O*te+w*_*K+S*O*J-S*j*K-k*L*te+k*D*J+T*R*te-T*D*K-P*R*J+P*L*K+A*L*_-A*D*j-E*R*_+E*D*O+M*R*j-M*L*O)/ne,G=(R*j*te-R*_*J-L*O*te+L*_*K+D*O*J-D*j*K)/ne;if(W>=0){let ve=-3*re+W**2,je=3*W*G+re*W**2-4*re**2,Ve=-27*G**2+18*G*W*re+W**2*re**2-4*W**3*G-4*re**3;return!(ve>0&&je<0&&Ve>0)}else{let ve=-3*re+W**2,je=-27*G**2+18*G*W*re+W**2*re**2-4*W**3*G-4*re**3;return!(ve>0&&je>0)}}o(Pa,"testEllipseEllipse");function Qs(t,e){return es(t,new Re(e.points()))}o(Qs,"testEllipseRect");function es(t,e){let r=t.toMat2().inverse;return e=new Re(e.pts.map(n=>r.transform(n.sub(t.center)))),mn(new Oe(C(),1),e)}o(es,"testEllipsePolygon");function Ca(t,e){return t.x===e.x&&t.y===e.y}o(Ca,"testPointPoint");function ka(t,e){return e instanceof q?Ca(e,t.pt):e instanceof Oe?Ot(e,t.pt):e instanceof We?Zn(e,t.pt):e instanceof we?gn(e,t.pt):e instanceof Re?zt(e,t.pt):e instanceof lt?$n(e,t.pt):!1}o(ka,"testPointShape");function qa(t,e){return e instanceof q?Zn(t,e):e instanceof Oe?_r(t,e):e instanceof We?Jn(t,e)!=null:e instanceof we?Qn(e,t):e instanceof Re?_n(t,e):e instanceof lt?Js(e,t):!1}o(qa,"testLineShape");function Ta(t,e){return e instanceof q?Ot(t,e):e instanceof Oe?Ma(t,e):e instanceof We?_r(e,t):e instanceof we?Ws(e,t):e instanceof Re?mn(t,e):e instanceof lt?on(e,t):!1}o(Ta,"testCircleShape");function Ia(t,e){return e instanceof q?gn(t,e):e instanceof Oe?Ws(t,e):e instanceof We?Qn(t,e):e instanceof we?Ks(t,e):e instanceof Re?Ys(t,e):e instanceof lt?Qs(e,t):!1}o(Ia,"testRectShape");function Ba(t,e){return e instanceof q?zt(t,e):e instanceof Oe?mn(e,t):e instanceof We?_n(e,t):e instanceof we?Ys(e,t):e instanceof Re?Xs(e,t):e instanceof lt?es(e,t):!1}o(Ba,"testPolygonShape");function Ra(t,e){return e instanceof q?$n(t,e):e instanceof Oe?on(t,e):e instanceof We?Js(t,e):e instanceof we?Qs(t,e):e instanceof Re?es(t,e):e instanceof lt?Pa(e,t):!1}o(Ra,"testEllipseShape");function Zs(t,e,r){let n=t,s=r.p1,i=r.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let y=u.cross(l)/h;if(y<=0||y>=1)return null;let m=c.normal().unit();return e.dot(m)>0&&(m.x*=-1,m.y*=-1),{point:n.add(l.scale(p)),normal:m,fraction:p}}o(Zs,"raycastLine");function Fa(t,e,r){let n=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(r.pos.x-t.x)/e.x,c=(r.pos.x+r.width-t.x)/e.x;i=C(-Math.sign(e.x),0),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(r.pos.y-t.y)/e.y,c=(r.pos.y+r.height-t.y)/e.y;Math.min(l,c)>n&&(i=C(0,-Math.sign(e.y))),n=Math.max(n,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=n&&n>=0&&n<=1?{point:t.add(e.scale(n)),normal:i,fraction:n}:null}o(Fa,"raycastRect");function _s(t,e,r){let n=t,s=r.center,i=e,l=i.dot(i),c=n.sub(s),h=2*i.dot(c),u=c.dot(c)-r.radius*r.radius,p=h*h-4*l*u;if(l<=Number.EPSILON||p<0)return null;if(p==0){let y=-h/(2*l);if(y>=0&&y<=1){let m=n.add(i.scale(y));return{point:m,normal:m.sub(s),fraction:y}}}else{let y=(-h+Math.sqrt(p))/(2*l),m=(-h-Math.sqrt(p))/(2*l),v=null;if(y>=0&&y<=1&&(v=y),m>=0&&m<=1&&(v=Math.min(m,v??m)),v!=null){let g=n.add(i.scale(v));return{point:g,normal:g.sub(s).unit(),fraction:v}}}return null}o(_s,"raycastCircle");function Oa(t,e,r){let n=r.pts,s=null,i=n[n.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Oa,"raycastPolygon");function La(t,e,r){let n=r.toMat2(),s=n.inverse,i=s.transform(t.sub(r.center)),l=s.transform(e),c=_s(i,l,new Oe(C(),1));if(c){let h=an.rotation(ye(-r.angle)),u=an.scale(r.radiusX,r.radiusY).transform(c.point),p=n.transform(c.point).add(r.center),y=p.dist(t)/e.len();return{point:p,normal:h.transform(C(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:y}}return c}o(La,"raycastEllipse");function Da(t,e,r,n=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=C(Math.floor(t.x),Math.floor(t.y)),u=C(l.x>0?1:-1,l.y>0?1:-1),p=C(Math.abs(1/l.x),Math.abs(1/l.y)),y=C(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),m=C(p.x<1/0?p.x*y.x:1/0,p.y<1/0?p.y*y.y:1/0),v=-1;for(;c<=n;){let g=r(h);if(g===!0)return{point:s.add(l.scale(c)),normal:C(v===0?-u.x:0,v===1?-u.y:0),fraction:c/i,gridPos:h};if(g)return g;m.xe.transformPoint(r,C())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Nt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,n=this.pos.add(this.width,this.height),s=Math.max(r.x-e.x,0,e.x-n.x),i=Math.max(r.y-e.y,0,e.y-n.y);return s*s+i*i}collides(e){return Ia(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Fa(e,r,this)}random(){return this.pos.add(Ce(this.width),Ce(this.height))}},o(Nt,"Rect"),Nt),_t,Oe=(_t=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new lt(this.center,this.radius,this.radius).transform(e)}bbox(){return we.fromPoints(this.center.sub(C(this.radius)),this.center.add(C(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new _t(this.center,this.radius)}collides(e){return Ta(this,e)}contains(e){return this.collides(e)}raycast(e,r){return _s(e,r,this)}random(){return this.center.add(q.fromAngle(Ce(360)).scale(Ce(this.radius)))}},o(_t,"Circle"),_t),st,lt=(st=class{constructor(e,r,n,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=n,this.angle=s}static fromMat2(e){let r=e.inverse,n=r.transpose.mul(r),[s,i]=n.eigenvalues,[l,c]=n.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new st(C(),h,u,qt(Math.atan2(-l[1],l[0]))):new st(C(),u,h,qt(Math.atan2(-c[1],c[0])))}toMat2(){let e=ye(this.angle),r=Math.cos(e),n=Math.sin(e);return new an(r*this.radiusX,-n*this.radiusY,n*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new st(e.transformPoint(this.center,C()),e.a*this.radiusX,e.d*this.radiusY);{let r=this.toMat2(),n=e.getRotation(),s=e.getScale();r=en.fromMat2(r).scale(s.x,s.y).rotate(n).toMat2();let i=st.fromMat2(r);return i.center=e.transformPoint(this.center,C()),i}}bbox(){if(this.angle==0)return we.fromPoints(this.center.sub(C(this.radiusX,this.radiusY)),this.center.add(C(this.radiusX,this.radiusY)));{let e=ye(this.angle),r=Math.cos(e),n=Math.sin(e),s=this.radiusX*r,i=this.radiusX*n,l=this.radiusY*n,c=this.radiusY*r,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return we.fromPoints(this.center.sub(C(h,u)),this.center.add(C(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new st(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Ra(this,e)}contains(e){e=e.sub(this.center);let r=ye(this.angle),n=Math.cos(r),s=Math.sin(r),i=e.x*n+e.y*s,l=-e.x*s+e.y*n;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,r){return La(e,r,this)}random(){return this.center}},o(st,"Ellipse"),st);function Ua(t,e,r,n){let s=e.sub(t),i=n.sub(r),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=r.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ua,"segmentLineIntersection");var gt,Re=(gt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new gt(this.pts.map(r=>e.transformPoint(r,C())))}bbox(){let e=C(Number.MAX_VALUE),r=C(-Number.MAX_VALUE);for(let n of this.pts)e.x=Math.min(e.x,n.x),r.x=Math.max(r.x,n.x),e.y=Math.min(e.y,n.y),r.y=Math.max(r.y,n.y);return we.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let n=0;ne.clone()))}collides(e){return Ba(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Oa(e,r,this)}random(){return C()}cut(e,r,n,s){new We(e,r);let i=[],l=[],c=r.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),p=c.cross(u)>0;return this.pts.forEach((y,m)=>{u=y.sub(e);let v=c.cross(u)>0;if(p!=v){let g=Ua(h,y,e,r);if(i.push(g),l.push(g),n&&s){let B=n[m===0?n.length-1:m-1],f=n[m],w=y.sub(h),S=g.sub(h).dot(w)/w.dot(w),k=Fe(B,f,S);s[0].push(k),s[1].push(k)}p=v}(v?i:l).push(y),n&&s&&(v?s[0]:s[1]).push(n[m]),h=y}),[i.length?new gt(i):null,l.length?new gt(l):null]}},o(gt,"Polygon"),gt);function Na(t,e,r,n){let s=n*n,i=1-n,l=i*i;return t.scale(l).add(e.scale(2*i*n)).add(r.scale(s))}o(Na,"evaluateQuadratic");function za(t,e,r,n){let s=1-n;return e.sub(t).scale(2*s).add(r.sub(e).scale(2*n))}o(za,"evaluateQuadraticFirstDerivative");function ja(t,e,r,n){return r.sub(e.scale(2)).add(t).scale(2)}o(ja,"evaluateQuadraticSecondDerivative");function ts(t,e,r,n,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(r.scale(3*c*i)).add(n.scale(l))}o(ts,"evaluateBezier");function Va(t,e,r,n,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(r.sub(e).scale(6*l*s)).add(n.sub(r).scale(3*i))}o(Va,"evaluateBezierFirstDerivative");function Ga(t,e,r,n,s){let i=1-s;return r.sub(e.scale(2)).add(t).scale(6*i).add(n.sub(r.scale(2)).add(e).scale(6*s))}o(Ga,"evaluateBezierSecondDerivative");function Ha(t,e,r,n,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ha,"evaluateCatmullRom");function Ka(t,e,r,n,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(r.scale(c)).add(n.scale(h))}o(Ka,"evaluateCatmullRomFirstDerivative");function Wa(t){let e=$s(t),r=e(1);return n=>{let s=n*r,i=e(s,!0);return t(i)}}o(Wa,"normalizedCurve");function $s(t,e=10,r=10){let n=[0],s=[0],i=1/(e-1)/r,l=0,c=t(0),h=0;for(let u=1;u{if(p){let y=u;if(y<=0)return 0;if(y>=l)return 1;let m=0;for(;n[m+1]=1)return n[e-1];let y=0;for(;s[y+1]{let u=h*h,p=u*h;return s*p+i*u+l*h+c}}o($r,"hermite");function ei(t,e,r,n,s,i=$r){let l=i(e.x,(1-s)*(r.x-t.x),(1-s)*(n.x-e.x),r.x),c=i(e.y,(1-s)*(r.y-t.y),(1-s)*(n.y-e.y),r.y);return h=>new q(l(h),c(h))}o(ei,"cardinal");function ln(t,e,r,n,s=$r){return ei(t,e,r,n,.5,s)}o(ln,"catmullRom");function Ya(t,e,r,n,s=$r){return ln(n.add(t.sub(e).scale(6)),t,n,t.add(n.sub(r).scale(6)),s)}o(Ya,"bezier");function Xa(t,e,r,n,s,i,l,c=$r){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(r.x-e.x),.5*(1-s)*(1+l)*(1-i)*(r.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(n.x-r.x),r.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(r.y-e.y),.5*(1-s)*(1+l)*(1-i)*(r.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(n.y-r.y),r.y);return p=>new q(h(p),u(p))}o(Xa,"kochanekBartels");function Ja(t,e,r,n){let s=2*t+e-2*n+r,i=-3*t+3*n-2*e+r,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(Ja,"hermiteFirstDerivative");function gr(t){return 0<=t&&t<=1}o(gr,"inZeroOneDomain");function In(t,e){return Math.abs(t-e)<=Number.EPSILON}o(In,"approximately");function mr(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(mr,"cubeRoot");function Qa(t,e,r,n){let s=3*t-6*e+3*r,i=-3*t+3*e,l=t,c=-t+3*e-3*r+n;if(In(c,0)){if(In(s,0))return In(i,0)?[]:[-l/i].filter(gr);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(gr)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,p=(2*s*s*s-9*s*i+27*l)/27,y=p/2,m=y*y+u*u*u;if(m<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),k=-p/(2*S),T=k<-1?-1:k>1?1:k,P=Math.acos(T),A=2*mr(S),E=A*Math.cos(P/3)-s/3,M=A*Math.cos((P+2*Math.PI)/3)-s/3,R=A*Math.cos((P+4*Math.PI)/3)-s/3;return[E,M,R].filter(gr)}if(m===0){let f=y<0?mr(-y):-mr(y),w=2*f-s/3,S=-f-s/3;return[w,S].filter(gr)}let v=Math.sqrt(m),g=mr(v-y),B=mr(v+y);return[g-B-s/3].filter(gr)}o(Qa,"getCubicRoots");function Za(t,e,r,n,s){let i=Qa(t.x-s,e.x-s,r.x-s,n.x-s);return i.length>0?ts(t,e,r,n,i[0]).y:NaN}o(Za,"cubicBezierYforX");function _a(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let n=0;n=r)return it(r,t[n-1].x,t[n].x,t[n-1].y,t[n].y);return t[t.length-1].y}}o(_a,"easingLinear");function $a(t,e){return r=>Za(C(0,0),t,e,C(1,1),r)}o($a,"easingCubicBezier");function eo(t,e="jump-end"){let r=1/t,n=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=n?i:0;return c=>{let h=Math.floor(c/r);return l+h*i}}o(eo,"easingSteps");function ti(t,e,r){return(e.x-t.x)*(r.y-t.y)-(e.y-t.y)*(r.x-t.x)>=0}o(ti,"isOrientedCcw");function to(t){let e=0,r=t[t.length-1];for(let n=0;n=0}o(Bn,"onSameSide");function ro(t,e,r,n){return Bn(t,e,r,n)&&Bn(t,r,e,n)&&Bn(t,n,e,r)}o(ro,"pointInTriangle");function no(t,e,r,n){for(let s of t)if(s!==e&&s!==r&&s!==n&&ro(s,e,r,n))return!0;return!1}o(no,"someInTriangle");function so(t,e,r,n){return ti(t,e,r)&&!no(n,t,e,r)}o(so,"isEar");function ri(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],n=0;for(let y=0;y3;){u=e[c],p=r[c];let y=t[p],m=t[c],v=t[u];if(so(y,m,v,s))i.push([y,m,v]),e[p]=u,r[u]=p,s.splice(s.indexOf(m),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],p=r[c],i.push([t[p],t[c],t[u]]),i}o(ri,"triangulate");function io(t){if(t.length<3)return!1;let e=t.length-2,r=t.length-1,n=0,s=t[r].sub(t[e]),i=t[n].sub(t[r]),l=s.cross(i);for(;n+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",rs="topleft",th="monospace",Un="monospace",bs="linear",ni=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],rh=ni.reduce((t,e)=>t+e.size,0),oo=2048,nh=oo*4*rh,sh=oo*6,ih=` +var _u=Object.defineProperty;var $u=(t,e,n)=>e in t?_u(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>$u(t,typeof e!="symbol"?e+"":e,n);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();var eh=Object.defineProperty,o=(t,e)=>eh(t,"name",{value:e,configurable:!0}),th=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return n=>{for(var r=n.length,s=new Uint8Array((r-(n[r-1]=="=")-(n[r-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|g}return s}})(),Aa={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ae,se=(ae=class{constructor(e,n,r){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=lt(e,0,255),this.g=lt(n,0,255),this.b=lt(r,0,255)}static fromArray(e){return new ae(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ae(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!n)throw new Error("Invalid hex color format");return new ae(parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,n,r){if(n==0)return new ae(255*r,255*r,255*r);let s=o((g,y,m)=>(m<0&&(m+=1),m>1&&(m-=1),m<1/6?g+(y-g)*6*m:m<1/2?y:m<2/3?g+(y-g)*(2/3-m)*6:g),"hue2rgb"),i=r<.5?r*(1+n):r+n-r*n,l=2*r-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ae(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let n=Aa[e];if(!n)throw new Error("Can't use an invalid CSS color");return ae.fromHex(n)}clone(){return new ae(this.r,this.g,this.b)}lighten(e){return new ae(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ae(255-this.r,255-this.g,255-this.b)}mult(e){return new ae(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,n){return new ae(Oe(this.r,e.r,n),Oe(this.g,e.g,n),Oe(this.b,e.b,n))}toHSL(){let e=this.r/255,n=this.g/255,r=this.b/255,s=Math.max(e,n,r),i=Math.min(e,n,r),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(n-r)/u+(nse.fromHSL(t,e,n),"hsl2rgb");function ye(t){return t*Math.PI/180}o(ye,"deg2rad");function Tt(t){return t*180/Math.PI}o(Tt,"rad2deg");function lt(t,e,n){return e>n?lt(t,n,e):Math.min(Math.max(t,e),n)}o(lt,"clamp");function Oe(t,e,n){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*n;if(t instanceof q&&e instanceof q||t instanceof se&&e instanceof se)return t.lerp(e,n);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function ot(t,e,n,r,s){return r+(t-e)/(n-e)*(s-r)}o(ot,"map");function va(t,e,n,r,s){return lt(ot(t,e,n,r,s),r,s)}o(va,"mapc");var _,q=(_=class{constructor(e=0,n=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=n}static fromAngle(e){let n=ye(e);return new _(Math.cos(n),Math.sin(n))}static fromArray(e){return new _(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?_.LEFT:_.RIGHT:this.y<0?_.UP:_.DOWN}clone(){return new _(this.x,this.y)}static copy(e,n){return n.x=e.x,n.y=e.y,n}add(...e){let n=P(...e);return new _(this.x+n.x,this.y+n.y)}static addScaled(e,n,r,s){return s.x=e.x+n.x*r,s.y=e.y+n.y*r,s}static addc(e,n,r,s){return s.x=e.x+n,s.y=e.y+r,s}static add(e,n,r){return r.x=e.x+n.x,r.y=e.y+n.y,r}sub(...e){let n=P(...e);return new _(this.x-n.x,this.y-n.y)}static subc(e,n,r,s){return s.x=e.x-n,s.y=e.y-r,s}static sub(e,n,r){return r.x=e.x-n.x,r.y=e.y-n.y,r}scale(...e){let n=P(...e);return new _(this.x*n.x,this.y*n.y)}static scale(e,n,r){return r.x=e.x*n,r.y=e.y*n,r}static scalec(e,n,r,s){return s.x=e.x*n,s.y=e.y*r,s}static scalev(e,n,r){return r.x=e.x*n.x,r.y=e.y*n.y,r}invScale(...e){let n=P(...e);return new _(this.x/n.x,this.y/n.y)}dist(...e){let n=P(...e);return this.sub(n).len()}static dist(e,n){let r=e.x-n.x,s=e.y-n.y;return Math.sqrt(r*r+s*s)}sdist(...e){let n=P(...e);return this.sub(n).slen()}static sdist(e,n){let r=e.x-n.x,s=e.y-n.y;return r*r+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new _(0):this.scale(1/e)}static unit(e,n){let r=_.len(e);return n.x=e.x/r,n.y=e.y/r,n}normal(){return new _(this.y,-this.x)}static normal(e,n){return n.x=e.y,n.y=-e.x,n}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}rotate(e){if(e instanceof _)return new _(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let n=ye(e),r=Math.cos(n),s=Math.sin(n);return new _(this.x*r-this.y*s,this.x*s+this.y*r)}}static rotate(e,n,r){let s=e.x;return r.x=e.x*n.x-e.y*n.y,r.y=s*n.y+e.y*n.x,r}static rotateByAngle(e,n,r){let s=Math.cos(n),i=Math.sin(n),l=e.x;return r.x=e.x*s-e.y*i,r.y=l*i+e.y*s,r}invRotate(e){return e instanceof _?this.rotate(new _(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,n,r){let s=e.x;return r.x=e.x*n.x+e.y*n.y,r.y=-s*n.y+e.y*n.x,r}dot(e){return this.x*e.x+this.y*e.y}static dot(e,n){return e.x*n.x+e.y*n.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,n){return e.x*n.y-e.y*n.x}angle(...e){let n=P(...e);return Tt(Math.atan2(this.y-n.y,this.x-n.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let n=P(...e);return Tt(Math.atan2(this.cross(n),this.dot(n)))}static angleBetween(e,n){return Math.atan2(_.cross(e,n),_.dot(e,n))}lerp(e,n){return new _(Oe(this.x,e.x,n),Oe(this.y,e.y,n))}static lerp(e,n,r,s){return s.x=e.x*(n.x-e.x)*r,s.y=e.y*(n.y-e.y)*r,s}slerp(e,n){let r=this.dot(e),s=this.cross(e),i=Math.atan2(s,r);return this.scale(Math.sin((1-n)*i)).add(e.scale(Math.sin(n*i))).scale(1/s)}static slerp(e,n,r,s){let i=_.dot(e,n),l=_.cross(e,n),c=Math.atan2(l,i),h=Math.sin((1-r)*c),u=Math.sin(r*c),g=1/l;return s.x=(e.x*h+n.x*u)*g,s.y=(e.y*h+n.y*u)*g,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new _(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new we(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(_,"Vec2"),b(_,"ZERO",new _(0,0)),b(_,"ONE",new _(1,1)),b(_,"LEFT",new _(-1,0)),b(_,"RIGHT",new _(1,0)),b(_,"UP",new _(0,-1)),b(_,"DOWN",new _(0,1)),_);function P(...t){if(t.length===1){if(t[0]instanceof q)return new q(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new q(...t[0])}return new q(...t)}o(P,"vec2");var Ot,xe=(Ot=class{constructor(e,n,r,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=n,this.w=r,this.h=s}scale(e){return new Ot(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new q(this.x,this.y)}clone(){return new Ot(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},o(Ot,"Quad"),Ot);function ve(t,e,n,r){return new xe(t,e,n,r)}o(ve,"quad");var it,rr=(it=class{constructor(e,n,r,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=n,this.c=r,this.d=s}mul(e){return new it(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return P(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new it(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new it(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,n=this.det,r=e+Math.sqrt(e*e-n),s=e-Math.sqrt(e*e-n);return[r,s]}eigenvectors(e,n){return this.c!=0?[[e-this.d,this.c],[n-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,n-this.a]]:Math.abs(this.transform(P(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Tt(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new q(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new q(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new q(0,0)}invert(){let e=[],n=this.m[10]*this.m[15]-this.m[14]*this.m[11],r=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=this.m[8]*this.m[14]-this.m[12]*this.m[10],c=this.m[8]*this.m[13]-this.m[12]*this.m[9],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[5]*this.m[14]-this.m[13]*this.m[6],y=this.m[4]*this.m[15]-this.m[12]*this.m[7],m=this.m[4]*this.m[14]-this.m[12]*this.m[6],E=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[4]*this.m[13]-this.m[12]*this.m[5],T=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],C=this.m[4]*this.m[10]-this.m[8]*this.m[6],I=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*n-this.m[6]*r+this.m[7]*s,e[4]=-(this.m[4]*n-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*r-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*n-this.m[2]*r+this.m[3]*s),e[5]=this.m[0]*n-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*r-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*g,e[6]=-(this.m[0]*h-this.m[2]*y+this.m[3]*m),e[10]=this.m[0]*E-this.m[1]*y+this.m[3]*p,e[14]=-(this.m[0]*g-this.m[1]*m+this.m[2]*p),e[3]=-(this.m[1]*T-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*T-this.m[2]*S+this.m[3]*C,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*I),e[15]=this.m[0]*w-this.m[1]*C+this.m[2]*I;let k=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let x=0;x<4;x++)for(let v=0;v<4;v++)e[x*4+v]*=1/k;return new je(e)}clone(){return new je([...this.m])}toString(){return this.m.toString()}},o(je,"Mat4"),je);function Ks(t,e,n,r=s=>-Math.cos(s)){return t+(r(n)+1)/2*(e-t)}o(Ks,"wave");var rh=1103515245,sh=12345,ea=2147483648,An,ba=(An=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(rh*this.seed+sh)%ea,this.seed/ea}genNumber(e,n){return e+this.gen()*(n-e)}genVec2(e,n){return new q(this.genNumber(e.x,n.x),this.genNumber(e.y,n.y))}genColor(e,n){return new se(this.genNumber(e.r,n.r),this.genNumber(e.g,n.g),this.genNumber(e.b,n.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof q)return this.genVec2(P(0,0),e[0]);if(e[0]instanceof se)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof q&&e[1]instanceof q)return this.genVec2(e[0],e[1]);if(e[0]instanceof se&&e[1]instanceof se)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(An,"RNG"),An),Ss=new ba(Date.now());function Ea(t){return t!=null&&(Ss.seed=t),Ss.seed}o(Ea,"randSeed");function ke(...t){return Ss.genAny(...t)}o(ke,"rand");function Ws(...t){return Math.floor(ke(...t.length>0?t:[2]))}o(Ws,"randi");function Sa(t){return ke()<=t}o(Sa,"chance");function Ys(t){for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}o(Ys,"shuffle");function Ma(t,e){return t.length<=e?t.slice():Ys(t.slice()).slice(0,e)}o(Ma,"chooseMultiple");function ka(t){return t[Ws(t.length)]}o(ka,"choose");function Xs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:r}o(Pa,"testLineLineT");function Jr(t,e){let n=Pa(t,e);return n?P(t.p1.x+n*(t.p2.x-t.p1.x),t.p1.y+n*(t.p2.y-t.p1.y)):null}o(Jr,"testLineLine");function Ca(t,e,n){let r=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(r.x!=0){let l=(t.pos.x-e.p1.x)/r.x,c=(t.pos.x+t.width-e.p1.x)/r.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let l=(t.pos.y-e.p1.y)/r.y,c=(t.pos.y+t.height-e.p1.y)/r.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(q.addScaled(e.p1,r,Math.max(s,0),n.p1),q.addScaled(e.p1,r,Math.min(i,1),n.p2),!0):!1}o(Ca,"clipLineToRect");function Qr(t,e){let n=e.p2.sub(e.p1),r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(n.x!=0){let i=(t.pos.x-e.p1.x)/n.x,l=(t.pos.x+t.width-e.p1.x)/n.x;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let i=(t.pos.y-e.p1.y)/n.y,l=(t.pos.y+t.height-e.p1.y)/n.y;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=r&&s>=0&&r<=1}o(Qr,"testRectLine");function fr(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=n.dot(r)/r.dot(r);return s>=0&&s<=1}o(Zr,"testLinePoint");function qa(t,e,n){let r=e.p2.sub(e.p1),s=r.dot(r),i=e.p1.sub(t.center),l=2*r.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,u,n.p2)):(q.addScaled(e.p1,r,u,n.p1),q.copy(e.p2,n.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),g=(-l-Math.sqrt(h))/(2*s),y=u>=0&&u<=1,m=g>=0&&g<=1;if(y&&m)return q.addScaled(e.p1,r,u,n.p1),q.addScaled(e.p1,r,g,n.p2),!0;if(y||m){let E=y?u:g;return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,E,n.p2)):(q.addScaled(e.p1,r,E,n.p1),q.copy(e.p2,n.p2)),!0}}return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.copy(e.p2,n.p2),!0):!1}o(qa,"clipLineToCircle");function Qn(t,e){let n=t.p2.sub(t.p1),r=n.dot(n),s=t.p1.sub(e.center),i=2*n.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*r*l;if(r<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*r);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*r),u=(-i-Math.sqrt(c))/(2*r);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Ft(e,t.p1)}o(Qn,"testLineCircle");function _r(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let n=0;nUt(e,n))||e.pts.some(n=>Ut(t,n)))}o(Zs,"testPolygonPolygon");function Ut(t,e){let n=!1,r=t.pts;for(let s=0,i=r.length-1;se.y!=r[i].y>e.y&&e.x<(r[i].x-r[s].x)*(e.y-r[s].y)/(r[i].y-r[s].y)+r[s].x&&(n=!n);return n}o(Ut,"testPolygonPoint");function $r(t,e){e=e.sub(t.center);let n=ye(t.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o($r,"testEllipsePoint");function sr(t,e){let n=e.center.sub(t.center),r=ye(t.angle),s=Math.cos(r),i=Math.sin(r),l=n.x*s+n.y*i,c=-n.x*i+n.y*s;return $r(new ht(P(),t.radiusX+e.radius,t.radiusY+e.radius,0),P(l,c))}o(sr,"testEllipseCircle");function _s(t,e){let n=t.toMat2().inverse;return e=new Xe(n.transform(e.p1.sub(t.center)),n.transform(e.p2.sub(t.center))),Qn(e,new Le(P(),1))}o(_s,"testEllipseLine");function Ia(t,e){if(t.radiusX===t.radiusY)return sr(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return sr(t,new Le(e.center,e.radiusX));let n=new _n(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),r=new _n(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=ye(t.angle),u=ye(e.angle),g=new _n(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),y=new _n(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),m=g.inverse,E=y.inverse,p=m.transpose.mul(n).mul(m),T=E.transpose.mul(r).mul(E),f=p.m11,w=p.m12,S=p.m13,C=p.m21,I=p.m22,k=p.m23,x=p.m31,v=p.m32,M=p.m33,R=T.m11,L=T.m12,D=T.m13,O=T.m21,z=T.m22,te=T.m23,H=T.m31,$=T.m32,Q=T.m33,ne=f*I*M-f*k*v-w*C*M+w*k*x+S*C*v-S*I*x,Y=(f*I*Q-f*k*$-f*v*te+f*M*z-w*C*Q+w*k*H+w*x*te-w*M*O+S*C*$-S*I*H-S*x*z+S*v*O+C*v*D-C*M*L-I*x*D+I*M*R+k*x*L-k*v*R)/ne,ee=(f*z*Q-f*te*$-w*O*Q+w*te*H+S*O*$-S*z*H-C*L*Q+C*D*$+I*R*Q-I*D*H-k*R*$+k*L*H+x*L*te-x*D*z-v*R*te+v*D*O+M*R*z-M*L*O)/ne,W=(R*z*Q-R*te*$-L*O*Q+L*te*H+D*O*$-D*z*H)/ne;if(Y>=0){let De=-3*ee+Y**2,He=3*Y*W+ee*Y**2-4*ee**2,Ie=-27*W**2+18*W*Y*ee+Y**2*ee**2-4*Y**3*W-4*ee**3;return!(De>0&&He<0&&Ie>0)}else{let De=-3*ee+Y**2,He=-27*W**2+18*W*Y*ee+Y**2*ee**2-4*Y**3*W-4*ee**3;return!(De>0&&He>0)}}o(Ia,"testEllipseEllipse");function $s(t,e){return es(t,new Re(e.points()))}o($s,"testEllipseRect");function es(t,e){let n=t.toMat2().inverse;return e=new Re(e.pts.map(r=>n.transform(r.sub(t.center)))),gr(new Le(P(),1),e)}o(es,"testEllipsePolygon");function Ba(t,e){return t.x===e.x&&t.y===e.y}o(Ba,"testPointPoint");function Ra(t,e){return e instanceof q?Ba(e,t.pt):e instanceof Le?Ft(e,t.pt):e instanceof Xe?Zr(e,t.pt):e instanceof we?fr(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof ht?$r(e,t.pt):!1}o(Ra,"testPointShape");function Fa(t,e){return e instanceof q?Zr(t,e):e instanceof Le?Qn(t,e):e instanceof Xe?Jr(t,e)!=null:e instanceof we?Qr(e,t):e instanceof Re?_r(t,e):e instanceof ht?_s(e,t):!1}o(Fa,"testLineShape");function Oa(t,e){return e instanceof q?Ft(t,e):e instanceof Le?Ta(t,e):e instanceof Xe?Qn(e,t):e instanceof we?Js(e,t):e instanceof Re?gr(t,e):e instanceof ht?sr(e,t):!1}o(Oa,"testCircleShape");function La(t,e){return e instanceof q?fr(t,e):e instanceof Le?Js(t,e):e instanceof Xe?Qr(t,e):e instanceof we?Xs(t,e):e instanceof Re?Qs(t,e):e instanceof ht?$s(e,t):!1}o(La,"testRectShape");function Da(t,e){return e instanceof q?Ut(t,e):e instanceof Le?gr(e,t):e instanceof Xe?_r(e,t):e instanceof we?Qs(e,t):e instanceof Re?Zs(e,t):e instanceof ht?es(e,t):!1}o(Da,"testPolygonShape");function Na(t,e){return e instanceof q?$r(t,e):e instanceof Le?sr(t,e):e instanceof Xe?_s(t,e):e instanceof we?$s(t,e):e instanceof Re?es(t,e):e instanceof ht?Ia(e,t):!1}o(Na,"testEllipseShape");function ei(t,e,n){let r=t,s=n.p1,i=n.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let y=u.cross(l)/h;if(y<=0||y>=1)return null;let m=c.normal().unit();return e.dot(m)>0&&(m.x*=-1,m.y*=-1),{point:r.add(l.scale(g)),normal:m,fraction:g}}o(ei,"raycastLine");function Ua(t,e,n){let r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(n.pos.x-t.x)/e.x,c=(n.pos.x+n.width-t.x)/e.x;i=P(-Math.sign(e.x),0),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(n.pos.y-t.y)/e.y,c=(n.pos.y+n.height-t.y)/e.y;Math.min(l,c)>r&&(i=P(0,-Math.sign(e.y))),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=r&&r>=0&&r<=1?{point:t.add(e.scale(r)),normal:i,fraction:r}:null}o(Ua,"raycastRect");function ti(t,e,n){let r=t,s=n.center,i=e,l=i.dot(i),c=r.sub(s),h=2*i.dot(c),u=c.dot(c)-n.radius*n.radius,g=h*h-4*l*u;if(l<=Number.EPSILON||g<0)return null;if(g==0){let y=-h/(2*l);if(y>=0&&y<=1){let m=r.add(i.scale(y));return{point:m,normal:m.sub(s),fraction:y}}}else{let y=(-h+Math.sqrt(g))/(2*l),m=(-h-Math.sqrt(g))/(2*l),E=null;if(y>=0&&y<=1&&(E=y),m>=0&&m<=1&&(E=Math.min(m,E??m)),E!=null){let p=r.add(i.scale(E));return{point:p,normal:p.sub(s).unit(),fraction:E}}}return null}o(ti,"raycastCircle");function ja(t,e,n){let r=n.pts,s=null,i=r[r.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(ja,"raycastPolygon");function za(t,e,n){let r=n.toMat2(),s=r.inverse,i=s.transform(t.sub(n.center)),l=s.transform(e),c=ti(i,l,new Le(P(),1));if(c){let h=rr.rotation(ye(-n.angle)),u=rr.scale(n.radiusX,n.radiusY).transform(c.point),g=r.transform(c.point).add(n.center),y=g.dist(t)/e.len();return{point:g,normal:h.transform(P(n.radiusY**2*u.x,n.radiusX**2*u.y)).unit(),fraction:y}}return c}o(za,"raycastEllipse");function Va(t,e,n,r=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=P(Math.floor(t.x),Math.floor(t.y)),u=P(l.x>0?1:-1,l.y>0?1:-1),g=P(Math.abs(1/l.x),Math.abs(1/l.y)),y=P(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),m=P(g.x<1/0?g.x*y.x:1/0,g.y<1/0?g.y*y.y:1/0),E=-1;for(;c<=r;){let p=n(h);if(p===!0)return{point:s.add(l.scale(c)),normal:P(E===0?-u.x:0,E===1?-u.y:0),fraction:c/i,gridPos:h};if(p)return p;m.xe.transformPoint(n,P())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Nt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let n=this.pos,r=this.pos.add(this.width,this.height),s=Math.max(n.x-e.x,0,e.x-r.x),i=Math.max(n.y-e.y,0,e.y-r.y);return s*s+i*i}collides(e){return La(this,e)}contains(e){return this.collides(e)}raycast(e,n){return Ua(e,n,this)}random(){return this.pos.add(ke(this.width),ke(this.height))}},o(Nt,"Rect"),Nt),Zt,Le=(Zt=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=n}transform(e){return new ht(this.center,this.radius,this.radius).transform(e)}bbox(){return we.fromPoints(this.center.sub(P(this.radius)),this.center.add(P(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Oa(this,e)}contains(e){return this.collides(e)}raycast(e,n){return ti(e,n,this)}random(){return this.center.add(q.fromAngle(ke(360)).scale(ke(this.radius)))}},o(Zt,"Circle"),Zt),at,ht=(at=class{constructor(e,n,r,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=n,this.radiusY=r,this.angle=s}static fromMat2(e){let n=e.inverse,r=n.transpose.mul(n),[s,i]=r.eigenvalues,[l,c]=r.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new at(P(),h,u,Tt(Math.atan2(-l[1],l[0]))):new at(P(),u,h,Tt(Math.atan2(-c[1],c[0])))}toMat2(){let e=ye(this.angle),n=Math.cos(e),r=Math.sin(e);return new rr(n*this.radiusX,-r*this.radiusY,r*this.radiusX,n*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new at(e.transformPoint(this.center,P()),e.a*this.radiusX,e.d*this.radiusY);{let n=this.toMat2(),r=e.getRotation(),s=e.getScale();n=_n.fromMat2(n).scale(s.x,s.y).rotate(r).toMat2();let i=at.fromMat2(n);return i.center=e.transformPoint(this.center,P()),i}}bbox(){if(this.angle==0)return we.fromPoints(this.center.sub(P(this.radiusX,this.radiusY)),this.center.add(P(this.radiusX,this.radiusY)));{let e=ye(this.angle),n=Math.cos(e),r=Math.sin(e),s=this.radiusX*n,i=this.radiusX*r,l=this.radiusY*r,c=this.radiusY*n,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return we.fromPoints(this.center.sub(P(h,u)),this.center.add(P(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new at(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Na(this,e)}contains(e){e=e.sub(this.center);let n=ye(this.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,n){return za(e,n,this)}random(){return this.center}},o(at,"Ellipse"),at);function Ga(t,e,n,r){let s=e.sub(t),i=r.sub(n),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=n.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ga,"segmentLineIntersection");var mt,Re=(mt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new mt(this.pts.map(n=>e.transformPoint(n,P())))}bbox(){let e=P(Number.MAX_VALUE),n=P(-Number.MAX_VALUE);for(let r of this.pts)e.x=Math.min(e.x,r.x),n.x=Math.max(n.x,r.x),e.y=Math.min(e.y,r.y),n.y=Math.max(n.y,r.y);return we.fromPoints(e,n)}area(){let e=0,n=this.pts.length;for(let r=0;re.clone()))}collides(e){return Da(this,e)}contains(e){return this.collides(e)}raycast(e,n){return ja(e,n,this)}random(){return P()}cut(e,n,r,s){new Xe(e,n);let i=[],l=[],c=n.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),g=c.cross(u)>0;return this.pts.forEach((y,m)=>{u=y.sub(e);let E=c.cross(u)>0;if(g!=E){let p=Ga(h,y,e,n);if(i.push(p),l.push(p),r&&s){let T=r[m===0?r.length-1:m-1],f=r[m],w=y.sub(h),S=p.sub(h).dot(w)/w.dot(w),C=Oe(T,f,S);s[0].push(C),s[1].push(C)}g=E}(E?i:l).push(y),r&&s&&(E?s[0]:s[1]).push(r[m]),h=y}),[i.length?new mt(i):null,l.length?new mt(l):null]}},o(mt,"Polygon"),mt);function Ha(t,e,n,r){let s=r*r,i=1-r,l=i*i;return t.scale(l).add(e.scale(2*i*r)).add(n.scale(s))}o(Ha,"evaluateQuadratic");function Ka(t,e,n,r){let s=1-r;return e.sub(t).scale(2*s).add(n.sub(e).scale(2*r))}o(Ka,"evaluateQuadraticFirstDerivative");function Wa(t,e,n,r){return n.sub(e.scale(2)).add(t).scale(2)}o(Wa,"evaluateQuadraticSecondDerivative");function ts(t,e,n,r,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(n.scale(3*c*i)).add(r.scale(l))}o(ts,"evaluateBezier");function Ya(t,e,n,r,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(n.sub(e).scale(6*l*s)).add(r.sub(n).scale(3*i))}o(Ya,"evaluateBezierFirstDerivative");function Xa(t,e,n,r,s){let i=1-s;return n.sub(e.scale(2)).add(t).scale(6*i).add(r.sub(n.scale(2)).add(e).scale(6*s))}o(Xa,"evaluateBezierSecondDerivative");function Ja(t,e,n,r,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Ja,"evaluateCatmullRom");function Qa(t,e,n,r,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Qa,"evaluateCatmullRomFirstDerivative");function Za(t){let e=ni(t),n=e(1);return r=>{let s=r*n,i=e(s,!0);return t(i)}}o(Za,"normalizedCurve");function ni(t,e=10,n=10){let r=[0],s=[0],i=1/(e-1)/n,l=0,c=t(0),h=0;for(let u=1;u{if(g){let y=u;if(y<=0)return 0;if(y>=l)return 1;let m=0;for(;r[m+1]=1)return r[e-1];let y=0;for(;s[y+1]{let u=h*h,g=u*h;return s*g+i*u+l*h+c}}o(Zn,"hermite");function ri(t,e,n,r,s,i=Zn){let l=i(e.x,(1-s)*(n.x-t.x),(1-s)*(r.x-e.x),n.x),c=i(e.y,(1-s)*(n.y-t.y),(1-s)*(r.y-e.y),n.y);return h=>new q(l(h),c(h))}o(ri,"cardinal");function ir(t,e,n,r,s=Zn){return ri(t,e,n,r,.5,s)}o(ir,"catmullRom");function _a(t,e,n,r,s=Zn){return ir(r.add(t.sub(e).scale(6)),t,r,t.add(r.sub(n).scale(6)),s)}o(_a,"bezier");function $a(t,e,n,r,s,i,l,c=Zn){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(n.x-e.x),.5*(1-s)*(1+l)*(1-i)*(n.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(r.x-n.x),n.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(n.y-e.y),.5*(1-s)*(1+l)*(1-i)*(n.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(r.y-n.y),n.y);return g=>new q(h(g),u(g))}o($a,"kochanekBartels");function eo(t,e,n,r){let s=2*t+e-2*r+n,i=-3*t+3*r-2*e+n,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(eo,"hermiteFirstDerivative");function fn(t){return 0<=t&&t<=1}o(fn,"inZeroOneDomain");function Tr(t,e){return Math.abs(t-e)<=Number.EPSILON}o(Tr,"approximately");function gn(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(gn,"cubeRoot");function to(t,e,n,r){let s=3*t-6*e+3*n,i=-3*t+3*e,l=t,c=-t+3*e-3*n+r;if(Tr(c,0)){if(Tr(s,0))return Tr(i,0)?[]:[-l/i].filter(fn);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(fn)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,g=(2*s*s*s-9*s*i+27*l)/27,y=g/2,m=y*y+u*u*u;if(m<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),C=-g/(2*S),I=C<-1?-1:C>1?1:C,k=Math.acos(I),x=2*gn(S),v=x*Math.cos(k/3)-s/3,M=x*Math.cos((k+2*Math.PI)/3)-s/3,R=x*Math.cos((k+4*Math.PI)/3)-s/3;return[v,M,R].filter(fn)}if(m===0){let f=y<0?gn(-y):-gn(y),w=2*f-s/3,S=-f-s/3;return[w,S].filter(fn)}let E=Math.sqrt(m),p=gn(E-y),T=gn(E+y);return[p-T-s/3].filter(fn)}o(to,"getCubicRoots");function no(t,e,n,r,s){let i=to(t.x-s,e.x-s,n.x-s,r.x-s);return i.length>0?ts(t,e,n,r,i[0]).y:NaN}o(no,"cubicBezierYforX");function ro(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return n=>{if(n<=0||t.length==1||n<=t[0].x)return t[0].y;for(let r=0;r=n)return ot(n,t[r-1].x,t[r].x,t[r-1].y,t[r].y);return t[t.length-1].y}}o(ro,"easingLinear");function so(t,e){return n=>no(P(0,0),t,e,P(1,1),n)}o(so,"easingCubicBezier");function io(t,e="jump-end"){let n=1/t,r=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=r?i:0;return c=>{let h=Math.floor(c/n);return l+h*i}}o(io,"easingSteps");function si(t,e,n){return(e.x-t.x)*(n.y-t.y)-(e.y-t.y)*(n.x-t.x)>=0}o(si,"isOrientedCcw");function ao(t){let e=0,n=t[t.length-1];for(let r=0;r=0}o(Ir,"onSameSide");function oo(t,e,n,r){return Ir(t,e,n,r)&&Ir(t,n,e,r)&&Ir(t,r,e,n)}o(oo,"pointInTriangle");function lo(t,e,n,r){for(let s of t)if(s!==e&&s!==n&&s!==r&&oo(s,e,n,r))return!0;return!1}o(lo,"someInTriangle");function uo(t,e,n,r){return si(t,e,n)&&!lo(r,t,e,n)}o(uo,"isEar");function ii(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],n=[],r=0;for(let y=0;y3;){u=e[c],g=n[c];let y=t[g],m=t[c],E=t[u];if(uo(y,m,E,s))i.push([y,m,E]),e[g]=u,n[u]=g,s.splice(s.indexOf(m),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],g=n[c],i.push([t[g],t[c],t[u]]),i}o(ii,"triangulate");function ho(t){if(t.length<3)return!1;let e=t.length-2,n=t.length-1,r=0,s=t[n].sub(t[e]),i=t[r].sub(t[n]),l=s.cross(i);for(;r+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",ns="topleft",ah="monospace",Dr="monospace",Ms="linear",ai=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],oh=ai.reduce((t,e)=>t+e.size,0),fo=2048,lh=fo*4*oh,uh=fo*6,hh=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -26,7 +26,7 @@ void main() { v_color = a_color; gl_Position = pos; } -`,ah=` +`,ch=` precision mediump float; varying vec2 v_pos; @@ -48,18 +48,18 @@ void main() { discard; } } -`,Es=` +`,ks=` vec4 vert(vec2 pos, vec2 uv, vec4 color) { return def_vert(); } -`,Ss=` +`,Ps=` vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,oh=new Set(["id","require"]),lh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),uh=200,hh=640,ch=65536,lo=Symbol.for("kaplay.cancel"),Er,dh=(Er=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let n=this.lastID;return this.set(n,r),this.lastID++,n}pushd(r){let n=this.push(r);return()=>this.delete(n)}},o(Er,"Registry"),Er),$t,ir=($t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let r=new $t(()=>e.forEach(n=>n.cancel()));return Object.defineProperty(r,"paused",{get:o(()=>e[0].paused,"get"),set:o(n=>e.forEach(s=>s.paused=n),"set")}),r.paused=!1,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>r.paused,"get"),set:o(n=>r.paused=n,"set")}),e}},o($t,"KEventController"),$t),Sr,qe=(Sr=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new dh)}add(e){function r(...i){if(!s.paused)return e(...i)}o(r,"handler");let n=this.handlers.pushd(r),s=new ir(n);return this.cancellers.set(r,n),s}addOnce(e){let r=this.add((...n)=>{r.cancel(),e(...n)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let n=r(...e),s;n===lo&&(s=this.cancellers.get(r))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(Sr,"KEvent"),Sr),Mr,ns=(Mr=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new qe),this.handlers[e].add(r)}onOnce(e,r){let n=this.on(e,(...s)=>{n.cancel(),r(...s)});return n}next(e){return new Promise(r=>{this.onOnce(e,(...n)=>r(n[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},o(Mr,"KEventHandler"),Mr),fh=o(t=>t[0]instanceof se,"arrayIsColor"),ph=o(t=>t[0]instanceof q,"arrayIsVec2"),gh=o(t=>typeof t[0]=="number","arrayIsNumber"),Pr,uo=(Pr=class{constructor(e=(r,n)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),mh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function is(t,e){if(t===e)return!0;let r=typeof t,n=typeof e;if(r!==n)return!1;if(r==="object"&&n==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!is(c,h))return!1}return!0}return!1}o(is,"deepEq");var _i=new Set,yh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function go(t){_i.has(t)||(_i.add(t),console.warn(t))}o(go,"warn");function Kt(t,e){go(`${t} is deprecated. Use ${e} instead.`)}o(Kt,"deprecateMsg");function Nn(t,e){return Number(t.toFixed(e))}o(Nn,"toFixed");function fe(t,e){return(...r)=>{let n=r.length;if(n===t.length)return t(...r);if(n===e.length)return e(...r)}}o(fe,"overload2");var wh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function mo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,n=0;for(;r=e&&t<=r}o(Wt,"betweenInclusive");var Je=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ft=o((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes"),En=o((t,e,r)=>{var n;t.has(e)?(n=t.get(e))==null||n.push(r):t.set(e,[r])},"mapAddOrPush"),Ah=(()=>{let t=0;return()=>t++})(),xh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},vh=o(()=>Jt.lastInputDevice,"getLastInputDeviceType"),bh=o(()=>{let t=Jt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),n=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(l=>{En(Jt.buttonsByKey,l,e)}),n&&n.forEach(l=>{En(Jt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{En(Jt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{En(Jt.buttonsByMouse,l,e)})}},"parseButtonBindings"),Cr,rn=(Cr=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Cr,"ButtonState"),Cr),kr,Eh=(kr=class{constructor(){b(this,"buttonState",new rn);b(this,"stickState",new Map)}},o(kr,"GamepadState"),kr),qr,Sh=(qr=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,n)=>r+n)/this.dts.length)),this.dts=[])}},o(qr,"FPSCounter"),qr),Jt,$i=xh,Mh=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Sh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new q(0),mouseDeltaPos:new q(0),keyState:new rn,mouseState:new rn,mergedGamepadState:new Eh,gamepadStates:new Map,lastInputDevice:null,buttonState:new rn,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new ns}},"initAppState"),Ph=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Mh(t);Jt=e,bh();function r(){return e.dt*e.timeScale}o(r,"dt");function n(){return e.fixedDt*e.timeScale}o(n,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function p(x){e.canvas.style.cursor=x}o(p,"setCursor");function y(){return e.canvas.style.cursor}o(y,"getCursor");function m(x){if(x)try{let I=e.canvas.requestPointerLock();I!=null&&I.catch&&I.catch(F=>console.error(F))}catch(I){console.error(I)}else document.exitPointerLock()}o(m,"setCursorLocked");function v(){return!!document.pointerLockElement}o(v,"isCursorLocked");function g(x){x.requestFullscreen?x.requestFullscreen():x.webkitRequestFullscreen&&x.webkitRequestFullscreen()}o(g,"enterFullscreen");function B(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(B,"exitFullscreen");function f(x=!0){x?g(e.canvas):B()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let x=Object.entries(be),I=Object.entries(hr),F=Object.entries(cr);for(let[z,Q]of x)e.canvas.removeEventListener(z,Q);for(let[z,Q]of I)document.removeEventListener(z,Q);for(let[z,Q]of F)window.removeEventListener(z,Q);Qi.disconnect()}o(S,"quit");function k(x,I){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,z=0,Q=o(de=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Q);return}let Be=de/1e3,Ee=Math.min(Be-e.realTime,.25),xt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,z+=Ee,z>xt){if(!e.skipTime){for(F+=z,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(T,"isTouchscreen");function P(){return e.mousePos.clone()}o(P,"mousePos");function A(){return e.mouseDeltaPos.clone()}o(A,"mouseDeltaPos");function E(x="left"){return e.mouseState.pressed.has(x)}o(E,"isMousePressed");function M(x="left"){return e.mouseState.down.has(x)}o(M,"isMouseDown");function R(x="left"){return e.mouseState.released.has(x)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(x){return x===void 0?e.keyState.pressed.size>0:ft(e.keyState.pressed,x)}o(D,"isKeyPressed");function O(x){return x===void 0?e.keyState.pressedRepeat.size>0:ft(e.keyState.pressedRepeat,x)}o(O,"isKeyPressedRepeat");function j(x){return x===void 0?e.keyState.down.size>0:ft(e.keyState.down,x)}o(j,"isKeyDown");function _(x){return x===void 0?e.keyState.released.size>0:ft(e.keyState.released,x)}o(_,"isKeyReleased");function K(x){return x===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ft(e.mergedGamepadState.buttonState.pressed,x)}o(K,"isGamepadButtonPressed");function J(x){return x===void 0?e.mergedGamepadState.buttonState.down.size>0:ft(e.mergedGamepadState.buttonState.down,x)}o(J,"isGamepadButtonDown");function te(x){return x===void 0?e.mergedGamepadState.buttonState.released.size>0:ft(e.mergedGamepadState.buttonState.released,x)}o(te,"isGamepadButtonReleased");function ne(x){return x===void 0?e.buttonState.pressed.size>0:ft(e.buttonState.pressed,x)}o(ne,"isButtonPressed");function W(x){return x===void 0?e.buttonState.down.size>0:ft(e.buttonState.down,x)}o(W,"isButtonDown");function re(x){return x===void 0?e.buttonState.released.size>0:ft(e.buttonState.released,x)}o(re,"isButtonReleased");function G(x){var I;return(I=e.buttons)==null?void 0:I[x]}o(G,"getButton");function ve(x,I){e.buttons[x]={...e.buttons[x],...I}}o(ve,"setButton");function je(x){e.buttonState.press(x),e.events.trigger("buttonPress",x)}o(je,"pressButton");function Ve(x){e.buttonState.release(x),e.events.trigger("buttonRelease",x)}o(Ve,"releaseButton");function Ye(x){return e.events.on("resize",x)}o(Ye,"onResize");let Y=fe(x=>e.events.on("keyDown",x),(x,I)=>e.events.on("keyDown",F=>Je(x,F)&&I(F))),ee=fe(x=>e.events.on("keyPress",I=>x(I)),(x,I)=>e.events.on("keyPress",F=>Je(x,F)&&I(F))),oe=fe(x=>e.events.on("keyPressRepeat",x),(x,I)=>e.events.on("keyPressRepeat",F=>Je(x,F)&&I(F))),Te=fe(x=>e.events.on("keyRelease",x),(x,I)=>e.events.on("keyRelease",F=>Je(x,F)&&I(F))),_e=fe(x=>e.events.on("mouseDown",I=>x(I)),(x,I)=>e.events.on("mouseDown",F=>Je(x,F)&&I(F))),ut=fe(x=>e.events.on("mousePress",I=>x(I)),(x,I)=>e.events.on("mousePress",F=>Je(x,F)&&I(F))),At=fe(x=>e.events.on("mouseRelease",I=>x(I)),(x,I)=>e.events.on("mouseRelease",F=>F===x&&I(F)));function ht(x){return e.events.on("mouseMove",()=>x(P(),A()))}o(ht,"onMouseMove");function Xe(x){return e.events.on("charInput",x)}o(Xe,"onCharInput");function le(x){return e.events.on("touchStart",x)}o(le,"onTouchStart");function Ie(x){return e.events.on("touchMove",x)}o(Ie,"onTouchMove");function Le(x){return e.events.on("touchEnd",x)}o(Le,"onTouchEnd");function U(x){return e.events.on("scroll",x)}o(U,"onScroll");function H(x){return e.events.on("hide",x)}o(H,"onHide");function X(x){return e.events.on("show",x)}o(X,"onShow");let ae=fe(x=>e.events.on("gamepadButtonPress",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonPress",(F,z)=>Je(x,F)&&I(F,z))),Pe=fe(x=>e.events.on("gamepadButtonDown",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonDown",(F,z)=>Je(x,F)&&I(F,z))),xe=fe(x=>e.events.on("gamepadButtonRelease",(I,F)=>x(I,F)),(x,I)=>e.events.on("gamepadButtonRelease",(F,z)=>Je(x,F)&&I(F,z)));function $e(x,I){return e.events.on("gamepadStick",(F,z,Q)=>F===x&&I(z,Q))}o($e,"onGamepadStick");function lr(x){return e.events.on("gamepadConnect",x)}o(lr,"onGamepadConnect");function vn(x){return e.events.on("gamepadDisconnect",x)}o(vn,"onGamepadDisconnect");function N(x){return e.mergedGamepadState.stickState.get(x)||new q(0)}o(N,"getGamepadStick");function V(){return[...e.charInputted]}o(V,"charInputted");function $(){return[...e.gamepads]}o($,"getGamepads");let ue=fe(x=>e.events.on("buttonPress",I=>x(I)),(x,I)=>e.events.on("buttonPress",F=>Je(x,F)&&I(F))),ge=fe(x=>e.events.on("buttonDown",I=>x(I)),(x,I)=>e.events.on("buttonDown",F=>Je(x,F)&&I(F))),et=fe(x=>e.events.on("buttonRelease",I=>x(I)),(x,I)=>e.events.on("buttonRelease",F=>Je(x,F)&&I(F)));function ct(){e.events.trigger("input"),e.keyState.down.forEach(x=>e.events.trigger("keyDown",x)),e.mouseState.down.forEach(x=>e.events.trigger("mouseDown",x)),e.buttonState.down.forEach(x=>{e.events.trigger("buttonDown",x)}),me()}o(ct,"processInput");function It(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((x,I)=>{e.mergedGamepadState.stickState.set(I,new q(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new q(0),e.gamepadStates.forEach(x=>{x.buttonState.update(),x.stickState.forEach((I,F)=>{x.stickState.set(F,new q(0))})})}o(It,"resetInput");function ur(x){let I={index:x.index,isPressed:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var z;return((z=e.gamepadStates.get(x.index))==null?void 0:z.stickState.get(F))||C()},"getStick")};return e.gamepads.push(I),e.gamepadStates.set(x.index,{buttonState:new rn,stickState:new Map([["left",new q(0)],["right",new q(0)]])}),I}o(ur,"registerGamepad");function bn(x){e.gamepads=e.gamepads.filter(I=>I.index!==x.index),e.gamepadStates.delete(x.index)}o(bn,"removeGamepad");function me(){var x,I;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&ur(F);for(let F of e.gamepads){let z=navigator.getGamepads()[F.index];if(!z)continue;let Q=(t.gamepads??{})[z.id]||$i[z.id]||$i.default,de=e.gamepadStates.get(F.index);if(de){for(let Be=0;Be{e.buttonState.press(vt),e.events.trigger("buttonPress",vt)})),e.mergedGamepadState.buttonState.press(Ee),de.buttonState.press(Ee),e.events.trigger("gamepadButtonPress",Ee,F)}else de.buttonState.down.has(Ee)&&(dt&&((I=e.buttonsByGamepad.get(Ee))==null||I.forEach(vt=>{e.buttonState.release(vt),e.events.trigger("buttonRelease",vt)})),e.mergedGamepadState.buttonState.release(Ee),de.buttonState.release(Ee),e.events.trigger("gamepadButtonRelease",Ee,F))}for(let Be in Q.sticks){let Ee=Q.sticks[Be];if(!Ee)continue;let xt=new q(z.axes[Ee.x],z.axes[Ee.y]);de.stickState.set(Be,xt),e.mergedGamepadState.stickState.set(Be,xt),e.events.trigger("gamepadStick",Be,xt,F)}}}}o(me,"processGamepad");let be={},hr={},cr={},Yi=t.pixelDensity||1;be.mousemove=x=>{let I=new q(x.offsetX,x.offsetY),F=new q(x.movementX,x.movementY);if(w()){let z=e.canvas.width/Yi,Q=e.canvas.height/Yi,de=window.innerWidth,Be=window.innerHeight,Ee=de/Be,xt=z/Q;if(Ee>xt){let dt=Be/Q,vt=(de-z*dt)/2;I.x=it(x.offsetX-vt,0,z*dt,0,z),I.y=it(x.offsetY,0,Q*dt,0,Q)}else{let dt=de/z,vt=(Be-Q*dt)/2;I.x=it(x.offsetX,0,z*dt,0,z),I.y=it(x.offsetY-vt,0,Q*dt,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=I,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Xi=["left","middle","right","back","forward"];be.mousedown=x=>{e.events.onOnce("input",()=>{var F;let I=Xi[x.button];I&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.press(z),e.events.trigger("buttonPress",z)})),e.mouseState.press(I),e.events.trigger("mousePress",I))})},be.mouseup=x=>{e.events.onOnce("input",()=>{var F;let I=Xi[x.button];I&&(e.buttonsByMouse.has(I)&&((F=e.buttonsByMouse.get(I))==null||F.forEach(z=>{e.buttonState.release(z),e.events.trigger("buttonRelease",z)})),e.mouseState.release(I),e.events.trigger("mouseRelease",I))})};let Wu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Ji={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};be.keydown=x=>{Wu.has(x.key)&&x.preventDefault(),e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;if(I===void 0)throw new Error(`Unknown key: ${x.key}`);I.length===1?(e.events.trigger("charInput",I),e.charInputted.push(I)):I==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),x.repeat?(e.keyState.pressRepeat(I),e.events.trigger("keyPressRepeat",I)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(de=>{e.buttonState.press(de),e.events.trigger("buttonPress",de)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(de=>{e.buttonState.press(de),e.events.trigger("buttonPress",de)})),e.keyState.press(I),e.events.trigger("keyPressRepeat",I),e.events.trigger("keyPress",I))})},be.keyup=x=>{e.events.onOnce("input",()=>{var z,Q;let I=Ji[x.key]||x.key.toLowerCase(),F=x.code;e.buttonsByKey.has(I)&&((z=e.buttonsByKey.get(I))==null||z.forEach(de=>{e.buttonState.release(de),e.events.trigger("buttonRelease",de)})),e.buttonsByKeyCode.has(F)&&((Q=e.buttonsByKeyCode.get(F))==null||Q.forEach(de=>{e.buttonState.release(de),e.events.trigger("buttonRelease",de)})),e.keyState.release(I),e.events.trigger("keyRelease",I)})},be.touchstart=x=>{x.preventDefault(),e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.press(Q),e.events.trigger("buttonPress",Q)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),I.forEach(Q=>{e.events.trigger("touchStart",new q(Q.clientX-F.x,Q.clientY-F.y),Q)})})},be.touchmove=x=>{x.preventDefault(),e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let z=e.mousePos;e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(z),e.events.trigger("mouseMove")}I.forEach(z=>{e.events.trigger("touchMove",new q(z.clientX-F.x,z.clientY-F.y),z)})})},be.touchend=x=>{e.events.onOnce("input",()=>{var z;let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseDeltaPos=new q(0,0),e.buttonsByMouse.has("left")&&((z=e.buttonsByMouse.get("left"))==null||z.forEach(Q=>{e.buttonState.release(Q),e.events.trigger("buttonRelease",Q)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(Q=>{e.events.trigger("touchEnd",new q(Q.clientX-F.x,Q.clientY-F.y),Q)})})},be.touchcancel=x=>{e.events.onOnce("input",()=>{let I=[...x.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(I[0].clientX-F.x,I[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),I.forEach(z=>{e.events.trigger("touchEnd",new q(z.clientX-F.x,z.clientY-F.y),z)})})},be.wheel=x=>{x.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new q(x.deltaX,x.deltaY))})},be.contextmenu=x=>x.preventDefault(),hr.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},cr.gamepadconnected=x=>{let I=ur(x.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",I)})},cr.gamepaddisconnected=x=>{let I=$().filter(F=>F.index===x.gamepad.index)[0];bn(x.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",I)})};for(let[x,I]of Object.entries(be))e.canvas.addEventListener(x,I);for(let[x,I]of Object.entries(hr))document.addEventListener(x,I);for(let[x,I]of Object.entries(cr))window.addEventListener(x,I);let Qi=new ResizeObserver(x=>{for(let I of x)if(I.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Qi.observe(e.canvas),{state:e,dt:r,fixedDt:n,restDt:s,time:l,run:k,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:p,screenshot:u,getGamepads:$,getCursor:y,setCursorLocked:m,isCursorLocked:v,isTouchscreen:T,mousePos:P,mouseDeltaPos:A,isKeyDown:j,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:_,isMouseDown:M,isMousePressed:E,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:K,isGamepadButtonDown:J,isGamepadButtonReleased:te,getGamepadStick:N,isButtonPressed:ne,isButtonDown:W,isButtonReleased:re,setButton:ve,getButton:G,pressButton:je,releaseButton:Ve,charInputted:V,onResize:Ye,onKeyDown:Y,onKeyPress:ee,onKeyPressRepeat:oe,onKeyRelease:Te,onMouseDown:_e,onMousePress:ut,onMouseRelease:At,onMouseMove:ht,onCharInput:Xe,onTouchStart:le,onTouchMove:Ie,onTouchEnd:Le,onScroll:U,onHide:H,onShow:X,onGamepadButtonDown:Pe,onGamepadButtonPress:ae,onGamepadButtonRelease:xe,onGamepadStick:$e,onGamepadConnect:lr,onGamepadDisconnect:vn,onButtonPress:ue,onButtonDown:ge,onButtonRelease:et,getLastInputDeviceType:vh,events:e.events}},"initApp"),Po=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Po||{}),Ch=new q(-1,-1),kh=new q(0,-1),qh=new q(1,-1),Th=new q(-1,0),Ih=new q(0,0),Bh=new q(1,0),Rh=new q(-1,1),Fh=new q(0,1),Oh=new q(1,1);function ar(t){switch(t){case"topleft":return Ch;case"top":return kh;case"topright":return qh;case"left":return Th;case"center":return Ih;case"right":return Bh;case"botleft":return Rh;case"bot":return Fh;case"botright":return Oh;default:return t}}o(ar,"anchorPt");function Co(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Co,"alignPt");var Sn=2.5949095,ea=1.70158+1,ta=2*Math.PI/3,ra=2*Math.PI/4.5,Rn={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ea*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ea*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Sn+1)*2*t-Sn)/2:(Math.pow(2*t-2,2)*((Sn+1)*(t*2-2)+Sn)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ta),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ta)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ra))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ra)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Rn.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Rn.easeOutBounce(1-2*t))/2:(1+Rn.easeOutBounce(2*t-1))/2,"easeInOutBounce")},un=Rn,Tr,Lh=(Tr=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e,this.radius=r}support(e){let r=new q(e.x,e.y);return q.unit(r,r),q.scale(r,this.radius,r),q.add(r,this.center,r),r}},o(Tr,"CircleCollider"),Tr),Ir,Dh=(Ir=class{constructor(e,r,n,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=r,this.radiusY=n,this.angle=s}support(e){if(this.angle===0){let r=new q(e.x,e.y);return q.unit(r,r),q.scalec(r,this.radiusX,this.radiusY,r),q.add(r,this.center,r),r}else{let r=new q(e.x,e.y);return q.rotateByAngle(r,-this.angle,r),q.unit(r,r),q.scalec(r,this.radiusX,this.radiusY,r),q.rotateByAngle(r,this.angle,r),q.add(r,this.center,r),r}}},o(Ir,"EllipseCollider"),Ir),Br,ps=(Br=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let r,n=Number.NEGATIVE_INFINITY,s;for(let i=0;in&&(n=l,r=s)}return r}},o(Br,"PolygonCollider"),Br);function ii(t,e,r){let n=new q(-r.x,-r.y),s=t.support(r),i=e.support(n);return new q(s.x-i.x,s.y-i.y)}o(ii,"calculateSupport");function ko(t,e,r,n){var s=ii(e,r,n);return t.push(s),n.dot(s)>=0}o(ko,"addSupport");function Fn(t,e,r){let n=t.x*e.y-t.y*e.x;return new q(-n*r.y,n*r.x)}o(Fn,"tripleProduct");function ai(t,e,r,n){switch(t.length){case 0:{n.x=r.center.x-e.center.x,n.y=r.center.y-e.center.y;break}case 1:{n.x=n.x*=-1,n.y=n.y*=-1;break}case 2:{let l=new q(t[1].x-t[0].x,t[1].y-t[0].y),c=new q(-t[0].x,-t[0].y),h=Fn(l,c,l);n.x=h.x,n.y=h.y;break}case 3:{let l=new q(-t[2].x,-t[2].y),c=new q(t[1].x-t[2].x,t[1].y-t[2].y),h=new q(t[0].x-t[2].x,t[0].y-t[2].y);var s=Fn(h,c,c),i=Fn(c,h,h);if(s.dot(l)>0)t.splice(0,1),n.x=s.x,n.y=s.y;else if(i.dot(l)>0)t.splice(1,1),n.x=i.x,n.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return ko(t,e,r,n)?2:0}o(ai,"evolveSimplex");function qo(t,e){let r=[],n=new q;for(var s=2;s===2;)s=ai(r,t,e,n);return s===1}o(qo,"gjkIntersects");function To(t,e){let r=Number.POSITIVE_INFINITY,n=new q,s=0,i=new q,l=new q;for(let h=0;h=t.length&&(u=0),q.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}q.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new q;for(let m=0;mc.coste.y!=n.a.y>e.y&&e.x<(n.a.x-n.b.x)*(e.y-n.b.y)/(n.a.y-n.b.y)+n.b.x&&(r=!r);return r}},o(Fr,"NavPolygon"),Fr),Or,jh=(Or=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let n=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[n]}_findCommonEdge(e,r){for(let n of e.edges){let s=this._findEdge(n.b,n.a);if(s&&s.polygon.deref().id===r.id)return s}return null}addPolygon(e){let r=new zh(this._polygons.length),n=e.map((s,i)=>new Nh(s,e[(i+1)%e.length],r));r.edges=n,this._polygons.push(r);for(let s of r.edges)this._addEdge(s);return r}addRect(e,r){let n=this._addPoint(e),s=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),l=this._addPoint(e.add(0,r.y));return this.addPolygon([n,s,i,l])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let n of this._polygons[e].edges){let s=this._findEdge(n.b,n.a);if(s){let i=s.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let n=this._polygons[e],s=this._polygons[r],i=n.centroid.x-s.centroid.x,l=n.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:Oo(this,e,r)}getWaypointPath(e,r,n){let s=(n==null?void 0:n.type)||"centroids",i=this._getLocation(e),l=this._getLocation(r);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),r]}},o(Or,"NavMesh"),Or);function Qt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Qt,"calcTransform");function wr(t,e,r,n,s,i=1){n=ye(n%360),s=ye(s%360),s<=n&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-n)/ye(8)*i),h=(s-n)/c,u=C(Math.cos(n),Math.sin(n)),p=C(Math.cos(h),Math.sin(h));for(let y=0;y<=c;y++)l.push(t.add(e*u.x,r*u.y)),u=C(u.x*p.x-u.y*p.y,u.x*p.y+u.y*p.x);return l}o(wr,"getArcPts");var Lr,na=(Lr=class{constructor(e,r){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=r}},o(Lr,"Edge"),Lr),Dr,Vh=(Dr=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let r=new na(e,!0),n=new na(e,!1);this.edges.push(r),this.edges.push(n),this.objects.set(e,[r,n])}remove(e){let r=this.objects.get(e);r&&(this.edges.splice(this.edges.indexOf(r[0]),1),this.edges.splice(this.edges.indexOf(r[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,r]of this.objects.entries()){Qt(e,e.transform);let n=e.worldArea().bbox();r[0].x=n.pos.x,r[1].x=n.pos.x+n.width}for(let e=1;e=0&&!(this.edges[r].x=t&&(this.opacity=e,n=!0))}}}o(Vo,"fadeIn");function Go(t="intersect"){return{id:"mask",mask:t}}o(Go,"mask");function li(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,n=>this.opacity=n,r)},fadeOut(e=1,r=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,n=>this.opacity=n,r)},inspect(){return`opacity: ${Nn(this.opacity,1)}`}}}o(li,"opacity");function Ho(t=1,e=ce(0,0,0),r=1,n="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:n,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Ho,"outline");var Ur,Gh=(Ur=class{constructor(){b(this,"pos",C(0));b(this,"vel",C(0));b(this,"acc",C(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Ur,"Particle"),Ur);function Ko(t,e){let r=e.lifetime,n=new Array(t.max),s=t.colors||[se.WHITE],i=t.opacities||[1],l=t.quads||[new Ae(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,p=t.speed||[0,0],y=t.angle||[0,0],m=t.angularVelocity||[0,0],v=t.acceleration||[C(0),C(0)],g=t.damping||[0,0],B=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let P=0;P=E.lt){E.gc=!0,w--;continue}E.vel=E.vel.add(E.acc.scale(P)).scale(1-E.damping*P),E.pos=E.pos.add(E.vel.scale(P)),E.angle+=E.angularVelocity*P}}for(r!==void 0&&(r-=P,r<=0&&k.trigger()),S+=P;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(r!==void 0&&r<=0||w==0)){for(let P=0;P`[${r.x},${r.y}]`).join(",")}`}}}o(Yo,"polygon");function ui(t,e,r){let n;return d.game.root.get("area").forEach(s=>{if(r&&r.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(n?i.fractionthis.canvas.width||n>this.canvas.height)&&this.add_single(e),this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+n>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Ct.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new q(this.x+this.padding,this.y+this.padding);return this.x+=r,n>this.curHeight&&(this.curHeight=n),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new q(e.width,e.height),texture:s}),this.lastTextureId++,[s,new Ae(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let r=this.texturesPosition.get(e);if(!r)throw new Error("Texture with packer id not found");this.c2d.clearRect(r.position.x,r.position.y,r.size.x,r.size.y),r.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=r.size.x}},o(Nr,"TexPacker"),Nr);function Ze(t){return typeof t!="string"||po(t)?t:d.assets.urlPrefix+t}o(Ze,"fixURL");var er,ot=(er=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new qe);b(this,"onErrorEvents",new qe);b(this,"onFinishEvents",new qe);e.then(r=>{this.loaded=!0,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let r=new er(Promise.resolve(e));return r.data=e,r.loaded=!0,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o(er,"Asset"),er),zr,dr=(zr=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let n=e??this.lastUID+++"",s=new ot(r);return this.assets.set(n,s),s}addLoaded(e,r){let n=e??this.lastUID+++"",s=ot.loaded(r);return this.assets.set(n,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(zr,"AssetBucket"),zr);function os(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(os,"fetchURL");function yn(t){return os(t).then(e=>e.json())}o(yn,"fetchJSON");function Jo(t){return os(t).then(e=>e.text())}o(Jo,"fetchText");function Qo(t){return os(t).then(e=>e.arrayBuffer())}o(Qo,"fetchArrayBuffer");function Zo(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(Zo,"loadRoot");function _o(t,e){return d.assets.custom.add(t,yn(Ze(e)))}o(_o,"loadJSON");function wn(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,n)=>{e.onload=()=>r(e),e.onerror=()=>n(new Error(`Failed to load image from "${t}"`))})}o(wn,"loadImg");function jt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}o(jt,"loadProgress");function ci(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(ci,"getFailedAssets");function $o(t){return d.assets.custom.get(t)??null}o($o,"getAsset");function zn(t){return d.assets.custom.add(null,t)}o(zn,"load");var Kh=o((t,e)=>({urlPrefix:"",sprites:new dr,fonts:new dr,bitmapFonts:new dr,sounds:new dr,shaders:new dr,custom:new dr,music:{},packer:new Hh(t,2048,2048,e),loaded:!1}),"initAssets");function el(t,e,r){e=Ze(e),r=Ze(r),typeof e=="string"&&!r&&(r=mh(e)+".json");let n=typeof r=="string"?yn(r):Promise.resolve(r);return d.assets.sprites.add(t,n.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new Ae(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return nr.from(e,{frames:l,anims:c})}))}o(el,"loadAseprite");var Wh="data:image/png;base64,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",jr,On=(jr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",bs);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??bs,this.size=r.size??64,this.size>256)throw new Error("Max font size: 256");r.outline&&(this.outline={width:1,color:ce(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},o(jr,"FontData"),jr);function di(t){if(!t)return di(d.globalOpt.font??th);if(typeof t=="string"){let e=pi(t),r=fi(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`64px ${t}`))return t;if(jt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof ot)return t.data?t.data:t;return t}o(di,"resolveFont");function fi(t){return d.assets.fonts.get(t)??null}o(fi,"getFont");function tl(t,e,r={}){let n=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(n),d.assets.fonts.add(t,n.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new On(s,r)))}o(tl,"loadFont");function rl(t,e,r,n){let s=t.width/e,i={},l=n.split("").entries();for(let[c,h]of l)i[h]=new Ae(c%s*e,Math.floor(c/s)*r,e,r);return{tex:t,map:i,size:r}}o(rl,"makeFont");function pi(t){return d.assets.bitmapFonts.get(t)??null}o(pi,"getBitmapFont");function gi(t,e,r,n,s={}){let i=Ze(e);return d.assets.bitmapFonts.add(t,wn(i).then(l=>rl(Ct.fromImage(d.gfx.ggl,l,s),r,n,s.chars??ao)))}o(gi,"loadBitmapFont");var Yh=o((t="happy",e)=>gi(t,Wh,28,36,e),"loadHappy");function nl(t,e){return e=Ze(e),d.assets.sprites.add(t,new Promise(async r=>{let n=typeof e=="string"?await yn(e):e,s=await Promise.all(n.frames.map(wn)),i=document.createElement("canvas");i.width=n.width,i.height=n.height*n.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*n.height)});let c=await vr(null,i,{sliceY:n.frames.length,anims:n.anims});r(c)}))}o(nl,"loadPedit");var Vr,Xh=(Vr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,r),i.shaderSource(c,n),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,p)=>i.bindAttribLocation(h,p,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let p=i.getShaderInfoLog(c);if(p)throw new Error("FRAGMENT SHADER "+p)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let n in e){let s=e[n],i=r.getUniformLocation(this.glProgram,n);if(typeof s=="number")r.uniform1f(i,s);else if(s instanceof Xn)r.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof rr)r.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof se)r.uniform3f(i,s.r,s.g,s.b);else if(s instanceof q)r.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],gh(s)?r.uniform1fv(i,s):ph(s)?r.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):fh(s)&&r.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(Vr,"Shader"),Vr);function ls(t,e=Es,r=Ss){let n=ih.replace("{{user}}",e??Es),s=ah.replace("{{user}}",r??Ss);try{return new Xh(t,n,s,ni.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=yh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),p=c.groups.type.toLowerCase();throw new Error(`${p} shader line ${h}: ${u}`)}}o(ls,"makeShader");function sl(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=mi(t);if(e)return e.data??e;if(jt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof ot)return t.data?t.data:t;return t}o(sl,"resolveShader");function mi(t){return d.assets.shaders.get(t)??null}o(mi,"getShader");function il(t,e,r){return d.assets.shaders.addLoaded(t,ls(d.gfx.ggl,e,r))}o(il,"loadShader");function al(t,e,r){e=Ze(e),r=Ze(r);let n=o(i=>i?Jo(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([n(e),n(r)]).then(([i,l])=>ls(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(al,"loadShaderURL");var mt,xr=(mt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new mt(e)}static fromArrayBuffer(e){return new Promise((r,n)=>d.audio.ctx.decodeAudioData(e,r,n)).then(r=>new mt(r))}static fromURL(e){return po(e)?mt.fromArrayBuffer(co(e)):Qo(e).then(r=>mt.fromArrayBuffer(r))}},o(mt,"SoundData"),mt);function ol(t){if(typeof t=="string"){let e=yi(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof xr)return ot.loaded(t);if(t instanceof ot)return t;throw new Error(`Invalid sound: ${t}`)}}o(ol,"resolveSound");function yi(t){return d.assets.sounds.get(t)??null}o(yi,"getSound");function ll(t,e){let r=Ze(e),n;return typeof r=="string"?n=xr.fromURL(r):r instanceof ArrayBuffer?n=xr.fromArrayBuffer(r):n=Promise.resolve(xr.fromAudioBuffer(r)),d.assets.sounds.add(t,n)}o(ll,"loadSound");function ul(t,e){let r=Ze(e),n=new Audio(r);return n.preload="auto",d.assets.music[t]=r}o(ul,"loadMusic");function wi(t,e){return t=Ze(t),zn(typeof e=="string"?new Promise((r,n)=>{yn(e).then(s=>{wi(t,s).then(r).catch(n)})}):nr.from(t).then(r=>{let n={};for(let s in e){let i=e[s],l=r.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(y=>new Ae(l.x+(i.x+y.x)/c*l.w,l.y+(i.y+y.y)/h*l.h,y.w/c*l.w,y.h/h*l.h)):xi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),p=new nr(r.tex,u,i.anims);d.assets.sprites.addLoaded(s,p),n[s]=p}return n}))}o(wi,"loadSpriteAtlas");var Jh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",yt,nr=(yt=class{constructor(e,r,n={},s=null,i=null){b(this,"tex");b(this,"frames",[new Ae(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,r&&(this.frames=r),this.anims=n,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?yt.fromURL(e,r):Promise.resolve(yt.fromImage(e,r))}static fromImage(e,r={}){let[n,s,i]=r.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=r.frames?r.frames.map(c=>new Ae(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):xi(r.sliceX||1,r.sliceY||1,s.x,s.y,s.w,s.h);return new yt(n,l,r.anims,r.slice9,i)}static fromURL(e,r={}){return wn(e).then(n=>yt.fromImage(n,r))}},o(yt,"SpriteData"),yt);function nn(t){if(typeof t=="string"){let e=Ai(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof ot)return t;throw new Error(`Invalid sprite: ${t}`)}}o(nn,"resolveSprite");function Ai(t){return d.assets.sprites.get(t)??null}o(Ai,"getSprite");function vr(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Ze(e),Array.isArray(e)?e.some(n=>typeof n=="string")?d.assets.sprites.add(t,Promise.all(e.map(n=>typeof n=="string"?wn(n):Promise.resolve(n))).then(n=>ks(n,r))):d.assets.sprites.addLoaded(t,ks(e,r)):typeof e=="string"?d.assets.sprites.add(t,nr.from(e,r)):d.assets.sprites.addLoaded(t,nr.fromImage(e,r))}o(vr,"loadSprite");function xi(t=1,e=1,r=0,n=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*n,0):i.drawImage(c,h*n,0)});let l=i.getImageData(0,0,t.length*n,s);return nr.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(ks,"createSpriteSheet");function hl(t="bean"){return vr(t,Jh)}o(hl,"loadBean");function jn(t,e={}){let r=null,n=null,s=null,i=new qe;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,p,y,m)=>{let v=C(1,1);return y&&m?(v.x=y/(u.width*p.w),v.y=m/(u.height*p.h)):y?(v.x=y/(u.width*p.w),v.y=v.x):m&&(v.y=m/(u.height*p.h),v.x=v.y),v},"calcTexScale"),c=o((u,p)=>{if(!p)return;let y=p.frames[0].clone();e.quad&&(y=y.scale(e.quad));let m=l(p.tex,y,e.width,e.height);if(u.width=p.tex.width*y.w*m.x,u.height=p.tex.height*y.h*m.y,p.anims)for(let v in p.anims){let g=p.anims[v];typeof g!="number"&&(g.frames=h(g))}r=p,i.trigger(r),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let p=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let y=Math.abs(u.to-u.from)+1;for(let m=0;m0;m--)p.push(p[m]);return p},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new Ae(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let p=nn(u);p&&p.onLoad(y=>c(this,y))},get animFrame(){if(!r||!n||s===null)return this.frame;let u=r.anims[n.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?n.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!r)return;let u=r.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:p,right:y,top:m,bottom:v}=r.slice9,g=r.tex.width*u.w,B=r.tex.height*u.h,f=this.width-p-y,w=this.height-m-v,S=p/g,k=y/g,T=1-S-k,P=m/B,A=v/B,E=1-P-A,M=[Se(0,0,S,P),Se(S,0,T,P),Se(S+T,0,k,P),Se(0,P,S,E),Se(S,P,T,E),Se(S+T,P,k,E),Se(0,P+E,S,A),Se(S,P+E,T,A),Se(S+T,P+E,k,A),Se(0,0,p,m),Se(p,0,f,m),Se(p+f,0,y,m),Se(0,m,p,w),Se(p,m,f,w),Se(p+f,m,y,w),Se(0,m+w,p,v),Se(p,m+w,f,v),Se(p+f,m+w,y,v)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];pn(Object.assign(wt(this),{pos:D.pos(),tex:r.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else pn(Object.assign(wt(this),{tex:r.tex,quad:u.scale(this.quad??new Ae(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=nn(t);u?u.onLoad(p=>c(this,p)):us(()=>c(this,nn(t).data))},update(){if(!r||!n||s===null)return;let u=r.anims[n.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(n.timer+=d.k.dt()*this.animSpeed,n.timer>=1/n.speed){n.timer=0,n.frameIndex+=s;let p=u.frames;if(n.frameIndex>=p.length)if(n.pingpong&&!u.pingpong)s=-1,n.frameIndex=p.length-2;else if(n.loop)n.frameIndex=0;else{this.frame=p.at(-1),n.onEnd(),this.stop();return}else if(n.frameIndex<0)if(n.pingpong&&n.loop)s=1,n.frameIndex=1;else if(n.loop)n.frameIndex=p.length-1;else{this.frame=p[0],n.onEnd(),this.stop();return}this.frame=p[n.frameIndex]}},play(u,p={}){if(!r){i.add(()=>this.play(u,p));return}let y=r.anims[u];if(y===void 0)throw new Error(`Anim not found: ${u}`);n&&this.stop(),n=typeof y=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:p.loop??y.loop??!1,pingpong:p.pingpong??y.pingpong??!1,speed:p.speed??y.speed??10,frameIndex:0,onEnd:p.onEnd??(()=>{})},s=typeof y=="number"?null:1,this.frame=typeof y=="number"?y:y.frames[0],this.trigger("animStart",u)},stop(){if(!n)return;let u=n.name;n=null,this.trigger("animEnd",u)},numFrames(){return(r==null?void 0:r.frames.length)??0},getCurAnim(){return n},curAnim(){return n==null?void 0:n.name},getAnim(u){return(r==null?void 0:r.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new we(C(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(jn,"sprite");function cl(t,e={}){function r(s){var l,c;let i=Gt(Object.assign(wt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(r,"update");let n={id:"text",set text(s){t=s,r(this),this.renderedText=Wn(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Wn(t).text:"",add(){us(()=>r(this))},draw(){Ht(r(this))},renderArea(){return new we(C(0),this.width,this.height)}};return r(n),n}o(cl,"text");function dl(t,e){return{id:"rect",width:t,height:e,draw(){Vt(Object.assign(wt(this),{width:this.width,height:this.height}))},renderArea(){return new we(C(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(dl,"uvquad");function fl(t,e){let r=document.createElement("video"),n=!1,s=!1,i=!1,l=new Ct(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return r.currentTime},set currentTime(c){r.currentTime=c},get duration(){return r.duration},play(){r.play()},pause(){r.pause()},get mute(){return r.muted},set mute(c){r.muted=c},add(){r.playsInline=!0,r.loop=!0,r.autoplay=!1,r.crossOrigin="anonymous",r.addEventListener("playing",()=>{n=!0,c()},!0),r.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{r.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),r.src=t);function c(){console.log(`${n} ${s}`),n&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,r),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?Vt({width:this.width,height:this.height,tex:l}):Ne({width:this.width,height:this.height})},renderArea(){return new we(C(0),this.width,this.height)}}}o(fl,"video");function pl(t={}){let e=null,r=null,n=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&n?r[n]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?n===null:!0},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n=r?0:null,r&&n!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&r&&n!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(n=0,this.trigger("navigationNext",this,r[n])):(n=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[n])):this.trigger("navigationEnded",this)},update(){if(e&&r&&n!==null){if(this.pos.sdist(r[n])<2)if(n===r.length-1){this.pos=e.clone(),n=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else n++,this.trigger("navigationNext",this,r[n]);this.moveTo(r[n],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}o(pl,"agent");function gl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var n;return(n=this.graph)==null?void 0:n.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}o(gl,"pathfinder");function ml(t={}){let e=t.waypoints,r=t.speed||100,n=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(l){r=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,r),this.pos.sdist(l)<9))switch(n){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(ml,"patrol");function yl(t,e={}){let r=typeof t=="function"?t:()=>d.game.root.query(t),n=e.checkFrequency||1,s=typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?q.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?q.fromAngle(c):c)||s,p=h||e.fieldOfView;if(!u||!p||p>=360)return!0;let y=p/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=y},hasLineOfSight(l){let c=ui(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>n){i-=n;let l=r();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(yl,"sentry");function vi(t={}){let e=C(0),r=t.isObstacle??!1,n=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??C(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=C(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get cost(){return n},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(C(-1,0))},moveRight(){this.tileMove(C(1,0))},moveUp(){this.tileMove(C(0,-1))},moveDown(){this.tileMove(C(0,1))}}}o(vi,"tile");var Gr,bi=(Gr=class{constructor(e,r,n){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||un.linear,this.interpolation=r.interpolation||"linear",this.isFinished=!1,this.timing=r.timing,this.easings=r.easings,this.relative=n}update(e,r){return!0}getLowerKeyIndexAndRelativeTime(e,r,n){let s=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),n){let c=0;for(;n[c+1]!==void 0&&n[c+1]=s?[s,0,!0]:[c,(i-n[c])/(n[c+1]-n[c]),!1]}else{let c=Math.floor((r-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,r,n){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(n);break;case"angle":e.angle=e.base.angle+n;break;case"scale":e.scale=e.base.scale.scale(n);break;case"opacity":e.opacity=e.base.opacity*n;break;default:e[r]=n}else e[r]=n}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=un.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},o(Gr,"AnimateChannel"),Gr);function qs(t,e){return e.add(e.sub(t))}o(qs,"reflect");var Hr,Qh=(Hr=class extends bi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,Fe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Hr,"AnimateChannelNumber"),Hr),Kr,Zh=(Kr=class extends bi{constructor(r,n,s,i,l){var c;super(r,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=n,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:qs(y,u),v=p[r.x,r.y])})}},o(Kr,"AnimateChannelVec2"),Kr),Wr,_h=(Wr=class extends bi{constructor(r,n,s,i){super(r,s,i);b(this,"keys");this.keys=n}update(r,n){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(n,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(r,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Wr,"AnimateChannelColor"),Wr);function wl(t={}){let e=[],r=0,n=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:C(0,0),angle:0,scale:C(1,1),opacity:1},animation:{paused:!1,seek(s){r=at(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),n=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;r+=d.k.dt();for(let l of e)i=l.update(this,r),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!n&&(n=!0,this.trigger("animateFinished"))},animate(s,i,l){n=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new Qh(s,i,l,t.relative||!1)):i[0]instanceof q?e.push(new Zh(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof se&&e.push(new _h(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(wl,"animate");function Ei(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(n=>n.has("named")).map(n=>Ei(n,n.name))),r}o(Ei,"serializeAnimation");function Ts(t=2,e=1){let r=0;return{require:["scale"],update(){let n=Math.sin(r*t)*e;n<0&&this.destroy(),this.scale=C(n),r+=d.k.dt()}}}o(Ts,"boom");var $h=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=cs())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(r){this.on("press",r)},onRelease(r){this.on("release",r)}}},"fakeMouse");function Al(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let n=t;this.setHP(t+r),this.trigger("heal",t-n)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}o(Al,"health");function xl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?d.game.root.tween(this.opacity,0,r,n=>this.opacity=n,un.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(xl,"lifespan");function vl(t){return{id:"named",name:t}}o(vl,"named");function bl(t,e,r){if(!t)throw new Error("state() requires an initial state");let n={};function s(h){n[h]||(n[h]={enter:new qe,end:new qe,update:new qe,draw:new qe})}o(s,"initStateEvents");function i(h,u,p){return s(u),n[u][h].add(p)}o(i,"on");function l(h,u,...p){s(u),n[u][h].trigger(...p)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let p=this.state;if(r){if(!(r!=null&&r[p]))return;let y=typeof r[p]=="string"?[r[p]]:r[p];if(!y.includes(h))throw new Error(`Cannot transition state from "${p}" to "${h}". Available transitions: ${y.map(m=>`"${m}"`).join(", ")}`)}l("end",p,...u),this.state=h,l("enter",h,...u),l("enter",`${p} -> ${h}`,...u)},onStateTransition(h,u,p){return i("enter",`${h} -> ${u}`,p)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(bl,"state");function Si(t){return{id:"stay",stay:!0,scenesToStay:t}}o(Si,"stay");function El(t=!0,e){let r,n;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){r.cancel(),n.cancel()}}}o(El,"textInput");function Vn(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,n=-1,s=!1){let i=s?0:e,l=new qe,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,r,n,s,i=un.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/n,1);s(Fe(e,r,i(u))),u===1&&(h.cancel(),s(r),c.forEach(p=>p()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(r),c.forEach(u=>u())}}}}}o(Vn,"timer");var Is=0;function Bs(){return Is>0}o(Bs,"usesArea");var bt=null,sa=!1;function Sl(t={}){let e={},r=new Set,n=[];return!bt&&!sa&&(bt=d.k.get("fakeMouse")[0],sa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Is++,this.area.cursor&&n.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),n.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,r.add(s.id))}))},destroy(){Is--;for(let s of n)s.cancel()},fixedUpdate(){for(let s in e)r.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);r.clear()},drawInspect(){let s=this.localArea();He(),rt(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/zi(),color:ce(0,0,255)},anchor:this.anchor,fill:!1,fixed:Mt(this)};s instanceof we?Ne({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?kt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Oe&&or({...i,pos:s.center,radius:s.radius}),Ue()},area:{shape:t.shape??null,scale:t.scale?C(t.scale):C(1),offset:t.offset??C(0),cursor:t.cursor??null},isClicked(){return bt?bt.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(bt){let i=Mt(this)?bt.pos:d.k.toWorld(bt.pos);return this.hasPoint(i)}let s=Mt(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){bt&&bt.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return n.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(C(this.area.scale??1));if(s instanceof we){let l=ar(this.anchor||rs).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Mt(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,p;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(p=this.area.scale.y)==null?void 0:p.toFixed(1)}y)`}}}o(Sl,"area");function Ml(t={}){let e=null,r=null,n=!1,s=C(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:C(0),damping:t.damping??0,jumpForce:t.jumpForce??hh,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let p=u.reverse();if(h.trigger("beforePhysicsResolve",p),!(u.resolved||p.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let y=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/y)),h.pos=h.pos.add(u.displacement.scale(-this.mass/y)),Qt(this,this.transform),Qt(h,h.transform)}else{let y=!this.isStatic&&h.isStatic?u:u.reverse();y.source.pos=y.source.pos.add(y.displacement),Qt(y.source,y.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let v=e;e=h.target,v!=e&&(r=h.target.pos),n?n=!1:v||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),p=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),y=this.vel.project(h.normal),m=this.vel.sub(y);this.vel.dot(h.normal)<0&&(this.vel=m.sub(y.scale(u))),p!=0&&(this.vel=this.vel.sub(m.scale(p)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(r)),r=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Fe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Fe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){n&&(e=null,r=null,this.trigger("fallOff"),n=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(n=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??ch;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(sn())>0},isJumping(){return this.vel.dot(sn())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,r=null,this.vel=sn().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Ml,"body");function Pl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var l;if(!e.has("body"))return;let n=r==null?void 0:r.normal.normal(),s=e.vel.project(n),i=(l=n==null?void 0:n.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Cl,"surfaceEffector");function kl(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(kl,"areaEffector");function ql(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=this.pos.sub(e.pos),s=n.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=n.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(ql,"pointEffector");function Tl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Tl,"constantForce");function Il(t={}){return t.ignoreSides??(t.ignoreSides=[q.UP]),t.shouldCollide??(t.shouldCollide=(e,r)=>{var n;return((n=t.ignoreSides)==null?void 0:n.findIndex(s=>s.sdist(r){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Il,"platformEffector");function Bl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,r)=>{if(!e.has("body"))return;let n=e,s=n.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(C(-100,this.surfaceLevel),C(100,this.surfaceLevel));l&&(this.applyBuoyancy(n,l),this.applyDrag(n,l)),this.flowMagnitude&&n.addForce(q.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let n=this.density*r.area(),s=C(0,1).scale(-n);e.addForce(s)},applyDrag(e,r){let n=e.vel,s=this.density*this.linearDrag,i=n.scale(-s);e.addForce(i)}}}o(Bl,"buoyancyEffector");function Gn(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(Gn,"anchor");function Mi(){return{id:"fixed",fixed:!0}}o(Mi,"fixed");function Rl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??C(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Rl,"follow");function Fl(t){var r;let e=(r=d.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var n;return e?((n=d.game.layers)==null?void 0:n[e])??null:null},set layer(n){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(n),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Fl,"layer");function Ol(t,e){let r=typeof t=="number"?q.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}o(Ol,"move");function Ll(t={}){let e=t.distance??uh,r=!1,n=o(s=>{s.isOffScreen()?(r||(s.trigger("exitView"),r=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(r&&(s.trigger("enterView"),r=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new we(C(0),Me(),ke());return!gn(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?zl(()=>n(this)):this.onUpdate(()=>n(this))}}}o(Ll,"offscreen");function cn(...t){return{id:"pos",pos:C(...t),moveBy(...e){this.pos=this.pos.add(C(...e))},move(...e){this.moveBy(C(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(C(e[0],e[1]),e[2]);let r=e[0],n=e[1];if(n===void 0){this.pos=C(r);return}let s=r.sub(this.pos);if(s.len()<=n*d.k.dt()){this.pos=C(r);return}this.move(s.unit().scale(n))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,C()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),C()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,C()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?Mt(this)?r:Hn(r):null}},toScreen(e){let r=this.toWorld(e);return Mt(this)?r:Hn(r)},fromScreen(e){return Mt(this)?this.fromWorld(e):this.fromWorld(Ri(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){or({color:ce(255,0,0),radius:4/zi()})}}}o(cn,"pos");function Dl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Dl,"rotate");function dn(...t){if(t.length===0)return dn(1);let e=C(...t);return{id:"scale",set scale(r){if(!(r instanceof q))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=C(r)},get scale(){return e},scaleTo(...r){e=C(...r)},scaleBy(...r){e=e.scale(C(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(dn,"scale");function Ul(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Ul,"z");function Nl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let r=d.game.root.add([cn(e.pos??C(0))]),n=t.length,s=0,i=null,l=null,c=null,h=null,u=o(A=>A.x+A.y*s,"tile2Hash"),p=o(A=>C(Math.floor(A%s),Math.floor(A/s)),"hash2Tile"),y=o(()=>{i=[];for(let A of r.children)m(A)},"createSpatialMap"),m=o(A=>{let E=u(A.tilePos);i[E]?i[E].push(A):i[E]=[A]},"insertIntoSpatialMap"),v=o(A=>{let E=u(A.tilePos);if(i[E]){let M=i[E].indexOf(A);M>=0&&i[E].splice(M,1)}},"removeFromSpatialMap"),g=o(()=>{let A=!1;for(let E of r.children){let M=r.pos2Tile(E.pos);(E.tilePos.x!=M.x||E.tilePos.y!=M.y)&&(A=!0,v(E),E.tilePos.x=M.x,E.tilePos.y=M.y,m(E))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),B=o(()=>{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();l?l.length=E:l=new Array(E),l.fill(1,0,E);for(let M=0;M{let A=r.getSpatialMap(),E=r.numRows()*r.numColumns();c?c.length=E:c=new Array(E),c.fill(15,0,E);for(let M=0;M{let A=r.numRows()*r.numColumns(),E=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();T(O).forEach(j=>{h[j]<0&&(h[j]=L,D.push(j))})}},"traverse");h?h.length=A:h=new Array(A),h.fill(-1,0,A);let M=0;for(let R=0;R=0){M++;continue}E(R,M),M++}},"createConnectivityMap"),S=o((A,E)=>l[E],"getCost"),k=o((A,E)=>{let M=p(A),R=p(E);return M.dist(R)},"getHeuristic"),T=o((A,E)=>{let M=[],R=Math.floor(A%s),L=R>0&&c[A]&1&&l[A-1]!==1/0,D=A>=s&&c[A]&2&&l[A-s]!==1/0,O=R{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let j of R)j.id==="tile"&&(D=!0),j.id==="pos"&&(L=!0);L||R.push(cn(this.tile2Pos(M))),D||R.push(vi());let O=r.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Qt(O,O.transform),i&&(m(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return n},levelWidth(){return s*this.tileWidth()},levelHeight(){return n*this.tileHeight()},tile2Pos(...A){return C(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let E=C(...A);return C(Math.floor(E.x/this.tileWidth()),Math.floor(E.y/this.tileHeight()))},getSpatialMap(){return i||y(),i},removeFromSpatialMap:v,insertIntoSpatialMap:m,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||y();let E=u(A);return i[E]||[]},raycast(A,E){let M=this.toWorld(A),R=this.toWorld(A.add(E)).sub(M),L=1/this.tileWidth(),D=A.scale(L),O=Da(D,E,j=>{let _=this.getAt(j);if(_.some(J=>J.isObstacle))return!0;let K=null;for(let J of _)if(J.has("area")){let te=J.worldArea().raycast(M,R);te&&(K?te.fraction=s||A.y<0||A.y>=n||E.x<0||E.x>=s||E.y<0||E.y>=n)return null;let R=u(A),L=u(E);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new uo((ne,W)=>ne.costO.scale(R,L).add(R/2,L/2)),E]:null}};return r.use(P),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,E)=>{let M=A.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{r.spawn(R,C(L,E))})}),r}o(Nl,"addLevel");function ze(t,e,r){let n=!1,s=new Map,i=o(h=>{let u=h.on(t,(...p)=>{r(h,...p)});u.paused=n,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return n},set paused(h){n=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(ze,"on");var ec=o((t,e,...r)=>{for(let n of d.game.root.children)n.is(e)&&n.trigger(t,r)},"trigger"),tc=fe(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("fixedUpdate",t,e)),zl=fe(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("update",t,e)),rc=fe(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>ze("draw",t,e)),Rs=fe(t=>d.game.events.on("add",t),(t,e)=>ze("add",t,e)),ia=fe(t=>d.game.events.on("destroy",t),(t,e)=>ze("destroy",t,e)),aa=fe(t=>d.game.events.on("use",t),(t,e)=>ze("use",t,e)),oa=fe(t=>d.game.events.on("unuse",t),(t,e)=>ze("unuse",t,e)),jl=fe(t=>d.game.events.on("tag",t),(t,e)=>ze("tag",t,e)),nc=fe(t=>d.game.events.on("untag",t),(t,e)=>ze("untag",t,e));function Vl(t,e,r){return ze("collide",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Vl,"onCollide");function Gl(t,e,r){return ze("collideUpdate",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Gl,"onCollideUpdate");function Hl(t,e,r){return ze("collideEnd",t,(n,s,i)=>s.is(e)&&r(n,s,i))}o(Hl,"onCollideEnd");function An(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Rs(t,e),jl((r,n)=>{n===t&&e(r)})}o(An,"forAllCurrentAndFuture");var sc=fe(t=>d.app.onMousePress(t),(t,e)=>{let r=[];return An(t,n=>{if(!n.area)throw new Error("onClick() requires the object to have area() component");r.push(n.onClick(()=>e(n)))}),ir.join(r)});function Kl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHover() requires the object to have area() component");r.push(n.onHover(()=>e(n)))}),ir.join(r)}o(Kl,"onHover");function Wl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(n.onHoverUpdate(()=>e(n)))}),ir.join(r)}o(Wl,"onHoverUpdate");function Yl(t,e){let r=[];return An(t,n=>{if(!n.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(n.onHoverEnd(()=>e(n)))}),ir.join(r)}o(Yl,"onHoverEnd");function Xl(t){return d.game.events.on("loading",t)}o(Xl,"onLoading");function Jl(t){return d.app.onResize(t)}o(Jl,"onResize");function Ql(t){return d.game.events.on("error",t)}o(Ql,"onError");function us(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(us,"onLoad");function Zl(t){if(d.assets.loaded)ci().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(Zl,"onLoadError");function Pi(...t){d.game.cam.pos=C(...t)}o(Pi,"setCamPos");function Ci(){return d.game.cam.pos?d.game.cam.pos.clone():fn()}o(Ci,"getCamPos");function ki(...t){d.game.cam.scale=C(...t)}o(ki,"setCamScale");function qi(){return d.game.cam.scale.clone()}o(qi,"getCamScale");function Ti(t){d.game.cam.angle=t}o(Ti,"setCamRot");function Ii(){return d.game.cam.angle}o(Ii,"getCamRot");function xn(){return d.game.cam.transform.clone()}o(xn,"getCamTransform");function Bi(t=ce(255,255,255),e=1){let r=d.game.root.add([hi(Me(),ke()),oi(t),li(1),Mi()]),n=r.fadeOut(e);return n.onEnd(()=>Ni(r)),n}o(Bi,"flash");function _l(t=12){d.game.cam.shake+=t}o(_l,"shake");function Hn(t){return d.game.cam.transform.transformPoint(t,C())}o(Hn,"toScreen");function Ri(t){return d.game.cam.transform.inverse.transformPoint(t,C())}o(Ri,"toWorld");function $l(...t){return Kt("camPos","setCamPos / getCamPos"),t.length>0&&Pi(...t),Ci()}o($l,"camPos");function eu(...t){return Kt("camScale","setCamScale / getCamScale"),t.length>0&&ki(...t),qi()}o(eu,"camScale");function tu(t){return Kt("camRot","setCamRot / getCamRot"),t!==void 0&&Ti(t),Ii()}o(tu,"camRot");function ru(t=ce(255,255,255),e=1){return Kt("camFlash","flash"),Bi(t,e)}o(ru,"camFlash");function nu(){return Kt("camTransform","getCamTransform"),xn()}o(nu,"camTransform");var su=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(su||{});function hs(t=[]){let e=new Map,r=[],n={},s=new ns,i=new qe,l=new qe,c=new qe,h=[],u=new Set("*"),p=d.globalOpt.tagsAsComponents,y=null,m=!1,v,g={id:Ah(),hidden:!1,transform:new rr,children:[],get parent(){return v},set parent(f){if(v===f)return;let w=v?v.children.indexOf(this):-1;w!==-1&&v.children.splice(w,1),v=f,f&&f.children.push(this)},setParent(f,w){if(v===f)return;let S=v.transform,k=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),k.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=k.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(k.getScale()))),this.parent=f},set paused(f){if(f!==m){m=f;for(let w of h)w.paused=f}},get paused(){return m},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?hs(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Qt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(k=>w(k))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ke(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),He(),Qe(this.pos),Zr(this.scale),sr(this.angle);let w=this.children.sort((S,k)=>{let T=S.layerIndex??d.game.defaultLayerIndex,P=k.layerIndex??d.game.defaultLayerIndex;return T-P||(S.z??0)-(k.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let k=0;k{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),Ue())},use(f){var k;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),n[f.id]=[],w=n[f.id],e.set(f.id,f),p&&u.add(f.id)):r.push(f);let S=o(()=>{if(f.require)try{for(let T of f.require)if(!this.c(T))throw new Error(`Component "${f.id}" requires component "${T}"`)}catch(T){d.handleErr(T)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(y=o(T=>w.push(T),"onCurCompCleanup"),f.add.call(this),y=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let T in f){if(oh.has(T))continue;let P=Object.getOwnPropertyDescriptor(f,T);if(P)if(typeof P.value=="function"&&(f[T]=f[T].bind(this)),P.set&&Object.defineProperty(f,T,{set:P.set.bind(this)}),P.get&&Object.defineProperty(f,T,{get:P.get.bind(this)}),lh.has(T)){let A=T==="add"?()=>{var E;y=o(M=>w.push(M),"onCurCompCleanup"),(E=f[T])==null||E.call(f),y=null}:f[T];w.push(this.on(T,A).cancel)}else if(this[T]===void 0)Object.defineProperty(this,T,{get:o(()=>f[T],"get"),set:o(A=>f[T]=A,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[T]);else{let A=(k=e.values().find(E=>E[T]!==void 0))==null?void 0:k.id;throw new Error(`Duplicate component property: "${T}" while adding component "${f.id}"`+(A?` (originally added by "${A}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else p&&u.has(f)&&u.delete(f);n[f]&&(n[f].forEach(w=>w()),delete n[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((T,P)=>w.only==="comps"?T.has(P):w.only==="tags"?T.is(P):T.is(P)||T.has(P),"checkTagsOrComps"),k=w.recursive?this.children.flatMap(o(function T(P){return[P,...P.children.flatMap(T)]},"recurse")):this.children;if(k=k.filter(T=>f?S(T,f):!0),w.liveUpdate){let T=o(A=>w.recursive?this.isAncestorOf(A):A.parent===this,"isChild"),P=[];P.push(d.k.onAdd(A=>{T(A)&&S(A,f)&&k.push(A)})),P.push(d.k.onDestroy(A=>{if(S(A,f)){let E=k.findIndex(M=>M.id===A.id);E!==-1&&k.splice(E,1)}})),(p||w.only!=="tags")&&(P.push(d.k.onUse((A,E)=>{T(A)&&S(A,f)&&k.findIndex(M=>M.id===A.id)==-1&&k.push(A)})),P.push(d.k.onUnuse((A,E)=>{if(T(A)&&!S(A,f)){let M=k.findIndex(R=>R.id===A.id);M!==-1&&k.splice(M,1)}}))),!p&&w.only!=="comps"&&(P.push(d.k.onTag((A,E)=>{T(A)&&S(A,f)&&k.findIndex(M=>M.id===A.id)==-1&&k.push(A)})),P.push(d.k.onUntag((A,E)=>{if(T(A)&&!S(A,f)){let M=k.findIndex(R=>R.id===A.id);M!==-1&&k.splice(M,1)}}))),this.onDestroy(()=>{for(let A of P)A.cancel()})}return k},query(f){let w=f.hierarchy||"children",S=f.include,k=f.exclude,T=[];switch(w){case"children":T=this.children;break;case"siblings":T=this.parent?this.parent.children.filter(A=>A!==this):[];break;case"ancestors":let P=this.parent;for(;P;)T.push(P),P=P.parent;break;case"descendants":T=this.children.flatMap(o(function A(E){return[E,...E.children.flatMap(A)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>P.is(S)):T=T.filter(P=>f.include.some(A=>P.is(A)))),k&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?T=T.filter(P=>!P.is(k)):T=T.filter(P=>!f.exclude.some(A=>P.is(A)))),f.visible===!0&&(T=T.filter(P=>P.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let P=f.distanceOp||"near",A=f.distance*f.distance;P==="near"?T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)<=A):T=T.filter(E=>E.pos&&this.pos.sdist(E.pos)>A)}return f.name&&(T=T.filter(P=>P.name===f.name)),T},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(k=>{switch(f){case"fixedUpdate":return i.add(k);case"update":return l.add(k);case"draw":return c.add(k);default:return s.on(f,k)}})(w.bind(this));return y&&y(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,k]of e)f[S]=((w=k.inspect)==null?void 0:w.call(k))??null;for(let[S,k]of r.entries()){if(k.inspect){f[S]=k.inspect();continue}for(let[T,P]of Object.entries(k))typeof P!="function"&&(f[T]=`${T}: ${P}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},B=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of B)g[f]=(...w)=>{var k,T;let S=(T=(k=d.app)[f])==null?void 0:T.call(k,...w);return h.push(S),g.onDestroy(()=>S.cancel()),g.on("sceneEnter",()=>{var A,E;h.splice(h.indexOf(S),1);let P=(E=(A=d.app)[f])==null?void 0:E.call(A,...w);ir.replace(S,P),h.push(S)}),S};for(let f of t)g.use(f);return g}o(hs,"make");var ic=o(()=>({events:new ns,root:hs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new q(1),angle:0,shake:0,transform:new rr}}),"initGame");function iu(t){d.game.gravity=t?(d.game.gravity||C(0,1)).unit().scale(t):null}o(iu,"setGravity");function au(){return d.game.gravity?d.game.gravity.len():0}o(au,"getGravity");function ou(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(ou,"setGravityDirection");function sn(){return d.game.gravity?d.game.gravity.unit():C(0,1)}o(sn,"getGravityDirection");var ac=Qu("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");function lu(t){return t.createBuffer(1,1,44100)}o(lu,"createEmptyAudioBuffer");var oc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new xr(lu(t));return t.decodeAudioData(ac.buffer.slice(0)).then(n=>{r.buf=n}).catch(n=>{console.error("Failed to load burp: ",n)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function uu(t,e={}){let r=new qe,n=new Audio(t);n.crossOrigin="anonymous",n.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(n);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),n.play()}return o(l,"play"),e.paused||l(),n.onended=()=>r.trigger(),{play(){l()},seek(c){n.currentTime=c},stop(){n.pause(),this.seek(0)},set loop(c){n.loop=c},get loop(){return n.loop},set paused(c){c?n.pause():l()},get paused(){return n.paused},time(){return n.currentTime},duration(){return n.duration},set volume(c){n.volume=at(c,0,1)},get volume(){return n.volume},set speed(c){n.playbackRate=Math.max(c,0)},get speed(){return n.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return r.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(uu,"playMusic");function hu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return uu(d.assets.music[t],e);let r=d.audio.ctx,n=e.paused??!1,s=r.createBufferSource(),i=new qe,l=r.createGain(),c=r.createStereoPanner(),h=e.seek??0,u=0,p=0,y=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;g()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let m=o(f=>{s.buffer=f.buf,n||(u=r.currentTime,s.start(0,h),y=!0)},"start"),v=ol(t);v instanceof ot&&v.onLoad(m);let g=o(()=>{if(!s.buffer)return 0;let f=n?p-u:r.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),B=o(f=>{let w=r.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(n!==f)if(n=f,f)y&&(s.stop(),y=!1),p=r.currentTime;else{s=B(s);let w=p-u;s.start(0,w),y=!0,u=r.currentTime-w,p=0}},get paused(){return n},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(n?(s=B(s),u=p-f):(s.stop(),s=B(s),u=r.currentTime-f,s.start(0,f),y=!0,p=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return g()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(hu,"play");function Fi(t){return d.k.play(d.audio.burpSnd,t)}o(Fi,"burp");function Oi(t){d.audio.masterNode.gain.value=t}o(Oi,"setVolume");function Li(){return d.audio.masterNode.gain.value}o(Li,"getVolume");function cu(t){return Kt("volume","setVolume / getVolume"),t!==void 0&&Oi(t),Li()}o(cu,"volume");function Di(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Wi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Kn(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Nn(at(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Nn(at(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Fi())}o(Di,"initEvents");function du(t,e={}){let r=d.game.root.add([cn(t),Si()]),n=(e.speed||1)*5,s=e.scale||1;r.add([jn(d.boomSprite),dn(0),Gn("center"),Ts(n,s),...e.comps??[]]);let i=r.add([jn(d.kaSprite),dn(0),Gn("center"),Vn(),...e.comps??[]]);return i.wait(.4/n,()=>i.use(Ts(n,s))),i.onDestroy(()=>r.destroy()),r}o(du,"addKaboom");function Ui(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=r}o(Ui,"setLayers");function fu(){return d.game.layers}o(fu,"getLayers");function pu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(pu,"getDefaultLayer");function gu(t,e){Kt("layers","setLayers"),Ui(t,e)}o(gu,"layers");function Ni(t){t.destroy()}o(Ni,"destroy");function mu(){return d.game.root}o(mu,"getTreeRoot");function yu(t,e){d.game.scenes[t]=e}o(yu,"scene");function wu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?d.game.root.remove(r):r.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Di(),d.game.cam={pos:null,scale:C(1),angle:0,shake:0,transform:new rr},d.game.scenes[t](...e)}),d.game.currentScene=t}o(wu,"go");function Fs(t){return d.game.events.on("sceneLeave",t)}o(Fs,"onSceneLeave");function Au(){return d.game.currentScene}o(Au,"getSceneName");function Qe(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(Qe,"pushTranslateV");function rt(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(rt,"pushTranslate");function He(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(He,"pushTransform");function xu(t){d.gfx.transform.setMat23(t)}o(xu,"pushMatrix");function Zr(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Zr,"pushScaleV");function sr(t){t&&d.gfx.transform.rotateSelf(t)}o(sr,"pushRotate");function Ue(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(Ue,"popTransform");function Ke(){d.gfx.renderer.flush(Me(),ke())}o(Ke,"flush");function Me(){return d.gfx.width}o(Me,"width");function ke(){return d.gfx.height}o(ke,"height");function zi(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(zi,"getViewportScale");function vu(t){return new q(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(vu,"contentToView");function bu(t){return new q((t.x-d.gfx.viewport.x)*Me()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*ke()/d.gfx.viewport.height)}o(bu,"windowToContent");function cs(){return bu(d.app.mousePos())}o(cs,"mousePos");function fn(){return C(Me()/2,ke()/2)}o(fn,"center");var Yr,ji=(Yr=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Yr,"Picture"),Yr),lc=new Xn;function Vi(t,e){let r=Me(),n=ke();d.gfx.renderer.flush(r,n);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let p=null,y=null;for(let m of t.commands){let v=m.material.tex??d.gfx.defTex,g=m.material.shader??d.gfx.defShader;m.material.blend&&d.gfx.renderer.setBlend(m.material.blend),g!=p&&(p==null||p.unbind(),g.bind(),p=g,g.send({width:r,height:n,camera:e.fixed?lc:xn(),transform:s})),m.material.uniform&&(g==null||g.send(m.material.uniform)),v!=y&&(y==null||y.unbind(),v==null||v.bind(),y=v),l.drawElements(l.TRIANGLES,m.count,l.UNSIGNED_SHORT,m.index*2)}p==null||p.unbind(),y==null||y.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(Vi,"drawPicture");function Eu(t){t??(t=new ji),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Eu,"beginPicture");function Su(t){t??(t=new ji),d.gfx.renderer.picture=t}o(Su,"appendToPicture");function Mu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new hc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Mu,"endPicture");var tr,Ct=(tr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=r,this.height=n;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),r&&n&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,n,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,r,n={}){let s=new tr(e,r.width,r.height,n);return s.update(r),s.src=r,s}update(e,r=0,n=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,r,n,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(tr,"Texture"),tr),la=new Xn,Xr,uc=(Xr=class{constructor(e,r,n,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((c,h)=>c+h.size,0),this.maxVertices=n,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,n,s,i=null,l=null,c,h,u,p){if(this.picture){let v=this.picture.indices.length,g=n.length,B=this.picture.vertices.length/this.stride,f=r.length;for(let k=0;kthis.maxVertices||this.iqueue.length+n.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let y=this.vqueue.length/this.stride,m=r.length;for(let v=0;v{e.push(i),t(i)},"push"),n=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[r,n,s]}o(Ft,"genStack");function Pu(t,e={}){let r=[];function n(P){r.push(P)}o(n,"onDestroy");function s(){r.forEach(A=>A());let P=t.getExtension("WEBGL_lose_context");P&&P.loseContext()}o(s,"destroy");let i=null;function l(P){if(is(P,i))return;i=P;let A=P.reduce((E,M)=>E+M.size,0);P.reduce((E,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,A*4,E),E+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Ft(P=>t.bindTexture(t.TEXTURE_2D,P)),[u,p]=Ft(P=>t.bindBuffer(t.ARRAY_BUFFER,P)),[y,m]=Ft(P=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,P)),[v,g]=Ft(P=>t.bindFramebuffer(t.FRAMEBUFFER,P)),[B,f]=Ft(P=>t.bindRenderbuffer(t.RENDERBUFFER,P)),[w,S]=Ft(P=>{if(!P)return;let{x:A,y:E,w:M,h:R}=P;t.viewport(A,E,M,R)}),[k,T]=Ft(P=>t.useProgram(P));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:n,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:p,pushElementArrayBuffer:y,popElementArrayBuffer:m,pushFramebuffer:v,popFramebuffer:g,pushRenderbuffer:B,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:k,popProgram:T,setVertexFormat:l}}o(Pu,"initGfx");var Qr,Kn=(Qr=class{constructor(e,r,n,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Ct(e,r,n,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,n),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let n=this.width*4,s=new Uint8Array(n);for(let i=0;i<(this.height/2|0);i++){let l=i*n,c=(this.height-i-1)*n;s.set(r.subarray(l,l+n)),r.copyWithin(l,c,c+n),r.set(s,c)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Qr,"FrameBuffer"),Qr),fr=new q;function Tt(t,e,r=!1,n,s,i,l){let c=n??d.gfx.defTex,h=s??d.gfx.defShader,u=sl(h);if(!u||u instanceof ot)return;let p=d.gfx.transform,y=t.pos.length/2,m=new Array(y*8),v=0;for(let g=0;gi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),Tt(n,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),Ue()}}o(kt,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,n=ar(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=wr(n,t.radiusX,t.radiusY,e,r,t.resolution);s.unshift(n);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==!1&&kt(Object.assign({},i,{outline:null})),kt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}kt(i)}o(ds,"drawEllipse");function or(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(or,"drawCircle");function Ar(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let n=t.width||1,s=r.sub(e).unit().normal().scale(n*.5),i=t.color??se.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,r.x+s.x,r.y+s.y,r.x-s.x,r.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};Tt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(Ar,"drawLine");function Cu(t){let e=t.pts,r=[],n=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||C(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-n/c),u,p=e[0];if(!s)switch(t.cap){case"square":{let g=l.scale(-n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(-1),w=Math.cos(B),S=Math.sin(B);for(let k=0;k0?(r.push(u.add(T)),r.push(u.sub(h)),r.push(u.add(T)),r.push(u.sub(w))):(r.push(u.add(h)),r.push(u.sub(T)),r.push(u.add(w)),r.push(u.sub(T))),l=B,c=f,h=w}if(!s)switch(r.push(p.add(h)),r.push(p.sub(h)),t.cap){case"square":{let g=l.scale(n/c);r.push(p.add(g).add(h)),r.push(p.add(g).sub(h));break}case"round":{let g=Math.max(n,10),B=Math.PI/g,f=h.scale(1),w=Math.cos(B),S=Math.sin(B);for(let k=0;k0){let P=u.add(T),A=Math.max(n,10),E=ye(h.angleBetween(w)/A),M=h,R=Math.cos(E),L=Math.sin(E);for(let D=0;D({pos:i.add(g),uv:C(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let g=0;g({pos:i.add(g),uv:C(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let g=0;g2)switch(t.join){case"bevel":return Cu(t);case"round":return ku(t);case"miter":return qu(t)}if(t.radius&&e.length>=3){Ar(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let n=1;nts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Tu,"drawBezier");function Vt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ar(t.anchor||rs),s=n.x*e*-.5,i=n.y*r*-.5,l=t.quad||new Ae(0,0,1,1),c=t.color||se.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,p=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+p,v=l.w-u*2,g=l.h-p*2;He(),Qe(t.pos),sr(t.angle),Zr(t.scale),rt(s,i),Tt({pos:[-e/2,r/2,-e/2,-r/2,e/2,-r/2,e/2,r/2],uv:[t.flipX?y+v:y,t.flipY?m:m+g,t.flipX?y+v:y,t.flipY?m+g:m,t.flipX?y:y+v,t.flipY?m+g:m,t.flipX?y:y+v,t.flipY?m:m+g],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),Ue()}o(Vt,"drawUVQuad");function Iu(t){let e=t.canvas.fb;Vt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Iu,"drawCanvas");var gs={};function Os(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(C(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Os,"applyCharTransform");function Wn(t){let e={},r="",n=[],s=String(t),i=o(l=>{n.length>0&&(e[r.length]=n.slice()),r+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let p=n.pop();if(p!==u)throw p!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${p}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else n.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(n.length>0)throw new Error(`Styled text error: unclosed tags ${n}`);return{charStyleMap:e,text:r}}o(Wn,"compileStyledText");function Gt(t){var k,T,P;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=di(t.font);if(!t.text||t.text===""||e instanceof ot||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:n}=Wn(t.text+""),s=mo(n);if(e instanceof On||typeof e=="string"){let A=e instanceof On?e.fontface.family:e,E=e instanceof On?{outline:e.outline,filter:e.filter}:{outline:null,filter:bs},M=gs[A]??{font:{tex:new Ct(d.gfx.ggl,2048,2048,{filter:E.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:E.outline};gs[A]||(gs[A]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${A}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let j=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,j+=M.outline.width*3),L.fillText(R,((k=M.outline)==null?void 0:k.width)??0,((T=M.outline)==null?void 0:T.width)??0);let _=L.getImageData(0,0,O,j);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(_,M.cursor.x,M.cursor.y),e.map[R]=new Ae(M.cursor.x,M.cursor.y,O,j),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,j)}}let i=t.size||e.size,l=C(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,p=0,y=0,m=[],v=[],g=0,B=null,f=0,w;for(;gt.width&&(y+=i+c,B!=null&&(g-=v.length-B,A=s[g],E=e.map[A],M=E.w*l.x,v=v.slice(0,B-1),u=f),B=null,f=0,m.push({width:u-h,chars:v}),u=w??0,v=[]),v.push({tex:e.tex,width:E.w,height:E.h,quad:new Ae(E.x/e.tex.width,E.y/e.tex.height,E.w/e.tex.width,E.h/e.tex.height),ch:A,pos:new q(u,y),opacity:t.opacity??1,color:t.color??se.WHITE,scale:C(l),angle:0}),A===" "&&(B=v.length,f=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,p=Math.max(p,u),u+=h}}g++}m.push({width:u-h,chars:v}),y+=i,t.width&&(p=t.width);let S=[];for(let A=0;A{Vt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),Ue()}o(Ht,"drawFormattedText");function Ne(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,n=ar(t.anchor||rs).add(1,1).scale(new q(e,r).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,r),new q(0,r)];if(t.radius){let i=Math.min(e,r)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?wr(new q(e-l[1],l[1]),l[1],l[1],270,360):[C(e,0)],...l[2]?wr(new q(e-l[2],r-l[2]),l[2],l[2],0,90):[C(e,r)],...l[3]?wr(new q(l[3],r-l[3]),l[3],l[3],90,180):[C(0,r)],...l[0]?wr(new q(l[0],l[0]),l[0],l[0],180,270):[]]}kt(Object.assign({},t,{offset:n,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ne,"drawRect");function Pt(t){Ke();let e=d.gfx.width,r=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ke(),d.gfx.width=e,d.gfx.height=r}o(Pt,"drawUnscaled");function Ls(t,e){Pt(()=>{let r=C(8);He(),Qe(t);let n=Gt({text:e,font:Un,size:16,pos:r,color:ce(255,255,255),fixed:!0}),s=n.width+r.x*2,i=n.height+r.x*2;t.x+s>=Me()&&Qe(C(-s,0)),t.y+i>=ke()&&Qe(C(0,-i)),Ne({width:s,height:i,color:ce(0,0,0),radius:4,opacity:.8,fixed:!0}),Ht(n),Ue()})}o(Ls,"drawInspectText");function Hi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return kt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Hi,"drawTriangle");function Bu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let n in r)r[n]?e.push(r[n]):e.push(n);e.push(...t.tags.map(n=>`tag: ${n}`)),Ls(vu(cs()),e.join(` -`))}Ls(C(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&Pt(()=>{He(),rt(Me(),0),rt(-8,8);let t=32;Ne({width:t,height:t,anchor:"topright",color:ce(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ne({width:4,height:t*.6,anchor:"center",pos:C(-t/3*e,t*.5),color:ce(255,255,255),radius:2,fixed:!0});Ue()}),d.debug.timeScale!==1&&Pt(()=>{He(),rt(Me(),ke()),rt(-8,-8);let t=8,e=Gt({text:d.debug.timeScale.toFixed(1),font:Un,size:16,color:ce(255,255,255),pos:C(-t),anchor:"botright",fixed:!0});Ne({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ce(0,0,0),opacity:.8,radius:4,fixed:!0});for(let r=0;r<2;r++){let n=d.debug.timeScale<1;Hi({p1:C(-e.width-t*(n?2:3.5),-t),p2:C(-e.width-t*(n?2:3.5),-t-e.height),p3:C(-e.width-t*(n?3.5:2),-t-e.height/2),pos:C(-r*t*1+(n?-t*.5:0),0),color:ce(255,255,255),fixed:!0})}Ht(e),Ue()}),d.debug.curRecording&&Pt(()=>{He(),rt(0,ke()),rt(24,-24),or({radius:12,color:ce(255,0,0),opacity:Vs(0,1,d.app.time()*4),fixed:!0}),Ue()}),d.debug.showLog&&d.game.logs.length>0&&Pt(()=>{He(),rt(0,ke()),rt(8,-8);let t=8,e=[];for(let n of d.game.logs){let s="",i=n.msg instanceof Error?"error":"info";s+=`[time]${n.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Yn(n.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(n=>d.app.time()-n.time<(d.globalOpt.logTime||4));let r=Gt({text:e.join(` -`),font:Un,pos:C(t,-t),anchor:"botleft",size:16,width:Me()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ce(127,127,127)},info:{color:ce(255,255,255)},error:{color:ce(255,0,127)}}});Ne({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:ce(0,0,0),radius:4,opacity:.8,fixed:!0}),Ht(r),Ue()})}o(Bu,"drawDebug");function Yn(t,e=!1,r=new Set){if(r.has(t))return"";var n="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(n=["[",t.map(i=>Yn(i,!0,r.union(new Set([t])))).join(", "),"]"].join(""),t=n),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(n+=t.constructor.name+" "),n+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Yn(t[i],!0,r.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=n),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):Pt(()=>{let e=Me()/2,r=24,n=C(Me()/2,ke()/2).sub(C(e/2,r/2));Ne({pos:C(0),width:Me(),height:ke(),color:ce(0,0,0)}),Ne({pos:n,width:e,height:r,fill:!1,outline:{width:4}}),Ne({pos:n,width:e*t,height:r})})}o(Fu,"drawLoadScreen");function Ki(t,e,r){let n=d.gfx.ggl.gl;Ke(),n.clear(n.STENCIL_BUFFER_BIT),n.enable(n.STENCIL_TEST),n.stencilFunc(n.NEVER,1,255),n.stencilOp(n.REPLACE,n.REPLACE,n.REPLACE),e(),Ke(),n.stencilFunc(r,1,255),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),t(),Ke(),n.disable(n.STENCIL_TEST)}o(Ki,"drawStenciled");function Ou(t,e){let r=d.gfx.ggl.gl;Ki(t,e,r.EQUAL)}o(Ou,"drawMasked");function pn(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new Ae(0,0,1,1),r=t.tex.width*e.w,n=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=ar(t.anchor||rs),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||r),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||n),p=(t.width||r)/r,y=(t.height||n)/n,m=Math.floor(p),v=Math.floor(y),g=p-m,B=y-v,f=(m+g?1:0)*(v+B?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},k=0,T=t.color||se.WHITE,P=t.opacity||1,A=o((E,M,R,L,D)=>{w[k*6+0]=k*4+0,w[k*6+1]=k*4+1,w[k*6+2]=k*4+3,w[k*6+3]=k*4+1,w[k*6+4]=k*4+2,w[k*6+5]=k*4+3;let O=k*4;S.pos[O*2]=E+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,O++,S.pos[O*2]=E+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=T.r,S.color[O*3+1]=T.g,S.color[O*3+2]=T.b,S.opacity[O]=P,k++},"addQuad");for(let E=0;E{let r=ls(e,Es,Ss),n=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Kn(e,t.width*n*s,t.height*n*s):new Kn(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ce(t.background):(h=ce(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let p=new uc(e,ni,nh,sh),y=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(v=>new rr);return{lastDrawCalls:0,ggl:e,defShader:r,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:p,transform:new rr,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/n/s,height:t.height??i.drawingBufferHeight/n/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Wi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,r=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let n=e/r,s=d.globalOpt.width/d.globalOpt.height;if(n>s){let i=r*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:r}}else{let i=e/s,l=(r-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:r}}o(Wi,"updateViewport");var ua=o((t,e,r)=>{let n=d.systems,s=n.findIndex(l=>l.name===t);if(s!=-1){let l=n[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:r};for(let l of r)d.systemsByEvent[l].push(i);n.push({name:t,run:e,when:r})},"system"),dc="data:image/png;base64,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",fc="data:image/png;base64,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",pc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},ha=!1,gc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=r;let n=t.scale??1;d.gscale=n;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(r.width=t.width*n,r.height=t.height*n):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let U=r.width,H=r.height;i.push(`width: ${U}px`),i.push(`height: ${H}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,r.width*=l,r.height*=l,r.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ph({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let p=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,v=Pu(m,{texFilter:t.texFilter}),g=cc(t,v);d.gfx=g;let B=oc();d.audio=B;let f=Kh(v,t.spriteAtlasPadding??0);d.assets=f;let w=ic();d.game=w,w.root.use(Vn()),ua("collision",_e,[4,3]);function S(U,H){let X=new Kn(v,U,H);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ae=>{Ke(),X.bind(),ae(),Ke(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function k(){m.clear(m.COLOR_BUFFER_BIT),g.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),g.bgColor||Pt(()=>{Vt({width:Me(),height:ke(),quad:new Ae(0,0,Me()/64,ke()/64),tex:g.bgTex,fixed:!0})}),g.renderer.numDraws=0,g.fixed=!1,g.transformStackIndex=-1,g.transform.setIdentity()}o(k,"frameStart");function T(U,H){g.postShader=U,g.postShaderUniform=H??null}o(T,"usePostEffect");function P(){Ke(),g.lastDrawCalls=g.renderer.numDraws,g.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let U=g.width,H=g.height;g.width=m.drawingBufferWidth/l,g.height=m.drawingBufferHeight/l,pn({flipY:!0,tex:g.frameBuffer.tex,pos:new q(g.viewport.x,g.viewport.y),width:g.viewport.width,height:g.viewport.height,shader:g.postShader,uniform:typeof g.postShaderUniform=="function"?g.postShaderUniform():g.postShaderUniform,fixed:!0}),Ke(),g.width=U,g.height=H}o(P,"frameEnd");let A=!1,E={inspect:!1,set timeScale(U){u.state.timeScale=U},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Ve,drawCalls:o(()=>g.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...U)=>{let H=t.logMax??8,X=U.length>1?U.concat(" ").join(" "):U[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>H&&(w.logs=w.logs.slice(0,H))},"log"),error:o(U=>E.log(new Error(U.toString?U.toString():U)),"error"),curRecording:null,numObjects:o(()=>J("*",{recursive:!0}).length,"numObjects"),get paused(){return A},set paused(U){A=U,U?B.ctx.suspend():B.ctx.resume()}};d.debug=E;function M(U,H){try{return JSON.parse(window.localStorage[U])}catch{return H?(R(U,H),H):null}}o(M,"getData");function R(U,H){window.localStorage[U]=JSON.stringify(H)}o(R,"setData");function L(U,...H){let X=U(le),ae;typeof X=="function"?ae=X(...H)(le):ae=X;for(let Pe in ae)le[Pe]=ae[Pe],t.global!==!1&&(window[Pe]=ae[Pe]);return le}o(L,"plug");function D(U){let H=u.canvas.captureStream(U),X=B.ctx.createMediaStreamDestination();B.masterNode.connect(X);let ae=new MediaRecorder(H),Pe=[];return ae.ondataavailable=xe=>{xe.data.size>0&&Pe.push(xe.data)},ae.onerror=()=>{B.masterNode.disconnect(X),H.getTracks().forEach(xe=>xe.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),B.masterNode.disconnect(X),H.getTracks().forEach(xe=>xe.stop()),new Promise(xe=>{ae.onstop=()=>{xe(new Blob(Pe,{type:"video/mp4"}))}})},download(xe="kaboom.mp4"){this.stop().then($e=>Ms(xe,$e))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let j=w.root.add.bind(w.root),_=w.root.readd.bind(w.root),K=w.root.removeAll.bind(w.root),J=w.root.get.bind(w.root),te=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),W=w.root.query.bind(w.root),re=w.root.tween.bind(w.root),G=vr(null,fc),ve=vr(null,dc);d.kaSprite=G,d.boomSprite=ve;function je(){w.root.fixedUpdate()}o(je,"fixedUpdateFrame");function Ve(){w.root.update()}o(Ve,"updateFrame");const Le=class Le{constructor(H,X,ae,Pe,xe=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=H,this.target=X,this.normal=ae,this.distance=Pe,this.resolved=xe}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Le(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||C(0,1))>0}isRight(){return this.displacement.cross(w.gravity||C(0,1))<0}isTop(){return this.displacement.dot(w.gravity||C(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||C(0,1))<0}preventResolution(){this.resolved=!0}};o(Le,"Collision");let Ye=Le;function Y(U,H){if(H.paused||!H.exists())return!1;for(let ae of U.collisionIgnore)if(H.is(ae))return!1;for(let ae of H.collisionIgnore)if(U.is(ae))return!1;let X=Cs(U.worldArea(),H.worldArea());if(X){let ae=new Ye(U,H,X.normal,X.distance);U.trigger("collideUpdate",H,ae);let Pe=ae.reverse();Pe.resolved=ae.resolved,H.trigger("collideUpdate",U,Pe)}return!0}o(Y,"narrowPhase");let ee=new Vh,oe=!1;function Te(){if(Bs()){if(!oe){oe=!0,Rs(U=>{U.has("area")&&ee.add(U)}),ia(U=>{ee.remove(U)}),aa((U,H)=>{H==="area"&&ee.add(U)}),oa((U,H)=>{H==="area"&&ee.remove(U)}),Fs(U=>{oe=!1,ee.clear()});for(let U of J("*",{recursive:!0}))U.has("area")&&ee.add(U)}ee.update();for(let[U,H]of ee)Y(U,H)}}o(Te,"broadPhase");function _e(){if(Bs())return Te()}o(_e,"checkFrame");function ut(U){if(ha)return;ha=!0,console.error(U),B.ctx.suspend();let H=U.message??String(U)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,k(),Pt(()=>{let ae=Me(),Pe=ke(),xe={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:Un,fixed:!0};Ne({width:ae,height:Pe,color:ce(0,0,255),fixed:!0});let $e=Gt({...xe,text:"Error",pos:C(32),color:ce(255,128,0),fixed:!0});Ht($e),Ds({...xe,text:H,pos:C(32,32+$e.height+16),fixed:!0}),Ue(),w.events.trigger("error",U)}),P())})}o(ut,"handleErr"),d.handleErr=ut;function At(U){p.push(U)}o(At,"onCleanup");function ht(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let U=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let H=0;HH())})}o(ht,"quit");let Xe=!0;u.run(()=>{try{if(f.loaded&&!E.paused){for(let U of d.systemsByEvent[1])U.run();je();for(let U of d.systemsByEvent[4])U.run()}}catch(U){ut(U)}},(U,H)=>{try{if(U(),f.loaded||jt()===1&&!Xe&&(f.loaded=!0,ci().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||Xe)k(),Fu(),P();else{if(!E.paused){for(let X of d.systemsByEvent[0])X.run();Ve();for(let X of d.systemsByEvent[3])X.run()}k();for(let X of d.systemsByEvent[2])X.run();Ru(),t.debug!==!1&&Bu();for(let X of d.systemsByEvent[5])X.run();P()}Xe&&(Xe=!1),w.events.trigger("frameEnd"),H()}catch(X){ut(X)}}),Wi(),Di();let le={_k:d,VERSION:pc,loadRoot:Zo,loadProgress:jt,loadSprite:vr,loadSpriteAtlas:wi,loadSound:ll,loadMusic:ul,loadBitmapFont:gi,loadFont:tl,loadShader:il,loadShaderURL:al,loadAseprite:el,loadPedit:nl,loadBean:hl,loadHappy:Yh,loadJSON:_o,load:zn,getSound:yi,getFont:fi,getBitmapFont:pi,getSprite:Ai,getShader:mi,getAsset:$o,Asset:ot,SpriteData:nr,SoundData:xr,width:Me,height:ke,center:fn,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:Zl,onLoading:Xl,onResize:Jl,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Ql,onCleanup:At,flash:Bi,setCamPos:Pi,getCamPos:Ci,setCamRot:Ti,getCamRot:Ii,setCamScale:ki,getCamScale:qi,getCamTransform:xn,camPos:$l,camScale:eu,camFlash:ru,camRot:tu,camTransform:nu,shake:_l,toScreen:Hn,toWorld:Ri,setGravity:iu,getGravity:au,setGravityDirection:ou,getGravityDirection:sn,setBackground:Lo,getBackground:Do,getGamepads:u.getGamepads,getTreeRoot:mu,add:j,make:hs,destroy:Ni,destroyAll:K,get:J,query:W,readd:_,pos:cn,scale:dn,rotate:Dl,color:oi,blend:Uo,opacity:li,anchor:Gn,area:Sl,sprite:jn,text:cl,polygon:Yo,rect:hi,circle:No,ellipse:jo,uvquad:dl,video:fl,picture:Wo,outline:Ho,particles:Ko,body:Ml,surfaceEffector:Cl,areaEffector:kl,pointEffector:ql,buoyancyEffector:Bl,platformEffector:Il,constantForce:Tl,doubleJump:Pl,shader:Xo,textInput:El,timer:Vn,fixed:Mi,stay:Si,health:Al,lifespan:xl,named:vl,state:bl,z:Ul,layer:Fl,move:Ol,offscreen:Ll,follow:Rl,fadeIn:Vo,mask:Go,drawon:zo,raycast:ui,tile:vi,animate:wl,serializeAnimation:Ei,agent:pl,sentry:yl,patrol:ml,pathfinder:gl,fakeMouse:$h,trigger:ec,on:ze,onFixedUpdate:tc,onUpdate:zl,onDraw:rc,onAdd:Rs,onDestroy:ia,onUse:aa,onUnuse:oa,onTag:jl,onUntag:nc,onClick:sc,onCollide:Vl,onCollideUpdate:Gl,onCollideEnd:Hl,onHover:Kl,onHoverUpdate:Wl,onHoverEnd:Yl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:te,play:hu,setVolume:Oi,getVolume:Li,volume:cu,burp:Fi,audioCtx:B.ctx,Line:We,Rect:we,Circle:Oe,Ellipse:lt,Point:eh,Polygon:Re,Vec2:q,Color:se,Mat4:Xn,Mat23:rr,Quad:Ae,RNG:ya,rand:Ce,randi:Gs,randSeed:wa,vec2:C,rgb:ce,hsl2rgb:Zu,quad:Se,choose:va,chooseMultiple:xa,shuffle:Hs,chance:Aa,lerp:Fe,tween:re,easings:un,map:it,mapc:ma,wave:Vs,deg2rad:ye,rad2deg:qt,clamp:at,evaluateQuadratic:Na,evaluateQuadraticFirstDerivative:za,evaluateQuadraticSecondDerivative:ja,evaluateBezier:ts,evaluateBezierFirstDerivative:Va,evaluateBezierSecondDerivative:Ga,evaluateCatmullRom:Ha,evaluateCatmullRomFirstDerivative:Ka,curveLengthApproximation:$s,normalizedCurve:Wa,hermite:$r,cardinal:ei,catmullRom:ln,bezier:Ya,kochanekBartels:Xa,easingSteps:eo,easingLinear:_a,easingCubicBezier:$a,testLineLine:Jn,testRectRect:Ks,testRectLine:Qn,testRectPoint:gn,testCirclePolygon:mn,testLinePoint:Zn,testLineCircle:_r,clipLineToRect:Ea,clipLineToCircle:Sa,gjkShapeIntersects:Ro,gjkShapeIntersection:Cs,isConvex:io,triangulate:ri,NavMesh:jh,drawSprite:Lu,drawText:Ds,formatText:Gt,drawRect:Ne,drawLine:Ar,drawLines:fs,drawTriangle:Hi,drawCircle:or,drawEllipse:ds,drawUVQuad:Vt,drawPolygon:kt,drawCurve:Gi,drawBezier:Tu,drawFormattedText:Ht,drawMasked:Ou,drawSubtracted:Du,beginPicture:Eu,appendToPicture:Su,endPicture:Mu,drawPicture:Vi,pushTransform:He,popTransform:Ue,pushTranslate:Qe,pushScale:Zr,pushRotate:sr,pushMatrix:xu,usePostEffect:T,makeCanvas:S,drawCanvas:Iu,Picture:ji,debug:E,scene:yu,getSceneName:Au,go:wu,onSceneLeave:Fs,layers:gu,getLayers:fu,setLayers:Ui,getDefaultLayer:pu,addLevel:Nl,getData:M,setData:R,download:ss,downloadJSON:fo,downloadText:si,downloadBlob:Ms,plug:L,system:ua,ASCII_CHARS:ao,canvas:u.canvas,addKaboom:du,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:se.RED,GREEN:se.GREEN,BLUE:se.BLUE,YELLOW:se.YELLOW,MAGENTA:se.MAGENTA,CYAN:se.CYAN,WHITE:se.WHITE,BLACK:se.BLACK,quit:ht,KEvent:qe,KEventHandler:ns,KEventController:ir,KeepFlags:su,cancel:o(()=>lo,"cancel"),BlendMode:Po};d.k=le;let Ie=t.plugins;if(Ie&&Ie.forEach(L),t.global!==!1)for(let U in le)window[U]=le[U];return t.focus!==!1&&u.canvas.focus(),le},"kaplay"),mc=gc;const yc="G-6CCP4C6VS7";function wc(t,e){if(window.gtag){e&&e();return}const r=document.createElement("script");r.async=!0,r.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,r.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(r)}function Ac(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function xc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Uu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const vc=Uu()?640:1920,bc=Uu()?480:1080,a=mc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:vc,height:bc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Ec=[{id:1,title:"twoSum",language:"js",blocks:[`var twoSum = function(nums, target) { +`,dh=new Set(["id","require"]),fh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),gh=200,ph=640,mh=65536,go=Symbol.for("kaplay.cancel"),vn,yh=(vn=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(n){let r=this.lastID;return this.set(r,n),this.lastID++,r}pushd(n){let r=this.push(n);return()=>this.delete(r)}},o(vn,"Registry"),vn),_t,sn=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let n=new _t(()=>e.forEach(r=>r.cancel()));return Object.defineProperty(n,"paused",{get:o(()=>e[0].paused,"get"),set:o(r=>e.forEach(s=>s.paused=r),"set")}),n.paused=!1,n}static replace(e,n){return e.cancel=()=>n.cancel(),n.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>n.paused,"get"),set:o(r=>n.paused=r,"set")}),e}},o(_t,"KEventController"),_t),bn,Te=(bn=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new yh)}add(e){function n(...i){if(!s.paused)return e(...i)}o(n,"handler");let r=this.handlers.pushd(n),s=new sn(r);return this.cancellers.set(n,r),s}addOnce(e){let n=this.add((...r)=>{n.cancel(),e(...r)});return n}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(n=>{let r=n(...e),s;r===go&&(s=this.cancellers.get(n))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(bn,"KEvent"),bn),En,rs=(En=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,n){return this.handlers[e]||(this.handlers[e]=new Te),this.handlers[e].add(n)}onOnce(e,n){let r=this.on(e,(...s)=>{r.cancel(),n(...s)});return r}next(e){return new Promise(n=>{this.onOnce(e,(...r)=>n(r[0]))})}trigger(e,...n){this.handlers[e]&&this.handlers[e].trigger(...n)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var n;return((n=this.handlers[e])==null?void 0:n.numListeners())??0}},o(En,"KEventHandler"),En),wh=o(t=>t[0]instanceof se,"arrayIsColor"),xh=o(t=>t[0]instanceof q,"arrayIsVec2"),Ah=o(t=>typeof t[0]=="number","arrayIsNumber"),Sn,po=(Sn=class{constructor(e=(n,r)=>n0;){let n=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[n])&&this._items[e]>=this._items[n])break;this.swap(e,n),e=n}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),vh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function is(t,e){if(t===e)return!0;let n=typeof t,r=typeof e;if(n!==r)return!1;if(n==="object"&&r==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!is(c,h))return!1}return!0}return!1}o(is,"deepEq");var ta=new Set,bh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function Ao(t){ta.has(t)||(ta.add(t),console.warn(t))}o(Ao,"warn");function Ht(t,e){Ao(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Nr(t,e){return Number(t.toFixed(e))}o(Nr,"toFixed");function pe(t,e){return(...n)=>{let r=n.length;if(r===t.length)return t(...n);if(r===e.length)return e(...n)}}o(pe,"overload2");var Eh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function vo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],n=0,r=0;for(;n=e&&t<=n}o(Kt,"betweenInclusive");var _e=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ft=o((t,e)=>Array.isArray(e)?e.some(n=>t.has(n)):t.has(e),"setHasOrIncludes"),br=o((t,e,n)=>{var r;t.has(e)?(r=t.get(e))==null||r.push(n):t.set(e,[n])},"mapAddOrPush"),Sh=(()=>{let t=0;return()=>t++})(),Mh={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},kh=o(()=>Xt.lastInputDevice,"getLastInputDeviceType"),Ph=o(()=>{let t=Xt.buttons;for(let e in t){let n=t[e].keyboard&&[t[e].keyboard].flat(),r=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();n&&n.forEach(l=>{br(Xt.buttonsByKey,l,e)}),r&&r.forEach(l=>{br(Xt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{br(Xt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{br(Xt.buttonsByMouse,l,e)})}},"parseButtonBindings"),Mn,er=(Mn=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Mn,"ButtonState"),Mn),kn,Ch=(kn=class{constructor(){b(this,"buttonState",new er);b(this,"stickState",new Map)}},o(kn,"GamepadState"),kn),Pn,qh=(Pn=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((n,r)=>n+r)/this.dts.length)),this.dts=[])}},o(Pn,"FPSCounter"),Pn),Xt,na=Mh,Th=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new qh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new q(0),mouseDeltaPos:new q(0),keyState:new er,mouseState:new er,mergedGamepadState:new Ch,gamepadStates:new Map,lastInputDevice:null,buttonState:new er,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new rs}},"initAppState"),Ih=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Th(t);Xt=e,Ph();function n(){return e.dt*e.timeScale}o(n,"dt");function r(){return e.fixedDt*e.timeScale}o(r,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function g(A){e.canvas.style.cursor=A}o(g,"setCursor");function y(){return e.canvas.style.cursor}o(y,"getCursor");function m(A){if(A)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(m,"setCursorLocked");function E(){return!!document.pointerLockElement}o(E,"isCursorLocked");function p(A){A.requestFullscreen?A.requestFullscreen():A.webkitRequestFullscreen&&A.webkitRequestFullscreen()}o(p,"enterFullscreen");function T(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(T,"exitFullscreen");function f(A=!0){A?p(e.canvas):T()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let A=Object.entries(qe),B=Object.entries(gs),F=Object.entries(vr);for(let[j,Z]of A)e.canvas.removeEventListener(j,Z);for(let[j,Z]of B)document.removeEventListener(j,Z);for(let[j,Z]of F)window.removeEventListener(j,Z);$i.disconnect()}o(S,"quit");function C(A,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,j=0,Z=o(ge=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Z);return}let Be=ge/1e3,Ae=Math.min(Be-e.realTime,.25),vt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,j+=Ae,j>vt){if(!e.skipTime){for(F+=j,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(I,"isTouchscreen");function k(){return e.mousePos.clone()}o(k,"mousePos");function x(){return e.mouseDeltaPos.clone()}o(x,"mouseDeltaPos");function v(A="left"){return e.mouseState.pressed.has(A)}o(v,"isMousePressed");function M(A="left"){return e.mouseState.down.has(A)}o(M,"isMouseDown");function R(A="left"){return e.mouseState.released.has(A)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(A){return A===void 0?e.keyState.pressed.size>0:ft(e.keyState.pressed,A)}o(D,"isKeyPressed");function O(A){return A===void 0?e.keyState.pressedRepeat.size>0:ft(e.keyState.pressedRepeat,A)}o(O,"isKeyPressedRepeat");function z(A){return A===void 0?e.keyState.down.size>0:ft(e.keyState.down,A)}o(z,"isKeyDown");function te(A){return A===void 0?e.keyState.released.size>0:ft(e.keyState.released,A)}o(te,"isKeyReleased");function H(A){return A===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ft(e.mergedGamepadState.buttonState.pressed,A)}o(H,"isGamepadButtonPressed");function $(A){return A===void 0?e.mergedGamepadState.buttonState.down.size>0:ft(e.mergedGamepadState.buttonState.down,A)}o($,"isGamepadButtonDown");function Q(A){return A===void 0?e.mergedGamepadState.buttonState.released.size>0:ft(e.mergedGamepadState.buttonState.released,A)}o(Q,"isGamepadButtonReleased");function ne(A){return A===void 0?e.buttonState.pressed.size>0:ft(e.buttonState.pressed,A)}o(ne,"isButtonPressed");function Y(A){return A===void 0?e.buttonState.down.size>0:ft(e.buttonState.down,A)}o(Y,"isButtonDown");function ee(A){return A===void 0?e.buttonState.released.size>0:ft(e.buttonState.released,A)}o(ee,"isButtonReleased");function W(A){var B;return(B=e.buttons)==null?void 0:B[A]}o(W,"getButton");function De(A,B){e.buttons[A]={...e.buttons[A],...B}}o(De,"setButton");function He(A){e.buttonState.press(A),e.events.trigger("buttonPress",A)}o(He,"pressButton");function Ie(A){e.buttonState.release(A),e.events.trigger("buttonRelease",A)}o(Ie,"releaseButton");function Ne(A){return e.events.on("resize",A)}o(Ne,"onResize");let Je=pe(A=>e.events.on("keyDown",A),(A,B)=>e.events.on("keyDown",F=>_e(A,F)&&B(F))),K=pe(A=>e.events.on("keyPress",B=>A(B)),(A,B)=>e.events.on("keyPress",F=>_e(A,F)&&B(F))),oe=pe(A=>e.events.on("keyPressRepeat",A),(A,B)=>e.events.on("keyPressRepeat",F=>_e(A,F)&&B(F))),ce=pe(A=>e.events.on("keyRelease",A),(A,B)=>e.events.on("keyRelease",F=>_e(A,F)&&B(F))),Fe=pe(A=>e.events.on("mouseDown",B=>A(B)),(A,B)=>e.events.on("mouseDown",F=>_e(A,F)&&B(F))),Se=pe(A=>e.events.on("mousePress",B=>A(B)),(A,B)=>e.events.on("mousePress",F=>_e(A,F)&&B(F))),tt=pe(A=>e.events.on("mouseRelease",B=>A(B)),(A,B)=>e.events.on("mouseRelease",F=>F===A&&B(F)));function Qe(A){return e.events.on("mouseMove",()=>A(k(),x()))}o(Qe,"onMouseMove");function nt(A){return e.events.on("charInput",A)}o(nt,"onCharInput");function Ce(A){return e.events.on("touchStart",A)}o(Ce,"onTouchStart");function he(A){return e.events.on("touchMove",A)}o(he,"onTouchMove");function Ue(A){return e.events.on("touchEnd",A)}o(Ue,"onTouchEnd");function N(A){return e.events.on("scroll",A)}o(N,"onScroll");function V(A){return e.events.on("hide",A)}o(V,"onHide");function X(A){return e.events.on("show",A)}o(X,"onShow");let ie=pe(A=>e.events.on("gamepadButtonPress",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonPress",(F,j)=>_e(A,F)&&B(F,j))),Me=pe(A=>e.events.on("gamepadButtonDown",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonDown",(F,j)=>_e(A,F)&&B(F,j))),be=pe(A=>e.events.on("gamepadButtonRelease",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonRelease",(F,j)=>_e(A,F)&&B(F,j)));function rt(A,B){return e.events.on("gamepadStick",(F,j,Z)=>F===A&&B(j,Z))}o(rt,"onGamepadStick");function ln(A){return e.events.on("gamepadConnect",A)}o(ln,"onGamepadConnect");function un(A){return e.events.on("gamepadDisconnect",A)}o(un,"onGamepadDisconnect");function xr(A){return e.mergedGamepadState.stickState.get(A)||new q(0)}o(xr,"getGamepadStick");function U(){return[...e.charInputted]}o(U,"charInputted");function G(){return[...e.gamepads]}o(G,"getGamepads");let J=pe(A=>e.events.on("buttonPress",B=>A(B)),(A,B)=>e.events.on("buttonPress",F=>_e(A,F)&&B(F))),le=pe(A=>e.events.on("buttonDown",B=>A(B)),(A,B)=>e.events.on("buttonDown",F=>_e(A,F)&&B(F))),me=pe(A=>e.events.on("buttonRelease",B=>A(B)),(A,B)=>e.events.on("buttonRelease",F=>_e(A,F)&&B(F)));function Ze(){e.events.trigger("input"),e.keyState.down.forEach(A=>e.events.trigger("keyDown",A)),e.mouseState.down.forEach(A=>e.events.trigger("mouseDown",A)),e.buttonState.down.forEach(A=>{e.events.trigger("buttonDown",A)}),fe()}o(Ze,"processInput");function At(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((A,B)=>{e.mergedGamepadState.stickState.set(B,new q(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new q(0),e.gamepadStates.forEach(A=>{A.buttonState.update(),A.stickState.forEach((B,F)=>{A.stickState.set(F,new q(0))})})}o(At,"resetInput");function ct(A){let B={index:A.index,isPressed:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.stickState.get(F))||P()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(A.index,{buttonState:new er,stickState:new Map([["left",new q(0)],["right",new q(0)]])}),B}o(ct,"registerGamepad");function Ar(A){e.gamepads=e.gamepads.filter(B=>B.index!==A.index),e.gamepadStates.delete(A.index)}o(Ar,"removeGamepad");function fe(){var A,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&ct(F);for(let F of e.gamepads){let j=navigator.getGamepads()[F.index];if(!j)continue;let Z=(t.gamepads??{})[j.id]||na[j.id]||na.default,ge=e.gamepadStates.get(F.index);if(ge){for(let Be=0;Be{e.buttonState.press(bt),e.events.trigger("buttonPress",bt)})),e.mergedGamepadState.buttonState.press(Ae),ge.buttonState.press(Ae),e.events.trigger("gamepadButtonPress",Ae,F)}else ge.buttonState.down.has(Ae)&&(dt&&((B=e.buttonsByGamepad.get(Ae))==null||B.forEach(bt=>{e.buttonState.release(bt),e.events.trigger("buttonRelease",bt)})),e.mergedGamepadState.buttonState.release(Ae),ge.buttonState.release(Ae),e.events.trigger("gamepadButtonRelease",Ae,F))}for(let Be in Z.sticks){let Ae=Z.sticks[Be];if(!Ae)continue;let vt=new q(j.axes[Ae.x],j.axes[Ae.y]);ge.stickState.set(Be,vt),e.mergedGamepadState.stickState.set(Be,vt),e.events.trigger("gamepadStick",Be,vt,F)}}}}o(fe,"processGamepad");let qe={},gs={},vr={},Qi=t.pixelDensity||1;qe.mousemove=A=>{let B=new q(A.offsetX,A.offsetY),F=new q(A.movementX,A.movementY);if(w()){let j=e.canvas.width/Qi,Z=e.canvas.height/Qi,ge=window.innerWidth,Be=window.innerHeight,Ae=ge/Be,vt=j/Z;if(Ae>vt){let dt=Be/Z,bt=(ge-j*dt)/2;B.x=ot(A.offsetX-bt,0,j*dt,0,j),B.y=ot(A.offsetY,0,Z*dt,0,Z)}else{let dt=ge/j,bt=(Be-Z*dt)/2;B.x=ot(A.offsetX,0,j*dt,0,j),B.y=ot(A.offsetY-bt,0,Z*dt,0,Z)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Zi=["left","middle","right","back","forward"];qe.mousedown=A=>{e.events.onOnce("input",()=>{var F;let B=Zi[A.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.press(j),e.events.trigger("buttonPress",j)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},qe.mouseup=A=>{e.events.onOnce("input",()=>{var F;let B=Zi[A.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.release(j),e.events.trigger("buttonRelease",j)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Zu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),_i={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};qe.keydown=A=>{Zu.has(A.key)&&A.preventDefault(),e.events.onOnce("input",()=>{var j,Z;let B=_i[A.key]||A.key.toLowerCase(),F=A.code;if(B===void 0)throw new Error(`Unknown key: ${A.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),A.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},qe.keyup=A=>{e.events.onOnce("input",()=>{var j,Z;let B=_i[A.key]||A.key.toLowerCase(),F=A.code;e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},qe.touchstart=A=>{A.preventDefault(),e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.press(Z),e.events.trigger("buttonPress",Z)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Z=>{e.events.trigger("touchStart",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},qe.touchmove=A=>{A.preventDefault(),e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let j=e.mousePos;e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(j),e.events.trigger("mouseMove")}B.forEach(j=>{e.events.trigger("touchMove",new q(j.clientX-F.x,j.clientY-F.y),j)})})},qe.touchend=A=>{e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new q(0,0),e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.release(Z),e.events.trigger("buttonRelease",Z)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Z=>{e.events.trigger("touchEnd",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},qe.touchcancel=A=>{e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(j=>{e.events.trigger("touchEnd",new q(j.clientX-F.x,j.clientY-F.y),j)})})},qe.wheel=A=>{A.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new q(A.deltaX,A.deltaY))})},qe.contextmenu=A=>A.preventDefault(),gs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},vr.gamepadconnected=A=>{let B=ct(A.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},vr.gamepaddisconnected=A=>{let B=G().filter(F=>F.index===A.gamepad.index)[0];Ar(A.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[A,B]of Object.entries(qe))e.canvas.addEventListener(A,B);for(let[A,B]of Object.entries(gs))document.addEventListener(A,B);for(let[A,B]of Object.entries(vr))window.addEventListener(A,B);let $i=new ResizeObserver(A=>{for(let B of A)if(B.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return $i.observe(e.canvas),{state:e,dt:n,fixedDt:r,restDt:s,time:l,run:C,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:g,screenshot:u,getGamepads:G,getCursor:y,setCursorLocked:m,isCursorLocked:E,isTouchscreen:I,mousePos:k,mouseDeltaPos:x,isKeyDown:z,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:te,isMouseDown:M,isMousePressed:v,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:H,isGamepadButtonDown:$,isGamepadButtonReleased:Q,getGamepadStick:xr,isButtonPressed:ne,isButtonDown:Y,isButtonReleased:ee,setButton:De,getButton:W,pressButton:He,releaseButton:Ie,charInputted:U,onResize:Ne,onKeyDown:Je,onKeyPress:K,onKeyPressRepeat:oe,onKeyRelease:ce,onMouseDown:Fe,onMousePress:Se,onMouseRelease:tt,onMouseMove:Qe,onCharInput:nt,onTouchStart:Ce,onTouchMove:he,onTouchEnd:Ue,onScroll:N,onHide:V,onShow:X,onGamepadButtonDown:Me,onGamepadButtonPress:ie,onGamepadButtonRelease:be,onGamepadStick:rt,onGamepadConnect:ln,onGamepadDisconnect:un,onButtonPress:J,onButtonDown:le,onButtonRelease:me,getLastInputDeviceType:kh,events:e.events}},"initApp"),Io=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Io||{}),Bh=new q(-1,-1),Rh=new q(0,-1),Fh=new q(1,-1),Oh=new q(-1,0),Lh=new q(0,0),Dh=new q(1,0),Nh=new q(-1,1),Uh=new q(0,1),jh=new q(1,1);function an(t){switch(t){case"topleft":return Bh;case"top":return Rh;case"topright":return Fh;case"left":return Oh;case"center":return Lh;case"right":return Dh;case"botleft":return Nh;case"bot":return Uh;case"botright":return jh;default:return t}}o(an,"anchorPt");function Bo(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Bo,"alignPt");var Er=2.5949095,ra=1.70158+1,sa=2*Math.PI/3,ia=2*Math.PI/4.5,Br={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ra*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ra*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Er+1)*2*t-Er)/2:(Math.pow(2*t-2,2)*((Er+1)*(t*2-2)+Er)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*sa),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*sa)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ia))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ia)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Br.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Br.easeOutBounce(1-2*t))/2:(1+Br.easeOutBounce(2*t-1))/2,"easeInOutBounce")},ar=Br,Cn,zh=(Cn=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e,this.radius=n}support(e){let n=new q(e.x,e.y);return q.unit(n,n),q.scale(n,this.radius,n),q.add(n,this.center,n),n}},o(Cn,"CircleCollider"),Cn),qn,Vh=(qn=class{constructor(e,n,r,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=n,this.radiusY=r,this.angle=s}support(e){if(this.angle===0){let n=new q(e.x,e.y);return q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.add(n,this.center,n),n}else{let n=new q(e.x,e.y);return q.rotateByAngle(n,-this.angle,n),q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.rotateByAngle(n,this.angle,n),q.add(n,this.center,n),n}}},o(qn,"EllipseCollider"),qn),Tn,ps=(Tn=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let n,r=Number.NEGATIVE_INFINITY,s;for(let i=0;ir&&(r=l,n=s)}return n}},o(Tn,"PolygonCollider"),Tn);function li(t,e,n){let r=new q(-n.x,-n.y),s=t.support(n),i=e.support(r);return new q(s.x-i.x,s.y-i.y)}o(li,"calculateSupport");function Ro(t,e,n,r){var s=li(e,n,r);return t.push(s),r.dot(s)>=0}o(Ro,"addSupport");function Rr(t,e,n){let r=t.x*e.y-t.y*e.x;return new q(-r*n.y,r*n.x)}o(Rr,"tripleProduct");function ui(t,e,n,r){switch(t.length){case 0:{r.x=n.center.x-e.center.x,r.y=n.center.y-e.center.y;break}case 1:{r.x=r.x*=-1,r.y=r.y*=-1;break}case 2:{let l=new q(t[1].x-t[0].x,t[1].y-t[0].y),c=new q(-t[0].x,-t[0].y),h=Rr(l,c,l);r.x=h.x,r.y=h.y;break}case 3:{let l=new q(-t[2].x,-t[2].y),c=new q(t[1].x-t[2].x,t[1].y-t[2].y),h=new q(t[0].x-t[2].x,t[0].y-t[2].y);var s=Rr(h,c,c),i=Rr(c,h,h);if(s.dot(l)>0)t.splice(0,1),r.x=s.x,r.y=s.y;else if(i.dot(l)>0)t.splice(1,1),r.x=i.x,r.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return Ro(t,e,n,r)?2:0}o(ui,"evolveSimplex");function Fo(t,e){let n=[],r=new q;for(var s=2;s===2;)s=ui(n,t,e,r);return s===1}o(Fo,"gjkIntersects");function Oo(t,e){let n=Number.POSITIVE_INFINITY,r=new q,s=0,i=new q,l=new q;for(let h=0;h=t.length&&(u=0),q.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}q.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new q;for(let m=0;mc.coste.y!=r.a.y>e.y&&e.x<(r.a.x-r.b.x)*(e.y-r.b.y)/(r.a.y-r.b.y)+r.b.x&&(n=!n);return n}},o(Bn,"NavPolygon"),Bn),Rn,Wh=(Rn=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let n=this._pointCache[`${e.x}_${e.y}`];return n||(n=e.clone(),this._pointCache[`${e.x}_${e.y}`]=n,n)}_addEdge(e){let n=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[n]=e,e}_findEdge(e,n){let r=`${e.x}_${e.y}-${n.x}_${n.y}`;return this._edgeCache[r]}_findCommonEdge(e,n){for(let r of e.edges){let s=this._findEdge(r.b,r.a);if(s&&s.polygon.deref().id===n.id)return s}return null}addPolygon(e){let n=new Kh(this._polygons.length),r=e.map((s,i)=>new Hh(s,e[(i+1)%e.length],n));n.edges=r,this._polygons.push(n);for(let s of n.edges)this._addEdge(s);return n}addRect(e,n){let r=this._addPoint(e),s=this._addPoint(e.add(n.x,0)),i=this._addPoint(e.add(n)),l=this._addPoint(e.add(0,n.y));return this.addPolygon([r,s,i,l])}_getLocation(e){for(let n of this._polygons)if(n.contains(e))return n;return null}getNeighbours(e){let n=[];for(let r of this._polygons[e].edges){let s=this._findEdge(r.b,r.a);if(s){let i=s.polygon.deref();i&&n.push(i.id)}}return n}getCost(e,n){return 1}getHeuristic(e,n){let r=this._polygons[e],s=this._polygons[n],i=r.centroid.x-s.centroid.x,l=r.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,n){return e===void 0||n===void 0?[]:e===n?[e,n]:jo(this,e,n)}getWaypointPath(e,n,r){let s=(r==null?void 0:r.type)||"centroids",i=this._getLocation(e),l=this._getLocation(n);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),n]}},o(Rn,"NavMesh"),Rn);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function mn(t,e,n,r,s,i=1){r=ye(r%360),s=ye(s%360),s<=r&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-r)/ye(8)*i),h=(s-r)/c,u=P(Math.cos(r),Math.sin(r)),g=P(Math.cos(h),Math.sin(h));for(let y=0;y<=c;y++)l.push(t.add(e*u.x,n*u.y)),u=P(u.x*g.x-u.y*g.y,u.x*g.y+u.y*g.x);return l}o(mn,"getArcPts");var Fn,aa=(Fn=class{constructor(e,n){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=n}},o(Fn,"Edge"),Fn),On,Yh=(On=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let n=new aa(e,!0),r=new aa(e,!1);this.edges.push(n),this.edges.push(r),this.objects.set(e,[n,r])}remove(e){let n=this.objects.get(e);n&&(this.edges.splice(this.edges.indexOf(n[0]),1),this.edges.splice(this.edges.indexOf(n[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,n]of this.objects.entries()){Jt(e,e.transform);let r=e.worldArea().bbox();n[0].x=r.pos.x,n[1].x=r.pos.x+r.width}for(let e=1;e=0&&!(this.edges[n].x=t&&(this.opacity=e,r=!0))}}}o(Yo,"fadeIn");function Xo(t="intersect"){return{id:"mask",mask:t}}o(Xo,"mask");function ci(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,n=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,r=>this.opacity=r,n)},fadeOut(e=1,n=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,r=>this.opacity=r,n)},inspect(){return`opacity: ${Nr(this.opacity,1)}`}}}o(ci,"opacity");function Jo(t=1,e=ue(0,0,0),n=1,r="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:n,join:r,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Jo,"outline");var Ln,Xh=(Ln=class{constructor(){b(this,"pos",P(0));b(this,"vel",P(0));b(this,"acc",P(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Ln,"Particle"),Ln);function Qo(t,e){let n=e.lifetime,r=new Array(t.max),s=t.colors||[se.WHITE],i=t.opacities||[1],l=t.quads||[new xe(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,g=t.speed||[0,0],y=t.angle||[0,0],m=t.angularVelocity||[0,0],E=t.acceleration||[P(0),P(0)],p=t.damping||[0,0],T=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let k=0;k=v.lt){v.gc=!0,w--;continue}v.vel=v.vel.add(v.acc.scale(k)).scale(1-v.damping*k),v.pos=v.pos.add(v.vel.scale(k)),v.angle+=v.angularVelocity*k}}for(n!==void 0&&(n-=k,n<=0&&C.trigger()),S+=k;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(n!==void 0&&n<=0||w==0)){for(let k=0;k`[${n.x},${n.y}]`).join(",")}`}}}o(_o,"polygon");function di(t,e,n){let r;return d.game.root.get("area").forEach(s=>{if(n&&n.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(r?i.fractionthis.canvas.width||r>this.canvas.height)&&this.add_single(e),this.x+n>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+r>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Ct.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new q(this.x+this.padding,this.y+this.padding);return this.x+=n,r>this.curHeight&&(this.curHeight=r),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new q(e.width,e.height),texture:s}),this.lastTextureId++,[s,new xe(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let n=this.texturesPosition.get(e);if(!n)throw new Error("Texture with packer id not found");this.c2d.clearRect(n.position.x,n.position.y,n.size.x,n.size.y),n.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=n.size.x}},o(Dn,"TexPacker"),Dn);function et(t){return typeof t!="string"||xo(t)?t:d.assets.urlPrefix+t}o(et,"fixURL");var $t,ut=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new Te);b(this,"onErrorEvents",new Te);b(this,"onFinishEvents",new Te);e.then(n=>{this.loaded=!0,this.data=n,this.onLoadEvents.trigger(n)}).catch(n=>{if(this.error=n,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(n);else throw n}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let n=new $t(Promise.resolve(e));return n.data=e,n.loaded=!0,n}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},o($t,"Asset"),$t),Nn,hn=(Nn=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,n){let r=e??this.lastUID+++"",s=new ut(n);return this.assets.set(r,s),s}addLoaded(e,n){let r=e??this.lastUID+++"",s=ut.loaded(n);return this.assets.set(r,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(n=>{n.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Nn,"AssetBucket"),Nn);function os(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(os,"fetchURL");function pr(t){return os(t).then(e=>e.json())}o(pr,"fetchJSON");function el(t){return os(t).then(e=>e.text())}o(el,"fetchText");function tl(t){return os(t).then(e=>e.arrayBuffer())}o(tl,"fetchArrayBuffer");function nl(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(nl,"loadRoot");function rl(t,e){return d.assets.custom.add(t,pr(et(e)))}o(rl,"loadJSON");function mr(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((n,r)=>{e.onload=()=>n(e),e.onerror=()=>r(new Error(`Failed to load image from "${t}"`))})}o(mr,"loadImg");function jt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,n)=>e+n.progress(),0)/t.length}o(jt,"loadProgress");function gi(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(gi,"getFailedAssets");function sl(t){return d.assets.custom.get(t)??null}o(sl,"getAsset");function Ur(t){return d.assets.custom.add(null,t)}o(Ur,"load");var Qh=o((t,e)=>({urlPrefix:"",sprites:new hn,fonts:new hn,bitmapFonts:new hn,sounds:new hn,shaders:new hn,custom:new hn,music:{},packer:new Jh(t,2048,2048,e),loaded:!1}),"initAssets");function il(t,e,n){e=et(e),n=et(n),typeof e=="string"&&!n&&(n=vh(e)+".json");let r=typeof n=="string"?pr(n):Promise.resolve(n);return d.assets.sprites.add(t,r.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new xe(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return nn.from(e,{frames:l,anims:c})}))}o(il,"loadAseprite");var Zh="data:image/png;base64,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",Un,Fr=(Un=class{constructor(e,n={}){b(this,"fontface");b(this,"filter",Ms);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=n.filter??Ms,this.size=n.size??64,this.size>256)throw new Error("Max font size: 256");n.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof n.outline=="number"?this.outline.width=n.outline:typeof n.outline=="object"&&(n.outline.width&&(this.outline.width=n.outline.width),n.outline.color&&(this.outline.color=n.outline.color)))}},o(Un,"FontData"),Un);function pi(t){if(!t)return pi(d.globalOpt.font??ah);if(typeof t=="string"){let e=yi(t),n=mi(t);if(e)return e.data??e;if(n)return n.data??n;if(document.fonts.check(`64px ${t}`))return t;if(jt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof ut)return t.data?t.data:t;return t}o(pi,"resolveFont");function mi(t){return d.assets.fonts.get(t)??null}o(mi,"getFont");function al(t,e,n={}){let r=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(r),d.assets.fonts.add(t,r.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new Fr(s,n)))}o(al,"loadFont");function ol(t,e,n,r){let s=t.width/e,i={},l=r.split("").entries();for(let[c,h]of l)i[h]=new xe(c%s*e,Math.floor(c/s)*n,e,n);return{tex:t,map:i,size:n}}o(ol,"makeFont");function yi(t){return d.assets.bitmapFonts.get(t)??null}o(yi,"getBitmapFont");function wi(t,e,n,r,s={}){let i=et(e);return d.assets.bitmapFonts.add(t,mr(i).then(l=>ol(Ct.fromImage(d.gfx.ggl,l,s),n,r,s.chars??co)))}o(wi,"loadBitmapFont");var _h=o((t="happy",e)=>wi(t,Zh,28,36,e),"loadHappy");function ll(t,e){return e=et(e),d.assets.sprites.add(t,new Promise(async n=>{let r=typeof e=="string"?await pr(e):e,s=await Promise.all(r.frames.map(mr)),i=document.createElement("canvas");i.width=r.width,i.height=r.height*r.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*r.height)});let c=await xn(null,i,{sliceY:r.frames.length,anims:r.anims});n(c)}))}o(ll,"loadPedit");var jn,$h=(jn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,n),i.shaderSource(c,r),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,g)=>i.bindAttribLocation(h,g,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let g=i.getShaderInfoLog(c);if(g)throw new Error("FRAGMENT SHADER "+g)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let n=this.ctx.gl;for(let r in e){let s=e[r],i=n.getUniformLocation(this.glProgram,r);if(typeof s=="number")n.uniform1f(i,s);else if(s instanceof Xr)n.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tn)n.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof se)n.uniform3f(i,s.r,s.g,s.b);else if(s instanceof q)n.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],Ah(s)?n.uniform1fv(i,s):xh(s)?n.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):wh(s)&&n.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(jn,"Shader"),jn);function ls(t,e=ks,n=Ps){let r=hh.replace("{{user}}",e??ks),s=ch.replace("{{user}}",n??Ps);try{return new $h(t,r,s,ai.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=bh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),g=c.groups.type.toLowerCase();throw new Error(`${g} shader line ${h}: ${u}`)}}o(ls,"makeShader");function ul(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=xi(t);if(e)return e.data??e;if(jt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof ut)return t.data?t.data:t;return t}o(ul,"resolveShader");function xi(t){return d.assets.shaders.get(t)??null}o(xi,"getShader");function hl(t,e,n){return d.assets.shaders.addLoaded(t,ls(d.gfx.ggl,e,n))}o(hl,"loadShader");function cl(t,e,n){e=et(e),n=et(n);let r=o(i=>i?el(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([r(e),r(n)]).then(([i,l])=>ls(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(cl,"loadShaderURL");var yt,wn=(yt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new yt(e)}static fromArrayBuffer(e){return new Promise((n,r)=>d.audio.ctx.decodeAudioData(e,n,r)).then(n=>new yt(n))}static fromURL(e){return xo(e)?yt.fromArrayBuffer(yo(e)):tl(e).then(n=>yt.fromArrayBuffer(n))}},o(yt,"SoundData"),yt);function dl(t){if(typeof t=="string"){let e=Ai(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof wn)return ut.loaded(t);if(t instanceof ut)return t;throw new Error(`Invalid sound: ${t}`)}}o(dl,"resolveSound");function Ai(t){return d.assets.sounds.get(t)??null}o(Ai,"getSound");function fl(t,e){let n=et(e),r;return typeof n=="string"?r=wn.fromURL(n):n instanceof ArrayBuffer?r=wn.fromArrayBuffer(n):r=Promise.resolve(wn.fromAudioBuffer(n)),d.assets.sounds.add(t,r)}o(fl,"loadSound");function gl(t,e){let n=et(e),r=new Audio(n);return r.preload="auto",d.assets.music[t]=n}o(gl,"loadMusic");function vi(t,e){return t=et(t),Ur(typeof e=="string"?new Promise((n,r)=>{pr(e).then(s=>{vi(t,s).then(n).catch(r)})}):nn.from(t).then(n=>{let r={};for(let s in e){let i=e[s],l=n.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(y=>new xe(l.x+(i.x+y.x)/c*l.w,l.y+(i.y+y.y)/h*l.h,y.w/c*l.w,y.h/h*l.h)):Ei(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),g=new nn(n.tex,u,i.anims);d.assets.sprites.addLoaded(s,g),r[s]=g}return r}))}o(vi,"loadSpriteAtlas");var ec="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",wt,nn=(wt=class{constructor(e,n,r={},s=null,i=null){b(this,"tex");b(this,"frames",[new xe(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,n&&(this.frames=n),this.anims=r,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,n={}){return typeof e=="string"?wt.fromURL(e,n):Promise.resolve(wt.fromImage(e,n))}static fromImage(e,n={}){let[r,s,i]=n.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=n.frames?n.frames.map(c=>new xe(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):Ei(n.sliceX||1,n.sliceY||1,s.x,s.y,s.w,s.h);return new wt(r,l,n.anims,n.slice9,i)}static fromURL(e,n={}){return mr(e).then(r=>wt.fromImage(r,n))}},o(wt,"SpriteData"),wt);function tr(t){if(typeof t=="string"){let e=bi(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof ut)return t;throw new Error(`Invalid sprite: ${t}`)}}o(tr,"resolveSprite");function bi(t){return d.assets.sprites.get(t)??null}o(bi,"getSprite");function xn(t,e,n={sliceX:1,sliceY:1,anims:{}}){return e=et(e),Array.isArray(e)?e.some(r=>typeof r=="string")?d.assets.sprites.add(t,Promise.all(e.map(r=>typeof r=="string"?mr(r):Promise.resolve(r))).then(r=>Is(r,n))):d.assets.sprites.addLoaded(t,Is(e,n)):typeof e=="string"?d.assets.sprites.add(t,nn.from(e,n)):d.assets.sprites.addLoaded(t,nn.fromImage(e,n))}o(xn,"loadSprite");function Ei(t=1,e=1,n=0,r=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*r,0):i.drawImage(c,h*r,0)});let l=i.getImageData(0,0,t.length*r,s);return nn.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Is,"createSpriteSheet");function pl(t="bean"){return xn(t,ec)}o(pl,"loadBean");function jr(t,e={}){let n=null,r=null,s=null,i=new Te;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,g,y,m)=>{let E=P(1,1);return y&&m?(E.x=y/(u.width*g.w),E.y=m/(u.height*g.h)):y?(E.x=y/(u.width*g.w),E.y=E.x):m&&(E.y=m/(u.height*g.h),E.x=E.y),E},"calcTexScale"),c=o((u,g)=>{if(!g)return;let y=g.frames[0].clone();e.quad&&(y=y.scale(e.quad));let m=l(g.tex,y,e.width,e.height);if(u.width=g.tex.width*y.w*m.x,u.height=g.tex.height*y.h*m.y,g.anims)for(let E in g.anims){let p=g.anims[E];typeof p!="number"&&(p.frames=h(p))}n=g,i.trigger(n),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let g=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let y=Math.abs(u.to-u.from)+1;for(let m=0;m0;m--)g.push(g[m]);return g},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new xe(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let g=tr(u);g&&g.onLoad(y=>c(this,y))},get animFrame(){if(!n||!r||s===null)return this.frame;let u=n.anims[r.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?r.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!n)return;let u=n.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(n.slice9){let{left:g,right:y,top:m,bottom:E}=n.slice9,p=n.tex.width*u.w,T=n.tex.height*u.h,f=this.width-g-y,w=this.height-m-E,S=g/p,C=y/p,I=1-S-C,k=m/T,x=E/T,v=1-k-x,M=[ve(0,0,S,k),ve(S,0,I,k),ve(S+I,0,C,k),ve(0,k,S,v),ve(S,k,I,v),ve(S+I,k,C,v),ve(0,k+v,S,x),ve(S,k+v,I,x),ve(S+I,k+v,C,x),ve(0,0,g,m),ve(g,0,f,m),ve(g+f,0,y,m),ve(0,m,g,w),ve(g,m,f,w),ve(g+f,m,y,w),ve(0,m+w,g,E),ve(g,m+w,f,E),ve(g+f,m+w,y,E)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cr(Object.assign(xt(this),{pos:D.pos(),tex:n.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cr(Object.assign(xt(this),{tex:n.tex,quad:u.scale(this.quad??new xe(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=tr(t);u?u.onLoad(g=>c(this,g)):us(()=>c(this,tr(t).data))},update(){if(!n||!r||s===null)return;let u=n.anims[r.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(r.timer+=d.k.dt()*this.animSpeed,r.timer>=1/r.speed){r.timer=0,r.frameIndex+=s;let g=u.frames;if(r.frameIndex>=g.length)if(r.pingpong&&!u.pingpong)s=-1,r.frameIndex=g.length-2;else if(r.loop)r.frameIndex=0;else{this.frame=g.at(-1),r.onEnd(),this.stop();return}else if(r.frameIndex<0)if(r.pingpong&&r.loop)s=1,r.frameIndex=1;else if(r.loop)r.frameIndex=g.length-1;else{this.frame=g[0],r.onEnd(),this.stop();return}this.frame=g[r.frameIndex]}},play(u,g={}){if(!n){i.add(()=>this.play(u,g));return}let y=n.anims[u];if(y===void 0)throw new Error(`Anim not found: ${u}`);r&&this.stop(),r=typeof y=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:g.loop??y.loop??!1,pingpong:g.pingpong??y.pingpong??!1,speed:g.speed??y.speed??10,frameIndex:0,onEnd:g.onEnd??(()=>{})},s=typeof y=="number"?null:1,this.frame=typeof y=="number"?y:y.frames[0],this.trigger("animStart",u)},stop(){if(!r)return;let u=r.name;r=null,this.trigger("animEnd",u)},numFrames(){return(n==null?void 0:n.frames.length)??0},getCurAnim(){return r},curAnim(){return r==null?void 0:r.name},getAnim(u){return(n==null?void 0:n.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new we(P(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(jr,"sprite");function ml(t,e={}){function n(s){var l,c;let i=Vt(Object.assign(xt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(n,"update");let r={id:"text",set text(s){t=s,n(this),this.renderedText=Kr(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Kr(t).text:"",add(){us(()=>n(this))},draw(){Gt(n(this))},renderArea(){return new we(P(0),this.width,this.height)}};return n(r),r}o(ml,"text");function yl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(xt(this),{width:this.width,height:this.height}))},renderArea(){return new we(P(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(yl,"uvquad");function wl(t,e){let n=document.createElement("video"),r=!1,s=!1,i=!1,l=new Ct(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return n.currentTime},set currentTime(c){n.currentTime=c},get duration(){return n.duration},play(){n.play()},pause(){n.pause()},get mute(){return n.muted},set mute(c){n.muted=c},add(){n.playsInline=!0,n.loop=!0,n.autoplay=!1,n.crossOrigin="anonymous",n.addEventListener("playing",()=>{r=!0,c()},!0),n.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{n.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),n.src=t);function c(){console.log(`${r} ${s}`),r&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,n),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ve({width:this.width,height:this.height})},renderArea(){return new we(P(0),this.width,this.height)}}}o(wl,"video");function xl(t={}){let e=null,n=null,r=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return n&&r?n[r]:null},getPath(){return n?n.slice():null},getTarget(){return e},isNavigationFinished(){return n?r===null:!0},isTargetReachable(){return n!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r=n?0:null,n&&r!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&n&&r!==null&&(n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n?(r=0,this.trigger("navigationNext",this,n[r])):(r=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,n[r])):this.trigger("navigationEnded",this)},update(){if(e&&n&&r!==null){if(this.pos.sdist(n[r])<2)if(r===n.length-1){this.pos=e.clone(),r=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else r++,this.trigger("navigationNext",this,n[r]);this.moveTo(n[r],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(n)})}}}o(xl,"agent");function Al(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(n){var r;return(r=this.graph)==null?void 0:r.getWaypointPath(this.pos,n,t.navigationOpt)},get graph(){if(e)return e;let n=this.parent;for(;n;){if(n.has("pathfinderMap"))return n.graph;n=n.parent}},set graph(n){e=n}}}o(Al,"pathfinder");function vl(t={}){let e=t.waypoints,n=t.speed||100,r=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return n},set patrolSpeed(l){n=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,n),this.pos.sdist(l)<9))switch(r){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(vl,"patrol");function bl(t,e={}){let n=typeof t=="function"?t:()=>d.game.root.query(t),r=e.checkFrequency||1,s=typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?q.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?q.fromAngle(c):c)||s,g=h||e.fieldOfView;if(!u||!g||g>=360)return!0;let y=g/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=y},hasLineOfSight(l){let c=di(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>r){i-=r;let l=n();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(bl,"sentry");function Si(t={}){let e=P(0),n=t.isObstacle??!1,r=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??P(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=P(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return n},set cost(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get cost(){return r},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(P(-1,0))},moveRight(){this.tileMove(P(1,0))},moveUp(){this.tileMove(P(0,-1))},moveDown(){this.tileMove(P(0,1))}}}o(Si,"tile");var zn,Mi=(zn=class{constructor(e,n,r){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=n.duration,this.loops=n.loops||0,this.direction=n.direction||"forward",this.easing=n.easing||ar.linear,this.interpolation=n.interpolation||"linear",this.isFinished=!1,this.timing=n.timing,this.easings=n.easings,this.relative=r}update(e,n){return!0}getLowerKeyIndexAndRelativeTime(e,n,r){let s=n-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),r){let c=0;for(;r[c+1]!==void 0&&r[c+1]=s?[s,0,!0]:[c,(i-r[c])/(r[c+1]-r[c]),!1]}else{let c=Math.floor((n-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,n,r){if(this.relative)switch(n){case"pos":e.pos=e.base.pos.add(r);break;case"angle":e.angle=e.base.angle+r;break;case"scale":e.scale=e.base.scale.scale(r);break;case"opacity":e.opacity=e.base.opacity*r;break;default:e[n]=r}else e[n]=r}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=ar.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(n=>this.easing.name)),e}},o(zn,"AnimateChannel"),zn);function Bs(t,e){return e.add(e.sub(t))}o(Bs,"reflect");var Vn,tc=(Vn=class extends Mi{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Vn,"AnimateChannelNumber"),Vn),Gn,nc=(Gn=class extends Mi{constructor(n,r,s,i,l){var c;super(n,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=r,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:Bs(y,u),E=g[n.x,n.y])})}},o(Gn,"AnimateChannelVec2"),Gn),Hn,rc=(Hn=class extends Mi{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Hn,"AnimateChannelColor"),Hn);function El(t={}){let e=[],n=0,r=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:P(0,0),angle:0,scale:P(1,1),opacity:1},animation:{paused:!1,seek(s){n=lt(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),r=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;n+=d.k.dt();for(let l of e)i=l.update(this,n),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!r&&(r=!0,this.trigger("animateFinished"))},animate(s,i,l){r=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new tc(s,i,l,t.relative||!1)):i[0]instanceof q?e.push(new nc(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof se&&e.push(new rc(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(El,"animate");function ki(t,e){let n={name:t.name};return t.has("animate")&&(n.channels=t.serializeAnimationChannels(),Object.assign(n,t.serializeAnimationOptions())),t.children.length>0&&(n.children=t.children.filter(r=>r.has("named")).map(r=>ki(r,r.name))),n}o(ki,"serializeAnimation");function Rs(t=2,e=1){let n=0;return{require:["scale"],update(){let r=Math.sin(n*t)*e;r<0&&this.destroy(),this.scale=P(r),n+=d.k.dt()}}}o(Rs,"boom");var sc=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=cs())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(n){this.on("press",n)},onRelease(n){this.on("release",n)}}},"fakeMouse");function Sl(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(n=1){this.setHP(t-n),this.trigger("hurt",n)},heal(n=1){let r=t;this.setHP(t+n),this.trigger("heal",t-r)},hp(){return t},maxHP(){return e??null},setMaxHP(n){e=n},setHP(n){t=e?Math.min(e,n):n,t<=0&&this.trigger("death")},onHurt(n){return this.on("hurt",n)},onHeal(n){return this.on("heal",n)},onDeath(n){return this.on("death",n)},inspect(){return`health: ${t}`}}}o(Sl,"health");function Ml(t,e={}){if(t==null)throw new Error("lifespan() requires time");let n=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,n>0?d.game.root.tween(this.opacity,0,n,r=>this.opacity=r,ar.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(Ml,"lifespan");function kl(t){return{id:"named",name:t}}o(kl,"named");function Pl(t,e,n){if(!t)throw new Error("state() requires an initial state");let r={};function s(h){r[h]||(r[h]={enter:new Te,end:new Te,update:new Te,draw:new Te})}o(s,"initStateEvents");function i(h,u,g){return s(u),r[u][h].add(g)}o(i,"on");function l(h,u,...g){s(u),r[u][h].trigger(...g)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let g=this.state;if(n){if(!(n!=null&&n[g]))return;let y=typeof n[g]=="string"?[n[g]]:n[g];if(!y.includes(h))throw new Error(`Cannot transition state from "${g}" to "${h}". Available transitions: ${y.map(m=>`"${m}"`).join(", ")}`)}l("end",g,...u),this.state=h,l("enter",h,...u),l("enter",`${g} -> ${h}`,...u)},onStateTransition(h,u,g){return i("enter",`${h} -> ${u}`,g)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(Pl,"state");function Pi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(Pi,"stay");function Cl(t=!0,e){let n,r;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");n=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){n.cancel(),r.cancel()}}}o(Cl,"textInput");function zr(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,n,r=-1,s=!1){let i=s?0:e,l=new Te,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,n,r,s,i=ar.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/r,1);s(Oe(e,n,i(u))),u===1&&(h.cancel(),s(n),c.forEach(g=>g()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(n),c.forEach(u=>u())}}}}}o(zr,"timer");var Fs=0;function Os(){return Fs>0}o(Os,"usesArea");var Et=null,oa=!1;function ql(t={}){let e={},n=new Set,r=[];return!Et&&!oa&&(Et=d.k.get("fakeMouse")[0],oa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Fs++,this.area.cursor&&r.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),r.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,n.add(s.id))}))},destroy(){Fs--;for(let s of r)s.cancel()},fixedUpdate(){for(let s in e)n.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);n.clear()},drawInspect(){let s=this.localArea();We(),st(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Gi(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:kt(this)};s instanceof we?Ve({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?qt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&on({...i,pos:s.center,radius:s.radius}),ze()},area:{shape:t.shape??null,scale:t.scale?P(t.scale):P(1),offset:t.offset??P(0),cursor:t.cursor??null},isClicked(){return Et?Et.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(Et){let i=kt(this)?Et.pos:d.k.toWorld(Et.pos);return this.hasPoint(i)}let s=kt(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){Et&&Et.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return r.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(P(this.area.scale??1));if(s instanceof we){let l=an(this.anchor||ns).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return kt(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,g;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(g=this.area.scale.y)==null?void 0:g.toFixed(1)}y)`}}}o(ql,"area");function Tl(t={}){let e=null,n=null,r=!1,s=P(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:P(0),damping:t.damping??0,jumpForce:t.jumpForce??ph,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let g=u.reverse();if(h.trigger("beforePhysicsResolve",g),!(u.resolved||g.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let y=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/y)),h.pos=h.pos.add(u.displacement.scale(-this.mass/y)),Jt(this,this.transform),Jt(h,h.transform)}else{let y=!this.isStatic&&h.isStatic?u:u.reverse();y.source.pos=y.source.pos.add(y.displacement),Jt(y.source,y.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let E=e;e=h.target,E!=e&&(n=h.target.pos),r?r=!1:E||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),g=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),y=this.vel.project(h.normal),m=this.vel.sub(y);this.vel.dot(h.normal)<0&&(this.vel=m.sub(y.scale(u))),g!=0&&(this.vel=this.vel.sub(m.scale(g)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(n&&!e.pos.eq(n)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(n)),n=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){r&&(e=null,n=null,this.trigger("fallOff"),r=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(r=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??mh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(nr())>0},isJumping(){return this.vel.dot(nr())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,n=null,this.vel=nr().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Tl,"body");function Il(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(n){e<=0||(e{var l;if(!e.has("body"))return;let r=n==null?void 0:n.normal.normal(),s=e.vel.project(r),i=(l=r==null?void 0:r.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Bl,"surfaceEffector");function Rl(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(Rl,"areaEffector");function Fl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=this.pos.sub(e.pos),s=r.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=r.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(Fl,"pointEffector");function Ol(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Ol,"constantForce");function Ll(t={}){return t.ignoreSides??(t.ignoreSides=[q.UP]),t.shouldCollide??(t.shouldCollide=(e,n)=>{var r;return((r=t.ignoreSides)==null?void 0:r.findIndex(s=>s.sdist(n){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Ll,"platformEffector");function Dl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=e,s=r.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(P(-100,this.surfaceLevel),P(100,this.surfaceLevel));l&&(this.applyBuoyancy(r,l),this.applyDrag(r,l)),this.flowMagnitude&&r.addForce(q.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,n){let r=this.density*n.area(),s=P(0,1).scale(-r);e.addForce(s)},applyDrag(e,n){let r=e.vel,s=this.density*this.linearDrag,i=r.scale(-s);e.addForce(i)}}}o(Dl,"buoyancyEffector");function Vr(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(Vr,"anchor");function Ci(){return{id:"fixed",fixed:!0}}o(Ci,"fixed");function Nl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??P(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}o(Nl,"follow");function Ul(t){var n;let e=(n=d.game.layers)==null?void 0:n.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var r;return e?((r=d.game.layers)==null?void 0:r[e])??null:null},set layer(r){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(r),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Ul,"layer");function jl(t,e){let n=typeof t=="number"?q.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(n.scale(e))}}}o(jl,"move");function zl(t={}){let e=t.distance??gh,n=!1,r=o(s=>{s.isOffScreen()?(n||(s.trigger("exitView"),n=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(n&&(s.trigger("enterView"),n=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new we(P(0),Ee(),Pe());return!fr(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?Kl(()=>r(this)):this.onUpdate(()=>r(this))}}}o(zl,"offscreen");function lr(...t){return{id:"pos",pos:P(...t),moveBy(...e){this.pos=this.pos.add(P(...e))},move(...e){this.moveBy(P(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(P(e[0],e[1]),e[2]);let n=e[0],r=e[1];if(r===void 0){this.pos=P(n);return}let s=n.sub(this.pos);if(s.len()<=r*d.k.dt()){this.pos=P(n);return}this.move(s.unit().scale(r))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,P()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),P()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,P()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let n=this.worldPos();return n?kt(this)?n:Gr(n):null}},toScreen(e){let n=this.toWorld(e);return kt(this)?n:Gr(n)},fromScreen(e){return kt(this)?this.fromWorld(e):this.fromWorld(Li(e))},toOther(e,n){return e.fromWorld(this.toWorld(n))},fromOther(e,n){return e.toOther(this,n)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){on({color:ue(255,0,0),radius:4/Gi()})}}}o(lr,"pos");function Vl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Vl,"rotate");function ur(...t){if(t.length===0)return ur(1);let e=P(...t);return{id:"scale",set scale(n){if(!(n instanceof q))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=P(n)},get scale(){return e},scaleTo(...n){e=P(...n)},scaleBy(...n){e=e.scale(P(...n))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(ur,"scale");function Gl(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Gl,"z");function Hl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let n=d.game.root.add([lr(e.pos??P(0))]),r=t.length,s=0,i=null,l=null,c=null,h=null,u=o(x=>x.x+x.y*s,"tile2Hash"),g=o(x=>P(Math.floor(x%s),Math.floor(x/s)),"hash2Tile"),y=o(()=>{i=[];for(let x of n.children)m(x)},"createSpatialMap"),m=o(x=>{let v=u(x.tilePos);i[v]?i[v].push(x):i[v]=[x]},"insertIntoSpatialMap"),E=o(x=>{let v=u(x.tilePos);if(i[v]){let M=i[v].indexOf(x);M>=0&&i[v].splice(M,1)}},"removeFromSpatialMap"),p=o(()=>{let x=!1;for(let v of n.children){let M=n.pos2Tile(v.pos);(v.tilePos.x!=M.x||v.tilePos.y!=M.y)&&(x=!0,E(v),v.tilePos.x=M.x,v.tilePos.y=M.y,m(v))}x&&n.trigger("spatialMapChanged")},"updateSpatialMap"),T=o(()=>{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();l?l.length=v:l=new Array(v),l.fill(1,0,v);for(let M=0;M{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();c?c.length=v:c=new Array(v),c.fill(15,0,v);for(let M=0;M{let x=n.numRows()*n.numColumns(),v=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();I(O).forEach(z=>{h[z]<0&&(h[z]=L,D.push(z))})}},"traverse");h?h.length=x:h=new Array(x),h.fill(-1,0,x);let M=0;for(let R=0;R=0){M++;continue}v(R,M),M++}},"createConnectivityMap"),S=o((x,v)=>l[v],"getCost"),C=o((x,v)=>{let M=g(x),R=g(v);return M.dist(R)},"getHeuristic"),I=o((x,v)=>{let M=[],R=Math.floor(x%s),L=R>0&&c[x]&1&&l[x-1]!==1/0,D=x>=s&&c[x]&2&&l[x-s]!==1/0,O=R{if(typeof x=="string"){if(e.tiles[x]){if(typeof e.tiles[x]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[x](M)}else if(e.wildcardTile)return e.wildcardTile(x,M)}else{if(Array.isArray(x))return x;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let z of R)z.id==="tile"&&(D=!0),z.id==="pos"&&(L=!0);L||R.push(lr(this.tile2Pos(M))),D||R.push(Si());let O=n.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(m(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return r},levelWidth(){return s*this.tileWidth()},levelHeight(){return r*this.tileHeight()},tile2Pos(...x){return P(...x).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...x){let v=P(...x);return P(Math.floor(v.x/this.tileWidth()),Math.floor(v.y/this.tileHeight()))},getSpatialMap(){return i||y(),i},removeFromSpatialMap:E,insertIntoSpatialMap:m,onSpatialMapChanged(x){return this.on("spatialMapChanged",x)},onNavigationMapInvalid(x){return this.on("navigationMapInvalid",x)},getAt(x){i||y();let v=u(x);return i[v]||[]},raycast(x,v){let M=this.toWorld(x),R=this.toWorld(x.add(v)).sub(M),L=1/this.tileWidth(),D=x.scale(L),O=Va(D,v,z=>{let te=this.getAt(z);if(te.some($=>$.isObstacle))return!0;let H=null;for(let $ of te)if($.has("area")){let Q=$.worldArea().raycast(M,R);Q&&(H?Q.fraction=s||x.y<0||x.y>=r||v.x<0||v.x>=s||v.y<0||v.y>=r)return null;let R=u(x),L=u(v);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new po((ne,Y)=>ne.costO.scale(R,L).add(R/2,L/2)),v]:null}};return n.use(k),n.onNavigationMapInvalid(()=>{n.invalidateNavigationMap(),n.trigger("navigationMapChanged")}),t.forEach((x,v)=>{let M=x.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{n.spawn(R,P(L,v))})}),n}o(Hl,"addLevel");function Ge(t,e,n){let r=!1,s=new Map,i=o(h=>{let u=h.on(t,(...g)=>{n(h,...g)});u.paused=r,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return r},set paused(h){r=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(Ge,"on");var ic=o((t,e,...n)=>{for(let r of d.game.root.children)r.is(e)&&r.trigger(t,n)},"trigger"),ac=pe(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("fixedUpdate",t,e)),Kl=pe(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("update",t,e)),oc=pe(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(n){e.hidden=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("draw",t,e)),Ls=pe(t=>d.game.events.on("add",t),(t,e)=>Ge("add",t,e)),la=pe(t=>d.game.events.on("destroy",t),(t,e)=>Ge("destroy",t,e)),ua=pe(t=>d.game.events.on("use",t),(t,e)=>Ge("use",t,e)),ha=pe(t=>d.game.events.on("unuse",t),(t,e)=>Ge("unuse",t,e)),Wl=pe(t=>d.game.events.on("tag",t),(t,e)=>Ge("tag",t,e)),lc=pe(t=>d.game.events.on("untag",t),(t,e)=>Ge("untag",t,e));function Yl(t,e,n){return Ge("collide",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Yl,"onCollide");function Xl(t,e,n){return Ge("collideUpdate",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Xl,"onCollideUpdate");function Jl(t,e,n){return Ge("collideEnd",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Jl,"onCollideEnd");function yr(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Ls(t,e),Wl((n,r)=>{r===t&&e(n)})}o(yr,"forAllCurrentAndFuture");var uc=pe(t=>d.app.onMousePress(t),(t,e)=>{let n=[];return yr(t,r=>{if(!r.area)throw new Error("onClick() requires the object to have area() component");n.push(r.onClick(()=>e(r)))}),sn.join(n)});function Ql(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHover() requires the object to have area() component");n.push(r.onHover(()=>e(r)))}),sn.join(n)}o(Ql,"onHover");function Zl(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHoverUpdate() requires the object to have area() component");n.push(r.onHoverUpdate(()=>e(r)))}),sn.join(n)}o(Zl,"onHoverUpdate");function _l(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHoverEnd() requires the object to have area() component");n.push(r.onHoverEnd(()=>e(r)))}),sn.join(n)}o(_l,"onHoverEnd");function $l(t){return d.game.events.on("loading",t)}o($l,"onLoading");function eu(t){return d.app.onResize(t)}o(eu,"onResize");function tu(t){return d.game.events.on("error",t)}o(tu,"onError");function us(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(us,"onLoad");function nu(t){if(d.assets.loaded)gi().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(nu,"onLoadError");function qi(...t){d.game.cam.pos=P(...t)}o(qi,"setCamPos");function Ti(){return d.game.cam.pos?d.game.cam.pos.clone():hr()}o(Ti,"getCamPos");function Ii(...t){d.game.cam.scale=P(...t)}o(Ii,"setCamScale");function Bi(){return d.game.cam.scale.clone()}o(Bi,"getCamScale");function Ri(t){d.game.cam.angle=t}o(Ri,"setCamRot");function Fi(){return d.game.cam.angle}o(Fi,"getCamRot");function wr(){return d.game.cam.transform.clone()}o(wr,"getCamTransform");function Oi(t=ue(255,255,255),e=1){let n=d.game.root.add([fi(Ee(),Pe()),hi(t),ci(1),Ci()]),r=n.fadeOut(e);return r.onEnd(()=>Vi(n)),r}o(Oi,"flash");function ru(t=12){d.game.cam.shake+=t}o(ru,"shake");function Gr(t){return d.game.cam.transform.transformPoint(t,P())}o(Gr,"toScreen");function Li(t){return d.game.cam.transform.inverse.transformPoint(t,P())}o(Li,"toWorld");function su(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&qi(...t),Ti()}o(su,"camPos");function iu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Ii(...t),Bi()}o(iu,"camScale");function au(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&Ri(t),Fi()}o(au,"camRot");function ou(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Oi(t,e)}o(ou,"camFlash");function lu(){return Ht("camTransform","getCamTransform"),wr()}o(lu,"camTransform");var uu=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(uu||{});function hs(t=[]){let e=new Map,n=[],r={},s=new rs,i=new Te,l=new Te,c=new Te,h=[],u=new Set("*"),g=d.globalOpt.tagsAsComponents,y=null,m=!1,E,p={id:Sh(),hidden:!1,transform:new tn,children:[],get parent(){return E},set parent(f){if(E===f)return;let w=E?E.children.indexOf(this):-1;w!==-1&&E.children.splice(w,1),E=f,f&&f.children.push(this)},setParent(f,w){if(E===f)return;let S=E.transform,C=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),C.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=C.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(C.getScale()))),this.parent=f},set paused(f){if(f!==m){m=f;for(let w of h)w.paused=f}},get paused(){return m},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?hs(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(C=>w(C))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ye(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),We(),$e(this.pos),Jn(this.scale),rn(this.angle);let w=this.children.sort((S,C)=>{let I=S.layerIndex??d.game.defaultLayerIndex,k=C.layerIndex??d.game.defaultLayerIndex;return I-k||(S.z??0)-(C.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let C=0;C{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),ze())},use(f){var C;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),r[f.id]=[],w=r[f.id],e.set(f.id,f),g&&u.add(f.id)):n.push(f);let S=o(()=>{if(f.require)try{for(let I of f.require)if(!this.c(I))throw new Error(`Component "${f.id}" requires component "${I}"`)}catch(I){d.handleErr(I)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(y=o(I=>w.push(I),"onCurCompCleanup"),f.add.call(this),y=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let I in f){if(dh.has(I))continue;let k=Object.getOwnPropertyDescriptor(f,I);if(k)if(typeof k.value=="function"&&(f[I]=f[I].bind(this)),k.set&&Object.defineProperty(f,I,{set:k.set.bind(this)}),k.get&&Object.defineProperty(f,I,{get:k.get.bind(this)}),fh.has(I)){let x=I==="add"?()=>{var v;y=o(M=>w.push(M),"onCurCompCleanup"),(v=f[I])==null||v.call(f),y=null}:f[I];w.push(this.on(I,x).cancel)}else if(this[I]===void 0)Object.defineProperty(this,I,{get:o(()=>f[I],"get"),set:o(x=>f[I]=x,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[I]);else{let x=(C=e.values().find(v=>v[I]!==void 0))==null?void 0:C.id;throw new Error(`Duplicate component property: "${I}" while adding component "${f.id}"`+(x?` (originally added by "${x}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else g&&u.has(f)&&u.delete(f);r[f]&&(r[f].forEach(w=>w()),delete r[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((I,k)=>w.only==="comps"?I.has(k):w.only==="tags"?I.is(k):I.is(k)||I.has(k),"checkTagsOrComps"),C=w.recursive?this.children.flatMap(o(function I(k){return[k,...k.children.flatMap(I)]},"recurse")):this.children;if(C=C.filter(I=>f?S(I,f):!0),w.liveUpdate){let I=o(x=>w.recursive?this.isAncestorOf(x):x.parent===this,"isChild"),k=[];k.push(d.k.onAdd(x=>{I(x)&&S(x,f)&&C.push(x)})),k.push(d.k.onDestroy(x=>{if(S(x,f)){let v=C.findIndex(M=>M.id===x.id);v!==-1&&C.splice(v,1)}})),(g||w.only!=="tags")&&(k.push(d.k.onUse((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUnuse((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),!g&&w.only!=="comps"&&(k.push(d.k.onTag((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUntag((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),this.onDestroy(()=>{for(let x of k)x.cancel()})}return C},query(f){let w=f.hierarchy||"children",S=f.include,C=f.exclude,I=[];switch(w){case"children":I=this.children;break;case"siblings":I=this.parent?this.parent.children.filter(x=>x!==this):[];break;case"ancestors":let k=this.parent;for(;k;)I.push(k),k=k.parent;break;case"descendants":I=this.children.flatMap(o(function x(v){return[v,...v.children.flatMap(x)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>k.is(S)):I=I.filter(k=>f.include.some(x=>k.is(x)))),C&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>!k.is(C)):I=I.filter(k=>!f.exclude.some(x=>k.is(x)))),f.visible===!0&&(I=I.filter(k=>k.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let k=f.distanceOp||"near",x=f.distance*f.distance;k==="near"?I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)<=x):I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)>x)}return f.name&&(I=I.filter(k=>k.name===f.name)),I},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(C=>{switch(f){case"fixedUpdate":return i.add(C);case"update":return l.add(C);case"draw":return c.add(C);default:return s.on(f,C)}})(w.bind(this));return y&&y(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,C]of e)f[S]=((w=C.inspect)==null?void 0:w.call(C))??null;for(let[S,C]of n.entries()){if(C.inspect){f[S]=C.inspect();continue}for(let[I,k]of Object.entries(C))typeof k!="function"&&(f[I]=`${I}: ${k}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},T=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of T)p[f]=(...w)=>{var C,I;let S=(I=(C=d.app)[f])==null?void 0:I.call(C,...w);return h.push(S),p.onDestroy(()=>S.cancel()),p.on("sceneEnter",()=>{var x,v;h.splice(h.indexOf(S),1);let k=(v=(x=d.app)[f])==null?void 0:v.call(x,...w);sn.replace(S,k),h.push(S)}),S};for(let f of t)p.use(f);return p}o(hs,"make");var hc=o(()=>({events:new rs,root:hs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new q(1),angle:0,shake:0,transform:new tn}}),"initGame");function hu(t){d.game.gravity=t?(d.game.gravity||P(0,1)).unit().scale(t):null}o(hu,"setGravity");function cu(){return d.game.gravity?d.game.gravity.len():0}o(cu,"getGravity");function du(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(du,"setGravityDirection");function nr(){return d.game.gravity?d.game.gravity.unit():P(0,1)}o(nr,"getGravityDirection");var cc=th("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");function fu(t){return t.createBuffer(1,1,44100)}o(fu,"createEmptyAudioBuffer");var dc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let n=new wn(fu(t));return t.decodeAudioData(cc.buffer.slice(0)).then(r=>{n.buf=r}).catch(r=>{console.error("Failed to load burp: ",r)}),{ctx:t,masterNode:e,burpSnd:n}})(),"initAudio");function gu(t,e={}){let n=new Te,r=new Audio(t);r.crossOrigin="anonymous",r.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(r);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),r.play()}return o(l,"play"),e.paused||l(),r.onended=()=>n.trigger(),{play(){l()},seek(c){r.currentTime=c},stop(){r.pause(),this.seek(0)},set loop(c){r.loop=c},get loop(){return r.loop},set paused(c){c?r.pause():l()},get paused(){return r.paused},time(){return r.currentTime},duration(){return r.duration},set volume(c){r.volume=lt(c,0,1)},get volume(){return r.volume},set speed(c){r.playbackRate=Math.max(c,0)},get speed(){return r.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return n.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(gu,"playMusic");function pu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return gu(d.assets.music[t],e);let n=d.audio.ctx,r=e.paused??!1,s=n.createBufferSource(),i=new Te,l=n.createGain(),c=n.createStereoPanner(),h=e.seek??0,u=0,g=0,y=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;p()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let m=o(f=>{s.buffer=f.buf,r||(u=n.currentTime,s.start(0,h),y=!0)},"start"),E=dl(t);E instanceof ut&&E.onLoad(m);let p=o(()=>{if(!s.buffer)return 0;let f=r?g-u:n.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),T=o(f=>{let w=n.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(r!==f)if(r=f,f)y&&(s.stop(),y=!1),g=n.currentTime;else{s=T(s);let w=g-u;s.start(0,w),y=!0,u=n.currentTime-w,g=0}},get paused(){return r},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(r?(s=T(s),u=g-f):(s.stop(),s=T(s),u=n.currentTime-f,s.start(0,f),y=!0,g=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return p()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(pu,"play");function Di(t){return d.k.play(d.audio.burpSnd,t)}o(Di,"burp");function Ni(t){d.audio.masterNode.gain.value=t}o(Ni,"setVolume");function Ui(){return d.audio.masterNode.gain.value}o(Ui,"getVolume");function mu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ni(t),Ui()}o(mu,"volume");function ji(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Ji(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Hr(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Nr(lt(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Nr(lt(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Di())}o(ji,"initEvents");function yu(t,e={}){let n=d.game.root.add([lr(t),Pi()]),r=(e.speed||1)*5,s=e.scale||1;n.add([jr(d.boomSprite),ur(0),Vr("center"),Rs(r,s),...e.comps??[]]);let i=n.add([jr(d.kaSprite),ur(0),Vr("center"),zr(),...e.comps??[]]);return i.wait(.4/r,()=>i.use(Rs(r,s))),i.onDestroy(()=>n.destroy()),n}o(yu,"addKaboom");function zi(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let n=t.indexOf(e);if(n==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=n}o(zi,"setLayers");function wu(){return d.game.layers}o(wu,"getLayers");function xu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(xu,"getDefaultLayer");function Au(t,e){Ht("layers","setLayers"),zi(t,e)}o(Au,"layers");function Vi(t){t.destroy()}o(Vi,"destroy");function vu(){return d.game.root}o(vu,"getTreeRoot");function bu(t,e){d.game.scenes[t]=e}o(bu,"scene");function Eu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(n=>{!n.stay||n.scenesToStay&&!n.scenesToStay.includes(t)?d.game.root.remove(n):n.trigger("sceneEnter",t)}),d.game.root.clearEvents(),ji(),d.game.cam={pos:null,scale:P(1),angle:0,shake:0,transform:new tn},d.game.scenes[t](...e)}),d.game.currentScene=t}o(Eu,"go");function Ds(t){return d.game.events.on("sceneLeave",t)}o(Ds,"onSceneLeave");function Su(){return d.game.currentScene}o(Su,"getSceneName");function $e(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o($e,"pushTranslateV");function st(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(st,"pushTranslate");function We(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(We,"pushTransform");function Mu(t){d.gfx.transform.setMat23(t)}o(Mu,"pushMatrix");function Jn(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Jn,"pushScaleV");function rn(t){t&&d.gfx.transform.rotateSelf(t)}o(rn,"pushRotate");function ze(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(ze,"popTransform");function Ye(){d.gfx.renderer.flush(Ee(),Pe())}o(Ye,"flush");function Ee(){return d.gfx.width}o(Ee,"width");function Pe(){return d.gfx.height}o(Pe,"height");function Gi(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Gi,"getViewportScale");function ku(t){return new q(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(ku,"contentToView");function Pu(t){return new q((t.x-d.gfx.viewport.x)*Ee()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Pe()/d.gfx.viewport.height)}o(Pu,"windowToContent");function cs(){return Pu(d.app.mousePos())}o(cs,"mousePos");function hr(){return P(Ee()/2,Pe()/2)}o(hr,"center");var Kn,Hi=(Kn=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Kn,"Picture"),Kn),fc=new Xr;function Ki(t,e){let n=Ee(),r=Pe();d.gfx.renderer.flush(n,r);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let g=null,y=null;for(let m of t.commands){let E=m.material.tex??d.gfx.defTex,p=m.material.shader??d.gfx.defShader;m.material.blend&&d.gfx.renderer.setBlend(m.material.blend),p!=g&&(g==null||g.unbind(),p.bind(),g=p,p.send({width:n,height:r,camera:e.fixed?fc:wr(),transform:s})),m.material.uniform&&(p==null||p.send(m.material.uniform)),E!=y&&(y==null||y.unbind(),E==null||E.bind(),y=E),l.drawElements(l.TRIANGLES,m.count,l.UNSIGNED_SHORT,m.index*2)}g==null||g.unbind(),y==null||y.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(Ki,"drawPicture");function Cu(t){t??(t=new Hi),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Cu,"beginPicture");function qu(t){t??(t=new Hi),d.gfx.renderer.picture=t}o(qu,"appendToPicture");function Tu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new pc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Tu,"endPicture");var en,Ct=(en=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=n,this.height=r;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),n&&r&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,n,r,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,n,r={}){let s=new en(e,n.width,n.height,r);return s.update(n),s.src=n,s}update(e,n=0,r=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,n,r,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(en,"Texture"),en),ca=new Xr,Wn,gc=(Wn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=n,this.ctx=e,this.stride=n.reduce((c,h)=>c+h.size,0),this.maxVertices=r,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,r*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,n,r,s,i=null,l=null,c,h,u,g){if(this.picture){let E=this.picture.indices.length,p=r.length,T=this.picture.vertices.length/this.stride,f=n.length;for(let C=0;Cthis.maxVertices||this.iqueue.length+r.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let y=this.vqueue.length/this.stride,m=n.length;for(let E=0;E{e.push(i),t(i)},"push"),r=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[n,r,s]}o(Rt,"genStack");function Iu(t,e={}){let n=[];function r(k){n.push(k)}o(r,"onDestroy");function s(){n.forEach(x=>x());let k=t.getExtension("WEBGL_lose_context");k&&k.loseContext()}o(s,"destroy");let i=null;function l(k){if(is(k,i))return;i=k;let x=k.reduce((v,M)=>v+M.size,0);k.reduce((v,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,x*4,v),v+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Rt(k=>t.bindTexture(t.TEXTURE_2D,k)),[u,g]=Rt(k=>t.bindBuffer(t.ARRAY_BUFFER,k)),[y,m]=Rt(k=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,k)),[E,p]=Rt(k=>t.bindFramebuffer(t.FRAMEBUFFER,k)),[T,f]=Rt(k=>t.bindRenderbuffer(t.RENDERBUFFER,k)),[w,S]=Rt(k=>{if(!k)return;let{x,y:v,w:M,h:R}=k;t.viewport(x,v,M,R)}),[C,I]=Rt(k=>t.useProgram(k));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:r,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:g,pushElementArrayBuffer:y,popElementArrayBuffer:m,pushFramebuffer:E,popFramebuffer:p,pushRenderbuffer:T,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:C,popProgram:I,setVertexFormat:l}}o(Iu,"initGfx");var Xn,Hr=(Xn=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Ct(e,n,r,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,n,r),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,n=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,n),this.unbind();let r=this.width*4,s=new Uint8Array(r);for(let i=0;i<(this.height/2|0);i++){let l=i*r,c=(this.height-i-1)*r;s.set(n.subarray(l,l+r)),n.copyWithin(l,c,c+r),n.set(s,c)}return new ImageData(n,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),n=e.getContext("2d");if(e.width=this.width,e.height=this.height,!n)throw new Error("Failed to get 2d context");return n.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Xn,"FrameBuffer"),Xn),cn=new q;function It(t,e,n=!1,r,s,i,l){let c=r??d.gfx.defTex,h=s??d.gfx.defShader,u=ul(h);if(!u||u instanceof ut)return;let g=d.gfx.transform,y=t.pos.length/2,m=new Array(y*8),E=0;for(let p=0;pi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),It(r,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),ze()}}o(qt,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,n=t.end??360,r=an(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=mn(r,t.radiusX,t.radiusY,e,n,t.resolution);s.unshift(r);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(n-e>=360&&t.outline){t.fill!==!1&&qt(Object.assign({},i,{outline:null})),qt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}qt(i)}o(ds,"drawEllipse");function on(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(on,"drawCircle");function yn(t){let{p1:e,p2:n}=t;if(!e||!n)throw new Error('drawLine() requires properties "p1" and "p2".');let r=t.width||1,s=n.sub(e).unit().normal().scale(r*.5),i=t.color??se.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,n.x+s.x,n.y+s.y,n.x-s.x,n.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};It(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(yn,"drawLine");function Bu(t){let e=t.pts,n=[],r=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||P(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-r/c),u,g=e[0];if(!s)switch(t.cap){case"square":{let p=l.scale(-r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(-1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0?(n.push(u.add(I)),n.push(u.sub(h)),n.push(u.add(I)),n.push(u.sub(w))):(n.push(u.add(h)),n.push(u.sub(I)),n.push(u.add(w)),n.push(u.sub(I))),l=T,c=f,h=w}if(!s)switch(n.push(g.add(h)),n.push(g.sub(h)),t.cap){case"square":{let p=l.scale(r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0){let k=u.add(I),x=Math.max(r,10),v=ye(h.angleBetween(w)/x),M=h,R=Math.cos(v),L=Math.sin(v);for(let D=0;D({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p2)switch(t.join){case"bevel":return Bu(t);case"round":return Ru(t);case"miter":return Fu(t)}if(t.radius&&e.length>=3){yn(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let r=1;rts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Ou,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=an(t.anchor||ns),s=r.x*e*-.5,i=r.y*n*-.5,l=t.quad||new xe(0,0,1,1),c=t.color||se.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,g=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+g,E=l.w-u*2,p=l.h-g*2;We(),$e(t.pos),rn(t.angle),Jn(t.scale),st(s,i),It({pos:[-e/2,n/2,-e/2,-n/2,e/2,-n/2,e/2,n/2],uv:[t.flipX?y+E:y,t.flipY?m:m+p,t.flipX?y+E:y,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m:m+p],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),ze()}o(zt,"drawUVQuad");function Lu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Lu,"drawCanvas");var ms={};function Ns(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(P(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Ns,"applyCharTransform");function Kr(t){let e={},n="",r=[],s=String(t),i=o(l=>{r.length>0&&(e[n.length]=r.slice()),n+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let g=r.pop();if(g!==u)throw g!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${g}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else r.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(r.length>0)throw new Error(`Styled text error: unclosed tags ${r}`);return{charStyleMap:e,text:n}}o(Kr,"compileStyledText");function Vt(t){var C,I,k;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=pi(t.font);if(!t.text||t.text===""||e instanceof ut||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:n,text:r}=Kr(t.text+""),s=vo(r);if(e instanceof Fr||typeof e=="string"){let x=e instanceof Fr?e.fontface.family:e,v=e instanceof Fr?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ms},M=ms[x]??{font:{tex:new Ct(d.gfx.ggl,2048,2048,{filter:v.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:v.outline};ms[x]||(ms[x]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${x}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let z=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,z+=M.outline.width*3),L.fillText(R,((C=M.outline)==null?void 0:C.width)??0,((I=M.outline)==null?void 0:I.width)??0);let te=L.getImageData(0,0,O,z);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(te,M.cursor.x,M.cursor.y),e.map[R]=new xe(M.cursor.x,M.cursor.y,O,z),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,z)}}let i=t.size||e.size,l=P(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,g=0,y=0,m=[],E=[],p=0,T=null,f=0,w;for(;pt.width&&(y+=i+c,T!=null&&(p-=E.length-T,x=s[p],v=e.map[x],M=v.w*l.x,E=E.slice(0,T-1),u=f),T=null,f=0,m.push({width:u-h,chars:E}),u=w??0,E=[]),E.push({tex:e.tex,width:v.w,height:v.h,quad:new xe(v.x/e.tex.width,v.y/e.tex.height,v.w/e.tex.width,v.h/e.tex.height),ch:x,pos:new q(u,y),opacity:t.opacity??1,color:t.color??se.WHITE,scale:P(l),angle:0}),x===" "&&(T=E.length,f=u),t.indentAll&&w===void 0&&/\S/.test(x)&&(w=u),u+=M,g=Math.max(g,u),u+=h}}p++}m.push({width:u-h,chars:E}),y+=i,t.width&&(g=t.width);let S=[];for(let x=0;x{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),ze()}o(Gt,"drawFormattedText");function Ve(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=an(t.anchor||ns).add(1,1).scale(new q(e,n).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,n),new q(0,n)];if(t.radius){let i=Math.min(e,n)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?mn(new q(e-l[1],l[1]),l[1],l[1],270,360):[P(e,0)],...l[2]?mn(new q(e-l[2],n-l[2]),l[2],l[2],0,90):[P(e,n)],...l[3]?mn(new q(l[3],n-l[3]),l[3],l[3],90,180):[P(0,n)],...l[0]?mn(new q(l[0],l[0]),l[0],l[0],180,270):[]]}qt(Object.assign({},t,{offset:r,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ve,"drawRect");function Pt(t){Ye();let e=d.gfx.width,n=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ye(),d.gfx.width=e,d.gfx.height=n}o(Pt,"drawUnscaled");function Us(t,e){Pt(()=>{let n=P(8);We(),$e(t);let r=Vt({text:e,font:Dr,size:16,pos:n,color:ue(255,255,255),fixed:!0}),s=r.width+n.x*2,i=r.height+n.x*2;t.x+s>=Ee()&&$e(P(-s,0)),t.y+i>=Pe()&&$e(P(0,-i)),Ve({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(r),ze()})}o(Us,"drawInspectText");function Yi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return qt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Yi,"drawTriangle");function Du(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],n=t.inspect();for(let r in n)n[r]?e.push(n[r]):e.push(r);e.push(...t.tags.map(r=>`tag: ${r}`)),Us(ku(cs()),e.join(` +`))}Us(P(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&Pt(()=>{We(),st(Ee(),0),st(-8,8);let t=32;Ve({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ve({width:4,height:t*.6,anchor:"center",pos:P(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});ze()}),d.debug.timeScale!==1&&Pt(()=>{We(),st(Ee(),Pe()),st(-8,-8);let t=8,e=Vt({text:d.debug.timeScale.toFixed(1),font:Dr,size:16,color:ue(255,255,255),pos:P(-t),anchor:"botright",fixed:!0});Ve({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let n=0;n<2;n++){let r=d.debug.timeScale<1;Yi({p1:P(-e.width-t*(r?2:3.5),-t),p2:P(-e.width-t*(r?2:3.5),-t-e.height),p3:P(-e.width-t*(r?3.5:2),-t-e.height/2),pos:P(-n*t*1+(r?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Gt(e),ze()}),d.debug.curRecording&&Pt(()=>{We(),st(0,Pe()),st(24,-24),on({radius:12,color:ue(255,0,0),opacity:Ks(0,1,d.app.time()*4),fixed:!0}),ze()}),d.debug.showLog&&d.game.logs.length>0&&Pt(()=>{We(),st(0,Pe()),st(8,-8);let t=8,e=[];for(let r of d.game.logs){let s="",i=r.msg instanceof Error?"error":"info";s+=`[time]${r.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Wr(r.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(r=>d.app.time()-r.time<(d.globalOpt.logTime||4));let n=Vt({text:e.join(` +`),font:Dr,pos:P(t,-t),anchor:"botleft",size:16,width:Ee()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ve({width:n.width+t*2,height:n.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(n),ze()})}o(Du,"drawDebug");function Wr(t,e=!1,n=new Set){if(n.has(t))return"";var r="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(r=["[",t.map(i=>Wr(i,!0,n.union(new Set([t])))).join(", "),"]"].join(""),t=r),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(r+=t.constructor.name+" "),r+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Wr(t[i],!0,n.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=r),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):Pt(()=>{let e=Ee()/2,n=24,r=P(Ee()/2,Pe()/2).sub(P(e/2,n/2));Ve({pos:P(0),width:Ee(),height:Pe(),color:ue(0,0,0)}),Ve({pos:r,width:e,height:n,fill:!1,outline:{width:4}}),Ve({pos:r,width:e*t,height:n})})}o(Uu,"drawLoadScreen");function Xi(t,e,n){let r=d.gfx.ggl.gl;Ye(),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST),r.stencilFunc(r.NEVER,1,255),r.stencilOp(r.REPLACE,r.REPLACE,r.REPLACE),e(),Ye(),r.stencilFunc(n,1,255),r.stencilOp(r.KEEP,r.KEEP,r.KEEP),t(),Ye(),r.disable(r.STENCIL_TEST)}o(Xi,"drawStenciled");function ju(t,e){let n=d.gfx.ggl.gl;Xi(t,e,n.EQUAL)}o(ju,"drawMasked");function cr(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new xe(0,0,1,1),n=t.tex.width*e.w,r=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=an(t.anchor||ns),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||n),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||r),g=(t.width||n)/n,y=(t.height||r)/r,m=Math.floor(g),E=Math.floor(y),p=g-m,T=y-E,f=(m+p?1:0)*(E+T?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},C=0,I=t.color||se.WHITE,k=t.opacity||1,x=o((v,M,R,L,D)=>{w[C*6+0]=C*4+0,w[C*6+1]=C*4+1,w[C*6+2]=C*4+3,w[C*6+3]=C*4+1,w[C*6+4]=C*4+2,w[C*6+5]=C*4+3;let O=C*4;S.pos[O*2]=v+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,C++},"addQuad");for(let v=0;v{let n=ls(e,ks,Ps),r=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Hr(e,t.width*r*s,t.height*r*s):new Hr(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let g=new gc(e,ai,lh,uh),y=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(E=>new tn);return{lastDrawCalls:0,ggl:e,defShader:n,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:g,transform:new tn,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/r/s,height:t.height??i.drawingBufferHeight/r/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Ji(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,n=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let r=e/n,s=d.globalOpt.width/d.globalOpt.height;if(r>s){let i=n*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:n}}else{let i=e/s,l=(n-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:n}}o(Ji,"updateViewport");var da=o((t,e,n)=>{let r=d.systems,s=r.findIndex(l=>l.name===t);if(s!=-1){let l=r[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:n};for(let l of n)d.systemsByEvent[l].push(i);r.push({name:t,run:e,when:n})},"system"),yc="data:image/png;base64,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",wc="data:image/png;base64,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",xc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},fa=!1,Ac=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let n=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=n;let r=t.scale??1;d.gscale=r;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(n.width=t.width*r,n.height=t.height*r):(n.width=n.parentElement.offsetWidth,n.height=n.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=n.width,V=n.height;i.push(`width: ${N}px`),i.push(`height: ${V}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),n.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,n.width*=l,n.height*=l,n.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ih({canvas:n,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let g=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,E=Iu(m,{texFilter:t.texFilter}),p=mc(t,E);d.gfx=p;let T=dc();d.audio=T;let f=Qh(E,t.spriteAtlasPadding??0);d.assets=f;let w=hc();d.game=w,w.root.use(zr()),da("collision",Fe,[4,3]);function S(N,V){let X=new Hr(E,N,V);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ie=>{Ye(),X.bind(),ie(),Ye(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function C(){m.clear(m.COLOR_BUFFER_BIT),p.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),p.bgColor||Pt(()=>{zt({width:Ee(),height:Pe(),quad:new xe(0,0,Ee()/64,Pe()/64),tex:p.bgTex,fixed:!0})}),p.renderer.numDraws=0,p.fixed=!1,p.transformStackIndex=-1,p.transform.setIdentity()}o(C,"frameStart");function I(N,V){p.postShader=N,p.postShaderUniform=V??null}o(I,"usePostEffect");function k(){Ye(),p.lastDrawCalls=p.renderer.numDraws,p.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let N=p.width,V=p.height;p.width=m.drawingBufferWidth/l,p.height=m.drawingBufferHeight/l,cr({flipY:!0,tex:p.frameBuffer.tex,pos:new q(p.viewport.x,p.viewport.y),width:p.viewport.width,height:p.viewport.height,shader:p.postShader,uniform:typeof p.postShaderUniform=="function"?p.postShaderUniform():p.postShaderUniform,fixed:!0}),Ye(),p.width=N,p.height=V}o(k,"frameEnd");let x=!1,v={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Ie,drawCalls:o(()=>p.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let V=t.logMax??8,X=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>V&&(w.logs=w.logs.slice(0,V))},"log"),error:o(N=>v.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>$("*",{recursive:!0}).length,"numObjects"),get paused(){return x},set paused(N){x=N,N?T.ctx.suspend():T.ctx.resume()}};d.debug=v;function M(N,V){try{return JSON.parse(window.localStorage[N])}catch{return V?(R(N,V),V):null}}o(M,"getData");function R(N,V){window.localStorage[N]=JSON.stringify(V)}o(R,"setData");function L(N,...V){let X=N(Ce),ie;typeof X=="function"?ie=X(...V)(Ce):ie=X;for(let Me in ie)Ce[Me]=ie[Me],t.global!==!1&&(window[Me]=ie[Me]);return Ce}o(L,"plug");function D(N){let V=u.canvas.captureStream(N),X=T.ctx.createMediaStreamDestination();T.masterNode.connect(X);let ie=new MediaRecorder(V),Me=[];return ie.ondataavailable=be=>{be.data.size>0&&Me.push(be.data)},ie.onerror=()=>{T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop())},ie.start(),{resume(){ie.resume()},pause(){ie.pause()},stop(){return ie.stop(),T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop()),new Promise(be=>{ie.onstop=()=>{be(new Blob(Me,{type:"video/mp4"}))}})},download(be="kaboom.mp4"){this.stop().then(rt=>Cs(be,rt))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let z=w.root.add.bind(w.root),te=w.root.readd.bind(w.root),H=w.root.removeAll.bind(w.root),$=w.root.get.bind(w.root),Q=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),Y=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),W=xn(null,wc),De=xn(null,yc);d.kaSprite=W,d.boomSprite=De;function He(){w.root.fixedUpdate()}o(He,"fixedUpdateFrame");function Ie(){w.root.update()}o(Ie,"updateFrame");const Ue=class Ue{constructor(V,X,ie,Me,be=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=V,this.target=X,this.normal=ie,this.distance=Me,this.resolved=be}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Ue(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||P(0,1))>0}isRight(){return this.displacement.cross(w.gravity||P(0,1))<0}isTop(){return this.displacement.dot(w.gravity||P(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||P(0,1))<0}preventResolution(){this.resolved=!0}};o(Ue,"Collision");let Ne=Ue;function Je(N,V){if(V.paused||!V.exists())return!1;for(let ie of N.collisionIgnore)if(V.is(ie))return!1;for(let ie of V.collisionIgnore)if(N.is(ie))return!1;let X=Ts(N.worldArea(),V.worldArea());if(X){let ie=new Ne(N,V,X.normal,X.distance);N.trigger("collideUpdate",V,ie);let Me=ie.reverse();Me.resolved=ie.resolved,V.trigger("collideUpdate",N,Me)}return!0}o(Je,"narrowPhase");let K=new Yh,oe=!1;function ce(){if(Os()){if(!oe){oe=!0,Ls(N=>{N.has("area")&&K.add(N)}),la(N=>{K.remove(N)}),ua((N,V)=>{V==="area"&&K.add(N)}),ha((N,V)=>{V==="area"&&K.remove(N)}),Ds(N=>{oe=!1,K.clear()});for(let N of $("*",{recursive:!0}))N.has("area")&&K.add(N)}K.update();for(let[N,V]of K)Je(N,V)}}o(ce,"broadPhase");function Fe(){if(Os())return ce()}o(Fe,"checkFrame");function Se(N){if(fa)return;fa=!0,console.error(N),T.ctx.suspend();let V=N.message??String(N)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,C(),Pt(()=>{let ie=Ee(),Me=Pe(),be={size:36,width:ie-32*2,letterSpacing:4,lineSpacing:4,font:Dr,fixed:!0};Ve({width:ie,height:Me,color:ue(0,0,255),fixed:!0});let rt=Vt({...be,text:"Error",pos:P(32),color:ue(255,128,0),fixed:!0});Gt(rt),js({...be,text:V,pos:P(32,32+rt.height+16),fixed:!0}),ze(),w.events.trigger("error",N)}),k())})}o(Se,"handleErr"),d.handleErr=Se;function tt(N){g.push(N)}o(tt,"onCleanup");function Qe(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let N=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let V=0;VV())})}o(Qe,"quit");let nt=!0;u.run(()=>{try{if(f.loaded&&!v.paused){for(let N of d.systemsByEvent[1])N.run();He();for(let N of d.systemsByEvent[4])N.run()}}catch(N){Se(N)}},(N,V)=>{try{if(N(),f.loaded||jt()===1&&!nt&&(f.loaded=!0,gi().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||nt)C(),Uu(),k();else{if(!v.paused){for(let X of d.systemsByEvent[0])X.run();Ie();for(let X of d.systemsByEvent[3])X.run()}C();for(let X of d.systemsByEvent[2])X.run();Nu(),t.debug!==!1&&Du();for(let X of d.systemsByEvent[5])X.run();k()}nt&&(nt=!1),w.events.trigger("frameEnd"),V()}catch(X){Se(X)}}),Ji(),ji();let Ce={_k:d,VERSION:xc,loadRoot:nl,loadProgress:jt,loadSprite:xn,loadSpriteAtlas:vi,loadSound:fl,loadMusic:gl,loadBitmapFont:wi,loadFont:al,loadShader:hl,loadShaderURL:cl,loadAseprite:il,loadPedit:ll,loadBean:pl,loadHappy:_h,loadJSON:rl,load:Ur,getSound:Ai,getFont:mi,getBitmapFont:yi,getSprite:bi,getShader:xi,getAsset:sl,Asset:ut,SpriteData:nn,SoundData:wn,width:Ee,height:Pe,center:hr,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:nu,onLoading:$l,onResize:eu,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:tu,onCleanup:tt,flash:Oi,setCamPos:qi,getCamPos:Ti,setCamRot:Ri,getCamRot:Fi,setCamScale:Ii,getCamScale:Bi,getCamTransform:wr,camPos:su,camScale:iu,camFlash:ou,camRot:au,camTransform:lu,shake:ru,toScreen:Gr,toWorld:Li,setGravity:hu,getGravity:cu,setGravityDirection:du,getGravityDirection:nr,setBackground:zo,getBackground:Vo,getGamepads:u.getGamepads,getTreeRoot:vu,add:z,make:hs,destroy:Vi,destroyAll:H,get:$,query:Y,readd:te,pos:lr,scale:ur,rotate:Vl,color:hi,blend:Go,opacity:ci,anchor:Vr,area:ql,sprite:jr,text:ml,polygon:_o,rect:fi,circle:Ho,ellipse:Wo,uvquad:yl,video:wl,picture:Zo,outline:Jo,particles:Qo,body:Tl,surfaceEffector:Bl,areaEffector:Rl,pointEffector:Fl,buoyancyEffector:Dl,platformEffector:Ll,constantForce:Ol,doubleJump:Il,shader:$o,textInput:Cl,timer:zr,fixed:Ci,stay:Pi,health:Sl,lifespan:Ml,named:kl,state:Pl,z:Gl,layer:Ul,move:jl,offscreen:zl,follow:Nl,fadeIn:Yo,mask:Xo,drawon:Ko,raycast:di,tile:Si,animate:El,serializeAnimation:ki,agent:xl,sentry:bl,patrol:vl,pathfinder:Al,fakeMouse:sc,trigger:ic,on:Ge,onFixedUpdate:ac,onUpdate:Kl,onDraw:oc,onAdd:Ls,onDestroy:la,onUse:ua,onUnuse:ha,onTag:Wl,onUntag:lc,onClick:uc,onCollide:Yl,onCollideUpdate:Xl,onCollideEnd:Jl,onHover:Ql,onHoverUpdate:Zl,onHoverEnd:_l,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:Q,play:pu,setVolume:Ni,getVolume:Ui,volume:mu,burp:Di,audioCtx:T.ctx,Line:Xe,Rect:we,Circle:Le,Ellipse:ht,Point:ih,Polygon:Re,Vec2:q,Color:se,Mat4:Xr,Mat23:tn,Quad:xe,RNG:ba,rand:ke,randi:Ws,randSeed:Ea,vec2:P,rgb:ue,hsl2rgb:nh,quad:ve,choose:ka,chooseMultiple:Ma,shuffle:Ys,chance:Sa,lerp:Oe,tween:ee,easings:ar,map:ot,mapc:va,wave:Ks,deg2rad:ye,rad2deg:Tt,clamp:lt,evaluateQuadratic:Ha,evaluateQuadraticFirstDerivative:Ka,evaluateQuadraticSecondDerivative:Wa,evaluateBezier:ts,evaluateBezierFirstDerivative:Ya,evaluateBezierSecondDerivative:Xa,evaluateCatmullRom:Ja,evaluateCatmullRomFirstDerivative:Qa,curveLengthApproximation:ni,normalizedCurve:Za,hermite:Zn,cardinal:ri,catmullRom:ir,bezier:_a,kochanekBartels:$a,easingSteps:io,easingLinear:ro,easingCubicBezier:so,testLineLine:Jr,testRectRect:Xs,testRectLine:Qr,testRectPoint:fr,testCirclePolygon:gr,testLinePoint:Zr,testLineCircle:Qn,clipLineToRect:Ca,clipLineToCircle:qa,gjkShapeIntersects:No,gjkShapeIntersection:Ts,isConvex:ho,triangulate:ii,NavMesh:Wh,drawSprite:zu,drawText:js,formatText:Vt,drawRect:Ve,drawLine:yn,drawLines:fs,drawTriangle:Yi,drawCircle:on,drawEllipse:ds,drawUVQuad:zt,drawPolygon:qt,drawCurve:Wi,drawBezier:Ou,drawFormattedText:Gt,drawMasked:ju,drawSubtracted:Vu,beginPicture:Cu,appendToPicture:qu,endPicture:Tu,drawPicture:Ki,pushTransform:We,popTransform:ze,pushTranslate:$e,pushScale:Jn,pushRotate:rn,pushMatrix:Mu,usePostEffect:I,makeCanvas:S,drawCanvas:Lu,Picture:Hi,debug:v,scene:bu,getSceneName:Su,go:Eu,onSceneLeave:Ds,layers:Au,getLayers:wu,setLayers:zi,getDefaultLayer:xu,addLevel:Hl,getData:M,setData:R,download:ss,downloadJSON:wo,downloadText:oi,downloadBlob:Cs,plug:L,system:da,ASCII_CHARS:co,canvas:u.canvas,addKaboom:yu,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:se.RED,GREEN:se.GREEN,BLUE:se.BLUE,YELLOW:se.YELLOW,MAGENTA:se.MAGENTA,CYAN:se.CYAN,WHITE:se.WHITE,BLACK:se.BLACK,quit:Qe,KEvent:Te,KEventHandler:rs,KEventController:sn,KeepFlags:uu,cancel:o(()=>go,"cancel"),BlendMode:Io};d.k=Ce;let he=t.plugins;if(he&&he.forEach(L),t.global!==!1)for(let N in Ce)window[N]=Ce[N];return t.focus!==!1&&u.canvas.focus(),Ce},"kaplay"),vc=Ac;const bc="G-2GKHT76YTG";function Ec(t,e){if(window.gtag){e&&e();return}const n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,n.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(n)}function Sc(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function Mc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Gu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const kc=Gu()?640:1920,Pc=Gu()?480:1080,a=vc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:kc,height:Pc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Cc=[{id:1,title:"twoSum",language:"javascript",blocks:[`var twoSum = function(nums, target) { `,` let map = {}; `,` `,` for (let i = 0; i < nums.length; i++) { @@ -74,7 +74,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return []; `,`}; -`]},{id:2,title:"isPalindrome",language:"js",blocks:[`var isPalindrome = function(x) { +`]},{id:2,title:"isPalindrome",language:"javascript",blocks:[`var isPalindrome = function(x) { `,` if (x < 0) { `,` return false; `,` } @@ -89,14 +89,14 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return reverse === xcopy; `,`}; -`]},{id:5,title:"longestCommonPrefix",language:"js",blocks:[`var longestCommonPrefix = function(strs) { +`]},{id:3,title:"longestCommonPrefix",language:"javascript",blocks:[`var longestCommonPrefix = function(strs) { `,` return strs.reduce((prev, next) => { `,` let i = 0; `,` while (prev[i] && next[i] && prev[i] === next[i]) i++; `,` return prev.slice(0, i); `,` }); `,`}; -`]},{id:6,title:"mergeTwoLists",language:"js",blocks:[`var mergeTwoLists = function(list1, list2) { +`]},{id:4,title:"mergeTwoLists",language:"javascript",blocks:[`var mergeTwoLists = function(list1, list2) { `,` let dummy = new ListNode(); `,` let cur = dummy; `,` @@ -115,7 +115,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return dummy.next; `,`}; -`]},{id:7,title:"removeDuplicates",language:"js",blocks:[`var removeDuplicates = function(nums) { +`]},{id:5,title:"removeDuplicates",language:"javascript",blocks:[`var removeDuplicates = function(nums) { `,` let i = 1; `,` `,` for (let j = 1; j < nums.length; j++) { @@ -127,7 +127,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return i; `,`}; -`]},{id:8,title:"strStr",language:"js",blocks:[`var strStr = function(haystack, needle) { +`]},{id:6,title:"strStr",language:"javascript",blocks:[`var strStr = function(haystack, needle) { `,` if (haystack.length < needle.length) { `,` return -1; `,` } @@ -140,7 +140,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return -1; `,`}; -`]},{id:9,title:"searchInsert",language:"js",blocks:[`var searchInsert = function(nums, target) { +`]},{id:7,title:"searchInsert",language:"javascript",blocks:[`var searchInsert = function(nums, target) { `,` let left = 0; `,` let right = nums.length - 1; `,` @@ -158,7 +158,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return left; `,`}; -`]},{id:10,title:"lengthOfLastWord",language:"js",blocks:[`var lengthOfLastWord = function(s) { +`]},{id:8,title:"lengthOfLastWord",language:"javascript",blocks:[`var lengthOfLastWord = function(s) { `,` let length = 0; `,` for (let i = s.length - 1; i >= 0; i--) { `,` if (s[i] !== ' ') { @@ -170,7 +170,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return length; `,`}; -`]},{id:11,title:"plusOne",language:"js",blocks:[`var plusOne = function(digits) { +`]},{id:9,title:"plusOne",language:"javascript",blocks:[`var plusOne = function(digits) { `,` for (let i = digits.length - 1; i >= 0; i--) { `,` if (digits[i] + 1 !== 10) { `,` digits[i] += 1; @@ -183,7 +183,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` } `,` } `,`}; -`]},{id:12,title:"addBinary",language:"js",blocks:[`var addBinary = function(a, b) { +`]},{id:10,title:"addBinary",language:"javascript",blocks:[`var addBinary = function(a, b) { `,` let carry = 0; `,` let res = ''; `,` let i = a.length - 1; @@ -203,7 +203,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return res; `,`}; -`]},{id:13,title:"mySqrt",language:"js",blocks:[`var mySqrt = function(x) { +`]},{id:11,title:"mySqrt",language:"javascript",blocks:[`var mySqrt = function(x) { `,` var left = 1; `,` var right = Math.floor(x / 2) + 1; `,` var mid; @@ -222,7 +222,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return right; `,`}; -`]},{id:14,title:"climbStairs",language:"js",blocks:[`var climbStairs = function(n) { +`]},{id:12,title:"climbStairs",language:"javascript",blocks:[`var climbStairs = function(n) { `,` if (n <= 3) return n; `,` `,` let prev1 = 3; @@ -237,7 +237,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return cur; `,`}; -`]},{id:15,title:"deleteDuplicates",language:"js",blocks:[`var deleteDuplicates = function(head) { +`]},{id:13,title:"deleteDuplicates",language:"javascript",blocks:[`var deleteDuplicates = function(head) { `,` let res = head; `,` `,` while (head && head.next) { @@ -250,13 +250,13 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return res; `,`}; -`]},{id:16,title:"mergeSortedArray",language:"js",blocks:[`var merge = function(nums1, m, nums2, n) { +`]},{id:14,title:"mergeSortedArray",language:"javascript",blocks:[`var merge = function(nums1, m, nums2, n) { `,` for (let i = m, j = 0; j < n; i++, j++) { `,` nums1[i] = nums2[j]; `,` } `,` nums1.sort((a, b) => a - b); `,`}; -`]},{id:17,title:"inorderTraversal",language:"js",blocks:[`var inorderTraversal = function(root) { +`]},{id:15,title:"inorderTraversal",language:"javascript",blocks:[`var inorderTraversal = function(root) { `,` const res = []; `,` `,` function inorder(node) { @@ -271,7 +271,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` inorder(root); `,` return res; `,`}; -`]},{id:17,title:"isSameTree",language:"js",blocks:[`var isSameTree = function(p, q) { +`]},{id:16,title:"isSameTree",language:"javascript",blocks:[`var isSameTree = function(p, q) { `,` if (!p && !q) { `,` return true; `,` } @@ -282,7 +282,7 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return false; `,`}; -`]},{id:18,title:"isSymmetric",language:"js",blocks:[`var isSymmetric = function(root) { +`]},{id:17,title:"isSymmetric",language:"javascript",blocks:[`var isSymmetric = function(root) { `,` const isMirror = (n1, n2) => { `,` if (!n1 && !n2) { `,` return true; @@ -298,14 +298,388 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` `,` return isMirror(root.left, root.right); `,`}; -`]}],ca=.35,Sc=.18,Mc=60,Us=5,Pc=1,Cc=28,Xt=Ec,kc=.15,ms=.15,Mn=.05,da=5,ys=40,Zt={resizableObjects:[],timeLeft:0},qc=({wpm:t,lpm:e,acc:r,bestWpm:n,blockNames:s,bestLvl:i})=>{const l=Nu(),c={wpm:t,lpm:e,acc:r,bestLvl:i,bestWpm:Math.max(n,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Nu=()=>{const t="playerData=",e=document.cookie.split("; ").find(r=>r.startsWith(t));if(!e)return null;try{const r=e.substring(t.length);return JSON.parse(decodeURIComponent(r))}catch(r){return console.error("Error parsing playerData cookie:",r),null}},ws=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],pe=t=>({id:"resizablePos",sizeFunc:t,add(){Zt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Tc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Zt.resizableObjects=Zt.resizableObjects.filter(e=>e!==this)}}),Ns=t=>{localStorage.setItem("playMute",JSON.stringify(t))},fa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},he={mute:!1,practiceMode:!1,rivalSpeed:0};function Ic(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pr(t){return t.replace(/\\/g,"\\\\")}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_04.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,r=800,n=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+r/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const p=i+80,y=30;let m=0;if(he.mute=fa(),a.setVolume(he.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Ic()){a.add([a.text("WPM is a desktop-only experience",{size:18}),pe(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const v=a.add([a.anchor("left"),a.text("Start",{size:e}),pe(()=>a.vec2(u,p)),a.opacity(1),a.z(21)]),g=a.add([a.anchor("left"),a.text("Github",{size:e}),pe(()=>a.vec2(u,p+y)),a.opacity(1),a.z(21)]),B=a.add([a.anchor("left"),a.text("About",{size:e}),pe(()=>a.vec2(u,p+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),w=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);K();const S=a.add([a.text("←",{size:22}),pe(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function k(){switch(m){case 0:t=["about","github","start"],v.text="Start",g.text="Github",B.text="About";break;case 1:t=["yes","no"],v.text="Play with Audio?",g.text="Yes",B.text="No";break;case 2:t=["interview","practice"],v.text="Game Mode",g.text="Interview",B.text="Practice";break}j()}function T(Y){if(Y==="")switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}const ee=t.find(oe=>oe.startsWith(Y.toLowerCase()));if(ee)return ee;switch(m){case 1:return"Yes";case 2:return"Interview";default:return"Start"}}function P(Y){const ee=Y.pos.y+h,oe=Y.pos.x+Y.text.length*16;S.pos=a.vec2(oe,ee),S.animate("pos",[a.vec2(oe,ee),a.vec2(oe+10,ee)],{duration:.5,loop:!0,direction:"ping-pong"})}let A="Start",E=A.length;const M=14,R=a.width()/2.88-(E-1)*M/2;let L=[],D=[];j();function O(){L.forEach(Y=>a.destroy(Y)),D.forEach(Y=>a.destroy(Y)),L=[],D=[];for(let Y=0;Y{Y===_e&&(Te.color=a.rgb(3,255,87),oe=Te)}),oe?(S.opacity=1,P(oe)):ee.length?(S.opacity=1,P(ee[0].obj)):S.opacity=0}he.mute=fa(),a.setVolume(he.mute?0:.5),f.opacity=he.mute?0:1,w.opacity=he.mute?1:0;const _=a.add([a.text("",{size:e}),a.pos(R,n),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(_.pos.x-30,n),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function K(){f.opacity=he.mute?0:1,w.opacity=he.mute?1:0}let J=!1,te="",ne=0,W="";function re(){J||(J=!0,a.shake(2),he.mute||a.play("wrong_typing"),a.wait(.3,()=>{J=!1}))}function G(Y){var Xe;const ee=T(Y);(!Y||ee.toLowerCase().startsWith(Y.toLowerCase()))&&ee!==A&&(A=ee,E=A.length,O());let oe=0,Te=-1;for(let le=0;leA.length,At=Y.length>te.length&&oe>=_e,ht=oe>=2&&Y.length>Te+1;if(ut||At){re(),W=te,_.text=pr(W);return}if(oe>ne&&re(),ne=oe,ht){W=Y.slice(0,Te+1),_.text=pr(W);return}switch(W=Y,te=W,L.forEach((le,Ie)=>{const Le=A[Ie],U=Y[Ie],H=U?U===" "&&Le!==" "?"_":U:Le;le.text=pr(H),le.color=U?U.toLowerCase()!==Le.toLowerCase()||U===" "&&Le!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),D.forEach((le,Ie)=>{Ie===Y.length?(le.color=a.rgb(3,255,87),le.opacity=Math.abs(Math.sin(a.time()*5))):le.opacity=0}),Y.toLowerCase()){case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),je());break;case"about":m===0&&a.go("about");break;case"start":if(m===0){Ye(),k();const le=T("");le!==A&&(A=le,E=A.length,O())}break;case"yes":m===1&&(he.mute=!1,Ns(!1),a.setVolume(.5),K(),Ye());break;case"no":m===1&&(he.mute=!0,Ns(!0),a.setVolume(0),K(),Ye());break;case"interview":m===2&&a.go("game");break;case"practice":m===2&&(he.practiceMode=!0,a.go("game"));break}j()}function ve(Y){W="",te="",ne=0,k(),A=Y,E=A.length,O(),j(),_.text=""}function je(){m=0,ve("Start")}function Ve(){ve(m===1?"Yes":m===2?"Interview":t[0])}function Ye(){m++,Ve()}a.onKeyPress(Y=>{if(Y.length!==1)return;const oe=a.isKeyDown("shift")?Y.toUpperCase():Y;te=W,W+=oe,_.text=pr(W),G(W),oe!==" "&&!he.mute&&a.play("code_sound")}),a.onKeyPress("backspace",()=>{W&&(W=W.slice(0,-1),_.text=pr(W),G(W))}),a.onKeyPress("space",()=>{te=W,W+=" ",_.text=pr(W),G(W)}),a.onKeyDown("escape",()=>{je()}),a.onUpdate(()=>{D.forEach((Y,ee)=>{ee===W.length?(Y.color=a.rgb(3,255,87),Y.opacity=Math.abs(Math.sin(a.time()*5))):Y.opacity=0})}),k()});Xt.map(t=>t.title);let Bc=a.Color.fromHex("#6a717d"),pa=a.YELLOW,Rc=a.Color.RED,St=0,As=18,Fc=16.4,Et=[],Pn={},Cn=!1,tn=0,Ln=0,yr=0,Dn=0,Yt=0,xs=0,kn=0,qn=0,Bt=0,zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St,zs="",js=[],Tn="",Rt="",tt="";const Oc=t=>{wc(yc,()=>{Ac()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,r=ws[0],n=-1,s=he.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,p=100;let y;function m(){if(clearInterval(y),he.mute)l.volume=0;else{let N=0;y=setInterval(()=>{N{v.cursorPos=0,v.line="",v.curLineCount=0,v.curCharInLine=0,v.curIdentSize=0,v.cursorPointer&&(v.cursorPointer.pos=ee())}},g={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{g.cursorPos=0,g.line="",g.curLineCount=0,g.curCharInLine=0,g.curIdentSize=0,g.cursorPointer&&(g.cursorPointer.pos=ee(!0))}},B=(N,V)=>{const{tokens:$,associations:ue}=r,{cursorPos:ge}=v,{cursorPos:et}=g;if(Et.includes(N))return Rc;if(!he.practiceMode&&(N===et||N>ge-1&&Nge-1)return Bc;const ct=[{test:()=>ue.brackets.test(V),color:$.brackets},{test:()=>ue.operators.test(V),color:$.operators},{test:()=>ue.punctuation.test(V),color:$.punctuation},{test:()=>V==='"'||V==="'",color:$.strings}];for(const{test:me,color:be}of ct)if(me())return a.Color.fromHex(be);const It=/[\w$]+|[^\s\w]/g;let ur="";for(const me of Tn.matchAll(It)){const[be]=me,hr=me.index,cr=hr+be.length;if(N>=hr&&Nue.tags.test(me),color:$.tags},{test:me=>ue.numbers.test(me),color:$.numbers},{test:me=>ue.classes.test(me),color:$.classes},{test:me=>ue.functions.test(me),color:$.functions},{test:me=>ue.keywords.test(me),color:$.keywords},{test:me=>ue.strings.test(me),color:$.strings},{test:me=>/^[A-Za-z_$][\w$]*$/.test(me),color:$.variables}];for(const{test:me,color:be}of bn)if(me(ur))return a.Color.fromHex(be);return a.Color.fromHex($.text)};let f=0;a.onUpdate(()=>{if(Pe(),!Cn){w();return}if(Bt+=a.dt(),!he.practiceMode){if(f+=a.dt(),fV+$,0)/5}function S(N){return N.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(){zu=tn,ju=Dn,Vu=Ln,Gu=yr,Hu=St}function T(){Cn=!1,St=0,Bt=0,tn=0,Dn=0,Ln=0,yr=0,Yt=0,xs=0,kn=0,qn=0,s=ca,Et=[],Pn={}}const P=()=>a.vec2(0,0),A=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),E=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(he.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(he.practiceMode?0:1)]),a.add([pe(P),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const M=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),R=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),L={js:"icon_02",ts:"icon_01",go:"icon_03",react:"icon_04",py:"icon_05",default:"icon_02"},D=Xt.map(N=>({title:N.title,language:N.language||"default"})),O=D.slice(0,da);js=O.map(N=>N.title),O.forEach(({title:N,language:V},$)=>{const ue=L[V]??L.default;a.add([a.sprite(ue),pe(()=>a.vec2(a.width()*.02,a.height()*(kc+Mn*$))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(N,{size:20}),pe(()=>a.vec2(a.width()*.05,a.height()*(ms+Mn*$))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:$}])}),he.mute?(M.opacity=0,R.opacity=1,m()):(M.opacity=1,R.opacity=0,m()),a.onKeyPress(["escape"],()=>{l.stop(),T(),a.go("game")});const j=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ms-Mn*.5)),a.opacity(1),a.animate()]);let _=-1,K=j.pos.y;function J(){const N=a.height()*(ms+Mn*_);j.pos=a.vec2(j.pos.x,N),j.animate("pos",[a.vec2(10,N),a.vec2(20,N)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(V=>{V.menuIndex===_?V.color=a.YELLOW:V.color=a.WHITE})}const te=()=>a.vec2(a.width(),a.height()),ne=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),W=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),pe(ne),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const re=a.add([Tc(te),pe(ne),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),G=()=>a.vec2(W).sub(0,Cc*(ys*e)),ve=re.add([a.text("",{size:As,lineSpacing:12,letterSpacing:2,transform:(N,V)=>({color:B(N,V)})}),a.pos(0,0),pe(G)]),Ve=As+12,Ye=(Ve-As)/2,Y=10,ee=(N=!1)=>{const V=N?g:v,$=V.curLineCount-e*ys,ue=V.curCharInLine*Fc,ge=$*Ve+Ye+Y;return re.pos.add(ve.pos).add(ue,ge)},oe=a.add([a.text("_",{size:16}),pe(()=>ee()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Te=a.add([a.text("_",{size:16}),pe(()=>ee(!0)),a.opacity(he.practiceMode?0:1),a.anchor("left"),a.color(pa)]);_e(oe),he.practiceMode||_e(Te);function _e(N){a.loop(.5,()=>{N.opacity=N.opacity===0?.8:0})}v.cursorPointer=oe,g.cursorPointer=Te;function ut(){return Xt&&Xt[n]?Xt[n]:(console.error("dialogs.json is undefined or out of range"),Xt[0])}const At=N=>{if(a.debug.inspect!==!0)return;const V=N[v.cursorPos],$=N.substring(0,v.cursorPos),ue=N.substring(v.cursorPos+1);console.log(`%c${$}%c${V}%c${ue}`,"color: inherit;","color: #f00;","color: inherit;")};function ht(){if(n++,n>0&&St++,c+=.05,Xe(),St===Us){St=Us,k(),T(),l.stop(),a.go("endgame");return}const N=ca,V=Sc,$=4;if(St>0){const It=Math.min(St,$)/$;s=N*Math.pow(V/N,It)}else s=N;a.play,v.reset(),g.reset(),j.pos=a.vec2(j.pos.x,K),_It.name===ge)||ws[0];const et=ue.blocks;i.lineCount=et.length,Tn=et.join("");const ct=S(Tn);Rt=ct,ve.text=Rt,tt=Tn.replace(/▯/g," "),Rt=ct,ve.text=Rt,v.line=tt.split(` -`)[0],g.line=v.line,zs=ue.title,oe.updatePos(),Te.updatePos()}function Xe(){l.speed=c}function le(){Rt=tt.split("").map((N,V)=>Et.includes(V)?N===` -`?`${Pn[V]} -`:Pn[V]:N).join(""),Rt=S(Rt),ve.text=Rt}function Ie(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos++,V.curCharInLine++,V.cursorPointer.pos=ee(N),At(tt))}function Le(N=!1){const V=N?g:v;V.cursorPointer&&(V.cursorPos--,V.curCharInLine--,V.cursorPointer.pos=ee(N),At(tt))}function U(){a.shake(2),he.mute||a.play("wrong_typing")}function H(N=!1){var ge;const V=N?g:v;if(!V.cursorPointer)return;V.curLineCount++,v.curLineCount>=ys*(e+1)&&e++,N||qn++;const $=tt.split(` -`)[V.curLineCount];if(!$)return;const ue=((ge=$.match(/^\s+/))==null?void 0:ge[0].length)||0;V.line=$,V.cursorPos+=ue,V.curIdentSize=ue,V.curCharInLine=ue,ve.updatePos(),V.cursorPointer.pos=ee(N),oe.updatePos(),Te.updatePos()}function X(){tt[g.cursorPos]===` -`?(Ie(!0),H(!0)):Ie(!0)}function ae(N){for(let V=N.length-1;V>0;V--){const $=Math.floor(Math.random()*(V+1));[N[V],N[$]]=[N[$],N[V]]}return N}function Pe(){E.text=Bt.toFixed(1),Bt>0&&Yt>5&&(tn=Yt&&Bt>1?Yt/5/(Bt/60):0,Ln=qn&&Bt>1?qn/(Bt/60):0,yr=kn>0?Yt/kn*100:100,isNaN(yr)&&(yr=100),A.text=Math.round(tn||0).toString())}const xe=60;let $e=new Array(xe).fill(0),lr=Math.floor(a.time());function vn(){let N=Math.floor(a.time());if(N!==lr){for(let $=lr+1;$<=N;$++){let ue=$%xe;$e[ue]=0}lr=N}let V=N%xe;$e[V]++}a.onKeyPress(N=>{if(tt[v.cursorPos],(v.cursorPos>0?tt[v.cursorPos]:"")===` -`)return;const $=tt[v.cursorPos],ue=a.isKeyDown("shift");let ge=N,et,ct=!1;if(!(ge==="backspace"||ge==="enter"||ge==="shift")){if(ge.length===1)ge=ue?ge.toUpperCase():ge,et=ge;else if(ge==="space")ge=" ",et="_";else return;if(kn++,ct=ge===$,ct)he.mute||a.play("code_sound"),Yt++,vn(),Ie();else{if(Et.length>Pc)return U();Et.push(v.cursorPos),Pn[v.cursorPos]=et,le(),Ie(),a.shake(2),he.mute||a.play("wrong_typing"),xs++}!Cn&&(Yt>0||xs>0)&&(Cn=!0)}}),a.onKeyPress("enter",()=>{const V=tt[v.cursorPos]===` -`;if(Et.length>0||!V)return U();if(v.curLineCount>=i.lineCount-1)return ht();Ie(),H()}),a.onKeyPressRepeat("backspace",()=>{if(!(v.cursorPos<=0)){if(v.curCharInLine===v.curIdentSize&&v.curLineCount>0)return a.shake(2);Le(),Et.includes(v.cursorPos)&&(Et=Et.filter(N=>N!==v.cursorPos)),le()}}),a.onResize(()=>{for(const N of Zt.resizableObjects)N.is("resizablePos")&&N.updatePos(),N.is("resizableRect")&&N.updateRectSize()}),ht()};a.scene("game",Oc);a.scene("endgame",()=>{let t=18,e=Hu,r=zs,n=parseFloat((zu||0).toFixed(0)),s=parseFloat((Vu||0).toFixed(0)),i=parseFloat((Gu||0).toFixed(0));parseFloat((ju||0).toFixed(0));const l=Nu()||{},c=Math.max(parseFloat(l.bestWpm)||0,n);n=parseFloat((n||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),qc({wpm:n,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:js}),Ns(he.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,p=.01,y=100;let m;function v(){if(clearInterval(m),he.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),B=a.width()*.1,f=a.height()*.2,w=(R,L)=>pe(()=>g().add(a.vec2(R,L))),S=-B-45,k=f*.45,T=t+20,P=4*t*.6;a.add([a.sprite("bg2"),a.pos(g()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(g()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+B-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(n.toFixed(0),{size:42}),w(-B,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,k),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+P+20,k),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,k+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+P+20,k+T),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+B,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${Us}`,{size:42}),w(+B,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+B,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(r,{size:t}),w(+B,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const A=t+15;js.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),pe(()=>a.vec2(a.width()*.45,a.height()*.78+L*A)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const E=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);he.mute?(E.opacity=0,M.opacity=1,v()):(E.opacity=1,M.opacity=0,v()),a.add([a.text("ESC to retry",{size:20}),pe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,r="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,r=a.height()*.4+20,n=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),pe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. +`]},{id:18,title:"twoSum",language:"golang",blocks:[`func twoSum(nums []int, target int) []int { +`,` m := map[int]int{} +`,` for i, n := range nums { +`,` if j, ok := m[target-n]; ok { +`,` return []int{j, i} +`,` } +`,` m[n] = i +`,` } +`,` return nil +`,`} +`]},{id:19,title:"isPalindrome",language:"golang",blocks:[`func isPalindrome(x int) bool { +`,` if x < 0 { +`,` return false +`,` } +`,` orig, rev := x, 0 +`,` for x > 0 { +`,` rev = rev*10 + x%10 +`,` x /= 10 +`,` } +`,` return rev == orig +`,`} +`]},{id:20,title:"longestCommonPrefix",language:"golang",blocks:[`func longestCommonPrefix(strs []string) string { +`,` if len(strs) == 0 { +`,` return "" +`,` } +`,` pref := strs[0] +`,` for _, s := range strs[1:] { +`,` i := 0 +`,` for i < len(pref) && i < len(s) && pref[i] == s[i] { +`,` i++ +`,` } +`,` pref = pref[:i] +`,` if pref == "" { +`,` break +`,` } +`,` } +`,` return pref +`,`} +`]},{id:21,title:"mergeTwoLists",language:"golang",blocks:[`func mergeTwoLists(l1, l2 *ListNode) *ListNode { +`,` d := &ListNode{} +`,` cur := d +`,` for l1 != nil && l2 != nil { +`,` if l1.Val < l2.Val { +`,` cur.Next, l1 = l1, l1.Next +`,` } else { +`,` cur.Next, l2 = l2, l2.Next +`,` } +`,` cur = cur.Next +`,` } +`,` if l1 != nil { +`,` cur.Next = l1 +`,` } else { +`,` cur.Next = l2 +`,` } +`,` return d.Next +`,`} +`]},{id:22,title:"removeDuplicates",language:"golang",blocks:[`func removeDuplicates(nums []int) int { +`,` i := 1 +`,` for j := 1; j < len(nums); j++ { +`,` if nums[j] != nums[i-1] { +`,` nums[i], i = nums[j], i+1 +`,` } +`,` } +`,` return i +`,`} +`]},{id:23,title:"strStr",language:"golang",blocks:[`func strStr(haystack, needle string) int { +`,` if len(needle) == 0 { +`,` return 0 +`,` } +`,` for i := 0; i+len(needle) <= len(haystack); i++ { +`,` if haystack[i:i+len(needle)] == needle { +`,` return i +`,` } +`,` } +`,` return -1 +`,`} +`]},{id:24,title:"searchInsert",language:"golang",blocks:[`func searchInsert(nums []int, target int) int { +`,` l, r := 0, len(nums)-1 +`,` for l <= r { +`,` m := (l + r) / 2 +`,` if nums[m] == target { +`,` return m +`,` } +`,` if nums[m] < target { +`,` l = m + 1 +`,` } else { +`,` r = m - 1 +`,` } +`,` } +`,` return l +`,`} +`]},{id:25,title:"lengthOfLastWord",language:"golang",blocks:[`func lengthOfLastWord(s string) int { +`,` l := 0 +`,` for i := len(s) - 1; i >= 0; i-- { +`,` if s[i] != ' ' { +`,` l++ +`,` } else if l > 0 { +`,` break +`,` } +`,` } +`,` return l +`,`} +`]},{id:26,title:"plusOne",language:"golang",blocks:[`func plusOne(digits []int) []int { +`,` for i := len(digits) - 1; i >= 0; i-- { +`,` digits[i]++ +`,` if digits[i] < 10 { +`,` return digits +`,` } +`,` digits[i] = 0 +`,` } +`,` return append([]int{1}, digits...) +`,`} +`]},{id:27,title:"addBinary",language:"golang",blocks:[`func addBinary(a, b string) string { +`,` i, j, carry := len(a)-1, len(b)-1, 0 +`,` res := "" +`,` for i >= 0 || j >= 0 || carry > 0 { +`,` sum := carry +`,` if i >= 0 { +`,` sum += int(a[i] - '0') +`,` i-- +`,` } +`,` if j >= 0 { +`,` sum += int(b[j] - '0') +`,` j-- +`,` } +`,` res = string('0'+sum%2) + res +`,` carry = sum / 2 +`,` } +`,` return res +`,`} +`]},{id:28,title:"mySqrt",language:"golang",blocks:[`func mySqrt(x int) int { +`,` l, r := 0, x +`,` for l <= r { +`,` m := (l + r) / 2 +`,` if m*m <= x { +`,` l = m + 1 +`,` } else { +`,` r = m - 1 +`,` } +`,` } +`,` return r +`,`} +`]},{id:29,title:"climbStairs",language:"golang",blocks:[`func climbStairs(n int) int { +`,` if n <= 3 { +`,` return n +`,` } +`,` a, b := 2, 3 +`,` for i := 4; i <= n; i++ { +`,` a, b = b, a+b +`,` } +`,` return b +`,`} +`]},{id:30,title:"deleteDuplicatesList",language:"golang",blocks:[`func deleteDuplicatesList(head *ListNode) *ListNode { +`,` cur := head +`,` for cur != nil && cur.Next != nil { +`,` if cur.Val == cur.Next.Val { +`,` cur.Next = cur.Next.Next +`,` } else { +`,` cur = cur.Next +`,` } +`,` } +`,` return head +`,`} +`]},{id:31,title:"mergeSortedArray",language:"golang",blocks:[`func merge(nums1 []int, m int, nums2 []int, n int) { +`,` i, j, k := m-1, n-1, m+n-1 +`,` for j >= 0 { +`,` if i >= 0 && nums1[i] > nums2[j] { +`,` nums1[k] = nums1[i] +`,` i-- +`,` } else { +`,` nums1[k] = nums2[j] +`,` j-- +`,` } +`,` k-- +`,` } +`,`} +`]},{id:32,title:"inorderTraversal",language:"golang",blocks:[`func inorderTraversal(root *TreeNode) []int { +`,` res := []int{} +`,` var dfs func(*TreeNode) +`,` dfs = func(n *TreeNode) { +`,` if n == nil { +`,` return +`,` } +`,` dfs(n.Left) +`,` res = append(res, n.Val) +`,` dfs(n.Right) +`,` } +`,` dfs(root) +`,` return res +`,`} +`]},{id:33,title:"isSameTree",language:"golang",blocks:[`func isSameTree(p, q *TreeNode) bool { +`,` if p == nil || q == nil { +`,` return p == q +`,` } +`,` if p.Val != q.Val { +`,` return false +`,` } +`,` return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right) +`,`} +`]},{id:34,title:"isSymmetric",language:"golang",blocks:[`func isSymmetric(root *TreeNode) bool { +`,` var check func(a, b *TreeNode) bool +`,` check = func(a, b *TreeNode) bool { +`,` if a == nil || b == nil { +`,` return a == b +`,` } +`,` if a.Val != b.Val { +`,` return false +`,` } +`,` return check(a.Left, b.Right) && check(a.Right, b.Left) +`,` } +`,` if root == nil { +`,` return true +`,` } +`,` return check(root.Left, root.Right) +`,`} +`]},{id:35,title:"twoSum",language:"python",blocks:[`def twoSum(nums, target): +`,` lookup = {} +`,` for i, num in enumerate(nums): +`,` other = target - num +`,` if other in lookup: +`,` return [lookup[other], i] +`,` lookup[num] = i +`,` return [] +`]},{id:36,title:"isPalindrome",language:"python",blocks:[`def isPalindrome(x): +`,` if x < 0: +`,` return False +`,` original, rev = x, 0 +`,` while x > 0: +`,` rev = rev * 10 + (x % 10) +`,` x //= 10 +`,` return rev == original +`]},{id:37,title:"longestCommonPrefix",language:"python",blocks:[`def longestCommonPrefix(strs): +`,` if not strs: return "" +`,` prefix = strs[0] +`,` for s in strs[1:]: +`,` i = 0 +`,` while i < len(prefix) and i < len(s) and prefix[i] == s[i]: +`,` i += 1 +`,` prefix = prefix[:i] +`,` if not prefix: +`,` break +`,` return prefix +`]},{id:38,title:"mergeTwoLists",language:"python",blocks:[`def mergeTwoLists(l1, l2): +`,` dummy = ListNode() +`,` cur = dummy +`,` while l1 and l2: +`,` if l1.val <= l2.val: +`,` cur.next, l1 = l1, l1.next +`,` else: +`,` cur.next, l2 = l2, l2.next +`,` cur = cur.next +`,` cur.next = l1 or l2 +`,` return dummy.next +`]},{id:39,title:"removeDuplicates",language:"python",blocks:[`def removeDuplicates(nums): +`,` if not nums: return 0 +`,` i = 1 +`,` for j in range(1, len(nums)): +`,` if nums[j] != nums[i - 1]: +`,` nums[i] = nums[j] +`,` i += 1 +`,` return i +`]},{id:40,title:"strStr",language:"python",blocks:[`def strStr(haystack, needle): +`,` if len(needle) == 0: +`,` return 0 +`,` for i in range(len(haystack) - len(needle) + 1): +`,` if haystack[i:i + len(needle)] == needle: +`,` return i +`,` return -1 +`]},{id:41,title:"searchInsert",language:"python",blocks:[`def searchInsert(nums, target): +`,` left, right = 0, len(nums) - 1 +`,` while left <= right: +`,` mid = (left + right) // 2 +`,` if nums[mid] == target: +`,` return mid +`,` elif nums[mid] < target: +`,` left = mid + 1 +`,` else: +`,` right = mid - 1 +`,` return left +`]},{id:42,title:"lengthOfLastWord",language:"python",blocks:[`def lengthOfLastWord(s): +`,` length = 0 +`,` for i in range(len(s) - 1, -1, -1): +`,` if s[i] != ' ': +`,` length += 1 +`,` elif length > 0: +`,` break +`,` return length +`]},{id:43,title:"plusOne",language:"python",blocks:[`def plusOne(digits): +`,` n = len(digits) +`,` for i in range(n - 1, -1, -1): +`,` if digits[i] < 9: +`,` digits[i] += 1 +`,` return digits +`,` digits[i] = 0 +`,` return [1] + digits +`]},{id:44,title:"addBinary",language:"python",blocks:[`def addBinary(a, b): +`,` i, j, carry = len(a) - 1, len(b) - 1, 0 +`,` res = [] +`,` while i >= 0 || j >= 0 || carry: +`,` s = carry +`,` if i >= 0: +`,` s += int(a[i]) +`,` i -= 1 +`,` if j >= 0: +`,` s += int(b[j]) +`,` j -= 1 +`,` res.append(str(s % 2)) +`,` carry = s // 2 +`,` return ''.join(reversed(res)) +`]},{id:45,title:"mySqrt",language:"python",blocks:[`def mySqrt(x): +`,` left, right = 0, x +`,` ans = 0 +`,` while left <= right: +`,` mid = (left + right) // 2 +`,` if mid * mid <= x: +`,` ans = mid +`,` left = mid + 1 +`,` else: +`,` right = mid - 1 +`,` return ans +`]},{id:46,title:"climbStairs",language:"python",blocks:[`def climbStairs(n): +`,` if n <= 3: +`,` return n +`,` prev2, prev1 = 2, 3 +`,` for _ in range(4, n + 1): +`,` next_val = prev1 + prev2 +`,` prev2 = prev1 +`,` prev1 = next_val +`,` return prev1 +`]},{id:47,title:"deleteDuplicates",language:"python",blocks:[`def deleteDuplicates(head): +`,` cur = head +`,` while cur and cur.next: +`,` if cur.val == cur.next.val: +`,` cur.next = cur.next.next +`,` else: +`,` cur = cur.next +`,` return head +`]},{id:48,title:"mergeSortedArray",language:"python",blocks:[`def merge(nums1, m, nums2, n): +`,` # Modifica nums1 en sitio +`,` i, j, k = m - 1, n - 1, m + n - 1 +`,` while j >= 0: +`,` if i >= 0 and nums1[i] > nums2[j]: +`,` nums1[k] = nums1[i] +`,` i -= 1 +`,` else: +`,` nums1[k] = nums2[j] +`,` j -= 1 +`,` k -= 1 +`]},{id:49,title:"inorderTraversal",language:"python",blocks:[`def inorderTraversal(root): +`,` res = [] +`,` def dfs(node): +`,` if not node: +`,` return +`,` dfs(node.left) +`,` res.append(node.val) +`,` dfs(node.right) +`,` dfs(root) +`,` return res +`]},{id:50,title:"isSameTree",language:"python",blocks:[`def isSameTree(p, q): +`,` if not p and not q: +`,` return True +`,` if not p or not q or p.val != q.val: +`,` return False +`,` return isSameTree(p.left, q.left) and isSameTree(p.right, q.right) +`]},{id:51,title:"isSymmetric",language:"python",blocks:[`def isSymmetric(root): +`,` def isMirror(a, b): +`,` if not a and not b: +`,` return True +`,` if not a or not b or a.val != b.val: +`,` return False +`,` return isMirror(a.left, b.right) and isMirror(a.right, b.left) +`,` if not root: +`,` return True +`,` return isMirror(root.left, root.right) +`]}],ga=.35,qc=.18,Tc=60,zs=5,Ic=1,Bc=28,pa=Cc,Rc=.15,ys=.15,Sr=.05,ws=5,xs=40,Qt={resizableObjects:[],timeLeft:0};let dr=!1;function Fc(){dr=!dr}function ma(t){dr=t}function Oc(t){const e=t.isKeyDown("shift");return e&&!dr||!e&&dr}function Wt(t){return t.replace(/\\/g,"\\\\")}function Yr(t,e){t.shake(2),e!=null&&e.mute||t.play("wrong_typing")}function Lc(t){for(let e=t.length-1;e>0;e--){const n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}function ya(t,e){t.loop(.5,()=>{e.opacity=e.opacity===0?.8:0})}const As=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly|def|pass|lambda|nonlocal|global|assert|del|is|not|and|or|True|False|None|elif|except|raise|finally|continue|break|with|as|in|try|yield|await)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],de=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Dc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Vs=t=>{localStorage.setItem("playMute",JSON.stringify(t))},wa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},re={mute:!1,practiceMode:!1,isCapsOn:!1,rivalSpeed:0,language:"js"};function Nc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_05.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,n=800,r=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+n/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const g=i+80,y=30;let m=0;if(re.mute=wa(),a.setVolume(re.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Nc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),de(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const E=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g)),a.opacity(1),a.z(21)]),p=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y)),a.opacity(1),a.z(21)]),T=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u+250,g+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);$();const C=a.add([a.text("←",{size:22}),de(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function I(){switch(m){case 0:t=["about","github","start"];break;case 1:t=["yes","no"];break;case 2:t=["javascript","python","golang"];break;case 3:t=["interview","practice"];break}E.text=m===0?"Start":m===1?"Play with Audio?":m===2?"Language":"Game Mode",p.text=t[0],T.text=t[1],m===2?f.text=t[2]:f.text="",te()}function k(K){if(K!==""){const ce=t.find(Fe=>Fe.startsWith(K.toLowerCase()));if(ce)return ce}return{1:"yes",2:"javascript",3:"interview"}[m]||"start"}function x(K){const oe=K.pos.y+h,ce=K.pos.x+K.text.length*16;C.pos=a.vec2(ce,oe),C.animate("pos",[a.vec2(ce,oe),a.vec2(ce+10,oe)],{duration:.5,loop:!0,direction:"ping-pong"})}let v="Start",M=v.length;const R=14,L=a.width()/2.88-(M-1)*R/2;let D=[],O=[];te();function z(){D.forEach(K=>a.destroy(K)),O.forEach(K=>a.destroy(K)),D=[],O=[];for(let K=0;K{K===Se&&(Fe.color=a.rgb(3,255,87),ce=Fe)}),ce?(C.opacity=1,x(ce)):oe.length?(C.opacity=1,x(oe[0].obj)):C.opacity=0}re.mute=wa(),a.setVolume(re.mute?0:.5),w.opacity=re.mute?0:1,S.opacity=re.mute?1:0;const H=a.add([a.text("",{size:e}),a.pos(L,r),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(H.pos.x-30,r),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function $(){w.opacity=re.mute?0:1,S.opacity=re.mute?1:0}let Q="",ne=0,Y="";function ee(K){var Ce;const oe=k(K);(!K||oe.toLowerCase().startsWith(K.toLowerCase()))&&oe!==v&&(v=oe,M=v.length,z());let ce=0,Fe=-1;for(let he=0;hev.length,Qe=K.length>Q.length&&ce>=Se,nt=ce>=2&&K.length>Fe+1;if(tt||Qe){Yr(a,re),Y=Q,H.text=Wt(Y);return}if(ce>ne&&Yr(a,re),ne=ce,nt){Y=K.slice(0,Fe+1),H.text=Wt(Y);return}switch(Y=K,Q=Y,D.forEach((he,Ue)=>{const N=v[Ue],V=K[Ue],X=V?V===" "&&N!==" "?"_":V:N;he.text=Wt(X),he.color=V?V.toLowerCase()!==N.toLowerCase()||V===" "&&N!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),O.forEach((he,Ue)=>{Ue===K.length?(he.color=a.rgb(3,255,87),he.opacity=Math.abs(Math.sin(a.time()*5))):he.opacity=0}),K.toLowerCase()){case"javascript":case"python":case"golang":if(m===2){re.language=K.toLowerCase(),Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),De());break;case"about":m===0&&(window.removeEventListener("keydown",Ne),a.go("about"));break;case"start":if(m===0){Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"yes":m===1&&(re.mute=!1,Vs(!1),a.setVolume(.5),$(),Ie());break;case"no":m===1&&(re.mute=!0,Vs(!0),a.setVolume(0),$(),Ie());break;case"interview":m===3&&(window.removeEventListener("keydown",Ne),ma(re.isCapsOn),a.go("game"));break;case"practice":m===3&&(re.practiceMode=!0,ma(re.isCapsOn),window.removeEventListener("keydown",Ne),a.go("game"));break}te()}function W(K){Y="",Q="",ne=0,I(),v=K,M=v.length,z(),te(),H.text=""}function De(){m=0,W("Start")}function He(){switch(m){case 1:W("Yes");break;case 2:W("javascript");break;case 3:W("Interview");break;default:W(t[0]);break}}function Ie(){m++,He()}let Ne;function Je(){Ne=K=>{K.getModifierState&&typeof K.getModifierState=="function"&&(re.isCapsOn=K.getModifierState("CapsLock")),K.key.length===1&&(Q=Y,Y+=K.key,H.text=Wt(Y),ee(Y),K.key!==" "&&!re.mute&&a.play("code_sound")),K.key===" "&&(K.preventDefault(),Q=Y,Y+=" ",H.text=Wt(Y),ee(Y))},window.addEventListener("keydown",Ne)}a.onKeyPress("backspace",()=>{Y&&(Y=Y.slice(0,-1),H.text=Wt(Y),ee(Y))}),a.onKeyPress("space",()=>{Q=Y,Y+=" ",H.text=Wt(Y),ee(Y)}),a.onKeyDown("escape",()=>{De()}),a.onUpdate(()=>{O.forEach((K,oe)=>{oe===Y.length?(K.color=a.rgb(3,255,87),K.opacity=Math.abs(Math.sin(a.time()*5))):K.opacity=0})}),I(),Je()});let Uc=a.Color.fromHex("#6a717d"),xa=a.YELLOW,jc=a.Color.RED,Mt=0,vs=18,zc=16.4,St=[],Mr={},kr=!1,$n=0,Or=0,pn=0,Lr=0,Yt=0,bs=0,Pr=0,Cr=0,Bt=0,Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt,Gs="",Hs=[],qr="",dn="",gt="",Es=[];const Vc=t=>{Ec(bc,()=>{Sc()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,n=As[0],r=-1,s=re.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,g=100;let y;const m=pa.filter(U=>(U.language||"default")===re.language),E=Lc([...m]);Hs=E.slice(0,ws).map(U=>U.title);const p={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{p.cursorPos=0,p.line="",p.curLineCount=0,p.curCharInLine=0,p.curIdentSize=0,p.cursorPointer&&(p.cursorPointer.pos=Se())}},T={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{T.cursorPos=0,T.line="",T.curLineCount=0,T.curCharInLine=0,T.curIdentSize=0,T.cursorPointer&&(T.cursorPointer.pos=Se(!0))}},f=(U,G)=>{const{tokens:J,associations:le}=n,{cursorPos:me}=p,{cursorPos:Ze}=T;if(St.includes(U))return jc;if(!re.practiceMode&&(U===Ze||U>me-1&&Ume-1)return Uc;const At=[{test:()=>le.brackets.test(G),color:J.brackets},{test:()=>le.operators.test(G),color:J.operators},{test:()=>le.punctuation.test(G),color:J.punctuation},{test:()=>G==='"'||G==="'",color:J.strings}];for(const{test:fe,color:qe}of At)if(fe())return a.Color.fromHex(qe);let ct="";for(const fe of Es)if(U>=fe.start&&Ule.tags.test(fe),color:J.tags},{test:fe=>le.numbers.test(fe),color:J.numbers},{test:fe=>le.classes.test(fe),color:J.classes},{test:fe=>le.functions.test(fe),color:J.functions},{test:fe=>le.keywords.test(fe),color:J.keywords},{test:fe=>le.strings.test(fe),color:J.strings},{test:fe=>/^[A-Za-z_$][\w$]*$/.test(fe),color:J.variables}];for(const{test:fe,color:qe}of Ar)if(fe(ct))return a.Color.fromHex(qe);return a.Color.fromHex(J.text)};let w=0;a.onUpdate(()=>{if(be(),!kr){C();return}if(Bt+=a.dt(),!re.practiceMode){if(w+=a.dt(),w{UG+J,0)/5}function I(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(U){const G=/[\w$]+|[^\s\w]/g;Es=[];for(const J of U.matchAll(G))Es.push({text:J[0],start:J.index,end:J.index+J[0].length})}function x(){Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt}function v(){kr=!1,Mt=0,Bt=0,$n=0,Lr=0,Or=0,pn=0,Yt=0,bs=0,Pr=0,Cr=0,s=ga,St=[],Mr={}}function M(){const U=a.get("menuItem");for(let G=0;Ga.vec2(0,0),L=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),D=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(re.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(re.practiceMode?0:1)]),a.add([de(R),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const O=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),z=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),te={javascript:"icon_02",ts:"icon_01",golang:"icon_03",react:"icon_04",python:"icon_05",default:"icon_02"},H=pa.filter(U=>(U.language||"default")===re.language).map(U=>({title:U.title,language:U.language||"default"}));H.slice(0,ws).forEach(({title:U,language:G},J)=>{const le=te[G]??te.default;a.add([a.sprite(le),de(()=>a.vec2(a.width()*.02,a.height()*(Rc+Sr*J))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*(ys+Sr*J))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:J}])}),re.mute?(O.opacity=0,z.opacity=1,S()):(O.opacity=1,z.opacity=0,S()),a.onKeyPress(["escape"],()=>{l.stop(),v(),a.go("game")});const Q=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ys-Sr*.5)),a.opacity(1),a.animate()]);let ne=-1,Y=Q.pos.y;function ee(){const U=a.height()*(ys+Sr*ne);Q.pos=a.vec2(Q.pos.x,U),Q.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(G=>{G.menuIndex===ne?G.color=a.YELLOW:G.color=a.WHITE})}const W=()=>a.vec2(a.width(),a.height()),De=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),He=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),de(De),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const Ie=a.add([Dc(W),de(De),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),Ne=()=>a.vec2(He).sub(0,Bc*(xs*e)),Je=Ie.add([a.text("",{size:vs,lineSpacing:12,letterSpacing:2,transform:(U,G)=>({color:f(U,G)})}),a.pos(0,0),de(Ne)]),oe=vs+12,ce=(oe-vs)/2,Fe=10,Se=(U=!1)=>{const G=U?T:p,J=G.curLineCount-e*xs,le=G.curCharInLine*zc,me=J*oe+ce+Fe;return Ie.pos.add(Je.pos).add(le,me)},tt=a.add([a.text("_",{size:16}),de(()=>Se()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Qe=a.add([a.text("_",{size:16}),de(()=>Se(!0)),a.opacity(re.practiceMode?0:1),a.anchor("left"),a.color(xa)]);ya(a,tt),re.practiceMode||ya(a,Qe),p.cursorPointer=tt,T.cursorPointer=Qe;function nt(){return E[r]?E[r]:(console.error("No dialogs found for the selected language"),E[0])}const Ce=U=>{if(a.debug.inspect!==!0)return;const G=U[p.cursorPos],J=U.substring(0,p.cursorPos),le=U.substring(p.cursorPos+1);console.log(`%c${J}%c${G}%c${le}`,"color: inherit;","color: #f00;","color: inherit;")};function he(){if(r++,r>0&&Mt++,c+=.05,Ue(),Mt===zs){Mt=zs,x(),v(),l.stop(),a.go("endgame");return}const U=ga,G=qc,J=4;if(Mt>0){const ct=Math.min(Mt,J)/J;s=U*Math.pow(G/U,ct)}else s=U;p.reset(),T.reset(),Q.pos=a.vec2(Q.pos.x,Y),nect.name===me)||As[0];const Ze=le.blocks;i.lineCount=Ze.length,qr=Ze.join(""),k(qr);const At=I(qr);gt=qr.replace(/▯/g," "),dn=At,Je.text=dn,p.line=gt.split(` +`)[0],T.line=p.line,Gs=le.title,tt.updatePos(),Qe.updatePos()}function Ue(){l.speed=c}function N(){dn=gt.split("").map((U,G)=>St.includes(G)?U===` +`?`${Mr[G]} +`:Mr[G]:U).join(""),dn=I(dn),Je.text=dn}function V(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos++,G.curCharInLine++,G.cursorPointer.pos=Se(U),Ce(gt))}function X(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos--,G.curCharInLine--,G.cursorPointer.pos=Se(U),Ce(gt))}function ie(U=!1){var me;const G=U?T:p;if(!G.cursorPointer)return;G.curLineCount++,p.curLineCount>=xs*(e+1)&&e++,U||Cr++;const J=gt.split(` +`)[G.curLineCount];if(!J)return;const le=((me=J.match(/^\s+/))==null?void 0:me[0].length)||0;G.line=J,G.cursorPos+=le,G.curIdentSize=le,G.curCharInLine=le,Je.updatePos(),G.cursorPointer.pos=Se(U),tt.updatePos(),Qe.updatePos()}function Me(){gt[T.cursorPos]===` +`?(V(!0),ie(!0)):V(!0)}function be(){D.text=Bt.toFixed(1),Bt>0&&Yt>5&&($n=Yt&&Bt>1?Yt/5/(Bt/60):0,Or=Cr&&Bt>1?Cr/(Bt/60):0,pn=Pr>0?Yt/Pr*100:100,isNaN(pn)&&(pn=100),L.text=Math.round($n||0).toString())}const rt=60;let ln=new Array(rt).fill(0),un=Math.floor(a.time());function xr(){let U=Math.floor(a.time());if(U!==un){for(let J=un+1;J<=U;J++){let le=J%rt;ln[le]=0}un=U}let G=U%rt;ln[G]++}a.onKeyPress("capslock",()=>{Fc()}),a.onKeyPress(U=>{if((p.cursorPos>0?gt[p.cursorPos]:"")===` +`)return;const J=gt[p.cursorPos],le=Oc(a);let me=U,Ze,At=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=le?me.toUpperCase():me.toLowerCase(),Ze=me;else if(me==="space")me=" ",Ze="_";else return;if(Pr++,At=me===J,At)re.mute||a.play("code_sound"),Yt++,xr(),V();else{if(St.length>Ic)return Yr(a,re);St.push(p.cursorPos),Mr[p.cursorPos]=Ze,N(),V(),a.shake(2),re.mute||a.play("wrong_typing"),bs++}!kr&&(Yt>0||bs>0)&&(kr=!0)}}),a.onKeyPress("enter",()=>{const G=gt[p.cursorPos]===` +`;if(St.length>0||!G)return Yr(a,re);if(p.curLineCount>=i.lineCount-1)return he();V(),ie()}),a.onKeyPressRepeat("backspace",()=>{if(!(p.cursorPos<=0)){if(p.curCharInLine===p.curIdentSize&&p.curLineCount>0)return a.shake(2);X(),St.includes(p.cursorPos)&&(St=St.filter(U=>U!==p.cursorPos)),N()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),he(),M(),ee()};a.scene("game",Vc);const Gc=({wpm:t,lpm:e,acc:n,bestWpm:r,blockNames:s,bestLvl:i})=>{const l=Ju(),c={wpm:t,lpm:e,acc:n,bestLvl:i,bestWpm:Math.max(r,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Ju=()=>{const t="playerData=",e=document.cookie.split("; ").find(n=>n.startsWith(t));if(!e)return null;try{const n=e.substring(t.length);return JSON.parse(decodeURIComponent(n))}catch(n){return console.error("Error parsing playerData cookie:",n),null}};a.scene("endgame",()=>{let t=18,e=Xu,n=Gs,r=parseFloat((Hu||0).toFixed(0)),s=parseFloat((Wu||0).toFixed(0)),i=parseFloat((Yu||0).toFixed(0));parseFloat((Ku||0).toFixed(0));const l=Ju()||{},c=Math.max(parseFloat(l.bestWpm)||0,r);r=parseFloat((r||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Gc({wpm:r,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:Hs}),Vs(re.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,g=.01,y=100;let m;function E(){if(clearInterval(m),re.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),T=a.width()*.1,f=a.height()*.2,w=(R,L)=>de(()=>p().add(a.vec2(R,L))),S=-T-45,C=f*.45,I=t+20,k=4*t*.6;a.add([a.sprite("bg2"),a.pos(p()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(p()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(r.toFixed(0),{size:42}),w(-T,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+k+20,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+k+20,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${zs}`,{size:42}),w(+T,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+T,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(n,{size:t}),w(+T,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const x=t+15;Hs.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),de(()=>a.vec2(a.width()*.45,a.height()*.78+L*x)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const v=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(v.opacity=0,M.opacity=1,E()):(v.opacity=1,M.opacity=0,E()),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,n="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,n=a.height()*.4+20,r=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. @@ -315,7 +689,7 @@ Many developers get publicly angry at the suggestion that typing speed is irrele WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment. -To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:n,width:t,align:"left",lineSpacing:s}),a.pos(e,r),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=r+17.5*(n+s)+10,c=a.add([a.text(i,{size:n,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);he.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),pe(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),pe(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Ku=document.createElement("style");Ku.innerHTML=` +To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:r,width:t,align:"left",lineSpacing:s}),a.pos(e,n),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=n+17.5*(r+s)+10,c=a.add([a.text(i,{size:r,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),de(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),de(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Qu=document.createElement("style");Qu.innerHTML=` :root { --bg: hsl(0, 3.60%, 11.00%); --gray1: #0a080a; @@ -348,5 +722,5 @@ To beat this game you will need to master touch-typing, and fix hand positioning backdrop-filter: blur(10px); z-index: -1; } - `;document.head.appendChild(Ku);a.go("selection"); -//# sourceMappingURL=index-BlZgGNiy.js.map + `;document.head.appendChild(Qu);a.go("selection"); +//# sourceMappingURL=index-D-Wfc2C4.js.map From e0a2e25e8a3334a7ecd05ca8b538a1ed87397071 Mon Sep 17 00:00:00 2001 From: jorge Date: Sat, 7 Jun 2025 21:43:04 -0300 Subject: [PATCH 20/22] fix a Python code sample --- game/src/data/CodeBlocks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/data/CodeBlocks.json b/game/src/data/CodeBlocks.json index 1c3cae2..287e63f 100644 --- a/game/src/data/CodeBlocks.json +++ b/game/src/data/CodeBlocks.json @@ -842,7 +842,7 @@ "def addBinary(a, b):\n", " i, j, carry = len(a) - 1, len(b) - 1, 0\n", " res = []\n", - " while i >= 0 || j >= 0 || carry:\n", + " while i >= 0 or j >= 0 or carry:\n", " s = carry\n", " if i >= 0:\n", " s += int(a[i])\n", From 6aeabc2ad69fabc180e0239e4a6f965b86f9b9af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Pujia?= Date: Thu, 12 Jun 2025 17:08:27 -0300 Subject: [PATCH 21/22] add react challenges --- game/src/data/CodeBlocks.json | 371 +++++++++++++++++++++++++++++++++- 1 file changed, 369 insertions(+), 2 deletions(-) diff --git a/game/src/data/CodeBlocks.json b/game/src/data/CodeBlocks.json index 287e63f..89c0251 100644 --- a/game/src/data/CodeBlocks.json +++ b/game/src/data/CodeBlocks.json @@ -691,7 +691,7 @@ "}\n" ] }, - { + { "id": 35, "title": "twoSum", "language": "python", @@ -889,7 +889,7 @@ " return prev1\n" ] }, - { + { "id": 47, "title": "deleteDuplicates", "language": "python", @@ -968,5 +968,372 @@ " return True\n", " return isMirror(root.left, root.right)\n" ] + }, + { + "id": 52, + "title": "Counter", + "language": "react", + "blocks": [ + "import { useState, useCallback } from 'react';\n", + "export default function App() {\n", + " const [count, setCount] = useState(0);\n", + " const update = useCallback((e) => {\n", + " const change = parseInt(e.currentTarget.dataset.change ?? '0');\n", + " setCount(currentCount => currentCount + change);\n", + " }, []);\n", + " return (\n", + "
\n", + " \n", + " \n", + "

Clicked: {count}

\n", + "
\n", + " );\n", + "}\n" + ] + }, + { + "id": 53, + "title": "Submit Form", + "language": "react", + "blocks": [ + "import { useState } from 'react';\n", + "export default function SubmitForm() {\n", + " const [formData, setFormData] = useState({ name: '', email: '' });\n", + " const handleChange = (e) => {\n", + " setFormData({ ...formData, [e.target.name]: e.target.value });\n", + " };\n", + " const handleSubmit = (e) => {\n", + " e.preventDefault();\n", + " alert(`Name: ${formData.name}, Email: ${formData.email}`);\n", + " };\n", + " return (\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + " );\n", + "}\n" + ] + }, + { + "id": 54, + "title": "Toggle Visibility", + "language": "react", + "blocks": [ + "import { useState } from 'react';\n", + "export default function ToggleVisibility() {\n", + " const [isVisible, setIsVisible] = useState(true);\n", + " const toggle = () => setIsVisible(!isVisible);\n", + " return (\n", + "
\n", + " \n", + " {isVisible &&

Now you see me!

}\n", + "
\n", + " );\n", + "}\n" + ] + }, + { + "id": 55, + "title": "Character Counter", + "language": "react", + "blocks": [ + "import { useState } from 'react';\n", + "export default function CharCounter() {\n", + " const [text, setText] = useState('');\n", + " return (\n", + "
\n", + "