diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index 5c5dae06..7352662f 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -20,3 +20,4 @@ jobs: with: check_filenames: true check_hidden: false + skip: extensions/arcade-canvas/game/phaser.min.js diff --git a/extensions/arcade-canvas/README.md b/extensions/arcade-canvas/README.md new file mode 100644 index 00000000..398ff9e2 --- /dev/null +++ b/extensions/arcade-canvas/README.md @@ -0,0 +1,68 @@ +# Agent Arcade Canvas + +A GitHub Copilot canvas that opens a retro arcade in the side panel. It serves the built Agent Arcade Phaser frontend and lets either the user or the agent switch between five mini-games. + +## Games + +- **Alien Onslaught** — Space Invaders-style arcade action with marching aliens, shields, and mystery ships. +- **Cosmic Rocks** — Asteroids-style vector shooter with thrust physics and splitting asteroids. +- **Galaxy Blaster** — Galaga-style space shooter with formation enemies, attack patterns, and dual-shot power-up. +- **Ninja Runner** — Classic platformer with double jumps, power-ups, warp pipes, and enemies. +- **Planet Guardian** — Defender-style side-scrolling shooter with humanoid rescues and six enemy types. + +## Files + +- `extension.mjs` — canvas declaration, loopback game server, static asset handling, and agent actions. +- `game/` — compiled Phaser game frontend served inside the canvas. +- `assets/` — game sprites, sounds, app icon, and `preview.png` for the extensions gallery. +- `package.json` — declares the Copilot SDK dependency and ESM entry point. +- `copilot-extension.json` — Copilot extension name/version metadata. +- `canvas.json` — Awesome Copilot gallery metadata. + +## Prerequisites + +- **Node.js 20.19 or newer** because the Copilot SDK requires `node ^20.19.0 || >=22.12.0`. +- The GitHub Copilot app canvas / UI-extensions experiment enabled. + +## Install + +Drop this folder at `~/.copilot/extensions/arcade-canvas/` for user scope, or in a repository at `.github/extensions/arcade-canvas/` for project scope. Then install dependencies from inside the copied folder: + +```sh +# User scope +cd ~/.copilot/extensions/arcade-canvas + +# Or project scope, from the repository root +cd .github/extensions/arcade-canvas + +npm install +``` + +Reload extensions in the GitHub Copilot app, then open the `arcade-canvas` canvas. The canvas accepts an optional `defaultGame` input with one of these keys: `cosmic-rocks`, `alien-onslaught`, `galaxy-blaster`, `ninja-runner`, or `defender`. + +## Agent actions + +- `list_games` — list available mini-games and the currently selected game. +- `select_game { gameKey }` — switch the open arcade canvas to a specific mini-game. +- `restart_game` — reload the open arcade canvas to restart the current game. + +## Development + +In the Agent Arcade repository, rebuild the committed canvas bundle after frontend or asset changes: + +```sh +npm run build:canvas +``` + +That command builds the frontend, copies `dist/game` into `game/`, copies `dist/assets` into `assets/`, writes `assets/preview.png` for the Awesome Copilot gallery, and bundles `assets/canvas-background.webp` for the canvas-only space backdrop. + +## Credits + +- Sprite assets: [Simple Platformer 16](https://juhosprite.itch.io/simple-platformer-16) by JuhoSprite. +- Space shooter assets: [Space Shooter Redux](https://opengameart.org/content/space-shooter-redux) by Kenney.nl. +- Galaga-style game mechanics: [WesleyEdwards/galaga](https://github.com/WesleyEdwards/galaga) by Wesley Edwards. +- Asteroids-style game mechanics: [phaser3-typescript](https://github.com/digitsensitive/phaser3-typescript) by digitsensitive. +- Defender-style game mechanics and sound effects: [OpenDefender](https://github.com/mkinney/Opendefender) by mkinney. +- Retro game sound effects: ["Retro game sound effects"](https://opengameart.org/content/retro-game-sound-effects) by Vircon32 (Carra), published at OpenGameArt under [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). +- Thanks to [John Papa](https://github.com/johnpapa) for his Alien Onslaught game PR. +- Thanks to [Shayne Boyer](https://github.com/spboyer) for the initial PR to get Agent Arcade running in the GitHub App canvas. diff --git a/extensions/arcade-canvas/assets/asset-.md b/extensions/arcade-canvas/assets/asset-.md new file mode 100644 index 00000000..88354f6f --- /dev/null +++ b/extensions/arcade-canvas/assets/asset-.md @@ -0,0 +1,6 @@ +https://opengameart.org/content/space-shooter-redux +https://opengameart.org/content/2d-nature-platformer-tileset-16x16 +https://opengameart.org/content/retro-game-sound-effects +https://github.com/digitsensitive/phaser3-typescript +https://github.com/WesleyEdwards/galaga +https://juhosprite.itch.io/simple-platformer-16 \ No newline at end of file diff --git a/extensions/arcade-canvas/assets/canvas-background.webp b/extensions/arcade-canvas/assets/canvas-background.webp new file mode 100644 index 00000000..1c26723c Binary files /dev/null and b/extensions/arcade-canvas/assets/canvas-background.webp differ diff --git a/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_explosion.ogg b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_explosion.ogg new file mode 100644 index 00000000..019e5366 Binary files /dev/null and b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_explosion.ogg differ diff --git a/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_laser1.ogg b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_laser1.ogg new file mode 100644 index 00000000..7a9a4d2f Binary files /dev/null and b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_laser1.ogg differ diff --git a/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_lose.ogg b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_lose.ogg new file mode 100644 index 00000000..496968f8 Binary files /dev/null and b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_lose.ogg differ diff --git a/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_twoTone.ogg b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_twoTone.ogg new file mode 100644 index 00000000..20274928 Binary files /dev/null and b/extensions/arcade-canvas/assets/cosmic-rocks/sounds/sfx_twoTone.ogg differ diff --git a/extensions/arcade-canvas/assets/defender/baiter.png b/extensions/arcade-canvas/assets/defender/baiter.png new file mode 100644 index 00000000..d52ec970 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/baiter.png differ diff --git a/extensions/arcade-canvas/assets/defender/bomber.png b/extensions/arcade-canvas/assets/defender/bomber.png new file mode 100644 index 00000000..77608d79 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/bomber.png differ diff --git a/extensions/arcade-canvas/assets/defender/humanoid.png b/extensions/arcade-canvas/assets/defender/humanoid.png new file mode 100644 index 00000000..7c9d97aa Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/humanoid.png differ diff --git a/extensions/arcade-canvas/assets/defender/lander.png b/extensions/arcade-canvas/assets/defender/lander.png new file mode 100644 index 00000000..d0c6b8b3 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/lander.png differ diff --git a/extensions/arcade-canvas/assets/defender/mutant.png b/extensions/arcade-canvas/assets/defender/mutant.png new file mode 100644 index 00000000..959b5b77 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/mutant.png differ diff --git a/extensions/arcade-canvas/assets/defender/planet-guard-sprites.png b/extensions/arcade-canvas/assets/defender/planet-guard-sprites.png new file mode 100644 index 00000000..da6e941c Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/planet-guard-sprites.png differ diff --git a/extensions/arcade-canvas/assets/defender/pod.png b/extensions/arcade-canvas/assets/defender/pod.png new file mode 100644 index 00000000..5b175afd Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/pod.png differ diff --git a/extensions/arcade-canvas/assets/defender/ship.png b/extensions/arcade-canvas/assets/defender/ship.png new file mode 100644 index 00000000..7cd194d4 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/ship.png differ diff --git a/extensions/arcade-canvas/assets/defender/ship_left.png b/extensions/arcade-canvas/assets/defender/ship_left.png new file mode 100644 index 00000000..5f613e6f Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/ship_left.png differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_baiterwarning.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_baiterwarning.wav new file mode 100644 index 00000000..56c8f132 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_baiterwarning.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_bonus.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_bonus.wav new file mode 100644 index 00000000..e59cabcd Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_bonus.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_enemydead.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_enemydead.wav new file mode 100644 index 00000000..2b040f02 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_enemydead.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot.wav new file mode 100644 index 00000000..2cb093c5 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot2.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot2.wav new file mode 100644 index 00000000..6af509c0 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_enemyshoot2.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_explode.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_explode.wav new file mode 100644 index 00000000..b71312b8 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_explode.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_humanoiddead.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_humanoiddead.wav new file mode 100644 index 00000000..2ca8bff5 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_humanoiddead.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_laser.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_laser.wav new file mode 100644 index 00000000..8ff327cb Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_laser.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_player1up.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_player1up.wav new file mode 100644 index 00000000..e8fbc478 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_player1up.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_playerdead.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_playerdead.wav new file mode 100644 index 00000000..8dc6cc70 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_playerdead.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_start.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_start.wav new file mode 100644 index 00000000..93345fb6 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_start.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_thurst.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_thurst.wav new file mode 100644 index 00000000..afc3a004 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_thurst.wav differ diff --git a/extensions/arcade-canvas/assets/defender/sounds/sound_warning.wav b/extensions/arcade-canvas/assets/defender/sounds/sound_warning.wav new file mode 100644 index 00000000..ffaef7f9 Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/sounds/sound_warning.wav differ diff --git a/extensions/arcade-canvas/assets/defender/swarmer.png b/extensions/arcade-canvas/assets/defender/swarmer.png new file mode 100644 index 00000000..41b439af Binary files /dev/null and b/extensions/arcade-canvas/assets/defender/swarmer.png differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_explosion.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_explosion.ogg new file mode 100644 index 00000000..019e5366 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_explosion.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser1.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser1.ogg new file mode 100644 index 00000000..7a9a4d2f Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser1.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser2.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser2.ogg new file mode 100644 index 00000000..6a2d4c5a Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_laser2.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_lose.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_lose.ogg new file mode 100644 index 00000000..496968f8 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_lose.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldDown.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldDown.ogg new file mode 100644 index 00000000..e3a7a514 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldDown.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldUp.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldUp.ogg new file mode 100644 index 00000000..49fdb6cc Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_shieldUp.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_twoTone.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_twoTone.ogg new file mode 100644 index 00000000..20274928 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_twoTone.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_zap.ogg b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_zap.ogg new file mode 100644 index 00000000..3f6250d3 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/sounds/sfx_zap.ogg differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_bg.png b/extensions/arcade-canvas/assets/galaxy-blaster/space_bg.png new file mode 100644 index 00000000..d9c3fd42 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/space_bg.png differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2-black.png b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2-black.png new file mode 100644 index 00000000..4a209137 Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2-black.png differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.png b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.png new file mode 100644 index 00000000..90636b8b Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.png differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.xml b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.xml new file mode 100644 index 00000000..c7751658 --- /dev/null +++ b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet-2.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.png b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.png new file mode 100644 index 00000000..8c58b86c Binary files /dev/null and b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.png differ diff --git a/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.xml b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.xml new file mode 100644 index 00000000..71e1ccf1 --- /dev/null +++ b/extensions/arcade-canvas/assets/galaxy-blaster/space_sheet.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/arcade-canvas/assets/icon.png b/extensions/arcade-canvas/assets/icon.png new file mode 100644 index 00000000..43d071c5 Binary files /dev/null and b/extensions/arcade-canvas/assets/icon.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/background.png b/extensions/arcade-canvas/assets/ninja-runner/background.png new file mode 100644 index 00000000..9715a333 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/background.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/big_bush.png b/extensions/arcade-canvas/assets/ninja-runner/big_bush.png new file mode 100644 index 00000000..b1d517ed Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/big_bush.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/bridge.png b/extensions/arcade-canvas/assets/ninja-runner/bridge.png new file mode 100644 index 00000000..b34648d2 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/bridge.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/brown_block.png b/extensions/arcade-canvas/assets/ninja-runner/brown_block.png new file mode 100644 index 00000000..5983f8d9 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/brown_block.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/clouds.png b/extensions/arcade-canvas/assets/ninja-runner/clouds.png new file mode 100644 index 00000000..e69c8707 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/clouds.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/coin_sheet.png b/extensions/arcade-canvas/assets/ninja-runner/coin_sheet.png new file mode 100644 index 00000000..56166bb0 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/coin_sheet.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/dirt_block.png b/extensions/arcade-canvas/assets/ninja-runner/dirt_block.png new file mode 100644 index 00000000..0b7dd760 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/dirt_block.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/enemy_short_strip.png b/extensions/arcade-canvas/assets/ninja-runner/enemy_short_strip.png new file mode 100644 index 00000000..81d85d06 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/enemy_short_strip.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/enemy_strip.png b/extensions/arcade-canvas/assets/ninja-runner/enemy_strip.png new file mode 100644 index 00000000..50993a03 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/enemy_strip.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/enemy_tall_strip.png b/extensions/arcade-canvas/assets/ninja-runner/enemy_tall_strip.png new file mode 100644 index 00000000..7ea3effa Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/enemy_tall_strip.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/flag.png b/extensions/arcade-canvas/assets/ninja-runner/flag.png new file mode 100644 index 00000000..627396a3 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/flag.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/grass_block.png b/extensions/arcade-canvas/assets/ninja-runner/grass_block.png new file mode 100644 index 00000000..51c2a71d Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/grass_block.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/heart_sheet.png b/extensions/arcade-canvas/assets/ninja-runner/heart_sheet.png new file mode 100644 index 00000000..12c18859 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/heart_sheet.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/hill_0.png b/extensions/arcade-canvas/assets/ninja-runner/hill_0.png new file mode 100644 index 00000000..f555564c Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/hill_0.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/hill_1.png b/extensions/arcade-canvas/assets/ninja-runner/hill_1.png new file mode 100644 index 00000000..41117d27 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/hill_1.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/impact_sheet.png b/extensions/arcade-canvas/assets/ninja-runner/impact_sheet.png new file mode 100644 index 00000000..6039534c Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/impact_sheet.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/platform.png b/extensions/arcade-canvas/assets/ninja-runner/platform.png new file mode 100644 index 00000000..65e01a5b Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/platform.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/player_strip.png b/extensions/arcade-canvas/assets/ninja-runner/player_strip.png new file mode 100644 index 00000000..d283d3e4 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/player_strip.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/qblock_new.png b/extensions/arcade-canvas/assets/ninja-runner/qblock_new.png new file mode 100644 index 00000000..4248ee22 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/qblock_new.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/small_bush.png b/extensions/arcade-canvas/assets/ninja-runner/small_bush.png new file mode 100644 index 00000000..4537481b Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/small_bush.png differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowClub.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowClub.m4a new file mode 100644 index 00000000..64c74137 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowClub.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowDull.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowDull.m4a new file mode 100644 index 00000000..70fa9200 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBlowDull.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBonus.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBonus.m4a new file mode 100644 index 00000000..fe27d29e Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBonus.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBounce.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBounce.m4a new file mode 100644 index 00000000..17f68dc0 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundBounce.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundClick.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundClick.m4a new file mode 100644 index 00000000..de0201b4 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundClick.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCoin.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCoin.m4a new file mode 100644 index 00000000..a618d277 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCoin.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCountdown.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCountdown.m4a new file mode 100644 index 00000000..e60c1a1b Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundCountdown.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundDeath.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundDeath.m4a new file mode 100644 index 00000000..3169fd36 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundDeath.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyDeath.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyDeath.m4a new file mode 100644 index 00000000..52e7c450 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyDeath.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyHit.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyHit.m4a new file mode 100644 index 00000000..62dc862d Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyHit.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyShot.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyShot.m4a new file mode 100644 index 00000000..e0f75433 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundEnemyShot.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionLarge.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionLarge.m4a new file mode 100644 index 00000000..bd9ab8f9 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionLarge.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionSmall.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionSmall.m4a new file mode 100644 index 00000000..a1deff03 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundExplosionSmall.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallDull.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallDull.m4a new file mode 100644 index 00000000..18bca3a2 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallDull.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallLoud.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallLoud.m4a new file mode 100644 index 00000000..985d0023 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFallLoud.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapHeavy.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapHeavy.m4a new file mode 100644 index 00000000..1baec410 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapHeavy.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapLight.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapLight.m4a new file mode 100644 index 00000000..ed9d6e91 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundFlapLight.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundGameOver.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundGameOver.m4a new file mode 100644 index 00000000..6eef0fa1 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundGameOver.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundHurryUp.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundHurryUp.m4a new file mode 100644 index 00000000..eecc63ff Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundHurryUp.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump1.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump1.m4a new file mode 100644 index 00000000..dca05b48 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump1.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump2.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump2.m4a new file mode 100644 index 00000000..4ed62c9c Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJump2.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJumpHah.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJumpHah.m4a new file mode 100644 index 00000000..aa36cdb7 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundJumpHah.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand1.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand1.m4a new file mode 100644 index 00000000..280d6f13 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand1.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand2.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand2.m4a new file mode 100644 index 00000000..e29c317b Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLand2.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLandHeavy.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLandHeavy.m4a new file mode 100644 index 00000000..890d6192 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLandHeavy.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLaser.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLaser.m4a new file mode 100644 index 00000000..8b3d9179 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundLaser.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMechanism.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMechanism.m4a new file mode 100644 index 00000000..7a54bc32 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMechanism.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMissile.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMissile.m4a new file mode 100644 index 00000000..2f5a5f50 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundMissile.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundObjectFall.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundObjectFall.m4a new file mode 100644 index 00000000..8713726d Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundObjectFall.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundOpenDoor.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundOpenDoor.m4a new file mode 100644 index 00000000..ea0833a8 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundOpenDoor.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundPlayerHit.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundPlayerHit.m4a new file mode 100644 index 00000000..f7171133 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundPlayerHit.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundReachGoal.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundReachGoal.m4a new file mode 100644 index 00000000..7120a4ba Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundReachGoal.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootDull.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootDull.m4a new file mode 100644 index 00000000..e0e6b35a Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootDull.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootRegular.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootRegular.m4a new file mode 100644 index 00000000..11d19112 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundShootRegular.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSlide.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSlide.m4a new file mode 100644 index 00000000..513fe130 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSlide.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSpecialSkill.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSpecialSkill.m4a new file mode 100644 index 00000000..0b0cae7d Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSpecialSkill.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundStartLevel.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundStartLevel.m4a new file mode 100644 index 00000000..d67a38a7 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundStartLevel.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSwim.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSwim.m4a new file mode 100644 index 00000000..a44d81a5 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundSwim.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWandMagic.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWandMagic.m4a new file mode 100644 index 00000000..df2c7687 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWandMagic.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWind.m4a b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWind.m4a new file mode 100644 index 00000000..106c546e Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/sounds/SoundWind.m4a differ diff --git a/extensions/arcade-canvas/assets/ninja-runner/spikes.png b/extensions/arcade-canvas/assets/ninja-runner/spikes.png new file mode 100644 index 00000000..08a63516 Binary files /dev/null and b/extensions/arcade-canvas/assets/ninja-runner/spikes.png differ diff --git a/extensions/arcade-canvas/assets/preview.png b/extensions/arcade-canvas/assets/preview.png new file mode 100644 index 00000000..feb5404b Binary files /dev/null and b/extensions/arcade-canvas/assets/preview.png differ diff --git a/extensions/arcade-canvas/assets/sounds/Valkyrie-Drift.mp3 b/extensions/arcade-canvas/assets/sounds/Valkyrie-Drift.mp3 new file mode 100644 index 00000000..f3a22c57 Binary files /dev/null and b/extensions/arcade-canvas/assets/sounds/Valkyrie-Drift.mp3 differ diff --git a/extensions/arcade-canvas/assets/sounds/agent-arcade-voice.mp3 b/extensions/arcade-canvas/assets/sounds/agent-arcade-voice.mp3 new file mode 100644 index 00000000..9d6881b9 Binary files /dev/null and b/extensions/arcade-canvas/assets/sounds/agent-arcade-voice.mp3 differ diff --git a/extensions/arcade-canvas/assets/tray_icon.png b/extensions/arcade-canvas/assets/tray_icon.png new file mode 100644 index 00000000..ec26e637 Binary files /dev/null and b/extensions/arcade-canvas/assets/tray_icon.png differ diff --git a/extensions/arcade-canvas/assets/tray_icon_small.png b/extensions/arcade-canvas/assets/tray_icon_small.png new file mode 100644 index 00000000..4348d753 Binary files /dev/null and b/extensions/arcade-canvas/assets/tray_icon_small.png differ diff --git a/extensions/arcade-canvas/canvas.json b/extensions/arcade-canvas/canvas.json new file mode 100644 index 00000000..259a1264 --- /dev/null +++ b/extensions/arcade-canvas/canvas.json @@ -0,0 +1,24 @@ +{ + "id": "agent-arcade-canvas", + "name": "Agent Arcade", + "description": "Play five retro Phaser mini-games in a Copilot canvas while agents work.", + "version": "1.0.0", + "keywords": [ + "arcade-games", + "copilot-canvas", + "interactive-canvas", + "phaser", + "retro-games", + "session-breaks" + ], + "screenshots": { + "icon": { + "path": "assets/icon.png", + "type": "image/png" + }, + "gallery": { + "path": "assets/preview.png", + "type": "image/png" + } + } +} \ No newline at end of file diff --git a/extensions/arcade-canvas/copilot-extension.json b/extensions/arcade-canvas/copilot-extension.json new file mode 100644 index 00000000..c980a34e --- /dev/null +++ b/extensions/arcade-canvas/copilot-extension.json @@ -0,0 +1,4 @@ +{ + "name": "arcade-canvas", + "version": 1 +} diff --git a/extensions/arcade-canvas/extension.mjs b/extensions/arcade-canvas/extension.mjs new file mode 100644 index 00000000..c8c56b0c --- /dev/null +++ b/extensions/arcade-canvas/extension.mjs @@ -0,0 +1,546 @@ +import { createReadStream } from "node:fs"; +import { readFile, stat } from "node:fs/promises"; +import { createServer } from "node:http"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { CanvasError, createCanvas, joinSession } from "@github/copilot-sdk/extension"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const gameRoot = path.join(__dirname, "game"); +const assetsRoot = path.join(__dirname, "assets"); +const indexPath = path.join(gameRoot, "index.html"); +const gameJsPath = path.join(gameRoot, "game.js"); +const alienOnslaughtJsPath = path.join(gameRoot, "scenes", "AlienOnslaught.js"); +const galaxyBlasterJsPath = path.join(gameRoot, "scenes", "GalaxyBlaster.js"); + +const games = [ + { key: "cosmic-rocks", label: "Cosmic Rocks", icon: "☄️" }, + { key: "alien-onslaught", label: "Alien Onslaught", icon: "👾" }, + { key: "galaxy-blaster", label: "Galaxy Blaster", icon: "🚀" }, + { key: "ninja-runner", label: "Ninja Runner", icon: "🥷" }, + { key: "defender", label: "Planet Guardian", icon: "🛡️" }, +]; + +const gameKeys = new Set(games.map((game) => game.key)); +const defaultGame = "ninja-runner"; +const canvasBackgroundGames = ["cosmic-rocks", "alien-onslaught", "galaxy-blaster", "defender"]; +const servers = new Map(); + +function normalizeGameKey(value) { + return typeof value === "string" && gameKeys.has(value) ? value : defaultGame; +} + +function contentType(filePath) { + switch (path.extname(filePath).toLowerCase()) { + case ".html": + return "text/html; charset=utf-8"; + case ".js": + return "text/javascript; charset=utf-8"; + case ".css": + return "text/css; charset=utf-8"; + case ".json": + return "application/json; charset=utf-8"; + case ".png": + return "image/png"; + case ".webp": + return "image/webp"; + case ".xml": + return "application/xml; charset=utf-8"; + case ".mp3": + return "audio/mpeg"; + case ".ogg": + return "audio/ogg"; + case ".m4a": + return "audio/mp4"; + case ".wav": + return "audio/wav"; + default: + return "application/octet-stream"; + } +} + +function resolveUnder(root, requestPath) { + const resolved = path.resolve(root, `.${requestPath}`); + if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) { + throw new CanvasError("invalid_path", "Requested path is outside the arcade assets."); + } + return resolved; +} + +function sendJson(res, value) { + res.writeHead(200, { + "content-type": "application/json; charset=utf-8", + "cache-control": "no-store", + }); + res.end(JSON.stringify(value)); +} + +function sendNotFound(res) { + res.writeHead(404, { "content-type": "text/plain; charset=utf-8" }); + res.end("Not found"); +} + +function sendSse(res, event, data) { + res.write(`event: ${event}\n`); + res.write(`data: ${JSON.stringify(data)}\n\n`); +} + +function broadcast(entry, event, data) { + for (const client of entry.clients) { + sendSse(client, event, data); + } +} + +async function renderIndex(entry) { + const html = await readFile(indexPath, "utf8"); + const bootstrap = ``; + return html.replace('', `${bootstrap}\n `); +} + +async function renderGameJs() { + const js = await readFile(gameJsPath, "utf8"); + return js + .replaceAll("newW > 800 && newH > 400", "newW > 320 && newH > 220") + .replaceAll("game && newH > 400", "game && newH > 220") + .replaceAll("window.innerWidth > 800 && window.innerHeight > 400", "window.innerWidth > 320 && window.innerHeight > 220"); +} + +async function renderAlienOnslaughtJs() { + const js = await readFile(alienOnslaughtJsPath, "utf8"); + const layoutH = "Math.min(H, W * 3 / 4)"; + const layoutY = `((H - ${layoutH}) / 2)`; + return js + .replace("this.playerY = H * 0.92;", `this.playerY = ${layoutY} + ${layoutH} * 0.95;`) + .replace("this.alienGridY = Math.max(H * 0.20, 120);", `this.alienGridY = Math.max(${layoutY} + ${layoutH} * 0.10, 80);`) + .replace("const targetShieldH = H * 0.055;", `const targetShieldH = ${layoutH} * 0.065;`) + .replace("SCALE = Math.min(W / 1920, H / 1080);", "SCALE = Math.max(1.25, Math.min(W / 1920, H / 1080));") + .replace("this.alienCellW = Math.round(W * 0.055);", "this.alienCellW = Math.round(W * 0.068);"); +} + +async function renderGalaxyBlasterJs() { + const js = await readFile(galaxyBlasterJsPath, "utf8"); + return js + .replaceAll("SCALE = Math.min(CONV_X, CONV_Y);", "SCALE = Math.max(1.7, Math.min(CONV_X, CONV_Y));") + .replaceAll("OPPONENT_SIZE = Math.min(32 * SCALE, W / 35);", "OPPONENT_SIZE = Math.max(54, Math.min(32 * SCALE, W / 24));"); +} + +async function streamFile(res, filePath) { + const fileStat = await stat(filePath).catch(() => undefined); + if (!fileStat?.isFile()) { + sendNotFound(res); + return; + } + + res.writeHead(200, { + "content-type": contentType(filePath), + "cache-control": "no-cache", + }); + const stream = createReadStream(filePath); + stream.on("error", () => { + if (!res.headersSent) { + sendNotFound(res); + } else { + res.destroy(); + } + }); + stream.pipe(res); +} + +async function handleSelectGame(entry, req, res) { + let body = ""; + req.setEncoding("utf8"); + req.on("data", (chunk) => { + body += chunk; + }); + req.on("end", () => { + let input; + try { + input = JSON.parse(body || "{}"); + } catch { + res.writeHead(400, { "content-type": "text/plain; charset=utf-8" }); + res.end("Invalid JSON request body"); + return; + } + entry.selectedGame = normalizeGameKey(input.gameKey); + broadcast(entry, "selectGame", { gameKey: entry.selectedGame }); + sendJson(res, { selectedGame: entry.selectedGame }); + }); +} + +async function handleRequest(entry, req, res) { + const url = new URL(req.url ?? "/", entry.url); + + if (url.pathname === "/events") { + res.writeHead(200, { + "content-type": "text/event-stream; charset=utf-8", + "cache-control": "no-cache", + connection: "keep-alive", + }); + entry.clients.add(res); + sendSse(res, "selectGame", { gameKey: entry.selectedGame }); + req.on("close", () => entry.clients.delete(res)); + return; + } + + if (url.pathname === "/state") { + sendJson(res, { games, selectedGame: entry.selectedGame }); + return; + } + + if (url.pathname === "/favicon.ico") { + await streamFile(res, path.join(assetsRoot, "icon.png")); + return; + } + + if (url.pathname === "/select-game" && req.method === "POST") { + await handleSelectGame(entry, req, res); + return; + } + + try { + if (url.pathname === "/" || url.pathname === "/index.html" || url.pathname === "/game" || url.pathname === "/game/") { + res.writeHead(200, { + "content-type": "text/html; charset=utf-8", + "cache-control": "no-cache", + }); + res.end(await renderIndex(entry)); + return; + } + + if (url.pathname === "/game.js" || url.pathname === "/game/game.js") { + res.writeHead(200, { + "content-type": "text/javascript; charset=utf-8", + "cache-control": "no-cache", + }); + res.end(await renderGameJs()); + return; + } + + if (url.pathname === "/scenes/AlienOnslaught.js" || url.pathname === "/game/scenes/AlienOnslaught.js") { + res.writeHead(200, { + "content-type": "text/javascript; charset=utf-8", + "cache-control": "no-cache", + }); + res.end(await renderAlienOnslaughtJs()); + return; + } + + if (url.pathname === "/scenes/GalaxyBlaster.js" || url.pathname === "/game/scenes/GalaxyBlaster.js") { + res.writeHead(200, { + "content-type": "text/javascript; charset=utf-8", + "cache-control": "no-cache", + }); + res.end(await renderGalaxyBlasterJs()); + return; + } + + const staticPath = url.pathname.startsWith("/assets/") + ? resolveUnder(assetsRoot, url.pathname.slice("/assets".length)) + : resolveUnder(gameRoot, url.pathname.startsWith("/game/") ? url.pathname.slice("/game".length) : url.pathname); + await streamFile(res, staticPath); + } catch (error) { + if (error instanceof CanvasError) { + res.writeHead(400, { "content-type": "text/plain; charset=utf-8" }); + res.end(error.message); + return; + } + throw error; + } +} + +async function startServer(instanceId, selectedGame) { + const entry = { + clients: new Set(), + selectedGame, + server: undefined, + url: undefined, + }; + const server = createServer((req, res) => { + handleRequest(entry, req, res).catch((error) => { + res.writeHead(500, { "content-type": "text/plain; charset=utf-8" }); + res.end(error instanceof Error ? error.message : "Arcade canvas server error"); + }); + }); + entry.server = server; + + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + const address = server.address(); + const port = typeof address === "object" && address ? address.port : 0; + entry.url = `http://127.0.0.1:${port}/`; + servers.set(instanceId, entry); + return entry; +} + +function getOpenEntry(instanceId) { + const entry = servers.get(instanceId); + if (!entry) { + throw new CanvasError("arcade_not_open", "Open the Arcade canvas before invoking this action."); + } + return entry; +} + +await joinSession({ + canvases: [ + createCanvas({ + id: "arcade-canvas", + displayName: "Agent Arcade", + description: "A retro arcade canvas with five mini-games for waiting while agents work.", + inputSchema: { + type: "object", + properties: { + defaultGame: { + type: "string", + enum: games.map((game) => game.key), + description: "Game to show first.", + }, + }, + additionalProperties: false, + }, + actions: [ + { + name: "list_games", + description: "List the mini-games available in the arcade canvas.", + handler: (ctx) => { + const entry = servers.get(ctx.instanceId); + return { + games, + selectedGame: entry?.selectedGame ?? defaultGame, + }; + }, + }, + { + name: "select_game", + description: "Switch the open arcade canvas to a specific mini-game.", + inputSchema: { + type: "object", + properties: { + gameKey: { + type: "string", + enum: games.map((game) => game.key), + }, + }, + required: ["gameKey"], + additionalProperties: false, + }, + handler: (ctx) => { + const entry = getOpenEntry(ctx.instanceId); + entry.selectedGame = normalizeGameKey(ctx.input?.gameKey); + broadcast(entry, "selectGame", { gameKey: entry.selectedGame }); + return { + selectedGame: entry.selectedGame, + }; + }, + }, + { + name: "restart_game", + description: "Reload the open arcade canvas to restart the selected game.", + handler: (ctx) => { + const entry = getOpenEntry(ctx.instanceId); + broadcast(entry, "reload", {}); + return { + selectedGame: entry.selectedGame, + }; + }, + }, + ], + open: async (ctx) => { + let entry = servers.get(ctx.instanceId); + if (!entry) { + entry = await startServer(ctx.instanceId, normalizeGameKey(ctx.input?.defaultGame)); + } else if (ctx.input?.defaultGame) { + entry.selectedGame = normalizeGameKey(ctx.input.defaultGame); + } + return { + title: "Agent Arcade", + status: games.find((game) => game.key === entry.selectedGame)?.label ?? "Ready", + url: entry.url, + }; + }, + onClose: async (ctx) => { + const entry = servers.get(ctx.instanceId); + if (!entry) return; + + servers.delete(ctx.instanceId); + for (const client of entry.clients) { + client.end(); + } + await new Promise((resolve) => entry.server.close(() => resolve())); + }, + }), + ], +}); diff --git a/extensions/arcade-canvas/game/game.js b/extensions/arcade-canvas/game/game.js new file mode 100644 index 00000000..7ed254bf --- /dev/null +++ b/extensions/arcade-canvas/game/game.js @@ -0,0 +1,178 @@ +// Agent Arcade — game bootstrap and scene registry. +// Each mini-game is a Phaser Scene extending BaseScene. +import { W, H, refreshDimensions } from './scenes/BaseScene.js'; +import { NinjaRunnerScene } from './scenes/NinjaRunner.js'; +import { GalaxyBlasterScene } from './scenes/GalaxyBlaster.js'; +import { CosmicRocksScene } from './scenes/CosmicRocks.js'; +import { AlienOnslaughtScene } from './scenes/AlienOnslaught.js'; +import { PlanetGuardianScene } from './scenes/PlanetGuardian.js'; +// Registry of available games +const GAMES = [ + { key: 'cosmic-rocks', scene: CosmicRocksScene, label: '☄️ Cosmic Rocks' }, + { key: 'alien-onslaught', scene: AlienOnslaughtScene, label: '👾 Alien Onslaught' }, + { key: 'galaxy-blaster', scene: GalaxyBlasterScene, label: '🚀 Galaxy Blaster' }, + { key: 'ninja-runner', scene: NinjaRunnerScene, label: '🥷 Ninja Runner' }, + { key: 'defender', scene: PlanetGuardianScene, label: '🛡️ Planet Guardian' }, +]; +let currentGameKey; +try { + // Migrate localStorage from old "galaxy-shooter" name + const lastGame = localStorage.getItem('agentArcade_lastGame'); + if (lastGame === 'galaxy-shooter') + localStorage.setItem('agentArcade_lastGame', 'galaxy-blaster'); + const oldHi = localStorage.getItem('agentArcade_hi_galaxy-shooter'); + if (oldHi) { + localStorage.setItem('agentArcade_hi_galaxy-blaster', oldHi); + localStorage.removeItem('agentArcade_hi_galaxy-shooter'); + } + currentGameKey = localStorage.getItem('agentArcade_lastGame') || 'ninja-runner'; +} +catch { + currentGameKey = 'ninja-runner'; +} +// Validate stored key exists in registry +if (!GAMES.find(g => g.key === currentGameKey)) + currentGameKey = 'ninja-runner'; +// Create the Phaser game once the window is full-screen. +// Tauri's Rust backend resizes the window after setup — we listen for the +// `resize` event so we create the game at the correct dimensions. +let game = null; +function initGame() { + refreshDimensions(); + game = new Phaser.Game({ + type: Phaser.AUTO, + parent: 'game', + width: W, + height: H, + transparent: true, + backgroundColor: 'rgba(0,0,0,0)', + scene: GAMES.map(g => g.scene), + physics: { + default: 'arcade', + arcade: { gravity: { y: 1800 }, debug: false }, + }, + render: { pixelArt: true, antialias: false, transparent: true }, + fps: { target: 60 }, + }); + // Expose game instance for Playwright testing (no production impact) + window.__phaserGame = game; + // Start the saved game (stop the default first scene if it's different) + if (currentGameKey !== GAMES[0].key) { + game.events.once('ready', () => { + game.scene.stop(GAMES[0].key); + game.scene.start(currentGameKey); + }); + } + setupGameSwitcher(); +} +function setupGameSwitcher() { + // Expose game switcher for the HUD dropdown + window.__agentArcadeSwitchGame = (key) => { + const entry = GAMES.find(g => g.key === key); + if (!entry || key === currentGameKey) + return; + const wasPaused = document.getElementById('hud')?.classList.contains('paused') ?? false; + // Set skip flag BEFORE anything else so the Rust-triggered onResume + // won't fire scene resume callbacks on the new scene. + if (wasPaused) + window.__agentArcadeSkipResume = true; + // Stop all audio globally (covers paused sounds too) + if (game.sound) + game.sound.stopAll(); + // Remove DOM overlays from the previous scene (game-over, wave banner, ready screen) + for (const id of ['gameover-overlay', 'wave-banner', 'ready-overlay']) { + const el = document.getElementById(id); + if (el) + el.remove(); + } + // Stop current scene, start new one + game.scene.stop(currentGameKey); + game.scene.start(key); + currentGameKey = key; + try { + localStorage.setItem('agentArcade_lastGame', key); + } + catch { /* ignore */ } + // Tell Rust we're unpaused so the window expands back to full-screen. + const ab = window.agentArcade; + if (wasPaused && ab && ab.setPaused) + ab.setPaused(false); + // The cursor was over the HUD to trigger this switch, so click-through should + // stay OFF. Calling setClickThrough(false) also triggers set_focus() in Rust, + // restoring OS keyboard focus after the native + + + +
+
+ ❤️ + 3 +
+
+
+ + 0 +
+
+
+ 🏆 + 0 +
+
+
+ + + + +
+ + + + +
+ +
+ +
+ +
+ +
+ 🚀 + Version is available! + View Release + +
+ + + +
+ + + + + diff --git a/extensions/arcade-canvas/game/phaser.min.js b/extensions/arcade-canvas/game/phaser.min.js new file mode 100644 index 00000000..1a7193cf --- /dev/null +++ b/extensions/arcade-canvas/game/phaser.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Phaser",[],e):"object"==typeof exports?exports.Phaser=e():t.Phaser=e()}(this,()=>(()=>{var t={50792(t){"use strict";var e=Object.prototype.hasOwnProperty,i="~";function s(){}function r(t,e,i){this.fn=t,this.context=e,this.once=i||!1}function n(t,e,s,n,a){if("function"!=typeof s)throw new TypeError("The listener must be a function");var o=new r(s,n||t,a),h=i?i+e:e;return t._events[h]?t._events[h].fn?t._events[h]=[t._events[h],o]:t._events[h].push(o):(t._events[h]=o,t._eventsCount++),t}function a(t,e){0===--t._eventsCount?t._events=new s:delete t._events[e]}function o(){this._events=new s,this._eventsCount=0}Object.create&&(s.prototype=Object.create(null),(new s).__proto__||(i=!1)),o.prototype.eventNames=function(){var t,s,r=[];if(0===this._eventsCount)return r;for(s in t=this._events)e.call(t,s)&&r.push(i?s.slice(1):s);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},o.prototype.listeners=function(t){var e=i?i+t:t,s=this._events[e];if(!s)return[];if(s.fn)return[s.fn];for(var r=0,n=s.length,a=new Array(n);r3*Math.PI/2?p.y=1:l>Math.PI?(p.x=1,p.y=1):l>Math.PI/2&&(p.x=1);for(var g=[],m=0;m0&&u.enableFilters().filters.external.addBlur(e.blurQuality,e.blurRadius,e.blurRadius,1,void 0,e.blurSteps),d instanceof s&&d.enableFilters();var f=(e.useInternal?d.filters.internal:d.filters.external).addMask(u,e.invert);h.push(f)}return h}},11517(t,e,i){var s=i(38829);t.exports=function(t,e,i,r){for(var n=t[0],a=1;a=i;s--){var r=t[s],n=!0;for(var a in e)r[a]!==e[a]&&(n=!1);if(n)return r}return null}},94420(t,e,i){var s=i(11879),r=i(60461),n=i(95540),a=i(29747),o=new(i(41481))({sys:{queueDepthSort:a,events:{once:a}}},0,0,1,1).setOrigin(0,0);t.exports=function(t,e){void 0===e&&(e={});var i=e.hasOwnProperty("width"),a=e.hasOwnProperty("height"),h=n(e,"width",-1),l=n(e,"height",-1),u=n(e,"cellWidth",1),d=n(e,"cellHeight",u),c=n(e,"position",r.TOP_LEFT),f=n(e,"x",0),p=n(e,"y",0),g=0,m=0,v=h*u,y=l*d;o.setPosition(f,p),o.setSize(u,d);for(var x=0;x0?r(a,i):i<0&&n(a,Math.abs(i));for(var o=0;o=0;a--)t[a][e]+=i+o*s,o++;return t}},43967(t){t.exports=function(t,e,i,s,r,n){var a;void 0===s&&(s=0),void 0===r&&(r=0),void 0===n&&(n=1);var o=0,h=t.length;if(1===n)for(a=r;a=0;a--)t[a][e]=i+o*s,o++;return t}},88926(t,e,i){var s=i(28176);t.exports=function(t,e){for(var i=0;i=h||-1===l)){var c=t[l],f=c.x,p=c.y;c.x=a,c.y=o,a=f,o=p,0===r?l--:l++}}return n.x=a,n.y=o,n}},8628(t,e,i){var s=i(33680);t.exports=function(t){return s(t)}},21837(t,e,i){var s=i(7602);t.exports=function(t,e,i,r,n){void 0===n&&(n=!1);var a,o=Math.abs(r-i)/t.length;if(n)for(a=0;a0){if(0===t)this.frames=i.concat(this.frames);else if(t===this.frames.length)this.frames=this.frames.concat(i);else{var s=this.frames.slice(0,t),r=this.frames.slice(t);this.frames=s.concat(i,r)}this.updateFrameSequence()}return this},checkFrame:function(t){return t>=0&&t0){n.isLast=!0,n.nextFrame=d[0],d[0].prevFrame=n;var y=1/(d.length-1);for(a=0;a0?t.inReverse&&t.forward?t.forward=!1:this.repeatAnimation(t):t.complete():this.updateAndGetNextTick(t,e.nextFrame)},handleYoyoFrame:function(t,e){if(e||(e=!1),t.inReverse===!e&&t.repeatCounter>0)return(0===t.repeatDelay||t.pendingRepeat)&&(t.forward=e),void this.repeatAnimation(t);if(t.inReverse===e||0!==t.repeatCounter){t.forward=e;var i=e?t.currentFrame.nextFrame:t.currentFrame.prevFrame;this.updateAndGetNextTick(t,i)}else t.complete()},getLastFrame:function(){return this.frames[this.frames.length-1]},previousFrame:function(t){var e=t.currentFrame;e.isFirst?t.yoyo?this.handleYoyoFrame(t,!0):t.repeatCounter>0?(t.inReverse&&!t.forward||(t.forward=!0),this.repeatAnimation(t)):t.complete():this.updateAndGetNextTick(t,e.prevFrame)},updateAndGetNextTick:function(t,e){t.setCurrentFrame(e),this.getNextTick(t)},removeFrame:function(t){var e=this.frames.indexOf(t);return-1!==e&&this.removeFrameAt(e),this},removeFrameAt:function(t){return this.frames.splice(t,1),this.updateFrameSequence(),this},repeatAnimation:function(t){if(2===t._pendingStop){if(0===t._pendingStopValue)return t.stop();t._pendingStopValue--}t.repeatDelay>0&&!t.pendingRepeat?(t.pendingRepeat=!0,t.accumulator-=t.nextTick,t.nextTick+=t.repeatDelay):(t.repeatCounter--,t.forward?t.setCurrentFrame(t.currentFrame.nextFrame):t.setCurrentFrame(t.currentFrame.prevFrame),t.isPlaying&&(this.getNextTick(t),t.handleRepeat()))},toJSON:function(){var t={key:this.key,type:this.type,frames:[],frameRate:this.frameRate,duration:this.duration,skipMissedFrames:this.skipMissedFrames,delay:this.delay,repeat:this.repeat,repeatDelay:this.repeatDelay,yoyo:this.yoyo,showBeforeDelay:this.showBeforeDelay,showOnStart:this.showOnStart,randomFrame:this.randomFrame,hideOnComplete:this.hideOnComplete};return this.frames.forEach(function(e){t.frames.push(e.toJSON())}),t},updateFrameSequence:function(){for(var t,e=this.frames.length,i=1/(e-1),s=0;s1?(t.isLast=!0,t.prevFrame=this.frames[e-2],t.nextFrame=this.frames[0]):e>1&&(t.prevFrame=this.frames[s-1],t.nextFrame=this.frames[s+1]);return this},pause:function(){return this.paused=!0,this},resume:function(){return this.paused=!1,this},destroy:function(){this.manager.off&&(this.manager.off(n.PAUSE_ALL,this.pause,this),this.manager.off(n.RESUME_ALL,this.resume,this)),this.manager.remove(this.key);for(var t=0;t-1)){for(var p=0,g=u;g<=c;g++){var m=g.toString(),v=o[m];if(v){var y=l(v,"duration",d.MAX_SAFE_INTEGER);a.push({key:t,frame:m,duration:y}),p+=y}}"reverse"===f&&(a=a.reverse());var x,T={key:h,frames:a,duration:p,yoyo:"pingpong"===f};i?i.anims&&(x=i.anims.create(T)):x=n.create(T),x&&s.push(x)}});return s},create:function(t){var e=t.key,i=!1;return e&&((i=this.get(e))?console.warn("AnimationManager key already exists: "+e):(i=new s(this,e,t),this.anims.set(e,i),this.emit(o.ADD_ANIMATION,e,i))),i},fromJSON:function(t,e){void 0===e&&(e=!1),e&&this.anims.clear(),"string"==typeof t&&(t=JSON.parse(t));var i=[];if(t.hasOwnProperty("anims")&&Array.isArray(t.anims)){for(var s=0;sn&&(l=0),this.randomFrame&&(l=r(0,n-1));var u=s.frames[l];0!==l||this.forward||(u=s.getLastFrame()),this.currentFrame=u}else console.warn("Missing animation: "+i);return this.parent},pause:function(t){return this._paused||(this._paused=!0,this._wasPlaying=this.isPlaying,this.isPlaying=!1),void 0!==t&&this.setCurrentFrame(t),this.parent},resume:function(t){return this._paused&&(this._paused=!1,this.isPlaying=this._wasPlaying),void 0!==t&&this.setCurrentFrame(t),this.parent},playAfterDelay:function(t,e){if(this.isPlaying){var i=this.nextAnim,s=this.nextAnimsQueue;i&&s.unshift(i),this.nextAnim=t,this._pendingStop=1,this._pendingStopValue=e}else this.delayCounter=e,this.play(t,!0);return this.parent},playAfterRepeat:function(t,e){if(void 0===e&&(e=1),this.isPlaying){var i=this.nextAnim,s=this.nextAnimsQueue;i&&s.unshift(i),-1!==this.repeatCounter&&e>this.repeatCounter&&(e=this.repeatCounter),this.nextAnim=t,this._pendingStop=2,this._pendingStopValue=e}else this.play(t);return this.parent},play:function(t,e){void 0===e&&(e=!1);var i=this.currentAnim,s=this.parent,r="string"==typeof t?t:t.key;if(e&&this.isPlaying&&i.key===r)return s;if(i&&this.isPlaying){var n=this.animationManager.getMix(i.key,t);if(n>0)return this.playAfterDelay(t,n)}return this.forward=!0,this.inReverse=!1,this._paused=!1,this._wasPlaying=!0,this.startAnimation(t)},playReverse:function(t,e){void 0===e&&(e=!1);var i="string"==typeof t?t:t.key;return e&&this.isPlaying&&this.currentAnim.key===i?this.parent:(this.forward=!1,this.inReverse=!0,this._paused=!1,this._wasPlaying=!0,this.startAnimation(t))},startAnimation:function(t){this.load(t);var e=this.currentAnim,i=this.parent;return e?(this.repeatCounter=-1===this.repeat?Number.MAX_VALUE:this.repeat,e.getFirstTick(this),this.isPlaying=!0,this.pendingRepeat=!1,this.hasStarted=!1,this._pendingStop=0,this._pendingStopValue=0,this._paused=!1,this.delayCounter+=this.delay,0===this.delayCounter?this.handleStart():this.showBeforeDelay&&this.setCurrentFrame(this.currentFrame),i):i},handleStart:function(){this.showOnStart&&this.parent.setVisible(!0),this.setCurrentFrame(this.currentFrame),this.hasStarted=!0,this.emitEvents(o.ANIMATION_START)},handleRepeat:function(){this.pendingRepeat=!1,this.emitEvents(o.ANIMATION_REPEAT)},handleStop:function(){this._pendingStop=0,this.isPlaying=!1,this.emitEvents(o.ANIMATION_STOP)},handleComplete:function(){this._pendingStop=0,this.isPlaying=!1,this.hideOnComplete&&this.parent.setVisible(!1),this.emitEvents(o.ANIMATION_COMPLETE,o.ANIMATION_COMPLETE_KEY)},emitEvents:function(t,e){var i=this.currentAnim;if(i){var s=this.currentFrame,r=this.parent,n=s.textureFrame;r.emit(t,i,s,r,n),e&&r.emit(e+i.key,i,s,r,n)}},reverse:function(){return this.isPlaying&&(this.inReverse=!this.inReverse,this.forward=!this.forward),this.parent},getProgress:function(){var t=this.currentFrame;if(!t)return 0;var e=t.progress;return this.inReverse&&(e*=-1),e},setProgress:function(t){return this.forward||(t=1-t),this.setCurrentFrame(this.currentAnim.getFrameByProgress(t)),this.parent},setRepeat:function(t){return this.repeatCounter=-1===t?Number.MAX_VALUE:t,this.parent},globalRemove:function(t,e){void 0===e&&(e=this.currentAnim),this.isPlaying&&e.key===this.currentAnim.key&&(this.stop(),this.setCurrentFrame(this.currentAnim.frames[0]))},restart:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!1);var i=this.currentAnim,s=this.parent;return i?(e&&(this.repeatCounter=-1===this.repeat?Number.MAX_VALUE:this.repeat),i.getFirstTick(this),this.emitEvents(o.ANIMATION_RESTART),this.isPlaying=!0,this.pendingRepeat=!1,this.hasStarted=!t,this._pendingStop=0,this._pendingStopValue=0,this._paused=!1,this.setCurrentFrame(i.frames[0]),this.parent):s},complete:function(){if(this._pendingStop=0,this.isPlaying=!1,this.currentAnim&&this.handleComplete(),this.nextAnim){var t=this.nextAnim;this.nextAnim=this.nextAnimsQueue.length>0?this.nextAnimsQueue.shift():null,this.play(t)}return this.parent},stop:function(){if(this._pendingStop=0,this.isPlaying=!1,this.delayCounter=0,this.currentAnim&&this.handleStop(),this.nextAnim){var t=this.nextAnim;this.nextAnim=this.nextAnimsQueue.shift(),this.play(t)}return this.parent},stopAfterDelay:function(t){return this._pendingStop=1,this._pendingStopValue=t,this.parent},stopAfterRepeat:function(t){return void 0===t&&(t=1),-1!==this.repeatCounter&&t>this.repeatCounter&&(t=this.repeatCounter),this._pendingStop=2,this._pendingStopValue=t,this.parent},stopOnFrame:function(t){return this._pendingStop=3,this._pendingStopValue=t,this.parent},getTotalFrames:function(){return this.currentAnim?this.currentAnim.getTotalFrames():0},update:function(t,e){var i=this.currentAnim;if(this.isPlaying&&i&&!i.paused){if(this.accumulator+=e*this.timeScale*this.animationManager.globalTimeScale,1===this._pendingStop&&(this._pendingStopValue-=e,this._pendingStopValue<=0))return this.stop();if(this.hasStarted){if(this.accumulator>=this.nextTick&&(this.forward?i.nextFrame(this):i.previousFrame(this),this.isPlaying&&0===this._pendingStop&&this.skipMissedFrames&&this.accumulator>this.nextTick)){var s=0;do{this.forward?i.nextFrame(this):i.previousFrame(this),s++}while(this.isPlaying&&this.accumulator>this.nextTick&&s<60)}}else this.accumulator>=this.delayCounter&&(this.accumulator-=this.delayCounter,this.handleStart())}},setCurrentFrame:function(t){var e=this.parent;return this.currentFrame=t,e.texture=t.frame.texture,e.frame=t.frame,e.isCropped&&e.frame.updateCropUVs(e._crop,e.flipX,e.flipY),t.setAlpha&&(e.alpha=t.alpha),e.setSizeToFrame(),e._originComponent&&(t.frame.customPivot?e.setOrigin(t.frame.pivotX,t.frame.pivotY):e.updateDisplayOrigin()),this.isPlaying&&this.hasStarted&&(this.emitEvents(o.ANIMATION_UPDATE),3===this._pendingStop&&this._pendingStopValue===t&&this.stop()),e},nextFrame:function(){return this.currentAnim&&this.currentAnim.nextFrame(this),this.parent},previousFrame:function(){return this.currentAnim&&this.currentAnim.previousFrame(this),this.parent},get:function(t){return this.anims?this.anims.get(t):null},exists:function(t){return!!this.anims&&this.anims.has(t)},create:function(t){var e=t.key,i=!1;return e&&((i=this.get(e))?console.warn("Animation key already exists: "+e):(i=new s(this,e,t),this.anims||(this.anims=new a),this.anims.set(e,i))),i},createFromAseprite:function(t,e){return this.animationManager.createFromAseprite(t,e,this.parent)},generateFrameNames:function(t,e){return this.animationManager.generateFrameNames(t,e)},generateFrameNumbers:function(t,e){return this.animationManager.generateFrameNumbers(t,e)},remove:function(t){var e=this.get(t);return e&&(this.currentAnim===e&&this.stop(),this.anims.delete(t)),e},destroy:function(){this.animationManager.off(o.REMOVE_ANIMATION,this.globalRemove,this),this.anims&&this.anims.clear(),this.animationManager=null,this.parent=null,this.nextAnim=null,this.nextAnimsQueue.length=0,this.currentAnim=null,this.currentFrame=null},isPaused:{get:function(){return this._paused}}});t.exports=l},57090(t){t.exports="add"},25312(t){t.exports="animationcomplete"},89580(t){t.exports="animationcomplete-"},52860(t){t.exports="animationrepeat"},63850(t){t.exports="animationrestart"},99085(t){t.exports="animationstart"},28087(t){t.exports="animationstop"},1794(t){t.exports="animationupdate"},52562(t){t.exports="pauseall"},57953(t){t.exports="remove"},68339(t){t.exports="resumeall"},74943(t,e,i){t.exports={ADD_ANIMATION:i(57090),ANIMATION_COMPLETE:i(25312),ANIMATION_COMPLETE_KEY:i(89580),ANIMATION_REPEAT:i(52860),ANIMATION_RESTART:i(63850),ANIMATION_START:i(99085),ANIMATION_STOP:i(28087),ANIMATION_UPDATE:i(1794),PAUSE_ALL:i(52562),REMOVE_ANIMATION:i(57953),RESUME_ALL:i(68339)}},60421(t,e,i){t.exports={Animation:i(42099),AnimationFrame:i(41138),AnimationManager:i(60848),AnimationState:i(9674),Events:i(74943)}},2161(t,e,i){var s=i(83419),r=i(90330),n=i(50792),a=i(24736),o=new s({initialize:function(){this.entries=new r,this.events=new n},add:function(t,e){return this.entries.set(t,e),this.events.emit(a.ADD,this,t,e),this},has:function(t){return this.entries.has(t)},exists:function(t){return this.entries.has(t)},get:function(t){return this.entries.get(t)},remove:function(t){var e=this.get(t);return e&&(this.entries.delete(t),this.events.emit(a.REMOVE,this,t,e.data)),this},getKeys:function(){return this.entries.keys()},destroy:function(){this.entries.clear(),this.events.removeAllListeners(),this.entries=null,this.events=null}});t.exports=o},24047(t,e,i){var s=i(2161),r=i(83419),n=i(8443),a=new r({initialize:function(t){this.game=t,this.binary=new s,this.bitmapFont=new s,this.json=new s,this.physics=new s,this.shader=new s,this.audio=new s,this.video=new s,this.text=new s,this.html=new s,this.tilemap=new s,this.xml=new s,this.atlas=new s,this.custom={},this.game.events.once(n.DESTROY,this.destroy,this)},addCustom:function(t){return this.custom.hasOwnProperty(t)||(this.custom[t]=new s),this.custom[t]},destroy:function(){for(var t=["binary","bitmapFont","json","physics","shader","audio","video","text","html","tilemap","xml","atlas"],e=0;ef&&w*i+b*rd&&w*s+b*nr&&(t=r),t},clampY:function(t){var e=this._bounds,i=this.displayHeight,s=e.y+(i-this.height)/2,r=Math.max(s,s+e.height-i);return tr&&(t=r),t},removeBounds:function(){return this.useBounds=!1,this.dirty=!0,this._bounds.setEmpty(),this},setAngle:function(t){return void 0===t&&(t=0),this.rotation=r(t),this},setBackgroundColor:function(t){return void 0===t&&(t="rgba(0,0,0,0)"),this.backgroundColor=d(t),this.transparent=0===this.backgroundColor.alpha,this},setBounds:function(t,e,i,s,r){return void 0===r&&(r=!1),this._bounds.setTo(t,e,i,s),this.dirty=!0,this.useBounds=!0,r?this.centerToBounds():(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},setForceComposite:function(t){return this.forceComposite=t,this},getBounds:function(t){void 0===t&&(t=new o);var e=this._bounds;return t.setTo(e.x,e.y,e.width,e.height),t},setName:function(t){return void 0===t&&(t=""),this.name=t,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setRotation:function(t){return void 0===t&&(t=0),this.rotation=t,this},setRoundPixels:function(t){return this.roundPixels=t,this},setScene:function(t,e){void 0===e&&(e=!0),this.scene&&this._customViewport&&this.sceneManager.customViewports--,this.scene=t,this.isSceneCamera=e;var i=t.sys;return this.sceneManager=i.game.scene,this.scaleManager=i.scale,this.cameraManager=i.cameras,this.updateSystem(),this},setScroll:function(t,e){return void 0===e&&(e=t),this.scrollX=t,this.scrollY=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},setViewport:function(t,e,i,s){return this.x=t,this.y=e,this.width=i,this.height=s,this},setZoom:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),0===t&&(t=.001),0===e&&(e=.001),this.zoomX=t,this.zoomY=e,this},setMask:function(t,e){return void 0===e&&(e=!0),this.mask=t,this._maskCamera=e?this.cameraManager.default:this,this},clearMask:function(t){return void 0===t&&(t=!1),t&&this.mask&&this.mask.destroy(),this.mask=null,this},toJSON:function(){var t={name:this.name,x:this.x,y:this.y,width:this.width,height:this.height,zoom:this.zoom,rotation:this.rotation,roundPixels:this.roundPixels,scrollX:this.scrollX,scrollY:this.scrollY,backgroundColor:this.backgroundColor.rgba};return this.useBounds&&(t.bounds={x:this._bounds.x,y:this._bounds.y,width:this._bounds.width,height:this._bounds.height}),t},update:function(){},setIsSceneCamera:function(t){return this.isSceneCamera=t,this},updateSystem:function(){if(this.scaleManager&&this.isSceneCamera){var t=0!==this._x||0!==this._y||this.scaleManager.width!==this._width||this.scaleManager.height!==this._height,e=this.sceneManager;t&&!this._customViewport?e.customViewports++:!t&&this._customViewport&&e.customViewports--,this.dirty=!0,this._customViewport=t}},destroy:function(){this.emit(a.DESTROY,this),this.removeAllListeners(),this.matrix.destroy(),this.matrixCombined.destroy(),this.matrixExternal.destroy(),this.culledObjects=[],this._customViewport&&this.sceneManager.customViewports--,this.renderList=[],this._bounds=null,this.scene=null,this.scaleManager=null,this.sceneManager=null,this.cameraManager=null},x:{get:function(){return this._x},set:function(t){this._x=t,this.updateSystem()}},y:{get:function(){return this._y},set:function(t){this._y=t,this.updateSystem()}},width:{get:function(){return this._width},set:function(t){this._width=t,this.updateSystem()}},height:{get:function(){return this._height},set:function(t){this._height=t,this.updateSystem()}},scrollX:{get:function(){return this._scrollX},set:function(t){t!==this._scrollX&&(this._scrollX=t,this.dirty=!0)}},scrollY:{get:function(){return this._scrollY},set:function(t){t!==this._scrollY&&(this._scrollY=t,this.dirty=!0)}},zoom:{get:function(){return(this._zoomX+this._zoomY)/2},set:function(t){this._zoomX=t,this._zoomY=t,this.dirty=!0}},zoomX:{get:function(){return this._zoomX},set:function(t){this._zoomX=t,this.dirty=!0}},zoomY:{get:function(){return this._zoomY},set:function(t){this._zoomY=t,this.dirty=!0}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=t,this.dirty=!0}},centerX:{get:function(){return this.x+.5*this.width}},centerY:{get:function(){return this.y+.5*this.height}},displayWidth:{get:function(){return this.width/this.zoomX}},displayHeight:{get:function(){return this.height/this.zoomY}}});t.exports=f},38058(t,e,i){var s=i(71911),r=i(67502),n=i(45319),a=i(83419),o=i(31401),h=i(20052),l=i(19715),u=i(28915),d=i(87841),c=i(26099),f=new a({Extends:s,initialize:function(t,e,i,r){s.call(this,t,e,i,r),this.filters={internal:new o.FilterList(this),external:new o.FilterList(this)},this.isObjectInversion=!1,this.inputEnabled=!0,this.fadeEffect=new h.Fade(this),this.flashEffect=new h.Flash(this),this.shakeEffect=new h.Shake(this),this.panEffect=new h.Pan(this),this.rotateToEffect=new h.RotateTo(this),this.zoomEffect=new h.Zoom(this),this.lerp=new c(1,1),this.followOffset=new c,this.deadzone=null,this._follow=null},setDeadzone:function(t,e){if(void 0===t)this.deadzone=null;else{if(this.deadzone?(this.deadzone.width=t,this.deadzone.height=e):this.deadzone=new d(0,0,t,e),this._follow){var i=this.width/2,s=this.height/2,n=this._follow.x-this.followOffset.x,a=this._follow.y-this.followOffset.y;this.midPoint.set(n,a),this.scrollX=n-i,this.scrollY=a-s}r(this.deadzone,this.midPoint.x,this.midPoint.y)}return this},fadeIn:function(t,e,i,s,r,n){return this.fadeEffect.start(!1,t,e,i,s,!0,r,n)},fadeOut:function(t,e,i,s,r,n){return this.fadeEffect.start(!0,t,e,i,s,!0,r,n)},fadeFrom:function(t,e,i,s,r,n,a){return this.fadeEffect.start(!1,t,e,i,s,r,n,a)},fade:function(t,e,i,s,r,n,a){return this.fadeEffect.start(!0,t,e,i,s,r,n,a)},flash:function(t,e,i,s,r,n,a){return this.flashEffect.start(t,e,i,s,r,n,a)},shake:function(t,e,i,s,r){return this.shakeEffect.start(t,e,i,s,r)},pan:function(t,e,i,s,r,n,a){return this.panEffect.start(t,e,i,s,r,n,a)},rotateTo:function(t,e,i,s,r,n,a){return this.rotateToEffect.start(t,e,i,s,r,n,a)},zoomTo:function(t,e,i,s,r,n){return this.zoomEffect.start(t,e,i,s,r,n)},preRender:function(){this.renderList.length=0;var t=this.width,e=this.height,i=.5*t,s=.5*e,n=this.zoomX,a=this.zoomY;this.renderRoundPixels=this.roundPixels&&Number.isInteger(n)&&Number.isInteger(a);var o=t*this.originX,h=e*this.originY,d=this._follow,c=this.deadzone,f=this.scrollX,p=this.scrollY;c&&r(c,this.midPoint.x,this.midPoint.y);var g=!1;if(d&&!this.panEffect.isRunning){var m=this.lerp,v=d.x-this.followOffset.x,y=d.y-this.followOffset.y;c?(vc.right&&(f=u(f,f+(v-c.right),m.x)),yc.bottom&&(p=u(p,p+(y-c.bottom),m.y))):(f=u(f,v-o,m.x),p=u(p,y-h,m.y)),g=!0}this.useBounds&&(f=this.clampX(f),p=this.clampY(p)),this.scrollX=f,this.scrollY=p;var x=f+i,T=p+s;this.midPoint.set(x,T);var w=t/n,b=e/a,S=x-w/2,C=T-b/2;this.worldView.setTo(S,C,w,b);var E=this.matrix,A=this.matrixExternal;this.isObjectInversion?(E.loadIdentity(),E.translate(o,h),E.scale(n,a),E.rotate(this.rotation),E.translate(-f-o,-p-h)):(E.applyITRS(o,h,this.rotation,n,a),E.translate(-f-o,-p-h)),A.applyITRS(this.x,this.y,0,1,1),this.shakeEffect.preRender(),A.multiply(E,this.matrixCombined),g&&this.emit(l.FOLLOW_UPDATE,this,d)},getViewMatrix:function(t){return t||this.forceComposite||this.filters.external.length>0||this.filters.internal.length>0?this.matrix:this.matrixCombined},getPaddingWrapper:function(t){var e={padding:0},i=new Proxy(this,{get:function(t,i){switch(i){case"padding":return e.padding;case"x":case"y":case"scrollX":case"scrollY":return t[i]+e.padding;case"width":case"height":return t[i]-2*e.padding;default:return t[i]}},set:function(i,s,r){switch(s){case"padding":var n=e.padding;e.padding=r;var a=e.padding-n;return i.x-=a,i.y-=a,i.width+=2*a,i.height+=2*a,i.scrollX-=a,i.scrollY-=a,t;case"x":case"y":case"scrollX":case"scrollY":return i[s]=r-e.padding;case"width":case"height":return i[s]=r+2*e.padding;default:return i[s]=r}}});return i.padding=t||0,i},setLerp:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.lerp.set(t,e),this},setFollowOffset:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=0),this.followOffset.set(t,e),this},startFollow:function(t,e,i,s,r,a){void 0===e&&(e=!1),void 0===i&&(i=1),void 0===s&&(s=i),void 0===r&&(r=0),void 0===a&&(a=r),this._follow=t,this.roundPixels=e,i=n(i,0,1),s=n(s,0,1),this.lerp.set(i,s),this.followOffset.set(r,a);var o=this.width/2,h=this.height/2,l=t.x-r,u=t.y-a;return this.midPoint.set(l,u),this.scrollX=l-o,this.scrollY=u-h,this.useBounds&&(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},stopFollow:function(){return this._follow=null,this},resetFX:function(){return this.rotateToEffect.reset(),this.panEffect.reset(),this.shakeEffect.reset(),this.flashEffect.reset(),this.fadeEffect.reset(),this},update:function(t,e){this.visible&&(this.rotateToEffect.update(t,e),this.panEffect.update(t,e),this.zoomEffect.update(t,e),this.shakeEffect.update(t,e),this.flashEffect.update(t,e),this.fadeEffect.update(t,e))},destroy:function(){this.resetFX(),this.filters.internal.destroy(),this.filters.external.destroy(),s.prototype.destroy.call(this),this._follow=null,this.deadzone=null}});t.exports=f},32743(t,e,i){var s=i(38058),r=i(83419),n=i(95540),a=i(37277),o=i(37303),h=i(97480),l=i(44594),u=new r({initialize:function(t){this.scene=t,this.systems=t.sys,this.roundPixels=t.sys.game.config.roundPixels,this.cameras=[],this.main,this.default,t.sys.events.once(l.BOOT,this.boot,this),t.sys.events.on(l.START,this.start,this)},boot:function(){var t=this.systems;t.settings.cameras?this.fromJSON(t.settings.cameras):this.add(),this.main=this.cameras[0],this.default=new s(0,0,t.scale.width,t.scale.height).setScene(this.scene),t.game.scale.on(h.RESIZE,this.onResize,this),this.systems.events.once(l.DESTROY,this.destroy,this)},start:function(){if(!this.main){var t=this.systems;t.settings.cameras?this.fromJSON(t.settings.cameras):this.add(),this.main=this.cameras[0]}var e=this.systems.events;e.on(l.UPDATE,this.update,this),e.once(l.SHUTDOWN,this.shutdown,this)},add:function(t,e,i,r,n,a){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===r&&(r=this.scene.sys.scale.height),void 0===n&&(n=!1),void 0===a&&(a="");var o=new s(t,e,i,r);return o.setName(a),o.setScene(this.scene),o.setRoundPixels(this.roundPixels),o.id=this.getNextID(),this.cameras.push(o),n&&(this.main=o),o},addExisting:function(t,e){return void 0===e&&(e=!1),-1===this.cameras.indexOf(t)?(t.id=this.getNextID(),t.setRoundPixels(this.roundPixels),this.cameras.push(t),e&&(this.main=t),t):null},getNextID:function(){for(var t=this.cameras,e=1,i=0;i<32;i++){for(var s=!1,r=0;r0){n.preRender();var a=this.getVisibleChildren(e.getChildren(),n);t.render(i,a,n)}}},getVisibleChildren:function(t,e){return t.filter(function(t){return t.willRender(e)})},resetAll:function(){for(var t=0;t=0}else this.clockwise=this.destination>=this.source;return this.camera.emit(n.ROTATE_START,this.camera,this,i,this.destination),u},update:function(t,e){if(this.isRunning){this._elapsed+=e;var i=s(this._elapsed/this.duration,0,1);this.progress=i;var r=this.camera;if(this._elapsedthis.maxZoom&&(e.zoom=this.maxZoom))}},destroy:function(){this.camera=null,this.left=null,this.right=null,this.up=null,this.down=null,this.zoomIn=null,this.zoomOut=null}});t.exports=n},58818(t,e,i){var s=i(83419),r=i(35154),n=new s({initialize:function(t){this.camera=r(t,"camera",null),this.left=r(t,"left",null),this.right=r(t,"right",null),this.up=r(t,"up",null),this.down=r(t,"down",null),this.zoomIn=r(t,"zoomIn",null),this.zoomOut=r(t,"zoomOut",null),this.zoomSpeed=r(t,"zoomSpeed",.01),this.minZoom=r(t,"minZoom",.001),this.maxZoom=r(t,"maxZoom",1e3),this.accelX=0,this.accelY=0;var e=r(t,"acceleration",null);"number"==typeof e?(this.accelX=e,this.accelY=e):(this.accelX=r(t,"acceleration.x",0),this.accelY=r(t,"acceleration.y",0)),this.dragX=0,this.dragY=0;var i=r(t,"drag",null);"number"==typeof i?(this.dragX=i,this.dragY=i):(this.dragX=r(t,"drag.x",0),this.dragY=r(t,"drag.y",0)),this.maxSpeedX=0,this.maxSpeedY=0;var s=r(t,"maxSpeed",null);"number"==typeof s?(this.maxSpeedX=s,this.maxSpeedY=s):(this.maxSpeedX=r(t,"maxSpeed.x",0),this.maxSpeedY=r(t,"maxSpeed.y",0)),this._speedX=0,this._speedY=0,this._zoom=0,this.active=null!==this.camera},start:function(){return this.active=null!==this.camera,this},stop:function(){return this.active=!1,this},setCamera:function(t){return this.camera=t,this},update:function(t){if(this.active){void 0===t&&(t=1);var e=this.camera;this._speedX>0?(this._speedX-=this.dragX*t,this._speedX<0&&(this._speedX=0)):this._speedX<0&&(this._speedX+=this.dragX*t,this._speedX>0&&(this._speedX=0)),this._speedY>0?(this._speedY-=this.dragY*t,this._speedY<0&&(this._speedY=0)):this._speedY<0&&(this._speedY+=this.dragY*t,this._speedY>0&&(this._speedY=0)),this.up&&this.up.isDown?(this._speedY+=this.accelY,this._speedY>this.maxSpeedY&&(this._speedY=this.maxSpeedY)):this.down&&this.down.isDown&&(this._speedY-=this.accelY,this._speedY<-this.maxSpeedY&&(this._speedY=-this.maxSpeedY)),this.left&&this.left.isDown?(this._speedX+=this.accelX,this._speedX>this.maxSpeedX&&(this._speedX=this.maxSpeedX)):this.right&&this.right.isDown&&(this._speedX-=this.accelX,this._speedX<-this.maxSpeedX&&(this._speedX=-this.maxSpeedX)),this.zoomIn&&this.zoomIn.isDown?this._zoom=-this.zoomSpeed:this.zoomOut&&this.zoomOut.isDown?this._zoom=this.zoomSpeed:this._zoom=0,0!==this._speedX&&(e.scrollX-=this._speedX*t|0),0!==this._speedY&&(e.scrollY-=this._speedY*t|0),0!==this._zoom&&(e.zoom+=this._zoom,e.zoomthis.maxZoom&&(e.zoom=this.maxZoom))}},destroy:function(){this.camera=null,this.left=null,this.right=null,this.up=null,this.down=null,this.zoomIn=null,this.zoomOut=null}});t.exports=n},38865(t,e,i){t.exports={FixedKeyControl:i(63091),SmoothedKeyControl:i(58818)}},26638(t,e,i){t.exports={Controls:i(38865),Scene2D:i(87969)}},8054(t,e,i){var s={VERSION:"4.0.0",LOG_VERSION:"v400",BlendModes:i(10312),ScaleModes:i(29795),AUTO:0,CANVAS:1,WEBGL:2,HEADLESS:3,FOREVER:-1,NONE:4,UP:5,DOWN:6,LEFT:7,RIGHT:8};t.exports=s},69547(t,e,i){var s=i(83419),r=i(8054),n=i(42363),a=i(82264),o=i(95540),h=i(35154),l=i(41212),u=i(29747),d=i(75508),c=i(80333),f=new s({initialize:function(t){void 0===t&&(t={});var e=h(t,"scale",null);this.width=h(e,"width",1024,t),this.height=h(e,"height",768,t),this.zoom=h(e,"zoom",1,t),this.parent=h(e,"parent",void 0,t),this.scaleMode=h(e,e?"mode":"scaleMode",0,t),this.expandParent=h(e,"expandParent",!0,t),this.autoRound=h(e,"autoRound",!1,t),this.autoCenter=h(e,"autoCenter",0,t),this.resizeInterval=h(e,"resizeInterval",500,t),this.fullscreenTarget=h(e,"fullscreenTarget",null,t),this.minWidth=h(e,"min.width",0,t),this.maxWidth=h(e,"max.width",0,t),this.minHeight=h(e,"min.height",0,t),this.maxHeight=h(e,"max.height",0,t),this.snapWidth=h(e,"snap.width",0,t),this.snapHeight=h(e,"snap.height",0,t),this.renderType=h(t,"type",r.AUTO),this.canvas=h(t,"canvas",null),this.context=h(t,"context",null),this.canvasStyle=h(t,"canvasStyle",null),this.customEnvironment=h(t,"customEnvironment",!1),this.sceneConfig=h(t,"scene",null),this.seed=h(t,"seed",[(Date.now()*Math.random()).toString()]),d.RND=new d.RandomDataGenerator(this.seed),this.gameTitle=h(t,"title",""),this.gameURL=h(t,"url","https://phaser.io/"+r.LOG_VERSION),this.gameVersion=h(t,"version",""),this.autoFocus=h(t,"autoFocus",!0),this.stableSort=h(t,"stableSort",-1),-1===this.stableSort&&(this.stableSort=a.browser.es2019?1:0),a.features.stableSort=this.stableSort,this.domCreateContainer=h(t,"dom.createContainer",!1),this.domPointerEvents=h(t,"dom.pointerEvents","none"),this.inputKeyboard=h(t,"input.keyboard",!0),this.inputKeyboardEventTarget=h(t,"input.keyboard.target",window),this.inputKeyboardCapture=h(t,"input.keyboard.capture",[]),this.inputMouse=h(t,"input.mouse",!0),this.inputMouseEventTarget=h(t,"input.mouse.target",null),this.inputMousePreventDefaultDown=h(t,"input.mouse.preventDefaultDown",!0),this.inputMousePreventDefaultUp=h(t,"input.mouse.preventDefaultUp",!0),this.inputMousePreventDefaultMove=h(t,"input.mouse.preventDefaultMove",!0),this.inputMousePreventDefaultWheel=h(t,"input.mouse.preventDefaultWheel",!0),this.inputTouch=h(t,"input.touch",a.input.touch),this.inputTouchEventTarget=h(t,"input.touch.target",null),this.inputTouchCapture=h(t,"input.touch.capture",!0),this.inputActivePointers=h(t,"input.activePointers",1),this.inputSmoothFactor=h(t,"input.smoothFactor",0),this.inputWindowEvents=h(t,"input.windowEvents",!0),this.inputGamepad=h(t,"input.gamepad",!1),this.inputGamepadEventTarget=h(t,"input.gamepad.target",window),this.disableContextMenu=h(t,"disableContextMenu",!1),this.audio=h(t,"audio",{}),this.hideBanner=!1===h(t,"banner",null),this.hidePhaser=h(t,"banner.hidePhaser",!1),this.bannerTextColor=h(t,"banner.text","#ffffff"),this.bannerBackgroundColor=h(t,"banner.background",["#000814","#001d3d","#003566"]),""===this.gameTitle&&this.hidePhaser&&(this.hideBanner=!0),this.fps=h(t,"fps",null);var i=h(t,"render",null);this.autoMobileTextures=h(i,"autoMobileTextures",!0,t),this.antialias=h(i,"antialias",!0,t),this.antialiasGL=h(i,"antialiasGL",!0,t),this.mipmapFilter=h(i,"mipmapFilter","",t),this.desynchronized=h(i,"desynchronized",!1,t),this.roundPixels=h(i,"roundPixels",!1,t),this.selfShadow=h(i,"selfShadow",!1,t),this.pathDetailThreshold=h(i,"pathDetailThreshold",1,t),this.pixelArt=h(i,"pixelArt",!1,t),this.pixelArt&&(this.antialias=!1,this.antialiasGL=!1,this.roundPixels=!0),this.smoothPixelArt=h(i,"smoothPixelArt",!1,t),this.smoothPixelArt&&(this.antialias=!0,this.antialiasGL=!0,this.pixelArt=!1),this.transparent=h(i,"transparent",!1,t),this.clearBeforeRender=h(i,"clearBeforeRender",!0,t),this.preserveDrawingBuffer=h(i,"preserveDrawingBuffer",!1,t),this.premultipliedAlpha=h(i,"premultipliedAlpha",!0,t),this.skipUnreadyShaders=h(i,"skipUnreadyShaders",!1,t),this.failIfMajorPerformanceCaveat=h(i,"failIfMajorPerformanceCaveat",!1,t),this.powerPreference=h(i,"powerPreference","default",t),this.batchSize=h(i,"batchSize",16384,t),this.maxTextures=h(i,"maxTextures",-1,t),this.maxLights=h(i,"maxLights",10,t),this.renderNodes=h(i,"renderNodes",{},t);var s=h(t,"backgroundColor",0);this.backgroundColor=c(s),this.transparent&&(this.backgroundColor=c(0),this.backgroundColor.alpha=0),this.preBoot=h(t,"callbacks.preBoot",u),this.postBoot=h(t,"callbacks.postBoot",u),this.physics=h(t,"physics",{}),this.defaultPhysicsSystem=h(this.physics,"default",!1),this.loaderBaseURL=h(t,"loader.baseURL",""),this.loaderPath=h(t,"loader.path",""),this.loaderMaxParallelDownloads=h(t,"loader.maxParallelDownloads",a.os.android?6:32),this.loaderCrossOrigin=h(t,"loader.crossOrigin",void 0),this.loaderResponseType=h(t,"loader.responseType",""),this.loaderAsync=h(t,"loader.async",!0),this.loaderUser=h(t,"loader.user",""),this.loaderPassword=h(t,"loader.password",""),this.loaderTimeout=h(t,"loader.timeout",0),this.loaderMaxRetries=h(t,"loader.maxRetries",2),this.loaderWithCredentials=h(t,"loader.withCredentials",!1),this.loaderImageLoadType=h(t,"loader.imageLoadType","XHR"),this.loaderLocalScheme=h(t,"loader.localScheme",["file://","capacitor://"]),this.glowQuality=h(t,"filters.glow.quality",10),this.glowDistance=h(t,"filters.glow.distance",10),this.installGlobalPlugins=[],this.installScenePlugins=[];var f=h(t,"plugins",null),p=n.DefaultScene;f&&(Array.isArray(f)?this.defaultPlugins=f:l(f)&&(this.installGlobalPlugins=o(f,"global",[]),this.installScenePlugins=o(f,"scene",[]),Array.isArray(f.default)?p=f.default:Array.isArray(f.defaultMerge)&&(p=p.concat(f.defaultMerge)))),this.defaultPlugins=p;var g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg";this.defaultImage=h(t,"images.default",g+"AQMAAABJtOi3AAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAABVJREFUeF7NwIEAAAAAgKD9qdeocAMAoAABm3DkcAAAAABJRU5ErkJggg=="),this.missingImage=h(t,"images.missing",g+"CAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg=="),this.whiteImage=h(t,"images.white","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpi/P//PwMMMDEgAdwcgAADAJZuAwXJYZOzAAAAAElFTkSuQmCC"),window&&(window.FORCE_WEBGL?this.renderType=r.WEBGL:window.FORCE_CANVAS&&(this.renderType=r.CANVAS))}});t.exports=f},86054(t,e,i){var s=i(20623),r=i(27919),n=i(8054),a=i(89357);t.exports=function(t){var e=t.config;if((e.customEnvironment||e.canvas)&&e.renderType===n.AUTO)throw new Error("Must set explicit renderType in custom environment");if(!e.customEnvironment&&!e.canvas&&e.renderType!==n.HEADLESS)if(e.renderType===n.AUTO&&(e.renderType=a.webGL?n.WEBGL:n.CANVAS),e.renderType===n.WEBGL){if(!a.webGL)throw new Error("Cannot create WebGL context, aborting.")}else{if(e.renderType!==n.CANVAS)throw new Error("Unknown value for renderer type: "+e.renderType);if(!a.canvas)throw new Error("Cannot create Canvas context, aborting.")}e.antialias||r.disableSmoothing();var o,h,l=t.scale.baseSize,u=l.width,d=l.height;(e.canvas?(t.canvas=e.canvas,t.canvas.width=u,t.canvas.height=d):t.canvas=r.create(t,u,d,e.renderType),e.canvasStyle&&(t.canvas.style=e.canvasStyle),e.antialias||s.setCrisp(t.canvas),e.renderType!==n.HEADLESS)&&(o=i(68627),h=i(74797),e.renderType===n.WEBGL?t.renderer=new h(t):(t.renderer=new o(t),t.context=t.renderer.gameContext))}},96391(t,e,i){var s=i(8054);t.exports=function(t){var e=t.config;if(!e.hideBanner){var i="WebGL";e.renderType===s.CANVAS?i="Canvas":e.renderType===s.HEADLESS&&(i="Headless");var r,n=e.audio,a=t.device.audio;if(r=a.webAudio&&!n.disableWebAudio?"Web Audio":n.noAudio||!a.webAudio&&!a.audioData?"No Audio":"HTML5 Audio",t.device.browser.ie)window.console&&console.log("Phaser v"+s.VERSION+" / https://phaser.io");else{var o="color: "+e.bannerTextColor+";",h=Array.isArray(e.bannerBackgroundColor)?e.bannerBackgroundColor:[e.bannerBackgroundColor];1===h.length&&(h=[h[0],h[0]]),o+=' background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARBJREFUeNpi/P//P0OHsPB/BiCoePuWkYFEwALSXJElzMBgLwE2CNkQxgWr/yMr/p8QimlBu5DQ//+8vBBco/ofzAe6imH+qv/53/6jYJAYSA4ZoxoANYTPKhiuCQZwGcJU+e4dqpMmvsDq14krV2MPAxDha2CMKvoXoiE/PBQUDgQD8j82UFae9B9bOIC8B9UD9gIjjIMN7Ns6lWHn4XMoYu62RgxO3tkMjIyMII2MYAOAtmFVhA+ADHf2ycGMRhANjUq8YO+WKWCvgAORIV8CkpDCrzIwsLIymC1qAtuAD4Bsh3sBmqAY3qcGwL2AC4DCpKtzHlgzOLWihwEuzTCN0GhDJHeYC4gByBphACDAAH2dDIxdjr+VAAAAAElFTkSuQmCC"), '+("linear-gradient(to bottom, "+h.join(", ")+")")+";",o+=" background-repeat: no-repeat;",o+=" background-position: 4px center, 0 0;";var l="%c",u=[null,o+=" padding: 2px 6px 2px 24px;"];u.push("background: transparent"),e.gameTitle&&(l=l.concat(e.gameTitle),e.gameVersion&&(l=l.concat(" v"+e.gameVersion)),e.hidePhaser||(l=l.concat(" / "))),e.hidePhaser||(l=l.concat("Phaser v"+s.VERSION+" ("+i+" | "+r+")")),l=l.concat("%c "+e.gameURL),u[0]=l,console.log.apply(console,u)}}}},50127(t,e,i){var s=i(40366),r=i(60848),n=i(24047),a=i(27919),o=i(83419),h=i(69547),l=i(83719),u=i(86054),d=i(45893),c=i(96391),f=i(82264),p=i(57264),g=i(50792),m=i(8443),v=i(7003),y=i(37277),x=i(77332),T=i(76531),w=i(60903),b=i(69442),S=i(17130),C=i(65898),E=i(51085),A=i(14747),_=new o({initialize:function(t){this.config=new h(t),this.renderer=null,this.domContainer=null,this.canvas=null,this.context=null,this.isBooted=!1,this.isRunning=!1,this.events=new g,this.anims=new r(this),this.textures=new S(this),this.cache=new n(this),this.registry=new d(this,new g),this.input=new v(this,this.config),this.scene=new w(this,this.config.sceneConfig),this.device=f,this.scale=new T(this,this.config),this.sound=null,this.sound=A.create(this),this.loop=new C(this,this.config.fps),this.plugins=new x(this,this.config),this.pendingDestroy=!1,this.removeCanvas=!1,this.noReturn=!1,this.hasFocus=!1,this.isPaused=!1,p(this.boot.bind(this))},boot:function(){y.hasCore("EventEmitter")?(this.isBooted=!0,this.config.preBoot(this),this.scale.preBoot(),u(this),l(this),c(this),s(this.canvas,this.config.parent),this.textures.once(b.READY,this.texturesReady,this),this.events.emit(m.BOOT)):console.warn("Aborting. Core Plugins missing.")},texturesReady:function(){this.events.emit(m.READY),this.start()},start:function(){this.isRunning=!0,this.config.postBoot(this),this.renderer?this.loop.start(this.step.bind(this)):this.loop.start(this.headlessStep.bind(this)),E(this);var t=this.events;t.on(m.HIDDEN,this.onHidden,this),t.on(m.VISIBLE,this.onVisible,this),t.on(m.BLUR,this.onBlur,this),t.on(m.FOCUS,this.onFocus,this)},step:function(t,e){if(this.pendingDestroy)return this.runDestroy();if(!this.isPaused){var i=this.events;i.emit(m.PRE_STEP,t,e),i.emit(m.STEP,t,e),this.scene.update(t,e),i.emit(m.POST_STEP,t,e);var s=this.renderer;s.preRender(),i.emit(m.PRE_RENDER,s,t,e),this.scene.render(s),s.postRender(),i.emit(m.POST_RENDER,s,t,e)}},headlessStep:function(t,e){if(this.pendingDestroy)return this.runDestroy();if(!this.isPaused){var i=this.events;i.emit(m.PRE_STEP,t,e),i.emit(m.STEP,t,e),this.scene.update(t,e),i.emit(m.POST_STEP,t,e),this.scene.isProcessing=!1,i.emit(m.PRE_RENDER,null,t,e),i.emit(m.POST_RENDER,null,t,e)}},onHidden:function(){this.loop.pause(),this.events.emit(m.PAUSE)},pause:function(){var t=this.isPaused;this.isPaused=!0,t||this.events.emit(m.PAUSE)},onVisible:function(){this.loop.resume(),this.events.emit(m.RESUME,this.loop.pauseDuration)},resume:function(){var t=this.isPaused;this.isPaused=!1,t&&this.events.emit(m.RESUME,0)},onBlur:function(){this.hasFocus=!1,this.loop.blur()},onFocus:function(){this.hasFocus=!0,this.loop.focus()},getFrame:function(){return this.loop.frame},getTime:function(){return this.loop.now},destroy:function(t,e){void 0===e&&(e=!1),this.pendingDestroy=!0,this.removeCanvas=t,this.noReturn=e},runDestroy:function(){this.scene.destroy(),this.events.emit(m.DESTROY),this.events.removeAllListeners(),this.renderer&&this.renderer.destroy(),this.removeCanvas&&this.canvas&&(a.remove(this.canvas),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)),this.domContainer&&this.domContainer.parentNode&&this.domContainer.parentNode.removeChild(this.domContainer),this.loop.destroy(),this.pendingDestroy=!1}});t.exports=_},65898(t,e,i){var s=i(83419),r=i(35154),n=i(29747),a=i(43092),o=new s({initialize:function(t,e){this.game=t,this.raf=new a,this.started=!1,this.running=!1,this.minFps=r(e,"min",5),this.targetFps=r(e,"target",60),this.fpsLimit=r(e,"limit",0),this.hasFpsLimit=this.fpsLimit>0,this._limitRate=this.hasFpsLimit?1e3/this.fpsLimit:0,this._min=1e3/this.minFps,this._target=1e3/this.targetFps,this.actualFps=this.targetFps,this.nextFpsUpdate=0,this.framesThisSecond=0,this.callback=n,this.forceSetTimeOut=r(e,"forceSetTimeOut",!1),this.time=0,this.startTime=0,this.lastTime=0,this.frame=0,this.inFocus=!0,this.pauseDuration=0,this._pauseTime=0,this._coolDown=0,this.delta=0,this.deltaIndex=0,this.deltaHistory=[],this.deltaSmoothingMax=r(e,"deltaHistory",10),this.panicMax=r(e,"panicMax",120),this.rawDelta=0,this.now=0,this.smoothStep=r(e,"smoothStep",!0)},blur:function(){this.inFocus=!1},focus:function(){this.inFocus=!0,this.resetDelta()},pause:function(){this._pauseTime=window.performance.now()},resume:function(){this.resetDelta(),this.pauseDuration=this.time-this._pauseTime,this.startTime+=this.pauseDuration},resetDelta:function(){var t=window.performance.now();this.time=t,this.lastTime=t,this.nextFpsUpdate=t+1e3,this.framesThisSecond=0;for(var e=0;e0||!this.inFocus)&&(this._coolDown--,t=Math.min(t,this._target)),t>this._min&&(t=i[e],t=Math.min(t,this._min)),i[e]=t,this.deltaIndex++,this.deltaIndex>=s&&(this.deltaIndex=0);for(var r=0,n=0;n=this.nextFpsUpdate&&this.updateFPS(t),this.framesThisSecond++,this.delta>=this._limitRate&&(this.callback(t,this.delta),this.delta%=this._limitRate),this.lastTime=t,this.frame++},step:function(t){this.now=t;var e=Math.max(0,t-this.lastTime);this.rawDelta=e,this.time+=this.rawDelta,this.smoothStep&&(e=this.smoothDelta(e)),this.delta=e,t>=this.nextFpsUpdate&&this.updateFPS(t),this.framesThisSecond++,this.callback(t,e),this.lastTime=t,this.frame++},tick:function(){var t=window.performance.now();this.hasFpsLimit?this.stepLimitFPS(t):this.step(t)},sleep:function(){this.running&&(this.raf.stop(),this.running=!1)},wake:function(t){void 0===t&&(t=!1);var e=window.performance.now();if(!this.running){t&&(this.startTime+=-this.lastTime+(this.lastTime+e));var i=this.hasFpsLimit?this.stepLimitFPS.bind(this):this.step.bind(this);this.raf.start(i,this.forceSetTimeOut,this._target),this.running=!0,this.nextFpsUpdate=e+1e3,this.framesThisSecond=0,this.fpsLimitTriggered=!1,this.tick()}},getDuration:function(){return Math.round(this.lastTime-this.startTime)/1e3},getDurationMS:function(){return Math.round(this.lastTime-this.startTime)},stop:function(){return this.running=!1,this.started=!1,this.raf.stop(),this},destroy:function(){this.stop(),this.raf.destroy(),this.raf=null,this.game=null,this.callback=null}});t.exports=o},51085(t,e,i){var s=i(8443);t.exports=function(t){var e,i=t.events;if(void 0!==document.hidden)e="visibilitychange";else{["webkit","moz","ms"].forEach(function(t){void 0!==document[t+"Hidden"]&&(document.hidden=function(){return document[t+"Hidden"]},e=t+"visibilitychange")})}e&&document.addEventListener(e,function(t){document.hidden||"pause"===t.type?i.emit(s.HIDDEN):i.emit(s.VISIBLE)},!1),window.onblur=function(){i.emit(s.BLUR)},window.onfocus=function(){i.emit(s.FOCUS)},window.focus&&t.config.autoFocus&&window.focus()}},97217(t){t.exports="blur"},47548(t){t.exports="boot"},19814(t){t.exports="contextlost"},68446(t){t.exports="destroy"},41700(t){t.exports="focus"},25432(t){t.exports="hidden"},65942(t){t.exports="pause"},59211(t){t.exports="postrender"},47789(t){t.exports="poststep"},39066(t){t.exports="prerender"},460(t){t.exports="prestep"},16175(t){t.exports="ready"},42331(t){t.exports="resume"},11966(t){t.exports="step"},32969(t){t.exports="systemready"},94830(t){t.exports="visible"},8443(t,e,i){t.exports={BLUR:i(97217),BOOT:i(47548),CONTEXT_LOST:i(19814),DESTROY:i(68446),FOCUS:i(41700),HIDDEN:i(25432),PAUSE:i(65942),POST_RENDER:i(59211),POST_STEP:i(47789),PRE_RENDER:i(39066),PRE_STEP:i(460),READY:i(16175),RESUME:i(42331),STEP:i(11966),SYSTEM_READY:i(32969),VISIBLE:i(94830)}},42857(t,e,i){t.exports={Config:i(69547),CreateRenderer:i(86054),DebugHeader:i(96391),Events:i(8443),TimeStep:i(65898),VisibilityHandler:i(51085)}},46728(t,e,i){var s=i(83419),r=i(36316),n=i(80021),a=i(26099),o=new s({Extends:n,initialize:function(t,e,i,s){n.call(this,"CubicBezierCurve"),Array.isArray(t)&&(s=new a(t[6],t[7]),i=new a(t[4],t[5]),e=new a(t[2],t[3]),t=new a(t[0],t[1])),this.p0=t,this.p1=e,this.p2=i,this.p3=s},getStartPoint:function(t){return void 0===t&&(t=new a),t.copy(this.p0)},getResolution:function(t){return t},getPoint:function(t,e){void 0===e&&(e=new a);var i=this.p0,s=this.p1,n=this.p2,o=this.p3;return e.set(r(t,i.x,s.x,n.x,o.x),r(t,i.y,s.y,n.y,o.y))},draw:function(t,e){void 0===e&&(e=32);var i=this.getPoints(e);t.beginPath(),t.moveTo(this.p0.x,this.p0.y);for(var s=1;si&&(e=i/2);var s=Math.max(1,Math.round(i/e));return r(this.getSpacedPoints(s),t)},getDistancePoints:function(t){var e=this.getLength(),i=Math.max(1,e/t);return this.getSpacedPoints(i)},getEndPoint:function(t){return void 0===t&&(t=new a),this.getPointAt(1,t)},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,i=[],s=this.getPoint(0,this._tmpVec2A),r=0;i.push(0);for(var n=1;n<=t;n++)r+=(e=this.getPoint(n/t,this._tmpVec2B)).distance(s),i.push(r),s.copy(e);return this.cacheArcLengths=i,i},getPointAt:function(t,e){var i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t,e,i){void 0===i&&(i=[]),t||(t=e?this.getLength()/e:this.defaultDivisions);for(var s=0;s<=t;s++)i.push(this.getPoint(s/t));return i},getRandomPoint:function(t){return void 0===t&&(t=new a),this.getPoint(Math.random(),t)},getSpacedPoints:function(t,e,i){void 0===i&&(i=[]),t||(t=e?this.getLength()/e:this.defaultDivisions);for(var s=0;s<=t;s++){var r=this.getUtoTmapping(s/t,null,t);i.push(this.getPoint(r))}return i},getStartPoint:function(t){return void 0===t&&(t=new a),this.getPointAt(0,t)},getTangent:function(t,e){void 0===e&&(e=new a);var i=1e-4,s=t-i,r=t+i;return s<0&&(s=0),r>1&&(r=1),this.getPoint(s,this._tmpVec2A),this.getPoint(r,e),e.subtract(this._tmpVec2A).normalize()},getTangentAt:function(t,e){var i=this.getUtoTmapping(t);return this.getTangent(i,e)},getTFromDistance:function(t,e){return t<=0?0:this.getUtoTmapping(0,t,e)},getUtoTmapping:function(t,e,i){var s,r=this.getLengths(i),n=0,a=r.length;s=e?Math.min(e,r[a-1]):t*r[a-1];for(var o,h=0,l=a-1;h<=l;)if((o=r[n=Math.floor(h+(l-h)/2)]-s)<0)h=n+1;else{if(!(o>0)){l=n;break}l=n-1}if(r[n=l]===s)return n/(a-1);var u=r[n];return(n+(s-u)/(r[n+1]-u))/(a-1)},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()}});t.exports=o},73825(t,e,i){var s=i(83419),r=i(80021),n=i(39506),a=i(35154),o=i(43396),h=i(26099),l=new s({Extends:r,initialize:function(t,e,i,s,o,l,u,d){if("object"==typeof t){var c=t;t=a(c,"x",0),e=a(c,"y",0),i=a(c,"xRadius",0),s=a(c,"yRadius",i),o=a(c,"startAngle",0),l=a(c,"endAngle",360),u=a(c,"clockwise",!1),d=a(c,"rotation",0)}else void 0===s&&(s=i),void 0===o&&(o=0),void 0===l&&(l=360),void 0===u&&(u=!1),void 0===d&&(d=0);r.call(this,"EllipseCurve"),this.p0=new h(t,e),this._xRadius=i,this._yRadius=s,this._startAngle=n(o),this._endAngle=n(l),this._clockwise=u,this._rotation=n(d)},getStartPoint:function(t){return void 0===t&&(t=new h),this.getPoint(0,t)},getResolution:function(t){return 2*t},getPoint:function(t,e){void 0===e&&(e=new h);for(var i=2*Math.PI,s=this._endAngle-this._startAngle,r=Math.abs(s)i;)s-=i;si.length-2?i.length-1:n+1],d=i[n>i.length-3?i.length-1:n+2];return e.set(s(o,h.x,l.x,u.x,d.x),s(o,h.y,l.y,u.y,d.y))},toJSON:function(){for(var t=[],e=0;e=e)return this.curves[s];s++}return null},getEndPoint:function(t){return void 0===t&&(t=new c),this.curves.length>0?this.curves[this.curves.length-1].getPoint(1,t):t.copy(this.startPoint),t},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},getPoint:function(t,e){void 0===e&&(e=new c);for(var i=t*this.getLength(),s=this.getCurveLengths(),r=0;r=i){var n=s[r]-i,a=this.curves[r],o=a.getLength(),h=0===o?0:1-n/o;return a.getPointAt(h,e)}r++}return null},getPoints:function(t,e){t||e||(t=this.defaultDivisions);for(var i,s=[],r=0;r1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s},getRandomPoint:function(t){return void 0===t&&(t=new c),this.getPoint(Math.random(),t)},getSpacedPoints:function(t){void 0===t&&(t=40);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return this.autoClose&&e.push(e[0]),e},getStartPoint:function(t){return void 0===t&&(t=new c),t.copy(this.startPoint)},getTangent:function(t,e){void 0===e&&(e=new c);for(var i=t*this.getLength(),s=this.getCurveLengths(),r=0;r=i){var n=s[r]-i,a=this.curves[r],o=a.getLength(),h=0===o?0:1-n/o;return a.getTangentAt(h,e)}r++}return null},lineTo:function(t,e){t instanceof c?this._tmpVec2B.copy(t):"object"==typeof t?this._tmpVec2B.setFromObject(t):this._tmpVec2B.set(t,e);var i=this.getEndPoint(this._tmpVec2A);return this.add(new o([i.x,i.y,this._tmpVec2B.x,this._tmpVec2B.y]))},splineTo:function(t){return t.unshift(this.getEndPoint()),this.add(new d(t))},moveTo:function(t,e){return t instanceof c?this.add(new h(t.x,t.y)):this.add(new h(t,e))},toJSON:function(){for(var t=[],e=0;e=9&&/Mac OS X (\d+)_(\d+)/.test(navigator.userAgent)){var n=parseInt(RegExp.$1,10),a=parseInt(RegExp.$2,10);(10===n&&a>=11||n>10)&&(r.dolby=!0)}}}catch(t){}return r}()},84148(t,e,i){var s,r=i(25892),n={chrome:!1,chromeVersion:0,edge:!1,firefox:!1,firefoxVersion:0,ie:!1,ieVersion:0,mobileSafari:!1,opera:!1,safari:!1,safariVersion:0,silk:!1,trident:!1,tridentVersion:0,es2019:!1};t.exports=(s=navigator.userAgent,/Edg\/\d+/.test(s)?(n.edge=!0,n.es2019=!0):/OPR/.test(s)?(n.opera=!0,n.es2019=!0):/Chrome\/(\d+)/.test(s)&&!r.windowsPhone?(n.chrome=!0,n.chromeVersion=parseInt(RegExp.$1,10),n.es2019=n.chromeVersion>69):/Firefox\D+(\d+)/.test(s)?(n.firefox=!0,n.firefoxVersion=parseInt(RegExp.$1,10),n.es2019=n.firefoxVersion>10):/AppleWebKit\/(?!.*CriOS)/.test(s)&&r.iOS?(n.mobileSafari=!0,n.es2019=!0):/MSIE (\d+\.\d+);/.test(s)?(n.ie=!0,n.ieVersion=parseInt(RegExp.$1,10)):/Version\/(\d+\.\d+(\.\d+)?) Safari/.test(s)&&!r.windowsPhone?(n.safari=!0,n.safariVersion=parseInt(RegExp.$1,10),n.es2019=n.safariVersion>10):/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/.test(s)&&(n.ie=!0,n.trident=!0,n.tridentVersion=parseInt(RegExp.$1,10),n.ieVersion=parseInt(RegExp.$3,10)),/Silk/.test(s)&&(n.silk=!0),n)},89289(t,e,i){var s,r,n,a=i(27919),o={supportInverseAlpha:!1,supportNewBlendModes:!1};t.exports=("function"!=typeof importScripts&&void 0!==document&&(o.supportNewBlendModes=(s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/",r="AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==",(n=new Image).onload=function(){var t=new Image;t.onload=function(){var e=a.create2D(t,6).getContext("2d",{willReadFrequently:!0});if(e.globalCompositeOperation="multiply",e.drawImage(n,0,0),e.drawImage(t,2,0),!e.getImageData(2,0,1,1))return!1;var i=e.getImageData(2,0,1,1).data;a.remove(t),o.supportNewBlendModes=255===i[0]&&0===i[1]&&0===i[2]},t.src=s+"/wCKxvRF"+r},n.src=s+"AP804Oa6"+r,!1),o.supportInverseAlpha=function(){var t=a.create2D(this,2).getContext("2d",{willReadFrequently:!0});t.fillStyle="rgba(10, 20, 30, 0.5)",t.fillRect(0,0,1,1);var e=t.getImageData(0,0,1,1);if(null===e)return!1;t.putImageData(e,1,0);var i=t.getImageData(1,0,1,1),s=i.data[0]===e.data[0]&&i.data[1]===e.data[1]&&i.data[2]===e.data[2]&&i.data[3]===e.data[3];return a.remove(this),s}()),o)},89357(t,e,i){var s=i(25892),r=i(84148),n=i(27919),a={canvas:!1,canvasBitBltShift:null,file:!1,fileSystem:!1,getUserMedia:!0,littleEndian:!1,localStorage:!1,pointerLock:!1,stableSort:!1,support32bit:!1,vibration:!1,webGL:!1,worker:!1};t.exports=function(){if("function"==typeof importScripts)return a;a.canvas=!!window.CanvasRenderingContext2D;try{a.localStorage=!!localStorage.getItem}catch(t){a.localStorage=!1}a.file=!!(window.File&&window.FileReader&&window.FileList&&window.Blob),a.fileSystem=!!window.requestFileSystem;var t,e,i,o=!1;return a.webGL=function(){if(window.WebGLRenderingContext)try{var t=n.createWebGL(this),e=t.getContext("webgl")||t.getContext("experimental-webgl"),i=n.create2D(this),s=i.getContext("2d",{willReadFrequently:!0}).createImageData(1,1);return o=s.data instanceof Uint8ClampedArray,n.remove(t),n.remove(i),!!e}catch(t){return!1}return!1}(),a.worker=!!window.Worker,a.pointerLock="pointerLockElement"in document||"mozPointerLockElement"in document||"webkitPointerLockElement"in document,navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia||navigator.oGetUserMedia,window.URL=window.URL||window.webkitURL||window.mozURL||window.msURL,a.getUserMedia=a.getUserMedia&&!!navigator.getUserMedia&&!!window.URL,r.firefox&&r.firefoxVersion<21&&(a.getUserMedia=!1),!s.iOS&&(r.ie||r.firefox||r.chrome)&&(a.canvasBitBltShift=!0),(r.safari||r.mobileSafari)&&(a.canvasBitBltShift=!1),navigator.vibrate=navigator.vibrate||navigator.webkitVibrate||navigator.mozVibrate||navigator.msVibrate,navigator.vibrate&&(a.vibration=!0),"undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint32Array&&(a.littleEndian=(t=new ArrayBuffer(4),e=new Uint8Array(t),i=new Uint32Array(t),e[0]=161,e[1]=178,e[2]=195,e[3]=212,3569595041===i[0]||2712847316!==i[0]&&null)),a.support32bit="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof Int32Array&&null!==a.littleEndian&&o,a}()},91639(t){var e={available:!1,cancel:"",keyboard:!1,request:""};t.exports=function(){if("function"==typeof importScripts)return e;var t,i="Fullscreen",s="FullScreen",r=["request"+i,"request"+s,"webkitRequest"+i,"webkitRequest"+s,"msRequest"+i,"msRequest"+s,"mozRequest"+s,"mozRequest"+i];for(t=0;t=1)&&(r.touch=!0),(navigator.msPointerEnabled||navigator.pointerEnabled)&&(r.mspointer=!0),navigator.getGamepads&&(r.gamepads=!0),"onwheel"in window||s.ie&&"WheelEvent"in window?r.wheelEvent="wheel":"onmousewheel"in window?r.wheelEvent="mousewheel":s.firefox&&"MouseScrollEvent"in window&&(r.wheelEvent="DOMMouseScroll")),r)},25892(t){var e={android:!1,chromeOS:!1,cordova:!1,crosswalk:!1,desktop:!1,ejecta:!1,electron:!1,iOS:!1,iOSVersion:0,iPad:!1,iPhone:!1,kindle:!1,linux:!1,macOS:!1,node:!1,nodeWebkit:!1,pixelRatio:1,webApp:!1,windows:!1,windowsPhone:!1};t.exports=function(){if("function"==typeof importScripts)return e;var t=navigator.userAgent;/Windows/.test(t)?e.windows=!0:/Mac OS/.test(t)&&!/like Mac OS/.test(t)?navigator.maxTouchPoints&&navigator.maxTouchPoints>2?(e.iOS=!0,e.iPad=!0,navigator.appVersion.match(/Version\/(\d+)/),e.iOSVersion=parseInt(RegExp.$1,10)):e.macOS=!0:/Android/.test(t)?e.android=!0:/Linux/.test(t)?e.linux=!0:/iP[ao]d|iPhone/i.test(t)?(e.iOS=!0,navigator.appVersion.match(/OS (\d+)/),e.iOSVersion=parseInt(RegExp.$1,10),e.iPhone=-1!==t.toLowerCase().indexOf("iphone"),e.iPad=-1!==t.toLowerCase().indexOf("ipad")):/Kindle/.test(t)||/\bKF[A-Z][A-Z]+/.test(t)||/Silk.*Mobile Safari/.test(t)?e.kindle=!0:/CrOS/.test(t)&&(e.chromeOS=!0),(/Windows Phone/i.test(t)||/IEMobile/i.test(t))&&(e.android=!1,e.iOS=!1,e.macOS=!1,e.windows=!0,e.windowsPhone=!0);var i=/Silk/.test(t);return(e.windows||e.macOS||e.linux&&!i||e.chromeOS)&&(e.desktop=!0),(e.windowsPhone||/Windows NT/i.test(t)&&/Touch/i.test(t))&&(e.desktop=!1),navigator.standalone&&(e.webApp=!0),"function"!=typeof importScripts&&(void 0!==window.cordova&&(e.cordova=!0),void 0!==window.ejecta&&(e.ejecta=!0)),"undefined"!=typeof process&&process.versions&&process.versions.node&&(e.node=!0),e.node&&"object"==typeof process.versions&&(e.nodeWebkit=!!process.versions["node-webkit"],e.electron=!!process.versions.electron),/Crosswalk/.test(t)&&(e.crosswalk=!0),e.pixelRatio=window.devicePixelRatio||1,e}()},43267(t,e,i){var s=i(95540),r={h264:!1,hls:!1,mov:!1,mp4:!1,m4v:!1,ogg:!1,vp9:!1,webm:!1,hasRequestVideoFrame:!1};t.exports=function(){if("function"==typeof importScripts)return r;var t=document.createElement("video"),e=!!t.canPlayType,i=/^no$/;try{e&&(t.canPlayType('video/ogg; codecs="theora"').replace(i,"")&&(r.ogg=!0),t.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(i,"")&&(r.h264=!0,r.mp4=!0),t.canPlayType('video/quicktime4; codecs="avc1.42E01E"').replace(i,"")&&(r.mov=!0),t.canPlayType("video/x-m4v").replace(i,"")&&(r.m4v=!0),t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(i,"")&&(r.webm=!0),t.canPlayType('video/webm; codecs="vp9"').replace(i,"")&&(r.vp9=!0),t.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(i,"")&&(r.hls=!0))}catch(t){}return t.parentNode&&t.parentNode.removeChild(t),r.getVideoURL=function(t){Array.isArray(t)||(t=[t]);for(var e=0;e4096&&(r=Math.ceil(s/4096),s=4096),this.dataTextureResolution[0]=s,this.dataTextureResolution[1]=r;var n=new ArrayBuffer(s*r*4),o=new Uint32Array(n),l=new Uint8Array(n),u=0,d=65536;o[u++]=Math.round(this.bands[0].start*d),o[u++]=Math.round(this.bands[this.bands.length-1].end*d);for(var c=0;c<=e;c++)for(var f=Math.pow(2,c),p=1;po.end&&(o.end=o.start)}return i&&(this.bands=r.filter(function(t){return t.start=t){e=s;break}}return e?(t=(t-e.start)/(e.end-e.start),e.getColor(t)):{r:0,g:0,b:0,a:0,color:0}},destroy:function(){this.scene=null,this.dataTexture&&this.dataTexture.destroy()}});t.exports=l},51767(t,e,i){var s=i(83419),r=i(29747),n=new s({initialize:function(t,e,i){this._rgb=[0,0,0],this.onChangeCallback=r,this.dirty=!1,this.set(t,e,i)},set:function(t,e,i){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),this._rgb=[t,e,i],this.onChange(),this},equals:function(t,e,i){var s=this._rgb;return s[0]===t&&s[1]===e&&s[2]===i},onChange:function(){this.dirty=!0;var t=this._rgb;this.onChangeCallback.call(this,t[0],t[1],t[2])},r:{get:function(){return this._rgb[0]},set:function(t){this._rgb[0]=t,this.onChange()}},g:{get:function(){return this._rgb[1]},set:function(t){this._rgb[1]=t,this.onChange()}},b:{get:function(){return this._rgb[2]},set:function(t){this._rgb[2]=t,this.onChange()}},destroy:function(){this.onChangeCallback=null}});t.exports=n},60461(t){t.exports={TOP_LEFT:0,TOP_CENTER:1,TOP_RIGHT:2,LEFT_TOP:3,LEFT_CENTER:4,LEFT_BOTTOM:5,CENTER:6,RIGHT_TOP:7,RIGHT_CENTER:8,RIGHT_BOTTOM:9,BOTTOM_LEFT:10,BOTTOM_CENTER:11,BOTTOM_RIGHT:12}},54312(t,e,i){var s=i(62235),r=i(35893),n=i(86327),a=i(88417);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)+i),n(t,s(e)+o),t}},46768(t,e,i){var s=i(62235),r=i(26541),n=i(86327),a=i(385);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)-i),n(t,s(e)+o),t}},35827(t,e,i){var s=i(62235),r=i(54380),n=i(86327),a=i(40136);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)+i),n(t,s(e)+o),t}},46871(t,e,i){var s=i(66786),r=i(35893),n=i(7702);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,r(e)+i,n(e)+a),t}},5198(t,e,i){var s=i(7702),r=i(26541),n=i(20786),a=i(385);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)-i),n(t,s(e)+o),t}},11879(t,e,i){var s=i(60461),r=[];r[s.BOTTOM_CENTER]=i(54312),r[s.BOTTOM_LEFT]=i(46768),r[s.BOTTOM_RIGHT]=i(35827),r[s.CENTER]=i(46871),r[s.LEFT_CENTER]=i(5198),r[s.RIGHT_CENTER]=i(80503),r[s.TOP_CENTER]=i(89698),r[s.TOP_LEFT]=i(922),r[s.TOP_RIGHT]=i(21373),r[s.LEFT_BOTTOM]=r[s.BOTTOM_LEFT],r[s.LEFT_TOP]=r[s.TOP_LEFT],r[s.RIGHT_BOTTOM]=r[s.BOTTOM_RIGHT],r[s.RIGHT_TOP]=r[s.TOP_RIGHT];t.exports=function(t,e,i,s,n){return r[i](t,e,s,n)}},80503(t,e,i){var s=i(7702),r=i(54380),n=i(20786),a=i(40136);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)+i),n(t,s(e)+o),t}},89698(t,e,i){var s=i(35893),r=i(17717),n=i(88417),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,s(e)+i),a(t,r(e)-o),t}},922(t,e,i){var s=i(26541),r=i(17717),n=i(385),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,s(e)-i),a(t,r(e)-o),t}},21373(t,e,i){var s=i(54380),r=i(17717),n=i(40136),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,s(e)+i),a(t,r(e)-o),t}},91660(t,e,i){t.exports={BottomCenter:i(54312),BottomLeft:i(46768),BottomRight:i(35827),Center:i(46871),LeftCenter:i(5198),QuickSet:i(11879),RightCenter:i(80503),TopCenter:i(89698),TopLeft:i(922),TopRight:i(21373)}},71926(t,e,i){var s=i(60461),r=i(79291),n={In:i(91660),To:i(16694)};n=r(!1,n,s),t.exports=n},21578(t,e,i){var s=i(62235),r=i(35893),n=i(88417),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,r(e)+i),a(t,s(e)+o),t}},10210(t,e,i){var s=i(62235),r=i(26541),n=i(385),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,r(e)-i),a(t,s(e)+o),t}},82341(t,e,i){var s=i(62235),r=i(54380),n=i(40136),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,r(e)+i),a(t,s(e)+o),t}},87958(t,e,i){var s=i(62235),r=i(26541),n=i(86327),a=i(40136);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)-i),n(t,s(e)+o),t}},40080(t,e,i){var s=i(7702),r=i(26541),n=i(20786),a=i(40136);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)-i),n(t,s(e)+o),t}},88466(t,e,i){var s=i(26541),r=i(17717),n=i(40136),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,s(e)-i),a(t,r(e)-o),t}},38829(t,e,i){var s=i(60461),r=[];r[s.BOTTOM_CENTER]=i(21578),r[s.BOTTOM_LEFT]=i(10210),r[s.BOTTOM_RIGHT]=i(82341),r[s.LEFT_BOTTOM]=i(87958),r[s.LEFT_CENTER]=i(40080),r[s.LEFT_TOP]=i(88466),r[s.RIGHT_BOTTOM]=i(19211),r[s.RIGHT_CENTER]=i(34609),r[s.RIGHT_TOP]=i(48741),r[s.TOP_CENTER]=i(49440),r[s.TOP_LEFT]=i(81288),r[s.TOP_RIGHT]=i(61323);t.exports=function(t,e,i,s,n){return r[i](t,e,s,n)}},19211(t,e,i){var s=i(62235),r=i(54380),n=i(86327),a=i(385);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)+i),n(t,s(e)+o),t}},34609(t,e,i){var s=i(7702),r=i(54380),n=i(20786),a=i(385);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,r(e)+i),n(t,s(e)+o),t}},48741(t,e,i){var s=i(54380),r=i(17717),n=i(385),a=i(66737);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,s(e)+i),a(t,r(e)-o),t}},49440(t,e,i){var s=i(35893),r=i(17717),n=i(86327),a=i(88417);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,s(e)+i),n(t,r(e)-o),t}},81288(t,e,i){var s=i(26541),r=i(17717),n=i(86327),a=i(385);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,s(e)-i),n(t,r(e)-o),t}},61323(t,e,i){var s=i(54380),r=i(17717),n=i(86327),a=i(40136);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),a(t,s(e)+i),n(t,r(e)-o),t}},16694(t,e,i){t.exports={BottomCenter:i(21578),BottomLeft:i(10210),BottomRight:i(82341),LeftBottom:i(87958),LeftCenter:i(40080),LeftTop:i(88466),QuickSet:i(38829),RightBottom:i(19211),RightCenter:i(34609),RightTop:i(48741),TopCenter:i(49440),TopLeft:i(81288),TopRight:i(61323)}},66786(t,e,i){var s=i(88417),r=i(20786);t.exports=function(t,e,i){return s(t,e),r(t,i)}},62235(t){t.exports=function(t){return t.y+t.height-t.height*t.originY}},72873(t,e,i){var s=i(62235),r=i(26541),n=i(54380),a=i(17717),o=i(87841);t.exports=function(t,e){void 0===e&&(e=new o);var i=r(t),h=a(t);return e.x=i,e.y=h,e.width=n(t)-i,e.height=s(t)-h,e}},35893(t){t.exports=function(t){return t.x-t.width*t.originX+.5*t.width}},7702(t){t.exports=function(t){return t.y-t.height*t.originY+.5*t.height}},26541(t){t.exports=function(t){return t.x-t.width*t.originX}},87431(t){t.exports=function(t){return t.width*t.originX}},46928(t){t.exports=function(t){return t.height*t.originY}},54380(t){t.exports=function(t){return t.x+t.width-t.width*t.originX}},17717(t){t.exports=function(t){return t.y-t.height*t.originY}},86327(t){t.exports=function(t,e){return t.y=e-t.height+t.height*t.originY,t}},88417(t){t.exports=function(t,e){var i=t.width*t.originX;return t.x=e+i-.5*t.width,t}},20786(t){t.exports=function(t,e){var i=t.height*t.originY;return t.y=e+i-.5*t.height,t}},385(t){t.exports=function(t,e){return t.x=e+t.width*t.originX,t}},40136(t){t.exports=function(t,e){return t.x=e-t.width+t.width*t.originX,t}},66737(t){t.exports=function(t,e){return t.y=e+t.height*t.originY,t}},58724(t,e,i){t.exports={CenterOn:i(66786),GetBottom:i(62235),GetBounds:i(72873),GetCenterX:i(35893),GetCenterY:i(7702),GetLeft:i(26541),GetOffsetX:i(87431),GetOffsetY:i(46928),GetRight:i(54380),GetTop:i(17717),SetBottom:i(86327),SetCenterX:i(88417),SetCenterY:i(20786),SetLeft:i(385),SetRight:i(40136),SetTop:i(66737)}},20623(t){t.exports={setCrisp:function(t){return["optimizeSpeed","-moz-crisp-edges","-o-crisp-edges","-webkit-optimize-contrast","optimize-contrast","crisp-edges","pixelated"].forEach(function(e){t.style["image-rendering"]=e}),t.style.msInterpolationMode="nearest-neighbor",t},setBicubic:function(t){return t.style["image-rendering"]="auto",t.style.msInterpolationMode="bicubic",t}}},27919(t,e,i){var s,r,n,a=i(8054),o=i(68703),h=[],l=!1;t.exports=(n=function(){var t=0;return h.forEach(function(e){e.parent&&t++}),t},{create2D:function(t,e,i){return s(t,e,i,a.CANVAS)},create:s=function(t,e,i,s,n){var u;void 0===e&&(e=1),void 0===i&&(i=1),void 0===s&&(s=a.CANVAS),void 0===n&&(n=!1);var d=r(s);return null===d?(d={parent:t,canvas:document.createElement("canvas"),type:s},s===a.CANVAS&&h.push(d),u=d.canvas):(d.parent=t,u=d.canvas),n&&(d.parent=u),u.width=e,u.height=i,l&&s===a.CANVAS&&o.disable(u.getContext("2d",{willReadFrequently:!1})),u},createWebGL:function(t,e,i){return s(t,e,i,a.WEBGL)},disableSmoothing:function(){l=!0},enableSmoothing:function(){l=!1},first:r=function(t){if(void 0===t&&(t=a.CANVAS),t===a.WEBGL)return null;for(var e=0;e=0;e--)i.push({r:e,g:a,b:o,color:s(e,a,o)});for(n=0,e=0;e<=r;e++,a--)i.push({r:n,g:a,b:e,color:s(n,a,e)});for(a=0,o=255,e=0;e<=r;e++,o--,n++)i.push({r:n,g:a,b:o,color:s(n,a,o)});if(1024===t)return i;var h=[],l=0,u=1024/t;for(e=0;e>16&255,g:t>>8&255,b:255&t,a:255};return t>16777215&&(e.a=t>>>24),e}},62957(t){t.exports=function(t){var e=t.toString(16);return 1===e.length?"0"+e:e}},37589(t){t.exports=function(t,e,i){return t<<16|e<<8|i}},1e3(t){t.exports=function(t,e,i,s){return s<<24|t<<16|e<<8|i}},62183(t,e,i){var s=i(40987),r=i(89528);t.exports=function(t,e,i,n){n||(n=new s);var a=i,o=i,h=i;if(0!==e){var l=i<.5?i*(1+e):i+e-i*e,u=2*i-l;a=r(u,l,t+1/3),o=r(u,l,t),h=r(u,l,t-1/3)}return n.setGLTo(a,o,h,1)}},27939(t,e,i){var s=i(7537);t.exports=function(t,e){void 0===t&&(t=1),void 0===e&&(e=1);for(var i=[],r=0;r<=359;r++)i.push(s(r/359,t,e));return i}},7537(t,e,i){var s=i(37589);function r(t,e,i,s){var r=(t+6*e)%6,n=Math.min(r,4-r,1);return Math.round(255*(s-s*i*Math.max(0,n)))}t.exports=function(t,e,i,n){void 0===e&&(e=1),void 0===i&&(i=1);var a=r(5,t,e,i),o=r(3,t,e,i),h=r(1,t,e,i);return n?n.setTo?n.setTo(a,o,h,n.alpha,!0):(n.r=a,n.g=o,n.b=h,n.color=s(a,o,h),n):{r:a,g:o,b:h,color:s(a,o,h)}}},70238(t,e,i){var s=i(40987);t.exports=function(t,e){e||(e=new s),t=t.replace(/^(?:#|0x)?([a-f\d])([a-f\d])([a-f\d])$/i,function(t,e,i,s){return e+e+i+i+s+s});var i=/^(?:#|0x)?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);if(i){var r=parseInt(i[1],16),n=parseInt(i[2],16),a=parseInt(i[3],16);e.setTo(r,n,a)}return e}},89528(t){t.exports=function(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}},30100(t,e,i){var s=i(40987),r=i(90664);t.exports=function(t,e){var i=r(t);return e?e.setTo(i.r,i.g,i.b,i.a):new s(i.r,i.g,i.b,i.a)}},90664(t){t.exports=function(t){return t>16777215?{a:t>>>24,r:t>>16&255,g:t>>8&255,b:255&t}:{a:255,r:t>>16&255,g:t>>8&255,b:255&t}}},13699(t,e,i){var s=i(28915),r=i(37589),n=i(7537),a=function(t,e,i,n,a,o,h,l){void 0===h&&(h=100),void 0===l&&(l=0);var u=l/h,d=s(t,n,u),c=s(e,a,u),f=s(i,o,u);return{r:d,g:c,b:f,a:255,color:r(d,c,f)}},o=function(t,e,i,r,a,o,h,l,u){if(void 0===u&&(u=0),0===u){var d=t-r;d>.5?t-=1:d<-.5&&(t+=1)}else u>0?t>r&&(t-=1):tt?s.ORIENTATION.PORTRAIT:s.ORIENTATION.LANDSCAPE}},74403(t){t.exports=function(t){var e;return""!==t&&("string"==typeof t?e=document.getElementById(t):t&&1===t.nodeType&&(e=t)),e||(e=document.body),e}},56836(t){t.exports=function(t){var e="";try{if(window.DOMParser)e=(new DOMParser).parseFromString(t,"text/xml");else(e=new ActiveXObject("Microsoft.XMLDOM")).loadXML(t)}catch(t){e=null}return e&&e.documentElement&&!e.getElementsByTagName("parsererror").length?e:null}},35846(t){t.exports=function(t){t.parentNode&&t.parentNode.removeChild(t)}},43092(t,e,i){var s=i(83419),r=i(29747),n=new s({initialize:function(){this.isRunning=!1,this.callback=r,this.isSetTimeOut=!1,this.timeOutID=null,this.delay=0;var t=this;this.step=function e(i){t.callback(i),t.isRunning&&(t.timeOutID=window.requestAnimationFrame(e))},this.stepTimeout=function e(){t.isRunning&&(t.timeOutID=window.setTimeout(e,t.delay)),t.callback(window.performance.now())}},start:function(t,e,i){this.isRunning||(this.callback=t,this.isSetTimeOut=e,this.delay=i,this.isRunning=!0,this.timeOutID=e?window.setTimeout(this.stepTimeout,0):window.requestAnimationFrame(this.step))},stop:function(){this.isRunning=!1,this.isSetTimeOut?clearTimeout(this.timeOutID):window.cancelAnimationFrame(this.timeOutID)},destroy:function(){this.stop(),this.callback=r}});t.exports=n},84902(t,e,i){var s={AddToDOM:i(40366),DOMContentLoaded:i(57264),GetInnerHeight:i(57811),GetScreenOrientation:i(45818),GetTarget:i(74403),ParseXML:i(56836),RemoveFromDOM:i(35846),RequestAnimationFrame:i(43092)};t.exports=s},47565(t,e,i){var s=i(83419),r=i(50792),n=i(37277),a=new s({Extends:r,initialize:function(){r.call(this)},shutdown:function(){this.removeAllListeners()},destroy:function(){this.removeAllListeners()}});n.register("EventEmitter",a,"events"),t.exports=a},93055(t,e,i){t.exports={EventEmitter:i(47565)}},10189(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e){void 0===e&&(e=1),r.call(this,t,"FilterBarrel"),this.amount=e}});t.exports=n},16762(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s,n){void 0===e&&(e="__WHITE"),void 0===i&&(i=0),void 0===s&&(s=1),void 0===n&&(n=[1,1,1,1]),r.call(this,t,"FilterBlend"),this.glTexture,this.blendMode=i,this.amount=s,this.color=n,this.setTexture(e)},setTexture:function(t){var e=this.camera.scene.sys.textures.getFrame(t);return e&&(this.glTexture=e.glTexture),this}});t.exports=n},37597(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e){r.call(this,t,"FilterBlocky"),this.size={x:4,y:4},this.offset={x:0,y:0},e&&(void 0!==e.size&&("number"==typeof e.size?(this.size.x=e.size,this.size.y=e.size):(this.size.x=e.size.x,this.size.y=e.size.y)),void 0!==e.offset&&("number"==typeof e.offset?(this.offset.x=e.offset,this.offset.y=e.offset):(this.offset.x=e.offset.x,this.offset.y=e.offset.y)))}});t.exports=n},88344(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s,n,a,o){void 0===e&&(e=0),void 0===i&&(i=2),void 0===s&&(s=2),void 0===n&&(n=1),void 0===o&&(o=4),r.call(this,t,"FilterBlur"),this.quality=e,this.x=i,this.y=s,this.strength=n,this.glcolor=[1,1,1],null!=a&&(this.color=a),this.steps=o},color:{get:function(){var t=this.glcolor;return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)},set:function(t){var e=this.glcolor;e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255}},getPadding:function(){var t=this.paddingOverride;if(t)return this.currentPadding.setTo(t.x,t.y,t.width,t.height),t;var e=this.quality,i=0===e?1.333:1===e?3.2307692308:5.176470588235294,s=this.steps*this.strength*i,r=Math.ceil(this.x*s),n=Math.ceil(this.y*s);return this.currentPadding.setTo(-r,-n,2*r,2*n),this.currentPadding}});t.exports=n},47564(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s,n,a,o,h){void 0===e&&(e=.5),void 0===i&&(i=1),void 0===s&&(s=.2),void 0===n&&(n=!1),void 0===a&&(a=1),void 0===o&&(o=1),void 0===h&&(h=1),r.call(this,t,"FilterBokeh"),this.radius=e,this.amount=i,this.contrast=s,this.isTiltShift=n,this.blurX=a,this.blurY=o,this.strength=h},getPadding:function(){var t=this.paddingOverride;if(t)return this.currentPadding.setTo(t.x,t.y,t.width,t.height),t;var e=Math.ceil(this.camera.height*this.radius*.021426096060426905);return this.currentPadding.setTo(-e,-e,2*e,2*e),this.currentPadding}});t.exports=n},77011(t,e,i){var s=i(83419),r=i(13045),n=i(89422),a=new s({Extends:r,initialize:function(t){r.call(this,t,"FilterColorMatrix"),this.colorMatrix=new n},destroy:function(){this.colorMatrix=null,r.prototype.destroy.call(this)}});t.exports=a},95200(t,e,i){var s=i(83419),r=i(13045),n=i(89422),a=new s({Extends:r,initialize:function(t,e){r.call(this,t,"FilterCombineColorMatrix"),this.glTexture,this.colorMatrixSelf=new n,this.colorMatrixTransfer=new n,this.additions=[1,1,1,0],this.multiplications=[0,0,0,1],this.setTexture(e||"__WHITE")},setTexture:function(t){var e=t instanceof Phaser.Textures.Texture?t:this.camera.scene.sys.textures.getFrame(t);return e&&(this.glTexture=e.glTexture),this},setupAlphaTransfer:function(t,e,i,s,r,n){var a=this.colorMatrixSelf,o=this.colorMatrixTransfer;a.reset(),o.reset(),this.additions=[1,1,1,0],this.multiplications=[0,0,0,1],t||a.black(),e||o.black(),r?a.brightnessToAlphaInverse(!0):i&&a.brightnessToAlpha(!0),n?o.brightnessToAlphaInverse(!0):s&&o.brightnessToAlpha(!0)},destroy:function(){this.colorMatrixSelf=null,this.colorMatrixTransfer=null,r.prototype.destroy.call(this)}});t.exports=a},13045(t,e,i){var s=i(83419),r=i(87841),n=new s({initialize:function(t,e){this.active=!0,this.camera=t,this.renderNode=e,this.paddingOverride=new r,this.currentPadding=new r,this.allowBaseDraw=!0,this.ignoreDestroy=!1},getPadding:function(){return this.paddingOverride||this.currentPadding},setPaddingOverride:function(t,e,i,s){return null===t?(this.paddingOverride=null,this):(void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),this.paddingOverride=new r(t,e,i-t,s-e),this)},setActive:function(t){return this.active=t,this},destroy:function(){this.active=!1,this.renderNode=null,this.camera=null}});t.exports=n},16898(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s){void 0===e&&(e="__WHITE"),void 0===i&&(i=.005),void 0===s&&(s=.005),r.call(this,t,"FilterDisplacement"),this.x=i,this.y=s,this.glTexture,this.setTexture(e)},setTexture:function(t){var e=this.camera.scene.sys.textures.getFrame(t);return e&&(this.glTexture=e.glTexture),this},getPadding:function(){var t=this.paddingOverride;if(t)return this.currentPadding.setTo(t.x,t.y,t.width,t.height),t;var e=this.camera,i=Math.ceil(e.width*this.x*.5),s=Math.ceil(e.height*this.y*.5);return this.currentPadding.setTo(-i,-s,2*i,2*s),this.currentPadding}});t.exports=n},42652(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s,n,a,o,h){void 0===i&&(i=4),void 0===s&&(s=0),void 0===n&&(n=1),void 0===a&&(a=!1),void 0===o&&(o=t.scene.sys.game.config.glowQuality),void 0===h&&(h=t.scene.sys.game.config.glowDistance),r.call(this,t,"FilterGlow"),this.outerStrength=i,this.innerStrength=s,this.scale=n,this.knockout=a,this._quality=Math.max(Math.round(o),1),this._distance=Math.max(Math.round(h),1),this.glcolor=[1,1,1,1],void 0!==e&&(this.color=e)},color:{get:function(){var t=this.glcolor;return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)},set:function(t){var e=this.glcolor;e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255}},distance:{get:function(){return this._distance}},quality:{get:function(){return this._quality}},getPadding:function(){var t=this.paddingOverride;if(t)return this.currentPadding.setTo(t.x,t.y,t.width,t.height),t;var e=this.currentPadding,i=Math.ceil(this.distance*this.scale);return e.left=-i,e.top=-i,e.right=i,e.bottom=i,e}});t.exports=n},43927(t,e,i){var s=i(83419),r=i(13045),n=i(73043),a=new s({Extends:r,initialize:function(t,e){e||(e={});var i=t.scene;r.call(this,t,"FilterGradientMap");var s=e.ramp;s||(s={colorStart:0,colorEnd:16777215}),s instanceof n||(s=new n(i,s,!0)),this.ramp=s,this.dither=!!e.dither,this.color=[0,0,0,0],e.color&&(this.color[0]=e.color[0]||0,this.color[1]=e.color[1]||0,this.color[2]=e.color[2]||0,this.color[3]=e.color[3]||0),this.colorFactor=[.3,.6,.1,0],e.colorFactor&&(this.colorFactor[0]=e.colorFactor[0]||0,this.colorFactor[1]=e.colorFactor[1]||0,this.colorFactor[2]=e.colorFactor[2]||0,this.colorFactor[3]=e.colorFactor[3]||0),this.unpremultiply=void 0===e.unpremultiply||e.unpremultiply,this.alpha=void 0===e.alpha?1:e.alpha}});t.exports=a},84714(t,e,i){var s=i(83419),r=i(13045),n=i(37867),a=i(61340),o=new s({Extends:r,initialize:function(t,e){r.call(this,t,"FilterImageLight"),this.normalGlTexture,this.environmentGlTexture,this.viewMatrix=new n,this.modelRotation=e.modelRotation||0,this.modelRotationSource=e.modelRotationSource||null,this.bulge=e.bulge||0,this.colorFactor=e.colorFactor||[1,1,1],this._tempMatrix=new a,this._tempParentMatrix=new a,this.setEnvironmentMap(e.environmentMap||"__WHITE"),this.setNormalMap(e.normalMap||"__NORMAL"),e.viewMatrix&&this.viewMatrix.set(e.viewMatrix)},setEnvironmentMap:function(t){var e=t instanceof Phaser.Textures.Texture?t:this.camera.scene.sys.textures.getFrame(t);return e&&(this.environmentGlTexture=e.glTexture),this},setNormalMap:function(t){var e=t instanceof Phaser.Textures.Texture?t:this.camera.scene.sys.textures.getFrame(t);return e&&(this.normalGlTexture=e.glTexture),this},setNormalMapFromGameObject:function(t){var e=t.texture.dataSource[0];return e&&(this.normalGlTexture=e.glTexture),this},getModelRotation:function(){return this.modelRotationSource?"function"==typeof this.modelRotationSource?this.modelRotationSource():this.modelRotationSource.hasTransformComponent?this.modelRotationSource.getWorldTransformMatrix(this._tempMatrix,this._tempParentMatrix).rotationNormalized:this.modelRotation:this.modelRotation}});t.exports=o},51890(t,e,i){var s=i(83419),r=i(13045),n=i(40987),a=new s({Extends:r,initialize:function(t,e){void 0===e&&(e={}),r.call(this,t,"FilterKey"),this.color=[1,1,1,1],void 0!==e.color&&this.setColor(e.color),void 0!==e.alpha&&this.setAlpha(e.alpha),this.isolate=!1,void 0!==e.isolate&&(this.isolate=e.isolate),this.threshold=.0625,void 0!==e.threshold&&(this.threshold=e.threshold),this.feather=0,void 0!==e.feather&&(this.feather=e.feather)},setAlpha:function(t){return this.color[3]=t,this},setColor:function(t){var e=this.color[3];if("number"==typeof t){var i=n.IntegerToRGB(t);this.color=[i.r/255,i.g/255,i.b/255,e]}else if("string"==typeof t){var s=n.HexStringToColor(t);this.color=[s.redGL,s.greenGL,s.blueGL,e]}else Array.isArray(t)?this.color=[t[0],t[1],t[2],e]:t instanceof n&&(this.color=[t.redGL,t.greenGL,t.blueGL,e]);return this}});t.exports=a},97797(t,e,i){var s=i(83419),r=i(45650),n=i(13045),a=new s({Extends:n,initialize:function(t,e,i,s,r,a){void 0===e&&(e="__WHITE"),void 0===i&&(i=!1),void 0===a&&(a=1),n.call(this,t,"FilterMask"),this.glTexture,this._dynamicTexture=null,this.maskGameObject=null,this.invert=i,this.autoUpdate=!0,this.needsUpdate=!1,this.viewTransform=r||"world",this.viewCamera=s,this.scaleFactor=a,"string"==typeof e?this.setTexture(e):this.setGameObject(e)},updateDynamicTexture:function(t,e){var i=this.scaleFactor,s=t*i,n=e*i,a=this.maskGameObject;if(a){if(this._dynamicTexture)this._dynamicTexture.width!==s||this._dynamicTexture.height!==n?this._dynamicTexture.setSize(s,n,!1):this._dynamicTexture.clear();else{var o=this.camera.scene.sys.textures;this._dynamicTexture=o.addDynamicTexture(r(),s,n,!1)}this.glTexture=this._dynamicTexture.get().glTexture;var h=this.viewCamera||a.scene.renderer.currentViewCamera;this._dynamicTexture.capture(a,{transform:this.viewTransform,camera:h}),this._dynamicTexture.render(),this.needsUpdate=!1}},setGameObject:function(t){return this.maskGameObject=t,this.needsUpdate=!0,this},setTexture:function(t){var e=this.camera.scene.sys.textures.getFrame(t);return e&&(this.maskGameObject=null,this.glTexture=e.glTexture),this},destroy:function(){this._dynamicTexture&&this._dynamicTexture.destroy(),this.maskGameObject=null,this._dynamicTexture=null,n.prototype.destroy.call(this)}});t.exports=a},37911(t,e,i){var s=i(83419),r=i(13045),n=i(37867),a=i(25836),o=new s({Extends:r,initialize:function(t,e){e=e||{},r.call(this,t,"FilterNormalTools"),this._rotation=0,this.viewMatrix=new n,this.setRotation(e.rotation||0),this.rotationSource=e.rotationSource||null,this.facingPower=e.facingPower||1,this.outputRatio=e.outputRatio||!1,this.ratioVector=new a(0,0,1),e.ratioVector&&this.ratioVector.set(e.ratioVector[0],e.ratioVector[1],e.ratioVector[2]),this.ratioRadius=e.ratioRadius||1},getRotation:function(){if(this.rotationSource){if("function"==typeof this.rotationSource)return this.rotationSource();if(this.rotationSource.hasTransformComponent)return this.rotationSource.getWorldTransformMatrix().rotationNormalized}return this._rotation},setRotation:function(t){return this.viewMatrix.identity().rotateZ(t),this._rotation=t,this},updateRotation:function(){if(this.rotationSource){var t=this.getRotation();this.viewMatrix.identity().rotateZ(t),this._rotation=t}return this}});t.exports=o},6379(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e){void 0===e&&(e={}),r.call(this,t,"FilterPanoramaBlur"),this.radius=e.radius||1,this.samplesX=e.samplesX||32,this.samplesY=e.samplesY||16,this.power=e.power||1}});t.exports=n},2195(t,e,i){var s=i(83419),r=i(53427),n=i(13045),a=i(16762),o=new s({Extends:n,initialize:function(t){n.call(this,t,"FilterParallelFilters"),this.top=new r(t),this.bottom=new r(t),this.blend=new a(t)}});r.prototype.addParallelFilters=function(){return this.add(new o(this.camera))},t.exports=o},29861(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e){void 0===e&&(e=1),r.call(this,t,"FilterPixelate"),this.amount=e}});t.exports=n},14366(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e){e||(e={}),r.call(this,t,"FilterQuantize"),this.steps=[8,8,8,8],e.steps&&(this.steps[0]=e.steps[0],this.steps[1]=e.steps[1],this.steps[2]=e.steps[2],this.steps[3]=e.steps[3]),this.gamma=[1,1,1,1],e.gamma&&(this.gamma[0]=e.gamma[0],this.gamma[1]=e.gamma[1],this.gamma[2]=e.gamma[2],this.gamma[3]=e.gamma[3]),this.offset=[0,0,0,0],e.offset&&(this.offset[0]=e.offset[0],this.offset[1]=e.offset[1],this.offset[2]=e.offset[2],this.offset[3]=e.offset[3]),this.mode=e.mode||0,this.dither=!!e.dither}});t.exports=n},63785(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i){void 0===i&&(i=null),r.call(this,t,"FilterSampler"),this.allowBaseDraw=!1,this.callback=e,this.region=i}});t.exports=n},62229(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s,n,a,o,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=.1),void 0===n&&(n=1),void 0===o&&(o=6),void 0===h&&(h=1),r.call(this,t,"FilterShadow"),this.x=e,this.y=i,this.decay=s,this.power=n,this.glcolor=[0,0,0,1],this.samples=o,this.intensity=h,void 0!==a&&(this.color=a)},color:{get:function(){var t=this.glcolor;return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)},set:function(t){var e=this.glcolor;e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255}},getPadding:function(){var t=this.paddingOverride;if(t)return this.currentPadding.setTo(t.x,t.y,t.width,t.height),t;var e=this.camera,i=this.decay*this.intensity,s=Math.ceil(Math.abs(this.x)*e.width*i),r=Math.ceil(Math.abs(this.y)*e.height*i);return this.currentPadding.setTo(-s,-r,2*s,2*r),this.currentPadding}});t.exports=n},99534(t,e,i){var s=i(83419),r=i(13045),n=new s({Extends:r,initialize:function(t,e,i,s){r.call(this,t,"FilterThreshold"),this.edge1=[.5,.5,.5,.5],this.edge2=[.5,.5,.5,.5],this.invert=[!1,!1,!1,!1],this.setEdge(e,i),this.setInvert(s)},setEdge:function(t,e){void 0===t&&(t=.5),"number"==typeof t&&(t=[t,t,t,t]),this.edge1[0]=t[0],this.edge1[1]=t[1],this.edge1[2]=t[2],this.edge1[3]=t[3],void 0===e&&(e=t),"number"==typeof e&&(e=[e,e,e,e]),this.edge2[0]=e[0],this.edge2[1]=e[1],this.edge2[2]=e[2],this.edge2[3]=e[3];for(var i=0;i<4;i++)if(this.edge1[i]>this.edge2[i]){var s=this.edge1[i];this.edge1[i]=this.edge2[i],this.edge2[i]=s}return this},setInvert:function(t){return void 0===t&&(t=!1),"boolean"==typeof t&&(t=[t,t,t,t]),this.invert[0]=t[0],this.invert[1]=t[1],this.invert[2]=t[2],this.invert[3]=t[3],this}});t.exports=n},20263(t,e,i){var s=i(83419),r=i(13045),n=i(40987),a=new s({Extends:r,initialize:function(t,e,i,s,a,o,h){void 0===e&&(e=.5),void 0===i&&(i=.5),void 0===s&&(s=.5),void 0===a&&(a=.5),void 0===o&&(o=0),void 0===h&&(h=0),r.call(this,t,"FilterVignette"),this.x=e,this.y=i,this.radius=s,this.strength=a,this.color=new n,this.blendMode=h,this.setColor(o)},setColor:function(t){return"number"==typeof t?n.IntegerToColor(t,this.color):"string"==typeof t?n.HexStringToColor(t,this.color):t.setTo?this.color.setTo(t.red,t.green,t.blue,t.alpha):t?this.color.setTo(t.r||0,t.g||0,t.b||0,t.a||255):this.color.setTo(0,0,0,255),this}});t.exports=a},90002(t,e,i){var s=i(83419),r=i(13045),n=i(79237),a=new s({Extends:r,initialize:function(t,e,i,s,n,a){void 0===e&&(e=.1),r.call(this,t,"FilterWipe"),this.progress=0,this.wipeWidth=e,this.direction=i||0,this.axis=s||0,this.reveal=n||0,this.wipeTexture=null,this.setTexture(a)},setWipeWidth:function(t){return void 0===t&&(t=.1),this.wipeWidth=t,this},setLeftToRight:function(){return this.direction=0,this.axis=0,this},setRightToLeft:function(){return this.direction=1,this.axis=0,this},setTopToBottom:function(){return this.direction=1,this.axis=1,this},setBottomToTop:function(){return this.direction=0,this.axis=1,this},setWipeEffect:function(){return this.reveal=0,this.progress=0,this},setRevealEffect:function(){return this.setTexture(),this.reveal=1,this.progress=0,this},setTexture:function(t){return void 0===t&&(t="__DEFAULT"),this.wipeTexture=t instanceof n?t:this.camera.scene.sys.textures.get(t)||this.camera.scene.sys.textures.get("__DEFAULT"),this},setProgress:function(t){return this.progress=t,this}});t.exports=a},11889(t,e,i){var s={Controller:i(13045),Barrel:i(10189),Blend:i(16762),Blocky:i(37597),Blur:i(88344),Bokeh:i(47564),ColorMatrix:i(77011),CombineColorMatrix:i(95200),Displacement:i(16898),Glow:i(42652),GradientMap:i(43927),ImageLight:i(84714),Key:i(51890),Mask:i(97797),NormalTools:i(37911),PanoramaBlur:i(6379),ParallelFilters:i(2195),Pixelate:i(29861),Quantize:i(14366),Sampler:i(63785),Shadow:i(62229),Threshold:i(99534),Vignette:i(20263),Wipe:i(90002)};t.exports=s},25305(t,e,i){var s=i(10312),r=i(23568);t.exports=function(t,e,i){e.x=r(i,"x",0),e.y=r(i,"y",0),e.depth=r(i,"depth",0),e.flipX=r(i,"flipX",!1),e.flipY=r(i,"flipY",!1);var n=r(i,"scale",null);"number"==typeof n?e.setScale(n):null!==n&&(e.scaleX=r(n,"x",1),e.scaleY=r(n,"y",1));var a=r(i,"scrollFactor",null);"number"==typeof a?e.setScrollFactor(a):null!==a&&(e.scrollFactorX=r(a,"x",1),e.scrollFactorY=r(a,"y",1)),e.rotation=r(i,"rotation",0);var o=r(i,"angle",null);null!==o&&(e.angle=o),e.alpha=r(i,"alpha",1);var h=r(i,"origin",null);if("number"==typeof h)e.setOrigin(h);else if(null!==h){var l=r(h,"x",.5),u=r(h,"y",.5);e.setOrigin(l,u)}return e.blendMode=r(i,"blendMode",s.NORMAL),e.visible=r(i,"visible",!0),r(i,"add",!0)&&t.sys.displayList.add(e),e.preUpdate&&t.sys.updateList.add(e),e}},13059(t,e,i){var s=i(23568);t.exports=function(t,e){var i=s(e,"anims",null);if(null===i)return t;if("string"==typeof i)t.anims.play(i);else if("object"==typeof i){var r=t.anims,n=s(i,"key",void 0);if(n){var a=s(i,"startFrame",void 0),o=s(i,"delay",0),h=s(i,"repeat",0),l=s(i,"repeatDelay",0),u=s(i,"yoyo",!1),d=s(i,"play",!1),c=s(i,"delayedPlay",0),f={key:n,delay:o,repeat:h,repeatDelay:l,yoyo:u,startFrame:a};d?r.play(f):c>0?r.playAfterDelay(f,c):r.load(f)}}return t}},8050(t,e,i){var s=i(83419),r=i(73162),n=i(37277),a=i(51708),o=i(44594),h=i(19186),l=new s({Extends:r,initialize:function(t){r.call(this,t),this.sortChildrenFlag=!1,this.scene=t,this.systems=t.sys,this.events=t.sys.events,this.addCallback=this.addChildCallback,this.removeCallback=this.removeChildCallback,this.events.once(o.BOOT,this.boot,this),this.events.on(o.START,this.start,this)},boot:function(){this.events.once(o.DESTROY,this.destroy,this)},addChildCallback:function(t){t.displayList&&t.displayList!==this&&t.removeFromDisplayList(),t.parentContainer&&t.parentContainer.remove(t),t.displayList||(this.queueDepthSort(),t.displayList=this,t.emit(a.ADDED_TO_SCENE,t,this.scene),this.events.emit(o.ADDED_TO_SCENE,t,this.scene))},removeChildCallback:function(t){this.queueDepthSort(),t.displayList=null,t.emit(a.REMOVED_FROM_SCENE,t,this.scene),this.events.emit(o.REMOVED_FROM_SCENE,t,this.scene)},start:function(){this.events.once(o.SHUTDOWN,this.shutdown,this)},queueDepthSort:function(){this.sortChildrenFlag=!0},depthSort:function(){this.sortChildrenFlag&&(h(this.list,this.sortByDepth),this.sortChildrenFlag=!1)},sortByDepth:function(t,e){return t._depth-e._depth},getChildren:function(){return this.list},shutdown:function(){for(var t=this.list,e=t.length;e--;)t[e]&&t[e].destroy(!0);t.length=0,this.events.off(o.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(o.START,this.start,this),this.scene=null,this.systems=null,this.events=null}});n.register("DisplayList",l,"displayList"),t.exports=l},95643(t,e,i){var s=i(83419),r=i(31401),n=i(53774),a=i(45893),o=i(50792),h=i(51708),l=i(44594),u=new s({Extends:o,Mixins:[r.Filters,r.RenderSteps],initialize:function(t,e){o.call(this),this.scene=t,this.displayList=null,this.type=e,this.state=0,this.parentContainer=null,this.name="",this.active=!0,this.tabIndex=-1,this.data=null,this.renderFlags=15,this.cameraFilter=0,this.vertexRoundMode="safeAuto",this.input=null,this.body=null,this.ignoreDestroy=!1,this.isDestroyed=!1,this.addRenderStep&&this.addRenderStep(this.renderWebGL),this.on(h.ADDED_TO_SCENE,this.addedToScene,this),this.on(h.REMOVED_FROM_SCENE,this.removedFromScene,this),t.sys.queueDepthSort()},setActive:function(t){return this.active=t,this},setName:function(t){return this.name=t,this},setState:function(t){return this.state=t,this},setDataEnabled:function(){return this.data||(this.data=new a(this)),this},setData:function(t,e){return this.data||(this.data=new a(this)),this.data.set(t,e),this},incData:function(t,e){return this.data||(this.data=new a(this)),this.data.inc(t,e),this},toggleData:function(t){return this.data||(this.data=new a(this)),this.data.toggle(t),this},getData:function(t){return this.data||(this.data=new a(this)),this.data.get(t)},setInteractive:function(t,e,i){return this.scene.sys.input.enable(this,t,e,i),this},disableInteractive:function(t){return void 0===t&&(t=!1),this.scene.sys.input.disable(this,t),this},removeInteractive:function(t){return void 0===t&&(t=!1),this.scene.sys.input.clear(this),t&&this.scene.sys.input.resetCursor(),this.input=void 0,this},addedToScene:function(){},removedFromScene:function(){},update:function(){},toJSON:function(){return n(this)},willRender:function(t){return!(!(!this.displayList||!this.displayList.active||this.displayList.willRender(t))||u.RENDER_MASK!==this.renderFlags||0!==this.cameraFilter&&this.cameraFilter&t.id)},willRoundVertices:function(t,e){switch(this.vertexRoundMode){case"safe":return e;case"safeAuto":return e&&t.roundPixels;case"full":return!0;case"fullAuto":return t.roundPixels;default:return!1}},setVertexRoundMode:function(t){return this.vertexRoundMode=t,this},getIndexList:function(){for(var t=this,e=this.parentContainer,i=[];e&&(i.unshift(e.getIndex(t)),t=e,e.parentContainer);)e=e.parentContainer;return this.displayList?i.unshift(this.displayList.getIndex(t)):i.unshift(this.scene.sys.displayList.getIndex(t)),i},addToDisplayList:function(t){return void 0===t&&(t=this.scene.sys.displayList),this.displayList&&this.displayList!==t&&this.removeFromDisplayList(),t.exists(this)||(this.displayList=t,t.add(this,!0),t.queueDepthSort(),this.emit(h.ADDED_TO_SCENE,this,this.scene),t.events.emit(l.ADDED_TO_SCENE,this,this.scene)),this},addToUpdateList:function(){return this.scene&&this.preUpdate&&this.scene.sys.updateList.add(this),this},removeFromDisplayList:function(){var t=this.displayList||this.scene.sys.displayList;return t&&t.exists(this)&&(t.remove(this,!0),t.queueDepthSort(),this.displayList=null,this.emit(h.REMOVED_FROM_SCENE,this,this.scene),t.events.emit(l.REMOVED_FROM_SCENE,this,this.scene)),this},removeFromUpdateList:function(){return this.scene&&this.preUpdate&&this.scene.sys.updateList.remove(this),this},getDisplayList:function(){var t=null;return this.parentContainer?t=this.parentContainer.list:this.displayList&&(t=this.displayList.list),t},destroy:function(t){this.scene&&!this.ignoreDestroy&&(void 0===t&&(t=!1),this.isDestroyed=!0,this.preDestroy&&this.preDestroy.call(this),this.emit(h.DESTROY,this,t),this.removeAllListeners(),this.removeFromDisplayList(),this.removeFromUpdateList(),this.input&&(this.scene.sys.input.clear(this),this.input=void 0),this.data&&(this.data.destroy(),this.data=void 0),this.body&&(this.body.destroy(),this.body=void 0),this.filterCamera&&(this.filterCamera.destroy(),this.filterCamera=void 0),this.active=!1,this.visible=!1,this.scene=void 0,this.parentContainer=void 0)}});u.RENDER_MASK=15,t.exports=u},44603(t,e,i){var s=i(83419),r=i(37277),n=i(44594),a=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.events=t.sys.events,this.displayList,this.updateList,this.events.once(n.BOOT,this.boot,this),this.events.on(n.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.events.once(n.DESTROY,this.destroy,this)},start:function(){this.events.once(n.SHUTDOWN,this.shutdown,this)},shutdown:function(){this.events.off(n.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(n.START,this.start,this),this.scene=null,this.systems=null,this.events=null,this.displayList=null,this.updateList=null}});a.register=function(t,e){a.prototype.hasOwnProperty(t)||(a.prototype[t]=e)},a.remove=function(t){a.prototype.hasOwnProperty(t)&&delete a.prototype[t]},r.register("GameObjectCreator",a,"make"),t.exports=a},39429(t,e,i){var s=i(83419),r=i(37277),n=i(44594),a=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.events=t.sys.events,this.displayList,this.updateList,this.events.once(n.BOOT,this.boot,this),this.events.on(n.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.events.once(n.DESTROY,this.destroy,this)},start:function(){this.events.once(n.SHUTDOWN,this.shutdown,this)},existing:function(t){return(t.renderCanvas||t.renderWebGL)&&this.displayList.add(t),t.preUpdate&&this.updateList.add(t),t},shutdown:function(){this.events.off(n.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.events.off(n.START,this.start,this),this.scene=null,this.systems=null,this.events=null,this.displayList=null,this.updateList=null}});a.register=function(t,e){a.prototype.hasOwnProperty(t)||(a.prototype[t]=e)},a.remove=function(t){a.prototype.hasOwnProperty(t)&&delete a.prototype[t]},r.register("GameObjectFactory",a,"add"),t.exports=a},91296(t,e,i){var s=i(61340),r=new s,n=new s,a=new s,o=new s,h={camera:r,sprite:n,calc:a,cameraExternal:o};t.exports=function(t,e,i,s){return s?o.loadIdentity():o.copyFrom(e.matrixExternal),r.copyWithScrollFactorFrom(s?e.matrix:e.matrixCombined,e.scrollX,e.scrollY,t.scrollFactorX,t.scrollFactorY),a.copyFrom(r),i&&a.multiply(i),n.applyITRS(t.x,t.y,t.rotation,t.scaleX,t.scaleY),a.multiply(n),h}},45027(t,e,i){var s=i(83419),r=i(25774),n=i(37277),a=i(44594),o=new s({Extends:r,initialize:function(t){r.call(this),this.checkQueue=!0,this.scene=t,this.systems=t.sys,t.sys.events.once(a.BOOT,this.boot,this),t.sys.events.on(a.START,this.start,this)},boot:function(){this.systems.events.once(a.DESTROY,this.destroy,this)},start:function(){var t=this.systems.events;t.on(a.PRE_UPDATE,this.update,this),t.on(a.UPDATE,this.sceneUpdate,this),t.once(a.SHUTDOWN,this.shutdown,this)},sceneUpdate:function(t,e){for(var i=this._active,s=i.length,r=0;r0){a=o.split("\n");var z=[];for(r=0;rC&&(d=C),c>E&&(c=E);var q=C+b.xAdvance,K=E+m;fD&&(D=I),ID&&(D=I),I0)for(var Q=0;Qo.length&&(x=o.length);for(var T=p,w=g,b={retroFont:!0,font:h,size:i,lineHeight:r+y,chars:{}},S=0,C=0;C?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",TEXT_SET2:" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET3:"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ",TEXT_SET4:"ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789",TEXT_SET5:"ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789",TEXT_SET6:"ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' ",TEXT_SET7:"AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39",TEXT_SET8:"0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET9:"ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?!",TEXT_SET10:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET11:"ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789"}},2638(t,e,i){var s=i(22186),r=i(83419),n=i(12310),a=new r({Extends:s,Mixins:[n],initialize:function(t,e,i,r,n,a,o){s.call(this,t,e,i,r,n,a,o),this.type="DynamicBitmapText",this.scrollX=0,this.scrollY=0,this.cropWidth=0,this.cropHeight=0,this.displayCallback,this.callbackData={parent:this,color:0,tint:{topLeft:0,topRight:0,bottomLeft:0,bottomRight:0},index:0,charCode:0,x:0,y:0,scale:0,rotation:0,data:0}},setSize:function(t,e){return this.cropWidth=t,this.cropHeight=e,this},setDisplayCallback:function(t){return this.displayCallback=t,this},setScrollX:function(t){return this.scrollX=t,this},setScrollY:function(t){return this.scrollY=t,this}});t.exports=a},86741(t,e,i){var s=i(20926);t.exports=function(t,e,i,r){var n=e._text,a=n.length,o=t.currentContext;if(0!==a&&s(t,o,e,i,r)){i.addToRenderList(e);var h=e.fromAtlas?e.frame:e.texture.frames.__BASE,l=e.displayCallback,u=e.callbackData,d=e.fontData.chars,c=e.fontData.lineHeight,f=e._letterSpacing,p=0,g=0,m=0,v=null,y=0,x=0,T=0,w=0,b=0,S=0,C=null,E=0,A=e.frame.source.image,_=h.cutX,M=h.cutY,R=0,P=0,O=e._fontSize/e.fontData.size,L=e._align,D=0,F=0;e.getTextBounds(!1);var I=e._bounds.lines;1===L?F=(I.longest-I.lengths[0])/2:2===L&&(F=I.longest-I.lengths[0]),o.translate(-e.displayOriginX,-e.displayOriginY);var N=i.roundPixels;e.cropWidth>0&&e.cropHeight>0&&(o.beginPath(),o.rect(0,0,e.cropWidth,e.cropHeight),o.clip());for(var B=0;B0||e.cropHeight>0;x&&((f=i.getClone()).setScissorEnable(!0),f.setScissorBox(v.tx,v.ty,e.cropWidth*v.scaleX,e.cropHeight*v.scaleY),f.use()),h.frame=e.frame;var T,w,b=r.MULTIPLY,S=a.getTintAppendFloatAlpha(e.tintTopLeft,e._alphaTL),C=a.getTintAppendFloatAlpha(e.tintTopRight,e._alphaTR),E=a.getTintAppendFloatAlpha(e.tintBottomLeft,e._alphaBL),A=a.getTintAppendFloatAlpha(e.tintBottomRight,e._alphaBR),_=0,M=0,R=0,P=0,O=e.letterSpacing,L=0,D=0,F=e.scrollX,I=e.scrollY,N=e.fontData,B=N.chars,k=N.lineHeight,U=e.fontSize/N.size,z=0,Y=e._align,X=0,W=0,G=e.getTextBounds(!1);e.maxWidth>0&&(d=(u=G.wrappedText).length);var V=e._bounds.lines;1===Y?W=(V.longest-V.lengths[0])/2:2===Y&&(W=V.longest-V.lengths[0]);for(var H=e.displayCallback,j=e.callbackData,q=0;q0&&(a=(n=L.wrappedText).length);var D=e._bounds.lines;1===R?O=(D.longest-D.lengths[0])/2:2===R&&(O=D.longest-D.lengths[0]),o.translate(-e.displayOriginX,-e.displayOriginY);for(var F=i.roundPixels,I=0;I0},getRenderList:function(){return this.dirty&&(this.renderList=this.children.list.filter(this.childCanRender,this),this.dirty=!1),this.renderList},clear:function(){this.children.removeAll(),this.dirty=!0},preDestroy:function(){this.children.destroy(),this.renderList=[]}});t.exports=d},72396(t){t.exports=function(t,e,i,s){var r=e.getRenderList();if(0!==r.length){var n=t.currentContext,a=i.alpha*e.alpha;if(0!==a){i.addToRenderList(e),n.globalCompositeOperation=t.blendModes[e.blendMode],n.imageSmoothingEnabled=!e.frame.source.scaleMode;var o=e.x-i.scrollX*e.scrollFactorX,h=e.y-i.scrollY*e.scrollFactorY;n.save(),s&&s.copyToContext(n);for(var l=i.roundPixels,u=0;u0&&p.height>0&&(n.save(),n.translate(d.x+o,d.y+h),n.scale(v,y),n.drawImage(f.source.image,p.x,p.y,p.width,p.height,g,m,p.width,p.height),n.restore())):(l&&(g=Math.round(g),m=Math.round(m)),p.width>0&&p.height>0&&n.drawImage(f.source.image,p.x,p.y,p.width,p.height,g+d.x+o,m+d.y+h,p.width,p.height)))}n.restore()}}}},9403(t,e,i){var s=i(6107),r=i(25305),n=i(44603),a=i(23568);n.register("blitter",function(t,e){void 0===t&&(t={});var i=a(t,"key",null),n=a(t,"frame",null),o=new s(this.scene,0,0,i,n);return void 0!==e&&(t.add=e),r(this.scene,o,t),o})},12709(t,e,i){var s=i(6107);i(39429).register("blitter",function(t,e,i,r){return this.displayList.add(new s(this.scene,t,e,i,r))})},48011(t,e,i){var s=i(29747),r=s,n=s;r=i(99485),n=i(72396),t.exports={renderWebGL:r,renderCanvas:n}},99485(t,e,i){var s=i(61340),r=i(70554),n=new s,a={quad:new Float32Array(8)},o={},h={};t.exports=function(t,e,i,s){var l=e.getRenderList(),u=i.camera,d=e.alpha;if(0!==l.length&&0!==d){u.addToRenderList(e);var c=n.copyWithScrollFactorFrom(u.getViewMatrix(!i.useCanvas),u.scrollX,u.scrollY,e.scrollFactorX,e.scrollFactorY);s&&c.multiply(s);for(var f=e.x,p=e.y,g=e.customRenderNodes,m=e.defaultRenderNodes,v=0;v0!=t>0,this._alpha=t}}});t.exports=n},43451(t,e,i){var s=i(87774),r=i(30529),n=i(83419),a=i(31401),o=i(95643),h=i(36683),l=new n({Extends:o,Mixins:[a.BlendMode,a.Depth,a.RenderNodes,a.Visible,h],initialize:function(t,e){o.call(this,t,"CaptureFrame");var i=t.renderer;this.drawingContext=new s(i,{width:i.width,height:i.height}),this.captureTexture=t.sys.textures.addGLTexture(e,this.drawingContext.texture),this.initRenderNodes(this._defaultRenderNodesMap)},_defaultRenderNodesMap:{get:function(){return r}},setAlpha:function(t){return this},setScrollFactor:function(t,e){return this}});t.exports=l},23675(t,e,i){var s=i(44603),r=i(23568),n=i(43451);s.register("captureFrame",function(t,e){void 0===t&&(t={});var i=r(t,"depth",0),s=r(t,"key",null),a=r(t,"visible",!0),o=new n(this.scene,s);return void 0!==e&&(t.add=e),o.setDepth(i).setVisible(a),t.add&&this.scene.sys.displayList.add(o),o})},20421(t,e,i){var s=i(43451);i(39429).register("captureFrame",function(t){return this.displayList.add(new s(this.scene,t))})},36683(t,e,i){var s=i(29747),r=s,n=s;r=i(82237),t.exports={renderWebGL:r,renderCanvas:n}},82237(t){var e=!1;t.exports=function(t,i,s){if(s.useCanvas)e||(e=!0,console.warn("CaptureFrame: Cannot capture from main canvas. Activate `forceComposite` on the camera to use this feature. This warning will now mute."));else{s.camera.addToRenderList(i);var r=s.width,n=s.height,a=i.customRenderNodes,o=i.defaultRenderNodes;i.drawingContext.resize(r,n),i.drawingContext.use(),(a.BatchHandler||o.BatchHandler).batch(i.drawingContext,s.texture,0,n,0,0,r,n,r,0,0,0,1,1,!1,4294967295,4294967295,4294967295,4294967295,{}),i.drawingContext.release()}}},16005(t,e,i){var s=i(45319),r={_alpha:1,_alphaTL:1,_alphaTR:1,_alphaBL:1,_alphaBR:1,clearAlpha:function(){return this.setAlpha(1)},setAlpha:function(t,e,i,r){return void 0===t&&(t=1),void 0===e?this.alpha=t:(this._alphaTL=s(t,0,1),this._alphaTR=s(e,0,1),this._alphaBL=s(i,0,1),this._alphaBR=s(r,0,1)),this},alpha:{get:function(){return this._alpha},set:function(t){var e=s(t,0,1);this._alpha=e,this._alphaTL=e,this._alphaTR=e,this._alphaBL=e,this._alphaBR=e,0===e?this.renderFlags&=-3:this.renderFlags|=2}},alphaTopLeft:{get:function(){return this._alphaTL},set:function(t){var e=s(t,0,1);this._alphaTL=e,0!==e&&(this.renderFlags|=2)}},alphaTopRight:{get:function(){return this._alphaTR},set:function(t){var e=s(t,0,1);this._alphaTR=e,0!==e&&(this.renderFlags|=2)}},alphaBottomLeft:{get:function(){return this._alphaBL},set:function(t){var e=s(t,0,1);this._alphaBL=e,0!==e&&(this.renderFlags|=2)}},alphaBottomRight:{get:function(){return this._alphaBR},set:function(t){var e=s(t,0,1);this._alphaBR=e,0!==e&&(this.renderFlags|=2)}}};t.exports=r},88509(t,e,i){var s=i(45319),r={_alpha:1,clearAlpha:function(){return this.setAlpha(1)},setAlpha:function(t){return void 0===t&&(t=1),this.alpha=t,this},alpha:{get:function(){return this._alpha},set:function(t){var e=s(t,0,1);this._alpha=e,0===e?this.renderFlags&=-3:this.renderFlags|=2}}};t.exports=r},90065(t,e,i){var s=i(10312),r={_blendMode:s.NORMAL,blendMode:{get:function(){return this._blendMode},set:function(t){"string"==typeof t&&(t=s[t]),(t|=0)>=-1&&(this._blendMode=t)}},setBlendMode:function(t){return this.blendMode=t,this}};t.exports=r},94215(t){t.exports={width:0,height:0,displayWidth:{get:function(){return this.scaleX*this.width},set:function(t){this.scaleX=t/this.width}},displayHeight:{get:function(){return this.scaleY*this.height},set:function(t){this.scaleY=t/this.height}},setSize:function(t,e){return this.width=t,this.height=e,this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this}}},61683(t){var e={texture:null,frame:null,isCropped:!1,setCrop:function(t,e,i,s){if(void 0===t)this.isCropped=!1;else if(this.frame){if("number"==typeof t)this.frame.setCropUVs(this._crop,t,e,i,s,this.flipX,this.flipY);else{var r=t;this.frame.setCropUVs(this._crop,r.x,r.y,r.width,r.height,this.flipX,this.flipY)}this.isCropped=!0}return this},resetCropObject:function(){return{u0:0,v0:0,u1:0,v1:0,width:0,height:0,x:0,y:0,flipX:!1,flipY:!1,cx:0,cy:0,cw:0,ch:0}}};t.exports=e},89272(t,e,i){var s=i(37105),r={_depth:0,depth:{get:function(){return this._depth},set:function(t){this.displayList&&this.displayList.queueDepthSort(),this._depth=t}},setDepth:function(t){return void 0===t&&(t=0),this.depth=t,this},setToTop:function(){var t=this.getDisplayList();return t&&s.BringToTop(t,this),this},setToBack:function(){var t=this.getDisplayList();return t&&s.SendToBack(t,this),this},setAbove:function(t){var e=this.getDisplayList();return e&&t&&s.MoveAbove(e,this,t),this},setBelow:function(t){var e=this.getDisplayList();return e&&t&&s.MoveBelow(e,this,t),this}};t.exports=r},3248(t){var e={timeElapsed:0,timeElapsedResetPeriod:36e5,timePaused:!1,setTimerResetPeriod:function(t){return this.timeElapsedResetPeriod=t,this},setTimerPaused:function(t){return this.timePaused=!!t,this},resetTimer:function(t){return void 0===t&&(t=0),this.timeElapsed=t,this},updateTimer:function(t,e){return this.timePaused||(this.timeElapsed+=e,this.timeElapsed>=this.timeElapsedResetPeriod&&(this.timeElapsed-=this.timeElapsedResetPeriod)),this}};t.exports=e},53427(t,e,i){var s=i(83419),r=i(10189),n=i(16762),a=i(37597),o=i(88344),h=i(47564),l=i(77011),u=i(95200),d=i(16898),c=i(42652),f=i(43927),p=i(84714),g=i(51890),m=i(97797),v=i(37911),y=i(6379),x=i(29861),T=i(14366),w=i(63785),b=i(62229),S=i(99534),C=i(20263),E=i(90002),A=new s({initialize:function(t){this.camera=t,this.list=[]},clear:function(){for(var t=0;t0||this.filters.external.getActive().length>0||this.filtersForceComposite)},enableFilters:function(){if(this.filterCamera||!this.scene.renderer.gl)return this;var t=this.scene;if(s||(s=i(38058)),this.filterCamera=new s(0,0,1,1).setScene(t,!1),this.filterCamera.isObjectInversion=!0,t.game.config.roundPixels&&(this.filterCamera.roundPixels=!0),!this.maxFilterSize){var e=t.renderer.getMaxTextureSize();this.maxFilterSize=new r(e,e)}return this._filtersMatrix=new n,this._filtersViewMatrix=new n,this.getBounds&&void 0!==this.width&&void 0!==this.height&&0!==this.width&&0!==this.height||(this.filtersFocusContext=!0),this.addRenderStep(this.renderWebGLFilters,0),this},renderWebGLFilters:function(t,e,i,s,r){if(e.willRenderFilters()){var n=i.camera,a=e.filtersAutoFocus,o=e.filtersFocusContext;a&&(o?e.focusFiltersOnCamera(n):e.focusFilters());var h=e.filterCamera;h.preRender();var l=h.roundPixels;if(h.roundPixels=e.willRoundVertices(h,e.rotation%(2*Math.PI)==0&&(e.scaleX,1===e.scaleY)),a&&o){var u=e.parentContainer;if(u){var d=u.getWorldTransformMatrix();h.matrix.multiply(d)}}var c=e._filtersMatrix,f=e._filtersViewMatrix.copyWithScrollFactorFrom(n.getViewMatrix(!i.useCanvas),n.scrollX,n.scrollY,e.scrollFactorX,e.scrollFactorY);if(s&&f.multiply(s),o)c.loadIdentity();else{if("Layer"===e.type)c.loadIdentity();else{var p=e.flipX?-1:1,g=e.flipY?-1:1;c.applyITRS(e.x,e.y,e.rotation,e.scaleX*p,e.scaleY*g)}var m=h.width,v=h.height;c.translate(-m*h.originX,-v*h.originY),f.multiply(c,c)}var y=e.scrollFactorX,x=e.scrollFactorY;e.scrollFactorX=1,e.scrollFactorY=1,t.cameraRenderNode.run(i,[e],h,c,!0,r+1),e.scrollFactorX=y,e.scrollFactorY=x,h.roundPixels=l;for(var T=h.renderList.length,w=0;w0?Math.acos(e/this.scaleX):-Math.acos(e/this.scaleX):s||n?r.PI_OVER_2-(n>0?Math.acos(-s/this.scaleY):-Math.acos(s/this.scaleY)):0}},scaleX:{get:function(){return Math.sqrt(this.a*this.a+this.b*this.b)}},scaleY:{get:function(){return Math.sqrt(this.c*this.c+this.d*this.d)}},loadIdentity:function(){var t=this.matrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,this},translate:function(t,e){var i=this.matrix;return i[4]=i[0]*t+i[2]*e+i[4],i[5]=i[1]*t+i[3]*e+i[5],this},scale:function(t,e){var i=this.matrix;return i[0]*=t,i[1]*=t,i[2]*=e,i[3]*=e,this},rotate:function(t){var e=Math.sin(t),i=Math.cos(t),s=this.matrix,r=s[0],n=s[1],a=s[2],o=s[3];return s[0]=r*i+a*e,s[1]=n*i+o*e,s[2]=r*-e+a*i,s[3]=n*-e+o*i,this},multiply:function(t,e){var i=this.matrix,s=t.matrix,r=i[0],n=i[1],a=i[2],o=i[3],h=i[4],l=i[5],u=s[0],d=s[1],c=s[2],f=s[3],p=s[4],g=s[5],m=void 0===e?i:e.matrix;return m[0]=u*r+d*a,m[1]=u*n+d*o,m[2]=c*r+f*a,m[3]=c*n+f*o,m[4]=p*r+g*a+h,m[5]=p*n+g*o+l,m},multiplyWithOffset:function(t,e,i){var s=this.matrix,r=t.matrix,n=s[0],a=s[1],o=s[2],h=s[3],l=e*n+i*o+s[4],u=e*a+i*h+s[5],d=r[0],c=r[1],f=r[2],p=r[3],g=r[4],m=r[5];return s[0]=d*n+c*o,s[1]=d*a+c*h,s[2]=f*n+p*o,s[3]=f*a+p*h,s[4]=g*n+m*o+l,s[5]=g*a+m*h+u,this},transform:function(t,e,i,s,r,n){var a=this.matrix,o=a[0],h=a[1],l=a[2],u=a[3],d=a[4],c=a[5];return a[0]=t*o+e*l,a[1]=t*h+e*u,a[2]=i*o+s*l,a[3]=i*h+s*u,a[4]=r*o+n*l+d,a[5]=r*h+n*u+c,this},transformPoint:function(t,e,i){void 0===i&&(i={x:0,y:0});var s=this.matrix,r=s[0],n=s[1],a=s[2],o=s[3],h=s[4],l=s[5];return i.x=t*r+e*a+h,i.y=t*n+e*o+l,i},invert:function(){var t=this.matrix,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=e*r-i*s;return t[0]=r/o,t[1]=-i/o,t[2]=-s/o,t[3]=e/o,t[4]=(s*a-r*n)/o,t[5]=-(e*a-i*n)/o,this},copyFrom:function(t){var e=this.matrix;return e[0]=t.a,e[1]=t.b,e[2]=t.c,e[3]=t.d,e[4]=t.e,e[5]=t.f,this},copyFromArray:function(t){var e=this.matrix;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],this},copyWithScrollFactorFrom:function(t,e,i,s,r){var n=this.matrix;n[0]=t.a,n[1]=t.b,n[2]=t.c,n[3]=t.d;var a=e*(1-s),o=i*(1-r);return n[4]=t.a*a+t.c*o+t.e,n[5]=t.b*a+t.d*o+t.f,this},copyToContext:function(t){var e=this.matrix;return t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t},setToContext:function(t){return t.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),t},copyToArray:function(t){var e=this.matrix;return void 0===t?t=[e[0],e[1],e[2],e[3],e[4],e[5]]:(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5]),t},setTransform:function(t,e,i,s,r,n){var a=this.matrix;return a[0]=t,a[1]=e,a[2]=i,a[3]=s,a[4]=r,a[5]=n,this},decomposeMatrix:function(){var t=this.decomposedMatrix,e=this.matrix,i=e[0],s=e[1],r=e[2],n=e[3],a=i*n-s*r;if(t.translateX=e[4],t.translateY=e[5],i||s){var o=Math.sqrt(i*i+s*s);t.rotation=s>0?Math.acos(i/o):-Math.acos(i/o),t.scaleX=o,t.scaleY=a/o}else if(r||n){var h=Math.sqrt(r*r+n*n);t.rotation=.5*Math.PI-(n>0?Math.acos(-r/h):-Math.acos(r/h)),t.scaleX=a/h,t.scaleY=h}else t.rotation=0,t.scaleX=0,t.scaleY=0;return t},applyITRS:function(t,e,i,s,r){var n=this.matrix,a=Math.sin(i),o=Math.cos(i);return n[4]=t,n[5]=e,n[0]=o*s,n[1]=a*s,n[2]=-a*r,n[3]=o*r,this},applyInverse:function(t,e,i){void 0===i&&(i=new n);var s=this.matrix,r=s[0],a=s[1],o=s[2],h=s[3],l=s[4],u=s[5],d=1/(r*h+o*-a);return i.x=h*d*t+-o*d*e+(u*o-l*h)*d,i.y=r*d*e+-a*d*t+(-u*r+l*a)*d,i},setQuad:function(t,e,i,s,r){void 0===r&&(r=this.quad);var n=this.matrix,a=n[0],o=n[1],h=n[2],l=n[3],u=n[4],d=n[5];return r[0]=t*a+e*h+u,r[1]=t*o+e*l+d,r[2]=t*a+s*h+u,r[3]=t*o+s*l+d,r[4]=i*a+s*h+u,r[5]=i*o+s*l+d,r[6]=i*a+e*h+u,r[7]=i*o+e*l+d,r},getX:function(t,e){return t*this.a+e*this.c+this.e},getY:function(t,e){return t*this.b+e*this.d+this.f},getXRound:function(t,e,i){var s=this.getX(t,e);return i&&(s=Math.floor(s+.5)),s},getYRound:function(t,e,i){var s=this.getY(t,e);return i&&(s=Math.floor(s+.5)),s},getCSSMatrix:function(){var t=this.matrix;return"matrix("+t[0]+","+t[1]+","+t[2]+","+t[3]+","+t[4]+","+t[5]+")"},destroy:function(){this.matrix=null,this.quad=null,this.decomposedMatrix=null}});t.exports=a},59715(t){var e={_visible:!0,visible:{get:function(){return this._visible},set:function(t){t?(this._visible=!0,this.renderFlags|=1):(this._visible=!1,this.renderFlags&=-2)}},setVisible:function(t){return this.visible=t,this}};t.exports=e},31401(t,e,i){t.exports={Alpha:i(16005),AlphaSingle:i(88509),BlendMode:i(90065),ComputedSize:i(94215),Crop:i(61683),Depth:i(89272),ElapseTimer:i(3248),FilterList:i(53427),Filters:i(43102),Flip:i(54434),GetBounds:i(8004),Lighting:i(73629),Mask:i(8573),Origin:i(27387),PathFollower:i(37640),RenderNodes:i(68680),RenderSteps:i(86038),ScrollFactor:i(80227),Size:i(16736),Texture:i(37726),TextureCrop:i(79812),Tint:i(27472),ToJSON:i(53774),Transform:i(16901),TransformMatrix:i(61340),Visible:i(59715)}},31559(t,e,i){var s=i(37105),r=i(10312),n=i(83419),a=i(31401),o=i(51708),h=i(95643),l=i(87841),u=i(29959),d=i(36899),c=i(26099),f=new a.TransformMatrix,p=new n({Extends:h,Mixins:[a.AlphaSingle,a.BlendMode,a.ComputedSize,a.Depth,a.Mask,a.Transform,a.Visible,u],initialize:function(t,e,i,s){h.call(this,t,"Container"),this.list=[],this.exclusive=!0,this.maxSize=-1,this.position=0,this.localTransform=new a.TransformMatrix,this._sortKey="",this._sysEvents=t.sys.events,this.scrollFactorX=1,this.scrollFactorY=1,this.setPosition(e,i),this.setBlendMode(r.SKIP_CHECK),s&&this.add(s)},originX:{get:function(){return.5}},originY:{get:function(){return.5}},displayOriginX:{get:function(){return.5*this.width}},displayOriginY:{get:function(){return.5*this.height}},setExclusive:function(t){return void 0===t&&(t=!0),this.exclusive=t,this},getBounds:function(t){if(void 0===t&&(t=new l),t.setTo(this.x,this.y,0,0),this.parentContainer){var e=this.parentContainer.getBoundsTransformMatrix().transformPoint(this.x,this.y);t.setTo(e.x,e.y,0,0)}if(this.list.length>0){var i=this.list,s=new l,r=!1;t.setEmpty();for(var n=0;n-1},setAll:function(t,e,i,r){return s.SetAll(this.list,t,e,i,r),this},each:function(t,e){var i,s=[null],r=this.list.slice(),n=r.length;for(i=2;i0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position0?(this.position--,this.list[this.position]):null}},preDestroy:function(){this.removeAll(!!this.exclusive),this.localTransform.destroy(),this.list=[]},onChildDestroyed:function(t){s.Remove(this.list,t),this.exclusive&&(t.parentContainer=null,t.removedFromScene())}});t.exports=p},53584(t){t.exports=function(t,e,i,s){i.addToRenderList(e);var r=e.list;if(0!==r.length){var n=e.localTransform;s?(n.loadIdentity(),n.multiply(s),n.translate(e.x,e.y),n.rotate(e.rotation),n.scale(e.scaleX,e.scaleY)):n.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var a=-1!==e.blendMode;a||t.setBlendMode(0);var o=e._alpha,h=e.scrollFactorX,l=e.scrollFactorY;e.mask&&e.mask.preRenderCanvas(t,null,i);for(var u=0;u=0,d=a>=0,f=o>=0,p=h>=0;return n=Math.abs(n),a=Math.abs(a),o=Math.abs(o),h=Math.abs(h),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-a,e),d?this.arc(t+i-a,e+a,a,-c.PI_OVER_2,0):this.arc(t+i,e,a,Math.PI,c.PI_OVER_2,!0),this.lineTo(t+i,e+s-h),p?this.arc(t+i-h,e+s-h,h,0,c.PI_OVER_2):this.arc(t+i,e+s,h,-c.PI_OVER_2,Math.PI,!0),this.lineTo(t+o,e+s),f?this.arc(t+o,e+s-o,o,c.PI_OVER_2,Math.PI):this.arc(t,e+s,o,0,-c.PI_OVER_2,!0),this.lineTo(t,e+n),l?this.arc(t+n,e+n,n,-Math.PI,-c.PI_OVER_2):this.arc(t,e,n,c.PI_OVER_2,0,!0),this.fillPath(),this},strokeRoundedRect:function(t,e,i,s,r){void 0===r&&(r=20);var n=r,a=r,o=r,h=r,l=Math.min(i,s)/2;"number"!=typeof r&&(n=u(r,"tl",20),a=u(r,"tr",20),o=u(r,"bl",20),h=u(r,"br",20));var d=n>=0,f=a>=0,p=o>=0,g=h>=0;return n=Math.min(Math.abs(n),l),a=Math.min(Math.abs(a),l),o=Math.min(Math.abs(o),l),h=Math.min(Math.abs(h),l),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-a,e),this.moveTo(t+i-a,e),f?this.arc(t+i-a,e+a,a,-c.PI_OVER_2,0):this.arc(t+i,e,a,Math.PI,c.PI_OVER_2,!0),this.lineTo(t+i,e+s-h),this.moveTo(t+i,e+s-h),g?this.arc(t+i-h,e+s-h,h,0,c.PI_OVER_2):this.arc(t+i,e+s,h,-c.PI_OVER_2,Math.PI,!0),this.lineTo(t+o,e+s),this.moveTo(t+o,e+s),p?this.arc(t+o,e+s-o,o,c.PI_OVER_2,Math.PI):this.arc(t,e+s,o,0,-c.PI_OVER_2,!0),this.lineTo(t,e+n),this.moveTo(t,e+n),d?this.arc(t+n,e+n,n,-Math.PI,-c.PI_OVER_2):this.arc(t,e,n,c.PI_OVER_2,0,!0),this.strokePath(),this},fillPointShape:function(t,e){return this.fillPoint(t.x,t.y,e)},fillPoint:function(t,e,i){return!i||i<1?i=1:(t-=i/2,e-=i/2),this.commandBuffer.push(n.FILL_RECT,t,e,i,i),this},fillTriangleShape:function(t){return this.fillTriangle(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)},strokeTriangleShape:function(t){return this.strokeTriangle(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)},fillTriangle:function(t,e,i,s,r,a){return this.commandBuffer.push(n.FILL_TRIANGLE,t,e,i,s,r,a),this},strokeTriangle:function(t,e,i,s,r,a){return this.commandBuffer.push(n.STROKE_TRIANGLE,t,e,i,s,r,a),this},strokeLineShape:function(t){return this.lineBetween(t.x1,t.y1,t.x2,t.y2)},lineBetween:function(t,e,i,s){return this.beginPath(),this.moveTo(t,e),this.lineTo(i,s),this.strokePath(),this},lineTo:function(t,e){return this.commandBuffer.push(n.LINE_TO,t,e),this},moveTo:function(t,e){return this.commandBuffer.push(n.MOVE_TO,t,e),this},strokePoints:function(t,e,i,s){void 0===e&&(e=!1),void 0===i&&(i=!1),void 0===s&&(s=t.length),this.beginPath(),this.moveTo(t[0].x,t[0].y);for(var r=1;r-1&&this.fillStyle(this.defaultFillColor,this.defaultFillAlpha),this.defaultStrokeColor>-1&&this.lineStyle(this.defaultStrokeWidth,this.defaultStrokeColor,this.defaultStrokeAlpha),this},generateTexture:function(t,e,i){var s,r,n=this.scene.sys,a=n.game.renderer;void 0===e&&(e=n.scale.width),void 0===i&&(i=n.scale.height),p.TargetCamera.setScene(this.scene),p.TargetCamera.setViewport(0,0,e,i),p.TargetCamera.scrollX=this.x,p.TargetCamera.scrollY=this.y;var o={willReadFrequently:!0};if("string"==typeof t)if(n.textures.exists(t)){var h=(s=n.textures.get(t)).getSourceImage();h instanceof HTMLCanvasElement&&(r=h.getContext("2d",o))}else r=(s=n.textures.createCanvas(t,e,i)).getSourceImage().getContext("2d",o);else t instanceof HTMLCanvasElement&&(r=t.getContext("2d",o));return r&&(this.renderCanvas(a,this,p.TargetCamera,null,r,!1),s&&s.refresh()),this},preDestroy:function(){this.commandBuffer=[]}});p.TargetCamera=new s,t.exports=p},32768(t,e,i){var s=i(85592),r=i(20926);t.exports=function(t,e,i,n,a,o){var h=e.commandBuffer,l=h.length,u=a||t.currentContext;if(0!==l&&r(t,u,e,i,n)){i.addToRenderList(e);var d=1,c=1,f=0,p=0,g=1,m=0,v=0,y=0;u.beginPath();for(var x=0;x>>16,v=(65280&f)>>>8,y=255&f,u.strokeStyle="rgba("+m+","+v+","+y+","+d+")",u.lineWidth=g,x+=3;break;case s.FILL_STYLE:p=h[x+1],c=h[x+2],m=(16711680&p)>>>16,v=(65280&p)>>>8,y=255&p,u.fillStyle="rgba("+m+","+v+","+y+","+c+")",x+=2;break;case s.BEGIN_PATH:u.beginPath();break;case s.CLOSE_PATH:u.closePath();break;case s.FILL_PATH:o||u.fill();break;case s.STROKE_PATH:o||u.stroke();break;case s.FILL_RECT:o?u.rect(h[x+1],h[x+2],h[x+3],h[x+4]):u.fillRect(h[x+1],h[x+2],h[x+3],h[x+4]),x+=4;break;case s.FILL_TRIANGLE:u.beginPath(),u.moveTo(h[x+1],h[x+2]),u.lineTo(h[x+3],h[x+4]),u.lineTo(h[x+5],h[x+6]),u.closePath(),o||u.fill(),x+=6;break;case s.STROKE_TRIANGLE:u.beginPath(),u.moveTo(h[x+1],h[x+2]),u.lineTo(h[x+3],h[x+4]),u.lineTo(h[x+5],h[x+6]),u.closePath(),o||u.stroke(),x+=6;break;case s.LINE_TO:u.lineTo(h[x+1],h[x+2]),x+=2;break;case s.MOVE_TO:u.moveTo(h[x+1],h[x+2]),x+=2;break;case s.LINE_FX_TO:u.lineTo(h[x+1],h[x+2]),x+=5;break;case s.MOVE_FX_TO:u.moveTo(h[x+1],h[x+2]),x+=5;break;case s.SAVE:u.save();break;case s.RESTORE:u.restore();break;case s.TRANSLATE:u.translate(h[x+1],h[x+2]),x+=2;break;case s.SCALE:u.scale(h[x+1],h[x+2]),x+=2;break;case s.ROTATE:u.rotate(h[x+1]),x+=1;break;case s.GRADIENT_FILL_STYLE:x+=5;break;case s.GRADIENT_LINE_STYLE:x+=6}}u.restore()}}},87079(t,e,i){var s=i(44603),r=i(43831);s.register("graphics",function(t,e){void 0===t&&(t={}),void 0!==e&&(t.add=e);var i=new r(this.scene,t);return t.add&&this.scene.sys.displayList.add(i),i})},1201(t,e,i){var s=i(43831);i(39429).register("graphics",function(t){return this.displayList.add(new s(this.scene,t))})},84503(t,e,i){var s=i(29747),r=s,n=s;r=i(77545),n=i(32768),n=i(32768),t.exports={renderWebGL:r,renderCanvas:n}},77545(t,e,i){var s=i(85592),r=i(91296),n=i(70554),a=i(61340),o=function(t,e,i){this.x=t,this.y=e,this.width=i},h=function(t,e,i){this.points=[],this.points[0]=new o(t,e,i),this.addPoint=function(t,e,i){var s=this.points[this.points.length-1];s.x===t&&s.y===e||this.points.push(new o(t,e,i))}},l=[],u=new a,d=new a,c={TL:0,TR:0,BL:0,BR:0},f={TL:0,TR:0,BL:0,BR:0},p=[{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0}];t.exports=function(t,e,i,a){if(0!==e.commandBuffer.length){var o=e.customRenderNodes,g=e.defaultRenderNodes,m=o.Submitter||g.Submitter,v=e.lighting,y=i,x=y.camera;x.addToRenderList(e);for(var T=r(e,x,a,!i.useCanvas).calc,w=u.loadIdentity(),b=e.commandBuffer,S=e.alpha,C=Math.max(e.pathDetailThreshold,t.config.pathDetailThreshold,0),E=1,A=0,_=0,M=0,R=2*Math.PI,P=[],O=0,L=!0,D=null,F=n.getTintAppendFloatAlpha,I=0;I0&&(q=q%R-R):q>R?q=R:q<0&&(q=R+q%R),null===D&&(D=new h(G+Math.cos(j)*H,V+Math.sin(j)*H,E),P.push(D),W+=.01);W<1+Z;)M=q*W+j,A=G+Math.cos(M)*H,_=V+Math.sin(M)*H,D.addPoint(A,_,E),W+=.01;M=q+j,A=G+Math.cos(M)*H,_=V+Math.sin(M)*H,D.addPoint(A,_,E);break;case s.FILL_RECT:T.multiply(w,d),(o.FillRect||g.FillRect).run(y,d,m,b[++I],b[++I],b[++I],b[++I],c.TL,c.TR,c.BL,c.BR,v);break;case s.FILL_TRIANGLE:T.multiply(w,d),(o.FillTri||g.FillTri).run(y,d,m,b[++I],b[++I],b[++I],b[++I],b[++I],b[++I],c.TL,c.TR,c.BL,v);break;case s.STROKE_TRIANGLE:T.multiply(w,d),p[0].x=b[++I],p[0].y=b[++I],p[0].width=E,p[1].x=b[++I],p[1].y=b[++I],p[1].width=E,p[2].x=b[++I],p[2].y=b[++I],p[2].width=E,p[3].x=p[0].x,p[3].y=p[0].y,p[3].width=E,(o.StrokePath||g.StrokePath).run(y,m,p,E,!1,d,f.TL,f.TR,f.BL,f.BR,v);break;case s.LINE_TO:G=b[++I],V=b[++I],null!==D?D.addPoint(G,V,E):(D=new h(G,V,E),P.push(D));break;case s.MOVE_TO:D=new h(b[++I],b[++I],E),P.push(D);break;case s.SAVE:l.push(w.copyToArray());break;case s.RESTORE:w.copyFromArray(l.pop());break;case s.TRANSLATE:G=b[++I],V=b[++I],w.translate(G,V);break;case s.SCALE:G=b[++I],V=b[++I],w.scale(G,V);break;case s.ROTATE:w.rotate(b[++I])}}}},26479(t,e,i){var s=i(61061),r=i(83419),n=i(51708),a=i(50792),o=i(46710),h=i(95540),l=i(35154),u=i(97022),d=i(41212),c=i(88492),f=i(68287),p=new r({Extends:a,initialize:function(t,e,i){a.call(this),i?e&&!Array.isArray(e)&&(e=[e]):Array.isArray(e)?d(e[0])&&(i=e,e=null):d(e)&&(i=e,e=null),this.scene=t,this.children=new Set,this.isParent=!0,this.type="Group",this.classType=h(i,"classType",f),this.name=h(i,"name",""),this.active=h(i,"active",!0),this.maxSize=h(i,"maxSize",-1),this.defaultKey=h(i,"defaultKey",null),this.defaultFrame=h(i,"defaultFrame",null),this.runChildUpdate=h(i,"runChildUpdate",!1),this.createCallback=h(i,"createCallback",null),this.removeCallback=h(i,"removeCallback",null),this.createMultipleCallback=h(i,"createMultipleCallback",null),this.internalCreateCallback=h(i,"internalCreateCallback",null),this.internalRemoveCallback=h(i,"internalRemoveCallback",null),e&&this.addMultiple(e),i&&this.createMultiple(i),this.on(n.ADDED_TO_SCENE,this.addedToScene,this),this.on(n.REMOVED_FROM_SCENE,this.removedFromScene,this)},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},create:function(t,e,i,s,r,n){if(void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.defaultKey),void 0===s&&(s=this.defaultFrame),void 0===r&&(r=!0),void 0===n&&(n=!0),this.isFull())return null;var a=new this.classType(this.scene,t,e,i,s);return a.addToDisplayList(this.scene.sys.displayList),a.addToUpdateList(),a.visible=r,a.setActive(n),this.add(a),a},createMultiple:function(t){if(this.isFull())return[];Array.isArray(t)||(t=[t]);var e=[];if(t[0].key)for(var i=0;i=0;u--)if((l=c[u]).active===i){if(++d===e)break}else l=null;return l?("number"==typeof r&&(l.x=r),"number"==typeof n&&(l.y=n),l):s?this.create(r,n,a,o,h):null},get:function(t,e,i,s,r){return this.getFirst(!1,!0,t,e,i,s,r)},getFirstAlive:function(t,e,i,s,r,n){return this.getFirst(!0,t,e,i,s,r,n)},getFirstDead:function(t,e,i,s,r,n){return this.getFirst(!1,t,e,i,s,r,n)},playAnimation:function(t,e){return s.PlayAnimation(Array.from(this.children),t,e),this},isFull:function(){return-1!==this.maxSize&&this.children.size>=this.maxSize},countActive:function(t){void 0===t&&(t=!0);var e=0;return this.children.forEach(function(i){i.active===t&&e++}),e},getTotalUsed:function(){return this.countActive()},getTotalFree:function(){var t=this.getTotalUsed();return(-1===this.maxSize?999999999999:this.maxSize)-t},setActive:function(t){return this.active=t,this},setName:function(t){return this.name=t,this},propertyValueSet:function(t,e,i,r,n){return s.PropertyValueSet(Array.from(this.children),t,e,i,r,n),this},propertyValueInc:function(t,e,i,r,n){return s.PropertyValueInc(Array.from(this.children),t,e,i,r,n),this},setX:function(t,e){return s.SetX(Array.from(this.children),t,e),this},setY:function(t,e){return s.SetY(Array.from(this.children),t,e),this},setXY:function(t,e,i,r){return s.SetXY(Array.from(this.children),t,e,i,r),this},incX:function(t,e){return s.IncX(Array.from(this.children),t,e),this},incY:function(t,e){return s.IncY(Array.from(this.children),t,e),this},incXY:function(t,e,i,r){return s.IncXY(Array.from(this.children),t,e,i,r),this},shiftPosition:function(t,e,i){return s.ShiftPosition(Array.from(this.children),t,e,i),this},angle:function(t,e){return s.Angle(Array.from(this.children),t,e),this},rotate:function(t,e){return s.Rotate(Array.from(this.children),t,e),this},rotateAround:function(t,e){return s.RotateAround(Array.from(this.children),t,e),this},rotateAroundDistance:function(t,e,i){return s.RotateAroundDistance(Array.from(this.children),t,e,i),this},setAlpha:function(t,e){return s.SetAlpha(Array.from(this.children),t,e),this},setTint:function(t,e,i,r){return s.SetTint(Array.from(this.children),t,e,i,r),this},setOrigin:function(t,e,i,r){return s.SetOrigin(Array.from(this.children),t,e,i,r),this},scaleX:function(t,e){return s.ScaleX(Array.from(this.children),t,e),this},scaleY:function(t,e){return s.ScaleY(Array.from(this.children),t,e),this},scaleXY:function(t,e,i,r){return s.ScaleXY(Array.from(this.children),t,e,i,r),this},setDepth:function(t,e){return s.SetDepth(Array.from(this.children),t,e),this},setBlendMode:function(t){return s.SetBlendMode(Array.from(this.children),t),this},setHitArea:function(t,e){return s.SetHitArea(Array.from(this.children),t,e),this},shuffle:function(){return s.Shuffle(Array.from(this.children)),this},kill:function(t){this.children.has(t)&&t.setActive(!1)},killAndHide:function(t){this.children.has(t)&&(t.setActive(!1),t.setVisible(!1))},setVisible:function(t,e,i){return s.SetVisible(Array.from(this.children),t,e,i),this},toggleVisible:function(){return s.ToggleVisible(Array.from(this.children)),this},destroy:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!1),this.scene&&!this.ignoreDestroy&&(this.emit(n.DESTROY,this),this.removeAllListeners(),this.scene.sys.updateList.remove(this),this.clear(e,t),this.scene=void 0,this.children=void 0)}});t.exports=p},94975(t,e,i){var s=i(44603),r=i(26479);s.register("group",function(t){return new r(this.scene,null,t)})},3385(t,e,i){var s=i(26479);i(39429).register("group",function(t,e){return this.updateList.add(new s(this.scene,t,e))})},88571(t,e,i){var s=i(40939),r=i(83419),n=i(31401),a=i(95643),o=i(59819),h=new r({Extends:a,Mixins:[n.Alpha,n.BlendMode,n.Depth,n.Flip,n.GetBounds,n.Lighting,n.Mask,n.Origin,n.RenderNodes,n.ScrollFactor,n.Size,n.TextureCrop,n.Tint,n.Transform,n.Visible,o],initialize:function(t,e,i,s,r){a.call(this,t,"Image"),this._crop=this.resetCropObject(),this.setTexture(s,r),this.setPosition(e,i),this.setSizeToFrame(),this.setOriginFromFrame(),this.initRenderNodes(this._defaultRenderNodesMap)},_defaultRenderNodesMap:{get:function(){return s}}});t.exports=h},40652(t){t.exports=function(t,e,i,s){i.addToRenderList(e),t.batchSprite(e,e.frame,i,s)}},82459(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(88571);r.register("image",function(t,e){void 0===t&&(t={});var i=n(t,"key",null),r=n(t,"frame",null),o=new a(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),s(this.scene,o,t),o})},2117(t,e,i){var s=i(88571);i(39429).register("image",function(t,e,i,r){return this.displayList.add(new s(this.scene,t,e,i,r))})},59819(t,e,i){var s=i(29747),r=s,n=s;r=i(99517),n=i(40652),t.exports={renderWebGL:r,renderCanvas:n}},99517(t){t.exports=function(t,e,i,s){i.camera.addToRenderList(e);var r=e.customRenderNodes,n=e.defaultRenderNodes;(r.Submitter||n.Submitter).run(i,e,s,0,r.Texturer||n.Texturer,r.Transformer||n.Transformer)}},77856(t,e,i){var s={Events:i(51708),DisplayList:i(8050),GameObjectCreator:i(44603),GameObjectFactory:i(39429),UpdateList:i(45027),Components:i(31401),GetCalcMatrix:i(91296),BuildGameObject:i(25305),BuildGameObjectAnimation:i(13059),GameObject:i(95643),BitmapText:i(22186),Blitter:i(6107),Bob:i(46590),Container:i(31559),DOMElement:i(3069),DynamicBitmapText:i(2638),Extern:i(42421),Graphics:i(43831),Group:i(26479),Image:i(88571),Layer:i(93595),Particles:i(18404),PathFollower:i(1159),RenderTexture:i(591),RetroFont:i(196),Rope:i(77757),Sprite:i(68287),Stamp:i(14727),Text:i(50171),GetTextSize:i(14220),MeasureText:i(79557),TextStyle:i(35762),TileSprite:i(20839),Zone:i(41481),Video:i(18471),Shape:i(17803),Arc:i(23629),Curve:i(89),Ellipse:i(19921),Grid:i(30479),IsoBox:i(61475),IsoTriangle:i(16933),Line:i(57847),Polygon:i(24949),Rectangle:i(74561),Star:i(55911),Triangle:i(36931),Factories:{Blitter:i(12709),Container:i(24961),DOMElement:i(2611),DynamicBitmapText:i(72566),Extern:i(56315),Graphics:i(1201),Group:i(3385),Image:i(2117),Layer:i(20005),Particles:i(676),PathFollower:i(90145),RenderTexture:i(60505),Rope:i(96819),Sprite:i(46409),Stamp:i(85326),StaticBitmapText:i(34914),Text:i(68005),TileSprite:i(91681),Zone:i(84175),Video:i(89025),Arc:i(42563),Curve:i(40511),Ellipse:i(1543),Grid:i(34137),IsoBox:i(3933),IsoTriangle:i(49803),Line:i(2481),Polygon:i(64827),Rectangle:i(87959),Star:i(93697),Triangle:i(45245)},Creators:{Blitter:i(9403),Container:i(77143),DynamicBitmapText:i(11164),Graphics:i(87079),Group:i(94975),Image:i(82459),Layer:i(25179),Particles:i(92730),RenderTexture:i(34495),Rope:i(26209),Sprite:i(15567),Stamp:i(31479),StaticBitmapText:i(57336),Text:i(71259),TileSprite:i(14167),Zone:i(95261),Video:i(11511)}};s.CaptureFrame=i(43451),s.Gradient=i(34637),s.Noise=i(35387),s.NoiseCell2D=i(51513),s.NoiseCell3D=i(15686),s.NoiseCell4D=i(41946),s.NoiseSimplex2D=i(1792),s.NoiseSimplex3D=i(51098),s.Shader=i(20071),s.NineSlice=i(28103),s.PointLight=i(80321),s.SpriteGPULayer=i(76573),s.Factories.CaptureFrame=i(20421),s.Factories.Gradient=i(69315),s.Factories.Noise=i(34757),s.Factories.NoiseCell2D=i(26590),s.Factories.NoiseCell3D=i(89918),s.Factories.NoiseCell4D=i(65874),s.Factories.NoiseSimplex2D=i(80308),s.Factories.NoiseSimplex3D=i(73810),s.Factories.Shader=i(74177),s.Factories.NineSlice=i(47521),s.Factories.PointLight=i(71255),s.Factories.SpriteGPULayer=i(96019),s.Creators.CaptureFrame=i(23675),s.Creators.Gradient=i(26353),s.Creators.Noise=i(39931),s.Creators.NoiseCell2D=i(98292),s.Creators.NoiseCell3D=i(97044),s.Creators.NoiseCell4D=i(20136),s.Creators.NoiseSimplex2D=i(51754),s.Creators.NoiseSimplex3D=i(71112),s.Creators.Shader=i(54935),s.Creators.NineSlice=i(28279),s.Creators.PointLight=i(39829),s.Creators.SpriteGPULayer=i(16193),s.Light=i(41432),s.LightsManager=i(61356),s.LightsPlugin=i(88992),t.exports=s},93595(t,e,i){var s=i(10312),r=i(83419),n=i(31401),a=i(53774),o=i(45893),h=i(50792),l=i(51708),u=i(73162),d=i(33963),c=i(44594),f=i(19186),p=new r({Extends:u,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Filters,n.Mask,n.RenderSteps,n.Visible,h,d],initialize:function(t,e){u.call(this,t),h.call(this),this.scene=t,this.displayList=null,this.type="Layer",this.state=0,this.parentContainer=null,this.name="",this.active=!0,this.tabIndex=-1,this.data=null,this.renderFlags=15,this.cameraFilter=0,this.input=null,this.body=null,this.ignoreDestroy=!1,this.systems=t.sys,this.events=t.sys.events,this.sortChildrenFlag=!1,this.addCallback=this.addChildCallback,this.removeCallback=this.removeChildCallback,this.clearAlpha(),this.setBlendMode(s.SKIP_CHECK),e&&this.add(e),this.addRenderStep&&this.addRenderStep(this.renderWebGL),t.sys.queueDepthSort()},setActive:function(t){return this.active=t,this},setName:function(t){return this.name=t,this},setState:function(t){return this.state=t,this},setDataEnabled:function(){return this.data||(this.data=new o(this)),this},setData:function(t,e){return this.data||(this.data=new o(this)),this.data.set(t,e),this},incData:function(t,e){return this.data||(this.data=new o(this)),this.data.inc(t,e),this},toggleData:function(t){return this.data||(this.data=new o(this)),this.data.toggle(t),this},getData:function(t){return this.data||(this.data=new o(this)),this.data.get(t)},setInteractive:function(){return this},disableInteractive:function(){return this},removeInteractive:function(){return this},addedToScene:function(){},removedFromScene:function(){},update:function(){},toJSON:function(){return a(this)},willRender:function(t){return!(15!==this.renderFlags||0===this.list.length||0!==this.cameraFilter&&this.cameraFilter&t.id)},getIndexList:function(){for(var t=this,e=this.parentContainer,i=[];e&&(i.unshift(e.getIndex(t)),t=e,e.parentContainer);)e=e.parentContainer;return i.unshift(this.displayList.getIndex(t)),i},addChildCallback:function(t){var e=t.displayList;e&&e!==this&&t.removeFromDisplayList(),t.displayList||(this.queueDepthSort(),t.displayList=this,t.emit(l.ADDED_TO_SCENE,t,this.scene),this.events.emit(c.ADDED_TO_SCENE,t,this.scene))},removeChildCallback:function(t){this.queueDepthSort(),t.displayList=null,t.emit(l.REMOVED_FROM_SCENE,t,this.scene),this.events.emit(c.REMOVED_FROM_SCENE,t,this.scene)},queueDepthSort:function(){this.sortChildrenFlag=!0},depthSort:function(){this.sortChildrenFlag&&(f(this.list,this.sortByDepth),this.sortChildrenFlag=!1)},sortByDepth:function(t,e){return t._depth-e._depth},getChildren:function(){return this.list},addToDisplayList:function(t){return void 0===t&&(t=this.scene.sys.displayList),this.displayList&&this.displayList!==t&&this.removeFromDisplayList(),t.exists(this)||(this.displayList=t,t.add(this,!0),t.queueDepthSort(),this.emit(l.ADDED_TO_SCENE,this,this.scene),t.events.emit(c.ADDED_TO_SCENE,this,this.scene)),this},removeFromDisplayList:function(){var t=this.displayList||this.scene.sys.displayList;return t.exists(this)&&(t.remove(this,!0),t.queueDepthSort(),this.displayList=null,this.emit(l.REMOVED_FROM_SCENE,this,this.scene),t.events.emit(c.REMOVED_FROM_SCENE,this,this.scene)),this},getDisplayList:function(){var t=null;return this.parentContainer?t=this.parentContainer.list:this.displayList&&(t=this.displayList.list),t},destroy:function(t){if(this.scene&&!this.ignoreDestroy){this.emit(l.DESTROY,this);for(var e=this.list;e.length;)e[0].destroy(t);this.removeAllListeners(),this.displayList&&(this.displayList.remove(this,!0,!1),this.displayList.queueDepthSort()),this.data&&(this.data.destroy(),this.data=void 0),this.filterCamera&&(this.filterCamera.destroy(),this.filterCamera=void 0),this.active=!1,this.visible=!1,this.list=void 0,this.scene=void 0,this.displayList=void 0,this.systems=void 0,this.events=void 0}}});t.exports=p},2956(t){t.exports=function(t,e,i){var s=e.list;if(0!==s.length){e.depthSort();var r=-1!==e.blendMode;r||t.setBlendMode(0);var n=e._alpha;e.mask&&e.mask.preRenderCanvas(t,null,i);for(var a=0;athis.maxLights&&(u(r,this.sortByDistance),r=r.slice(0,this.maxLights)),this.visibleLights=r.length,r},sortByDistance:function(t,e){return t.distance>=e.distance},setAmbientColor:function(t){var e=d.getFloatsFromUintRGB(t);return this.ambientColor.set(e[0],e[1],e[2]),this},getMaxVisibleLights:function(){return this.maxLights},getLightCount:function(){return this.lights.length},addLight:function(t,e,i,s,r,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=128),void 0===s&&(s=16777215),void 0===r&&(r=1),void 0===n&&(n=.1*i);var o=d.getFloatsFromUintRGB(s),h=new a(t,e,i,o[0],o[1],o[2],r,n);return this.lights.push(h),h},removeLight:function(t){var e=this.lights.indexOf(t);return e>=0&&l(this.lights,e),this},shutdown:function(){this.lights.length=0},destroy:function(){this.shutdown()}});t.exports=c},88992(t,e,i){var s=i(83419),r=i(61356),n=i(37277),a=i(44594),o=new s({Extends:r,initialize:function(t){this.scene=t,this.systems=t.sys,t.sys.settings.isBooted||t.sys.events.once(a.BOOT,this.boot,this),r.call(this)},boot:function(){var t=this.systems.events;t.on(a.SHUTDOWN,this.shutdown,this),t.on(a.DESTROY,this.destroy,this)},destroy:function(){this.shutdown(),this.scene=void 0,this.systems=void 0}});n.register("LightsPlugin",o,"lights"),t.exports=o},28103(t,e,i){var s=i(30529),r=i(83419),n=i(31401),a=i(95643),o=i(78023),h=i(84322),l=i(82513),u=new r({Extends:a,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.GetBounds,n.Mask,n.Origin,n.RenderNodes,n.ScrollFactor,n.Texture,n.Transform,n.Visible,o],initialize:function(t,e,i,s,r,n,o,u,d,c,f,p,g){a.call(this,t,"NineSlice"),this._width,this._height,this._originX=.5,this._originY=.5,this._sizeComponent=!0,this.vertices=[],this.leftWidth,this.rightWidth,this.topHeight,this.bottomHeight,this.tileX=p||!1,this.tileY=g||!1,this._repeatCountX=1,this._repeatCountY=1,this.tint=16777215,this.tintMode=h.MULTIPLY;var m=t.textures.getFrame(s,r);this.is3Slice=!c&&!f,m&&m.scale9&&(this.is3Slice=m.is3Slice);for(var v=this.is3Slice?18:54,y=0;y0?Math.max(1,Math.floor(t/e)):1},_rebuildVertexArray:function(t,e){if(t===this._repeatCountX&&e===this._repeatCountY)return!1;this._repeatCountX=t,this._repeatCountY=e;var i=(t+2)*(this.is3Slice?1:e+2)*6,s=this.vertices;if(s.length!==i){s.length=0;for(var r=0;r.5&&(this.vx-=i*(r-.5)),n<.5?this.vy+=s*(.5-n):n>.5&&(this.vy-=s*(n-.5)),this}});t.exports=n},52230(t,e,i){var s=i(91296),r=i(70554),n={multiTexturing:!0};t.exports=function(t,e,i,a){var o=e.vertices,h=o.length;if(0!==h){var l=i.camera;l.addToRenderList(e);for(var u,d,c,f=e.alpha,p=e.customRenderNodes.BatchHandler||e.defaultRenderNodes.BatchHandler,g=s(e,l,a,!i.useCanvas).calc,m=r.getTintAppendFloatAlpha(e.tint,f),v=e.frame.source.glTexture,y=e.tintMode,x=0;x=0&&(e=t);break;case 4:var i=(this.end-this.start)/this.steps;e=u(t,i),this.counter=e;break;case 5:case 6:case 7:e=r(t,this.start,this.end);break;case 9:e=this.start[0]}return this.current=e,this},getMethod:function(){var t=this.propertyValue;if(null===t)return 0;var e=typeof t;if("number"===e)return 1;if(Array.isArray(t))return 2;if("function"===e)return 3;if("object"===e){if(this.hasBoth(t,"start","end"))return this.has(t,"steps")?4:5;if(this.hasBoth(t,"min","max"))return 6;if(this.has(t,"random"))return 7;if(this.hasEither(t,"onEmit","onUpdate"))return 8;if(this.hasEither(t,"values","interpolation"))return 9}return 0},setMethods:function(){var t=this.propertyValue,e=t,i=this.defaultEmit,s=this.defaultUpdate;switch(this.method){case 1:i=this.staticValueEmit;break;case 2:i=this.randomStaticValueEmit,e=t[0];break;case 3:this._onEmit=t,i=this.proxyEmit,e=this.defaultValue;break;case 4:this.start=t.start,this.end=t.end,this.steps=t.steps,this.counter=this.start,this.yoyo=!!this.has(t,"yoyo")&&t.yoyo,this.direction=0,i=this.steppedEmit,e=this.start;break;case 5:this.start=t.start,this.end=t.end;var r=this.has(t,"ease")?t.ease:"Linear";this.ease=o(r,t.easeParams),i=this.has(t,"random")&&t.random?this.randomRangedValueEmit:this.easedValueEmit,s=this.easeValueUpdate,e=this.start;break;case 6:this.start=t.min,this.end=t.max,i=this.has(t,"int")&&t.int?this.randomRangedIntEmit:this.randomRangedValueEmit,e=this.start;break;case 7:var n=t.random;Array.isArray(n)&&(this.start=n[0],this.end=n[1]),i=this.randomRangedIntEmit,e=this.start;break;case 8:this._onEmit=this.has(t,"onEmit")?t.onEmit:this.defaultEmit,this._onUpdate=this.has(t,"onUpdate")?t.onUpdate:this.defaultUpdate,i=this.proxyEmit,s=this.proxyUpdate,e=this.defaultValue;break;case 9:this.start=t.values;var a=this.has(t,"ease")?t.ease:"Linear";this.ease=o(a,t.easeParams),this.interpolation=l(t.interpolation),i=this.easedValueEmit,s=this.easeValueUpdate,e=this.start[0]}return this.onEmit=i,this.onUpdate=s,this.current=e,this},has:function(t,e){return t.hasOwnProperty(e)},hasBoth:function(t,e,i){return t.hasOwnProperty(e)&&t.hasOwnProperty(i)},hasEither:function(t,e,i){return t.hasOwnProperty(e)||t.hasOwnProperty(i)},defaultEmit:function(){return this.defaultValue},defaultUpdate:function(t,e,i,s){return s},proxyEmit:function(t,e,i){var s=this._onEmit(t,e,i);return this.current=s,s},proxyUpdate:function(t,e,i,s){var r=this._onUpdate(t,e,i,s);return this.current=r,r},staticValueEmit:function(){return this.current},staticValueUpdate:function(){return this.current},randomStaticValueEmit:function(){var t=Math.floor(Math.random()*this.propertyValue.length);return this.current=this.propertyValue[t],this.current},randomRangedValueEmit:function(t,e){var i=a(this.start,this.end);return t&&t.data[e]&&(t.data[e].min=i,t.data[e].max=this.end),this.current=i,i},randomRangedIntEmit:function(t,e){var i=s(this.start,this.end);return t&&t.data[e]&&(t.data[e].min=i,t.data[e].max=this.end),this.current=i,i},steppedEmit:function(){var t,e=this.counter,i=e,s=(this.end-this.start)/this.steps;this.yoyo?(0===this.direction?(i+=s)>=this.end&&(t=i-this.end,i=this.end-t,this.direction=1):(i-=s)<=this.start&&(t=this.start-i,i=this.start+t,this.direction=0),this.counter=i):this.counter=d(i+s,this.start,this.end);return this.current=e,e},easedValueEmit:function(t,e){if(t&&t.data[e]){var i=t.data[e];i.min=this.start,i.max=this.end}return this.current=this.start,this.start},easeValueUpdate:function(t,e,i){var s,r=t.data[e],n=this.ease(i);return s=this.interpolation?this.interpolation(this.start,n):(r.max-r.min)*n+r.min,this.current=s,s},destroy:function(){this.propertyValue=null,this.defaultValue=null,this.ease=null,this.interpolation=null,this._onEmit=null,this._onUpdate=null}});t.exports=c},24502(t,e,i){var s=i(83419),r=i(95540),n=i(20286),a=new s({Extends:n,initialize:function(t,e,i,s,a){if("object"==typeof t){var o=t;t=r(o,"x",0),e=r(o,"y",0),i=r(o,"power",0),s=r(o,"epsilon",100),a=r(o,"gravity",50)}else void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=100),void 0===a&&(a=50);n.call(this,t,e,!0),this._gravity=a,this._power=i*a,this._epsilon=s*s},update:function(t,e){var i=this.x-t.x,s=this.y-t.y,r=i*i+s*s;if(0!==r){var n=Math.sqrt(r);r0&&(this.anims=new s(this)),this.bounds=new o},emit:function(t,e,i,s,r,n){return this.emitter.emit(t,e,i,s,r,n)},isAlive:function(){return this.lifeCurrent>0},kill:function(){this.lifeCurrent=0},setPosition:function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.x=t,this.y=e},fire:function(t,e){var i=this.emitter,s=i.ops,r=i.getAnim();if(r?this.anims.play(r):(this.frame=i.getFrame(),this.texture=this.frame.texture),!this.frame)throw new Error("Particle has no texture frame");if(i.getEmitZone(this),void 0===t?this.x+=s.x.onEmit(this,"x"):s.x.steps>0?this.x+=t+s.x.onEmit(this,"x"):this.x+=t,void 0===e?this.y+=s.y.onEmit(this,"y"):s.y.steps>0?this.y+=e+s.y.onEmit(this,"y"):this.y+=e,this.life=s.lifespan.onEmit(this,"lifespan"),this.lifeCurrent=this.life,this.lifeT=0,this.delayCurrent=s.delay.onEmit(this,"delay"),this.holdCurrent=s.hold.onEmit(this,"hold"),this.scaleX=s.scaleX.onEmit(this,"scaleX"),this.scaleY=s.scaleY.active?s.scaleY.onEmit(this,"scaleY"):this.scaleX,this.angle=s.rotate.onEmit(this,"rotate"),this.rotation=a(this.angle),i.worldMatrix.transformPoint(this.x,this.y,this.worldPosition),0===this.delayCurrent&&i.getDeathZone(this))return this.lifeCurrent=0,!1;var n=s.speedX.onEmit(this,"speedX"),o=s.speedY.active?s.speedY.onEmit(this,"speedY"):n;if(i.radial){var h=a(s.angle.onEmit(this,"angle"));this.velocityX=Math.cos(h)*Math.abs(n),this.velocityY=Math.sin(h)*Math.abs(o)}else if(i.moveTo){var l=s.moveToX.onEmit(this,"moveToX"),u=s.moveToY.onEmit(this,"moveToY"),d=this.life/1e3;this.velocityX=(l-this.x)/d,this.velocityY=(u-this.y)/d}else this.velocityX=n,this.velocityY=o;return i.acceleration&&(this.accelerationX=s.accelerationX.onEmit(this,"accelerationX"),this.accelerationY=s.accelerationY.onEmit(this,"accelerationY")),this.maxVelocityX=s.maxVelocityX.onEmit(this,"maxVelocityX"),this.maxVelocityY=s.maxVelocityY.onEmit(this,"maxVelocityY"),this.bounce=s.bounce.onEmit(this,"bounce"),this.alpha=s.alpha.onEmit(this,"alpha"),s.color.active?this.tint=s.color.onEmit(this,"tint"):this.tint=s.tint.onEmit(this,"tint"),!0},update:function(t,e,i){if(this.lifeCurrent<=0)return!(this.holdCurrent>0)||(this.holdCurrent-=t,this.holdCurrent<=0);if(this.delayCurrent>0)return this.delayCurrent-=t,!1;this.anims&&this.anims.update(0,t);var s=this.emitter,n=s.ops,o=1-this.lifeCurrent/this.life;if(this.lifeT=o,this.x=n.x.onUpdate(this,"x",o,this.x),this.y=n.y.onUpdate(this,"y",o,this.y),s.moveTo){var h=n.moveToX.onUpdate(this,"moveToX",o,s.moveToX),l=n.moveToY.onUpdate(this,"moveToY",o,s.moveToY),u=this.lifeCurrent/1e3;this.velocityX=(h-this.x)/u,this.velocityY=(l-this.y)/u}return this.computeVelocity(s,t,e,i,o),this.scaleX=n.scaleX.onUpdate(this,"scaleX",o,this.scaleX),n.scaleY.active?this.scaleY=n.scaleY.onUpdate(this,"scaleY",o,this.scaleY):this.scaleY=this.scaleX,this.angle=n.rotate.onUpdate(this,"rotate",o,this.angle),this.rotation=a(this.angle),s.getDeathZone(this)?(this.lifeCurrent=0,!0):(this.alpha=r(n.alpha.onUpdate(this,"alpha",o,this.alpha),0,1),n.color.active?this.tint=n.color.onUpdate(this,"color",o,this.tint):this.tint=n.tint.onUpdate(this,"tint",o,this.tint),this.lifeCurrent-=t,this.lifeCurrent<=0&&this.holdCurrent<=0)},computeVelocity:function(t,e,i,s,n){var a=t.ops,o=this.velocityX,h=this.velocityY,l=a.accelerationX.onUpdate(this,"accelerationX",n,this.accelerationX),u=a.accelerationY.onUpdate(this,"accelerationY",n,this.accelerationY),d=a.maxVelocityX.onUpdate(this,"maxVelocityX",n,this.maxVelocityX),c=a.maxVelocityY.onUpdate(this,"maxVelocityY",n,this.maxVelocityY);this.bounce=a.bounce.onUpdate(this,"bounce",n,this.bounce),o+=t.gravityX*i+l*i,h+=t.gravityY*i+u*i,o=r(o,-d,d),h=r(h,-c,c),this.velocityX=o,this.velocityY=h,this.x+=o*i,this.y+=h*i,t.worldMatrix.transformPoint(this.x,this.y,this.worldPosition);for(var f=0;fe.right&&this.collideRight&&(t.x-=s.x-e.right,t.velocityX*=i),s.ye.bottom&&this.collideBottom&&(t.y-=s.y-e.bottom,t.velocityY*=i)}});t.exports=a},31600(t,e,i){var s=i(68668),r=i(83419),n=i(31401),a=i(53774),o=i(43459),h=i(26388),l=i(19909),u=i(76472),d=i(44777),c=i(20696),f=i(95643),p=i(95540),g=i(26546),m=i(24502),v=i(69036),y=i(1985),x=i(97022),T=i(86091),w=i(73162),b=i(20074),S=i(269),C=i(56480),E=i(69601),A=i(68875),_=i(87841),M=i(59996),R=i(72905),P=i(90668),O=i(19186),L=i(84322),D=i(61340),F=i(26099),I=i(15994),N=["active","advance","blendMode","colorEase","deathCallback","deathCallbackScope","duration","emitCallback","emitCallbackScope","follow","frequency","gravityX","gravityY","maxAliveParticles","maxParticles","name","emitting","particleBringToTop","particleClass","radial","sortCallback","sortOrderAsc","sortProperty","stopAfter","tintMode","timeScale","trackVisible","visible"],B=["accelerationX","accelerationY","alpha","angle","bounce","color","delay","hold","lifespan","maxVelocityX","maxVelocityY","moveToX","moveToY","quantity","rotate","scaleX","scaleY","speedX","speedY","tint","x","y"],k=new r({Extends:f,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Lighting,n.Mask,n.RenderNodes,n.ScrollFactor,n.Texture,n.Transform,n.Visible,P],initialize:function(t,e,i,s,r){f.call(this,t,"ParticleEmitter"),this.particleClass=C,this.config=null,this.ops={accelerationX:new d("accelerationX",0),accelerationY:new d("accelerationY",0),alpha:new d("alpha",1),angle:new d("angle",{min:0,max:360},!0),bounce:new d("bounce",0),color:new u("color"),delay:new d("delay",0,!0),hold:new d("hold",0,!0),lifespan:new d("lifespan",1e3,!0),maxVelocityX:new d("maxVelocityX",1e4),maxVelocityY:new d("maxVelocityY",1e4),moveToX:new d("moveToX",0),moveToY:new d("moveToY",0),quantity:new d("quantity",1,!0),rotate:new d("rotate",0),scaleX:new d("scaleX",1),scaleY:new d("scaleY",1),speedX:new d("speedX",0,!0),speedY:new d("speedY",0,!0),tint:new d("tint",16777215),x:new d("x",0),y:new d("y",0)},this.radial=!0,this.gravityX=0,this.gravityY=0,this.acceleration=!1,this.moveTo=!1,this.emitCallback=null,this.emitCallbackScope=null,this.deathCallback=null,this.deathCallbackScope=null,this.maxParticles=0,this.maxAliveParticles=0,this.stopAfter=0,this.duration=0,this.frequency=0,this.emitting=!0,this.particleBringToTop=!0,this.timeScale=1,this.emitZones=[],this.deathZones=[],this.viewBounds=null,this.follow=null,this.followOffset=new F,this.trackVisible=!1,this.frames=[],this.randomFrame=!0,this.frameQuantity=1,this.anims=[],this.randomAnim=!0,this.animQuantity=1,this.dead=[],this.alive=[],this.counters=new Float32Array(10),this.skipping=!1,this.worldMatrix=new D,this.sortProperty="",this.sortOrderAsc=!0,this.sortCallback=this.depthSortCallback,this.processors=new w(this),this.tintMode=L.MULTIPLY,this.initRenderNodes(this._defaultRenderNodesMap),this.setPosition(e,i),this.setTexture(s),r&&this.setConfig(r)},_defaultRenderNodesMap:{get:function(){return s}},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},setConfig:function(t){if(!t)return this;this.config=t;var e=0,i="",s=this.ops;for(e=0;e=this.animQuantity&&(this.animCounter=0,this.currentAnim=I(this.currentAnim+1,0,e)),i},setAnim:function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=1),this.randomAnim=e,this.animQuantity=i,this.currentAnim=0;var s=typeof t;if(this.anims.length=0,Array.isArray(t))this.anims=this.anims.concat(t);else if("string"===s)this.anims.push(t);else if("object"===s){var r=t;(t=p(r,"anims",null))&&(this.anims=this.anims.concat(t));var n=p(r,"cycle",!1);this.randomAnim=!n,this.animQuantity=p(r,"quantity",i)}return 1===this.anims.length&&(this.animQuantity=1,this.randomAnim=!1),this},setRadial:function(t){return void 0===t&&(t=!0),this.radial=t,this},addParticleBounds:function(t,e,i,s,r,n,a,o){if("object"==typeof t){var h=t;t=h.x,e=h.y,i=x(h,"w")?h.w:h.width,s=x(h,"h")?h.h:h.height}return this.addParticleProcessor(new E(t,e,i,s,r,n,a,o))},setParticleSpeed:function(t,e){return void 0===e&&(e=t),this.ops.speedX.onChange(t),t===e?this.ops.speedY.active=!1:this.ops.speedY.onChange(e),this.radial=!0,this},setParticleScale:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.ops.scaleX.onChange(t),this.ops.scaleY.onChange(e),this},setParticleGravity:function(t,e){return this.gravityX=t,this.gravityY=e,this},setParticleAlpha:function(t){return this.ops.alpha.onChange(t),this},setParticleTint:function(t){return this.ops.tint.onChange(t),this},setEmitterAngle:function(t){return this.ops.angle.onChange(t),this},setParticleLifespan:function(t){return this.ops.lifespan.onChange(t),this},setQuantity:function(t){return this.quantity=t,this},setFrequency:function(t,e){return this.frequency=t,this.flowCounter=t>0?t:0,e&&(this.quantity=e),this},addDeathZone:function(t){var e;Array.isArray(t)||(t=[t]);for(var i=[],s=0;s-1&&(this.zoneTotal++,this.zoneTotal===s.total&&(this.zoneTotal=0,this.zoneIndex++,this.zoneIndex===i&&(this.zoneIndex=0)))}},getDeathZone:function(t){for(var e=this.deathZones,i=0;i=0&&(this.zoneIndex=e),this},addParticleProcessor:function(t){return this.processors.exists(t)||(t.emitter&&t.emitter.removeParticleProcessor(t),this.processors.add(t),t.emitter=this),t},removeParticleProcessor:function(t){return this.processors.exists(t)&&(this.processors.remove(t,!0),t.emitter=null),t},getProcessors:function(){return this.processors.getAll("active",!0)},createGravityWell:function(t){return this.addParticleProcessor(new m(t))},reserve:function(t){var e=this.dead;if(this.maxParticles>0){var i=this.getParticleCount();i+t>this.maxParticles&&(t=this.maxParticles-(i+t))}for(var s=0;s0&&this.getParticleCount()>=this.maxParticles||this.maxAliveParticles>0&&this.getAliveParticleCount()>=this.maxAliveParticles},onParticleEmit:function(t,e){return void 0===t?(this.emitCallback=null,this.emitCallbackScope=null):"function"==typeof t&&(this.emitCallback=t,e&&(this.emitCallbackScope=e)),this},onParticleDeath:function(t,e){return void 0===t?(this.deathCallback=null,this.deathCallbackScope=null):"function"==typeof t&&(this.deathCallback=t,e&&(this.deathCallbackScope=e)),this},killAll:function(){for(var t=this.dead,e=this.alive;e.length>0;)t.push(e.pop());return this},forEachAlive:function(t,e){for(var i=this.alive,s=i.length,r=0;r0&&this.fastForward(t),this.emitting=!0,this.resetCounters(this.frequency,!0),void 0!==e&&(this.duration=Math.abs(e)),this.emit(c.START,this)),this},stop:function(t){return void 0===t&&(t=!1),this.emitting&&(this.emitting=!1,t&&this.killAll(),this.emit(c.STOP,this)),this},pause:function(){return this.active=!1,this},resume:function(){return this.active=!0,this},setSortProperty:function(t,e){return void 0===t&&(t=""),void 0===e&&(e=this.true),this.sortProperty=t,this.sortOrderAsc=e,this.sortCallback=this.depthSortCallback,this},setSortCallback:function(t){return t=""!==this.sortProperty?this.depthSortCallback:null,this.sortCallback=t,this},depthSort:function(){return O(this.alive,this.sortCallback.bind(this)),this},depthSortCallback:function(t,e){var i=this.sortProperty;return this.sortOrderAsc?t[i]-e[i]:e[i]-t[i]},flow:function(t,e,i){return void 0===e&&(e=1),this.emitting=!1,this.frequency=t,this.quantity=e,void 0!==i&&(this.stopAfter=i),this.start()},explode:function(t,e,i){this.frequency=-1,this.resetCounters(-1,!0);var s=this.emitParticle(t,e,i);return this.emit(c.EXPLODE,this,s),s},emitParticleAt:function(t,e,i){return this.emitParticle(i,t,e)},emitParticle:function(t,e,i){if(!this.atLimit()){void 0===t&&(t=this.ops.quantity.onEmit());for(var s=this.dead,r=this.stopAfter,n=this.follow?this.follow.x+this.followOffset.x:e,a=this.follow?this.follow.y+this.followOffset.y:i,o=0;o0&&(this.stopCounter++,this.stopCounter>=r))break;if(this.atLimit())break}return h}},fastForward:function(t,e){void 0===e&&(e=1e3/60);var i=0;for(this.skipping=!0;i0){var u=this.deathCallback,d=this.deathCallbackScope;for(a=h-1;a>=0;a--){var f=o[a];r.splice(f.index,1),n.push(f.particle),u&&u.call(d,f.particle),f.particle.setPosition()}}if(this.emitting||this.skipping){if(0===this.frequency)this.emitParticle();else if(this.frequency>0)for(this.flowCounter-=e;this.flowCounter<=0;)this.emitParticle(),this.flowCounter+=this.frequency;this.skipping||(this.duration>0&&(this.elapsed+=e,this.elapsed>=this.duration&&this.stop()),this.stopAfter>0&&this.stopCounter>=this.stopAfter&&this.stop())}else 1===this.completeFlag&&0===r.length&&(this.completeFlag=0,this.emit(c.COMPLETE,this))},overlap:function(t){for(var e=this.getWorldTransformMatrix(),i=this.alive,s=i.length,r=[],n=0;n0){var u=0;for(this.skipping=!0;u0&&T(s,t,t),s},createEmitter:function(){throw new Error("createEmitter removed. See ParticleEmitter docs for info")},particleX:{get:function(){return this.ops.x.current},set:function(t){this.ops.x.onChange(t)}},particleY:{get:function(){return this.ops.y.current},set:function(t){this.ops.y.onChange(t)}},accelerationX:{get:function(){return this.ops.accelerationX.current},set:function(t){this.ops.accelerationX.onChange(t)}},accelerationY:{get:function(){return this.ops.accelerationY.current},set:function(t){this.ops.accelerationY.onChange(t)}},maxVelocityX:{get:function(){return this.ops.maxVelocityX.current},set:function(t){this.ops.maxVelocityX.onChange(t)}},maxVelocityY:{get:function(){return this.ops.maxVelocityY.current},set:function(t){this.ops.maxVelocityY.onChange(t)}},speed:{get:function(){return this.ops.speedX.current},set:function(t){this.ops.speedX.onChange(t),this.ops.speedY.onChange(t)}},speedX:{get:function(){return this.ops.speedX.current},set:function(t){this.ops.speedX.onChange(t)}},speedY:{get:function(){return this.ops.speedY.current},set:function(t){this.ops.speedY.onChange(t)}},moveToX:{get:function(){return this.ops.moveToX.current},set:function(t){this.ops.moveToX.onChange(t)}},moveToY:{get:function(){return this.ops.moveToY.current},set:function(t){this.ops.moveToY.onChange(t)}},bounce:{get:function(){return this.ops.bounce.current},set:function(t){this.ops.bounce.onChange(t)}},particleScaleX:{get:function(){return this.ops.scaleX.current},set:function(t){this.ops.scaleX.onChange(t)}},particleScaleY:{get:function(){return this.ops.scaleY.current},set:function(t){this.ops.scaleY.onChange(t)}},particleColor:{get:function(){return this.ops.color.current},set:function(t){this.ops.color.onChange(t)}},colorEase:{get:function(){return this.ops.color.easeName},set:function(t){this.ops.color.setEase(t)}},particleTint:{get:function(){return this.ops.tint.current},set:function(t){this.ops.tint.onChange(t)}},particleAlpha:{get:function(){return this.ops.alpha.current},set:function(t){this.ops.alpha.onChange(t)}},lifespan:{get:function(){return this.ops.lifespan.current},set:function(t){this.ops.lifespan.onChange(t)}},particleAngle:{get:function(){return this.ops.angle.current},set:function(t){this.ops.angle.onChange(t)}},particleRotate:{get:function(){return this.ops.rotate.current},set:function(t){this.ops.rotate.onChange(t)}},quantity:{get:function(){return this.ops.quantity.current},set:function(t){this.ops.quantity.onChange(t)}},delay:{get:function(){return this.ops.delay.current},set:function(t){this.ops.delay.onChange(t)}},hold:{get:function(){return this.ops.hold.current},set:function(t){this.ops.hold.onChange(t)}},flowCounter:{get:function(){return this.counters[0]},set:function(t){this.counters[0]=t}},frameCounter:{get:function(){return this.counters[1]},set:function(t){this.counters[1]=t}},animCounter:{get:function(){return this.counters[2]},set:function(t){this.counters[2]=t}},elapsed:{get:function(){return this.counters[3]},set:function(t){this.counters[3]=t}},stopCounter:{get:function(){return this.counters[4]},set:function(t){this.counters[4]=t}},completeFlag:{get:function(){return this.counters[5]},set:function(t){this.counters[5]=t}},zoneIndex:{get:function(){return this.counters[6]},set:function(t){this.counters[6]=t}},zoneTotal:{get:function(){return this.counters[7]},set:function(t){this.counters[7]=t}},currentFrame:{get:function(){return this.counters[8]},set:function(t){this.counters[8]=t}},currentAnim:{get:function(){return this.counters[9]},set:function(t){this.counters[9]=t}},preDestroy:function(){var t;this.texture=null,this.frames=null,this.anims=null,this.emitCallback=null,this.emitCallbackScope=null,this.deathCallback=null,this.deathCallbackScope=null,this.emitZones=null,this.deathZones=null,this.bounds=null,this.follow=null,this.counters=null;var e=this.ops;for(t=0;t0&&T.height>0){var w=-x.halfWidth,b=-x.halfHeight;l.globalAlpha=y,l.save(),a.setToContext(l),u&&(w=Math.round(w),b=Math.round(b)),l.imageSmoothingEnabled=!x.source.scaleMode,l.drawImage(x.source.image,T.x,T.y,T.width,T.height,w,b,T.width,T.height),l.restore()}}}l.restore()}}},92730(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(95540),o=i(31600);r.register("particles",function(t,e){void 0===t&&(t={});var i=n(t,"key",null),r=a(t,"config",null),h=new o(this.scene,0,0,i);return void 0!==e&&(t.add=e),s(this.scene,h,t),r&&h.setConfig(r),h})},676(t,e,i){var s=i(39429),r=i(31600);s.register("particles",function(t,e,i,s){return void 0!==t&&"string"==typeof t&&console.warn("ParticleEmitterManager was removed in Phaser 3.60. See documentation for details"),this.displayList.add(new r(this.scene,t,e,i,s))})},90668(t,e,i){var s=i(29747),r=s,n=s;r=i(21188),n=i(9871),t.exports={renderWebGL:r,renderCanvas:n}},21188(t,e,i){var s=i(59996),r=i(61340),n=i(70554),a=new r,o=new r,h=new r,l=new r,u={},d={},c={quad:new Float32Array(8)};t.exports=function(t,e,i,r){var f=i.camera;f.addToRenderList(e),a.copyWithScrollFactorFrom(f.getViewMatrix(!i.useCanvas),f.scrollX,f.scrollY,e.scrollFactorX,e.scrollFactorY),r&&a.multiply(r),l.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.multiply(l);var p=n.getTintAppendFloatAlpha,g=e.alpha,m=e.alive,v=m.length,y=e.viewBounds;if(0!==v&&(!y||s(y,f.worldView))){e.sortCallback&&e.depthSort();for(var x=e.tintMode,T=0;Tthis._length&&(this.counter=this._length-1),this},changeSource:function(t){return this.source=t,this.updateSource()},getPoint:function(t){0===this._direction?(this.counter++,this.counter>=this._length&&(this.yoyo?(this._direction=1,this.counter=this._length-1):this.counter=0)):(this.counter--,-1===this.counter&&(this.yoyo?(this._direction=0,this.counter=0):this.counter=this._length-1));var e=this.points[this.counter];e&&(t.x=e.x,t.y=e.y)}});t.exports=s},68875(t,e,i){var s=i(83419),r=i(26099),n=new s({initialize:function(t){this.source=t,this._tempVec=new r,this.total=-1},getPoint:function(t){var e=this._tempVec;this.source.getRandomPoint(e),t.x=e.x,t.y=e.y}});t.exports=n},21024(t,e,i){t.exports={DeathZone:i(26388),EdgeZone:i(19909),RandomZone:i(68875)}},1159(t,e,i){var s=i(83419),r=i(31401),n=i(68287),a=new s({Extends:n,Mixins:[r.PathFollower],initialize:function(t,e,i,s,r,a){n.call(this,t,i,s,r,a),this.path=e},preUpdate:function(t,e){this.anims.update(t,e),this.pathUpdate(t)}});t.exports=a},90145(t,e,i){var s=i(39429),r=i(1159);s.register("follower",function(t,e,i,s,n){var a=new r(this.scene,t,e,i,s,n);return this.displayList.add(a),this.updateList.add(a),a})},80321(t,e,i){var s=i(43246),r=i(83419),n=i(31401),a=i(95643),o=i(30100),h=i(67277),l=new r({Extends:a,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.Mask,n.RenderNodes,n.ScrollFactor,n.Transform,n.Visible,h],initialize:function(t,e,i,s,r,n,h){void 0===s&&(s=16777215),void 0===r&&(r=128),void 0===n&&(n=1),void 0===h&&(h=.1),a.call(this,t,"PointLight"),this.initRenderNodes(this._defaultRenderNodesMap),this.setPosition(e,i),this.color=o(s),this.intensity=n,this.attenuation=h,this.width=2*r,this.height=2*r,this._radius=r},_defaultRenderNodesMap:{get:function(){return s}},radius:{get:function(){return this._radius},set:function(t){this._radius=t,this.width=2*t,this.height=2*t}},originX:{get:function(){return.5}},originY:{get:function(){return.5}},displayOriginX:{get:function(){return this._radius}},displayOriginY:{get:function(){return this._radius}}});t.exports=l},39829(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(80321);r.register("pointlight",function(t,e){void 0===t&&(t={});var i=n(t,"color",16777215),r=n(t,"radius",128),o=n(t,"intensity",1),h=n(t,"attenuation",.1),l=new a(this.scene,0,0,i,r,o,h);return void 0!==e&&(t.add=e),s(this.scene,l,t),l})},71255(t,e,i){var s=i(39429),r=i(80321);s.register("pointlight",function(t,e,i,s,n,a){return this.displayList.add(new r(this.scene,t,e,i,s,n,a))})},67277(t,e,i){var s=i(29747),r=s,n=s;r=i(57787),t.exports={renderWebGL:r,renderCanvas:n}},57787(t,e,i){var s=i(91296);t.exports=function(t,e,i,r){var n=i.camera;n.addToRenderList(e);var a=s(e,n,r,!i.useCanvas).calc,o=e.width,h=e.height,l=-e._radius,u=-e._radius,d=l+o,c=u+h,f=a.getX(0,0),p=a.getY(0,0),g=a.getX(l,u),m=a.getY(l,u),v=a.getX(l,c),y=a.getY(l,c),x=a.getX(d,c),T=a.getY(d,c),w=a.getX(d,u),b=a.getY(d,u);(e.customRenderNodes.BatchHandler||e.defaultRenderNodes.BatchHandler).batch(i,e,g,m,v,y,w,b,x,T,f,p)}},591(t,e,i){var s=i(83419),r=i(45650),n=i(88571),a=i(83999),o=i(58855),h=new s({Extends:n,Mixins:[a],initialize:function(t,e,i,s,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=32),void 0===a&&(a=32),void 0===h&&(h=!0);var l=t.sys.textures.addDynamicTexture(r(),s,a,h);n.call(this,t,e,i,l),this.type="RenderTexture",this.camera=this.texture.camera,this._saved=!1,this.renderMode=o.RENDER,this.isCurrentlyRendering=!1},setSize:function(t,e){this.width=t,this.height=e,this.updateDisplayOrigin();var i=this.input;return i&&!i.customHitArea&&(i.hitArea.width=t,i.hitArea.height=e),this},resize:function(t,e,i){return this.texture.setSize(t,e,i),this.setSize(this.texture.width,this.texture.height),this},saveTexture:function(t){var e=this.texture;return e.key=t,e.manager.addDynamicTexture(e)&&(this._saved=!0),e},setRenderMode:function(t,e){return this.renderMode=t,e&&this.texture.preserve(!0),this},render:function(){return this.texture.render(),this},fill:function(t,e,i,s,r,n){return this.texture.fill(t,e,i,s,r,n),this},clear:function(t,e,i,s){return this.texture.clear(t,e,i,s),this},stamp:function(t,e,i,s,r){return this.texture.stamp(t,e,i,s,r),this},erase:function(t,e,i){return this.texture.erase(t,e,i),this},draw:function(t,e,i,s,r){return this.texture.draw(t,e,i,s,r),this},capture:function(t,e){return this.texture.capture(t,e),this},repeat:function(t,e,i,s,r,n,a){return this.texture.repeat(t,e,i,s,r,n,a),this},preserve:function(t){return this.texture.preserve(t),this},callback:function(t){return this.texture.callback(t),this},snapshotArea:function(t,e,i,s,r,n,a){return this.texture.snapshotArea(t,e,i,s,r,n,a),this},snapshot:function(t,e,i){return this.texture.snapshot(t,e,i)},snapshotPixel:function(t,e,i){return this.texture.snapshotPixel(t,e,i)},preDestroy:function(){this.camera=null,this._saved||this.texture.destroy()}});t.exports=h},97272(t,e,i){var s=i(40652),r=i(58855);t.exports=function(t,e,i,n){var a=!0,o=!0;e.renderMode===r.REDRAW?o=!1:e.renderMode===r.RENDER&&(a=!1),a&&e.render(),o&&s(t,e,i,n)}},34495(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(591);r.register("renderTexture",function(t,e){void 0===t&&(t={});var i=n(t,"x",0),r=n(t,"y",0),o=n(t,"width",32),h=n(t,"height",32),l=new a(this.scene,i,r,o,h);return void 0!==e&&(t.add=e),s(this.scene,l,t),l})},60505(t,e,i){var s=i(39429),r=i(591);s.register("renderTexture",function(t,e,i,s){return this.displayList.add(new r(this.scene,t,e,i,s))})},83999(t,e,i){var s=i(29747),r=s,n=s;r=i(53937),n=i(97272),t.exports={renderWebGL:r,renderCanvas:n}},58855(t){t.exports={RENDER:"render",REDRAW:"redraw",ALL:"all"}},53937(t,e,i){var s=i(99517),r=i(58855);t.exports=function(t,e,i,n){if(!e.isCurrentlyRendering){e.isCurrentlyRendering=!0;var a=!0,o=!0;e.renderMode===r.REDRAW?o=!1:e.renderMode===r.RENDER&&(a=!1),a&&e.render(),o&&s(t,e,i,n),e.isCurrentlyRendering=!1}}},77757(t,e,i){var s=i(9674),r=i(85760),n=i(83419),a=i(31401),o=i(95643),h=i(38745),l=i(84322),u=i(26099),d=new n({Extends:o,Mixins:[a.AlphaSingle,a.BlendMode,a.Depth,a.Flip,a.Mask,a.RenderNodes,a.Size,a.Texture,a.Transform,a.Visible,a.ScrollFactor,h],initialize:function(t,e,i,r,n,a,h,d,c){void 0===r&&(r="__DEFAULT"),void 0===a&&(a=2),void 0===h&&(h=!0),o.call(this,t,"Rope"),this.anims=new s(this),this.points=a,this.vertices,this.uv,this.colors,this.alphas,this.tintMode="__DEFAULT"===r?l.FILL:l.MULTIPLY,this.dirty=!1,this.horizontal=h,this._flipX=!1,this._flipY=!1,this._perp=new u,this.debugCallback=null,this.debugGraphic=null,this.setTexture(r,n),this.setPosition(e,i),this.setSizeToFrame(),this.initRenderNodes(this._defaultRenderNodesMap),Array.isArray(a)&&this.resizeArrays(a.length),this.setPoints(a,d,c),this.updateVertices()},_defaultRenderNodesMap:{get:function(){return r}},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},preUpdate:function(t,e){var i=this.anims.currentFrame;this.anims.update(t,e),this.anims.currentFrame!==i&&(this.updateUVs(),this.updateVertices())},play:function(t,e,i){return this.anims.play(t,e,i),this},setDirty:function(){return this.dirty=!0,this},setHorizontal:function(t,e,i){return void 0===t&&(t=this.points.length),this.horizontal?this:(this.horizontal=!0,this.setPoints(t,e,i))},setVertical:function(t,e,i){return void 0===t&&(t=this.points.length),this.horizontal?(this.horizontal=!1,this.setPoints(t,e,i)):this},setTintMode:function(t){return void 0===t&&(t=l.MULTIPLY),this.tintMode=t,this},setAlphas:function(t,e){var i=this.points.length;if(i<1)return this;var s,r=this.alphas;void 0===t?t=[1]:Array.isArray(t)||void 0!==e||(t=[t]);var n=0;if(void 0!==e)for(s=0;sn&&(a=t[n]),r[n]=a,t.length>n+1&&(a=t[n+1]),r[n+1]=a}return this},setColors:function(t){var e=this.points.length;if(e<1)return this;var i,s=this.colors;void 0===t?t=[16777215]:Array.isArray(t)||(t=[t]);var r=0;if(t.length===e)for(i=0;ir&&(n=t[r]),s[r]=n,t.length>r+1&&(n=t[r+1]),s[r+1]=n}return this},setPoints:function(t,e,i){if(void 0===t&&(t=2),"number"==typeof t){var s,r,n,a=t;if(a<2&&(a=2),t=[],this.horizontal)for(n=-this.frame.halfWidth,r=this.frame.width/(a-1),s=0;s>>16,o=(65280&r)>>>8,h=255&r;t.fillStyle="rgba("+a+","+o+","+h+","+n+")"}},75177(t){t.exports=function(t,e,i,s){var r=i||e.strokeColor,n=s||e.strokeAlpha,a=(16711680&r)>>>16,o=(65280&r)>>>8,h=255&r;t.strokeStyle="rgba("+a+","+o+","+h+","+n+")",t.lineWidth=e.lineWidth}},17803(t,e,i){var s=i(87891),r=i(83419),n=i(31401),a=i(95643),o=i(23031),h=new r({Extends:a,Mixins:[n.AlphaSingle,n.BlendMode,n.Depth,n.GetBounds,n.Lighting,n.Mask,n.Origin,n.RenderNodes,n.ScrollFactor,n.Transform,n.Visible],initialize:function(t,e,i){void 0===e&&(e="Shape"),a.call(this,t,e),this.geom=i,this.pathData=[],this.pathIndexes=[],this.fillColor=16777215,this.fillAlpha=1,this.strokeColor=16777215,this.strokeAlpha=1,this.lineWidth=1,this.isFilled=!1,this.isStroked=!1,this.closePath=!0,this._tempLine=new o,this.width=0,this.height=0,this.enableFilters&&(this.filtersFocusContext=!0),this.initRenderNodes(this._defaultRenderNodesMap)},_defaultRenderNodesMap:{get:function(){return s}},setFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.isFilled=!1:(this.fillColor=t,this.fillAlpha=e,this.isFilled=!0),this},setStrokeStyle:function(t,e,i){return void 0===i&&(i=1),void 0===t?this.isStroked=!1:(this.lineWidth=t,this.strokeColor=e,this.strokeAlpha=i,this.isStroked=!0),this},setClosePath:function(t){return this.closePath=t,this},setSize:function(t,e){return this.width=t,this.height=e,this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this},preDestroy:function(){this.geom=null,this._tempLine=null,this.pathData=[],this.pathIndexes=[]},displayWidth:{get:function(){return this.scaleX*this.width},set:function(t){this.scaleX=t/this.width}},displayHeight:{get:function(){return this.scaleY*this.height},set:function(t){this.scaleY=t/this.height}}});t.exports=h},34682(t,e,i){var s=i(70554);t.exports=function(t,e,i,r,n,a,o){var h=s.getTintAppendFloatAlpha(r.strokeColor,r.strokeAlpha*n),l=r.pathData,u=l.length-1,d=r.lineWidth,c=!r.closePath,f=r.customRenderNodes.StrokePath||r.defaultRenderNodes.StrokePath,p=[];c&&(u-=2);for(var g=0;g0&&m===l[g-2]&&v===l[g-1]||p.push({x:m,y:v,width:d})}f.run(t,e,p,d,c,i,h,h,h,h,void 0,r.lighting)}},23629(t,e,i){var s=i(13609),r=i(83419),n=i(39506),a=i(94811),o=i(96503),h=i(36383),l=i(17803),u=new r({Extends:l,Mixins:[s],initialize:function(t,e,i,s,r,n,a,h,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=128),void 0===r&&(r=0),void 0===n&&(n=360),void 0===a&&(a=!1),l.call(this,t,"Arc",new o(0,0,s)),this._startAngle=r,this._endAngle=n,this._anticlockwise=a,this._iterations=.01,this.setPosition(e,i);var d=2*this.geom.radius;this.setSize(d,d),void 0!==h&&this.setFillStyle(h,u),this.updateDisplayOrigin(),this.updateData()},iterations:{get:function(){return this._iterations},set:function(t){this._iterations=t,this.updateData()}},radius:{get:function(){return this.geom.radius},set:function(t){this.geom.radius=t;var e=2*t;this.setSize(e,e),this.updateDisplayOrigin(),this.updateData()}},startAngle:{get:function(){return this._startAngle},set:function(t){this._startAngle=t,this.updateData()}},endAngle:{get:function(){return this._endAngle},set:function(t){this._endAngle=t,this.updateData()}},anticlockwise:{get:function(){return this._anticlockwise},set:function(t){this._anticlockwise=t,this.updateData()}},setRadius:function(t){return this.radius=t,this},setIterations:function(t){return void 0===t&&(t=.01),this.iterations=t,this},setStartAngle:function(t,e){return this._startAngle=t,void 0!==e&&(this._anticlockwise=e),this.updateData()},setEndAngle:function(t,e){return this._endAngle=t,void 0!==e&&(this._anticlockwise=e),this.updateData()},updateData:function(){var t=this._iterations,e=t,i=this.geom.radius,s=n(this._startAngle),r=n(this._endAngle),o=i,l=i;r-=s,this._anticlockwise?r<-h.TAU?r=-h.TAU:r>0&&(r=-h.TAU+r%h.TAU):r>h.TAU?r=h.TAU:r<0&&(r=h.TAU+r%h.TAU);for(var u,d=[o+Math.cos(s)*i,l+Math.sin(s)*i];e<1;)u=r*e+s,d.push(o+Math.cos(u)*i,l+Math.sin(u)*i),e+=t;return u=r+s,d.push(o+Math.cos(u)*i,l+Math.sin(u)*i),d.push(o+Math.cos(s)*i,l+Math.sin(s)*i),this.pathIndexes=a(d),this.pathData=d,this}});t.exports=u},42542(t,e,i){var s=i(39506),r=i(65960),n=i(75177),a=i(20926);t.exports=function(t,e,i,o){i.addToRenderList(e);var h=t.currentContext;if(a(t,h,e,i,o)){var l=e.radius;h.beginPath(),h.arc(l-e.originX*(2*l),l-e.originY*(2*l),l,s(e._startAngle),s(e._endAngle),e.anticlockwise),e.closePath&&h.closePath(),e.isFilled&&(r(h,e),h.fill()),e.isStroked&&(n(h,e),h.stroke()),h.restore()}}},42563(t,e,i){var s=i(23629),r=i(39429);r.register("arc",function(t,e,i,r,n,a,o,h){return this.displayList.add(new s(this.scene,t,e,i,r,n,a,o,h))}),r.register("circle",function(t,e,i,r,n){return this.displayList.add(new s(this.scene,t,e,i,0,360,!1,r,n))})},13609(t,e,i){var s=i(29747),r=s,n=s;r=i(41447),n=i(42542),t.exports={renderWebGL:r,renderCanvas:n}},41447(t,e,i){var s=i(91296),r=i(10441),n=i(34682);t.exports=function(t,e,i,a){var o=i.camera;o.addToRenderList(e);var h=s(e,o,a,!i.useCanvas).calc,l=e._displayOriginX,u=e._displayOriginY,d=e.alpha,c=e.customRenderNodes.Submitter||e.defaultRenderNodes.Submitter;e.isFilled&&r(i,c,h,e,d,l,u),e.isStroked&&n(i,c,h,e,d,l,u)}},89(t,e,i){var s=i(83419),r=i(33141),n=i(94811),a=i(87841),o=i(17803),h=new s({Extends:o,Mixins:[r],initialize:function(t,e,i,s,r,n){void 0===e&&(e=0),void 0===i&&(i=0),o.call(this,t,"Curve",s),this._smoothness=32,this._curveBounds=new a,this.closePath=!1,this.setPosition(e,i),void 0!==r&&this.setFillStyle(r,n),this.updateData()},smoothness:{get:function(){return this._smoothness},set:function(t){this._smoothness=t,this.updateData()}},setSmoothness:function(t){return this._smoothness=t,this.updateData()},updateData:function(){var t=this._curveBounds,e=this._smoothness;this.geom.getBounds(t,e),this.setSize(t.width,t.height),this.updateDisplayOrigin();for(var i=[],s=this.geom.getPoints(e),r=0;r0)for(s(o,e),_=0;_0&&P>0&&o.fillRect(h+A*f+C,l+_*p+C,R,P));if(b&&e.altFillAlpha>0)for(s(o,e,e.altFillColor,e.altFillAlpha*u),_=0;_0&&P>0&&o.fillRect(h+A*f+C,l+_*p+C,R,P)):M=1;if(S&&e.strokeAlpha>0){r(o,e,e.strokeColor,e.strokeAlpha*u);var O=e.strokeOutside?0:1;for(A=O;AE&&(o.beginPath(),o.moveTo(d+h,l),o.lineTo(d+h,c+l),o.stroke()),c>E&&(o.beginPath(),o.moveTo(h,c+l),o.lineTo(d+h,c+l),o.stroke()))}o.restore()}}},34137(t,e,i){var s=i(39429),r=i(30479);s.register("grid",function(t,e,i,s,n,a,o,h,l,u){return this.displayList.add(new r(this.scene,t,e,i,s,n,a,o,h,l,u))})},26015(t,e,i){var s=i(29747),r=s,n=s;r=i(46161),n=i(49912),t.exports={renderWebGL:r,renderCanvas:n}},46161(t,e,i){var s=i(91296),r=i(70554);t.exports=function(t,e,i,n){var a=i.camera;a.addToRenderList(e);var o=e.customRenderNodes.FillRect||e.defaultRenderNodes.FillRect,h=e.customRenderNodes.Submitter||e.defaultRenderNodes.Submitter,l=s(e,a,n,!i.useCanvas).calc;l.translate(-e._displayOriginX,-e._displayOriginY);var u,d=e.alpha,c=e.width,f=e.height,p=e.cellWidth,g=e.cellHeight,m=Math.ceil(c/p),v=Math.ceil(f/g),y=p,x=g,T=p-(m*p-c),w=g-(v*g-f),b=e.isFilled,S=e.showAltCells,C=e.isStroked,E=e.cellPadding,A=e.lineWidth,_=A/2,M=0,R=0,P=0,O=0,L=0;if(E&&(y-=2*E,x-=2*E,T-=2*E,w-=2*E),b&&e.fillAlpha>0)for(u=r.getTintAppendFloatAlpha(e.fillColor,e.fillAlpha*d),R=0;R0&&L>0&&o.run(i,l,h,M*p+E,R*g+E,O,L,u,u,u,u,e.lighting));if(S&&e.altFillAlpha>0)for(u=r.getTintAppendFloatAlpha(e.altFillColor,e.altFillAlpha*d),R=0;R0&&L>0&&o.run(i,l,h,M*p+E,R*g+E,O,L,u,u,u,u)):P=1;if(C&&e.strokeAlpha>0){var D=r.getTintAppendFloatAlpha(e.strokeColor,e.strokeAlpha*d),F=e.strokeOutside?0:1;for(M=F;M_&&o.run(i,l,h,c-_,0,A,f,D,D,D,D),f>_&&o.run(i,l,h,0,f-_,c,A,D,D,D,D))}}},61475(t,e,i){var s=i(99651),r=i(83419),n=i(17803),a=new r({Extends:n,Mixins:[s],initialize:function(t,e,i,s,r,a,o,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=48),void 0===r&&(r=32),void 0===a&&(a=15658734),void 0===o&&(o=10066329),void 0===h&&(h=13421772),n.call(this,t,"IsoBox",null),this.projection=4,this.fillTop=a,this.fillLeft=o,this.fillRight=h,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isFilled=!0,this.setPosition(e,i),this.setSize(s,r),this.updateDisplayOrigin()},setProjection:function(t){return this.projection=t,this},setFaces:function(t,e,i){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===i&&(i=!0),this.showTop=t,this.showLeft=e,this.showRight=i,this},setFillStyle:function(t,e,i){return this.fillTop=t,this.fillLeft=e,this.fillRight=i,this.isFilled=!0,this}});t.exports=a},11508(t,e,i){var s=i(65960),r=i(20926);t.exports=function(t,e,i,n){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,n)&&e.isFilled){var o=e.width,h=e.height,l=o/2,u=o/e.projection;e.showTop&&(s(a,e,e.fillTop),a.beginPath(),a.moveTo(-l,-h),a.lineTo(0,-u-h),a.lineTo(l,-h),a.lineTo(l,-1),a.lineTo(0,u-1),a.lineTo(-l,-1),a.lineTo(-l,-h),a.fill()),e.showLeft&&(s(a,e,e.fillLeft),a.beginPath(),a.moveTo(-l,0),a.lineTo(0,u),a.lineTo(0,u-h),a.lineTo(-l,-h),a.lineTo(-l,0),a.fill()),e.showRight&&(s(a,e,e.fillRight),a.beginPath(),a.moveTo(l,0),a.lineTo(0,u),a.lineTo(0,u-h),a.lineTo(l,-h),a.lineTo(l,0),a.fill()),a.restore()}}},3933(t,e,i){var s=i(39429),r=i(61475);s.register("isobox",function(t,e,i,s,n,a,o){return this.displayList.add(new r(this.scene,t,e,i,s,n,a,o))})},99651(t,e,i){var s=i(29747),r=s,n=s;r=i(68149),n=i(11508),t.exports={renderWebGL:r,renderCanvas:n}},68149(t,e,i){var s=i(91296),r=i(70554);t.exports=function(t,e,i,n){if(e.isFilled){var a=i.camera;a.addToRenderList(e);var o,h,l,u,d,c,f,p,g,m=e.customRenderNodes.FillTri||e.defaultRenderNodes.FillTri,v=e.customRenderNodes.Submitter||e.defaultRenderNodes.Submitter,y=s(e,a,n,!i.useCanvas).calc,x=e.width,T=e.height,w=x/2,b=x/e.projection,S=e.alpha,C=e.lighting;e.showTop&&(o=r.getTintAppendFloatAlpha(e.fillTop,S),h=-w,l=-T,u=0,d=-b-T,c=w,f=-T,p=0,g=b-T,m.run(i,y,v,h,l,u,d,c,f,o,o,o,C),m.run(i,y,v,c,f,p,g,h,l,o,o,o,C)),e.showLeft&&(o=r.getTintAppendFloatAlpha(e.fillLeft,S),h=-w,l=0,u=0,d=b,c=0,f=b-T,p=-w,g=-T,m.run(i,y,v,h,l,u,d,c,f,o,o,o,C),m.run(i,y,v,c,f,p,g,h,l,o,o,o,C)),e.showRight&&(o=r.getTintAppendFloatAlpha(e.fillRight,S),h=w,l=0,u=0,d=b,c=0,f=b-T,p=w,g=-T,m.run(i,y,v,h,l,u,d,c,f,o,o,o,C),m.run(i,y,v,c,f,p,g,h,l,o,o,o,C))}}},16933(t,e,i){var s=i(83419),r=i(60561),n=i(17803),a=new s({Extends:n,Mixins:[r],initialize:function(t,e,i,s,r,a,o,h,l){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=48),void 0===r&&(r=32),void 0===a&&(a=!1),void 0===o&&(o=15658734),void 0===h&&(h=10066329),void 0===l&&(l=13421772),n.call(this,t,"IsoTriangle",null),this.projection=4,this.fillTop=o,this.fillLeft=h,this.fillRight=l,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isReversed=a,this.isFilled=!0,this.setPosition(e,i),this.setSize(s,r),this.updateDisplayOrigin()},setProjection:function(t){return this.projection=t,this},setReversed:function(t){return this.isReversed=t,this},setFaces:function(t,e,i){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===i&&(i=!0),this.showTop=t,this.showLeft=e,this.showRight=i,this},setFillStyle:function(t,e,i){return this.fillTop=t,this.fillLeft=e,this.fillRight=i,this.isFilled=!0,this}});t.exports=a},79590(t,e,i){var s=i(65960),r=i(20926);t.exports=function(t,e,i,n){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,n)&&e.isFilled){var o=e.width,h=e.height,l=o/2,u=o/e.projection,d=e.isReversed;e.showTop&&d&&(s(a,e,e.fillTop),a.beginPath(),a.moveTo(-l,-h),a.lineTo(0,-u-h),a.lineTo(l,-h),a.lineTo(0,u-h),a.fill()),e.showLeft&&(s(a,e,e.fillLeft),a.beginPath(),d?(a.moveTo(-l,-h),a.lineTo(0,u),a.lineTo(0,u-h)):(a.moveTo(-l,0),a.lineTo(0,u),a.lineTo(0,u-h)),a.fill()),e.showRight&&(s(a,e,e.fillRight),a.beginPath(),d?(a.moveTo(l,-h),a.lineTo(0,u),a.lineTo(0,u-h)):(a.moveTo(l,0),a.lineTo(0,u),a.lineTo(0,u-h)),a.fill()),a.restore()}}},49803(t,e,i){var s=i(39429),r=i(16933);s.register("isotriangle",function(t,e,i,s,n,a,o,h){return this.displayList.add(new r(this.scene,t,e,i,s,n,a,o,h))})},60561(t,e,i){var s=i(29747),r=s,n=s;r=i(51503),n=i(79590),t.exports={renderWebGL:r,renderCanvas:n}},51503(t,e,i){var s=i(91296),r=i(70554);t.exports=function(t,e,i,n){if(e.isFilled){var a=i.camera;a.addToRenderList(e);var o,h,l,u,d,c,f,p=e.customRenderNodes.FillTri||e.defaultRenderNodes.FillTri,g=e.customRenderNodes.Submitter||e.defaultRenderNodes.Submitter,m=s(e,a,n,!i.useCanvas).calc,v=e.width,y=e.height,x=v/2,T=v/e.projection,w=e.isReversed,b=e.alpha,S=e.lighting;if(e.showTop&&w){o=r.getTintAppendFloatAlpha(e.fillTop,b),h=-x,l=-y,u=0,d=-T-y,c=x,f=-y;var C=T-y;p.run(i,m,g,h,l,u,d,c,f,o,o,o,S),p.run(i,m,g,c,f,0,C,h,l,o,o,o,S)}e.showLeft&&(o=r.getTintAppendFloatAlpha(e.fillLeft,b),w?(h=-x,l=-y,u=0,d=T,c=0,f=T-y):(h=-x,l=0,u=0,d=T,c=0,f=T-y),p.run(i,m,g,h,l,u,d,c,f,o,o,o,S)),e.showRight&&(o=r.getTintAppendFloatAlpha(e.fillRight,b),w?(h=x,l=-y,u=0,d=T,c=0,f=T-y):(h=x,l=0,u=0,d=T,c=0,f=T-y),p.run(i,m,g,h,l,u,d,c,f,o,o,o,S))}}},57847(t,e,i){var s=i(83419),r=i(17803),n=i(23031),a=i(36823),o=new s({Extends:r,Mixins:[a],initialize:function(t,e,i,s,a,o,h,l,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===a&&(a=0),void 0===o&&(o=128),void 0===h&&(h=0),r.call(this,t,"Line",new n(s,a,o,h));var d=Math.max(1,this.geom.right-this.geom.left),c=Math.max(1,this.geom.bottom-this.geom.top);this.lineWidth=1,this._startWidth=1,this._endWidth=1,this.setPosition(e,i),this.setSize(d,c),void 0!==l&&this.setStrokeStyle(1,l,u),this.updateDisplayOrigin()},setLineWidth:function(t,e){return void 0===e&&(e=t),this._startWidth=t,this._endWidth=e,this.lineWidth=t,this},setTo:function(t,e,i,s){return this.geom.setTo(t,e,i,s),this}});t.exports=o},17440(t,e,i){var s=i(75177),r=i(20926);t.exports=function(t,e,i,n){i.addToRenderList(e);var a=t.currentContext;if(r(t,a,e,i,n)){var o=e._displayOriginX,h=e._displayOriginY;e.isStroked&&(s(a,e),a.beginPath(),a.moveTo(e.geom.x1-o,e.geom.y1-h),a.lineTo(e.geom.x2-o,e.geom.y2-h),a.stroke()),a.restore()}}},2481(t,e,i){var s=i(39429),r=i(57847);s.register("line",function(t,e,i,s,n,a,o,h){return this.displayList.add(new r(this.scene,t,e,i,s,n,a,o,h))})},36823(t,e,i){var s=i(29747),r=s,n=s;r=i(77385),n=i(17440),t.exports={renderWebGL:r,renderCanvas:n}},77385(t,e,i){var s=i(91296),r=i(70554),n=[{x:0,y:0,width:0},{x:0,y:0,width:0}];t.exports=function(t,e,i,a){var o=i.camera;o.addToRenderList(e);var h=s(e,o,a,!i.useCanvas).calc,l=e._displayOriginX,u=e._displayOriginY,d=e.alpha;if(e.isStroked){var c=r.getTintAppendFloatAlpha(e.strokeColor,e.strokeAlpha*d);n[0].x=e.geom.x1-l,n[0].y=e.geom.y1-u,n[0].width=e._startWidth,n[1].x=e.geom.x2-l,n[1].y=e.geom.y2-u,n[1].width=e._endWidth,(e.customRenderNodes.StrokePath||e.defaultRenderNodes.StrokePath).run(i,e.customRenderNodes.Submitter||e.defaultRenderNodes.Submitter,n,1,!0,h,c,c,c,c,void 0,e.lighting)}}},24949(t,e,i){var s=i(90273),r=i(83419),n=i(94811),a=i(13829),o=i(25717),h=i(17803),l=i(5469),u=new r({Extends:h,Mixins:[s],initialize:function(t,e,i,s,r,n){void 0===e&&(e=0),void 0===i&&(i=0),h.call(this,t,"Polygon",new o(s));var l=a(this.geom);this.setPosition(e,i),this.setSize(l.width,l.height),void 0!==r&&this.setFillStyle(r,n),this.updateDisplayOrigin(),this.updateData()},smooth:function(t){void 0===t&&(t=1);for(var e=0;e0,this.updateRoundedData()},setSize:function(t,e){this.width=t,this.height=e,this.geom.setSize(t,e),this.updateData(),this.updateDisplayOrigin();var i=this.input;return i&&!i.customHitArea&&(i.hitArea.width=t,i.hitArea.height=e),this},updateData:function(){if(this.isRounded)return this.updateRoundedData();var t=[],e=this.geom,i=this._tempLine;return e.getLineA(i),t.push(i.x1,i.y1,i.x2,i.y2),e.getLineB(i),t.push(i.x2,i.y2),e.getLineC(i),t.push(i.x2,i.y2),e.getLineD(i),t.push(i.x2,i.y2),this.pathData=t,this},updateRoundedData:function(){var t=[],e=this.width/2,i=this.height/2,s=Math.min(e,i),n=Math.min(this.radius,s),a=e,o=i,h=Math.max(4,Math.min(16,Math.ceil(n/2)));return this.arcTo(t,a-e+n,o-i+n,n,Math.PI,1.5*Math.PI,h),t.push(a+e-n,o-i),this.arcTo(t,a+e-n,o-i+n,n,1.5*Math.PI,2*Math.PI,h),t.push(a+e,o+i-n),this.arcTo(t,a+e-n,o+i-n,n,0,.5*Math.PI,h),t.push(a-e+n,o+i),this.arcTo(t,a-e+n,o+i-n,n,.5*Math.PI,Math.PI,h),t.push(a-e,o-i+n),this.pathIndexes=r(t),this.pathData=t,this},arcTo:function(t,e,i,s,r,n,a){for(var o=(n-r)/a,h=0;h<=a;h++){var l=r+o*h;t.push(e+Math.cos(l)*s,i+Math.sin(l)*s)}}});t.exports=h},48682(t,e,i){var s=i(65960),r=i(75177),n=i(20926),a=function(t,e,i,s,r,n){var a=Math.min(s/2,r/2),o=Math.min(n,a);0!==o?(t.moveTo(e+o,i),t.lineTo(e+s-o,i),t.arcTo(e+s,i,e+s,i+o,o),t.lineTo(e+s,i+r-o),t.arcTo(e+s,i+r,e+s-o,i+r,o),t.lineTo(e+o,i+r),t.arcTo(e,i+r,e,i+r-o,o),t.lineTo(e,i+o),t.arcTo(e,i,e+o,i,o),t.closePath()):t.rect(e,i,s,r)};t.exports=function(t,e,i,o){i.addToRenderList(e);var h=t.currentContext;if(n(t,h,e,i,o)){var l=e._displayOriginX,u=e._displayOriginY;e.isFilled&&(s(h,e),e.isRounded?(h.beginPath(),a(h,-l,-u,e.width,e.height,e.radius),h.fill()):h.fillRect(-l,-u,e.width,e.height)),e.isStroked&&(r(h,e),h.beginPath(),e.isRounded?a(h,-l,-u,e.width,e.height,e.radius):h.rect(-l,-u,e.width,e.height),h.stroke()),h.restore()}}},87959(t,e,i){var s=i(39429),r=i(74561);s.register("rectangle",function(t,e,i,s,n,a){return this.displayList.add(new r(this.scene,t,e,i,s,n,a))})},95597(t,e,i){var s=i(29747),r=s,n=s;r=i(52059),n=i(48682),t.exports={renderWebGL:r,renderCanvas:n}},52059(t,e,i){var s=i(10441),r=i(91296),n=i(34682),a=i(70554);t.exports=function(t,e,i,o){var h=i.camera;h.addToRenderList(e);var l=r(e,h,o,!i.useCanvas).calc,u=e._displayOriginX,d=e._displayOriginY,c=e.alpha,f=e.customRenderNodes,p=e.defaultRenderNodes,g=f.Submitter||p.Submitter;if(e.isFilled)if(e.isRounded)s(i,g,l,e,c,u,d);else{var m=a.getTintAppendFloatAlpha(e.fillColor,e.fillAlpha*c);(f.FillRect||p.FillRect).run(i,l,g,-u,-d,e.width,e.height,m,m,m,m,e.lighting)}e.isStroked&&n(i,g,l,e,c,u,d)}},55911(t,e,i){var s=i(81991),r=i(83419),n=i(94811),a=i(17803),o=new r({Extends:a,Mixins:[s],initialize:function(t,e,i,s,r,n,o,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=5),void 0===r&&(r=32),void 0===n&&(n=64),a.call(this,t,"Star",null),this._points=s,this._innerRadius=r,this._outerRadius=n,this.setPosition(e,i),this.setSize(2*n,2*n),void 0!==o&&this.setFillStyle(o,h),this.updateDisplayOrigin(),this.updateData()},setPoints:function(t){return this._points=t,this.updateData()},setInnerRadius:function(t){return this._innerRadius=t,this.updateData()},setOuterRadius:function(t){return this._outerRadius=t,this.updateData()},points:{get:function(){return this._points},set:function(t){this._points=t,this.updateData()}},innerRadius:{get:function(){return this._innerRadius},set:function(t){this._innerRadius=t,this.updateData()}},outerRadius:{get:function(){return this._outerRadius},set:function(t){this._outerRadius=t,this.updateData()}},updateData:function(){var t=[],e=this._points,i=this._innerRadius,s=this._outerRadius,r=Math.PI/2*3,a=Math.PI/e,o=s,h=s;t.push(o,h+-s);for(var l=0;l=this.size||this.bufferUpdateSegments===this.MAX_BUFFER_UPDATE_SEGMENTS_FULL)){var e=Math.floor(t/this.bufferUpdateSegmentSize);this.bufferUpdateSegments|=1<=this.size)return this;var e=this.submitterNode.instanceBufferLayout,i=e.buffer.viewF32,s=this.memberCount*e.layout.stride;return i.set(t,s/i.BYTES_PER_ELEMENT),this.setSegmentNeedsUpdate(this.memberCount),this.memberCount++,this},addMember:function(t){if(this.memberCount>=this.size)return this;var e=this.nextMemberF32,i=this.nextMemberU32;t||(t={});var s=this.frame;if(void 0!==t.frame&&(s=t.frame.base?t.frame.base:t.frame),"string"==typeof s&&!(s=this.texture.get(s)))return this;var r=0;this._setAnimatedValue(t.x,r),r+=4,this._setAnimatedValue(t.y,r),r+=4,this._setAnimatedValue(t.rotation,r),r+=4,this._setAnimatedValue(t.scaleX,r,1),r+=4,this._setAnimatedValue(t.scaleY,r,1),r+=4,this._setAnimatedValue(t.alpha,r,1),r+=4;var n=t.animation;if(n){var a;if("string"==typeof n||"number"==typeof n)a="string"==typeof n?this.animationDataNames[n]:this.animationDataIndices[n],this._setAnimatedValue({base:a.index,amplitude:a.frameCount,duration:a.duration,ease:h.Linear,yoyo:!1},r);else{var o=n.base;a="string"==typeof o?this.animationDataNames[o]:"number"==typeof o?this.animationDataIndices[o]:this.animationData[0],this._setAnimatedValue({base:a.index,amplitude:"number"==typeof n.amplitude?n.amplitude:a.frameCount,duration:n.duration||a.duration,delay:n.delay||0,ease:n.ease||h.Linear,yoyo:!!n.yoyo},r)}}else{var l=this.frameDataIndices[s.name],u=t.frame;u&&void 0!==u.base?this._setAnimatedValue({base:l,amplitude:u.amplitude,duration:u.duration,delay:u.delay,ease:u.ease,yoyo:u.yoyo},r):this._setAnimatedValue(l,r)}r+=4,this._setAnimatedValue(t.tintBlend,r,1),r+=4;var c=void 0===t.tintBottomLeft?16777215:t.tintBottomLeft,f=void 0===t.tintTopLeft?16777215:t.tintTopLeft,p=void 0===t.tintBottomRight?16777215:t.tintBottomRight,g=void 0===t.tintTopRight?16777215:t.tintTopRight,m=void 0===t.alphaBottomLeft?1:t.alphaBottomLeft,v=void 0===t.alphaTopLeft?1:t.alphaTopLeft,y=void 0===t.alphaBottomRight?1:t.alphaBottomRight,x=void 0===t.alphaTopRight?1:t.alphaTopRight;return i[r++]=d(c,m),i[r++]=d(f,v),i[r++]=d(p,y),i[r++]=d(g,x),e[r++]=void 0===t.originX?.5:t.originX,e[r++]=void 0===t.originY?.5:t.originY,e[r++]=t.tintMode||0,e[r++]=void 0===t.creationTime?this.timeElapsed:t.creationTime,e[r++]=void 0===t.scrollFactorX?1:t.scrollFactorX,e[r++]=void 0===t.scrollFactorY?1:t.scrollFactorY,this.addData(this.nextMemberF32),this},editMember:function(t,e){if(t<0||t>=this.memberCount)return this;var i=this.memberCount;return this.memberCount=t,this.addMember(e),this.memberCount=i,this},patchMember:function(t,e,i){if(!(t<0||t>=this.memberCount)){var s=this.submitterNode.instanceBufferLayout,r=s.buffer,n=t*s.layout.stride,a=r.viewU32,o=n/4;if(i)for(var h=0;h=this.memberCount)return null;var e=this.submitterNode.instanceBufferLayout,i=e.buffer,s=t*e.layout.stride,r=i.viewF32,n=i.viewU32,a={},o=s/r.BYTES_PER_ELEMENT;a.x=this._getAnimatedValue(o),o+=4,a.y=this._getAnimatedValue(o),o+=4,a.rotation=this._getAnimatedValue(o),o+=4,a.scaleX=this._getAnimatedValue(o),o+=4,a.scaleY=this._getAnimatedValue(o),o+=4,a.alpha=this._getAnimatedValue(o),o+=4;var h=this._getAnimatedValue(o);o+=4,"number"!=typeof h&&(h=h.base);var l=this.frameDataIndicesInv[h];if(void 0===l){var u=this.animationDataIndices[h];u&&(a.animation=u.name)}else a.frame=l;return a.tintBlend=this._getAnimatedValue(o),o+=4,a.tintBottomLeft=n[o++],a.tintTopLeft=n[o++],a.tintBottomRight=n[o++],a.tintTopRight=n[o++],a.alphaBottomLeft=(a.tintBottomLeft>>>24)/255,a.alphaTopLeft=(a.tintTopLeft>>>24)/255,a.alphaBottomRight=(a.tintBottomRight>>>24)/255,a.alphaTopRight=(a.tintTopRight>>>24)/255,a.tintBottomLeft&=16777215,a.tintTopLeft&=16777215,a.tintBottomRight&=16777215,a.tintTopRight&=16777215,a.originX=r[o++],a.originY=r[o++],a.tintMode=r[o++],a.creationTime=r[o++],a.scrollFactorX=r[o++],a.scrollFactorY=r[o++],a},getMemberData:function(t,e){if(t<0||t>=this.memberCount)return null;var i=this.submitterNode.instanceBufferLayout,s=i.buffer,r=i.layout.stride,n=t*r;e||(e=this.nextMemberU32);var a=s.viewU32,o=a.BYTES_PER_ELEMENT;return e.set(a.subarray(n/o,n/o+r/o)),e},removeMembers:function(t,e){if(t<0||t>=this.memberCount)return this;void 0===e&&(e=1),e=Math.min(e,this.memberCount-t);var i=this.submitterNode.instanceBufferLayout,s=i.layout.stride,r=t*s,n=e*s,a=i.buffer.viewU8;a.set(a.subarray(r+n),r);for(var o=t;othis.memberCount)return this;Array.isArray(e)||(e=[e]);var i=this.memberCount,s=this.submitterNode.instanceBufferLayout,r=s.layout.stride,n=t*r,a=e.length*r;s.buffer.viewU8.copyWithin(n+a,n,i*r),this.memberCount=t;for(var o=0;othis.memberCount)return this;var i=e.length*e.BYTES_PER_ELEMENT,s=this.submitterNode.instanceBufferLayout,r=s.layout.stride,n=t*r;s.buffer.viewU8.copyWithin(n+i,n,this.memberCount*r),s.buffer.viewU32.set(e,n/e.BYTES_PER_ELEMENT),this.memberCount=Math.min(this.size,this.memberCount+i/r);for(var a=t;a=1?p=0:p<-1&&(p=-.999),p=(p+1)/2,a=Math.floor(f)+p}(l=o>0?l/o%2:0)<0&&(l+=2),l/=2,l+=n,u&&(o=-o),d||(l=-l),s[e++]=r,s[e++]=a,s[e++]=o,s[e]=l}},_getAnimatedValue:function(t){var e=this.submitterNode.instanceBufferLayout.buffer.viewF32,i=e[t++],s=e[t++],r=e[t++],n=e[t];if(0===s||0===r||0===o)return i;n>0||(n=-n);var a=r<0;a&&(r=-r);var o=Math.floor(n);if(n=(n-=o)*r*2%r,o===h.Gravity){var l=Math.floor(s),u=2*(s-l)-1;return 0===u&&(u=1),{base:i,ease:o,duration:r,delay:n,yoyo:a,velocity:l,gravityFactor:u}}return{base:i,ease:o,amplitude:s,duration:r,delay:n,yoyo:a}},setAnimationEnabled:function(t,e){return this._animationsEnabled[t]=!!e,this},preDestroy:function(){this.frameDataTexture.destroy()}});t.exports=c},16193(t,e,i){var s=i(10312),r=i(44603),n=i(23568),a=i(76573);r.register("spriteGPULayer",function(t,e){void 0===t&&(t={});var i=n(t,"key",null),r=n(t,"size",1),o=new a(this.scene,i,r);return void 0!==e&&(t.add=e),o.alpha=n(t,"alpha",1),o.blendMode=n(t,"blendMode",s.NORMAL),o.visible=n(t,"visible",!0),e&&this.scene.sys.displayList.add(o),o})},96019(t,e,i){var s=i(76573);i(39429).register("spriteGPULayer",function(t,e){return this.displayList.add(new s(this.scene,t,e))})},71238(t,e,i){var s=i(29747),r=i(97591),n=s;t.exports={renderWebGL:r,renderCanvas:n}},97591(t){t.exports=function(t,e,i,s){i.camera.addToRenderList(e);var r=e.customRenderNodes,n=e.defaultRenderNodes;(r.Submitter||n.Submitter).run(i)}},14727(t,e,i){var s=i(78705),r=i(83419),n=i(88571),a=i(74759),o=new r({Extends:n,Mixins:[a],initialize:function(t,e,i,s,r){n.call(this,t,e,i,s,r),this.type="Stamp"},_defaultRenderNodesMap:{get:function(){return s}}});t.exports=o},656(t,e,i){var s=new(i(61340));t.exports=function(t,e,i){i.addToRenderList(e),s.copyFrom(i.matrix),i.matrix.loadIdentity();var r=i.scrollX,n=i.scrollY;i.scrollX=0,i.scrollY=0,t.batchSprite(e,e.frame,i),i.scrollX=r,i.scrollY=n,i.matrix.copyFrom(s)}},31479(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(14727);r.register("stamp",function(t,e){void 0===t&&(t={});var i=n(t,"key",null),r=n(t,"frame",null),o=new a(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),s(this.scene,o,t),o})},85326(t,e,i){var s=i(14727);i(39429).register("stamp",function(t,e,i,r){return this.displayList.add(new s(this.scene,t,e,i,r))})},74759(t,e,i){var s=i(29747);s=i(656),t.exports={renderCanvas:s}},14220(t){t.exports=function(t,e,i){var s=t.canvas,r=t.context,n=t.style,a=[],o=0,h=i.length;n.maxLines>0&&n.maxLines1&&(d+=l*(c.length-1))}n.wordWrap&&(d-=r.measureText(" ").width),a[u]=Math.ceil(d),o=Math.max(o,a[u])}var p=e.fontSize+n.strokeThickness,g=p*h,m=t.lineSpacing;return h>1&&(g+=m*(h-1)),{width:o,height:g,lines:h,lineWidths:a,lineSpacing:m,lineHeight:p}}},79557(t,e,i){var s=i(27919);t.exports=function(t){var e=s.create(this),i=e.getContext("2d",{willReadFrequently:!0});t.syncFont(e,i);var r=i.measureText(t.testString);if("actualBoundingBoxAscent"in r){var n=r.actualBoundingBoxAscent,a=r.actualBoundingBoxDescent;return s.remove(e),{ascent:n,descent:a,fontSize:n+a}}var o=Math.ceil(r.width*t.baselineX),h=o,l=2*h;h=h*t.baselineY|0,e.width=o,e.height=l,i.fillStyle="#f00",i.fillRect(0,0,o,l),i.font=t._font,i.textBaseline="alphabetic",i.fillStyle="#000",i.fillText(t.testString,0,h);var u={ascent:0,descent:0,fontSize:0},d=i.getImageData(0,0,o,l);if(!d)return u.ascent=h,u.descent=h+6,u.fontSize=u.ascent+u.descent,s.remove(e),u;var c,f,p=d.data,g=p.length,m=4*o,v=0,y=!1;for(c=0;ch;c--){for(f=0;fu){if(0===c){for(var v=p;v.length;){var y=(v=v.slice(0,-1)).length*this.letterSpacing;if((m=e.measureText(v).width+y)<=u)break}if(!v.length)throw new Error("wordWrapWidth < a single character");var x=f.substr(v.length);d[c]=x,h+=v}var T=d[c].length?c:c+1,w=d.slice(T).join(" ").replace(/[ \n]*$/gi,"");r.splice(a+1,0,w),n=r.length;break}h+=p,u-=m}s+=h.replace(/[ \n]*$/gi,"")+"\n"}}return s=s.replace(/[\s|\n]*$/gi,"")},basicWordWrap:function(t,e,i){for(var s="",r=t.split(this.splitRegExp),n=r.length-1,a=e.measureText(" ").width,o=0;o<=n;o++){for(var h=i,l=r[o].split(" "),u=l.length-1,d=0;d<=u;d++){var c=l[d],f=c.length*this.letterSpacing,p=e.measureText(c).width+f,g=p;dh&&d>0&&(s+="\n",h=i),s+=c,d0&&(c+=h.lineSpacing*g),i.rtl)d=f-d-u.left-u.right;else if("right"===i.align)d+=a-h.lineWidths[g];else if("center"===i.align)d+=(a-h.lineWidths[g])/2;else if("justify"===i.align){if(h.lineWidths[g]/h.width>=.85){var m=h.width-h.lineWidths[g],v=e.measureText(" ").width,y=o[g].trim(),x=y.split(" ");m+=(o[g].length-y.length)*v;for(var T=Math.floor(m/v),w=0;T>0;)x[w]+=" ",w=(w+1)%(x.length-1||1),--T;o[g]=x.join(" ")}}this.autoRound&&(d=Math.round(d),c=Math.round(c));var b=this.letterSpacing;if(i.strokeThickness&&0===b&&(i.syncShadow(e,i.shadowStroke),e.strokeText(o[g],d,c)),i.color)if(i.syncShadow(e,i.shadowFill),0!==b)for(var S=0,C=o[g].split(""),E=0;E2?a[o++]:"",s=a[o++]||"16px",i=a[o++]||"Courier"}return i===this.fontFamily&&s===this.fontSize&&r===this.fontStyle||(this.fontFamily=i,this.fontSize=s,this.fontStyle=r,e&&this.update(!0)),this.parent},setFontFamily:function(t){return this.fontFamily!==t&&(this.fontFamily=t,this.update(!0)),this.parent},setFontStyle:function(t){return this.fontStyle!==t&&(this.fontStyle=t,this.update(!0)),this.parent},setFontSize:function(t){return"number"==typeof t&&(t=t.toString()+"px"),this.fontSize!==t&&(this.fontSize=t,this.update(!0)),this.parent},setTestString:function(t){return this.testString=t,this.update(!0)},setFixedSize:function(t,e){return this.fixedWidth=t,this.fixedHeight=e,t&&(this.parent.width=t),e&&(this.parent.height=e),this.update(!1)},setBackgroundColor:function(t){return this.backgroundColor=t,this.update(!1)},setFill:function(t){return this.color=t,this.update(!1)},setColor:function(t){return this.color=t,this.update(!1)},setResolution:function(t){return this.resolution=t,this.update(!1)},setStroke:function(t,e){return void 0===e&&(e=this.strokeThickness),void 0===t&&0!==this.strokeThickness?(this.strokeThickness=0,this.update(!0)):this.stroke===t&&this.strokeThickness===e||(this.stroke=t,this.strokeThickness=e,this.update(!0)),this.parent},setShadow:function(t,e,i,s,r,n){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i="#000"),void 0===s&&(s=0),void 0===r&&(r=!1),void 0===n&&(n=!0),this.shadowOffsetX=t,this.shadowOffsetY=e,this.shadowColor=i,this.shadowBlur=s,this.shadowStroke=r,this.shadowFill=n,this.update(!1)},setShadowOffset:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.shadowOffsetX=t,this.shadowOffsetY=e,this.update(!1)},setShadowColor:function(t){return void 0===t&&(t="#000"),this.shadowColor=t,this.update(!1)},setShadowBlur:function(t){return void 0===t&&(t=0),this.shadowBlur=t,this.update(!1)},setShadowStroke:function(t){return this.shadowStroke=t,this.update(!1)},setShadowFill:function(t){return this.shadowFill=t,this.update(!1)},setWordWrapWidth:function(t,e){return void 0===e&&(e=!1),this.wordWrapWidth=t,this.wordWrapUseAdvanced=e,this.update(!1)},setWordWrapCallback:function(t,e){return void 0===e&&(e=null),this.wordWrapCallback=t,this.wordWrapCallbackScope=e,this.update(!1)},setAlign:function(t){return void 0===t&&(t="left"),this.align=t,this.update(!1)},setMaxLines:function(t){return void 0===t&&(t=0),this.maxLines=t,this.update(!1)},getTextMetrics:function(){var t=this.metrics;return{ascent:t.ascent,descent:t.descent,fontSize:t.fontSize}},toJSON:function(){var t={};for(var e in o)t[e]=this[e];return t.metrics=this.getTextMetrics(),t},destroy:function(){this.parent=void 0}});t.exports=h},34397(t){t.exports=function(t,e,i,s){if(0!==e.width&&0!==e.height){i.camera.addToRenderList(e);var r=e.customRenderNodes,n=e.defaultRenderNodes;(r.Submitter||n.Submitter).run(i,e,s,0,r.Texturer||n.Texturer,r.Transformer||n.Transformer)}}},20839(t,e,i){var s=i(9674),r=i(27919),n=i(41571),a=i(83419),o=i(31401),h=i(95643),l=i(68703),u=i(56295),d=i(45650),c=i(26099),f=new a({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.ComputedSize,o.Depth,o.Flip,o.GetBounds,o.Lighting,o.Mask,o.Origin,o.RenderNodes,o.ScrollFactor,o.Texture,o.Tint,o.Transform,o.Visible,u],initialize:function(t,e,i,n,a,o,l){var u=t.sys.renderer,f=u&&!u.gl;h.call(this,t,"TileSprite");var p=t.sys.textures.get(o).get(l);n=n?Math.floor(n):p.width,a=a?Math.floor(a):p.height,this._tilePosition=new c,this._tileScale=new c(1,1),this._tileRotation=0,this.dirty=!1,this.renderer=u,this.canvas=f?r.create(this,n,a):null,this.context=f?this.canvas.getContext("2d",{willReadFrequently:!1}):null,this._displayTextureKey=d(),this.displayTexture=f?t.sys.textures.addCanvas(this._displayTextureKey,this.canvas):null,this.displayFrame=this.displayTexture?this.displayTexture.get():null,this.currentFrame=null,this.fillCanvas=f?r.create2D(this,p.width,this.displayFrame.height):null,this.fillContext=this.fillCanvas?this.fillCanvas.getContext("2d",{willReadFrequently:!1}):null,this.fillPattern=null,this.anims=new s(this),this.setTexture(o,l),this.setPosition(e,i),this.setSize(n,a),this.setOrigin(.5,.5),this.initRenderNodes(this._defaultRenderNodesMap)},_defaultRenderNodesMap:{get:function(){return n}},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},preUpdate:function(t,e){this.anims.update(t,e)},setFrame:function(t){var e=this.texture.get(t);return e.cutWidth&&e.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this.frame=e,this.dirty=!0,this},setSizeToFrame:function(){return this},setTilePosition:function(t,e){return void 0!==t&&(this.tilePositionX=t),void 0!==e&&(this.tilePositionY=e),this},setTileRotation:function(t){return void 0===t&&(t=0),this.tileRotation=t,this},setTileScale:function(t,e){return void 0===t&&(t=this.tileScaleX),void 0===e&&(e=t),this.tileScaleX=t,this.tileScaleY=e,this},updateTileTexture:function(){if(this.renderer&&!this.renderer.gl){var t=this.frame,e=this.fillContext,i=this.fillCanvas,s=t.cutWidth,r=t.cutHeight;e.clearRect(0,0,s,r),i.width=s,i.height=r,e.drawImage(t.source.image,t.cutX,t.cutY,t.cutWidth,t.cutHeight,0,0,s,r),this.fillPattern=e.createPattern(i,"repeat"),this.currentFrame=t}},updateCanvas:function(){var t=this.canvas,e=this.width,i=this.height,s=this.currentFrame!==this.frame;if((t.width!==e||t.height!==i||s)&&(t.width=e,t.height=i,this.displayFrame.setSize(e,i),this.updateDisplayOrigin(),s&&this.updateTileTexture(),this.dirty=!0),!this.dirty||this.renderer&&this.renderer.gl)this.dirty=!1;else{var r=this.context;this.scene.sys.game.config.antialias||l.disable(r);var n=this._tileScale.x,a=this._tileScale.y,o=this._tilePosition.x,h=this._tilePosition.y;r.clearRect(0,0,e,i),r.save(),r.rotate(this._tileRotation),r.scale(n,a),r.translate(-o,-h),r.fillStyle=this.fillPattern;var u=Math.max(e,Math.abs(e/n)),d=Math.max(i,Math.abs(i/a)),c=Math.sqrt(u*u+d*d);r.fillRect(o-c,h-c,2*c,2*c),r.restore(),this.dirty=!1}},setSize:function(t,e){this.width=t,this.height=e,this.updateDisplayOrigin();var i=this.input;return i&&!i.customHitArea&&(i.hitArea.width=t,i.hitArea.height=e),this},preDestroy:function(){this.canvas&&r.remove(this.canvas),this.fillCanvas&&r.remove(this.fillCanvas),this.fillPattern=null,this.fillContext=null,this.fillCanvas=null,this.displayTexture=null,this.displayFrame=null,this.renderer=null,this.anims.destroy(),this.anims=void 0},tilePositionX:{get:function(){return this._tilePosition.x},set:function(t){this._tilePosition.x=t,this.dirty=!0}},tilePositionY:{get:function(){return this._tilePosition.y},set:function(t){this._tilePosition.y=t,this.dirty=!0}},tileRotation:{get:function(){return this._tileRotation},set:function(t){this._tileRotation=t,this.dirty=!0}},tileScaleX:{get:function(){return this._tileScale.x},set:function(t){this._tileScale.x=t,this.dirty=!0}},tileScaleY:{get:function(){return this._tileScale.y},set:function(t){this._tileScale.y=t,this.dirty=!0}}});t.exports=f},46992(t){t.exports=function(t,e,i,s){e.updateCanvas(),i.addToRenderList(e),t.batchSprite(e,e.displayFrame,i,s)}},14167(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(20839);r.register("tileSprite",function(t,e){void 0===t&&(t={});var i=n(t,"x",0),r=n(t,"y",0),o=n(t,"width",512),h=n(t,"height",512),l=n(t,"key",""),u=n(t,"frame",""),d=new a(this.scene,i,r,o,h,l,u);return void 0!==e&&(t.add=e),s(this.scene,d,t),d})},91681(t,e,i){var s=i(20839);i(39429).register("tileSprite",function(t,e,i,r,n,a){return this.displayList.add(new s(this.scene,t,e,i,r,n,a))})},56295(t,e,i){var s=i(29747),r=s,n=s;r=i(18553),n=i(46992),t.exports={renderWebGL:r,renderCanvas:n}},18553(t){t.exports=function(t,e,i,s){var r=e.width,n=e.height;if(0!==r&&0!==n){i.camera.addToRenderList(e);var a=e.customRenderNodes,o=e.defaultRenderNodes;(a.Submitter||o.Submitter).run(i,e,s,0,a.Texturer||o.Texturer,a.Transformer||o.Transformer)}}},18471(t,e,i){var s=i(45319),r=i(40939),n=i(83419),a=i(31401),o=i(51708),h=i(8443),l=i(95643),u=i(36383),d=i(14463),c=i(45650),f=i(10247),p=new n({Extends:l,Mixins:[a.Alpha,a.BlendMode,a.ComputedSize,a.Depth,a.Flip,a.GetBounds,a.Lighting,a.Mask,a.Origin,a.RenderNodes,a.ScrollFactor,a.TextureCrop,a.Tint,a.Transform,a.Visible,f],initialize:function(t,e,i,s){l.call(this,t,"Video"),this.video,this.videoTexture,this.videoTextureSource,this.snapshotTexture,this.glFlipY=!0,this._key=c(),this.touchLocked=!1,this.playWhenUnlocked=!1,this.frameReady=!1,this.isStalled=!1,this.failedPlayAttempts=0,this.metadata,this.retry=0,this.retryInterval=500,this._systemMuted=!1,this._codeMuted=!1,this._systemPaused=!1,this._codePaused=!1,this._callbacks={ended:this.completeHandler.bind(this),legacy:this.legacyPlayHandler.bind(this),playing:this.playingHandler.bind(this),seeked:this.seekedHandler.bind(this),seeking:this.seekingHandler.bind(this),stalled:this.stalledHandler.bind(this),suspend:this.stalledHandler.bind(this),waiting:this.stalledHandler.bind(this)},this._loadCallbackHandler=this.loadErrorHandler.bind(this),this._metadataCallbackHandler=this.metadataHandler.bind(this),this._crop=this.resetCropObject(),this.markers={},this._markerIn=0,this._markerOut=0,this._playingMarker=!1,this._lastUpdate=0,this.cacheKey="",this.isSeeking=!1,this._playCalled=!1,this._getFrame=!1,this._rfvCallbackId=0;var r=t.sys.game;this._device=r.device.video,this.setPosition(e,i),this.setSize(256,256),this.initRenderNodes(this._defaultRenderNodesMap),r.events.on(h.PAUSE,this.globalPause,this),r.events.on(h.RESUME,this.globalResume,this);var n=t.sys.sound;n&&n.on(d.GLOBAL_MUTE,this.globalMute,this),s&&this.load(s)},_defaultRenderNodesMap:{get:function(){return r}},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},load:function(t){var e=this.scene.sys.cache.video.get(t);return e?(this.cacheKey=t,this.loadHandler(e.url,e.noAudio,e.crossOrigin)):console.warn("No video in cache for key: "+t),this},changeSource:function(t,e,i,s,r){void 0===e&&(e=!0),void 0===i&&(i=!1),this.cacheKey!==t&&(this.load(t),e&&this.play(i,s,r))},getVideoKey:function(){return this.cacheKey},loadURL:function(t,e,i){void 0===e&&(e=!1);var s=this._device.getVideoURL(t);return s?(this.cacheKey="",this.loadHandler(s.url,e,i)):console.warn("No supported video format found for "+t),this},loadMediaStream:function(t,e,i){return this.loadHandler(null,e,i,t)},loadHandler:function(t,e,i,s){e||(e=!1);var r=this.video;if(r?(this.removeLoadEventHandlers(),this.stop()):((r=document.createElement("video")).controls=!1,r.setAttribute("playsinline","playsinline"),r.setAttribute("preload","auto"),r.setAttribute("disablePictureInPicture","true")),e?(r.muted=!0,r.defaultMuted=!0,r.setAttribute("autoplay","autoplay")):(r.muted=!1,r.defaultMuted=!1,r.removeAttribute("autoplay")),i?r.setAttribute("crossorigin",i):r.removeAttribute("crossorigin"),s)if("srcObject"in r)try{r.srcObject=s}catch(t){if("TypeError"!==t.name)throw t;r.src=URL.createObjectURL(s)}else r.src=URL.createObjectURL(s);else r.src=t;this.retry=0,this.video=r,this._playCalled=!1,r.load(),this.addLoadEventHandlers();var n=this.scene.sys.textures.get(this._key);return this.setTexture(n),this},requestVideoFrame:function(t,e){var i=this.video;if(i){var s=e.width,r=e.height,n=this.videoTexture,a=this.videoTextureSource,h=!n||a.source!==i;h?(this._codePaused=i.paused,this._codeMuted=i.muted,n?(a.source=i,a.width=s,a.height=r,n.get().setSize(s,r)):((n=this.scene.sys.textures.create(this._key,i,s,r)).add("__BASE",0,0,0,s,r),this.setTexture(n),this.videoTexture=n,this.videoTextureSource=n.source[0],this.videoTextureSource.setFlipY(this.glFlipY),this.emit(o.VIDEO_TEXTURE,this,n)),this.setSizeToFrame(),this.updateDisplayOrigin()):a.update(),this.isStalled=!1,this.metadata=e;var l=e.mediaTime;h&&(this._lastUpdate=l,this.emit(o.VIDEO_CREATED,this,s,r),this.frameReady||(this.frameReady=!0,this.emit(o.VIDEO_PLAY,this))),this._playingMarker?l>=this._markerOut&&(i.loop?(i.currentTime=this._markerIn,this.emit(o.VIDEO_LOOP,this)):(this.stop(!1),this.emit(o.VIDEO_COMPLETE,this))):l-1&&i>e&&i=0&&!isNaN(i)&&i>e&&(this.markers[t]=[e,i]),this},playMarker:function(t,e){var i=this.markers[t];return i&&this.play(e,i[0],i[1]),this},removeMarker:function(t){return delete this.markers[t],this},snapshot:function(t,e){return void 0===t&&(t=this.width),void 0===e&&(e=this.height),this.snapshotArea(0,0,this.width,this.height,t,e)},snapshotArea:function(t,e,i,s,r,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===s&&(s=this.height),void 0===r&&(r=i),void 0===n&&(n=s);var a=this.video,o=this.snapshotTexture;return o?(o.setSize(r,n),a&&o.context.drawImage(a,t,e,i,s,0,0,r,n)):(o=this.scene.sys.textures.createCanvas(c(),r,n),this.snapshotTexture=o,a&&o.context.drawImage(a,t,e,i,s,0,0,r,n)),o.update()},saveSnapshotTexture:function(t){return this.snapshotTexture?this.scene.sys.textures.renameTexture(this.snapshotTexture.key,t):this.snapshotTexture=this.scene.sys.textures.createCanvas(t,this.width,this.height),this.snapshotTexture},playSuccess:function(){if(this._playCalled){this.addEventHandlers(),this._codePaused=!1,this.touchLocked&&(this.touchLocked=!1,this.emit(o.VIDEO_UNLOCKED,this));var t=this.scene.sys.sound;t&&t.mute&&this.setMute(!0),this._markerIn>-1&&(this.video.currentTime=this._markerIn)}},playError:function(t){var e=t.name;"NotAllowedError"===e?(this.touchLocked=!0,this.playWhenUnlocked=!0,this.failedPlayAttempts=1,this.emit(o.VIDEO_LOCKED,this)):"NotSupportedError"===e?(this.stop(!1),this.emit(o.VIDEO_UNSUPPORTED,this,t)):(this.stop(!1),this.emit(o.VIDEO_ERROR,this,t))},legacyPlayHandler:function(){var t=this.video;t&&(this.playSuccess(),t.removeEventListener("playing",this._callbacks.legacy))},playingHandler:function(){this.isStalled=!1,this.emit(o.VIDEO_PLAYING,this)},loadErrorHandler:function(t){this.stop(!1),this.emit(o.VIDEO_ERROR,this,t)},metadataHandler:function(t){this.emit(o.VIDEO_METADATA,this,t)},setSizeToFrame:function(t){t||(t=this.frame),this.width=t.realWidth,this.height=t.realHeight,1!==this.scaleX&&(this.scaleX=this.displayWidth/this.width),1!==this.scaleY&&(this.scaleY=this.displayHeight/this.height);var e=this.input;return e&&!e.customHitArea&&(e.hitArea.width=this.width,e.hitArea.height=this.height),this},stalledHandler:function(t){this.isStalled=!0,this.emit(o.VIDEO_STALLED,this,t)},completeHandler:function(){this._playCalled=!1,this.emit(o.VIDEO_COMPLETE,this)},preUpdate:function(t,e){this.video&&this._playCalled&&this.touchLocked&&this.playWhenUnlocked&&(this.retry+=e,this.retry>=this.retryInterval&&(this.createPlayPromise(!1),this.retry=0))},seekTo:function(t){var e=this.video;if(e){var i=e.duration;if(i!==1/0&&!isNaN(i)){var s=i*t;this.setCurrentTime(s)}}return this},getCurrentTime:function(){return this.video?this.video.currentTime:0},setCurrentTime:function(t){var e=this.video;if(e){if("string"==typeof t){var i=t[0],s=parseFloat(t.substr(1));"+"===i?t=e.currentTime+s:"-"===i&&(t=e.currentTime-s)}e.currentTime=t}return this},seekingHandler:function(){this.isSeeking=!0,this.emit(o.VIDEO_SEEKING,this)},seekedHandler:function(){this.isSeeking=!1,this.emit(o.VIDEO_SEEKED,this)},getProgress:function(){var t=this.video;if(t){var e=t.duration;if(e!==1/0&&!isNaN(e))return t.currentTime/e}return-1},getDuration:function(){return this.video?this.video.duration:0},setMute:function(t){void 0===t&&(t=!0),this._codeMuted=t;var e=this.video;return e&&(e.muted=!!this._systemMuted||t),this},isMuted:function(){return this._codeMuted},globalMute:function(t,e){this._systemMuted=e;var i=this.video;i&&(i.muted=!!this._codeMuted||e)},globalPause:function(){this._systemPaused=!0,this.video&&!this.video.ended&&(this.removeEventHandlers(),this.video.pause())},globalResume:function(){this._systemPaused=!1,!this.video||this._codePaused||this.video.ended||this.createPlayPromise()},setPaused:function(t){void 0===t&&(t=!0);var e=this.video;return this._codePaused=t,e&&!e.ended&&(t?e.paused||(this.removeEventHandlers(),e.pause()):t||(this._playCalled?e.paused&&!this._systemPaused&&this.createPlayPromise():this.play())),this},pause:function(){return this.setPaused(!0)},resume:function(){return this.setPaused(!1)},getVolume:function(){return this.video?this.video.volume:1},setVolume:function(t){return void 0===t&&(t=1),this.video&&(this.video.volume=s(t,0,1)),this},getPlaybackRate:function(){return this.video?this.video.playbackRate:1},setPlaybackRate:function(t){return this.video&&(this.video.playbackRate=t),this},getLoop:function(){return!!this.video&&this.video.loop},setLoop:function(t){return void 0===t&&(t=!0),this.video&&(this.video.loop=t),this},isPlaying:function(){return!!this.video&&!(this.video.paused||this.video.ended)},isPaused:function(){return this.video&&this._playCalled&&this.video.paused||this._codePaused||this._systemPaused},saveTexture:function(t,e){return void 0===e&&(e=!0),this.videoTexture&&(this.scene.sys.textures.renameTexture(this._key,t),this.videoTextureSource.setFlipY(e)),this._key=t,this.glFlipY=e,!!this.videoTexture},stop:function(t){void 0===t&&(t=!0);var e=this.video;return e&&(this.removeEventHandlers(),e.cancelVideoFrameCallback(this._rfvCallbackId),e.pause()),this.retry=0,this._playCalled=!1,t&&this.emit(o.VIDEO_STOP,this),this},removeVideoElement:function(){var t=this.video;if(t){for(t.parentNode&&t.parentNode.removeChild(t);t.hasChildNodes();)t.removeChild(t.firstChild);t.removeAttribute("autoplay"),t.removeAttribute("src"),this.video=null}},preDestroy:function(){this.stop(!1),this.removeLoadEventHandlers(),this.removeVideoElement();var t=this.scene.sys.game.events;t.off(h.PAUSE,this.globalPause,this),t.off(h.RESUME,this.globalResume,this);var e=this.scene.sys.sound;e&&e.off(d.GLOBAL_MUTE,this.globalMute,this)}});t.exports=p},58352(t){t.exports=function(t,e,i,s){e.videoTexture&&(i.addToRenderList(e),t.batchSprite(e,e.frame,i,s))}},11511(t,e,i){var s=i(25305),r=i(44603),n=i(23568),a=i(18471);r.register("video",function(t,e){void 0===t&&(t={});var i=n(t,"key",null),r=new a(this.scene,0,0,i);return void 0!==e&&(t.add=e),s(this.scene,r,t),r})},89025(t,e,i){var s=i(18471);i(39429).register("video",function(t,e,i){return this.displayList.add(new s(this.scene,t,e,i))})},10247(t,e,i){var s=i(29747),r=s,n=s;r=i(29849),n=i(58352),t.exports={renderWebGL:r,renderCanvas:n}},29849(t){t.exports=function(t,e,i,s){if(e.videoTexture){i.camera.addToRenderList(e);var r=e.customRenderNodes,n=e.defaultRenderNodes;(r.Submitter||n.Submitter).run(i,e,s,0,r.Texturer||n.Texturer,r.Transformer||n.Transformer)}}},41481(t,e,i){var s=i(10312),r=i(96503),n=i(87902),a=i(83419),o=i(31401),h=i(95643),l=i(87841),u=i(37303),d=new a({Extends:h,Mixins:[o.Depth,o.GetBounds,o.Origin,o.Transform,o.ScrollFactor,o.Visible],initialize:function(t,e,i,r,n){void 0===r&&(r=1),void 0===n&&(n=r),h.call(this,t,"Zone"),this.setPosition(e,i),this.width=r,this.height=n,this.blendMode=s.NORMAL,this.updateDisplayOrigin()},displayWidth:{get:function(){return this.scaleX*this.width},set:function(t){this.scaleX=t/this.width}},displayHeight:{get:function(){return this.scaleY*this.height},set:function(t){this.scaleY=t/this.height}},setSize:function(t,e,i){void 0===i&&(i=!0),this.width=t,this.height=e,this.updateDisplayOrigin();var s=this.input;return i&&s&&!s.customHitArea&&(s.hitArea.width=t,s.hitArea.height=e),this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this},setCircleDropZone:function(t){return this.setDropZone(new r(0,0,t),n)},setRectangleDropZone:function(t,e){return this.setDropZone(new l(0,0,t,e),u)},setDropZone:function(t,e){return this.input||this.setInteractive(t,e,!0),this},setAlpha:function(){},setBlendMode:function(){},renderCanvas:function(t,e,i){i.addToRenderList(e)},renderWebGL:function(t,e,i){i.camera.addToRenderList(e)}});t.exports=d},95261(t,e,i){var s=i(44603),r=i(23568),n=i(41481);s.register("zone",function(t){var e=r(t,"x",0),i=r(t,"y",0),s=r(t,"width",1),a=r(t,"height",s);return new n(this.scene,e,i,s,a)})},84175(t,e,i){var s=i(41481);i(39429).register("zone",function(t,e,i,r){return this.displayList.add(new s(this.scene,t,e,i,r))})},95166(t){t.exports=function(t){return t.radius>0?Math.PI*t.radius*t.radius:0}},96503(t,e,i){var s=i(83419),r=i(87902),n=i(26241),a=i(79124),o=i(23777),h=i(28176),l=new s({initialize:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),this.type=o.CIRCLE,this.x=t,this.y=e,this._radius=i,this._diameter=2*i},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return n(this,t,e)},getPoints:function(t,e,i){return a(this,t,e,i)},getRandomPoint:function(t){return h(this,t)},setTo:function(t,e,i){return this.x=t,this.y=e,this._radius=i,this._diameter=2*i,this},setEmpty:function(){return this._radius=0,this._diameter=0,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},isEmpty:function(){return this._radius<=0},radius:{get:function(){return this._radius},set:function(t){this._radius=t,this._diameter=2*t}},diameter:{get:function(){return this._diameter},set:function(t){this._diameter=t,this._radius=.5*t}},left:{get:function(){return this.x-this._radius},set:function(t){this.x=t+this._radius}},right:{get:function(){return this.x+this._radius},set:function(t){this.x=t-this._radius}},top:{get:function(){return this.y-this._radius},set:function(t){this.y=t+this._radius}},bottom:{get:function(){return this.y+this._radius},set:function(t){this.y=t-this._radius}}});t.exports=l},71562(t){t.exports=function(t){return Math.PI*t.radius*2}},92110(t,e,i){var s=i(26099);t.exports=function(t,e,i){return void 0===i&&(i=new s),i.x=t.x+t.radius*Math.cos(e),i.y=t.y+t.radius*Math.sin(e),i}},42250(t,e,i){var s=i(96503);t.exports=function(t){return new s(t.x,t.y,t.radius)}},87902(t){t.exports=function(t,e,i){return t.radius>0&&e>=t.left&&e<=t.right&&i>=t.top&&i<=t.bottom&&(t.x-e)*(t.x-e)+(t.y-i)*(t.y-i)<=t.radius*t.radius}},5698(t,e,i){var s=i(87902);t.exports=function(t,e){return s(t,e.x,e.y)}},70588(t,e,i){var s=i(87902);t.exports=function(t,e){return s(t,e.x,e.y)&&s(t,e.right,e.y)&&s(t,e.x,e.bottom)&&s(t,e.right,e.bottom)}},26394(t){t.exports=function(t,e){return e.setTo(t.x,t.y,t.radius)}},76278(t){t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.radius===e.radius}},2074(t,e,i){var s=i(87841);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=t.left,e.y=t.top,e.width=t.diameter,e.height=t.diameter,e}},26241(t,e,i){var s=i(92110),r=i(62945),n=i(36383),a=i(26099);t.exports=function(t,e,i){void 0===i&&(i=new a);var o=r(e,0,n.TAU);return s(t,o,i)}},79124(t,e,i){var s=i(71562),r=i(92110),n=i(62945),a=i(36383);t.exports=function(t,e,i,o){void 0===o&&(o=[]),!e&&i>0&&(e=s(t)/i);for(var h=0;h1?2-r:r,a=n*Math.cos(i),o=n*Math.sin(i);return e.x=t.x+a*t.radius,e.y=t.y+o*t.radius,e}},88911(t,e,i){var s=i(96503);s.Area=i(95166),s.Circumference=i(71562),s.CircumferencePoint=i(92110),s.Clone=i(42250),s.Contains=i(87902),s.ContainsPoint=i(5698),s.ContainsRect=i(70588),s.CopyFrom=i(26394),s.Equals=i(76278),s.GetBounds=i(2074),s.GetPoint=i(26241),s.GetPoints=i(79124),s.Offset=i(50884),s.OffsetPoint=i(39212),s.Random=i(28176),t.exports=s},23777(t){t.exports={CIRCLE:0,ELLIPSE:1,LINE:2,POINT:3,POLYGON:4,RECTANGLE:5,TRIANGLE:6}},78874(t){t.exports=function(t){return t.isEmpty()?0:t.getMajorRadius()*t.getMinorRadius()*Math.PI}},92990(t){t.exports=function(t){var e=t.width/2,i=t.height/2,s=Math.pow(e-i,2)/Math.pow(e+i,2);return Math.PI*(e+i)*(1+3*s/(10+Math.sqrt(4-3*s)))}},79522(t,e,i){var s=i(26099);t.exports=function(t,e,i){void 0===i&&(i=new s);var r=t.width/2,n=t.height/2;return i.x=t.x+r*Math.cos(e),i.y=t.y+n*Math.sin(e),i}},58102(t,e,i){var s=i(8497);t.exports=function(t){return new s(t.x,t.y,t.width,t.height)}},81154(t){t.exports=function(t,e,i){if(t.width<=0||t.height<=0)return!1;var s=(e-t.x)/t.width,r=(i-t.y)/t.height;return(s*=s)+(r*=r)<.25}},46662(t,e,i){var s=i(81154);t.exports=function(t,e){return s(t,e.x,e.y)}},1632(t,e,i){var s=i(81154);t.exports=function(t,e){return s(t,e.x,e.y)&&s(t,e.right,e.y)&&s(t,e.x,e.bottom)&&s(t,e.right,e.bottom)}},65534(t){t.exports=function(t,e){return e.setTo(t.x,t.y,t.width,t.height)}},8497(t,e,i){var s=i(83419),r=i(81154),n=i(90549),a=i(48320),o=i(23777),h=i(24820),l=new s({initialize:function(t,e,i,s){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),this.type=o.ELLIPSE,this.x=t,this.y=e,this.width=i,this.height=s},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return n(this,t,e)},getPoints:function(t,e,i){return a(this,t,e,i)},getRandomPoint:function(t){return h(this,t)},setTo:function(t,e,i,s){return this.x=t,this.y=e,this.width=i,this.height=s,this},setEmpty:function(){return this.width=0,this.height=0,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},isEmpty:function(){return this.width<=0||this.height<=0},getMinorRadius:function(){return Math.min(this.width,this.height)/2},getMajorRadius:function(){return Math.max(this.width,this.height)/2},left:{get:function(){return this.x-this.width/2},set:function(t){this.x=t+this.width/2}},right:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},top:{get:function(){return this.y-this.height/2},set:function(t){this.y=t+this.height/2}},bottom:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}});t.exports=l},36146(t){t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}},23694(t,e,i){var s=i(87841);t.exports=function(t,e){return void 0===e&&(e=new s),e.x=t.left,e.y=t.top,e.width=t.width,e.height=t.height,e}},90549(t,e,i){var s=i(79522),r=i(62945),n=i(36383),a=i(26099);t.exports=function(t,e,i){void 0===i&&(i=new a);var o=r(e,0,n.TAU);return s(t,o,i)}},48320(t,e,i){var s=i(92990),r=i(79522),n=i(62945),a=i(36383);t.exports=function(t,e,i,o){void 0===o&&(o=[]),!e&&i>0&&(e=s(t)/i);for(var h=0;ha||n>o)return!1;if(r<=i||n<=s)return!0;var h=r-i,l=n-s;return h*h+l*l<=t.radius*t.radius}},63376(t,e,i){var s=i(26099),r=i(2044);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var n,a,o,h,l=t.x,u=t.y,d=t.radius,c=e.x,f=e.y,p=e.radius;if(u===f)0===(o=(a=-2*f)*a-4*(n=1)*(c*c+(h=(p*p-d*d-c*c+l*l)/(2*(l-c)))*h-2*c*h+f*f-p*p))?i.push(new s(h,-a/(2*n))):o>0&&(i.push(new s(h,(-a+Math.sqrt(o))/(2*n))),i.push(new s(h,(-a-Math.sqrt(o))/(2*n))));else{var g=(l-c)/(u-f),m=(p*p-d*d-c*c+l*l-f*f+u*u)/(2*(u-f));0===(o=(a=2*u*g-2*m*g-2*l)*a-4*(n=g*g+1)*(l*l+u*u+m*m-d*d-2*u*m))?(h=-a/(2*n),i.push(new s(h,m-h*g))):o>0&&(h=(-a+Math.sqrt(o))/(2*n),i.push(new s(h,m-h*g)),h=(-a-Math.sqrt(o))/(2*n),i.push(new s(h,m-h*g)))}}return i}},97439(t,e,i){var s=i(4042),r=i(81491);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var n=e.getLineA(),a=e.getLineB(),o=e.getLineC(),h=e.getLineD();s(n,t,i),s(a,t,i),s(o,t,i),s(h,t,i)}return i}},4042(t,e,i){var s=i(26099),r=i(80462);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var n,a,o=t.x1,h=t.y1,l=t.x2,u=t.y2,d=e.x,c=e.y,f=e.radius,p=l-o,g=u-h,m=o-d,v=h-c,y=p*p+g*g,x=2*(p*m+g*v),T=x*x-4*y*(m*m+v*v-f*f);if(0===T){var w=-x/(2*y);n=o+w*p,a=h+w*g,w>=0&&w<=1&&i.push(new s(n,a))}else if(T>0){var b=(-x-Math.sqrt(T))/(2*y);n=o+b*p,a=h+b*g,b>=0&&b<=1&&i.push(new s(n,a));var S=(-x+Math.sqrt(T))/(2*y);n=o+S*p,a=h+S*g,S>=0&&S<=1&&i.push(new s(n,a))}}return i}},36100(t,e,i){var s=i(25836);t.exports=function(t,e,i,r){void 0===i&&(i=!1);var n,a,o,h=t.x1,l=t.y1,u=t.x2,d=t.y2,c=e.x1,f=e.y1,p=u-h,g=d-l,m=e.x2-c,v=e.y2-f,y=p*v-g*m;if(0===y)return null;if(i){if(n=(p*(f-l)+g*(h-c))/(m*g-v*p),0!==p)a=(c+m*n-h)/p;else{if(0===g)return null;a=(f+v*n-l)/g}if(a<0||n<0||n>1)return null;o=a}else{if(a=((l-f)*p-(h-c)*g)/y,(n=((c-h)*v-(f-l)*m)/y)<0||n>1||a<0||a>1)return null;o=n}return void 0===r&&(r=new s),r.set(h+p*o,l+g*o,o)}},3073(t,e,i){var s=i(36100),r=i(23031),n=i(25836),a=new r,o=new n;t.exports=function(t,e,i,r){void 0===i&&(i=!1),void 0===r&&(r=new n);var h=!1;r.set(),o.set();for(var l=e[e.length-1],u=0;u0){var c=(o*n+h*a)/l;u*=c,d*=c}return i.x=t.x1+u,i.y=t.y1+d,u*u+d*d<=l&&u*n+d*a>=0&&s(e,i.x,i.y)}},76112(t){t.exports=function(t,e,i){var s=t.x1,r=t.y1,n=t.x2,a=t.y2,o=e.x1,h=e.y1,l=e.x2,u=e.y2;if(s===n&&r===a||o===l&&h===u)return!1;var d=(u-h)*(n-s)-(l-o)*(a-r);if(0===d)return!1;var c=((l-o)*(r-h)-(u-h)*(s-o))/d,f=((n-s)*(r-h)-(a-r)*(s-o))/d;return!(c<0||c>1||f<0||f>1)&&(i&&(i.x=s+c*(n-s),i.y=r+c*(a-r)),!0)}},92773(t){t.exports=function(t,e){var i=t.x1,s=t.y1,r=t.x2,n=t.y2,a=e.x,o=e.y,h=e.right,l=e.bottom,u=0;if(i>=a&&i<=h&&s>=o&&s<=l||r>=a&&r<=h&&n>=o&&n<=l)return!0;if(i=a){if((u=s+(n-s)*(a-i)/(r-i))>o&&u<=l)return!0}else if(i>h&&r<=h&&(u=s+(n-s)*(h-i)/(r-i))>=o&&u<=l)return!0;if(s=o){if((u=i+(r-i)*(o-s)/(n-s))>=a&&u<=h)return!0}else if(s>l&&n<=l&&(u=i+(r-i)*(l-s)/(n-s))>=a&&u<=h)return!0;return!1}},16204(t){t.exports=function(t,e,i){void 0===i&&(i=1);var s=e.x1,r=e.y1,n=e.x2,a=e.y2,o=t.x,h=t.y,l=(n-s)*(n-s)+(a-r)*(a-r);if(0===l)return!1;var u=((o-s)*(n-s)+(h-r)*(a-r))/l;if(u<0)return Math.sqrt((s-o)*(s-o)+(r-h)*(r-h))<=i;if(u>=0&&u<=1){var d=((r-h)*(n-s)-(s-o)*(a-r))/l;return Math.abs(d)*Math.sqrt(l)<=i}return Math.sqrt((n-o)*(n-o)+(a-h)*(a-h))<=i}},14199(t,e,i){var s=i(16204);t.exports=function(t,e){if(!s(t,e))return!1;var i=Math.min(e.x1,e.x2),r=Math.max(e.x1,e.x2),n=Math.min(e.y1,e.y2),a=Math.max(e.y1,e.y2);return t.x>=i&&t.x<=r&&t.y>=n&&t.y<=a}},59996(t){t.exports=function(t,e){return!(t.width<=0||t.height<=0||e.width<=0||e.height<=0)&&!(t.righte.right||t.y>e.bottom)}},89265(t,e,i){var s=i(76112),r=i(37303),n=i(48653),a=i(77493);t.exports=function(t,e){if(e.left>t.right||e.rightt.bottom||e.bottom0}},84411(t){t.exports=function(t,e,i,s,r,n){return void 0===n&&(n=0),!(e>t.right+n||it.bottom+n||re.right||t.righte.bottom||t.bottome.right||t.righte.bottom||t.bottom0||(d=r(e),(c=s(t,d,!0)).length>0)}},91865(t,e,i){t.exports={CircleToCircle:i(2044),CircleToRectangle:i(81491),GetCircleToCircle:i(63376),GetCircleToRectangle:i(97439),GetLineToCircle:i(4042),GetLineToLine:i(36100),GetLineToPoints:i(3073),GetLineToPolygon:i(56362),GetLineToRectangle:i(60646),GetRaysFromPointToPolygon:i(71147),GetRectangleIntersection:i(68389),GetRectangleToRectangle:i(52784),GetRectangleToTriangle:i(26341),GetTriangleToCircle:i(38720),GetTriangleToLine:i(13882),GetTriangleToTriangle:i(75636),LineToCircle:i(80462),LineToLine:i(76112),LineToRectangle:i(92773),PointToLine:i(16204),PointToLineSegment:i(14199),RectangleToRectangle:i(59996),RectangleToTriangle:i(89265),RectangleToValues:i(84411),TriangleToCircle:i(67636),TriangleToLine:i(2822),TriangleToTriangle:i(82944)}},91938(t){t.exports=function(t){return Math.atan2(t.y2-t.y1,t.x2-t.x1)}},84993(t){t.exports=function(t,e,i){void 0===e&&(e=1),void 0===i&&(i=[]);var s=Math.round(t.x1),r=Math.round(t.y1),n=Math.round(t.x2),a=Math.round(t.y2),o=Math.abs(n-s),h=Math.abs(a-r),l=s-h&&(d-=h,s+=l),f0){var v=u[0],y=[v];for(h=1;h=a&&(y.push(x),v=x)}var T=u[u.length-1];return s(v,T)0&&(e=s(t)/i);for(var a=t.x1,o=t.y1,h=t.x2,l=t.y2,u=0;uthis.x2?this.x1=t:this.x2=t}},top:{get:function(){return Math.min(this.y1,this.y2)},set:function(t){this.y1<=this.y2?this.y1=t:this.y2=t}},bottom:{get:function(){return Math.max(this.y1,this.y2)},set:function(t){this.y1>this.y2?this.y1=t:this.y2=t}}});t.exports=l},64795(t,e,i){var s=i(36383),r=i(15994),n=i(91938);t.exports=function(t){var e=n(t)-s.PI_OVER_2;return r(e,-Math.PI,Math.PI)}},52616(t,e,i){var s=i(36383),r=i(91938);t.exports=function(t){return Math.cos(r(t)-s.PI_OVER_2)}},87231(t,e,i){var s=i(36383),r=i(91938);t.exports=function(t){return Math.sin(r(t)-s.PI_OVER_2)}},89662(t){t.exports=function(t,e,i){return t.x1+=e,t.y1+=i,t.x2+=e,t.y2+=i,t}},71165(t){t.exports=function(t){return-(t.x2-t.x1)/(t.y2-t.y1)}},65822(t,e,i){var s=i(26099);t.exports=function(t,e){void 0===e&&(e=new s);var i=Math.random();return e.x=t.x1+i*(t.x2-t.x1),e.y=t.y1+i*(t.y2-t.y1),e}},69777(t,e,i){var s=i(91938),r=i(64795);t.exports=function(t,e){return 2*r(e)-Math.PI-s(t)}},39706(t,e,i){var s=i(64400);t.exports=function(t,e){var i=(t.x1+t.x2)/2,r=(t.y1+t.y2)/2;return s(t,i,r,e)}},82585(t,e,i){var s=i(64400);t.exports=function(t,e,i){return s(t,e.x,e.y,i)}},64400(t){t.exports=function(t,e,i,s){var r=Math.cos(s),n=Math.sin(s),a=t.x1-e,o=t.y1-i;return t.x1=a*r-o*n+e,t.y1=a*n+o*r+i,a=t.x2-e,o=t.y2-i,t.x2=a*r-o*n+e,t.y2=a*n+o*r+i,t}},62377(t){t.exports=function(t,e,i,s,r){return t.x1=e,t.y1=i,t.x2=e+Math.cos(s)*r,t.y2=i+Math.sin(s)*r,t}},71366(t){t.exports=function(t){return(t.y2-t.y1)/(t.x2-t.x1)}},10809(t){t.exports=function(t){return Math.abs(t.x1-t.x2)}},2529(t,e,i){var s=i(23031);s.Angle=i(91938),s.BresenhamPoints=i(84993),s.CenterOn=i(36469),s.Clone=i(31116),s.CopyFrom=i(59944),s.Equals=i(59220),s.Extend=i(78177),s.GetEasedPoints=i(26708),s.GetMidPoint=i(32125),s.GetNearestPoint=i(99569),s.GetNormal=i(34638),s.GetPoint=i(13151),s.GetPoints=i(15258),s.GetShortestDistance=i(26408),s.Height=i(98770),s.Length=i(35001),s.NormalAngle=i(64795),s.NormalX=i(52616),s.NormalY=i(87231),s.Offset=i(89662),s.PerpSlope=i(71165),s.Random=i(65822),s.ReflectAngle=i(69777),s.Rotate=i(39706),s.RotateAroundPoint=i(82585),s.RotateAroundXY=i(64400),s.SetToAngle=i(62377),s.Slope=i(71366),s.Width=i(10809),t.exports=s},12306(t,e,i){var s=i(25717);t.exports=function(t){return new s(t.points)}},63814(t){t.exports=function(t,e,i){for(var s=!1,r=-1,n=t.points.length-1;++r80*s){n=o=t[0],a=h=t[1];for(var x=s;xo&&(o=d),c>h&&(h=c);p=0!==(p=Math.max(o-n,h-a))?32767/p:0}return r(v,y,s,n,a,p,0),y}function i(t,e,i,s,r){var n,a;if(r===A(t,e,i,s)>0)for(n=e;n=e;n-=s)a=S(n,t[n],t[n+1],a);return a&&v(a,a.next)&&(C(a),a=a.next),a}function s(t,e){if(!t)return t;e||(e=t);var i,s=t;do{if(i=!1,s.steiner||!v(s,s.next)&&0!==m(s.prev,s,s.next))s=s.next;else{if(C(s),(s=e=s.prev)===s.next)break;i=!0}}while(i||s!==e);return e}function r(t,e,i,l,u,d,f){if(t){!f&&d&&function(t,e,i,s){var r=t;do{0===r.z&&(r.z=c(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){var e,i,s,r,n,a,o,h,l=1;do{for(i=t,t=null,n=null,a=0;i;){for(a++,s=i,o=0,e=0;e0||h>0&&s;)0!==o&&(0===h||!s||i.z<=s.z)?(r=i,i=i.nextZ,o--):(r=s,s=s.nextZ,h--),n?n.nextZ=r:t=r,r.prevZ=n,n=r;i=s}n.nextZ=null,l*=2}while(a>1)}(r)}(t,l,u,d);for(var p,g,m=t;t.prev!==t.next;)if(p=t.prev,g=t.next,d?a(t,l,u,d):n(t))e.push(p.i/i|0),e.push(t.i/i|0),e.push(g.i/i|0),C(t),t=g.next,m=g.next;else if((t=g)===m){f?1===f?r(t=o(s(t),e,i),e,i,l,u,d,2):2===f&&h(t,e,i,l,u,d):r(s(t),e,i,l,u,d,1);break}}}function n(t){var e=t.prev,i=t,s=t.next;if(m(e,i,s)>=0)return!1;for(var r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,u=rn?r>a?r:a:n>a?n:a,f=o>h?o>l?o:l:h>l?h:l,g=s.next;g!==e;){if(g.x>=u&&g.x<=c&&g.y>=d&&g.y<=f&&p(r,o,n,h,a,l,g.x,g.y)&&m(g.prev,g,g.next)>=0)return!1;g=g.next}return!0}function a(t,e,i,s){var r=t.prev,n=t,a=t.next;if(m(r,n,a)>=0)return!1;for(var o=r.x,h=n.x,l=a.x,u=r.y,d=n.y,f=a.y,g=oh?o>l?o:l:h>l?h:l,x=u>d?u>f?u:f:d>f?d:f,T=c(g,v,e,i,s),w=c(y,x,e,i,s),b=t.prevZ,S=t.nextZ;b&&b.z>=T&&S&&S.z<=w;){if(b.x>=g&&b.x<=y&&b.y>=v&&b.y<=x&&b!==r&&b!==a&&p(o,u,h,d,l,f,b.x,b.y)&&m(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,S.x>=g&&S.x<=y&&S.y>=v&&S.y<=x&&S!==r&&S!==a&&p(o,u,h,d,l,f,S.x,S.y)&&m(S.prev,S,S.next)>=0)return!1;S=S.nextZ}for(;b&&b.z>=T;){if(b.x>=g&&b.x<=y&&b.y>=v&&b.y<=x&&b!==r&&b!==a&&p(o,u,h,d,l,f,b.x,b.y)&&m(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;S&&S.z<=w;){if(S.x>=g&&S.x<=y&&S.y>=v&&S.y<=x&&S!==r&&S!==a&&p(o,u,h,d,l,f,S.x,S.y)&&m(S.prev,S,S.next)>=0)return!1;S=S.nextZ}return!0}function o(t,e,i){var r=t;do{var n=r.prev,a=r.next.next;!v(n,a)&&y(n,r,r.next,a)&&w(n,a)&&w(a,n)&&(e.push(n.i/i|0),e.push(r.i/i|0),e.push(a.i/i|0),C(r),C(r.next),r=t=a),r=r.next}while(r!==t);return s(r)}function h(t,e,i,n,a,o){var h=t;do{for(var l=h.next.next;l!==h.prev;){if(h.i!==l.i&&g(h,l)){var u=b(h,l);return h=s(h,h.next),u=s(u,u.next),r(h,e,i,n,a,o,0),void r(u,e,i,n,a,o,0)}l=l.next}h=h.next}while(h!==t)}function l(t,e){return t.x-e.x}function u(t,e){var i=function(t,e){var i,s=e,r=t.x,n=t.y,a=-1/0;do{if(n<=s.y&&n>=s.next.y&&s.next.y!==s.y){var o=s.x+(n-s.y)*(s.next.x-s.x)/(s.next.y-s.y);if(o<=r&&o>a&&(a=o,i=s.x=s.x&&s.x>=u&&r!==s.x&&p(ni.x||s.x===i.x&&d(i,s)))&&(i=s,f=h)),s=s.next}while(s!==l);return i}(t,e);if(!i)return e;var r=b(i,t);return s(r,r.next),s(i,i.next)}function d(t,e){return m(t.prev,t,e.prev)<0&&m(e.next,t,t.next)<0}function c(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function f(t){var e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function g(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&y(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(w(t,e)&&w(e,t)&&function(t,e){var i=t,s=!1,r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(m(t.prev,t,e.prev)||m(t,e.prev,e))||v(t,e)&&m(t.prev,t,t.next)>0&&m(e.prev,e,e.next)>0)}function m(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function v(t,e){return t.x===e.x&&t.y===e.y}function y(t,e,i,s){var r=T(m(t,e,i)),n=T(m(t,e,s)),a=T(m(i,s,t)),o=T(m(i,s,e));return r!==n&&a!==o||(!(0!==r||!x(t,i,e))||(!(0!==n||!x(t,s,e))||(!(0!==a||!x(i,t,s))||!(0!==o||!x(i,e,s)))))}function x(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function T(t){return t>0?1:t<0?-1:0}function w(t,e){return m(t.prev,t,t.next)<0?m(t,e,t.next)>=0&&m(t,t.prev,e)>=0:m(t,e,t.prev)<0||m(t,t.next,e)<0}function b(t,e){var i=new E(t.i,t.x,t.y),s=new E(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function S(t,e,i,s){var r=new E(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function C(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function E(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(t,e,i,s){for(var r=0,n=e,a=i-s;n0&&(s+=t[r-1].length,i.holes.push(s))}return i},t.exports=e},13829(t,e,i){var s=i(87841);t.exports=function(t,e){void 0===e&&(e=new s);for(var i,r=1/0,n=1/0,a=-r,o=-n,h=0;h0&&(e=h/i);for(var l=0;ld+m)){var v=g.getPoint((u-d)/m);a.push(v);break}d+=m}return a}},30052(t,e,i){var s=i(35001),r=i(23031);t.exports=function(t){for(var e=t.points,i=0,n=0;n1?(s=i.x,r=i.y):o>0&&(s+=n*o,r+=a*o)}return(n=t.x-s)*n+(a=t.y-r)*a}function s(t,e,r,n,a){for(var o,h=n,l=e+1;lh&&(o=l,h=u)}h>n&&(o-e>1&&s(t,e,o,n,a),a.push(t[o]),r-o>1&&s(t,o,r,n,a))}function r(t,e){var i=t.length-1,r=[t[0]];return s(t,0,i,e,r),r.push(t[i]),r}t.exports=function(t,i,s){void 0===i&&(i=1),void 0===s&&(s=!1);var n=t.points;if(n.length>2){var a=i*i;s||(n=function(t,i){for(var s,r=t[0],n=[r],a=1,o=t.length;ai&&(n.push(s),r=s);return r!==s&&n.push(s),n}(n,a)),t.setTo(r(n,a))}return t}},5469(t){var e=function(t,e){return t[0]=e[0],t[1]=e[1],t};t.exports=function(t){var i,s=[],r=t.points;for(i=0;i0&&n.push(e([0,0],s[0])),i=0;i1&&n.push(e([0,0],s[s.length-1])),t.setTo(n)}},24709(t){t.exports=function(t,e,i){for(var s=t.points,r=0;r=e&&t.y<=i&&t.y+t.height>=i)}},96553(t,e,i){var s=i(37303);t.exports=function(t,e){return s(t,e.x,e.y)}},70273(t){t.exports=function(t,e){return!(e.width*e.height>t.width*t.height)&&(e.x>t.x&&e.xt.x&&e.rightt.y&&e.yt.y&&e.bottoms(e)?t.setSize(e.height*i,e.height):t.setSize(e.width,e.width/i),t.setPosition(e.centerX-t.width/2,e.centerY-t.height/2)}},80774(t){t.exports=function(t){return t.x=Math.floor(t.x),t.y=Math.floor(t.y),t}},83859(t){t.exports=function(t){return t.x=Math.floor(t.x),t.y=Math.floor(t.y),t.width=Math.floor(t.width),t.height=Math.floor(t.height),t}},19217(t,e,i){var s=i(87841),r=i(36383);t.exports=function(t,e){if(void 0===e&&(e=new s),0===t.length)return e;for(var i,n,a,o=Number.MAX_VALUE,h=Number.MAX_VALUE,l=r.MIN_SAFE_INTEGER,u=r.MIN_SAFE_INTEGER,d=0;d=1)return i.x=t.x,i.y=t.y,i;var n=s(t)*e;return e>.5?(n-=t.width+t.height)<=t.width?(i.x=t.right-n,i.y=t.bottom):(i.x=t.x,i.y=t.bottom-(n-t.width)):n<=t.width?(i.x=t.x+n,i.y=t.y):(i.x=t.right,i.y=t.y+(n-t.width)),i}},34819(t,e,i){var s=i(20812),r=i(13019);t.exports=function(t,e,i,n){void 0===n&&(n=[]),!e&&i>0&&(e=r(t)/i);for(var a=0;a=t.right&&(h=1,o+=a-t.right,a=t.right);break;case 1:(o+=e)>=t.bottom&&(h=2,a-=o-t.bottom,o=t.bottom);break;case 2:(a-=e)<=t.left&&(h=3,o-=t.left-a,a=t.left);break;case 3:(o-=e)<=t.top&&(h=0,o=t.top)}return n}},33595(t){t.exports=function(t,e){for(var i=t.x,s=t.right,r=t.y,n=t.bottom,a=0;ae.x&&t.ye.y}},13019(t){t.exports=function(t){return 2*(t.width+t.height)}},85133(t,e,i){var s=i(26099),r=i(39506);t.exports=function(t,e,i){void 0===i&&(i=new s),e=r(e);var n=Math.sin(e),a=Math.cos(e),o=a>0?t.width/2:t.width/-2,h=n>0?t.height/2:t.height/-2;return Math.abs(o*n)=this.right?this.width=0:this.width=this.right-t,this.x=t}},right:{get:function(){return this.x+this.width},set:function(t){t<=this.x?this.width=0:this.width=t-this.x}},top:{get:function(){return this.y},set:function(t){t>=this.bottom?this.height=0:this.height=this.bottom-t,this.y=t}},bottom:{get:function(){return this.y+this.height},set:function(t){t<=this.y?this.height=0:this.height=t-this.y}},centerX:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}});t.exports=u},94845(t){t.exports=function(t,e){return t.width===e.width&&t.height===e.height}},31730(t){t.exports=function(t,e,i){return void 0===i&&(i=e),t.width*=e,t.height*=i,t}},36899(t,e,i){var s=i(87841);t.exports=function(t,e,i){void 0===i&&(i=new s);var r=Math.min(t.x,e.x),n=Math.min(t.y,e.y),a=Math.max(t.right,e.right)-r,o=Math.max(t.bottom,e.bottom)-n;return i.setTo(r,n,a,o)}},93232(t,e,i){var s=i(87841);s.Area=i(39843),s.Ceil=i(98615),s.CeilAll=i(31688),s.CenterOn=i(67502),s.Clone=i(65085),s.Contains=i(37303),s.ContainsPoint=i(96553),s.ContainsRect=i(70273),s.CopyFrom=i(43459),s.Decompose=i(77493),s.Equals=i(9219),s.FitInside=i(53751),s.FitOutside=i(16088),s.Floor=i(80774),s.FloorAll=i(83859),s.FromPoints=i(19217),s.FromXY=i(9477),s.GetAspectRatio=i(8249),s.GetCenter=i(27165),s.GetPoint=i(20812),s.GetPoints=i(34819),s.GetSize=i(51313),s.Inflate=i(86091),s.Intersection=i(53951),s.MarchingAnts=i(14649),s.MergePoints=i(33595),s.MergeRect=i(20074),s.MergeXY=i(92171),s.Offset=i(42981),s.OffsetPoint=i(46907),s.Overlaps=i(60170),s.Perimeter=i(13019),s.PerimeterPoint=i(85133),s.Random=i(26597),s.RandomOutside=i(86470),s.SameDimensions=i(94845),s.Scale=i(31730),s.Union=i(36899),t.exports=s},41658(t){t.exports=function(t){var e=t.x1,i=t.y1,s=t.x2,r=t.y2,n=t.x3,a=t.y3;return Math.abs(((n-e)*(r-i)-(s-e)*(a-i))/2)}},39208(t,e,i){var s=i(16483);t.exports=function(t,e,i){var r=i*(Math.sqrt(3)/2);return new s(t,e,t+i/2,e+r,t-i/2,e+r)}},39545(t,e,i){var s=i(94811),r=i(16483);t.exports=function(t,e,i,n,a){void 0===e&&(e=null),void 0===i&&(i=1),void 0===n&&(n=1),void 0===a&&(a=[]);for(var o,h,l,u,d,c,f,p,g,m=s(t,e),v=0;v=0&&v>=0&&m+v<1}},48653(t){t.exports=function(t,e,i,s){void 0===i&&(i=!1),void 0===s&&(s=[]);for(var r,n,a,o,h,l,u=t.x3-t.x1,d=t.y3-t.y1,c=t.x2-t.x1,f=t.y2-t.y1,p=u*u+d*d,g=u*c+d*f,m=c*c+f*f,v=p*m-g*g,y=0===v?0:1/v,x=t.x1,T=t.y1,w=0;w=0&&n>=0&&r+n<1&&(s.push({x:e[w].x,y:e[w].y}),i)));w++);return s}},96006(t,e,i){var s=i(10690);t.exports=function(t,e){return s(t,e.x,e.y)}},71326(t){t.exports=function(t,e){return e.setTo(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)}},71694(t){t.exports=function(t,e){return void 0===e&&(e=[]),e.push({x:t.x1,y:t.y1}),e.push({x:t.x2,y:t.y2}),e.push({x:t.x3,y:t.y3}),e}},33522(t){t.exports=function(t,e){return t.x1===e.x1&&t.y1===e.y1&&t.x2===e.x2&&t.y2===e.y2&&t.x3===e.x3&&t.y3===e.y3}},20437(t,e,i){var s=i(26099),r=i(35001);t.exports=function(t,e,i){void 0===i&&(i=new s);var n=t.getLineA(),a=t.getLineB(),o=t.getLineC();if(e<=0||e>=1)return i.x=n.x1,i.y=n.y1,i;var h=r(n),l=r(a),u=r(o),d=(h+l+u)*e,c=0;return dh+l?(c=(d-=h+l)/u,i.x=o.x1+(o.x2-o.x1)*c,i.y=o.y1+(o.y2-o.y1)*c):(c=(d-=h)/l,i.x=a.x1+(a.x2-a.x1)*c,i.y=a.y1+(a.y2-a.y1)*c),i}},80672(t,e,i){var s=i(35001),r=i(26099);t.exports=function(t,e,i,n){void 0===n&&(n=[]);var a=t.getLineA(),o=t.getLineB(),h=t.getLineC(),l=s(a),u=s(o),d=s(h),c=l+u+d;!e&&i>0&&(e=c/i);for(var f=0;fl+u?(g=(p-=l+u)/d,m.x=h.x1+(h.x2-h.x1)*g,m.y=h.y1+(h.y2-h.y1)*g):(g=(p-=l)/u,m.x=o.x1+(o.x2-o.x1)*g,m.y=o.y1+(o.y2-o.y1)*g),n.push(m)}return n}},39757(t,e,i){var s=i(26099);function r(t,e,i,s){var r=t-i,n=e-s,a=r*r+n*n;return Math.sqrt(a)}t.exports=function(t,e){void 0===e&&(e=new s);var i=t.x1,n=t.y1,a=t.x2,o=t.y2,h=t.x3,l=t.y3,u=r(h,l,a,o),d=r(i,n,h,l),c=r(a,o,i,n),f=u+d+c;return e.x=(i*u+a*d+h*c)/f,e.y=(n*u+o*d+l*c)/f,e}},13584(t){t.exports=function(t,e,i){return t.x1+=e,t.y1+=i,t.x2+=e,t.y2+=i,t.x3+=e,t.y3+=i,t}},1376(t,e,i){var s=i(35001);t.exports=function(t){var e=t.getLineA(),i=t.getLineB(),r=t.getLineC();return s(e)+s(i)+s(r)}},90260(t,e,i){var s=i(26099);t.exports=function(t,e){void 0===e&&(e=new s);var i=t.x2-t.x1,r=t.y2-t.y1,n=t.x3-t.x1,a=t.y3-t.y1,o=Math.random(),h=Math.random();return o+h>=1&&(o=1-o,h=1-h),e.x=t.x1+(i*o+n*h),e.y=t.y1+(r*o+a*h),e}},52172(t,e,i){var s=i(99614),r=i(39757);t.exports=function(t,e){var i=r(t);return s(t,i.x,i.y,e)}},49907(t,e,i){var s=i(99614);t.exports=function(t,e,i){return s(t,e.x,e.y,i)}},99614(t){t.exports=function(t,e,i,s){var r=Math.cos(s),n=Math.sin(s),a=t.x1-e,o=t.y1-i;return t.x1=a*r-o*n+e,t.y1=a*n+o*r+i,a=t.x2-e,o=t.y2-i,t.x2=a*r-o*n+e,t.y2=a*n+o*r+i,a=t.x3-e,o=t.y3-i,t.x3=a*r-o*n+e,t.y3=a*n+o*r+i,t}},16483(t,e,i){var s=i(83419),r=i(10690),n=i(20437),a=i(80672),o=i(23777),h=i(23031),l=i(90260),u=new s({initialize:function(t,e,i,s,r,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===r&&(r=0),void 0===n&&(n=0),this.type=o.TRIANGLE,this.x1=t,this.y1=e,this.x2=i,this.y2=s,this.x3=r,this.y3=n},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return n(this,t,e)},getPoints:function(t,e,i){return a(this,t,e,i)},getRandomPoint:function(t){return l(this,t)},setTo:function(t,e,i,s,r,n){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===s&&(s=0),void 0===r&&(r=0),void 0===n&&(n=0),this.x1=t,this.y1=e,this.x2=i,this.y2=s,this.x3=r,this.y3=n,this},getLineA:function(t){return void 0===t&&(t=new h),t.setTo(this.x1,this.y1,this.x2,this.y2),t},getLineB:function(t){return void 0===t&&(t=new h),t.setTo(this.x2,this.y2,this.x3,this.y3),t},getLineC:function(t){return void 0===t&&(t=new h),t.setTo(this.x3,this.y3,this.x1,this.y1),t},left:{get:function(){return Math.min(this.x1,this.x2,this.x3)},set:function(t){var e=0;e=this.x1<=this.x2&&this.x1<=this.x3?this.x1-t:this.x2<=this.x1&&this.x2<=this.x3?this.x2-t:this.x3-t,this.x1-=e,this.x2-=e,this.x3-=e}},right:{get:function(){return Math.max(this.x1,this.x2,this.x3)},set:function(t){var e=0;e=this.x1>=this.x2&&this.x1>=this.x3?this.x1-t:this.x2>=this.x1&&this.x2>=this.x3?this.x2-t:this.x3-t,this.x1-=e,this.x2-=e,this.x3-=e}},top:{get:function(){return Math.min(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1<=this.y2&&this.y1<=this.y3?this.y1-t:this.y2<=this.y1&&this.y2<=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}},bottom:{get:function(){return Math.max(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1>=this.y2&&this.y1>=this.y3?this.y1-t:this.y2>=this.y1&&this.y2>=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}}});t.exports=u},84435(t,e,i){var s=i(16483);s.Area=i(41658),s.BuildEquilateral=i(39208),s.BuildFromPolygon=i(39545),s.BuildRight=i(90301),s.CenterOn=i(23707),s.Centroid=i(97523),s.CircumCenter=i(24951),s.CircumCircle=i(85614),s.Clone=i(74422),s.Contains=i(10690),s.ContainsArray=i(48653),s.ContainsPoint=i(96006),s.CopyFrom=i(71326),s.Decompose=i(71694),s.Equals=i(33522),s.GetPoint=i(20437),s.GetPoints=i(80672),s.InCenter=i(39757),s.Perimeter=i(1376),s.Offset=i(13584),s.Random=i(90260),s.Rotate=i(52172),s.RotateAroundPoint=i(49907),s.RotateAroundXY=i(99614),t.exports=s},74457(t){t.exports=function(t,e,i){return{gameObject:t,enabled:!0,draggable:!1,dropZone:!1,cursor:!1,target:null,camera:null,hitArea:e,hitAreaCallback:i,hitAreaDebug:null,customHitArea:!1,localX:0,localY:0,dragState:0,dragStartX:0,dragStartY:0,dragStartXGlobal:0,dragStartYGlobal:0,dragStartCamera:null,dragX:0,dragY:0}}},84409(t){t.exports=function(t,e){return function(i,s,r,n){var a=t.getPixelAlpha(s,r,n.texture.key,n.frame.name);return a&&a>=e}}},7003(t,e,i){var s=i(83419),r=i(93301),n=i(50792),a=i(8214),o=i(8443),h=i(78970),l=i(85098),u=i(42515),d=i(36210),c=i(61340),f=i(85955),p=new s({initialize:function(t,e){this.game=t,this.scaleManager,this.canvas,this.config=e,this.enabled=!0,this.events=new n,this.isOver=!0,this.defaultCursor="",this.keyboard=e.inputKeyboard?new h(this):null,this.mouse=e.inputMouse?new l(this):null,this.touch=e.inputTouch?new d(this):null,this.pointers=[],this.pointersTotal=e.inputActivePointers;for(var i=0;i<=this.pointersTotal;i++){var s=new u(this,i);s.smoothFactor=e.inputSmoothFactor,this.pointers.push(s)}this.mousePointer=e.inputMouse?this.pointers[0]:null,this.activePointer=this.pointers[0],this.globalTopOnly=!0,this.time=0,this._tempPoint={x:0,y:0},this._tempHitTest=[],this._tempMatrix=new c,this._tempMatrix2=new c,this._tempSkip=!1,this.mousePointerContainer=[this.mousePointer],t.events.once(o.BOOT,this.boot,this)},boot:function(){var t=this.game,e=t.events;this.canvas=t.canvas,this.scaleManager=t.scale,this.events.emit(a.MANAGER_BOOT),e.on(o.PRE_RENDER,this.preRender,this),e.once(o.DESTROY,this.destroy,this)},setCanvasOver:function(t){this.isOver=!0,this.events.emit(a.GAME_OVER,t)},setCanvasOut:function(t){this.isOver=!1,this.events.emit(a.GAME_OUT,t)},preRender:function(){var t=this.game.loop.now,e=this.game.loop.delta,i=this.game.scene.getScenes(!0,!0);this.time=t,this.events.emit(a.MANAGER_UPDATE);for(var s=0;s10&&(t=10-this.pointersTotal);for(var i=0;i-1&&(r.splice(o,1),this.clear(a,!0))}this._pendingRemoval.length=0,this._list=r.concat(e.splice(0))}},isActive:function(){return this.manager&&this.manager.enabled&&this.enabled&&this.scene.sys.canInput()},setCursor:function(t){this.manager&&this.manager.setCursor(t)},resetCursor:function(){this.manager&&this.manager.resetCursor(null,!0)},updatePoll:function(t,e){if(!this.isActive())return!1;if(this.pluginEvents.emit(c.UPDATE,t,e),this._updatedThisFrame)return this._updatedThisFrame=!1,!1;var i,s=this.manager.pointers;for(i=0;i0){if(this._pollTimer-=e,!(this._pollTimer<0))return!1;this._pollTimer=this.pollRate}var n=!1;for(i=0;i0&&(n=!0)}return n},update:function(t,e){if(!this.isActive())return!1;for(var i=!1,s=0;s0&&(i=!0)}return this._updatedThisFrame=!0,i},clear:function(t,e){void 0===e&&(e=!1),this.disable(t);var i=t.input;i&&(this.removeDebug(t),this.manager.resetCursor(i),i.gameObject=void 0,i.target=void 0,i.hitArea=void 0,i.hitAreaCallback=void 0,i.callbackContext=void 0,t.input=null),e||this.queueForRemoval(t);var s=this._draggable.indexOf(t);return s>-1&&this._draggable.splice(s,1),t},disable:function(t,e){void 0===e&&(e=!1);var i=t.input;i&&(i.enabled=!1,i.dragState=0);for(var s,r=this._drag,n=this._over,a=this.manager,o=0;o-1&&r[o].splice(s,1),(s=n[o].indexOf(t))>-1&&n[o].splice(s,1);return e&&this.resetCursor(),this},enable:function(t,e,i,s){return void 0===s&&(s=!1),t.input?t.input.enabled=!0:this.setHitArea(t,e,i),t.input&&s&&!t.input.dropZone&&(t.input.dropZone=s),this},hitTestPointer:function(t){for(var e=this.cameras.getCamerasBelowPointer(t),i=0;i0)return t.camera=s,r}return t.camera=e[0],[]},processDownEvents:function(t){var e=0,i=this._temp,s=this._eventData,r=this._eventContainer;s.cancelled=!1;for(var n=0;n0&&l(t.x,t.y,t.downX,t.downY)>=r||s>0&&e>=t.downTime+s)&&(i=!0),i)return this.setDragState(t,3),this.processDragStartList(t)},processDragStartList:function(t){if(3!==this.getDragState(t))return 0;var e=this._drag[t.id];e.length>1&&(e=e.slice(0));for(var i=0;i1&&(this.sortGameObjects(i,t),this.topOnly&&i.splice(1)),this._drag[t.id]=i,0===this.dragDistanceThreshold&&0===this.dragTimeThreshold?(this.setDragState(t,3),this.processDragStartList(t)):(this.setDragState(t,2),0))},processDragMoveEvent:function(t){if(2===this.getDragState(t)&&this.processDragThresholdEvent(t,this.manager.game.loop.now),4!==this.getDragState(t))return 0;var e=this._tempZones,i=this._drag[t.id];i.length>1&&(i=i.slice(0));for(var s=0;s0?(a.emit(c.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(c.DRAG_LEAVE,t,a,h),o.target=e[0],h=o.target,a.emit(c.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(c.DRAG_ENTER,t,a,h)):(a.emit(c.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(c.DRAG_LEAVE,t,a,h),e[0]?(o.target=e[0],h=o.target,a.emit(c.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(c.DRAG_ENTER,t,a,h)):o.target=null)}else!h&&e[0]&&(o.target=e[0],h=o.target,a.emit(c.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(c.DRAG_ENTER,t,a,h));var u=t.positionToCamera(o.dragStartCamera);if(a.parentContainer){var d=u.x-o.dragStartXGlobal,f=u.y-o.dragStartYGlobal,p=a.getParentRotation(),g=d*Math.cos(p)+f*Math.sin(p),m=f*Math.cos(p)-d*Math.sin(p);g*=1/a.parentContainer.scaleX,m*=1/a.parentContainer.scaleY,r=g+o.dragStartX,n=m+o.dragStartY}else r=u.x-o.dragX,n=u.y-o.dragY;a.emit(c.GAMEOBJECT_DRAG,t,r,n),this.emit(c.DRAG,t,a,r,n)}return i.length},processDragUpEvent:function(t){var e=this._drag[t.id];e.length>1&&(e=e.slice(0));for(var i=0;i0){var n=this.manager,a=this._eventData,o=this._eventContainer;a.cancelled=!1;for(var h=0;h0){var r=this.manager,n=this._eventData,a=this._eventContainer;n.cancelled=!1,this.sortGameObjects(e,t);for(var o=0;o0){for(this.sortGameObjects(r,t),e=0;e0){for(this.sortGameObjects(n,t),e=0;e-1&&this._draggable.splice(r,1)}return this},makePixelPerfect:function(t){void 0===t&&(t=1);var e=this.systems.textures;return h(e,t)},setHitArea:function(t,e,i){if(void 0===e)return this.setHitAreaFromTexture(t);Array.isArray(t)||(t=[t]);var s=!1,r=!1,n=!1,a=!1,h=!1,l=!0;if(v(e)&&Object.keys(e).length){var u=e;e=p(u,"hitArea",null),i=p(u,"hitAreaCallback",null),h=p(u,"pixelPerfect",!1);var d=p(u,"alphaTolerance",1);h&&(e={},i=this.makePixelPerfect(d)),s=p(u,"draggable",!1),r=p(u,"dropZone",!1),n=p(u,"cursor",!1),a=p(u,"useHandCursor",!1),e&&i||(this.setHitAreaFromTexture(t),l=!1)}else"function"!=typeof e||i||(i=e,e={});for(var c=0;c=this.threshold?this.pressed||(this.pressed=!0,this.events.emit(r.BUTTON_DOWN,e,this,t),this.pad.emit(r.GAMEPAD_BUTTON_DOWN,i,t,this)):this.pressed&&(this.pressed=!1,this.events.emit(r.BUTTON_UP,e,this,t),this.pad.emit(r.GAMEPAD_BUTTON_UP,i,t,this))},destroy:function(){this.pad=null,this.events=null}});t.exports=n},99125(t,e,i){var s=i(97421),r=i(28884),n=i(83419),a=i(50792),o=i(26099),h=new n({Extends:a,initialize:function(t,e){a.call(this),this.manager=t,this.pad=e,this.id=e.id,this.index=e.index;for(var i=[],n=0;n=.5));this.buttons=i;var h=[];for(n=0;n=2&&(this.leftStick.set(n[0].getValue(),n[1].getValue()),r>=4&&this.rightStick.set(n[2].getValue(),n[3].getValue()))}},destroy:function(){var t;for(this.removeAllListeners(),this.manager=null,this.pad=null,t=0;t-1&&e.preventDefault()}},this.onKeyUp=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.events.emit(a.MANAGER_PROCESS);var i=e.altKey||e.ctrlKey||e.shiftKey||e.metaKey;t.preventDefault&&!i&&t.captures.indexOf(e.keyCode)>-1&&e.preventDefault()}};var e=this.target;e&&(e.addEventListener("keydown",this.onKeyDown,!1),e.addEventListener("keyup",this.onKeyUp,!1),this.enabled=!0)},stopListeners:function(){var t=this.target;t.removeEventListener("keydown",this.onKeyDown,!1),t.removeEventListener("keyup",this.onKeyUp,!1),this.enabled=!1},postUpdate:function(){this.queue=[]},addCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i0},removeCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i0},clearCaptures:function(){this.captures=[],this.preventDefault=!1},destroy:function(){this.stopListeners(),this.clearCaptures(),this.queue=[],this.manager.game.events.off(n.POST_STEP,this.postUpdate,this),this.target=null,this.enabled=!1,this.manager=null}});t.exports=l},28846(t,e,i){var s=i(83419),r=i(50792),n=i(95922),a=i(8443),o=i(35154),h=i(8214),l=i(89639),u=i(30472),d=i(46032),c=i(87960),f=i(74600),p=i(44594),g=i(56583),m=new s({Extends:r,initialize:function(t){r.call(this),this.game=t.systems.game,this.scene=t.scene,this.settings=this.scene.sys.settings,this.sceneInputPlugin=t,this.manager=t.manager.keyboard,this.enabled=!0,this.keys=[],this.combos=[],this.prevCode=null,this.prevTime=0,this.prevType=null,t.pluginEvents.once(h.BOOT,this.boot,this),t.pluginEvents.on(h.START,this.start,this)},boot:function(){var t=this.settings.input;this.enabled=o(t,"keyboard",!0);var e=o(t,"keyboard.capture",null);e&&this.addCaptures(e),this.sceneInputPlugin.pluginEvents.once(h.DESTROY,this.destroy,this)},start:function(){this.sceneInputPlugin.manager.events.on(h.MANAGER_PROCESS,this.update,this),this.sceneInputPlugin.pluginEvents.once(h.SHUTDOWN,this.shutdown,this),this.game.events.on(a.BLUR,this.resetKeys,this),this.scene.sys.events.on(p.PAUSE,this.resetKeys,this),this.scene.sys.events.on(p.SLEEP,this.resetKeys,this)},isActive:function(){return this.enabled&&this.scene.sys.canInput()},addCapture:function(t){return this.manager.addCapture(t),this},removeCapture:function(t){return this.manager.removeCapture(t),this},getCaptures:function(){return this.manager.captures},enableGlobalCapture:function(){return this.manager.preventDefault=!0,this},disableGlobalCapture:function(){return this.manager.preventDefault=!1,this},clearCaptures:function(){return this.manager.clearCaptures(),this},createCursorKeys:function(){return this.addKeys({up:d.UP,down:d.DOWN,left:d.LEFT,right:d.RIGHT,space:d.SPACE,shift:d.SHIFT})},addKeys:function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=!1);var s={};if("string"==typeof t){t=t.split(",");for(var r=0;r-1?s[r]=t:s[t.keyCode]=t,e&&this.addCapture(t.keyCode),t.setEmitOnRepeat(i),t}return"string"==typeof t&&(t=d[t.toUpperCase()]),s[t]||(s[t]=new u(this,t),e&&this.addCapture(t),s[t].setEmitOnRepeat(i)),s[t]},removeKey:function(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var s,r=this.keys;if(t instanceof u){var n=r.indexOf(t);n>-1&&(s=this.keys[n],this.keys[n]=void 0)}else"string"==typeof t&&(t=d[t.toUpperCase()]);return r[t]&&(s=r[t],r[t]=void 0),s&&(s.plugin=null,i&&this.removeCapture(s.keyCode),e&&s.destroy()),this},removeAllKeys:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!1);for(var i=this.keys,s=0;st._tick)return t._tick=i,!0}return!1},update:function(){var t=this.manager.queue,e=t.length;if(this.isActive()&&0!==e)for(var i=this.keys,s=0;s0&&e.maxKeyDelay>0){var n=e.timeLastMatched+e.maxKeyDelay;t.timeStamp<=n&&(r=!0,i=s(t,e))}else r=!0,i=s(t,e);return!r&&e.resetOnWrongKey&&(e.index=0,e.current=e.keyCodes[0]),i&&(e.timeLastMatched=t.timeStamp,e.matched=!0,e.timeMatched=t.timeStamp),i}},92803(t){t.exports=function(t){return t.current=t.keyCodes[0],t.index=0,t.timeLastMatched=0,t.matched=!1,t.timeMatched=0,t}},92612(t){t.exports="keydown"},23345(t){t.exports="keyup"},21957(t){t.exports="keycombomatch"},44743(t){t.exports="down"},3771(t){t.exports="keydown-"},46358(t){t.exports="keyup-"},75674(t){t.exports="up"},95922(t,e,i){t.exports={ANY_KEY_DOWN:i(92612),ANY_KEY_UP:i(23345),COMBO_MATCH:i(21957),DOWN:i(44743),KEY_DOWN:i(3771),KEY_UP:i(46358),UP:i(75674)}},51442(t,e,i){t.exports={Events:i(95922),KeyboardManager:i(78970),KeyboardPlugin:i(28846),Key:i(30472),KeyCodes:i(46032),KeyCombo:i(87960),AdvanceKeyCombo:i(66970),ProcessKeyCombo:i(68769),ResetKeyCombo:i(92803),JustDown:i(90229),JustUp:i(38796),DownDuration:i(37015),UpDuration:i(41170)}},37015(t){t.exports=function(t,e){void 0===e&&(e=50);var i=t.plugin.game.loop.time-t.timeDown;return t.isDown&&i=400&&t.status<=599&&(s=!1),this.state=r.FILE_LOADED,this.resetXHR(),this.loader.nextFile(this,s)},onBase64Load:function(t){this.xhrLoader=t,this.state=r.FILE_LOADED,this.percentComplete=1,this.loader.emit(n.FILE_PROGRESS,this,this.percentComplete),this.loader.nextFile(this,!0)},onError:function(){this.resetXHR(),this.retryAttempts>0?(this.retryAttempts--,this.load()):this.loader.nextFile(this,!1)},onProgress:function(t){t.lengthComputable&&(this.bytesLoaded=t.loaded,this.bytesTotal=t.total,this.percentComplete=Math.min(this.bytesLoaded/this.bytesTotal,1),this.loader.emit(n.FILE_PROGRESS,this,this.percentComplete))},onProcess:function(){this.state=r.FILE_PROCESSING,this.onProcessComplete()},onProcessComplete:function(){this.state=r.FILE_COMPLETE,this.multiFile&&this.multiFile.onFileComplete(this),this.loader.fileProcessComplete(this)},onProcessError:function(){console.error('Failed to process file: %s "%s"',this.type,this.key),this.state=r.FILE_ERRORED,this.multiFile&&this.multiFile.onFileFailed(this),this.loader.fileProcessComplete(this)},hasCacheConflict:function(){return this.cache&&this.cache.exists(this.key)},addToCache:function(){this.cache&&this.data&&this.cache.add(this.key,this.data)},pendingDestroy:function(t){if(this.state!==r.FILE_PENDING_DESTROY){void 0===t&&(t=this.data);var e=this.key,i=this.type;this.loader.emit(n.FILE_COMPLETE,e,i,t),this.loader.emit(n.FILE_KEY_COMPLETE+i+"-"+e,e,i,t),this.loader.flagForRemoval(this),this.state=r.FILE_PENDING_DESTROY}},destroy:function(){this.loader=null,this.cache=null,this.xhrSettings=null,this.multiFile=null,this.linkFile=null,this.data=null}});d.createObjectURL=function(t,e,i){if("function"==typeof URL)t.src=URL.createObjectURL(e);else{var s=new FileReader;s.onload=function(){t.removeAttribute("crossOrigin"),t.src="data:"+(e.type||i)+";base64,"+s.result.split(",")[1]},s.onerror=t.onerror,s.readAsDataURL(e)}},d.revokeObjectURL=function(t){"function"==typeof URL&&URL.revokeObjectURL(t.src)},t.exports=d},74099(t){var e={},i={install:function(t){for(var i in e)t[i]=e[i]},register:function(t,i){e[t]=i},destroy:function(){e={}}};t.exports=i},98356(t){t.exports=function(t,e){return!!t.url&&(t.url.match(/^(?:blob:|data:|capacitor:\/\/|file:\/\/|http:\/\/|https:\/\/|\/\/)/)?t.url:e+t.url)}},74261(t,e,i){var s=i(83419),r=i(23906),n=i(50792),a=i(54899),o=i(74099),h=i(95540),l=i(35154),u=i(41212),d=i(37277),c=i(44594),f=i(92638),p=new s({Extends:n,initialize:function(t){n.call(this);var e=t.sys.game.config,i=t.sys.settings.loader;this.scene=t,this.systems=t.sys,this.cacheManager=t.sys.cache,this.textureManager=t.sys.textures,this.sceneManager=t.sys.game.scene,o.install(this),this.prefix="",this.path="",this.baseURL="",this.setBaseURL(h(i,"baseURL",e.loaderBaseURL)),this.setPath(h(i,"path",e.loaderPath)),this.setPrefix(h(i,"prefix",e.loaderPrefix)),this.maxParallelDownloads=h(i,"maxParallelDownloads",e.loaderMaxParallelDownloads),this.xhr=f(h(i,"responseType",e.loaderResponseType),h(i,"async",e.loaderAsync),h(i,"user",e.loaderUser),h(i,"password",e.loaderPassword),h(i,"timeout",e.loaderTimeout),h(i,"withCredentials",e.loaderWithCredentials)),this.crossOrigin=h(i,"crossOrigin",e.loaderCrossOrigin),this.imageLoadType=h(i,"imageLoadType",e.loaderImageLoadType),this.localSchemes=h(i,"localScheme",e.loaderLocalScheme),this.totalToLoad=0,this.progress=0,this.list=new Set,this.inflight=new Set,this.queue=new Set,this._deleteQueue=new Set,this.totalFailed=0,this.totalComplete=0,this.state=r.LOADER_IDLE,this.multiKeyIndex=0,this.maxRetries=h(i,"maxRetries",e.loaderMaxRetries),t.sys.events.once(c.BOOT,this.boot,this),t.sys.events.on(c.START,this.pluginStart,this)},boot:function(){this.systems.events.once(c.DESTROY,this.destroy,this)},pluginStart:function(){this.systems.events.once(c.SHUTDOWN,this.shutdown,this)},setBaseURL:function(t){return void 0===t&&(t=""),""!==t&&"/"!==t.substr(-1)&&(t=t.concat("/")),this.baseURL=t,this},setPath:function(t){return void 0===t&&(t=""),""!==t&&"/"!==t.substr(-1)&&(t=t.concat("/")),this.path=t,this},setPrefix:function(t){return void 0===t&&(t=""),this.prefix=t,this},setCORS:function(t){return this.crossOrigin=t,this},addFile:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e0},removePack:function(t,e){var i,s=this.systems.anims,r=this.cacheManager,n=this.textureManager,a={animation:"json",aseprite:"json",audio:"audio",audioSprite:"audio",binary:"binary",bitmapFont:"bitmapFont",css:null,glsl:"shader",html:"html",json:"json",obj:"obj",plugin:null,scenePlugin:null,script:null,spine:"json",text:"text",tilemapCSV:"tilemap",tilemapImpact:"tilemap",tilemapTiledJSON:"tilemap",video:"video",xml:"xml"};if(u(t))i=t;else if(!(i=r.json.get(t)))return void console.warn("Asset Pack not found in JSON cache:",t);for(var o in e&&(i={_:i[e]}),i){var l=i[o],d=h(l,"prefix",""),c=h(l,"files"),f=h(l,"defaultType");if(Array.isArray(c))for(var p=0;p0&&this.inflight.size'),i.push(''),i.push(''),i.push(this.xhrLoader.responseText),i.push(""),i.push(""),i.push("");var s=[i.join("\n")],a=this;try{var o=new window.Blob(s,{type:"image/svg+xml;charset=utf-8"})}catch(t){return a.state=r.FILE_ERRORED,void a.onProcessComplete()}this.data=new Image,this.data.crossOrigin=this.crossOrigin,this.data.onload=function(){n.revokeObjectURL(a.data),a.onProcessComplete()},this.data.onerror=function(){n.revokeObjectURL(a.data),a.onProcessError()},n.createObjectURL(this.data,o,"image/svg+xml")},addToCache:function(){this.cache.addImage(this.key,this.data)}});a.register("htmlTexture",function(t,e,i,s,r){if(Array.isArray(t))for(var n=0;n=r.FILE_COMPLETE&&("spritesheet"===t.type?t.addToCache():"normalMap"===this.type?this.cache.addImage(this.key,t.data,this.data):this.cache.addImage(this.key,this.data,t.data)):this.cache.addImage(this.key,this.data)}});a.register("image",function(t,e,i){if(Array.isArray(t))for(var s=0;s=0?a.substring(o+i.length):a]=n.data}for(var h=[],l=0;l=r.FILE_COMPLETE&&("normalMap"===this.type?this.cache.addSpriteSheet(this.key,t.data,this.config,this.data):this.cache.addSpriteSheet(this.key,this.data,this.config,t.data)):this.cache.addSpriteSheet(this.key,this.data,this.config)}});n.register("spritesheet",function(t,e,i,s){if(Array.isArray(t))for(var r=0;ri&&(i=h.x),h.xn&&(n=h.y),h.y>>0)+2891336453,r=277803737*(s>>>(s>>>28)+4^s),n=(r>>>22^r)>>>0;return n/=f};t.exports=function(t,e){switch("number"==typeof t&&(t=[t]),e){case 2:return p(t,!0);case 1:return p(t);default:return c(t)}}},84854(t,e,i){var s=i(72958),r=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],n=Array(4),a=Array(4),o=Array(4),h=Array(4),l=Array(4),u=Array(4),d=function(t,e,i){var s,r,h,l,u=e.noiseMode||0,d=void 0===e.noiseSmoothing?1:e.noiseSmoothing,p=Math.max(1,Math.min(t.length,4)),g=e.noiseCells||[32,32,32,32].slice(0,p);for(s=0;s1&&(o[1]=Math.floor(l/3)%3-1,p>2&&(o[2]=Math.floor(l/9)%3-1,p>3&&(o[3]=Math.floor(l/27)%3-1))),r=c(p,n,o,e,i),h=f(p,o,a,r),u){case 0:h0||e[1]>0)for(j[0]=U.x,j[1]=z.x,j[2]=Y.x,q[0]=U.y,q[1]=z.y,q[2]=Y.y,e[0]>0&&(j[0]=(U.x%e[0]+e[0])%e[0],j[1]=(z.x%e[0]+e[0])%e[0],j[2]=(Y.x%e[0]+e[0])%e[0]),e[1]>0&&(q[0]=(U.y%e[1]+e[1])%e[1],q[1]=(z.y%e[1]+e[1])%e[1],q[2]=(Y.y%e[1]+e[1])%e[1]),s=0;s<3;s++)V[s]=Math.floor(j[s]+.5*q[s]+.5),H[s]=Math.floor(q[s]+.5);else V[0]=n.x,V[1]=B.x,V[2]=k.x,H[0]=n.y,H[1]=B.y,H[2]=k.y;for(V[0]+=a[0],V[1]+=a[0],V[2]+=a[0],H[0]+=a[1],H[1]+=a[1],H[2]+=a[1],s=0;s<3;s++)K[s]=V[s]%289,K[s]<0&&(K[s]+=289);for(s=0;s<3;s++)K[s]=((51*K[s]+2)*K[s]+H[s])%289;for(s=0;s<3;s++)K[s]=(34*K[s]+10)*K[s]%289;for(s=0;s<3;s++)Z[s]=.07482*K[s]+i,Q[s]=Math.cos(Z[s]),J[s]=Math.sin(Z[s]);for($.x=Q[0],$.y=J[0],tt.x=Q[1],tt.y=J[1],et.x=Q[2],et.y=J[2],it[0]=.8-I(X,X),it[1]=.8-I(W,W),it[2]=.8-I(G,G),s=0;s<3;s++)it[s]=Math.max(it[s],0),st[s]=it[s]*it[s],rt[s]=st[s]*st[s];return nt[0]=I($,X),nt[1]=I(tt,W),nt[2]=I(et,G),10.9*(rt[0]*nt[0]+rt[1]*nt[1]+rt[2]*nt[2])},B=[0,0,0],k=[0,0,0],U=[0,0,0],z=[0,0,0],Y=[0,0,0],X=[0,0,0],W=[0,0,0],G=[0,0,0],V=[0,0,0],H=[0,0,0],j=[0,0,0],q=[0,0,0],K=[0,0,0],Z=[0,0,0],Q=[0,0,0],J=[0,0,0],$=[0,0,0],tt=[0,0,0],et=[0,0,0],it=[0,0,0],st=[0,0,0,0],rt=[0,0,0,0],nt=[0,0,0,0],at=[0,0,0,0],ot=[0,0,0,0],ht=[0,0,0,0],lt=[0,0,0,0],ut=[0,0,0,0],dt=[0,0,0,0],ct=[0,0,0,0],ft=[0,0,0,0],pt=[0,0,0,0],gt=[0,0,0,0],mt=[0,0,0,0],vt=[0,0,0,0],yt=[0,0,0,0],xt=[0,0,0,0],Tt=[0,0,0,0],wt=[0,0,0,0],bt=[0,0,0,0],St=[0,0,0,0],Ct=[0,0,0,0],Et=[0,0,0,0],At=[0,0,0,0],_t=[0,0,0,0],Mt=[0,0,0,0],Rt=[0,0,0,0],Pt=[0,0,0,0],Ot=function(t,e){for(var i=0;i<4;i++){var s=t[i]%289;s<0&&(s+=289),e[i]=(34*s+10)*s%289}},Lt=function(t,e,i){var s=B,r=k,n=U,o=z,h=Y,l=X,u=W,d=G,c=V,f=H,p=j,g=q,m=K,v=Z,y=Q,x=J,T=$,w=tt,b=et,S=it,C=st,E=rt,A=nt,_=at,M=ot,R=ht,P=lt,O=ut,L=dt,D=ct,F=ft,I=pt,N=gt,Lt=mt,Dt=vt,Ft=yt,It=xt,Nt=Tt,Bt=wt,kt=bt,Ut=St,zt=Ct,Yt=Et,Xt=At,Wt=_t,Gt=Mt,Vt=Rt,Ht=Pt;s[0]=0*t[0]+1*t[1]+1*t[2],s[1]=1*t[0]+0*t[1]+1*t[2],s[2]=1*t[0]+1*t[1]+0*t[2];for(var jt=0;jt<3;jt++)r[jt]=Math.floor(s[jt]),n[jt]=s[jt]-r[jt];for(o[0]=n[0]>n[1]?0:1,o[1]=n[1]>n[2]?0:1,o[2]=n[0]>n[2]?0:1,h[0]=1-o[0],h[1]=1-o[1],h[2]=1-o[2],l[0]=h[2],l[1]=o[0],l[2]=o[1],u[0]=h[0],u[1]=h[1],u[2]=o[2],jt=0;jt<3;jt++)d[jt]=Math.min(l[jt],u[jt]),c[jt]=Math.max(l[jt],u[jt]);for(jt=0;jt<3;jt++)f[jt]=r[jt]+d[jt],p[jt]=r[jt]+c[jt],g[jt]=r[jt]+1;var qt=r[0],Kt=r[1],Zt=r[2],Qt=f[0],Jt=f[1],$t=f[2],te=p[0],ee=p[1],ie=p[2],se=g[0],re=g[1],ne=g[2];for(m[0]=-.5*qt+.5*Kt+.5*Zt,m[1]=.5*qt-.5*Kt+.5*Zt,m[2]=.5*qt+.5*Kt-.5*Zt,v[0]=-.5*Qt+.5*Jt+.5*$t,v[1]=.5*Qt-.5*Jt+.5*$t,v[2]=.5*Qt+.5*Jt-.5*$t,y[0]=-.5*te+.5*ee+.5*ie,y[1]=.5*te-.5*ee+.5*ie,y[2]=.5*te+.5*ee-.5*ie,x[0]=-.5*se+.5*re+.5*ne,x[1]=.5*se-.5*re+.5*ne,x[2]=.5*se+.5*re-.5*ne,jt=0;jt<3;jt++)T[jt]=t[jt]-m[jt],w[jt]=t[jt]-v[jt],b[jt]=t[jt]-y[jt],S[jt]=t[jt]-x[jt];if(e[0]>0||e[1]>0||e[2]>0){if(C[0]=m[0],C[1]=v[0],C[2]=y[0],C[3]=x[0],E[0]=m[1],E[1]=v[1],E[2]=y[1],E[3]=x[1],A[0]=m[2],A[1]=v[2],A[2]=y[2],A[3]=x[2],e[0]>0)for(jt=0;jt<4;jt++)C[jt]=(C[jt]%e[0]+e[0])%e[0];if(e[1]>0)for(jt=0;jt<4;jt++)E[jt]=(E[jt]%e[1]+e[1])%e[1];if(e[2]>0)for(jt=0;jt<4;jt++)A[jt]=(A[jt]%e[2]+e[2])%e[2];var ae=C[0],oe=E[0],he=A[0],le=C[1],ue=E[1],de=A[1],ce=C[2],fe=E[2],pe=A[2],ge=C[3],me=E[3],ve=A[3];r[0]=Math.floor(0*ae+1*oe+1*he+.5),r[1]=Math.floor(1*ae+0*oe+1*he+.5),r[2]=Math.floor(1*ae+1*oe+0*he+.5),f[0]=Math.floor(0*le+1*ue+1*de+.5),f[1]=Math.floor(1*le+0*ue+1*de+.5),f[2]=Math.floor(1*le+1*ue+0*de+.5),p[0]=Math.floor(0*ce+1*fe+1*pe+.5),p[1]=Math.floor(1*ce+0*fe+1*pe+.5),p[2]=Math.floor(1*ce+1*fe+0*pe+.5),g[0]=Math.floor(0*ge+1*me+1*ve+.5),g[1]=Math.floor(1*ge+0*me+1*ve+.5),g[2]=Math.floor(1*ge+1*me+0*ve+.5)}r[0]+=a[0],r[1]+=a[1],r[2]+=a[2],f[0]+=a[0],f[1]+=a[1],f[2]+=a[2],p[0]+=a[0],p[1]+=a[1],p[2]+=a[2],g[0]+=a[0],g[1]+=a[1],g[2]+=a[2];var ye=st,xe=rt;for(ye[0]=r[2],ye[1]=f[2],ye[2]=p[2],ye[3]=g[2],Ot(ye,xe),xe[0]+=r[1],xe[1]+=f[1],xe[2]+=p[1],xe[3]+=g[1],Ot(xe,ye),ye[0]+=r[0],ye[1]+=f[0],ye[2]+=p[0],ye[3]+=g[0],Ot(ye,_),jt=0;jt<4;jt++)M[jt]=3.883222077*_[jt],R[jt]=.996539792-.006920415*_[jt],P[jt]=.108705628*_[jt],O[jt]=Math.cos(M[jt]),L[jt]=Math.sin(M[jt]),D[jt]=Math.sqrt(Math.max(0,1-R[jt]*R[jt]));if(0!==i)for(jt=0;jt<4;jt++)Lt[jt]=O[jt]*D[jt],Dt[jt]=L[jt]*D[jt],Ft[jt]=R[jt],It[jt]=Math.sin(P[jt]),Nt[jt]=Math.cos(P[jt]),Bt[jt]=L[jt]*It[jt]-O[jt]*Nt[jt],kt[jt]=(1-R[jt])*(Bt[jt]*L[jt])+R[jt]*It[jt],Ut[jt]=(1-R[jt])*(-Bt[jt]*O[jt])+R[jt]*Nt[jt],zt[jt]=-(Dt[jt]*Nt[jt]+Lt[jt]*It[jt]),Yt[jt]=Math.sin(i),Xt[jt]=Math.cos(i),F[jt]=Xt[jt]*Lt[jt]+Yt[jt]*kt[jt],I[jt]=Xt[jt]*Dt[jt]+Yt[jt]*Ut[jt],N[jt]=Xt[jt]*Ft[jt]+Yt[jt]*zt[jt];else for(jt=0;jt<4;jt++)F[jt]=O[jt]*D[jt],I[jt]=L[jt]*D[jt],N[jt]=R[jt];for(jt=0;jt<4;jt++){var Te=0===jt?T[0]:1===jt?w[0]:2===jt?b[0]:S[0],we=0===jt?T[1]:1===jt?w[1]:2===jt?b[1]:S[1],be=0===jt?T[2]:1===jt?w[2]:2===jt?b[2]:S[2],Se=Te*Te+we*we+be*be;Wt[jt]=.5-Se,Wt[jt]<0&&(Wt[jt]=0),Gt[jt]=Wt[jt]*Wt[jt],Vt[jt]=Gt[jt]*Wt[jt]}for(jt=0;jt<4;jt++){var Ce=F[jt],Ee=I[jt],Ae=N[jt],_e=0===jt?T[0]:1===jt?w[0]:2===jt?b[0]:S[0],Me=0===jt?T[1]:1===jt?w[1]:2===jt?b[1]:S[1],Re=0===jt?T[2]:1===jt?w[2]:2===jt?b[2]:S[2];Ht[jt]=Ce*_e+Ee*Me+Ae*Re}var Pe=0;for(jt=0;jt<4;jt++)Pe+=Vt[jt]*Ht[jt];return 39.5*Pe};t.exports=function(t,s){"number"==typeof t&&(t=[t]),s||(s={});for(var h=Math.min(3,t.length);h<2;)t.push(0),h++;var l=s.noiseIterations||1,u=s.noiseWarpIterations||1,d=s.noiseDetailPower||2,c=s.noiseFlowPower||2,f=s.noiseContributionPower||2,p=s.noiseWarpDetailPower||2,g=s.noiseWarpFlowPower||2,m=s.noiseWarpContributionPower||2,v=s.noiseCells||[32,32,32],y=s.noiseOffset||[0,0,0],x=s.noiseWarpAmount||0;if(s.noiseSeed)for(var T=[1,2,3],w=0;w0&&u>0&&h>=2)if(2===h){var b=o(u,2,e,s,p,g,m);i[0]=e[0]+r[0],i[1]=e[1]+r[1];var S=o(u,2,i,s,p,g,m);e[0]+=b*x,e[1]+=S*x}else if(3===h){var C=o(u,3,e,s,p,g,m);i[0]=e[0]+r[0],i[1]=e[1]+r[1],i[2]=e[2]+r[2];var E=o(u,3,i,s,p,g,m);i[0]=e[0]+n[0],i[1]=e[1]+n[1],i[2]=e[2]+n[2];var A=o(u,3,i,s,p,g,m);e[0]+=C*x,e[1]+=E*x,e[2]+=A*x}return o(l,h,e,s,d,c,f)}},78702(t){t.exports=function(t){return t==parseFloat(t)?!(t%2):void 0}},94883(t){t.exports=function(t){return t===parseFloat(t)?!(t%2):void 0}},28915(t){t.exports=function(t,e,i){return(e-t)*i+t}},94908(t){t.exports=function(t,e,i){return void 0===i&&(i=0),t.clone().lerp(e,i)}},94434(t,e,i){var s=new(i(83419))({initialize:function(t){this.val=new Float32Array(9),t?this.copy(t):this.identity()},clone:function(){return new s(this)},set:function(t){return this.copy(t)},copy:function(t){var e=this.val,i=t.val;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this},fromMat4:function(t){var e=t.val,i=this.val;return i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[4],i[4]=e[5],i[5]=e[6],i[6]=e[8],i[7]=e[9],i[8]=e[10],this},fromArray:function(t){var e=this.val;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],this},identity:function(){var t=this.val;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,this},transpose:function(){var t=this.val,e=t[1],i=t[2],s=t[5];return t[1]=t[3],t[2]=t[6],t[3]=e,t[5]=t[7],t[6]=i,t[7]=s,this},invert:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],u=l*n-a*h,d=-l*r+a*o,c=h*r-n*o,f=e*u+i*d+s*c;return f?(f=1/f,t[0]=u*f,t[1]=(-l*i+s*h)*f,t[2]=(a*i-s*n)*f,t[3]=d*f,t[4]=(l*e-s*o)*f,t[5]=(-a*e+s*r)*f,t[6]=c*f,t[7]=(-h*e+i*o)*f,t[8]=(n*e-i*r)*f,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return t[0]=n*l-a*h,t[1]=s*h-i*l,t[2]=i*a-s*n,t[3]=a*o-r*l,t[4]=e*l-s*o,t[5]=s*r-e*a,t[6]=r*h-n*o,t[7]=i*o-e*h,t[8]=e*n-i*r,this},determinant:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*(l*n-a*h)+i*(-l*r+a*o)+s*(h*r-n*o)},multiply:function(t){var e=this.val,i=e[0],s=e[1],r=e[2],n=e[3],a=e[4],o=e[5],h=e[6],l=e[7],u=e[8],d=t.val,c=d[0],f=d[1],p=d[2],g=d[3],m=d[4],v=d[5],y=d[6],x=d[7],T=d[8];return e[0]=c*i+f*n+p*h,e[1]=c*s+f*a+p*l,e[2]=c*r+f*o+p*u,e[3]=g*i+m*n+v*h,e[4]=g*s+m*a+v*l,e[5]=g*r+m*o+v*u,e[6]=y*i+x*n+T*h,e[7]=y*s+x*a+T*l,e[8]=y*r+x*o+T*u,this},translate:function(t){var e=this.val,i=t.x,s=t.y;return e[6]=i*e[0]+s*e[3]+e[6],e[7]=i*e[1]+s*e[4]+e[7],e[8]=i*e[2]+s*e[5]+e[8],this},rotate:function(t){var e=this.val,i=e[0],s=e[1],r=e[2],n=e[3],a=e[4],o=e[5],h=Math.sin(t),l=Math.cos(t);return e[0]=l*i+h*n,e[1]=l*s+h*a,e[2]=l*r+h*o,e[3]=l*n-h*i,e[4]=l*a-h*s,e[5]=l*o-h*r,this},scale:function(t){var e=this.val,i=t.x,s=t.y;return e[0]=i*e[0],e[1]=i*e[1],e[2]=i*e[2],e[3]=s*e[3],e[4]=s*e[4],e[5]=s*e[5],this},fromQuat:function(t){var e=t.x,i=t.y,s=t.z,r=t.w,n=e+e,a=i+i,o=s+s,h=e*n,l=e*a,u=e*o,d=i*a,c=i*o,f=s*o,p=r*n,g=r*a,m=r*o,v=this.val;return v[0]=1-(d+f),v[3]=l+m,v[6]=u-g,v[1]=l-m,v[4]=1-(h+f),v[7]=c+p,v[2]=u+g,v[5]=c-p,v[8]=1-(h+d),this},normalFromMat4:function(t){var e=t.val,i=this.val,s=e[0],r=e[1],n=e[2],a=e[3],o=e[4],h=e[5],l=e[6],u=e[7],d=e[8],c=e[9],f=e[10],p=e[11],g=e[12],m=e[13],v=e[14],y=e[15],x=s*h-r*o,T=s*l-n*o,w=s*u-a*o,b=r*l-n*h,S=r*u-a*h,C=n*u-a*l,E=d*m-c*g,A=d*v-f*g,_=d*y-p*g,M=c*v-f*m,R=c*y-p*m,P=f*y-p*v,O=x*P-T*R+w*M+b*_-S*A+C*E;return O?(O=1/O,i[0]=(h*P-l*R+u*M)*O,i[1]=(l*_-o*P-u*A)*O,i[2]=(o*R-h*_+u*E)*O,i[3]=(n*R-r*P-a*M)*O,i[4]=(s*P-n*_+a*A)*O,i[5]=(r*_-s*R-a*E)*O,i[6]=(m*C-v*S+y*b)*O,i[7]=(v*w-g*C-y*T)*O,i[8]=(g*S-m*w+y*x)*O,this):null}});t.exports=s},37867(t,e,i){var s=i(83419),r=i(25836),n=1e-6,a=new s({initialize:function(t){this.val=new Float32Array(16),t?this.copy(t):this.identity()},clone:function(){return new a(this)},set:function(t){return this.copy(t)},setValues:function(t,e,i,s,r,n,a,o,h,l,u,d,c,f,p,g){var m=this.val;return m[0]=t,m[1]=e,m[2]=i,m[3]=s,m[4]=r,m[5]=n,m[6]=a,m[7]=o,m[8]=h,m[9]=l,m[10]=u,m[11]=d,m[12]=c,m[13]=f,m[14]=p,m[15]=g,this},copy:function(t){var e=t.val;return this.setValues(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])},fromArray:function(t){return this.setValues(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])},zero:function(){return this.setValues(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)},transform:function(t,e,i){var s=o.fromQuat(i).val,r=e.x,n=e.y,a=e.z;return this.setValues(s[0]*r,s[1]*r,s[2]*r,0,s[4]*n,s[5]*n,s[6]*n,0,s[8]*a,s[9]*a,s[10]*a,0,t.x,t.y,t.z,1)},xyz:function(t,e,i){this.identity();var s=this.val;return s[12]=t,s[13]=e,s[14]=i,this},scaling:function(t,e,i){this.zero();var s=this.val;return s[0]=t,s[5]=e,s[10]=i,s[15]=1,this},identity:function(){return this.setValues(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)},transpose:function(){var t=this.val,e=t[1],i=t[2],s=t[3],r=t[6],n=t[7],a=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=e,t[6]=t[9],t[7]=t[13],t[8]=i,t[9]=r,t[11]=t[14],t[12]=s,t[13]=n,t[14]=a,this},getInverse:function(t){return this.copy(t),this.invert()},invert:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],u=t[9],d=t[10],c=t[11],f=t[12],p=t[13],g=t[14],m=t[15],v=e*a-i*n,y=e*o-s*n,x=e*h-r*n,T=i*o-s*a,w=i*h-r*a,b=s*h-r*o,S=l*p-u*f,C=l*g-d*f,E=l*m-c*f,A=u*g-d*p,_=u*m-c*p,M=d*m-c*g,R=v*M-y*_+x*A+T*E-w*C+b*S;return R?(R=1/R,this.setValues((a*M-o*_+h*A)*R,(s*_-i*M-r*A)*R,(p*b-g*w+m*T)*R,(d*w-u*b-c*T)*R,(o*E-n*M-h*C)*R,(e*M-s*E+r*C)*R,(g*x-f*b-m*y)*R,(l*b-d*x+c*y)*R,(n*_-a*E+h*S)*R,(i*E-e*_-r*S)*R,(f*w-p*x+m*v)*R,(u*x-l*w-c*v)*R,(a*C-n*A-o*S)*R,(e*A-i*C+s*S)*R,(p*y-f*T-g*v)*R,(l*T-u*y+d*v)*R)):this},adjoint:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],u=t[9],d=t[10],c=t[11],f=t[12],p=t[13],g=t[14],m=t[15];return this.setValues(a*(d*m-c*g)-u*(o*m-h*g)+p*(o*c-h*d),-(i*(d*m-c*g)-u*(s*m-r*g)+p*(s*c-r*d)),i*(o*m-h*g)-a*(s*m-r*g)+p*(s*h-r*o),-(i*(o*c-h*d)-a*(s*c-r*d)+u*(s*h-r*o)),-(n*(d*m-c*g)-l*(o*m-h*g)+f*(o*c-h*d)),e*(d*m-c*g)-l*(s*m-r*g)+f*(s*c-r*d),-(e*(o*m-h*g)-n*(s*m-r*g)+f*(s*h-r*o)),e*(o*c-h*d)-n*(s*c-r*d)+l*(s*h-r*o),n*(u*m-c*p)-l*(a*m-h*p)+f*(a*c-h*u),-(e*(u*m-c*p)-l*(i*m-r*p)+f*(i*c-r*u)),e*(a*m-h*p)-n*(i*m-r*p)+f*(i*h-r*a),-(e*(a*c-h*u)-n*(i*c-r*u)+l*(i*h-r*a)),-(n*(u*g-d*p)-l*(a*g-o*p)+f*(a*d-o*u)),e*(u*g-d*p)-l*(i*g-s*p)+f*(i*d-s*u),-(e*(a*g-o*p)-n*(i*g-s*p)+f*(i*o-s*a)),e*(a*d-o*u)-n*(i*d-s*u)+l*(i*o-s*a))},determinant:function(){var t=this.val,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],u=t[9],d=t[10],c=t[11],f=t[12],p=t[13],g=t[14],m=t[15];return(e*a-i*n)*(d*m-c*g)-(e*o-s*n)*(u*m-c*p)+(e*h-r*n)*(u*g-d*p)+(i*o-s*a)*(l*m-c*f)-(i*h-r*a)*(l*g-d*f)+(s*h-r*o)*(l*p-u*f)},multiply:function(t){var e=this.val,i=e[0],s=e[1],r=e[2],n=e[3],a=e[4],o=e[5],h=e[6],l=e[7],u=e[8],d=e[9],c=e[10],f=e[11],p=e[12],g=e[13],m=e[14],v=e[15],y=t.val,x=y[0],T=y[1],w=y[2],b=y[3];return e[0]=x*i+T*a+w*u+b*p,e[1]=x*s+T*o+w*d+b*g,e[2]=x*r+T*h+w*c+b*m,e[3]=x*n+T*l+w*f+b*v,x=y[4],T=y[5],w=y[6],b=y[7],e[4]=x*i+T*a+w*u+b*p,e[5]=x*s+T*o+w*d+b*g,e[6]=x*r+T*h+w*c+b*m,e[7]=x*n+T*l+w*f+b*v,x=y[8],T=y[9],w=y[10],b=y[11],e[8]=x*i+T*a+w*u+b*p,e[9]=x*s+T*o+w*d+b*g,e[10]=x*r+T*h+w*c+b*m,e[11]=x*n+T*l+w*f+b*v,x=y[12],T=y[13],w=y[14],b=y[15],e[12]=x*i+T*a+w*u+b*p,e[13]=x*s+T*o+w*d+b*g,e[14]=x*r+T*h+w*c+b*m,e[15]=x*n+T*l+w*f+b*v,this},multiplyLocal:function(t){var e=this.val,i=t.val;return this.setValues(e[0]*i[0]+e[1]*i[4]+e[2]*i[8]+e[3]*i[12],e[0]*i[1]+e[1]*i[5]+e[2]*i[9]+e[3]*i[13],e[0]*i[2]+e[1]*i[6]+e[2]*i[10]+e[3]*i[14],e[0]*i[3]+e[1]*i[7]+e[2]*i[11]+e[3]*i[15],e[4]*i[0]+e[5]*i[4]+e[6]*i[8]+e[7]*i[12],e[4]*i[1]+e[5]*i[5]+e[6]*i[9]+e[7]*i[13],e[4]*i[2]+e[5]*i[6]+e[6]*i[10]+e[7]*i[14],e[4]*i[3]+e[5]*i[7]+e[6]*i[11]+e[7]*i[15],e[8]*i[0]+e[9]*i[4]+e[10]*i[8]+e[11]*i[12],e[8]*i[1]+e[9]*i[5]+e[10]*i[9]+e[11]*i[13],e[8]*i[2]+e[9]*i[6]+e[10]*i[10]+e[11]*i[14],e[8]*i[3]+e[9]*i[7]+e[10]*i[11]+e[11]*i[15],e[12]*i[0]+e[13]*i[4]+e[14]*i[8]+e[15]*i[12],e[12]*i[1]+e[13]*i[5]+e[14]*i[9]+e[15]*i[13],e[12]*i[2]+e[13]*i[6]+e[14]*i[10]+e[15]*i[14],e[12]*i[3]+e[13]*i[7]+e[14]*i[11]+e[15]*i[15])},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var i=t.val,s=e.val,r=i[0],n=i[4],a=i[8],o=i[12],h=i[1],l=i[5],u=i[9],d=i[13],c=i[2],f=i[6],p=i[10],g=i[14],m=i[3],v=i[7],y=i[11],x=i[15],T=s[0],w=s[4],b=s[8],S=s[12],C=s[1],E=s[5],A=s[9],_=s[13],M=s[2],R=s[6],P=s[10],O=s[14],L=s[3],D=s[7],F=s[11],I=s[15];return this.setValues(r*T+n*C+a*M+o*L,h*T+l*C+u*M+d*L,c*T+f*C+p*M+g*L,m*T+v*C+y*M+x*L,r*w+n*E+a*R+o*D,h*w+l*E+u*R+d*D,c*w+f*E+p*R+g*D,m*w+v*E+y*R+x*D,r*b+n*A+a*P+o*F,h*b+l*A+u*P+d*F,c*b+f*A+p*P+g*F,m*b+v*A+y*P+x*F,r*S+n*_+a*O+o*I,h*S+l*_+u*O+d*I,c*S+f*_+p*O+g*I,m*S+v*_+y*O+x*I)},translate:function(t){return this.translateXYZ(t.x,t.y,t.z)},translateXYZ:function(t,e,i){var s=this.val;return s[12]=s[0]*t+s[4]*e+s[8]*i+s[12],s[13]=s[1]*t+s[5]*e+s[9]*i+s[13],s[14]=s[2]*t+s[6]*e+s[10]*i+s[14],s[15]=s[3]*t+s[7]*e+s[11]*i+s[15],this},scale:function(t){return this.scaleXYZ(t.x,t.y,t.z)},scaleXYZ:function(t,e,i){var s=this.val;return s[0]=s[0]*t,s[1]=s[1]*t,s[2]=s[2]*t,s[3]=s[3]*t,s[4]=s[4]*e,s[5]=s[5]*e,s[6]=s[6]*e,s[7]=s[7]*e,s[8]=s[8]*i,s[9]=s[9]*i,s[10]=s[10]*i,s[11]=s[11]*i,this},makeRotationAxis:function(t,e){var i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.setValues(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1)},rotate:function(t,e){var i=this.val,s=e.x,r=e.y,a=e.z,o=Math.sqrt(s*s+r*r+a*a);if(Math.abs(o)1?void 0!==s?(r=(s-t)/(s-i))<0&&(r=0):r=1:r<0&&(r=0),r}},15746(t,e,i){var s=i(83419),r=i(94434),n=i(29747),a=i(25836),o=1e-6,h=new Int8Array([1,2,0]),l=new Float32Array([0,0,0]),u=new a(1,0,0),d=new a(0,1,0),c=new a,f=new r,p=new s({initialize:function(t,e,i,s){this.onChangeCallback=n,this.set(t,e,i,s)},x:{get:function(){return this._x},set:function(t){this._x=t,this.onChangeCallback(this)}},y:{get:function(){return this._y},set:function(t){this._y=t,this.onChangeCallback(this)}},z:{get:function(){return this._z},set:function(t){this._z=t,this.onChangeCallback(this)}},w:{get:function(){return this._w},set:function(t){this._w=t,this.onChangeCallback(this)}},copy:function(t){return this.set(t)},set:function(t,e,i,s,r){return void 0===r&&(r=!0),"object"==typeof t?(this._x=t.x||0,this._y=t.y||0,this._z=t.z||0,this._w=t.w||0):(this._x=t||0,this._y=e||0,this._z=i||0,this._w=s||0),r&&this.onChangeCallback(this),this},add:function(t){return this._x+=t.x,this._y+=t.y,this._z+=t.z,this._w+=t.w,this.onChangeCallback(this),this},subtract:function(t){return this._x-=t.x,this._y-=t.y,this._z-=t.z,this._w-=t.w,this.onChangeCallback(this),this},scale:function(t){return this._x*=t,this._y*=t,this._z*=t,this._w*=t,this.onChangeCallback(this),this},length:function(){var t=this.x,e=this.y,i=this.z,s=this.w;return Math.sqrt(t*t+e*e+i*i+s*s)},lengthSq:function(){var t=this.x,e=this.y,i=this.z,s=this.w;return t*t+e*e+i*i+s*s},normalize:function(){var t=this.x,e=this.y,i=this.z,s=this.w,r=t*t+e*e+i*i+s*s;return r>0&&(r=1/Math.sqrt(r),this._x=t*r,this._y=e*r,this._z=i*r,this._w=s*r),this.onChangeCallback(this),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,s=this.y,r=this.z,n=this.w;return this.set(i+e*(t.x-i),s+e*(t.y-s),r+e*(t.z-r),n+e*(t.w-n))},rotationTo:function(t,e){var i=t.x*e.x+t.y*e.y+t.z*e.z;return i<-.999999?(c.copy(u).cross(t).length().999999?this.set(0,0,0,1):(c.copy(t).cross(e),this._x=c.x,this._y=c.y,this._z=c.z,this._w=1+i,this.normalize())},setAxes:function(t,e,i){var s=f.val;return s[0]=e.x,s[3]=e.y,s[6]=e.z,s[1]=i.x,s[4]=i.y,s[7]=i.z,s[2]=-t.x,s[5]=-t.y,s[8]=-t.z,this.fromMat3(f).normalize()},identity:function(){return this.set(0,0,0,1)},setAxisAngle:function(t,e){e*=.5;var i=Math.sin(e);return this.set(i*t.x,i*t.y,i*t.z,Math.cos(e))},multiply:function(t){var e=this.x,i=this.y,s=this.z,r=this.w,n=t.x,a=t.y,o=t.z,h=t.w;return this.set(e*h+r*n+i*o-s*a,i*h+r*a+s*n-e*o,s*h+r*o+e*a-i*n,r*h-e*n-i*a-s*o)},slerp:function(t,e){var i=this.x,s=this.y,r=this.z,n=this.w,a=t.x,h=t.y,l=t.z,u=t.w,d=i*a+s*h+r*l+n*u;d<0&&(d=-d,a=-a,h=-h,l=-l,u=-u);var c=1-e,f=e;if(1-d>o){var p=Math.acos(d),g=Math.sin(p);c=Math.sin((1-e)*p)/g,f=Math.sin(e*p)/g}return this.set(c*i+f*a,c*s+f*h,c*r+f*l,c*n+f*u)},invert:function(){var t=this.x,e=this.y,i=this.z,s=this.w,r=t*t+e*e+i*i+s*s,n=r?1/r:0;return this.set(-t*n,-e*n,-i*n,s*n)},conjugate:function(){return this._x=-this.x,this._y=-this.y,this._z=-this.z,this.onChangeCallback(this),this},rotateX:function(t){t*=.5;var e=this.x,i=this.y,s=this.z,r=this.w,n=Math.sin(t),a=Math.cos(t);return this.set(e*a+r*n,i*a+s*n,s*a-i*n,r*a-e*n)},rotateY:function(t){t*=.5;var e=this.x,i=this.y,s=this.z,r=this.w,n=Math.sin(t),a=Math.cos(t);return this.set(e*a-s*n,i*a+r*n,s*a+e*n,r*a-i*n)},rotateZ:function(t){t*=.5;var e=this.x,i=this.y,s=this.z,r=this.w,n=Math.sin(t),a=Math.cos(t);return this.set(e*a+i*n,i*a-e*n,s*a+r*n,r*a-s*n)},calculateW:function(){var t=this.x,e=this.y,i=this.z;return this.w=-Math.sqrt(1-t*t-e*e-i*i),this},setFromEuler:function(t,e){var i=t.x/2,s=t.y/2,r=t.z/2,n=Math.cos(i),a=Math.cos(s),o=Math.cos(r),h=Math.sin(i),l=Math.sin(s),u=Math.sin(r);switch(t.order){case"XYZ":this.set(h*a*o+n*l*u,n*l*o-h*a*u,n*a*u+h*l*o,n*a*o-h*l*u,e);break;case"YXZ":this.set(h*a*o+n*l*u,n*l*o-h*a*u,n*a*u-h*l*o,n*a*o+h*l*u,e);break;case"ZXY":this.set(h*a*o-n*l*u,n*l*o+h*a*u,n*a*u+h*l*o,n*a*o-h*l*u,e);break;case"ZYX":this.set(h*a*o-n*l*u,n*l*o+h*a*u,n*a*u-h*l*o,n*a*o+h*l*u,e);break;case"YZX":this.set(h*a*o+n*l*u,n*l*o+h*a*u,n*a*u-h*l*o,n*a*o-h*l*u,e);break;case"XZY":this.set(h*a*o-n*l*u,n*l*o-h*a*u,n*a*u+h*l*o,n*a*o+h*l*u,e)}return this},setFromRotationMatrix:function(t){var e,i=t.val,s=i[0],r=i[4],n=i[8],a=i[1],o=i[5],h=i[9],l=i[2],u=i[6],d=i[10],c=s+o+d;return c>0?(e=.5/Math.sqrt(c+1),this.set((u-h)*e,(n-l)*e,(a-r)*e,.25/e)):s>o&&s>d?(e=2*Math.sqrt(1+s-o-d),this.set(.25*e,(r+a)/e,(n+l)/e,(u-h)/e)):o>d?(e=2*Math.sqrt(1+o-s-d),this.set((r+a)/e,.25*e,(h+u)/e,(n-l)/e)):(e=2*Math.sqrt(1+d-s-o),this.set((n+l)/e,(h+u)/e,.25*e,(a-r)/e)),this},fromMat3:function(t){var e,i=t.val,s=i[0]+i[4]+i[8];if(s>0)e=Math.sqrt(s+1),this.w=.5*e,e=.5/e,this._x=(i[7]-i[5])*e,this._y=(i[2]-i[6])*e,this._z=(i[3]-i[1])*e;else{var r=0;i[4]>i[0]&&(r=1),i[8]>i[3*r+r]&&(r=2);var n=h[r],a=h[n];e=Math.sqrt(i[3*r+r]-i[3*n+n]-i[3*a+a]+1),l[r]=.5*e,e=.5/e,l[n]=(i[3*n+r]+i[3*r+n])*e,l[a]=(i[3*a+r]+i[3*r+a])*e,this._x=l[0],this._y=l[1],this._z=l[2],this._w=(i[3*a+n]-i[3*n+a])*e}return this.onChangeCallback(this),this}});t.exports=p},43396(t,e,i){var s=i(36383);t.exports=function(t){return t*s.RAD_TO_DEG}},74362(t){t.exports=function(t,e){void 0===e&&(e=1);var i=2*Math.random()*Math.PI;return t.x=Math.cos(i)*e,t.y=Math.sin(i)*e,t}},60706(t){t.exports=function(t,e){void 0===e&&(e=1);var i=2*Math.random()*Math.PI,s=2*Math.random()-1,r=Math.sqrt(1-s*s)*e;return t.x=Math.cos(i)*r,t.y=Math.sin(i)*r,t.z=s*e,t}},67421(t){t.exports=function(t,e){return void 0===e&&(e=1),t.x=(2*Math.random()-1)*e,t.y=(2*Math.random()-1)*e,t.z=(2*Math.random()-1)*e,t.w=(2*Math.random()-1)*e,t}},36305(t){t.exports=function(t,e){var i=t.x,s=t.y;return t.x=i*Math.cos(e)-s*Math.sin(e),t.y=i*Math.sin(e)+s*Math.cos(e),t}},11520(t){t.exports=function(t,e,i,s){var r=Math.cos(s),n=Math.sin(s),a=t.x-e,o=t.y-i;return t.x=a*r-o*n+e,t.y=a*n+o*r+i,t}},1163(t){t.exports=function(t,e,i,s,r){var n=s+Math.atan2(t.y-i,t.x-e);return t.x=e+r*Math.cos(n),t.y=i+r*Math.sin(n),t}},70336(t){t.exports=function(t,e,i,s,r){return t.x=e+r*Math.cos(s),t.y=i+r*Math.sin(s),t}},72678(t,e,i){var s=i(25836),r=i(37867),n=i(15746),a=new r,o=new n,h=new s;t.exports=function(t,e,i){return o.setAxisAngle(e,i),a.fromRotationTranslation(o,h.set(0,0,0)),t.transformMat4(a)}},2284(t){t.exports=function(t){return t>0?Math.ceil(t):Math.floor(t)}},41013(t){t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=10);var s=Math.pow(i,-e);return Math.round(t*s)/s}},7602(t){t.exports=function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}},54261(t){t.exports=function(t,e,i){return(t=Math.max(0,Math.min(1,(t-e)/(i-e))))*t*t*(t*(6*t-15)+10)}},44408(t,e,i){var s=i(26099);t.exports=function(t,e,i,r){void 0===r&&(r=new s);var n=0,a=0;return t>0&&t<=e*i&&(n=t>e-1?t-(a=Math.floor(t/e))*e:t),r.set(n,a)}},85955(t,e,i){var s=i(26099);t.exports=function(t,e,i,r,n,a,o,h){void 0===h&&(h=new s);var l=Math.sin(n),u=Math.cos(n),d=u*a,c=l*a,f=-l*o,p=u*o,g=1/(d*p+f*-c);return h.x=p*g*t+-f*g*e+(r*f-i*p)*g,h.y=d*g*e+-c*g*t+(-r*d+i*c)*g,h}},26099(t,e,i){var s=i(83419),r=i(43855),n=new s({initialize:function(t,e){this.x=0,this.y=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0):(void 0===e&&(e=t),this.x=t||0,this.y=e||0)},clone:function(){return new n(this.x,this.y)},copy:function(t){return this.x=t.x||0,this.y=t.y||0,this},setFromObject:function(t){return this.x=t.x||0,this.y=t.y||0,this},set:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setTo:function(t,e){return this.set(t,e)},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},invert:function(){return this.set(this.y,this.x)},setToPolar:function(t,e){return null==e&&(e=1),this.x=Math.cos(t)*e,this.y=Math.sin(t)*e,this},equals:function(t){return this.x===t.x&&this.y===t.y},fuzzyEquals:function(t,e){return r(this.x,t.x,e)&&r(this.y,t.y,e)},angle:function(){var t=Math.atan2(this.y,this.x);return t<0&&(t+=2*Math.PI),t},setAngle:function(t){return this.setToPolar(t,this.length())},add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this},scale:function(t){return isFinite(t)?(this.x*=t,this.y*=t):(this.x=0,this.y=0),this},divide:function(t){return this.x/=t.x,this.y/=t.y,this},negate:function(){return this.x=-this.x,this.y=-this.y,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y;return e*e+i*i},length:function(){var t=this.x,e=this.y;return Math.sqrt(t*t+e*e)},setLength:function(t){return this.normalize().scale(t)},lengthSq:function(){var t=this.x,e=this.y;return t*t+e*e},normalize:function(){var t=this.x,e=this.y,i=t*t+e*e;return i>0&&(i=1/Math.sqrt(i),this.x=t*i,this.y=e*i),this},normalizeRightHand:function(){var t=this.x;return this.x=-1*this.y,this.y=t,this},normalizeLeftHand:function(){var t=this.x;return this.x=this.y,this.y=-1*t,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,s=this.y;return this.x=i+e*(t.x-i),this.y=s+e*(t.y-s),this},transformMat3:function(t){var e=this.x,i=this.y,s=t.val;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this},transformMat4:function(t){var e=this.x,i=this.y,s=t.val;return this.x=s[0]*e+s[4]*i+s[12],this.y=s[1]*e+s[5]*i+s[13],this},reset:function(){return this.x=0,this.y=0,this},limit:function(t){var e=this.length();return e&&e>t&&this.scale(t/e),this},reflect:function(t){return t=t.clone().normalize(),this.subtract(t.scale(2*this.dot(t)))},mirror:function(t){return this.reflect(t).negate()},rotate:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e*this.x-i*this.y,i*this.x+e*this.y)},project:function(t){var e=this.dot(t)/t.dot(t);return this.copy(t).scale(e)},projectUnit:function(t,e){void 0===e&&(e=new n);var i=this.x*t.x+this.y*t.y;return 0!==i&&(e.x=i*t.x,e.y=i*t.y),e}});n.ZERO=new n,n.RIGHT=new n(1,0),n.LEFT=new n(-1,0),n.UP=new n(0,-1),n.DOWN=new n(0,1),n.ONE=new n(1,1),t.exports=n},25836(t,e,i){var s=new(i(83419))({initialize:function(t,e,i){this.x=0,this.y=0,this.z=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0):(this.x=t||0,this.y=e||0,this.z=i||0)},up:function(){return this.x=0,this.y=1,this.z=0,this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},clone:function(){return new s(this.x,this.y,this.z)},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},crossVectors:function(t,e){var i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this},equals:function(t){return this.x===t.x&&this.y===t.y&&this.z===t.z},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z||0,this},set:function(t,e,i){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0):(this.x=t||0,this.y=e||0,this.z=i||0),this},setFromMatrixPosition:function(t){return this.fromArray(t.val,12)},setFromMatrixColumn:function(t,e){return this.fromArray(t.val,4*e)},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z||0,this},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this},addScale:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e||0,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z||0,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z||1,this},scale:function(t){return isFinite(t)?(this.x*=t,this.y*=t,this.z*=t):(this.x=0,this.y=0,this.z=0),this},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z||1,this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y,s=t.z-this.z||0;return Math.sqrt(e*e+i*i+s*s)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y,s=t.z-this.z||0;return e*e+i*i+s*s},length:function(){var t=this.x,e=this.y,i=this.z;return Math.sqrt(t*t+e*e+i*i)},lengthSq:function(){var t=this.x,e=this.y,i=this.z;return t*t+e*e+i*i},normalize:function(){var t=this.x,e=this.y,i=this.z,s=t*t+e*e+i*i;return s>0&&(s=1/Math.sqrt(s),this.x=t*s,this.y=e*s,this.z=i*s),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},cross:function(t){var e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z;return this.x=i*a-s*n,this.y=s*r-e*a,this.z=e*n-i*r,this},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,s=this.y,r=this.z;return this.x=i+e*(t.x-i),this.y=s+e*(t.y-s),this.z=r+e*(t.z-r),this},applyMatrix3:function(t){var e=this.x,i=this.y,s=this.z,r=t.val;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this},applyMatrix4:function(t){var e=this.x,i=this.y,s=this.z,r=t.val,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this},transformMat3:function(t){var e=this.x,i=this.y,s=this.z,r=t.val;return this.x=e*r[0]+i*r[3]+s*r[6],this.y=e*r[1]+i*r[4]+s*r[7],this.z=e*r[2]+i*r[5]+s*r[8],this},transformMat4:function(t){var e=this.x,i=this.y,s=this.z,r=t.val;return this.x=r[0]*e+r[4]*i+r[8]*s+r[12],this.y=r[1]*e+r[5]*i+r[9]*s+r[13],this.z=r[2]*e+r[6]*i+r[10]*s+r[14],this},transformCoordinates:function(t){var e=this.x,i=this.y,s=this.z,r=t.val,n=e*r[0]+i*r[4]+s*r[8]+r[12],a=e*r[1]+i*r[5]+s*r[9]+r[13],o=e*r[2]+i*r[6]+s*r[10]+r[14],h=e*r[3]+i*r[7]+s*r[11]+r[15];return this.x=n/h,this.y=a/h,this.z=o/h,this},transformQuat:function(t){var e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=o*e+n*s-a*i,l=o*i+a*e-r*s,u=o*s+r*i-n*e,d=-r*e-n*i-a*s;return this.x=h*o+d*-r+l*-a-u*-n,this.y=l*o+d*-n+u*-r-h*-a,this.z=u*o+d*-a+h*-n-l*-r,this},project:function(t){var e=this.x,i=this.y,s=this.z,r=t.val,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],u=r[5],d=r[6],c=r[7],f=r[8],p=r[9],g=r[10],m=r[11],v=r[12],y=r[13],x=r[14],T=1/(e*h+i*c+s*m+r[15]);return this.x=(e*n+i*l+s*f+v)*T,this.y=(e*a+i*u+s*p+y)*T,this.z=(e*o+i*d+s*g+x)*T,this},projectViewMatrix:function(t,e){return this.applyMatrix4(t).applyMatrix4(e)},unprojectViewMatrix:function(t,e){return this.applyMatrix4(t).applyMatrix4(e)},unproject:function(t,e){var i=t.x,s=t.y,r=t.z,n=t.w,a=this.x-i,o=n-this.y-1-s,h=this.z;return this.x=2*a/r-1,this.y=2*o/n-1,this.z=2*h-1,this.project(e)},reset:function(){return this.x=0,this.y=0,this.z=0,this}});s.ZERO=new s,s.RIGHT=new s(1,0,0),s.LEFT=new s(-1,0,0),s.UP=new s(0,-1,0),s.DOWN=new s(0,1,0),s.FORWARD=new s(0,0,1),s.BACK=new s(0,0,-1),s.ONE=new s(1,1,1),t.exports=s},61369(t,e,i){var s=new(i(83419))({initialize:function(t,e,i,s){this.x=0,this.y=0,this.z=0,this.w=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=s||0)},clone:function(){return new s(this.x,this.y,this.z,this.w)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z||0,this.w=t.w||0,this},equals:function(t){return this.x===t.x&&this.y===t.y&&this.z===t.z&&this.w===t.w},set:function(t,e,i,s){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=s||0),this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z||0,this.w+=t.w||0,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z||0,this.w-=t.w||0,this},scale:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},length:function(){var t=this.x,e=this.y,i=this.z,s=this.w;return Math.sqrt(t*t+e*e+i*i+s*s)},lengthSq:function(){var t=this.x,e=this.y,i=this.z,s=this.w;return t*t+e*e+i*i+s*s},normalize:function(){var t=this.x,e=this.y,i=this.z,s=this.w,r=t*t+e*e+i*i+s*s;return r>0&&(r=1/Math.sqrt(r),this.x=t*r,this.y=e*r,this.z=i*r,this.w=s*r),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,s=this.y,r=this.z,n=this.w;return this.x=i+e*(t.x-i),this.y=s+e*(t.y-s),this.z=r+e*(t.z-r),this.w=n+e*(t.w-n),this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z||1,this.w*=t.w||1,this},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z||1,this.w/=t.w||1,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y,s=t.z-this.z||0,r=t.w-this.w||0;return Math.sqrt(e*e+i*i+s*s+r*r)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y,s=t.z-this.z||0,r=t.w-this.w||0;return e*e+i*i+s*s+r*r},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},transformMat4:function(t){var e=this.x,i=this.y,s=this.z,r=this.w,n=t.val;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this},transformQuat:function(t){var e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=o*e+n*s-a*i,l=o*i+a*e-r*s,u=o*s+r*i-n*e,d=-r*e-n*i-a*s;return this.x=h*o+d*-r+l*-a-u*-n,this.y=l*o+d*-n+u*-r-h*-a,this.z=u*o+d*-a+h*-n-l*-r,this},reset:function(){return this.x=0,this.y=0,this.z=0,this.w=0,this}});s.prototype.sub=s.prototype.subtract,s.prototype.mul=s.prototype.multiply,s.prototype.div=s.prototype.divide,s.prototype.dist=s.prototype.distance,s.prototype.distSq=s.prototype.distanceSq,s.prototype.len=s.prototype.length,s.prototype.lenSq=s.prototype.lengthSq,t.exports=s},60417(t){t.exports=function(t,e,i){return Math.abs(t-e)<=i}},15994(t){t.exports=function(t,e,i){var s=i-e;return e+((t-e)%s+s)%s}},31040(t){t.exports=function(t,e,i,s){return Math.atan2(s-e,i-t)}},55495(t){t.exports=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)}},128(t){t.exports=function(t,e){return Math.atan2(e.x-t.x,e.y-t.y)}},41273(t){t.exports=function(t,e,i,s){return Math.atan2(i-t,s-e)}},1432(t,e,i){var s=i(36383);t.exports=function(t){return t>Math.PI&&(t-=s.TAU),Math.abs(((t+s.PI_OVER_2)%s.TAU-s.TAU)%s.TAU)}},49127(t,e,i){var s=i(12407);t.exports=function(t,e){return s(e-t)}},52285(t,e,i){var s=i(36383),r=i(12407),n=s.TAU;t.exports=function(t,e){var i=r(e-t);return i>0&&(i-=n),i}},67317(t,e,i){var s=i(86554);t.exports=function(t,e){return s(e-t)}},12407(t){t.exports=function(t){return(t%=2*Math.PI)>=0?t:t+2*Math.PI}},53993(t,e,i){var s=i(99472);t.exports=function(){return s(-Math.PI,Math.PI)}},86564(t,e,i){var s=i(99472);t.exports=function(){return s(-180,180)}},90154(t,e,i){var s=i(12407);t.exports=function(t){return s(t+Math.PI)}},48736(t,e,i){var s=i(36383);t.exports=function(t,e,i){return void 0===i&&(i=.05),t===e||(Math.abs(e-t)<=i||Math.abs(e-t)>=s.TAU-i?t=e:(Math.abs(e-t)>Math.PI&&(et?t+=i:e=1?1:1/e*(1+(e*t|0))}},49752(t,e,i){t.exports=i(72251)},75698(t){t.exports=function(t,e){return void 0===e&&(e=1e-4),Math.ceil(t-e)}},43855(t){t.exports=function(t,e,i){return void 0===i&&(i=1e-4),Math.abs(t-e)e-i}},94977(t){t.exports=function(t,e,i){return void 0===i&&(i=1e-4),t1?t[i]-(s(r-i,t[i],t[i],t[i-1],t[i-1])-t[i]):s(r-n,t[n?n-1:0],t[n],t[i1?s(t[i],t[i-1],i-r):s(t[n],t[n+1>i?i:n+1],r-n)}},32112(t){t.exports=function(t,e,i,s){return function(t,e){var i=1-t;return i*i*e}(t,e)+function(t,e){return 2*(1-t)*t*e}(t,i)+function(t,e){return t*t*e}(t,s)}},47235(t,e,i){var s=i(7602);t.exports=function(t,e,i){return e+(i-e)*s(t,0,1)}},50178(t,e,i){var s=i(54261);t.exports=function(t,e,i){return e+(i-e)*s(t,0,1)}},38289(t,e,i){t.exports={Bezier:i(89318),CatmullRom:i(77259),CubicBezier:i(36316),Linear:i(28392),QuadraticBezier:i(32112),SmoothStep:i(47235),SmootherStep:i(50178)}},98439(t){t.exports=function(t){var e=Math.log(t)/.6931471805599453;return 1<0&&!(t&t-1)&&e>0&&!(e&e-1)}},81230(t){t.exports=function(t){return t>0&&!(t&t-1)}},49001(t,e,i){t.exports={GetNext:i(98439),IsSize:i(50030),IsValue:i(81230)}},28453(t,e,i){var s=new(i(83419))({initialize:function(t){void 0===t&&(t=[(Date.now()*Math.random()).toString()]),this.c=1,this.s0=0,this.s1=0,this.s2=0,this.n=0,this.signs=[-1,1],t&&this.init(t)},rnd:function(){var t=2091639*this.s0+2.3283064365386963e-10*this.c;return this.c=0|t,this.s0=this.s1,this.s1=this.s2,this.s2=t-this.c,this.s2},hash:function(t){var e,i=this.n;t=t.toString();for(var s=0;s>>0,i=(e*=i)>>>0,i+=4294967296*(e-=i);return this.n=i,2.3283064365386963e-10*(i>>>0)},init:function(t){"string"==typeof t?this.state(t):this.sow(t)},sow:function(t){if(this.n=4022871197,this.s0=this.hash(" "),this.s1=this.hash(" "),this.s2=this.hash(" "),this.c=1,t)for(var e=0;e0;e--){var i=Math.floor(this.frac()*(e+1)),s=t[i];t[i]=t[e],t[e]=s}return t}});t.exports=s},63448(t){t.exports=function(t,e,i,s){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.ceil(t/e),s?(i+t)/e:i+t)}},56583(t){t.exports=function(t,e,i,s){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.floor(t/e),s?(i+t)/e:i+t)}},77720(t){t.exports=function(t,e,i,s){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.round(t/e),s?(i+t)/e:i+t)}},73697(t,e,i){t.exports={Ceil:i(63448),Floor:i(56583),To:i(77720)}},85454(t,e,i){i(63595);var s=i(8054),r=i(79291),n={Actions:i(61061),Animations:i(60421),BlendModes:i(10312),Cache:i(83388),Cameras:i(26638),Core:i(42857),Class:i(83419),Curves:i(25410),Data:i(44965),Display:i(27460),DOM:i(84902),Events:i(93055),Filters:i(11889),Game:i(50127),GameObjects:i(77856),Geom:i(55738),Input:i(14350),Loader:i(57777),Math:i(75508),Physics:i(44563),Plugins:i(18922),Renderer:i(36909),Scale:i(93364),ScaleModes:i(29795),Scene:i(97482),Scenes:i(62194),Structs:i(41392),Textures:i(27458),Tilemaps:i(62501),Time:i(90291),TintModes:i(84322),Tweens:i(43066),Utils:i(91799)};n.Sound=i(23717),n=r(!1,n,s),t.exports=n,i.g.Phaser=n},71289(t,e,i){var s=i(83419),r=i(92209),n=i(88571),a=new s({Extends:n,Mixins:[r.Acceleration,r.Angular,r.Bounce,r.Collision,r.Debug,r.Drag,r.Enable,r.Friction,r.Gravity,r.Immovable,r.Mass,r.Pushable,r.Size,r.Velocity],initialize:function(t,e,i,s,r){n.call(this,t,e,i,s,r),this.body=null}});t.exports=a},86689(t,e,i){var s=i(83419),r=i(39506),n=i(20339),a=i(89774),o=i(66022),h=i(95540),l=i(46975),u=i(72441),d=i(47956),c=i(37277),f=i(44594),p=i(26099),g=i(82248),m=new s({initialize:function(t){this.scene=t,this.systems=t.sys,this.config=this.getConfig(),this.world,this.add,this._category=1,t.sys.events.once(f.BOOT,this.boot,this),t.sys.events.on(f.START,this.start,this)},boot:function(){this.world=new g(this.scene,this.config),this.add=new o(this.world),this.systems.events.once(f.DESTROY,this.destroy,this)},start:function(){this.world||(this.world=new g(this.scene,this.config),this.add=new o(this.world));var t=this.systems.events;h(this.config,"customUpdate",!1)||t.on(f.UPDATE,this.world.update,this.world),t.on(f.POST_UPDATE,this.world.postUpdate,this.world),t.once(f.SHUTDOWN,this.shutdown,this)},enableUpdate:function(){this.systems.events.on(f.UPDATE,this.world.update,this.world)},disableUpdate:function(){this.systems.events.off(f.UPDATE,this.world.update,this.world)},getConfig:function(){var t=this.systems.game.config.physics,e=this.systems.settings.physics;return l(h(e,"arcade",{}),h(t,"arcade",{}))},nextCategory:function(){return this._category=this._category<<1,this._category},overlap:function(t,e,i,s,r){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===r&&(r=i),this.world.collideObjects(t,e,i,s,r,!0)},collide:function(t,e,i,s,r){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===r&&(r=i),this.world.collideObjects(t,e,i,s,r,!1)},collideTiles:function(t,e,i,s,r){return this.world.collideTiles(t,e,i,s,r)},overlapTiles:function(t,e,i,s,r){return this.world.overlapTiles(t,e,i,s,r)},pause:function(){return this.world.pause()},resume:function(){return this.world.resume()},accelerateTo:function(t,e,i,s,r,n){void 0===s&&(s=60);var a=Math.atan2(i-t.y,e-t.x);return t.body.acceleration.setToPolar(a,s),void 0!==r&&void 0!==n&&t.body.maxVelocity.set(r,n),a},accelerateToObject:function(t,e,i,s,r){return this.accelerateTo(t,e.x,e.y,i,s,r)},closest:function(t,e){e||(e=Array.from(this.world.bodies));for(var i=Number.MAX_VALUE,s=null,r=t.x,n=t.y,o=e.length,h=0;hi&&(s=l,i=d)}}return s},moveTo:function(t,e,i,s,r){void 0===s&&(s=60),void 0===r&&(r=0);var a=Math.atan2(i-t.y,e-t.x);return r>0&&(s=n(t.x,t.y,e,i)/(r/1e3)),t.body.velocity.setToPolar(a,s),a},moveToObject:function(t,e,i,s){return this.moveTo(t,e.x,e.y,i,s)},velocityFromAngle:function(t,e,i){return void 0===e&&(e=60),void 0===i&&(i=new p),i.setToPolar(r(t),e)},velocityFromRotation:function(t,e,i){return void 0===e&&(e=60),void 0===i&&(i=new p),i.setToPolar(t,e)},overlapRect:function(t,e,i,s,r,n){return d(this.world,t,e,i,s,r,n)},overlapCirc:function(t,e,i,s,r){return u(this.world,t,e,i,s,r)},shutdown:function(){if(this.world){var t=this.systems.events;t.off(f.UPDATE,this.world.update,this.world),t.off(f.POST_UPDATE,this.world.postUpdate,this.world),t.off(f.SHUTDOWN,this.shutdown,this),this.add.destroy(),this.world.destroy(),this.add=null,this.world=null,this._category=1}},destroy:function(){this.shutdown(),this.scene.sys.events.off(f.START,this.start,this),this.scene=null,this.systems=null}});c.register("ArcadePhysics",m,"arcadePhysics"),t.exports=m},13759(t,e,i){var s=i(83419),r=i(92209),n=i(68287),a=new s({Extends:n,Mixins:[r.Acceleration,r.Angular,r.Bounce,r.Collision,r.Debug,r.Drag,r.Enable,r.Friction,r.Gravity,r.Immovable,r.Mass,r.Pushable,r.Size,r.Velocity],initialize:function(t,e,i,s,r){n.call(this,t,e,i,s,r),this.body=null}});t.exports=a},37742(t,e,i){var s=i(83419),r=i(78389),n=i(37747),a=i(63012),o=i(43396),h=i(87841),l=i(37303),u=i(95829),d=i(26099),c=new s({Mixins:[r],initialize:function(t,e){var i=64,s=64,r=void 0!==e;r&&e.displayWidth&&(i=e.displayWidth,s=e.displayHeight),r||(e={x:0,y:0,angle:0,rotation:0,scaleX:1,scaleY:1,displayOriginX:0,displayOriginY:0}),this.world=t,this.gameObject=r?e:void 0,this.isBody=!0,this.transform={x:e.x,y:e.y,rotation:e.angle,scaleX:e.scaleX,scaleY:e.scaleY,displayOriginX:e.displayOriginX,displayOriginY:e.displayOriginY},this.debugShowBody=t.defaults.debugShowBody,this.debugShowVelocity=t.defaults.debugShowVelocity,this.debugBodyColor=t.defaults.bodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new d,this.position=new d(e.x-e.scaleX*e.displayOriginX,e.y-e.scaleY*e.displayOriginY),this.prev=this.position.clone(),this.prevFrame=this.position.clone(),this.allowRotation=!0,this.rotation=e.angle,this.preRotation=e.angle,this.width=i,this.height=s,this.sourceWidth=i,this.sourceHeight=s,e.frame&&(this.sourceWidth=e.frame.realWidth,this.sourceHeight=e.frame.realHeight),this.halfWidth=Math.abs(i/2),this.halfHeight=Math.abs(s/2),this.center=new d(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.velocity=new d,this.newVelocity=new d,this.deltaMax=new d,this.acceleration=new d,this.allowDrag=!0,this.drag=new d,this.allowGravity=!0,this.gravity=new d,this.bounce=new d,this.worldBounce=null,this.customBoundsRectangle=t.bounds,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.maxVelocity=new d(1e4,1e4),this.maxSpeed=-1,this.friction=new d(1,0),this.useDamping=!1,this.angularVelocity=0,this.angularAcceleration=0,this.angularDrag=0,this.maxAngular=1e3,this.mass=1,this.angle=0,this.speed=0,this.facing=n.FACING_NONE,this.immovable=!1,this.pushable=!0,this.slideFactor=new d(1,1),this.moves=!0,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision=u(!1),this.touching=u(!0),this.wasTouching=u(!0),this.blocked=u(!0),this.syncBounds=!1,this.physicsType=n.DYNAMIC_BODY,this.collisionCategory=1,this.collisionMask=1,this._sx=e.scaleX,this._sy=e.scaleY,this._dx=0,this._dy=0,this._tx=0,this._ty=0,this._bounds=new h,this.directControl=!1,this.autoFrame=this.position.clone()},updateBounds:function(){var t=this.gameObject,e=this.transform;if(t.parentContainer){var i=t.getWorldTransformMatrix(this.world._tempMatrix,this.world._tempMatrix2);e.x=i.tx,e.y=i.ty,e.rotation=o(i.rotation),e.scaleX=i.scaleX,e.scaleY=i.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY}else e.x=t.x,e.y=t.y,e.rotation=t.angle,e.scaleX=t.scaleX,e.scaleY=t.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY;var s=!1;if(this.syncBounds){var r=t.getBounds(this._bounds);this.width=r.width,this.height=r.height,s=!0}else{var n=Math.abs(e.scaleX),a=Math.abs(e.scaleY);this._sx===n&&this._sy===a||(this.width=this.sourceWidth*n,this.height=this.sourceHeight*a,this._sx=n,this._sy=a,s=!0)}s&&(this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter())},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},updateFromGameObject:function(){this.updateBounds();var t=this.transform;this.position.x=t.x+t.scaleX*(this.offset.x-t.displayOriginX),this.position.y=t.y+t.scaleY*(this.offset.y-t.displayOriginY),this.updateCenter()},resetFlags:function(t){void 0===t&&(t=!1);var e=this.wasTouching,i=this.touching,s=this.blocked;t?u(!0,e):(e.none=i.none,e.up=i.up,e.down=i.down,e.left=i.left,e.right=i.right),u(!0,i),u(!0,s),this.overlapR=0,this.overlapX=0,this.overlapY=0,this.embedded=!1},preUpdate:function(t,e){if(t&&this.resetFlags(),this.gameObject&&this.updateFromGameObject(),this.rotation=this.transform.rotation,this.preRotation=this.rotation,this.moves){var i=this.position;this.prev.x=i.x,this.prev.y=i.y,this.prevFrame.x=i.x,this.prevFrame.y=i.y}t&&this.update(e)},update:function(t){var e=this.prev,i=this.position,s=this.velocity;if(e.set(i.x,i.y),!this.moves)return this._dx=i.x-e.x,void(this._dy=i.y-e.y);if(this.directControl){var r=this.autoFrame;s.set((i.x-r.x)/t,(i.y-r.y)/t),this.world.updateMotion(this,t),this._dx=i.x-r.x,this._dy=i.y-r.y}else this.world.updateMotion(this,t),this.newVelocity.set(s.x*t,s.y*t),i.add(this.newVelocity),this._dx=i.x-e.x,this._dy=i.y-e.y;var n=s.x,o=s.y;if(this.updateCenter(),this.angle=Math.atan2(o,n),this.speed=Math.sqrt(n*n+o*o),this.collideWorldBounds&&this.checkWorldBounds()&&this.onWorldBounds){var h=this.blocked;this.world.emit(a.WORLD_BOUNDS,this,h.up,h.down,h.left,h.right)}},postUpdate:function(){var t=this.position,e=t.x-this.prevFrame.x,i=t.y-this.prevFrame.y,s=this.gameObject;if(this.moves){var r=this.deltaMax.x,a=this.deltaMax.y;0!==r&&0!==e&&(e<0&&e<-r?e=-r:e>0&&e>r&&(e=r)),0!==a&&0!==i&&(i<0&&i<-a?i=-a:i>0&&i>a&&(i=a)),s&&(s.x+=e,s.y+=i)}e<0?this.facing=n.FACING_LEFT:e>0&&(this.facing=n.FACING_RIGHT),i<0?this.facing=n.FACING_UP:i>0&&(this.facing=n.FACING_DOWN),this.allowRotation&&s&&(s.angle+=this.deltaZ()),this._tx=e,this._ty=i,this.autoFrame.set(t.x,t.y)},setBoundsRectangle:function(t){return this.customBoundsRectangle=t||this.world.bounds,this},checkWorldBounds:function(){var t=this.position,e=this.velocity,i=this.blocked,s=this.customBoundsRectangle,r=this.world.checkCollision,n=this.worldBounce?-this.worldBounce.x:-this.bounce.x,a=this.worldBounce?-this.worldBounce.y:-this.bounce.y,o=!1;return t.xs.right&&r.right&&(t.x=s.right-this.width,e.x*=n,i.right=!0,o=!0),t.ys.bottom&&r.down&&(t.y=s.bottom-this.height,e.y*=a,i.down=!0,o=!0),o&&(this.blocked.none=!1,this.updateCenter()),o},setOffset:function(t,e){return void 0===e&&(e=t),this.offset.set(t,e),this},setGameObject:function(t,e){if(void 0===e&&(e=!0),!t||!t.hasTransformComponent)return this;var i=this.world;return this.gameObject&&this.gameObject.body&&(i.disable(this.gameObject),this.gameObject.body=null),t.body&&i.disable(t),this.gameObject=t,t.body=this,this.setSize(),this.enable=e,this},setSize:function(t,e,i){void 0===i&&(i=!0);var s=this.gameObject;if(s&&(!t&&s.frame&&(t=s.frame.realWidth),!e&&s.frame&&(e=s.frame.realHeight)),this.sourceWidth=t,this.sourceHeight=e,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter(),i&&s&&s.getCenter){var r=(s.width-t)/2,n=(s.height-e)/2;this.offset.set(r,n)}return this.isCircle=!1,this.radius=0,this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.isCircle=!0,this.radius=t,this.sourceWidth=2*t,this.sourceHeight=2*t,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter()):this.isCircle=!1,this},reset:function(t,e){this.stop();var i=this.gameObject;i&&(i.setPosition(t,e),this.rotation=i.angle,this.preRotation=i.angle);var s=this.position;i&&i.getTopLeft?i.getTopLeft(s):s.set(t,e),this.prev.copy(s),this.prevFrame.copy(s),this.autoFrame.copy(s),i&&this.updateBounds(),this.updateCenter(),this.collideWorldBounds&&this.checkWorldBounds(),this.resetFlags(!0)},stop:function(){return this.velocity.set(0),this.acceleration.set(0),this.speed=0,this.angularVelocity=0,this.angularAcceleration=0,this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?this.radius>0&&t>=this.left&&t<=this.right&&e>=this.top&&e<=this.bottom&&(this.center.x-t)*(this.center.x-t)+(this.center.y-e)*(this.center.y-e)<=this.radius*this.radius:l(this,t,e)},onFloor:function(){return this.blocked.down},onCeiling:function(){return this.blocked.up},onWall:function(){return this.blocked.left||this.blocked.right},deltaAbsX:function(){return this._dx>0?this._dx:-this._dx},deltaAbsY:function(){return this._dy>0?this._dy:-this._dy},deltaX:function(){return this._dx},deltaY:function(){return this._dy},deltaXFinal:function(){return this._tx},deltaYFinal:function(){return this._ty},deltaZ:function(){return this.rotation-this.preRotation},destroy:function(){this.enable=!1,this.world&&this.world.pendingDestroy.add(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,s=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(t.defaultStrokeWidth,this.debugBodyColor),this.isCircle?t.strokeCircle(i,s,this.width/2):(this.checkCollision.up&&t.lineBetween(e.x,e.y,e.x+this.width,e.y),this.checkCollision.right&&t.lineBetween(e.x+this.width,e.y,e.x+this.width,e.y+this.height),this.checkCollision.down&&t.lineBetween(e.x,e.y+this.height,e.x+this.width,e.y+this.height),this.checkCollision.left&&t.lineBetween(e.x,e.y,e.x,e.y+this.height))),this.debugShowVelocity&&(t.lineStyle(t.defaultStrokeWidth,this.world.defaults.velocityDebugColor,1),t.lineBetween(i,s,i+this.velocity.x/2,s+this.velocity.y/2))},willDrawDebug:function(){return this.debugShowBody||this.debugShowVelocity},setDirectControl:function(t){return void 0===t&&(t=!0),this.directControl=t,this},setCollideWorldBounds:function(t,e,i,s){void 0===t&&(t=!0),this.collideWorldBounds=t;var r=void 0!==e,n=void 0!==i;return(r||n)&&(this.worldBounce||(this.worldBounce=new d),r&&(this.worldBounce.x=e),n&&(this.worldBounce.y=i)),void 0!==s&&(this.onWorldBounds=s),this},setVelocity:function(t,e){return this.velocity.set(t,e),t=this.velocity.x,e=this.velocity.y,this.speed=Math.sqrt(t*t+e*e),this},setVelocityX:function(t){return this.setVelocity(t,this.velocity.y)},setVelocityY:function(t){return this.setVelocity(this.velocity.x,t)},setMaxVelocity:function(t,e){return this.maxVelocity.set(t,e),this},setMaxVelocityX:function(t){return this.maxVelocity.x=t,this},setMaxVelocityY:function(t){return this.maxVelocity.y=t,this},setMaxSpeed:function(t){return this.maxSpeed=t,this},setSlideFactor:function(t,e){return this.slideFactor.set(t,e),this},setBounce:function(t,e){return this.bounce.set(t,e),this},setBounceX:function(t){return this.bounce.x=t,this},setBounceY:function(t){return this.bounce.y=t,this},setAcceleration:function(t,e){return this.acceleration.set(t,e),this},setAccelerationX:function(t){return this.acceleration.x=t,this},setAccelerationY:function(t){return this.acceleration.y=t,this},setAllowDrag:function(t){return void 0===t&&(t=!0),this.allowDrag=t,this},setAllowGravity:function(t){return void 0===t&&(t=!0),this.allowGravity=t,this},setAllowRotation:function(t){return void 0===t&&(t=!0),this.allowRotation=t,this},setDrag:function(t,e){return this.drag.set(t,e),this},setDamping:function(t){return this.useDamping=t,this},setDragX:function(t){return this.drag.x=t,this},setDragY:function(t){return this.drag.y=t,this},setGravity:function(t,e){return this.gravity.set(t,e),this},setGravityX:function(t){return this.gravity.x=t,this},setGravityY:function(t){return this.gravity.y=t,this},setFriction:function(t,e){return this.friction.set(t,e),this},setFrictionX:function(t){return this.friction.x=t,this},setFrictionY:function(t){return this.friction.y=t,this},setAngularVelocity:function(t){return this.angularVelocity=t,this},setAngularAcceleration:function(t){return this.angularAcceleration=t,this},setAngularDrag:function(t){return this.angularDrag=t,this},setMass:function(t){return this.mass=t,this},setImmovable:function(t){return void 0===t&&(t=!0),this.immovable=t,this},setEnable:function(t){return void 0===t&&(t=!0),this.enable=t,this},processX:function(t,e,i,s){this.x+=t,this.updateCenter(),null!==e&&(this.velocity.x=e*this.slideFactor.x);var r=this.blocked;i&&(r.left=!0,r.none=!1),s&&(r.right=!0,r.none=!1)},processY:function(t,e,i,s){this.y+=t,this.updateCenter(),null!==e&&(this.velocity.y=e*this.slideFactor.y);var r=this.blocked;i&&(r.up=!0,r.none=!1),s&&(r.down=!0,r.none=!1)},x:{get:function(){return this.position.x},set:function(t){this.position.x=t}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=c},79342(t,e,i){var s=new(i(83419))({initialize:function(t,e,i,s,r,n,a){this.world=t,this.name="",this.active=!0,this.overlapOnly=e,this.object1=i,this.object2=s,this.collideCallback=r,this.processCallback=n,this.callbackContext=a},setName:function(t){return this.name=t,this},update:function(){this.world.collideObjects(this.object1,this.object2,this.collideCallback,this.processCallback,this.callbackContext,this.overlapOnly)},destroy:function(){this.world.removeCollider(this),this.active=!1,this.world=null,this.object1=null,this.object2=null,this.collideCallback=null,this.processCallback=null,this.callbackContext=null}});t.exports=s},66022(t,e,i){var s=i(71289),r=i(13759),n=i(37742),a=i(83419),o=i(37747),h=i(60758),l=i(72624),u=i(71464),d=new a({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},collider:function(t,e,i,s,r){return this.world.addCollider(t,e,i,s,r)},overlap:function(t,e,i,s,r){return this.world.addOverlap(t,e,i,s,r)},existing:function(t,e){var i=e?o.STATIC_BODY:o.DYNAMIC_BODY;return this.world.enableBody(t,i),t},staticImage:function(t,e,i,r){var n=new s(this.scene,t,e,i,r);return this.sys.displayList.add(n),this.world.enableBody(n,o.STATIC_BODY),n},image:function(t,e,i,r){var n=new s(this.scene,t,e,i,r);return this.sys.displayList.add(n),this.world.enableBody(n,o.DYNAMIC_BODY),n},staticSprite:function(t,e,i,s){var n=new r(this.scene,t,e,i,s);return this.sys.displayList.add(n),this.sys.updateList.add(n),this.world.enableBody(n,o.STATIC_BODY),n},sprite:function(t,e,i,s){var n=new r(this.scene,t,e,i,s);return this.sys.displayList.add(n),this.sys.updateList.add(n),this.world.enableBody(n,o.DYNAMIC_BODY),n},staticGroup:function(t,e){return this.sys.updateList.add(new u(this.world,this.world.scene,t,e))},group:function(t,e){return this.sys.updateList.add(new h(this.world,this.world.scene,t,e))},body:function(t,e,i,s){var r=new n(this.world);return r.position.set(t,e),i&&s&&r.setSize(i,s),this.world.add(r,o.DYNAMIC_BODY),r},staticBody:function(t,e,i,s){var r=new l(this.world);return r.position.set(t,e),i&&s&&r.setSize(i,s),this.world.add(r,o.STATIC_BODY),r},destroy:function(){this.world=null,this.scene=null,this.sys=null}});t.exports=d},79599(t){t.exports=function(t){var e=0;if(Array.isArray(t))for(var i=0;ie._dx?(n=t.right-e.x)>a&&!i||!1===t.checkCollision.right||!1===e.checkCollision.left?n=0:(t.touching.none=!1,t.touching.right=!0,e.touching.none=!1,e.touching.left=!0,e.physicsType!==s.STATIC_BODY||i||(t.blocked.none=!1,t.blocked.right=!0),t.physicsType!==s.STATIC_BODY||i||(e.blocked.none=!1,e.blocked.left=!0)):t._dxa&&!i||!1===t.checkCollision.left||!1===e.checkCollision.right?n=0:(t.touching.none=!1,t.touching.left=!0,e.touching.none=!1,e.touching.right=!0,e.physicsType!==s.STATIC_BODY||i||(t.blocked.none=!1,t.blocked.left=!0),t.physicsType!==s.STATIC_BODY||i||(e.blocked.none=!1,e.blocked.right=!0))),t.overlapX=n,e.overlapX=n,n}},45170(t,e,i){var s=i(37747);t.exports=function(t,e,i,r){var n=0,a=t.deltaAbsY()+e.deltaAbsY()+r;return 0===t._dy&&0===e._dy?(t.embedded=!0,e.embedded=!0):t._dy>e._dy?(n=t.bottom-e.y)>a&&!i||!1===t.checkCollision.down||!1===e.checkCollision.up?n=0:(t.touching.none=!1,t.touching.down=!0,e.touching.none=!1,e.touching.up=!0,e.physicsType!==s.STATIC_BODY||i||(t.blocked.none=!1,t.blocked.down=!0),t.physicsType!==s.STATIC_BODY||i||(e.blocked.none=!1,e.blocked.up=!0)):t._dya&&!i||!1===t.checkCollision.up||!1===e.checkCollision.down?n=0:(t.touching.none=!1,t.touching.up=!0,e.touching.none=!1,e.touching.down=!0,e.physicsType!==s.STATIC_BODY||i||(t.blocked.none=!1,t.blocked.up=!0),t.physicsType!==s.STATIC_BODY||i||(e.blocked.none=!1,e.blocked.down=!0))),t.overlapY=n,e.overlapY=n,n}},60758(t,e,i){var s=i(13759),r=i(83419),n=i(78389),a=i(37747),o=i(95540),h=i(26479),l=i(41212),u=new r({Extends:h,Mixins:[n],initialize:function(t,e,i,r){if(i||r)if(l(i))r=i,i=null,r.internalCreateCallback=this.createCallbackHandler,r.internalRemoveCallback=this.removeCallbackHandler;else if(Array.isArray(i)&&l(i[0])){var n=this;i.forEach(function(t){t.internalCreateCallback=n.createCallbackHandler,t.internalRemoveCallback=n.removeCallbackHandler,t.classType=o(t,"classType",s)}),r=null}else r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};else r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};this.world=t,r&&(r.classType=o(r,"classType",s)),this.physicsType=a.DYNAMIC_BODY,this.collisionCategory=1,this.collisionMask=2147483647,this.defaults={setCollideWorldBounds:o(r,"collideWorldBounds",!1),setBoundsRectangle:o(r,"customBoundsRectangle",null),setAccelerationX:o(r,"accelerationX",0),setAccelerationY:o(r,"accelerationY",0),setAllowDrag:o(r,"allowDrag",!0),setAllowGravity:o(r,"allowGravity",!0),setAllowRotation:o(r,"allowRotation",!0),setDamping:o(r,"useDamping",!1),setBounceX:o(r,"bounceX",0),setBounceY:o(r,"bounceY",0),setDragX:o(r,"dragX",0),setDragY:o(r,"dragY",0),setEnable:o(r,"enable",!0),setGravityX:o(r,"gravityX",0),setGravityY:o(r,"gravityY",0),setFrictionX:o(r,"frictionX",0),setFrictionY:o(r,"frictionY",0),setMaxSpeed:o(r,"maxSpeed",-1),setMaxVelocityX:o(r,"maxVelocityX",1e4),setMaxVelocityY:o(r,"maxVelocityY",1e4),setVelocityX:o(r,"velocityX",0),setVelocityY:o(r,"velocityY",0),setAngularVelocity:o(r,"angularVelocity",0),setAngularAcceleration:o(r,"angularAcceleration",0),setAngularDrag:o(r,"angularDrag",0),setMass:o(r,"mass",1),setImmovable:o(r,"immovable",!1)},h.call(this,e,i,r),this.type="PhysicsGroup"},createCallbackHandler:function(t){t.body&&t.body.physicsType===a.DYNAMIC_BODY||(t.body&&(t.body.destroy(),t.body=null),this.world.enableBody(t,a.DYNAMIC_BODY));var e=t.body;for(var i in this.defaults)e[i](this.defaults[i])},removeCallbackHandler:function(t){t.body&&this.world.disableBody(t)},setVelocity:function(t,e,i){void 0===i&&(i=0);for(var s=this.getChildren(),r=0;r0?1:-1),o=Math.sqrt(t*t*e.mass/i.mass)*(t>0?1:-1),h=.5*(r+o);return o-=h,n=h+(r-=h)*e.bounce.x,a=h+o*i.bounce.x,l&&m?x(0):c&&g?x(1):u&&g?x(2):!(!f||!m)&&x(3)},Set:function(t,n,a){i=n;var x=(e=t).velocity.x,T=i.velocity.x;return s=e.pushable,l=e._dx<0,u=e._dx>0,d=0===e._dx,g=Math.abs(e.right-i.x)<=Math.abs(i.right-e.x),o=T-x*e.bounce.x,r=i.pushable,c=i._dx<0,f=i._dx>0,p=0===i._dx,m=!g,h=x-T*i.bounce.x,v=Math.abs(a),y()},Run:x,RunImmovableBody1:function(t){if(1===t?i.velocity.x=0:g?i.processX(v,h,!0):i.processX(-v,h,!1,!0),e.moves){var s=e.directControl?e.y-e.autoFrame.y:e.y-e.prev.y;i.y+=s*e.friction.y,i._dy=i.y-i.prev.y}},RunImmovableBody2:function(t){if(2===t?e.velocity.x=0:m?e.processX(v,o,!0):e.processX(-v,o,!1,!0),i.moves){var s=i.directControl?i.y-i.autoFrame.y:i.y-i.prev.y;e.y+=s*i.friction.y,e._dy=e.y-e.prev.y}}}},47962(t){var e,i,s,r,n,a,o,h,l,u,d,c,f,p,g,m,v,y=function(){return u&&g&&i.blocked.down?(e.processY(-v,o,!1,!0),1):l&&m&&i.blocked.up?(e.processY(v,o,!0),1):f&&m&&e.blocked.down?(i.processY(-v,h,!1,!0),2):c&&g&&e.blocked.up?(i.processY(v,h,!0),2):0},x=function(t){if(s&&r)v*=.5,0===t||3===t?(e.processY(v,n),i.processY(-v,a)):(e.processY(-v,n),i.processY(v,a));else if(s&&!r)0===t||3===t?e.processY(v,o,!0):e.processY(-v,o,!1,!0);else if(!s&&r)0===t||3===t?i.processY(-v,h,!1,!0):i.processY(v,h,!0);else{var g=.5*v;0===t?p?(e.processY(v,0,!0),i.processY(0,null,!1,!0)):f?(e.processY(g,0,!0),i.processY(-g,0,!1,!0)):(e.processY(g,i.velocity.y,!0),i.processY(-g,null,!1,!0)):1===t?d?(e.processY(0,null,!1,!0),i.processY(v,0,!0)):u?(e.processY(-g,0,!1,!0),i.processY(g,0,!0)):(e.processY(-g,null,!1,!0),i.processY(g,e.velocity.y,!0)):2===t?p?(e.processY(-v,0,!1,!0),i.processY(0,null,!0)):c?(e.processY(-g,0,!1,!0),i.processY(g,0,!0)):(e.processY(-g,i.velocity.y,!1,!0),i.processY(g,null,!0)):3===t&&(d?(e.processY(0,null,!0),i.processY(-v,0,!1,!0)):l?(e.processY(g,0,!0),i.processY(-g,0,!1,!0)):(e.processY(g,i.velocity.y,!0),i.processY(-g,null,!1,!0)))}return!0};t.exports={BlockCheck:y,Check:function(){var t=e.velocity.y,s=i.velocity.y,r=Math.sqrt(s*s*i.mass/e.mass)*(s>0?1:-1),o=Math.sqrt(t*t*e.mass/i.mass)*(t>0?1:-1),h=.5*(r+o);return o-=h,n=h+(r-=h)*e.bounce.y,a=h+o*i.bounce.y,l&&m?x(0):c&&g?x(1):u&&g?x(2):!(!f||!m)&&x(3)},Set:function(t,n,a){i=n;var x=(e=t).velocity.y,T=i.velocity.y;return s=e.pushable,l=e._dy<0,u=e._dy>0,d=0===e._dy,g=Math.abs(e.bottom-i.y)<=Math.abs(i.bottom-e.y),o=T-x*e.bounce.y,r=i.pushable,c=i._dy<0,f=i._dy>0,p=0===i._dy,m=!g,h=x-T*i.bounce.y,v=Math.abs(a),y()},Run:x,RunImmovableBody1:function(t){if(1===t?i.velocity.y=0:g?i.processY(v,h,!0):i.processY(-v,h,!1,!0),e.moves){var s=e.directControl?e.x-e.autoFrame.x:e.x-e.prev.x;i.x+=s*e.friction.x,i._dx=i.x-i.prev.x}},RunImmovableBody2:function(t){if(2===t?e.velocity.y=0:m?e.processY(v,o,!0):e.processY(-v,o,!1,!0),i.moves){var s=i.directControl?i.x-i.autoFrame.x:i.x-i.prev.x;e.x+=s*i.friction.x,e._dx=e.x-e.prev.x}}}},14087(t,e,i){var s=i(64897),r=i(3017);t.exports=function(t,e,i,n,a){void 0===a&&(a=s(t,e,i,n));var o=t.immovable,h=e.immovable;if(i||0===a||o&&h||t.customSeparateX||e.customSeparateX)return 0!==a||t.embedded&&e.embedded;var l=r.Set(t,e,a);return o||h?(o?r.RunImmovableBody1(l):h&&r.RunImmovableBody2(l),!0):l>0||r.Check()}},89936(t,e,i){var s=i(45170),r=i(47962);t.exports=function(t,e,i,n,a){void 0===a&&(a=s(t,e,i,n));var o=t.immovable,h=e.immovable;if(i||0===a||o&&h||t.customSeparateY||e.customSeparateY)return 0!==a||t.embedded&&e.embedded;var l=r.Set(t,e,a);return o||h?(o?r.RunImmovableBody1(l):h&&r.RunImmovableBody2(l),!0):l>0||r.Check()}},95829(t){t.exports=function(t,e){return void 0===e&&(e={}),e.none=t,e.up=!1,e.down=!1,e.left=!1,e.right=!1,t||(e.up=!0,e.down=!0,e.left=!0,e.right=!0),e}},72624(t,e,i){var s=i(87902),r=i(83419),n=i(78389),a=i(37747),o=i(37303),h=i(95829),l=i(26099),u=new r({Mixins:[n],initialize:function(t,e){var i=64,s=64,r=void 0!==e;r&&e.displayWidth&&(i=e.displayWidth,s=e.displayHeight),r||(e={x:0,y:0,angle:0,rotation:0,scaleX:1,scaleY:1,displayOriginX:0,displayOriginY:0}),this.world=t,this.gameObject=r?e:void 0,this.isBody=!0,this.debugShowBody=t.defaults.debugShowStaticBody,this.debugBodyColor=t.defaults.staticBodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new l,this.position=new l(e.x-i*e.originX,e.y-s*e.originY),this.width=i,this.height=s,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center=new l(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.velocity=l.ZERO,this.allowGravity=!1,this.gravity=l.ZERO,this.bounce=l.ZERO,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.mass=1,this.immovable=!0,this.pushable=!1,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision=h(!1),this.touching=h(!0),this.wasTouching=h(!0),this.blocked=h(!0),this.physicsType=a.STATIC_BODY,this.collisionCategory=1,this.collisionMask=1,this._dx=0,this._dy=0},setGameObject:function(t,e,i){if(void 0===e&&(e=!0),void 0===i&&(i=!0),!t||!t.hasTransformComponent)return this;var s=this.world;return this.gameObject&&this.gameObject.body&&(s.disable(this.gameObject),this.gameObject.body=null),t.body&&s.disable(t),this.gameObject=t,t.body=this,this.setSize(),e&&this.updateFromGameObject(),this.enable=i,this},updateFromGameObject:function(){this.world.staticTree.remove(this);var t=this.gameObject;return t.getTopLeft(this.position),this.width=t.displayWidth,this.height=t.displayHeight,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.world.staticTree.insert(this),this},setOffset:function(t,e){return void 0===e&&(e=t),this.world.staticTree.remove(this),this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(t,e),this.position.x+=this.offset.x,this.position.y+=this.offset.y,this.updateCenter(),this.world.staticTree.insert(this),this},setSize:function(t,e,i){void 0===i&&(i=!0);var s=this.gameObject;if(s&&s.frame&&(t||(t=s.frame.realWidth),e||(e=s.frame.realHeight)),this.world.staticTree.remove(this),this.width=t,this.height=e,this.halfWidth=Math.floor(t/2),this.halfHeight=Math.floor(e/2),i&&s&&s.getCenter){var r=s.displayWidth/2,n=s.displayHeight/2;this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(r-this.halfWidth,n-this.halfHeight),this.position.x+=this.offset.x,this.position.y+=this.offset.y}return this.updateCenter(),this.isCircle=!1,this.radius=0,this.world.staticTree.insert(this),this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.world.staticTree.remove(this),this.isCircle=!0,this.radius=t,this.width=2*t,this.height=2*t,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter(),this.world.staticTree.insert(this)):this.isCircle=!1,this},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},reset:function(t,e){var i=this.gameObject;void 0===t&&(t=i.x),void 0===e&&(e=i.y),this.world.staticTree.remove(this),i.setPosition(t,e),i.getTopLeft(this.position),this.position.x+=this.offset.x,this.position.y+=this.offset.y,this.updateCenter(),this.world.staticTree.insert(this)},stop:function(){return this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?s(this,t,e):o(this,t,e)},postUpdate:function(){},deltaAbsX:function(){return 0},deltaAbsY:function(){return 0},deltaX:function(){return 0},deltaY:function(){return 0},deltaZ:function(){return 0},destroy:function(){this.enable=!1,this.world.pendingDestroy.add(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,s=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(t.defaultStrokeWidth,this.debugBodyColor,1),this.isCircle?t.strokeCircle(i,s,this.width/2):t.strokeRect(e.x,e.y,this.width,this.height))},willDrawDebug:function(){return this.debugShowBody},setMass:function(t){return t<=0&&(t=.1),this.mass=t,this},x:{get:function(){return this.position.x},set:function(t){this.world.staticTree.remove(this),this.position.x=t,this.world.staticTree.insert(this)}},y:{get:function(){return this.position.y},set:function(t){this.world.staticTree.remove(this),this.position.y=t,this.world.staticTree.insert(this)}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=u},71464(t,e,i){var s=i(13759),r=i(83419),n=i(78389),a=i(37747),o=i(95540),h=i(26479),l=i(41212),u=new r({Extends:h,Mixins:[n],initialize:function(t,e,i,r){i||r?l(i)?(r=i,i=null,r.internalCreateCallback=this.createCallbackHandler,r.internalRemoveCallback=this.removeCallbackHandler,r.createMultipleCallback=this.createMultipleCallbackHandler,r.classType=o(r,"classType",s)):Array.isArray(i)&&l(i[0])?(r=i,i=null,r.forEach(function(t){t.internalCreateCallback=this.createCallbackHandler,t.internalRemoveCallback=this.removeCallbackHandler,t.createMultipleCallback=this.createMultipleCallbackHandler,t.classType=o(t,"classType",s)},this)):r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler}:r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler,createMultipleCallback:this.createMultipleCallbackHandler,classType:s},this.world=t,this.physicsType=a.STATIC_BODY,this.collisionCategory=1,this.collisionMask=1,h.call(this,e,i,r),this.type="StaticPhysicsGroup"},createCallbackHandler:function(t){t.body&&t.body.physicsType===a.STATIC_BODY||(t.body&&(t.body.destroy(),t.body=null),this.world.enableBody(t,a.STATIC_BODY))},removeCallbackHandler:function(t){t.body&&this.world.disableBody(t)},createMultipleCallbackHandler:function(){this.refresh()},refresh:function(){for(var t=Array.from(this.children),e=0;e=s;if(this.fixedStep||(i=.001*e,n=!0,this._elapsed=0),r.forEach(function(t){t.enable&&t.preUpdate(n,i)}),n){this._elapsed-=s,this.stepsLastFrame=1,this.useTree&&(this.tree.clear(),this.tree.load(Array.from(r)));for(var a=this.colliders.update(),o=0;o=s;)this._elapsed-=s,this.step(i)}},step:function(t){var e=this.bodies;e.forEach(function(e){e.enable&&e.update(t)}),this.useTree&&(this.tree.clear(),this.tree.load(Array.from(e)));for(var i=this.colliders.update(),s=0;s0){var r=this.tree,n=this.staticTree;s.forEach(function(i){i.physicsType===h.DYNAMIC_BODY?(r.remove(i),t.delete(i)):i.physicsType===h.STATIC_BODY&&(n.remove(i),e.delete(i)),i.world=void 0,i.gameObject=void 0}),s.clear()}},updateMotion:function(t,e){t.allowRotation&&this.computeAngularVelocity(t,e),this.computeVelocity(t,e)},computeAngularVelocity:function(t,e){var i=t.angularVelocity,s=t.angularAcceleration,r=t.angularDrag,a=t.maxAngular;s?i+=s*e:t.allowDrag&&r&&(p(i-(r*=e),0,.1)?i-=r:g(i+r,0,.1)?i+=r:i=0);var o=(i=n(i,-a,a))-t.angularVelocity;t.angularVelocity+=o,t.rotation+=t.angularVelocity*e},computeVelocity:function(t,e){var i=t.velocity.x,s=t.acceleration.x,r=t.drag.x,a=t.maxVelocity.x,o=t.velocity.y,h=t.acceleration.y,l=t.drag.y,u=t.maxVelocity.y,d=t.speed,c=t.maxSpeed,m=t.allowDrag,v=t.useDamping;t.allowGravity&&(i+=(this.gravity.x+t.gravity.x)*e,o+=(this.gravity.y+t.gravity.y)*e),s?i+=s*e:m&&r&&(v?(i*=r=Math.pow(r,e),d=Math.sqrt(i*i+o*o),f(d,0,.001)&&(i=0)):p(i-(r*=e),0,.01)?i-=r:g(i+r,0,.01)?i+=r:i=0),h?o+=h*e:m&&l&&(v?(o*=l=Math.pow(l,e),d=Math.sqrt(i*i+o*o),f(d,0,.001)&&(o=0)):p(o-(l*=e),0,.01)?o-=l:g(o+l,0,.01)?o+=l:o=0),i=n(i,-a,a),o=n(o,-u,u),t.velocity.set(i,o),c>-1&&t.velocity.length()>c&&(t.velocity.normalize().scale(c),d=c),t.speed=d},separate:function(t,e,i,s,r){var n,a,o=!1,h=!0;if(!t.enable||!e.enable||t.checkCollision.none||e.checkCollision.none||!this.intersects(t,e))return o;if(i&&!1===i.call(s,t.gameObject||t,e.gameObject||e))return o;if(t.isCircle||e.isCircle){var l=this.separateCircle(t,e,r);l.result?(o=!0,h=!1):(n=l.x,a=l.y,h=!0)}if(h){var u=!1,d=!1,f=this.OVERLAP_BIAS;r?(u=A(t,e,r,f,n),d=_(t,e,r,f,a)):this.forceX||Math.abs(this.gravity.y+t.gravity.y)C&&(p=l(y,x,C,S)-w):x>E&&(yC&&(p=l(y,x,C,E)-w)),p*=-1}else p=t.halfWidth+e.halfWidth-u(a,o);t.overlapR=p,e.overlapR=p;var A=s(a,o),_=(p+T.EPSILON)*Math.cos(A),M=(p+T.EPSILON)*Math.sin(A),R={overlap:p,result:!1,x:_,y:M};if(i&&(!g||g&&0!==p))return R.result=!0,R;if(!g&&0===p||h&&d||t.customSeparateX||e.customSeparateX)return R.x=void 0,R.y=void 0,R;var P=!t.pushable&&!e.pushable;if(g){var O=a.x-o.x,L=a.y-o.y,D=Math.sqrt(Math.pow(O,2)+Math.pow(L,2)),F=(o.x-a.x)/D||0,I=(o.y-a.y)/D||0,N=2*(c.x*F+c.y*I-f.x*F-f.y*I)/(t.mass+e.mass);!h&&!d&&t.pushable&&e.pushable||(N*=2),!h&&t.pushable&&(c.x=c.x-N/t.mass*F,c.y=c.y-N/t.mass*I,c.multiply(t.bounce)),!d&&e.pushable&&(f.x=f.x+N/e.mass*F,f.y=f.y+N/e.mass*I,f.multiply(e.bounce)),h||d||(_*=.5,M*=.5),(!h||t.pushable||P)&&(t.x-=_,t.y-=M,t.updateCenter()),(!d||e.pushable||P)&&(e.x+=_,e.y+=M,e.updateCenter()),R.result=!0}else(!h||t.pushable||P)&&(t.x-=_,t.y-=M,t.updateCenter()),(!d||e.pushable||P)&&(e.x+=_,e.y+=M,e.updateCenter()),R.x=void 0,R.y=void 0;return R},intersects:function(t,e){return t!==e&&(t.isCircle||e.isCircle?t.isCircle?e.isCircle?u(t.center,e.center)<=t.halfWidth+e.halfWidth:this.circleBodyIntersects(t,e):this.circleBodyIntersects(e,t):!(t.right<=e.left||t.bottom<=e.top||t.left>=e.right||t.top>=e.bottom))},circleBodyIntersects:function(t,e){var i=n(t.center.x,e.left,e.right),s=n(t.center.y,e.top,e.bottom);return(t.center.x-i)*(t.center.x-i)+(t.center.y-s)*(t.center.y-s)<=t.halfWidth*t.halfWidth},overlap:function(t,e,i,s,r){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===r&&(r=i),this.collideObjects(t,e,i,s,r,!0)},collide:function(t,e,i,s,r){return void 0===i&&(i=null),void 0===s&&(s=null),void 0===r&&(r=i),this.collideObjects(t,e,i,s,r,!1)},collideObjects:function(t,e,i,s,r,n){var a,o;!t.isParent||void 0!==t.physicsType&&void 0!==e&&t!==e||(t=Array.from(t.children)),e&&e.isParent&&void 0===e.physicsType&&(e=Array.from(e.children));var h=Array.isArray(t),l=Array.isArray(e);if(this._total=0,h||l)if(!h&&l)for(a=0;a0},collideHandler:function(t,e,i,s,r,n){if(void 0===e&&t.isParent)return this.collideGroupVsGroup(t,t,i,s,r,n);if(!t||!e)return!1;if(t.body||t.isBody){if(e.body||e.isBody)return this.collideSpriteVsSprite(t,e,i,s,r,n);if(e.isParent)return this.collideSpriteVsGroup(t,e,i,s,r,n);if(e.isTilemap)return this.collideSpriteVsTilemapLayer(t,e,i,s,r,n)}else if(t.isParent){if(e.body||e.isBody)return this.collideSpriteVsGroup(e,t,i,s,r,n);if(e.isParent)return this.collideGroupVsGroup(t,e,i,s,r,n);if(e.isTilemap)return this.collideGroupVsTilemapLayer(t,e,i,s,r,n)}else if(t.isTilemap){if(e.body||e.isBody)return this.collideSpriteVsTilemapLayer(e,t,i,s,r,n);if(e.isParent)return this.collideGroupVsTilemapLayer(e,t,i,s,r,n)}},canCollide:function(t,e){return t&&e&&0!==(t.collisionMask&e.collisionCategory)&&0!==(e.collisionMask&t.collisionCategory)},collideSpriteVsSprite:function(t,e,i,s,r,n){var a=t.isBody?t:t.body,o=e.isBody?e:e.body;return!!this.canCollide(a,o)&&(this.separate(a,o,s,r,n)&&(i&&i.call(r,t,e),this._total++),!0)},collideSpriteVsGroup:function(t,e,i,s,r,n){var a,o,l,u=t.isBody?t:t.body;if(0!==e.getLength()&&u&&u.enable&&!u.checkCollision.none&&this.canCollide(u,e))if(this.useTree||e.physicsType===h.STATIC_BODY){var d=this.treeMinMax;d.minX=u.left,d.minY=u.top,d.maxX=u.right,d.maxY=u.bottom;var c=e.physicsType===h.DYNAMIC_BODY?this.tree.search(d):this.staticTree.search(d);for(o=c.length,a=0;a0&&(t.blocked.none=!1,t.blocked.right=!0),t.position.x-=e,t.updateCenter(),0===t.bounce.x?t.velocity.x=0:t.velocity.x=-t.velocity.x*t.bounce.x}},67013(t){t.exports=function(t,e){e<0?(t.blocked.none=!1,t.blocked.up=!0):e>0&&(t.blocked.none=!1,t.blocked.down=!0),t.position.y-=e,t.updateCenter(),0===t.bounce.y?t.velocity.y=0:t.velocity.y=-t.velocity.y*t.bounce.y}},40012(t,e,i){var s=i(21329),r=i(53442),n=i(2483);t.exports=function(t,e,i,a,o,h,l){var u=a.left,d=a.top,c=a.right,f=a.bottom,p=i.faceLeft||i.faceRight,g=i.faceTop||i.faceBottom;if(l||(p=!0,g=!0),!p&&!g)return!1;var m=0,v=0,y=0,x=1;if(e.deltaAbsX()>e.deltaAbsY()?y=-1:e.deltaAbsX()0&&u&&t.checkCollision.right&&h&&t.right>i&&(o=t.right-i)>n&&(o=0),0!==o&&(t.customSeparateX?t.overlapX=o:s(t,o)),o}},53442(t,e,i){var s=i(67013);t.exports=function(t,e,i,r,n,a){var o=0,h=e.faceTop,l=e.faceBottom,u=e.collideUp,d=e.collideDown;return a||(h=!0,l=!0,u=!0,d=!0),t.deltaY()<0&&d&&t.checkCollision.up?l&&t.y0&&u&&t.checkCollision.down&&h&&t.bottom>i&&(o=t.bottom-i)>n&&(o=0),0!==o&&(t.customSeparateY?t.overlapY=o:s(t,o)),o}},2483(t){t.exports=function(t,e){return!(e.right<=t.left||e.bottom<=t.top||e.position.x>=t.right||e.position.y>=t.bottom)}},55173(t,e,i){var s={ProcessTileCallbacks:i(96602),ProcessTileSeparationX:i(36294),ProcessTileSeparationY:i(67013),SeparateTile:i(40012),TileCheckX:i(21329),TileCheckY:i(53442),TileIntersectsBody:i(2483)};t.exports=s},44563(t,e,i){t.exports={Arcade:i(27064),Matter:i(3875)}},68174(t,e,i){var s=i(83419),r=i(26099),n=new s({initialize:function(){this.boundsCenter=new r,this.centerDiff=new r},parseBody:function(t){if(!(t=t.hasOwnProperty("body")?t.body:t).hasOwnProperty("bounds")||!t.hasOwnProperty("centerOfMass"))return!1;var e=this.boundsCenter,i=this.centerDiff,s=t.bounds.max.x-t.bounds.min.x,r=t.bounds.max.y-t.bounds.min.y,n=s*t.centerOfMass.x,a=r*t.centerOfMass.y;return e.set(s/2,r/2),i.set(n-e.x,a-e.y),!0},getTopLeft:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e+s.x+n.x,i+s.y+n.y)}return!1},getTopCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e+n.x,i+s.y+n.y)}return!1},getTopRight:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e-(s.x-n.x),i+s.y+n.y)}return!1},getLeftCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e+s.x+n.x,i+n.y)}return!1},getCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.centerDiff;return new r(e+s.x,i+s.y)}return!1},getRightCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e-(s.x-n.x),i+n.y)}return!1},getBottomLeft:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e+s.x+n.x,i-(s.y-n.y))}return!1},getBottomCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e+n.x,i-(s.y-n.y))}return!1},getBottomRight:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var s=this.boundsCenter,n=this.centerDiff;return new r(e-(s.x-n.x),i-(s.y-n.y))}return!1}});t.exports=n},19933(t,e,i){var s=i(6790);s.Body=i(22562),s.Composite=i(69351),s.World=i(4372),s.Collision=i(52284),s.Detector=i(81388),s.Pairs=i(99561),s.Pair=i(4506),s.Query=i(73296),s.Resolver=i(66272),s.Constraint=i(48140),s.Common=i(53402),s.Engine=i(48413),s.Events=i(35810),s.Sleeping=i(53614),s.Plugin=i(73832),s.Bodies=i(66280),s.Composites=i(74116),s.Axes=i(66615),s.Bounds=i(15647),s.Svg=i(74058),s.Vector=i(31725),s.Vertices=i(41598),s.World.add=s.Composite.add,s.World.remove=s.Composite.remove,s.World.addComposite=s.Composite.addComposite,s.World.addBody=s.Composite.addBody,s.World.addConstraint=s.Composite.addConstraint,s.World.clear=s.Composite.clear,t.exports=s},28137(t,e,i){var s=i(66280),r=i(83419),n=i(74116),a=i(48140),o=i(74058),h=i(75803),l=i(23181),u=i(34803),d=i(73834),c=i(19496),f=i(85791),p=i(98713),g=i(41598),m=new r({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},rectangle:function(t,e,i,r,n){var a=s.rectangle(t,e,i,r,n);return this.world.add(a),a},trapezoid:function(t,e,i,r,n,a){var o=s.trapezoid(t,e,i,r,n,a);return this.world.add(o),o},circle:function(t,e,i,r,n){var a=s.circle(t,e,i,r,n);return this.world.add(a),a},polygon:function(t,e,i,r,n){var a=s.polygon(t,e,i,r,n);return this.world.add(a),a},fromVertices:function(t,e,i,r,n,a,o){"string"==typeof i&&(i=g.fromPath(i));var h=s.fromVertices(t,e,i,r,n,a,o);return this.world.add(h),h},fromPhysicsEditor:function(t,e,i,s,r){void 0===r&&(r=!0);var n=c.parseBody(t,e,i,s);return r&&!this.world.has(n)&&this.world.add(n),n},fromSVG:function(t,e,i,r,n,a){void 0===r&&(r=1),void 0===n&&(n={}),void 0===a&&(a=!0);for(var h=i.getElementsByTagName("path"),l=[],u=0;u0},intersectPoint:function(t,e,i){i=this.getMatterBodies(i);var s=M.create(t,e),r=[];return C.point(i,s).forEach(function(t){-1===r.indexOf(t)&&r.push(t)}),r},intersectRect:function(t,e,i,s,r,n){void 0===r&&(r=!1),n=this.getMatterBodies(n);var a={min:{x:t,y:e},max:{x:t+i,y:e+s}},o=[];return C.region(n,a,r).forEach(function(t){-1===o.indexOf(t)&&o.push(t)}),o},intersectRay:function(t,e,i,s,r,n){void 0===r&&(r=1),n=this.getMatterBodies(n);for(var a=[],o=C.ray(n,M.create(t,e),M.create(i,s),r),h=0;h0?this.setFromTileCollision(i):this.setFromTileRectangle(i),s=this.body}if(e.flipX||e.flipY){var o={x:e.getCenterX(),y:e.getCenterY()},u=e.flipX?-1:1,d=e.flipY?-1:1;r.scale(s,u,d,o)}},setFromTileRectangle:function(t){void 0===t&&(t={}),u(t,"isStatic")||(t.isStatic=!0),u(t,"addToWorld")||(t.addToWorld=!0);var e=this.tile.getBounds(),i=e.x+e.width/2,r=e.y+e.height/2,n=s.rectangle(i,r,e.width,e.height,t);return this.setBody(n,t.addToWorld),this},setFromTileCollision:function(t){void 0===t&&(t={}),u(t,"isStatic")||(t.isStatic=!0),u(t,"addToWorld")||(t.addToWorld=!0);for(var e=this.tile.tilemapLayer.scaleX,i=this.tile.tilemapLayer.scaleY,n=this.tile.getLeft(),a=this.tile.getTop(),h=this.tile.getCollisionGroup(),c=l(h,"objects",[]),f=[],p=0;p1){var C=o(t);C.parts=f,this.setBody(r.create(C),C.addToWorld)}return this},setBody:function(t,e){return void 0===e&&(e=!0),this.body&&this.removeBody(),this.body=t,this.body.gameObject=this,e&&this.world.add(this.body),this},removeBody:function(){return this.body&&(this.world.remove(this.body),this.body.gameObject=void 0,this.body=void 0),this},destroy:function(){this.removeBody(),this.tile.physics.matterBody=void 0,this.removeAllListeners()}});t.exports=c},19496(t,e,i){var s=i(66280),r=i(22562),n=i(53402),a=i(95540),o=i(41598),h={parseBody:function(t,e,i,s){void 0===s&&(s={});for(var o=a(i,"fixtures",[]),h=[],l=0;l1?1:0;r0&&r.map(function(t){i=t.bodyA,s=t.bodyB,i.gameObject&&i.gameObject.emit("collide",i,s,t),s.gameObject&&s.gameObject.emit("collide",s,i,t),p.trigger(i,"onCollide",{pair:t}),p.trigger(s,"onCollide",{pair:t}),i.onCollideCallback&&i.onCollideCallback(t),s.onCollideCallback&&s.onCollideCallback(t),i.onCollideWith[s.id]&&i.onCollideWith[s.id](s,t),s.onCollideWith[i.id]&&s.onCollideWith[i.id](i,t)}),t.emit(u.COLLISION_START,e,i,s)}),p.on(e,"collisionActive",function(e){var i,s,r=e.pairs;r.length>0&&r.map(function(t){i=t.bodyA,s=t.bodyB,i.gameObject&&i.gameObject.emit("collideActive",i,s,t),s.gameObject&&s.gameObject.emit("collideActive",s,i,t),p.trigger(i,"onCollideActive",{pair:t}),p.trigger(s,"onCollideActive",{pair:t}),i.onCollideActiveCallback&&i.onCollideActiveCallback(t),s.onCollideActiveCallback&&s.onCollideActiveCallback(t)}),t.emit(u.COLLISION_ACTIVE,e,i,s)}),p.on(e,"collisionEnd",function(e){var i,s,r=e.pairs;r.length>0&&r.map(function(t){i=t.bodyA,s=t.bodyB,i.gameObject&&i.gameObject.emit("collideEnd",i,s,t),s.gameObject&&s.gameObject.emit("collideEnd",s,i,t),p.trigger(i,"onCollideEnd",{pair:t}),p.trigger(s,"onCollideEnd",{pair:t}),i.onCollideEndCallback&&i.onCollideEndCallback(t),s.onCollideEndCallback&&s.onCollideEndCallback(t)}),t.emit(u.COLLISION_END,e,i,s)})},setBounds:function(t,e,i,s,r,n,a,o,h){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===s&&(s=this.scene.sys.scale.height),void 0===r&&(r=64),void 0===n&&(n=!0),void 0===a&&(a=!0),void 0===o&&(o=!0),void 0===h&&(h=!0),this.updateWall(n,"left",t-r,e-r,r,s+2*r),this.updateWall(a,"right",t+i,e-r,r,s+2*r),this.updateWall(o,"top",t,e-r,i,r),this.updateWall(h,"bottom",t,e+s,i,r),this},updateWall:function(t,e,i,s,r,n){var a=this.walls[e];t?(a&&m.remove(this.localWorld,a),i+=r/2,s+=n/2,this.walls[e]=this.create(i,s,r,n,{isStatic:!0,friction:0,frictionStatic:0})):(a&&m.remove(this.localWorld,a),this.walls[e]=null)},createDebugGraphic:function(){var t=this.scene.sys.add.graphics({x:0,y:0});return t.setDepth(Number.MAX_VALUE),this.debugGraphic=t,this.drawDebug=!0,t},disableGravity:function(){return this.localWorld.gravity.x=0,this.localWorld.gravity.y=0,this.localWorld.gravity.scale=0,this},setGravity:function(t,e,i){return void 0===t&&(t=0),void 0===e&&(e=1),void 0===i&&(i=.001),this.localWorld.gravity.x=t,this.localWorld.gravity.y=e,this.localWorld.gravity.scale=i,this},create:function(t,e,i,r,n){var a=s.rectangle(t,e,i,r,n);return m.add(this.localWorld,a),a},add:function(t){return m.add(this.localWorld,t),this},remove:function(t,e){Array.isArray(t)||(t=[t]);for(var i=0;iMath.max(v._maxFrameDelta,i.maxFrameTime))&&(o=i.frameDelta||v._frameDeltaFallback),i.frameDeltaSmoothing){i.frameDeltaHistory.push(o),i.frameDeltaHistory=i.frameDeltaHistory.slice(-i.frameDeltaHistorySize);var l=i.frameDeltaHistory.slice(0).sort(),u=i.frameDeltaHistory.slice(l.length*v._smoothingLowerBound,l.length*v._smoothingUpperBound);o=v._mean(u)||o}i.frameDeltaSnapping&&(o=1e3/Math.round(1e3/o)),i.frameDelta=o,i.timeLastTick=t,i.timeBuffer+=i.frameDelta,i.timeBuffer=a.clamp(i.timeBuffer,0,i.frameDelta+r*v._timeBufferMargin),i.lastUpdatesDeferred=0;for(var d=i.maxUpdates||Math.ceil(i.maxFrameTime/r),c=a.now();r>0&&i.timeBuffer>=r*v._timeBufferMargin;){h.update(e,r),i.timeBuffer-=r,n+=1;var f=a.now()-s,p=a.now()-c,g=f+v._elapsedNextEstimate*p/n;if(n>=d||g>i.maxFrameTime){i.lastUpdatesDeferred=Math.round(Math.max(0,i.timeBuffer/r-v._timeBufferMargin));break}}}},step:function(t){h.update(this.engine,t)},update60Hz:function(){return 1e3/60},update30Hz:function(){return 1e3/30},has:function(t){var e=t.hasOwnProperty("body")?t.body:t;return null!==o.get(this.localWorld,e.id,e.type)},getAllBodies:function(){return o.allBodies(this.localWorld)},getAllConstraints:function(){return o.allConstraints(this.localWorld)},getAllComposites:function(){return o.allComposites(this.localWorld)},postUpdate:function(){if(this.drawDebug){var t=this.debugConfig,e=this.engine,i=this.debugGraphic,s=o.allBodies(this.localWorld);this.debugGraphic.clear(),t.showBroadphase&&e.broadphase.controller&&this.renderGrid(e.broadphase,i,t.broadphaseColor,.5),t.showBounds&&this.renderBodyBounds(s,i,t.boundsColor,.5),(t.showBody||t.showStaticBody)&&this.renderBodies(s),t.showJoint&&this.renderJoints(),(t.showAxes||t.showAngleIndicator)&&this.renderBodyAxes(s,i,t.showAxes,t.angleColor,.5),t.showVelocity&&this.renderBodyVelocity(s,i,t.velocityColor,1,2),t.showSeparations&&this.renderSeparations(e.pairs.list,i,t.separationColor),t.showCollisions&&this.renderCollisions(e.pairs.list,i,t.collisionColor)}},renderGrid:function(t,e,i,s){e.lineStyle(1,i,s);for(var r=a.keys(t.buckets),n=0;n0){var l=h[0].vertex.x,u=h[0].vertex.y;2===r.contactCount&&(l=(h[0].vertex.x+h[1].vertex.x)/2,u=(h[0].vertex.y+h[1].vertex.y)/2),o.bodyB===o.supports[0].body||o.bodyA.isStatic?e.lineBetween(l-8*o.normal.x,u-8*o.normal.y,l,u):e.lineBetween(l+8*o.normal.x,u+8*o.normal.y,l,u)}}return this},renderBodyBounds:function(t,e,i,s){e.lineStyle(1,i,s);for(var r=0;r1?1:0;h1?1:0;o1?1:0;o1&&this.renderConvexHull(g,e,f,y)}}},renderBody:function(t,e,i,s,r,n,a,o){void 0===s&&(s=null),void 0===r&&(r=null),void 0===n&&(n=1),void 0===a&&(a=null),void 0===o&&(o=null);for(var h=this.debugConfig,l=h.sensorFillColor,u=h.sensorLineColor,d=t.parts,c=d.length,f=c>1?1:0;f1){var r=t.vertices;e.lineStyle(s,i),e.beginPath(),e.moveTo(r[0].x,r[0].y);for(var n=1;n0&&(e.fillStyle(o),e.fillCircle(u.x,u.y,h),e.fillCircle(d.x,d.y,h)),this},resetCollisionIDs:function(){return r._nextCollidingGroupId=1,r._nextNonCollidingGroupId=-1,r._nextCategory=1,this},shutdown:function(){p.off(this.engine),this.removeAllListeners(),m.clear(this.localWorld,!1),h.clear(this.engine),this.drawDebug&&this.debugGraphic.destroy()},destroy:function(){this.shutdown()}});t.exports=x},70410(t){t.exports={setBounce:function(t){return this.body.restitution=t,this}}},66968(t){var e={setCollisionCategory:function(t){return this.body.collisionFilter.category=t,this},setCollisionGroup:function(t){return this.body.collisionFilter.group=t,this},setCollidesWith:function(t){var e=0;if(Array.isArray(t))for(var i=0;i0&&n.rotateAbout(o.position,s,t.position,o.position)}},s.setVelocity=function(t,e){var i=t.deltaTime/s._baseDelta;t.positionPrev.x=t.position.x-e.x*i,t.positionPrev.y=t.position.y-e.y*i,t.velocity.x=(t.position.x-t.positionPrev.x)/i,t.velocity.y=(t.position.y-t.positionPrev.y)/i,t.speed=n.magnitude(t.velocity)},s.getVelocity=function(t){var e=s._baseDelta/t.deltaTime;return{x:(t.position.x-t.positionPrev.x)*e,y:(t.position.y-t.positionPrev.y)*e}},s.getSpeed=function(t){return n.magnitude(s.getVelocity(t))},s.setSpeed=function(t,e){s.setVelocity(t,n.mult(n.normalise(s.getVelocity(t)),e))},s.setAngularVelocity=function(t,e){var i=t.deltaTime/s._baseDelta;t.anglePrev=t.angle-e*i,t.angularVelocity=(t.angle-t.anglePrev)/i,t.angularSpeed=Math.abs(t.angularVelocity)},s.getAngularVelocity=function(t){return(t.angle-t.anglePrev)*s._baseDelta/t.deltaTime},s.getAngularSpeed=function(t){return Math.abs(s.getAngularVelocity(t))},s.setAngularSpeed=function(t,e){s.setAngularVelocity(t,o.sign(s.getAngularVelocity(t))*e)},s.translate=function(t,e,i){s.setPosition(t,n.add(t.position,e),i)},s.rotate=function(t,e,i,r){if(i){var n=Math.cos(e),a=Math.sin(e),o=t.position.x-i.x,h=t.position.y-i.y;s.setPosition(t,{x:i.x+(o*n-h*a),y:i.y+(o*a+h*n)},r),s.setAngle(t,t.angle+e,r)}else s.setAngle(t,t.angle+e,r)},s.scale=function(t,e,i,n){var a=0,o=0;n=n||t.position;for(var u=t.inertia===1/0,d=0;d0&&(a+=c.area,o+=c.inertia),c.position.x=n.x+(c.position.x-n.x)*e,c.position.y=n.y+(c.position.y-n.y)*i,h.update(c.bounds,c.vertices,t.velocity)}t.parts.length>1&&(t.area=a,t.isStatic||(s.setMass(t,t.density*a),s.setInertia(t,o))),t.circleRadius&&(e===i?t.circleRadius*=e:t.circleRadius=null),u&&s.setInertia(t,1/0)},s.update=function(t,e){var i=(e=(void 0!==e?e:1e3/60)*t.timeScale)*e,a=s._timeCorrection?e/(t.deltaTime||e):1,u=1-t.frictionAir*(e/o._baseDelta),d=(t.position.x-t.positionPrev.x)*a,c=(t.position.y-t.positionPrev.y)*a;t.velocity.x=d*u+t.force.x/t.mass*i,t.velocity.y=c*u+t.force.y/t.mass*i,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.position.x+=t.velocity.x,t.position.y+=t.velocity.y,t.deltaTime=e,t.angularVelocity=(t.angle-t.anglePrev)*u*a+t.torque/t.inertia*i,t.anglePrev=t.angle,t.angle+=t.angularVelocity,t.speed=n.magnitude(t.velocity),t.angularSpeed=Math.abs(t.angularVelocity);for(var f=0;f0&&(p.position.x+=t.velocity.x,p.position.y+=t.velocity.y),0!==t.angularVelocity&&(r.rotate(p.vertices,t.angularVelocity,t.position),l.rotate(p.axes,t.angularVelocity),f>0&&n.rotateAbout(p.position,t.angularVelocity,t.position,p.position)),h.update(p.bounds,p.vertices,t.velocity)}},s.updateVelocities=function(t){var e=s._baseDelta/t.deltaTime,i=t.velocity;i.x=(t.position.x-t.positionPrev.x)*e,i.y=(t.position.y-t.positionPrev.y)*e,t.speed=Math.sqrt(i.x*i.x+i.y*i.y),t.angularVelocity=(t.angle-t.anglePrev)*e,t.angularSpeed=Math.abs(t.angularVelocity)},s.applyForce=function(t,e,i){var s=e.x-t.position.x,r=e.y-t.position.y;t.force.x+=i.x,t.force.y+=i.y,t.torque+=s*i.y-r*i.x},s._totalProperties=function(t){for(var e={mass:0,area:0,inertia:0,centre:{x:0,y:0}},i=1===t.parts.length?0:1;i=0&&(v=-v,y=-y),d.x=v,d.y=y,c.x=-y,c.y=v,f.x=v*g,f.y=y*g,r.depth=g;var x=s._findSupports(t,e,d,1),T=0;if(o.contains(t.vertices,x[0])&&(p[T++]=x[0]),o.contains(t.vertices,x[1])&&(p[T++]=x[1]),T<2){var w=s._findSupports(e,t,d,-1);o.contains(e.vertices,w[0])&&(p[T++]=w[0]),T<2&&o.contains(e.vertices,w[1])&&(p[T++]=w[1])}return 0===T&&(p[T++]=x[0]),r.supportCount=T,r},s._overlapAxes=function(t,e,i,s){var r,n,a,o,h,l,u=e.length,d=i.length,c=e[0].x,f=e[0].y,p=i[0].x,g=i[0].y,m=s.length,v=Number.MAX_VALUE,y=0;for(h=0;hC?C=o:oE?E=o:op)break;if(!(gM.max.y)&&(!v||!T.isStatic&&!T.isSleeping)&&h(c.collisionFilter,T.collisionFilter)){var w=T.parts.length;if(x&&1===w)(A=l(c,T,r))&&(u[d++]=A);else for(var b=w>1?1:0,S=y>1?1:0;SM.max.x||f.max.xM.max.y||(A=l(C,_,r))&&(u[d++]=A)}}}}return u.length!==d&&(u.length=d),u},s.canCollide=function(t,e){return t.group===e.group&&0!==t.group?t.group>0:0!==(t.mask&e.category)&&0!==(e.mask&t.category)},s._compareBoundsX=function(t,e){return t.bounds.min.x-e.bounds.min.x}},4506(t,e,i){var s={};t.exports=s;var r=i(43424);s.create=function(t,e){var i=t.bodyA,n=t.bodyB,a={id:s.id(i,n),bodyA:i,bodyB:n,collision:t,contacts:[r.create(),r.create()],contactCount:0,separation:0,isActive:!0,isSensor:i.isSensor||n.isSensor,timeCreated:e,timeUpdated:e,inverseMass:0,friction:0,frictionStatic:0,restitution:0,slop:0};return s.update(a,t,e),a},s.update=function(t,e,i){var s=e.supports,r=e.supportCount,n=t.contacts,a=e.parentA,o=e.parentB;t.isActive=!0,t.timeUpdated=i,t.collision=e,t.separation=e.depth,t.inverseMass=a.inverseMass+o.inverseMass,t.friction=a.frictiono.frictionStatic?a.frictionStatic:o.frictionStatic,t.restitution=a.restitution>o.restitution?a.restitution:o.restitution,t.slop=a.slop>o.slop?a.slop:o.slop,t.contactCount=r,e.pair=t;var h=s[0],l=n[0],u=s[1],d=n[1];d.vertex!==h&&l.vertex!==u||(n[1]=l,n[0]=l=d,d=n[1]),l.vertex=h,d.vertex=u},s.setActive=function(t,e,i){e?(t.isActive=!0,t.timeUpdated=i):(t.isActive=!1,t.contactCount=0)},s.id=function(t,e){return t.id=i?d[f++]=n:(l(n,!1,i),n.collision.bodyA.sleepCounter>0&&n.collision.bodyB.sleepCounter>0?d[f++]=n:(g[x++]=n,delete u[n.id]));d.length!==f&&(d.length=f),p.length!==y&&(p.length=y),g.length!==x&&(g.length=x),m.length!==T&&(m.length=T)},s.clear=function(t){return t.table={},t.list.length=0,t.collisionStart.length=0,t.collisionActive.length=0,t.collisionEnd.length=0,t}},73296(t,e,i){var s={};t.exports=s;var r=i(31725),n=i(52284),a=i(15647),o=i(66280),h=i(41598);s.collides=function(t,e){for(var i=[],s=e.length,r=t.bounds,o=n.collides,h=a.overlaps,l=0;lH?(r=W>0?W:-W,(i=g.friction*(W>0?1:-1)*l)<-r?i=-r:i>r&&(i=r)):(i=W,r=f);var j=N*T-B*x,q=k*T-U*x,K=_/(S+v.inverseInertia*j*j+y.inverseInertia*q*q),Z=(1+g.restitution)*X*K;if(i*=K,X0&&(F.normalImpulse=0),Z=F.normalImpulse-Q}if(W<-d||W>d)F.tangentImpulse=0;else{var J=F.tangentImpulse;F.tangentImpulse+=i,F.tangentImpulse<-r&&(F.tangentImpulse=-r),F.tangentImpulse>r&&(F.tangentImpulse=r),i=F.tangentImpulse-J}var $=x*Z+w*i,tt=T*Z+b*i;v.isStatic||v.isSleeping||(v.positionPrev.x+=$*v.inverseMass,v.positionPrev.y+=tt*v.inverseMass,v.anglePrev+=(N*tt-B*$)*v.inverseInertia),y.isStatic||y.isSleeping||(y.positionPrev.x-=$*y.inverseMass,y.positionPrev.y-=tt*y.inverseMass,y.anglePrev-=(k*tt-U*$)*y.inverseInertia)}}}}},48140(t,e,i){var s={};t.exports=s;var r=i(41598),n=i(31725),a=i(53614),o=i(15647),h=i(66615),l=i(53402);s._warming=.4,s._torqueDampen=1,s._minLength=1e-6,s.create=function(t){var e=t;e.bodyA&&!e.pointA&&(e.pointA={x:0,y:0}),e.bodyB&&!e.pointB&&(e.pointB={x:0,y:0});var i=e.bodyA?n.add(e.bodyA.position,e.pointA):e.pointA,s=e.bodyB?n.add(e.bodyB.position,e.pointB):e.pointB,r=n.magnitude(n.sub(i,s));e.length=void 0!==e.length?e.length:r,e.id=e.id||l.nextId(),e.label=e.label||"Constraint",e.type="constraint",e.stiffness=e.stiffness||(e.length>0?1:.7),e.damping=e.damping||0,e.angularStiffness=e.angularStiffness||0,e.angleA=e.bodyA?e.bodyA.angle:e.angleA,e.angleB=e.bodyB?e.bodyB.angle:e.angleB,e.plugin={};var a={visible:!0,type:"line",anchors:!0,lineColor:null,lineOpacity:null,lineThickness:null,pinSize:null,anchorColor:null,anchorSize:null};return 0===e.length&&e.stiffness>.1?(a.type="pin",a.anchors=!1):e.stiffness<.9&&(a.type="spring"),e.render=l.extend(a,e.render),e},s.preSolveAll=function(t){for(var e=0;e=1||0===t.length?t.stiffness*e:t.stiffness*e*e,x=t.damping*e,T=n.mult(u,v*y),w=(i?i.inverseMass:0)+(r?r.inverseMass:0),b=w+((i?i.inverseInertia:0)+(r?r.inverseInertia:0));if(x>0){var S=n.create();p=n.div(u,d),m=n.sub(r&&n.sub(r.position,r.positionPrev)||S,i&&n.sub(i.position,i.positionPrev)||S),g=n.dot(p,m)}i&&!i.isStatic&&(f=i.inverseMass/w,i.constraintImpulse.x-=T.x*f,i.constraintImpulse.y-=T.y*f,i.position.x-=T.x*f,i.position.y-=T.y*f,x>0&&(i.positionPrev.x-=x*p.x*g*f,i.positionPrev.y-=x*p.y*g*f),c=n.cross(a,T)/b*s._torqueDampen*i.inverseInertia*(1-t.angularStiffness),i.constraintImpulse.angle-=c,i.angle-=c),r&&!r.isStatic&&(f=r.inverseMass/w,r.constraintImpulse.x+=T.x*f,r.constraintImpulse.y+=T.y*f,r.position.x+=T.x*f,r.position.y+=T.y*f,x>0&&(r.positionPrev.x+=x*p.x*g*f,r.positionPrev.y+=x*p.y*g*f),c=n.cross(o,T)/b*s._torqueDampen*r.inverseInertia*(1-t.angularStiffness),r.constraintImpulse.angle+=c,r.angle+=c)}}},s.postSolveAll=function(t){for(var e=0;e0&&(d.position.x+=l.x,d.position.y+=l.y),0!==l.angle&&(r.rotate(d.vertices,l.angle,i.position),h.rotate(d.axes,l.angle),u>0&&n.rotateAbout(d.position,l.angle,i.position,d.position)),o.update(d.bounds,d.vertices,i.velocity)}l.angle*=s._warming,l.x*=s._warming,l.y*=s._warming}}},s.pointAWorld=function(t){return{x:(t.bodyA?t.bodyA.position.x:0)+(t.pointA?t.pointA.x:0),y:(t.bodyA?t.bodyA.position.y:0)+(t.pointA?t.pointA.y:0)}},s.pointBWorld=function(t){return{x:(t.bodyB?t.bodyB.position.x:0)+(t.pointB?t.pointB.x:0),y:(t.bodyB?t.bodyB.position.y:0)+(t.pointB?t.pointB.y:0)}},s.currentLength=function(t){var e=(t.bodyA?t.bodyA.position.x:0)+(t.pointA?t.pointA.x:0),i=(t.bodyA?t.bodyA.position.y:0)+(t.pointA?t.pointA.y:0),s=e-((t.bodyB?t.bodyB.position.x:0)+(t.pointB?t.pointB.x:0)),r=i-((t.bodyB?t.bodyB.position.y:0)+(t.pointB?t.pointB.y:0));return Math.sqrt(s*s+r*r)}},53402(t,e,i){var s={};t.exports=s,function(){s._baseDelta=1e3/60,s._nextId=0,s._seed=0,s._nowStartTime=+new Date,s._warnedOnce={},s._decomp=null,s.extend=function(t,e){var i,r;"boolean"==typeof e?(i=2,r=e):(i=1,r=!0);for(var n=i;n0;e--){var i=Math.floor(s.random()*(e+1)),r=t[e];t[e]=t[i],t[i]=r}return t},s.choose=function(t){return t[Math.floor(s.random()*t.length)]},s.isElement=function(t){return"undefined"!=typeof HTMLElement?t instanceof HTMLElement:!!(t&&t.nodeType&&t.nodeName)},s.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},s.isFunction=function(t){return"function"==typeof t},s.isPlainObject=function(t){return"object"==typeof t&&t.constructor===Object},s.isString=function(t){return"[object String]"===toString.call(t)},s.clamp=function(t,e,i){return ti?i:t},s.sign=function(t){return t<0?-1:1},s.now=function(){if("undefined"!=typeof window&&window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return Date.now?Date.now():new Date-s._nowStartTime},s.random=function(e,i){return i=void 0!==i?i:1,(e=void 0!==e?e:0)+t()*(i-e)};var t=function(){return s._seed=(9301*s._seed+49297)%233280,s._seed/233280};s.colorToNumber=function(t){return 3==(t=t.replace("#","")).length&&(t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)),parseInt(t,16)},s.logLevel=1,s.log=function(){console&&s.logLevel>0&&s.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},s.info=function(){console&&s.logLevel>0&&s.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},s.warn=function(){console&&s.logLevel>0&&s.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},s.warnOnce=function(){var t=Array.prototype.slice.call(arguments).join(" ");s._warnedOnce[t]||(s.warn(t),s._warnedOnce[t]=!0)},s.deprecated=function(t,e,i){t[e]=s.chain(function(){s.warnOnce("🔅 deprecated 🔅",i)},t[e])},s.nextId=function(){return s._nextId++},s.indexOf=function(t,e){if(t.indexOf)return t.indexOf(e);for(var i=0;is._deltaMax&&d.warnOnce("Matter.Engine.update: delta argument is recommended to be less than or equal to",s._deltaMax.toFixed(3),"ms."),e=void 0!==e?e:d._baseDelta,e*=m.timeScale,m.timestamp+=e,m.lastDelta=e;var y={timestamp:m.timestamp,delta:e};h.trigger(t,"beforeUpdate",y);var x=l.allBodies(f),T=l.allConstraints(f),w=l.allComposites(f);for(f.isModified&&(a.setBodies(p,x),l.setModified(f,!1,!1,!0)),t.enableSleeping&&r.update(x,e),s._bodiesApplyGravity(x,t.gravity),s.wrap(x,w),s.attractors(x),e>0&&s._bodiesUpdate(x,e),h.trigger(t,"beforeSolve",y),u.preSolveAll(x),i=0;i0&&h.trigger(t,"collisionStart",{pairs:g.collisionStart,timestamp:m.timestamp,delta:e});var S=d.clamp(20/t.positionIterations,0,1);for(n.preSolvePosition(g.list),i=0;i0&&h.trigger(t,"collisionActive",{pairs:g.collisionActive,timestamp:m.timestamp,delta:e}),g.collisionEnd.length>0&&h.trigger(t,"collisionEnd",{pairs:g.collisionEnd,timestamp:m.timestamp,delta:e}),s._bodiesClearForces(x),h.trigger(t,"afterUpdate",y),t.timing.lastElapsed=d.now()-c,t},s.merge=function(t,e){if(d.extend(t,e),e.world){t.world=e.world,s.clear(t);for(var i=l.allBodies(t.world),n=0;n0)for(var r=0;r0){i||(i={}),s=e.split(" ");for(var l=0;ln?(r.warn("Plugin.register:",s.toString(e),"was upgraded to",s.toString(t)),s._registry[t.name]=t):i-1},s.isFor=function(t,e){var i=t.for&&s.dependencyParse(t.for);return!t.for||e.name===i.name&&s.versionSatisfies(e.version,i.range)},s.use=function(t,e){if(t.uses=(t.uses||[]).concat(e||[]),0!==t.uses.length){for(var i=s.dependencies(t),n=r.topologicalSort(i),a=[],o=0;o0&&!h.silent&&r.info(a.join(" "))}else r.warn("Plugin.use:",s.toString(t),"does not specify any dependencies to install.")},s.dependencies=function(t,e){var i=s.dependencyParse(t),n=i.name;if(!(n in(e=e||{}))){t=s.resolve(t)||t,e[n]=r.map(t.uses||[],function(e){s.isPlugin(e)&&s.register(e);var n=s.dependencyParse(e),a=s.resolve(e);return a&&!s.versionSatisfies(a.version,n.range)?(r.warn("Plugin.dependencies:",s.toString(a),"does not satisfy",s.toString(n),"used by",s.toString(i)+"."),a._warned=!0,t._warned=!0):a||(r.warn("Plugin.dependencies:",s.toString(e),"used by",s.toString(i),"could not be resolved."),t._warned=!0),n.name});for(var a=0;a=|>)?\s*((\d+)\.(\d+)\.(\d+))(-[0-9A-Za-z-+]+)?$/;e.test(t)||r.warn("Plugin.versionParse:",t,"is not a valid version or range.");var i=e.exec(t),s=Number(i[4]),n=Number(i[5]),a=Number(i[6]);return{isRange:Boolean(i[1]||i[2]),version:i[3],range:t,operator:i[1]||i[2]||"",major:s,minor:n,patch:a,parts:[s,n,a],prerelease:i[7],number:1e8*s+1e4*n+a}},s.versionSatisfies=function(t,e){e=e||"*";var i=s.versionParse(e),r=s.versionParse(t);if(i.isRange){if("*"===i.operator||"*"===t)return!0;if(">"===i.operator)return r.number>i.number;if(">="===i.operator)return r.number>=i.number;if("~"===i.operator)return r.major===i.major&&r.minor===i.minor&&r.patch>=i.patch;if("^"===i.operator)return i.major>0?r.major===i.major&&r.number>=i.number:i.minor>0?r.minor===i.minor&&r.patch>=i.patch:r.patch===i.patch}return t===e||"*"===t}},13037(t,e,i){var s={};t.exports=s;var r=i(35810),n=i(48413),a=i(53402);!function(){s._maxFrameDelta=1e3/15,s._frameDeltaFallback=1e3/60,s._timeBufferMargin=1.5,s._elapsedNextEstimate=1,s._smoothingLowerBound=.1,s._smoothingUpperBound=.9,s.create=function(t){var e=a.extend({delta:1e3/60,frameDelta:null,frameDeltaSmoothing:!0,frameDeltaSnapping:!0,frameDeltaHistory:[],frameDeltaHistorySize:100,frameRequestId:null,timeBuffer:0,timeLastTick:null,maxUpdates:null,maxFrameTime:1e3/30,lastUpdatesDeferred:0,enabled:!0},t);return e.fps=0,e},s.run=function(t,e){return t.timeBuffer=s._frameDeltaFallback,function i(r){t.frameRequestId=s._onNextFrame(t,i),r&&t.enabled&&s.tick(t,e,r)}(),t},s.tick=function(e,i,o){var h=a.now(),l=e.delta,u=0,d=o-e.timeLastTick;if((!d||!e.timeLastTick||d>Math.max(s._maxFrameDelta,e.maxFrameTime))&&(d=e.frameDelta||s._frameDeltaFallback),e.frameDeltaSmoothing){e.frameDeltaHistory.push(d),e.frameDeltaHistory=e.frameDeltaHistory.slice(-e.frameDeltaHistorySize);var c=e.frameDeltaHistory.slice(0).sort(),f=e.frameDeltaHistory.slice(c.length*s._smoothingLowerBound,c.length*s._smoothingUpperBound);d=t(f)||d}e.frameDeltaSnapping&&(d=1e3/Math.round(1e3/d)),e.frameDelta=d,e.timeLastTick=o,e.timeBuffer+=e.frameDelta,e.timeBuffer=a.clamp(e.timeBuffer,0,e.frameDelta+l*s._timeBufferMargin),e.lastUpdatesDeferred=0;var p=e.maxUpdates||Math.ceil(e.maxFrameTime/l),g={timestamp:i.timing.timestamp};r.trigger(e,"beforeTick",g),r.trigger(e,"tick",g);for(var m=a.now();l>0&&e.timeBuffer>=l*s._timeBufferMargin;){r.trigger(e,"beforeUpdate",g),n.update(i,l),r.trigger(e,"afterUpdate",g),e.timeBuffer-=l,u+=1;var v=a.now()-h,y=a.now()-m,x=v+s._elapsedNextEstimate*y/u;if(u>=p||x>e.maxFrameTime){e.lastUpdatesDeferred=Math.round(Math.max(0,e.timeBuffer/l-s._timeBufferMargin));break}}i.timing.lastUpdatesPerFrame=u,r.trigger(e,"afterTick",g),e.frameDeltaHistory.length>=100&&(e.lastUpdatesDeferred&&Math.round(e.frameDelta/l)>p?a.warnOnce("Matter.Runner: runner reached runner.maxUpdates, see docs."):e.lastUpdatesDeferred&&a.warnOnce("Matter.Runner: runner reached runner.maxFrameTime, see docs."),void 0!==e.isFixed&&a.warnOnce("Matter.Runner: runner.isFixed is now redundant, see docs."),(e.deltaMin||e.deltaMax)&&a.warnOnce("Matter.Runner: runner.deltaMin and runner.deltaMax were removed, see docs."),0!==e.fps&&a.warnOnce("Matter.Runner: runner.fps was replaced by runner.delta, see docs."))},s.stop=function(t){s._cancelNextFrame(t)},s._onNextFrame=function(t,e){if("undefined"==typeof window||!window.requestAnimationFrame)throw new Error("Matter.Runner: missing required global window.requestAnimationFrame.");return t.frameRequestId=window.requestAnimationFrame(e),t.frameRequestId},s._cancelNextFrame=function(t){if("undefined"==typeof window||!window.cancelAnimationFrame)throw new Error("Matter.Runner: missing required global window.cancelAnimationFrame.");window.cancelAnimationFrame(t.frameRequestId)};var t=function(t){for(var e=0,i=t.length,s=0;s0&&h.motion=h.sleepThreshold/i&&s.set(h,!0)):h.sleepCounter>0&&(h.sleepCounter-=1)}else s.set(h,!1)}},s.afterCollisions=function(t){for(var e=s._motionSleepThreshold,i=0;ie&&s.set(h,!1)}}}},s.set=function(t,e){var i=t.isSleeping;e?(t.isSleeping=!0,t.sleepCounter=t.sleepThreshold,t.positionImpulse.x=0,t.positionImpulse.y=0,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.anglePrev=t.angle,t.speed=0,t.angularSpeed=0,t.motion=0,i||n.trigger(t,"sleepStart")):(t.isSleeping=!1,t.sleepCounter=0,i&&n.trigger(t,"sleepEnd"))}},66280(t,e,i){var s={};t.exports=s;var r=i(41598),n=i(53402),a=i(22562),o=i(15647),h=i(31725);s.rectangle=function(t,e,i,s,o){o=o||{};var h={label:"Rectangle Body",position:{x:t,y:e},vertices:r.fromPath("L 0 0 L "+i+" 0 L "+i+" "+s+" L 0 "+s)};if(o.chamfer){var l=o.chamfer;h.vertices=r.chamfer(h.vertices,l.radius,l.quality,l.qualityMin,l.qualityMax),delete o.chamfer}return a.create(n.extend({},h,o))},s.trapezoid=function(t,e,i,s,o,h){h=h||{},o>=1&&n.warn("Bodies.trapezoid: slope parameter must be < 1.");var l,u=i*(o*=.5),d=u+(1-2*o)*i,c=d+u;l=o<.5?"L 0 0 L "+u+" "+-s+" L "+d+" "+-s+" L "+c+" 0":"L 0 0 L "+d+" "+-s+" L "+c+" 0";var f={label:"Trapezoid Body",position:{x:t,y:e},vertices:r.fromPath(l)};if(h.chamfer){var p=h.chamfer;f.vertices=r.chamfer(f.vertices,p.radius,p.quality,p.qualityMin,p.qualityMax),delete h.chamfer}return a.create(n.extend({},f,h))},s.circle=function(t,e,i,r,a){r=r||{};var o={label:"Circle Body",circleRadius:i};a=a||25;var h=Math.ceil(Math.max(10,Math.min(a,i)));return h%2==1&&(h+=1),s.polygon(t,e,h,i,n.extend({},o,r))},s.polygon=function(t,e,i,o,h){if(h=h||{},i<3)return s.circle(t,e,o,h);for(var l=2*Math.PI/i,u="",d=.5*l,c=0;c0&&r.area(A)1?(p=a.create(n.extend({parts:g.slice(0)},s)),a.setPosition(p,{x:t,y:e}),p):g[0]},s.flagCoincidentParts=function(t,e){void 0===e&&(e=5);for(var i=0;ig&&(g=y),o.translate(v,{x:.5*x,y:.5*y}),d=v.bounds.max.x+n,r.addBody(u,v),l=v,f+=1}else d+=n}c+=g+a,d=t}return u},s.chain=function(t,e,i,s,o,h){for(var l=t.bodies,u=1;u0)for(l=0;l0&&(c=f[l-1+(h-1)*e],r.addConstraint(t,n.create(a.extend({bodyA:c,bodyB:d},o)))),s&&lc||a<(l=c-l)||a>i-1-l))return 1===d&&o.translate(u,{x:(a+(i%2==1?1:-1))*f,y:0}),h(t+(u?a*f:0)+a*n,s,a,l,u,d)})},s.newtonsCradle=function(t,e,i,s,a){for(var o=r.create({label:"Newtons Cradle"}),l=0;lt.max.x&&(t.max.x=r.x),r.xt.max.y&&(t.max.y=r.y),r.y0?t.max.x+=i.x:t.min.x+=i.x,i.y>0?t.max.y+=i.y:t.min.y+=i.y)},e.contains=function(t,e){return e.x>=t.min.x&&e.x<=t.max.x&&e.y>=t.min.y&&e.y<=t.max.y},e.overlaps=function(t,e){return t.min.x<=e.max.x&&t.max.x>=e.min.x&&t.max.y>=e.min.y&&t.min.y<=e.max.y},e.translate=function(t,e){t.min.x+=e.x,t.max.x+=e.x,t.min.y+=e.y,t.max.y+=e.y},e.shift=function(t,e){var i=t.max.x-t.min.x,s=t.max.y-t.min.y;t.min.x=e.x,t.max.x=e.x+i,t.min.y=e.y,t.max.y=e.y+s},e.wrap=function(t,e,i){var s=null,r=null;if(void 0!==e.min.x&&void 0!==e.max.x&&(t.min.x>e.max.x?s=e.min.x-t.max.x:t.max.xe.max.y?r=e.min.y-t.max.y:t.max.y1;if(!c||t!=c.x||e!=c.y){c&&s?(f=c.x,p=c.y):(f=0,p=0);var r={x:f+t,y:p+e};!s&&c||(c=r),g.push(r),v=f+t,y=p+e}},T=function(t){var e=t.pathSegTypeAsLetter.toUpperCase();if("Z"!==e){switch(e){case"M":case"L":case"T":case"C":case"S":case"Q":v=t.x,y=t.y;break;case"H":v=t.x;break;case"V":y=t.y}x(v,y,t.pathSegType)}};for(s._svgPathToAbsolute(t),a=t.getTotalLength(),l=[],i=0;i0)return!1;a=i}return!0},s.scale=function(t,e,i,n){if(1===e&&1===i)return t;var a,o;n=n||s.centre(t);for(var h=0;h=0?h-1:t.length-1],u=t[h],d=t[(h+1)%t.length],c=e[h0&&(n|=2),3===n)return!1;return 0!==n||null},s.hull=function(t){var e,i,s=[],n=[];for((t=t.slice(0)).sort(function(t,e){var i=t.x-e.x;return 0!==i?i:t.y-e.y}),i=0;i=2&&r.cross3(n[n.length-2],n[n.length-1],e)<=0;)n.pop();n.push(e)}for(i=t.length-1;i>=0;i-=1){for(e=t[i];s.length>=2&&r.cross3(s[s.length-2],s[s.length-1],e)<=0;)s.pop();s.push(e)}return s.pop(),n.pop(),s.concat(n)}},55973(t){function e(t,e,i){i=i||0;var s,r,n,a,o,h,l,u=[0,0];return s=t[1][1]-t[0][1],r=t[0][0]-t[1][0],n=s*t[0][0]+r*t[0][1],a=e[1][1]-e[0][1],o=e[0][0]-e[1][0],h=a*e[0][0]+o*e[0][1],S(l=s*o-a*r,0,i)||(u[0]=(o*n-r*h)/l,u[1]=(s*h-a*n)/l),u}function i(t,e,i,s){var r=e[0]-t[0],n=e[1]-t[1],a=s[0]-i[0],o=s[1]-i[1];if(a*n-o*r===0)return!1;var h=(r*(i[1]-t[1])+n*(t[0]-i[0]))/(a*n-o*r),l=(a*(t[1]-i[1])+o*(i[0]-t[0]))/(o*r-a*n);return h>=0&&h<=1&&l>=0&&l<=1}function s(t,e,i){return(e[0]-t[0])*(i[1]-t[1])-(i[0]-t[0])*(e[1]-t[1])}function r(t,e,i){return s(t,e,i)>0}function n(t,e,i){return s(t,e,i)>=0}function a(t,e,i){return s(t,e,i)<0}function o(t,e,i){return s(t,e,i)<=0}t.exports={decomp:function(t){var e=T(t);return e.length>0?w(t,e):[t]},quickDecomp:function t(e,i,s,h,l,u,g){u=u||100,g=g||0,l=l||25,i=void 0!==i?i:[],s=s||[],h=h||[];var m=[0,0],v=[0,0],x=[0,0],T=0,w=0,S=0,C=0,E=0,A=0,_=0,M=[],R=[],P=e,O=e;if(O.length<3)return i;if(++g>u)return console.warn("quickDecomp: max level ("+u+") reached."),i;for(var L=0;LE&&(E+=e.length),C=Number.MAX_VALUE,E3&&s>=0;--s)u(c(t,s-1),c(t,s),c(t,s+1),e)&&(t.splice(s%t.length,1),i++);return i},removeDuplicatePoints:function(t,e){for(var i=t.length-1;i>=1;--i)for(var s=t[i],r=i-1;r>=0;--r)C(s,t[r],e)&&t.splice(i,1)},makeCCW:function(t){for(var e=0,i=t,s=1;si[e][0])&&(e=s);return!r(c(t,e-1),c(t,e),c(t,e+1))&&(function(t){for(var e=[],i=t.length,s=0;s!==i;s++)e.push(t.pop());for(s=0;s!==i;s++)t[s]=e[s]}(t),!0)}};var h=[],l=[];function u(t,e,i,r){if(r){var n=h,a=l;n[0]=e[0]-t[0],n[1]=e[1]-t[1],a[0]=i[0]-e[0],a[1]=i[1]-e[1];var o=n[0]*a[0]+n[1]*a[1],u=Math.sqrt(n[0]*n[0]+n[1]*n[1]),d=Math.sqrt(a[0]*a[0]+a[1]*a[1]);return Math.acos(o/(u*d)){const o=this.getVideoPlaybackQuality(),h=this.mozPresentedFrames||this.mozPaintedFrames||o.totalVideoFrames-o.droppedVideoFrames;if(h>s){const s=this.mozFrameDelay||o.totalFrameDelay-i.totalFrameDelay||0,r=a-n;t(a,{presentationTime:a+1e3*s,expectedDisplayTime:a+r,width:this.videoWidth,height:this.videoHeight,mediaTime:Math.max(0,this.currentTime||0)+r/1e3,presentedFrames:h,processingDuration:s}),delete this._rvfcpolyfillmap[e]}else this._rvfcpolyfillmap[e]=requestAnimationFrame(t=>r(a,t))};return this._rvfcpolyfillmap[e]=requestAnimationFrame(t=>r(e,t)),e},HTMLVideoElement.prototype.cancelVideoFrameCallback=function(t){cancelAnimationFrame(this._rvfcpolyfillmap[t]),delete this._rvfcpolyfillmap[t]})},10312(t){t.exports={SKIP_CHECK:-1,NORMAL:0,ADD:1,MULTIPLY:2,SCREEN:3,OVERLAY:4,DARKEN:5,LIGHTEN:6,COLOR_DODGE:7,COLOR_BURN:8,HARD_LIGHT:9,SOFT_LIGHT:10,DIFFERENCE:11,EXCLUSION:12,HUE:13,SATURATION:14,COLOR:15,LUMINOSITY:16,ERASE:17,SOURCE_IN:18,SOURCE_OUT:19,SOURCE_ATOP:20,DESTINATION_OVER:21,DESTINATION_IN:22,DESTINATION_OUT:23,DESTINATION_ATOP:24,LIGHTER:25,COPY:26,XOR:27}},29795(t){t.exports={DEFAULT:0,LINEAR:0,NEAREST:1}},84322(t){t.exports={MULTIPLY:0,FILL:1,ADD:2,SCREEN:4,OVERLAY:5,HARD_LIGHT:6}},68627(t,e,i){var s=i(19715),r=i(32880),n=i(83419),a=i(8054),o=i(50792),h=i(92503),l=i(56373),u=i(97480),d=i(69442),c=i(8443),f=i(61340),p=new n({Extends:o,initialize:function(t){o.call(this);var e=t.config;this.config={clearBeforeRender:e.clearBeforeRender,backgroundColor:e.backgroundColor,antialias:e.antialias,roundPixels:e.roundPixels,transparent:e.transparent},this.game=t,this.type=a.CANVAS,this.drawCount=0,this.width=0,this.height=0,this.gameCanvas=t.canvas;var i={alpha:e.transparent,desynchronized:e.desynchronized,willReadFrequently:!1};this.gameContext=e.context?e.context:this.gameCanvas.getContext("2d",i),this.currentContext=this.gameContext,this.antialias=e.antialias,this.blendModes=l(),this.snapshotState={x:0,y:0,width:1,height:1,getPixel:!1,callback:null,type:"image/png",encoder:.92},this._tempMatrix1=new f,this._tempMatrix2=new f,this._tempMatrix3=new f,this.isBooted=!1,this.init()},init:function(){var t=this.game;t.events.once(c.BOOT,function(){var t=this.config;if(!t.transparent){var e=this.gameContext,i=this.gameCanvas;e.fillStyle=t.backgroundColor.rgba,e.fillRect(0,0,i.width,i.height)}},this),t.textures.once(d.READY,this.boot,this)},boot:function(){var t=this.game,e=t.scale.baseSize;this.width=e.width,this.height=e.height,this.isBooted=!0,t.scale.on(u.RESIZE,this.onResize,this),this.resize(e.width,e.height)},onResize:function(t,e){e.width===this.width&&e.height===this.height||this.resize(e.width,e.height)},resize:function(t,e){this.width=t,this.height=e,this.emit(h.RESIZE,t,e)},resetTransform:function(){this.currentContext.setTransform(1,0,0,1,0,0)},setBlendMode:function(t){return this.currentContext.globalCompositeOperation=t,this},setContext:function(t){return this.currentContext=t||this.gameContext,this},setAlpha:function(t){return this.currentContext.globalAlpha=t,this},preRender:function(){var t=this.gameContext,e=this.config,i=this.width,s=this.height;t.globalAlpha=1,t.globalCompositeOperation="source-over",t.setTransform(1,0,0,1,0,0),this.emit(h.PRE_RENDER_CLEAR),e.clearBeforeRender&&(t.clearRect(0,0,i,s),e.transparent||(t.fillStyle=e.backgroundColor.rgba,t.fillRect(0,0,i,s))),t.save(),this.drawCount=0,this.emit(h.PRE_RENDER)},render:function(t,e,i){var r=e.length;this.emit(h.RENDER,t,i);var n=i.x,a=i.y,o=i.width,l=i.height,u=i.renderToTexture?i.context:t.sys.context;u.save(),this.game.scene.customViewports&&(u.beginPath(),u.rect(n,a,o,l),u.clip()),i.emit(s.PRE_RENDER,i),this.currentContext=u;var d=i.mask;d&&d.preRenderCanvas(this,null,i._maskCamera),i.transparent||(u.fillStyle=i.backgroundColor.rgba,u.fillRect(n,a,o,l)),u.globalAlpha=i.alpha,u.globalCompositeOperation="source-over",this.drawCount+=r,i.renderToTexture&&i.emit(s.PRE_RENDER,i),i.matrix.copyToContext(u);for(var c=0;c=0?v=-(v+d):v<0&&(v=Math.abs(v)-d)),t.flipY&&(y>=0?y=-(y+c):y<0&&(y=Math.abs(y)-c))}var T=1,w=1;t.flipX&&(f||(v+=-e.realWidth+2*g),T=-1),t.flipY&&(f||(y+=-e.realHeight+2*m),w=-1);var b=t.x,S=t.y;if(i.roundPixels&&(b=Math.floor(b),S=Math.floor(S)),o.applyITRS(b,S,t.rotation,t.scaleX*T,t.scaleY*w),a.copyWithScrollFactorFrom(i.matrixCombined,i.scrollX,i.scrollY,t.scrollFactorX,t.scrollFactorY),s&&a.multiply(s),a.multiply(o),i.renderRoundPixels&&(a.e=Math.floor(a.e+.5),a.f=Math.floor(a.f+.5)),n.save(),a.setToContext(n),n.globalCompositeOperation=this.blendModes[t.blendMode],n.globalAlpha=r,n.imageSmoothingEnabled=!e.source.scaleMode,t.mask&&t.mask.preRenderCanvas(this,t,i),d>0&&c>0){var C=d/p,E=c/p;i.roundPixels&&(v=Math.floor(v+.5),y=Math.floor(y+.5),C+=.5,E+=.5),n.drawImage(e.source.image,l,u,d,c,v,y,C,E)}t.mask&&t.mask.postRenderCanvas(this,t,i),n.restore()}},destroy:function(){this.removeAllListeners(),this.game=null,this.gameCanvas=null,this.gameContext=null}});t.exports=p},55830(t,e,i){t.exports={CanvasRenderer:i(68627),GetBlendModes:i(56373),SetTransform:i(20926)}},56373(t,e,i){var s=i(10312),r=i(89289);t.exports=function(){var t=[],e=r.supportNewBlendModes,i="source-over";return t[s.NORMAL]=i,t[s.ADD]="lighter",t[s.MULTIPLY]=e?"multiply":i,t[s.SCREEN]=e?"screen":i,t[s.OVERLAY]=e?"overlay":i,t[s.DARKEN]=e?"darken":i,t[s.LIGHTEN]=e?"lighten":i,t[s.COLOR_DODGE]=e?"color-dodge":i,t[s.COLOR_BURN]=e?"color-burn":i,t[s.HARD_LIGHT]=e?"hard-light":i,t[s.SOFT_LIGHT]=e?"soft-light":i,t[s.DIFFERENCE]=e?"difference":i,t[s.EXCLUSION]=e?"exclusion":i,t[s.HUE]=e?"hue":i,t[s.SATURATION]=e?"saturation":i,t[s.COLOR]=e?"color":i,t[s.LUMINOSITY]=e?"luminosity":i,t[s.ERASE]="destination-out",t[s.SOURCE_IN]="source-in",t[s.SOURCE_OUT]="source-out",t[s.SOURCE_ATOP]="source-atop",t[s.DESTINATION_OVER]="destination-over",t[s.DESTINATION_IN]="destination-in",t[s.DESTINATION_OUT]="destination-out",t[s.DESTINATION_ATOP]="destination-atop",t[s.LIGHTER]="lighter",t[s.COPY]="copy",t[s.XOR]="xor",t}},20926(t,e,i){var s=i(91296);t.exports=function(t,e,i,r,n){var a=r.alpha*i.alpha;if(a<=0)return!1;var o=s(i,r,n).calc;return e.globalCompositeOperation=t.blendModes[i.blendMode],e.globalAlpha=a,e.save(),o.setToContext(e),e.imageSmoothingEnabled=i.frame?!i.frame.source.scaleMode:t.antialias,!0}},63899(t){t.exports="losewebgl"},6119(t){t.exports="postrender"},31124(t){t.exports="prerenderclear"},48070(t){t.exports="prerender"},15640(t){t.exports="render"},8912(t){t.exports="resize"},87124(t){t.exports="restorewebgl"},53998(t){t.exports="setparalleltextureunits"},92503(t,e,i){t.exports={LOSE_WEBGL:i(63899),POST_RENDER:i(6119),PRE_RENDER:i(48070),PRE_RENDER_CLEAR:i(31124),RENDER:i(15640),RESIZE:i(8912),RESTORE_WEBGL:i(87124),SET_PARALLEL_TEXTURE_UNITS:i(53998)}},36909(t,e,i){t.exports={Events:i(92503),Snapshot:i(89966)},t.exports.Canvas=i(55830),t.exports.WebGL=i(4159)},32880(t,e,i){var s=i(27919),r=i(40987),n=i(95540);t.exports=function(t,e){var i=n(e,"callback"),a=n(e,"type","image/png"),o=n(e,"encoder",.92),h=Math.abs(Math.round(n(e,"x",0))),l=Math.abs(Math.round(n(e,"y",0))),u=Math.floor(n(e,"width",t.width)),d=Math.floor(n(e,"height",t.height));if(n(e,"getPixel",!1)){var c=t.getContext("2d",{willReadFrequently:!1}).getImageData(h,l,1,1).data;i.call(null,new r(c[0],c[1],c[2],c[3]))}else if(0!==h||0!==l||u!==t.width||d!==t.height){var f=s.createWebGL(this,u,d),p=f.getContext("2d",{willReadFrequently:!0});u>0&&d>0&&p.drawImage(t,h,l,u,d,0,0,u,d);var g=new Image;g.onerror=function(){i.call(null),s.remove(f)},g.onload=function(){i.call(null,g),s.remove(f)},g.src=f.toDataURL(a,o)}else{var m=new Image;m.onerror=function(){i.call(null)},m.onload=function(){i.call(null,m)},m.src=t.toDataURL(a,o)}}},88815(t,e,i){var s=i(27919),r=i(40987),n=i(95540);t.exports=function(t,e){var i=t,a=n(e,"callback"),o=n(e,"type","image/png"),h=n(e,"encoder",.92),l=Math.abs(Math.round(n(e,"x",0))),u=Math.abs(Math.round(n(e,"y",0))),d=n(e,"getPixel",!1),c=n(e,"isFramebuffer",!1),f=c?n(e,"bufferWidth",1):i.drawingBufferWidth,p=c?n(e,"bufferHeight",1):i.drawingBufferHeight;if(d){var g=new Uint8Array(4),m=p-u-1;i.readPixels(l,m,1,1,i.RGBA,i.UNSIGNED_BYTE,g),a.call(null,new r(g[0],g[1],g[2],g[3]))}else{var v=Math.floor(n(e,"width",f)),y=Math.floor(n(e,"height",p)),x=new Uint8Array(v*y*4);i.readPixels(l,p-u-y,v,y,i.RGBA,i.UNSIGNED_BYTE,x);for(var T=s.createWebGL(this,v,y),w=T.getContext("2d",{willReadFrequently:!0}),b=w.getImageData(0,0,v,y),S=b.data,C=0;C0},beginDraw:function(){this.framebuffer&&this.renderer.glTextureUnits.unbindTexture(this.texture),this.renderer.glWrapper.update(this.state)},clear:function(t){this.beginDraw(),void 0===t&&(t=this.autoClear),this.renderer.renderNodes.finishBatch(),this.renderer.gl.clear(t)},destroy:function(){this.renderer.deleteTexture(this.texture),this.renderer.deleteFramebuffer(this.state.bindings.framebuffer),this.renderer=null,this.camera=null,this.state=null,this.framebuffer=null,this.texture=null}});t.exports=s},65656(t,e,i){var s=i(83419),r=i(87774),n=new s({initialize:function(t,e,i){this.renderer=t,this.maxAge=e,this.maxPoolSize=i,this.agePool=[],this.sizePool={}},add:function(t){if(-1===this.agePool.indexOf(t)){var e=t.width+"x"+t.height;this.sizePool[e]?this.sizePool[e].push(t):this.sizePool[e]=[t],this.agePool.push(t)}},get:function(t,e){var i,s,n=this.renderer;void 0===t&&(t=n.width),void 0===e&&(e=n.height);var a=n.getMaxTextureSize();t>a&&(t=a),e>a&&(e=a);var o=t+"x"+e,h=this.sizePool[o];if(h&&h.length>0)return i=h.pop(),s=this.agePool.indexOf(i),this.agePool.splice(s,1),i;if(this.agePool.length>0){var l=Date.now(),u=this.maxAge;if(l-(i=this.agePool[0]).lastUsed>u){this.agePool.shift();var d=i.width+"x"+i.height;return s=(h=this.sizePool[d]).indexOf(i),h.splice(s,1),i.resize(t,e),i}}return this.agePool.length0)for(var s=e.splice(0,i),r=0;r0){s+="_";for(var r=0;r0&&(s+="__",s+=i.sort().join("_")),s},createShaderProgram:function(t,e,i,s){var r=e.vertexShader,n=e.fragmentShader;if(r=r.replace(/\r/g,""),n=n.replace(/\r/g,""),i){for(var a,o,h={},l=0;l>>0},getTintAppendFloatAlpha:function(t,e){return((255*e&255)<<24|t)>>>0},getTintAppendFloatAlphaAndSwap:function(t,e){return((255*e&255)<<24|(255&t)<<16|(t>>8&255)<<8|t>>16&255)>>>0},getFloatsFromUintRGB:function(t){return[(t>>16&255)/255,(t>>8&255)/255,(255&t)/255]},checkShaderMax:function(t,e){var i=Math.min(16,t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS));return e&&-1!==e?Math.min(i,e):i},updateLightingUniforms:function(t,e,i,r,n,a,o,h){var l=e.camera,u=l.scene.sys.lights;if(u&&u.active){var d=u.getLights(l),c=d.length,f=u.ambientColor,p=e.height;if(t){i.setUniform("uNormSampler",r),i.setUniform("uCamera",[l.x,l.y,l.rotation,l.zoom]),i.setUniform("uAmbientLightColor",[f.r,f.g,f.b]),i.setUniform("uLightCount",c);for(var g=new s,m=0;m-1?t.getExtension(s):null,e.config.skipUnreadyShaders){var r="KHR_parallel_shader_compile";this.parallelShaderCompileExtension=i.indexOf(r)>-1?t.getExtension(r):null,this.parallelShaderCompileExtension||(e.config.skipUnreadyShaders=!1)}var n="OES_vertex_array_object";this.vaoExtension=i.indexOf(n)>-1?t.getExtension(n):null;var a="OES_standard_derivatives";if(this.standardDerivativesExtension=i.indexOf(a)>-1?t.getExtension(a):null,t instanceof WebGLRenderingContext){if(!this.instancedArraysExtension)throw new Error("ANGLE_instanced_arrays extension not supported. Required for rendering.");if(t.vertexAttribDivisor=this.instancedArraysExtension.vertexAttribDivisorANGLE.bind(this.instancedArraysExtension),t.drawArraysInstanced=this.instancedArraysExtension.drawArraysInstancedANGLE.bind(this.instancedArraysExtension),t.drawElementsInstanced=this.instancedArraysExtension.drawElementsInstancedANGLE.bind(this.instancedArraysExtension),!this.vaoExtension)throw new Error("OES_vertex_array_object extension not supported. Required for rendering.");if(t.createVertexArray=this.vaoExtension.createVertexArrayOES.bind(this.vaoExtension),t.bindVertexArray=this.vaoExtension.bindVertexArrayOES.bind(this.vaoExtension),t.deleteVertexArray=this.vaoExtension.deleteVertexArrayOES.bind(this.vaoExtension),t.isVertexArray=this.vaoExtension.isVertexArrayOES.bind(this.vaoExtension),this.standardDerivativesExtension)t.FRAGMENT_SHADER_DERIVATIVE_HINT=this.standardDerivativesExtension.FRAGMENT_SHADER_DERIVATIVE_HINT_OES;else if(e.config.smoothPixelArt)throw new Error("OES_standard_derivatives extension not supported. Cannot use smoothPixelArt.")}},setContextHandlers:function(t,e){this.previousContextLostHandler&&this.canvas.removeEventListener("webglcontextlost",this.previousContextLostHandler,!1),this.previousContextRestoredHandler&&this.canvas.removeEventListener("webglcontextrestored",this.previousContextRestoredHandler,!1),this.contextLostHandler="function"==typeof t?t.bind(this):this.dispatchContextLost.bind(this),this.contextRestoredHandler="function"==typeof e?e.bind(this):this.dispatchContextRestored.bind(this),this.canvas.addEventListener("webglcontextlost",this.contextLostHandler,!1),this.canvas.addEventListener("webglcontextrestored",this.contextRestoredHandler,!1),this.previousContextLostHandler=this.contextLostHandler,this.previousContextRestoredHandler=this.contextRestoredHandler},dispatchContextLost:function(t){this.contextLost=!0,console&&console.warn("WebGL Context lost. Renderer disabled"),this.emit(h.LOSE_WEBGL,this),t.preventDefault()},dispatchContextRestored:function(t){if(this.gl.isContextLost())console&&console.log("WebGL Context restored, but context is still lost");else{this.setExtensions(),this.glWrapper.update(A.getDefault(this),!0),this.glTextureUnits.init(),this.compression=this.getCompressedTextures();var e=function(t){t.createResource()};s(this.glTextureWrappers,e),s(this.glBufferWrappers,e),s(this.glFramebufferWrappers,e),s(this.glProgramWrappers,e),s(this.glVAOWrappers,e),this.glTextureUnits.bindUnits(this.glTextureUnits.units,!0),this.resize(this.game.scale.baseSize.width,this.game.scale.baseSize.height),this.contextLost=!1,console&&console.warn("WebGL Context restored. Renderer running again."),this.emit(h.RESTORE_WEBGL,this),t.preventDefault()}},captureFrame:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!1)},captureNextFrame:function(){P},getFps:function(){P},log:function(){},startCapture:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=!1),void 0===i&&(i=!1)},stopCapture:function(){P},onCapture:function(t){},onResize:function(t,e){e.width===this.width&&e.height===this.height||this.resize(e.width,e.height)},resize:function(t,e){var i=this.gl;return this.width=t,this.height=e,this.setProjectionMatrix(t,e),this.drawingBufferHeight=i.drawingBufferHeight,this.glWrapper.update({scissor:{box:[0,i.drawingBufferHeight-e,t,e]},viewport:[0,0,t,e]}),this.emit(h.RESIZE,t,e),this},getCompressedTextures:function(){var t="WEBGL_compressed_texture_",e="WEBKIT_"+t,i=function(i,s){var r=i.getExtension(t+s)||i.getExtension(e+s)||i.getExtension("EXT_texture_compression_"+s);if(r){var n={};for(var a in r)n[r[a]]=a;return n}},s=this.gl;return{ETC:i(s,"etc"),ETC1:i(s,"etc1"),ATC:i(s,"atc"),ASTC:i(s,"astc"),BPTC:i(s,"bptc"),RGTC:i(s,"rgtc"),PVRTC:i(s,"pvrtc"),S3TC:i(s,"s3tc"),S3TCSRGB:i(s,"s3tc_srgb"),IMG:!0}},getCompressedTextureName:function(t,e){var i=this.compression[t.toUpperCase()];if(e in i)return i[e]},supportsCompressedTexture:function(t,e){var i=this.compression[t.toUpperCase()];return!!i&&(!e||e in i)},getAspectRatio:function(){return this.width/this.height},setProjectionMatrix:function(t,e,i){return t===this.projectionWidth&&e===this.projectionHeight&&i===this.projectionFlipY||(this.projectionWidth=t,this.projectionHeight=e,this.projectionFlipY=!!i,i?this.projectionMatrix.ortho(0,t,0,e,-1e3,1e3):this.projectionMatrix.ortho(0,t,e,0,-1e3,1e3)),this},setProjectionMatrixFromDrawingContext:function(t){return this.setProjectionMatrix(t.width,t.height,!1)},resetProjectionMatrix:function(){return this.setProjectionMatrix(this.width,this.height)},hasExtension:function(t){return!!this.supportedExtensions&&this.supportedExtensions.indexOf(t)},getExtension:function(t){return this.hasExtension(t)?(t in this.extensions||(this.extensions[t]=this.gl.getExtension(t)),this.extensions[t]):null},addBlendMode:function(t,e){return this.blendModes.push(E.createCombined(this,!0,void 0,e,t[0],t[1]))-1-1},updateBlendMode:function(t,e,i){if(t>17&&this.blendModes[t]){var s=this.blendModes[t];2===e.length?s.func=[e[0],e[1],e[0],e[1]]:s.func=[e[0],e[1],e[2],e[3]],s.equation="number"==typeof i?[i,i]:[i[0],i[1]]}return this},removeBlendMode:function(t){return t>17&&this.blendModes[t]&&this.blendModes.splice(t,1),this},clearFramebuffer:function(t,e,i){var s=this.gl,r=0;t&&(this.glWrapper.updateColorClearValue({colorClearValue:t}),r|=s.COLOR_BUFFER_BIT),void 0!==e&&(this.glWrapper.updateStencilClear({stencil:{clear:e}}),r|=s.STENCIL_BUFFER_BIT),void 0!==i&&(r|=s.DEPTH_BUFFER_BIT),s.clear(r)},createTextureFromSource:function(t,e,i,s,r,n){void 0===r&&(r=!1);var o=this.gl,h=o.NEAREST,u=o.NEAREST,d=o.CLAMP_TO_EDGE;e=t?t.width:e,i=t?t.height:i;var c=l(e,i);if(c&&!r&&(d=o.REPEAT),s===a.ScaleModes.LINEAR&&this.config.antialias){var f=t&&t.compressed,p=!f&&c||f&&t.mipmaps.length>1;h=this.mipmapFilter&&p?this.mipmapFilter:o.LINEAR,u=o.LINEAR}return t||"number"!=typeof e||"number"!=typeof i?this.createTexture2D(0,h,u,d,d,o.RGBA,t,void 0,void 0,void 0,void 0,n):this.createTexture2D(0,h,u,d,d,o.RGBA,null,e,i,void 0,void 0,n)},createTexture2D:function(t,e,i,s,r,n,a,o,h,l,u,d){"number"!=typeof o&&(o=a?a.width:1),"number"!=typeof h&&(h=a?a.height:1);var c=new w(this,t,e,i,s,r,n,a,o,h,l,u,d);return this.glTextureWrappers.push(c),c},createFramebuffer:function(t,e,i){Array.isArray(t)||null===t||(t=[t]);var s=new S(this,t,e,i);return this.glFramebufferWrappers.push(s),s},createProgram:function(t,e){var i=new x(this,t,e);return this.glProgramWrappers.push(i),i},createVertexBuffer:function(t,e){var i=this.gl,s=new v(this,t,i.ARRAY_BUFFER,e);return this.glBufferWrappers.push(s),s},createIndexBuffer:function(t,e){var i=this.gl,s=new v(this,t,i.ELEMENT_ARRAY_BUFFER,e);return this.glBufferWrappers.push(s),s},createVAO:function(t,e,i){var s=new C(this,t,e,i);return this.glVAOWrappers.push(s),s},deleteTexture:function(t){if(t)return r(this.glTextureWrappers,t),t.destroy(),this},deleteFramebuffer:function(t){return t?(r(this.glFramebufferWrappers,t),t.destroy(),this):this},deleteProgram:function(t){return t&&(r(this.glProgramWrappers,t),t.destroy()),this},deleteBuffer:function(t){return t?(r(this.glBufferWrappers,t),t.destroy(),this):this},preRender:function(){if(!this.contextLost){this.emit(h.PRE_RENDER_CLEAR);var t=this.baseDrawingContext;if(this.config.clearBeforeRender){var e=this.config.backgroundColor;t.setClearColor(e.redGL,e.greenGL,e.blueGL,e.alphaGL),t.setAutoClear(!0,!0,!0)}else t.setAutoClear(!1,!1,!1);t.use(),this.emit(h.PRE_RENDER)}},render:function(t,e,i){this.contextLost||(this.emit(h.RENDER,t,i),this.currentViewCamera=i,this.cameraRenderNode.run(this.baseDrawingContext,e,i),this.currentViewCamera=null)},postRender:function(){if(this.baseDrawingContext.release(),!this.contextLost){this.emit(h.POST_RENDER);var t=this.snapshotState;t.callback&&(m(this.gl,t),t.callback=null)}},drawElements:function(t,e,i,s,r,n,a){var o=this.gl;t.beginDraw(),i.bind(),s.bind(),this.glTextureUnits.bindUnits(e),o.drawElements(a||o.TRIANGLE_STRIP,r,o.UNSIGNED_SHORT,n)},drawInstancedArrays:function(t,e,i,s,r,n,a,o){var h=this.gl;t.beginDraw(),i.bind(),s.bind(),this.glTextureUnits.bindUnits(e),h.drawArraysInstanced(o||h.TRIANGLE_STRIP,r,n,a)},snapshot:function(t,e,i){return this.snapshotArea(0,0,this.gl.drawingBufferWidth,this.gl.drawingBufferHeight,t,e,i)},snapshotArea:function(t,e,i,s,r,n,a){var o=this.snapshotState;return o.callback=r,o.type=n,o.encoder=a,o.getPixel=!1,o.x=t,o.y=e,o.width=i,o.height=s,o.unpremultiplyAlpha=this.game.config.premultipliedAlpha,this},snapshotPixel:function(t,e,i){return this.snapshotArea(t,e,1,1,i),this.snapshotState.getPixel=!0,this},snapshotFramebuffer:function(t,e,i,s,r,n,a,o,h,l,u){void 0===r&&(r=!1),void 0===n&&(n=0),void 0===a&&(a=0),void 0===o&&(o=e),void 0===h&&(h=i),"pixel"===l&&(r=!0,l="image/png"),this.snapshotArea(n,a,o,h,s,l,u);var d=this.snapshotState;return d.getPixel=r,d.isFramebuffer=!0,d.bufferWidth=e,d.bufferHeight=i,d.width=Math.min(d.width,e),d.height=Math.min(d.height,i),this.glWrapper.updateBindingsFramebuffer({bindings:{framebuffer:t}}),m(this.gl,d),d.callback=null,d.isFramebuffer=!1,this},canvasToTexture:function(t,e,i,s){void 0===i&&(i=!1),void 0===s&&(s=!0);var r=this.gl,n=r.NEAREST,a=r.NEAREST,o=t.width,h=t.height,u=r.CLAMP_TO_EDGE,d=l(o,h);return!i&&d&&(u=r.REPEAT),this.config.antialias&&(n=d&&this.mipmapFilter?this.mipmapFilter:r.LINEAR,a=r.LINEAR),e?(e.update(t,o,h,s,u,u,n,a,e.format),e):this.createTexture2D(0,n,a,u,u,r.RGBA,t,o,h,!0,!1,s)},createCanvasTexture:function(t,e,i){return void 0===e&&(e=!1),void 0===i&&(i=!0),this.canvasToTexture(t,null,e,i)},updateCanvasTexture:function(t,e,i,s){return void 0===i&&(i=!0),void 0===s&&(s=!1),this.canvasToTexture(t,e,s,i)},videoToTexture:function(t,e,i,s){void 0===i&&(i=!1),void 0===s&&(s=!0);var r=this.gl,n=r.NEAREST,a=r.NEAREST,o=t.videoWidth,h=t.videoHeight,u=r.CLAMP_TO_EDGE,d=l(o,h);return!i&&d&&(u=r.REPEAT),this.config.antialias&&(n=d&&this.mipmapFilter?this.mipmapFilter:r.LINEAR,a=r.LINEAR),e?(e.update(t,o,h,s,u,u,n,a,e.format),e):this.createTexture2D(0,n,a,u,u,r.RGBA,t,o,h,!0,!0,s)},createVideoTexture:function(t,e,i){return void 0===e&&(e=!1),void 0===i&&(i=!0),this.videoToTexture(t,null,e,i)},updateVideoTexture:function(t,e,i,s){return void 0===i&&(i=!0),void 0===s&&(s=!1),this.videoToTexture(t,e,s,i)},createUint8ArrayTexture:function(t,e,i,s,r){var n=this.gl,a=n.NEAREST,o=n.NEAREST,h=n.CLAMP_TO_EDGE;return l(e,i)&&(h=n.REPEAT),void 0===s&&(s=!0),void 0===r&&(r=!0),this.createTexture2D(0,a,o,h,h,n.RGBA,t,e,i,s,!1,r)},setTextureFilter:function(t,e){var i=this.gl,s=0===e?i.LINEAR:i.NEAREST,r=this.glTextureUnits,n=r.units[0];return r.bind(t,0),t.update(t.pixels,t.width,t.height,t.flipY,t.wrapS,t.wrapT,s,s,t.format),n&&r.bind(n,0),this},setTextureWrap:function(t,e,i){var s=this.gl;if(!l(t.width,t.height)&&(e!==s.CLAMP_TO_EDGE||i!==s.CLAMP_TO_EDGE))return this;var r=this.glTextureUnits,n=r.units[0];return r.bind(t,0),t.update(t.pixels,t.width,t.height,t.flipY,e,i,t.minFilter,t.magFilter,t.format),n&&r.bind(n,0),this},getMaxTextureSize:function(){return this.config.maxTextureSize},destroy:function(){this.off(h.RESIZE,this.baseDrawingContext.resize,this.baseDrawingContext),this.canvas.removeEventListener("webglcontextlost",this.contextLostHandler,!1),this.canvas.removeEventListener("webglcontextrestored",this.contextRestoredHandler,!1);var t=function(t){t.destroy()};s(this.glBufferWrappers,t),s(this.glFramebufferWrappers,t),s(this.glProgramWrappers,t),s(this.glTextureWrappers,t),this.removeAllListeners(),this.extensions={},this.gl=null,this.game=null,this.canvas=null,this.contextLost=!0}});t.exports=O},14500(t){t.exports={BYTE:{enum:5120,size:1},UNSIGNED_BYTE:{enum:5121,size:1},SHORT:{enum:5122,size:2},UNSIGNED_SHORT:{enum:5123,size:2},INT:{enum:5124,size:4},UNSIGNED_INT:{enum:5125,size:4},FLOAT:{enum:5126,size:4}}},4159(t,e,i){var s=i(14500),r=i(79291),n={Shaders:i(89350),ShaderAdditionMakers:i(83786),DrawingContext:i(87774),DrawingContextPool:i(65656),ProgramManager:i(56436),RenderNodes:i(54521),ShaderProgramFactory:i(18804),Utils:i(70554),WebGLRenderer:i(74797),Wrappers:i(31884)};n=r(!1,n,s),t.exports=n},47774(t){var e={createCombined:function(t,e,i,s,r,n){var a=t.gl;return void 0===e&&(e=!0),void 0===i&&(i=[0,0,0,0]),void 0===s&&(s=a.FUNC_ADD),void 0===r&&(r=a.ONE),void 0===n&&(n=a.ONE_MINUS_SRC_ALPHA),{enabled:e,color:i,equation:[s,s],func:[r,n,r,n]}},createSeparate:function(t,e,i,s,r,n,a,o,h){var l=t.gl;return void 0===e&&(e=!0),void 0===i&&(i=[0,0,0,0]),void 0===s&&(s=l.FUNC_ADD),void 0===r&&(r=l.FUNC_ADD),void 0===n&&(n=l.ONE),void 0===a&&(a=l.ONE_MINUS_SRC_ALPHA),void 0===o&&(o=l.ONE),void 0===h&&(h=l.ONE_MINUS_SRC_ALPHA),{enabled:e,color:i,equation:[s,r],func:[n,a,o,h]}}};t.exports=e},53314(t,e,i){var s=i(8054),r=i(62644),n=i(71623),a={getDefault:function(t){return{bindings:{activeTexture:0,arrayBuffer:null,elementArrayBuffer:null,framebuffer:null,program:null,renderbuffer:null},blend:r(t.blendModes[s.BlendModes.NORMAL]),colorClearValue:[0,0,0,1],colorWritemask:[!0,!0,!0,!0],cullFace:!1,depthTest:!1,scissor:{enable:!0,box:[0,0,0,0]},stencil:n.create(t),texturing:{flipY:!1,premultiplyAlpha:!1},vao:null,viewport:[0,0,0,0]}}};t.exports=a},71623(t){var e={create:function(t,e,i,s,r,n,a,o,h){var l=t.gl;return void 0===e&&(e=!1),void 0===i&&(i=l.ALWAYS),void 0===s&&(s=0),void 0===r&&(r=255),void 0===n&&(n=l.KEEP),void 0===a&&(a=l.KEEP),void 0===o&&(o=l.KEEP),void 0===h&&(h=0),{enabled:e,func:{func:i,ref:s,mask:r},op:{fail:n,zfail:a,zpass:o},clear:h}}};t.exports=e},13961(t,e,i){var s=i(83419),r=i(56436),n=i(40952),a=i(6141),o=i(36909),h=new s({Extends:a,initialize:function(t,e,i){var s=t.renderer,h=s.gl,l=(i=this._copyAndCompleteConfig(t,i||{},e)).name;if(!l)throw new Error("BatchHandler must have a name");a.call(this,l,t),this.instancesPerBatch=-1,this.verticesPerInstance=i.verticesPerInstance;var u=Math.floor(65536/this.verticesPerInstance),d=i.instancesPerBatch||s.config.batchSize||u;this.instancesPerBatch=Math.min(d,u),this.indicesPerInstance=i.indicesPerInstance,this.bytesPerIndexPerInstance=this.indicesPerInstance*Uint16Array.BYTES_PER_ELEMENT,this.maxTexturesPerBatch=1,this.manager.on(o.Events.SET_PARALLEL_TEXTURE_UNITS,this.updateTextureCount,this),s.glWrapper.updateVAO({vao:null}),this.indexBuffer=s.createIndexBuffer(this._generateElementIndices(this.instancesPerBatch),i.indexBufferDynamic?h.DYNAMIC_DRAW:h.STATIC_DRAW);var c=i.vertexBufferLayout;if(c.count=this.instancesPerBatch*this.verticesPerInstance,this.vertexBufferLayout=new n(s,c,null),this.programManager=new r(s,[this.vertexBufferLayout],this.indexBuffer),this.programManager.setBaseShader(i.shaderName,i.vertexSource,i.fragmentSource),i.shaderAdditions)for(var f=0;fthis.instancesPerBatch)throw new Error("BatchHandlerStrip: Vertex count exceeds maximum per batch ("+this.maxVerticesPerBatch+")");this.instanceCount+c>this.instancesPerBatch&&this.run(t),this.updateRenderOptions(u),this._renderOptionsChanged&&(this.run(t),this.updateShaderConfig());var f,g=this.batchTextures(s),m=this.instanceCount*this.floatsPerInstance,v=this.vertexBufferLayout.buffer,y=v.viewF32,x=v.viewU32,T=!1;if(this.instanceCount>0){var w=1+this.floatsPerInstance/this.verticesPerInstance;y[m++]=y[m-w],y[m++]=y[m-w],y[m++]=y[m-w],y[m++]=y[m-w],y[m++]=y[m-w],y[m++]=y[m-w],x[m++]=x[m-w],T=!0}d&&(f=[]);for(var b=i.a,S=i.b,C=i.c,E=i.d,A=i.e,_=i.f,M=r.length,R=0;R=u.length)&&(n++,this.run(t),d=this.instanceCount*this.indicesPerInstance,g=this.vertexCount*h/f.BYTES_PER_ELEMENT,v=0,x=0)}}});t.exports=c},61842(t,e,i){var s=i(19715),r=i(1e3),n=i(61340),a=i(87841),o=i(43855),h=i(83419),l=i(70554),u=i(6141);function d(t){return l.getTintAppendFloatAlpha(16777215,t)}var c=new h({Extends:u,initialize:function(t){u.call(this,"Camera",t),this.batchHandlerQuadSingleNode=t.getNode("BatchHandlerQuadSingle"),this.fillCameraNode=t.getNode("FillCamera"),this.listCompositorNode=t.getNode("ListCompositor"),this._parentTransformMatrix=new n},run:function(t,e,i,n,h,l){var u;this.onRunBegin(t);var c=t.renderer.drawingContextPool,f=this.manager,p=i.alpha,g=i.filters.internal.getActive(),m=i.filters.external.getActive(),v=h||i.forceComposite||g.length||m.length||p<1;n?i.matrixExternal.multiply(n,n):n=this._parentTransformMatrix.copyFrom(i.matrixExternal);var y=n.decomposeMatrix(),x=o(y.translateX,0)&&o(y.translateY,0)&&o(y.rotation,0)&&o(y.scaleX,1)&&o(y.scaleY,1),T=i.x,w=i.y,b=i.width,S=i.height,C=t.getClone();C.setCamera(i),v?((u=c.get(b,S)).setCamera(i),u.setScissorBox(0,0,b,S)):(u=C).setScissorBox(T,w,b,S),u.use();var E=this.fillCameraNode;if(i.backgroundColor.alphaGL>0){var A=i.backgroundColor,_=r(A.red,A.green,A.blue,A.alpha);E.run(u,_,v)}this.listCompositorNode.run(u,e,null,l);var M=i.flashEffect;M.postRenderWebGL()&&(_=r(M.red,M.green,M.blue,255*M.alpha),E.run(u,_,v));var R=i.fadeEffect;if(R.postRenderWebGL()&&(_=r(R.red,R.green,R.blue,255*R.alpha),E.run(u,_,v)),f.finishBatch(),v){var P,O,L,D,F={smoothPixelArt:f.renderer.game.config.smoothPixelArt},I=new a(0,0,u.width,u.height);for(P=0;P0,k=!B,U=new a(0,0,C.width,C.height);if(B){for(P=m.length-1;P>=0;P--)(O=m[P]).active&&(L=O.getPadding(),U.setTo(U.x+L.x,U.y+L.y,U.width+L.width,U.height+L.height));(k=U.width!==u.width||U.height!==u.height||!x)&&((u=c.get(U.width,U.height)).setScissorBox(0,0,U.width,U.height),u.setCamera(C.camera),u.use())}else u=C;if(k){var z,Y=U.x,X=U.y;n.setQuad(I.x,I.y,I.x+I.width,I.y+I.height),z=n.quad,D=B?4294967295:d(p),i.roundPixels&&(z[0]=Math.round(z[0]),z[1]=Math.round(z[1]),z[2]=Math.round(z[2]),z[3]=Math.round(z[3]),z[4]=Math.round(z[4]),z[5]=Math.round(z[5]),z[6]=Math.round(z[6]),z[7]=Math.round(z[7])),this.batchHandlerQuadSingleNode.batch(u,N.texture,z[0]-Y,z[1]-X,z[2]-Y,z[3]-X,z[6]-Y,z[7]-X,z[4]-Y,z[5]-X,0,1,1,-1,!1,D,D,D,D,F)}if(N!==u&&N.release(),B){var W=!1;for(N=null,L=new a,P=0;P0&&d2&&g>1&&(m=!0,r||(v=!0));for(var y,x,T,w,b,S,C,E,A=[],_=0,M=[],R=0,P=[],O=0,L=u*u,D=0;D0){var l=e,u=e;if(a.length>0){r=h;for(var d=0;d0)for(r=h,d=0;d0){var r=this.instanceBufferLayout.buffer,n=i.memberCount,a=Math.floor(n/i.bufferUpdateSegmentSize),o=!0;for(e=0;e<=a;e++)if(!(1<0&&e.addAddition(h(t.tileset.maxAnimationLength));for(var r=t.lighting,n=e.getAdditionsByTag("LIGHTING"),a=0;a0,T=[y,e.layerDataTexture];if(x&&(T[2]=v.getAnimationDataTexture(r)),e.lighting){var w=v.image.dataSource[0];w=w?w.glTexture:this.manager.renderer.normalTexture,T[3]=w}this.updateRenderOptions(e);var b=this.programManager,S=b.getCurrentProgramSuite();if(S){var C=S.program,E=S.vao;this.setupUniforms(t,e),b.applyUniforms(C),r.drawElements(t,T,C,E,4,0)}this.onRunEnd(t)}});t.exports=y},12913(t,e,i){var s=i(83419),r=i(6141),n=new s({Extends:r,initialize:function(t){r.call(this,"TexturerImage",t),this.frame=null,this.frameWidth=0,this.frameHeight=0,this.uvSource=null},run:function(t,e,i){this.onRunBegin(t);var s=e.frame;if(this.frame=s,this.frameWidth=s.cutWidth,this.frameHeight=s.cutHeight,this.uvSource=s,e.isCropped){var r=e._crop;this.uvSource=r,r.flipX===e.flipX&&r.flipY===e.flipY||e.frame.updateCropUVs(r,e.flipX,e.flipY),this.frameWidth=r.width,this.frameHeight=r.height}var n=s.source.resolution;this.frameWidth/=n,this.frameHeight/=n,this.onRunEnd(t)}});t.exports=n},22995(t,e,i){var s=i(61340),r=i(83419),n=i(6141),a=new r({Extends:n,initialize:function(t){n.call(this,"TexturerTileSprite",t),this.frame=null,this.uvMatrix=new s},run:function(t,e,i){this.onRunBegin(t);var s=e.frame;if(this.frame=s,e.isCropped){var r=e._crop;r.flipX===e.flipX&&r.flipY===e.flipY||e.frame.updateCropUVs(r,e.flipX,e.flipY)}this.uvMatrix.loadIdentity(),this.uvMatrix.scale(1/s.width,1/s.height),this.uvMatrix.translate(e.tilePositionX,e.tilePositionY),this.uvMatrix.scale(1/e.tileScaleX,1/e.tileScaleY),this.uvMatrix.rotate(-e.tileRotation),this.uvMatrix.setQuad(0,0,e.width,e.height),this.onRunEnd(t)}});t.exports=a},86081(t,e,i){var s=i(61340),r=i(83419),n=i(46975),a=i(6141),o=new r({Extends:a,initialize:function(t,e){e=n(e||{},this.defaultConfig),a.call(this,e.name,t),this.quad=new Float32Array(8),this._spriteMatrix=new s,this._calcMatrix=new s},defaultConfig:{name:"TransformerImage",role:"Transformer"},run:function(t,e,i,s,r){this.onRunBegin(t);var n=i.frame,a=i.uvSource,o=a.x,h=a.y,l=e.displayOriginX,u=e.displayOriginY,d=-l+o,c=-u+h,f=n.customPivot,p=1,g=1;e.flipX&&(f||(d+=-n.realWidth+2*l),p=-1),e.flipY&&(f||(c+=-n.realHeight+2*u),g=-1);var m=t.camera,v=this._spriteMatrix,y=this._calcMatrix.copyWithScrollFactorFrom(m.getViewMatrix(!t.useCanvas),m.scrollX,m.scrollY,e.scrollFactorX,e.scrollFactorY);s&&y.multiply(s),v.applyITRS(e.x,e.y,e.rotation,e.scaleX*p,e.scaleY*g),y.multiply(v),y.setQuad(d,c,d+i.frameWidth,c+i.frameHeight,this.quad);var x=y.matrix,T=1===x[0]&&0===x[1]&&0===x[2]&&1===x[3];if(e.willRoundVertices(m,T)){var w=this.quad;w[0]=Math.round(w[0]),w[1]=Math.round(w[1]),w[2]=Math.round(w[2]),w[3]=Math.round(w[3]),w[4]=Math.round(w[4]),w[5]=Math.round(w[5]),w[6]=Math.round(w[6]),w[7]=Math.round(w[7])}this.onRunEnd(t)}});t.exports=o},88383(t,e,i){var s=i(61340),r=i(83419),n=i(46975),a=i(6141),o=new r({Extends:a,initialize:function(t,e){e=n(e||{},this.defaultConfig),a.call(this,e.name,t),this._spriteMatrix=new s,this.quad=this._spriteMatrix.quad},defaultConfig:{name:"TransformerStamp",role:"Transformer"},run:function(t,e,i,s,r){this.onRunBegin(t);var n=i.frame,a=i.uvSource,o=a.x,h=a.y,l=e.displayOriginX,u=e.displayOriginY,d=-l+o,c=-u+h,f=n.customPivot,p=1,g=1;e.flipX&&(f||(d+=-n.realWidth+2*l),p=-1),e.flipY&&(f||(c+=-n.realHeight+2*u),g=-1);var m=e.x,v=e.y,y=this._spriteMatrix;y.applyITRS(m,v,e.rotation,e.scaleX*p,e.scaleY*g);var x=y.matrix;this.onlyTranslate=1===x[0]&&0===x[1]&&0===x[2]&&1===x[3],y.setQuad(d,c,d+i.frameWidth,c+i.frameHeight);var T=y.matrix,w=1===T[0]&&0===T[1]&&0===T[2]&&1===T[3];if(e.willRoundVertices(t.camera,w)){var b=this.quad;b[0]=Math.round(b[0]),b[1]=Math.round(b[1]),b[2]=Math.round(b[2]),b[3]=Math.round(b[3]),b[4]=Math.round(b[4]),b[5]=Math.round(b[5]),b[6]=Math.round(b[6]),b[7]=Math.round(b[7])}this.onRunEnd(t)}});t.exports=o},34454(t,e,i){var s=i(83419),r=i(86081),n=new s({Extends:r,initialize:function(t,e){r.call(this,t,e)},defaultConfig:{name:"TransformerTile",role:"Transformer"},run:function(t,e,i,s,r){this.onRunBegin(t);var n=t.camera,a=this._calcMatrix,o=this._spriteMatrix;a.copyWithScrollFactorFrom(n.getViewMatrix(!t.useCanvas),n.scrollX,n.scrollY,e.scrollFactorX,e.scrollFactorY),s&&a.multiply(s);var h=i.frameWidth,l=i.frameHeight,u=h,d=l,c=h/2,f=l/2,p=e.scaleX,g=e.scaleY,m=e.gidMap[r.index],v=m.tileOffset.x,y=m.tileOffset.y,x=e.x+r.pixelX*p+(c*p-v),T=e.y+r.pixelY*g+(f*g-y),w=-c,b=-f;r.flipX&&(u*=-1,w+=h),r.flipY&&(d*=-1,w+=l),o.applyITRS(x,T,r.rotation,p,g),a.multiply(o),a.setQuad(w,b,w+u,b+d,this.quad);var S=a.matrix,C=1===S[0]&&0===S[1]&&0===S[2]&&1===S[3];if(e.willRoundVertices(n,C)){var E=this.quad;E[0]=Math.round(E[0]),E[1]=Math.round(E[1]),E[2]=Math.round(E[2]),E[3]=Math.round(E[3]),E[4]=Math.round(E[4]),E[5]=Math.round(E[5]),E[6]=Math.round(E[6]),E[7]=Math.round(E[7])}this.onRunEnd(t)}});t.exports=n},46211(t,e,i){var s=i(83419),r=i(86081),n=new s({Extends:r,initialize:function(t,e){r.call(this,t,e)},defaultConfig:{name:"TransformerTileSprite",role:"Transformer"},run:function(t,e,i,s,r){this.onRunBegin(t);var n=e.width,a=e.height,o=e.displayOriginX,h=e.displayOriginY,l=-o,u=-h,d=1,c=1;e.flipX&&(l+=2*o-n,d=-1),e.flipY&&(u+=2*h-a,c=-1);var f=e.x,p=e.y,g=t.camera,m=this._calcMatrix,v=this._spriteMatrix;m.copyWithScrollFactorFrom(g.getViewMatrix(!t.useCanvas),g.scrollX,g.scrollY,e.scrollFactorX,e.scrollFactorY),s&&m.multiply(s),v.applyITRS(f,p,e.rotation,e.scaleX*d,e.scaleY*c),m.multiply(v),m.setQuad(l,u,l+n,u+a,this.quad);var y=m.matrix,x=1===y[0]&&0===y[1]&&0===y[2]&&1===y[3];if(e.willRoundVertices(g,x)){var T=this.quad;T[0]=Math.round(T[0]),T[1]=Math.round(T[1]),T[2]=Math.round(T[2]),T[3]=Math.round(T[3]),T[4]=Math.round(T[4]),T[5]=Math.round(T[5]),T[6]=Math.round(T[6]),T[7]=Math.round(T[7])}this.onRunEnd(t)}});t.exports=n},84547(t){t.exports=["vec4 applyLighting (vec4 fragColor, vec3 normal)","{"," vec4 lighting = getLighting(fragColor, normal);"," return fragColor * vec4(lighting.rgb * lighting.a, lighting.a);","}"].join("\n")},11104(t){t.exports=["vec4 applyTint(vec4 texture)","{"," vec3 unpremultTexture = texture.rgb / texture.a;"," float alpha = texture.a * outTint.a;"," vec3 color = vec3(unpremultTexture);"," if (outTintEffect == 0.0) {"," color *= outTint.bgr;"," }"," else if (outTintEffect == 1.0) {"," color = outTint.bgr;"," }"," else if (outTintEffect == 2.0) {"," color += outTint.bgr;"," }"," else if (outTintEffect == 4.0) {"," color = 1.0 - (1.0 - unpremultTexture) * (1.0 - outTint.bgr);"," }"," else if (outTintEffect == 5.0) {"," color = vec3("," unpremultTexture.r < 0.5 ? 2.0 * outTint.b * unpremultTexture.r : 1.0 - 2.0 * (1.0 - outTint.b) * (1.0 - unpremultTexture.r),"," unpremultTexture.g < 0.5 ? 2.0 * outTint.g * unpremultTexture.g : 1.0 - 2.0 * (1.0 - outTint.g) * (1.0 - unpremultTexture.g),"," unpremultTexture.b < 0.5 ? 2.0 * outTint.r * unpremultTexture.b : 1.0 - 2.0 * (1.0 - outTint.r) * (1.0 - unpremultTexture.b)"," );"," }"," else if (outTintEffect == 6.0) {"," color = vec3("," outTint.b < 0.5 ? 2.0 * outTint.b * unpremultTexture.r : 1.0 - 2.0 * (1.0 - outTint.b) * (1.0 - unpremultTexture.r),"," outTint.g < 0.5 ? 2.0 * outTint.g * unpremultTexture.g : 1.0 - 2.0 * (1.0 - outTint.g) * (1.0 - unpremultTexture.g),"," outTint.r < 0.5 ? 2.0 * outTint.r * unpremultTexture.b : 1.0 - 2.0 * (1.0 - outTint.r) * (1.0 - unpremultTexture.b)"," );"," }"," return vec4(color * alpha, alpha);","}"].join("\n")},81556(t){t.exports=["vec4 boundedSampler(sampler2D sampler, vec2 uv)","{"," if (clamp(uv, 0.0, 1.0) != uv)"," {"," return vec4(0.0, 0.0, 0.0, 0.0);"," }"," return texture2D(sampler, uv);","}"].join("\n")},96293(t){t.exports=["#define SHADER_NAME PHASER_COLORMATRIX_FS","precision mediump float;","uniform sampler2D uMainSampler;","uniform float uColorMatrix[20];","uniform float uAlpha;","varying vec2 outTexCoord;","void main ()","{"," vec4 c = texture2D(uMainSampler, outTexCoord);"," if (uAlpha == 0.0)"," {"," gl_FragColor = c;"," return;"," }"," if (c.a > 0.0)"," {"," c.rgb /= c.a;"," }"," vec4 result;"," result.r = (uColorMatrix[0] * c.r) + (uColorMatrix[1] * c.g) + (uColorMatrix[2] * c.b) + (uColorMatrix[3] * c.a) + uColorMatrix[4];"," result.g = (uColorMatrix[5] * c.r) + (uColorMatrix[6] * c.g) + (uColorMatrix[7] * c.b) + (uColorMatrix[8] * c.a) + uColorMatrix[9];"," result.b = (uColorMatrix[10] * c.r) + (uColorMatrix[11] * c.g) + (uColorMatrix[12] * c.b) + (uColorMatrix[13] * c.a) + uColorMatrix[14];"," result.a = (uColorMatrix[15] * c.r) + (uColorMatrix[16] * c.g) + (uColorMatrix[17] * c.b) + (uColorMatrix[18] * c.a) + uColorMatrix[19];"," c.rgb *= c.a;"," result.rgb *= result.a;"," gl_FragColor = mix(c, result, uAlpha);","}"].join("\n")},78390(t){t.exports=["vec2 v2len (vec2 a, vec2 b)","{"," return sqrt(a*a+b*b);","}","vec2 getBlockyTexCoord (vec2 texCoord, vec2 texRes) {"," texCoord *= texRes;"," vec2 seam = floor(texCoord + 0.5);"," texCoord = (texCoord - seam) / v2len(dFdx(texCoord), dFdy(texCoord)) + seam;"," texCoord = clamp(texCoord, seam-.5, seam+.5);"," return texCoord / texRes;","}"].join("\n")},11719(t){t.exports=["struct Light","{"," vec3 position;"," vec3 color;"," float intensity;"," float radius;","};","const int kMaxLights = LIGHT_COUNT;","uniform vec4 uCamera; /* x, y, rotation, zoom */","uniform sampler2D uNormSampler;","uniform vec3 uAmbientLightColor;","uniform Light uLights[kMaxLights];","uniform int uLightCount;","#ifdef FEATURE_SELFSHADOW","uniform float uDiffuseFlatThreshold;","uniform float uPenumbra;","#endif","vec4 getLighting (vec4 fragColor, vec3 normal)","{"," vec3 finalColor = vec3(0.0);"," vec2 res = vec2(min(uResolution.x, uResolution.y)) * uCamera.w;"," #ifdef FEATURE_SELFSHADOW"," vec3 unpremultipliedColor = fragColor.rgb / fragColor.a;"," float occlusionThreshold = 1.0 - ((unpremultipliedColor.r + unpremultipliedColor.g + unpremultipliedColor.b) / uDiffuseFlatThreshold);"," #endif"," for (int index = 0; index < kMaxLights; ++index)"," {"," if (index < uLightCount)"," {"," Light light = uLights[index];"," vec3 lightDir = vec3((light.position.xy / res) - (gl_FragCoord.xy / res), light.position.z / res.x);"," vec3 lightNormal = normalize(lightDir);"," float distToSurf = length(lightDir) * uCamera.w;"," float diffuseFactor = max(dot(normal, lightNormal), 0.0);"," float radius = (light.radius / res.x * uCamera.w) * uCamera.w;"," float attenuation = clamp(1.0 - distToSurf * distToSurf / (radius * radius), 0.0, 1.0);"," #ifdef FEATURE_SELFSHADOW"," float occluded = smoothstep(0.0, 1.0, (diffuseFactor - occlusionThreshold) / uPenumbra);"," vec3 diffuse = light.color * diffuseFactor * occluded;"," #else"," vec3 diffuse = light.color * diffuseFactor;"," #endif"," finalColor += (attenuation * diffuse) * light.intensity;"," }"," }"," vec4 colorOutput = vec4(uAmbientLightColor + finalColor, 1.0);"," return colorOutput;","}"].join("\n")},14030(t){t.exports=["vec2 clampTexCoordWithinFrame (vec2 texCoord)","{"," vec2 texRes = getTexRes();"," vec4 frameTexel = outFrame * texRes.xyxy;"," vec2 frameMin = frameTexel.xy + vec2(0.5, 0.5);"," vec2 frameMax = frameTexel.xy + frameTexel.zw - vec2(0.5, 0.5);"," return clamp(texCoord, frameMin / texRes, frameMax / texRes);","}"].join("\n")},10235(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform float amount;","varying vec2 outTexCoord;","#pragma phaserTemplate(fragmentHeader)","vec2 Distort(vec2 p)","{"," float theta = atan(p.y, p.x);"," float radius = length(p);"," radius = pow(radius, amount);"," p.x = radius * cos(theta);"," p.y = radius * sin(theta);"," return 0.5 * (p + 1.0);","}","void main()","{"," vec2 xy = 2.0 * outTexCoord - 1.0;"," vec2 texCoord = outTexCoord;"," if (length(xy) < 1.0)"," {"," texCoord = Distort(xy);"," }"," gl_FragColor = boundedSampler(uMainSampler, texCoord);","}"].join("\n")},65980(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uMainSampler2;","uniform float amount;","uniform vec4 color;","varying vec2 outTexCoord;","vec4 NORMAL (vec4 base, vec4 blend)","{"," return blend + base * (1.0 - blend.a);","}","vec4 ADD (vec4 base, vec4 blend)","{"," return base + blend;","}","vec4 MULTIPLY (vec4 base, vec4 blend)","{"," return base * blend;","}","vec4 SCREEN (vec4 base, vec4 blend)","{"," return 1.0 - (1.0 - base) * (1.0 - blend);","}","float overlayChannel (float base, float blend)","{"," return base < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);","}","vec4 OVERLAY (vec4 base, vec4 blend)","{"," return vec4("," overlayChannel(base.r, blend.r),"," overlayChannel(base.g, blend.g),"," overlayChannel(base.b, blend.b),"," overlayChannel(base.a, blend.a)"," );","}","vec4 DARKEN (vec4 base, vec4 blend)","{"," return min(base, blend);","}","vec4 LIGHTEN (vec4 base, vec4 blend)","{"," return max(base, blend);","}","float dodgeChannel (float base, float blend)","{"," return blend == 1.0 ? blend : min(1.0, base / (1.0 - blend));","}","vec4 COLOR_DODGE (vec4 base, vec4 blend)","{"," return vec4("," dodgeChannel(base.r, blend.r),"," dodgeChannel(base.g, blend.g),"," dodgeChannel(base.b, blend.b),"," dodgeChannel(base.a, blend.a)"," );","}","float burnChannel (float base, float blend)","{"," return blend == 0.0 ? blend : 1.0 - min(1.0, (1.0 - base) / blend);","}","vec4 COLOR_BURN (vec4 base, vec4 blend)","{"," return vec4("," burnChannel(base.r, blend.r),"," burnChannel(base.g, blend.g),"," burnChannel(base.b, blend.b),"," burnChannel(base.a, blend.a)"," );","}","float hardLightChannel (float base, float blend)","{"," return blend < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);","}","vec4 HARD_LIGHT (vec4 base, vec4 blend)","{"," return vec4("," hardLightChannel(base.r, blend.r),"," hardLightChannel(base.g, blend.g),"," hardLightChannel(base.b, blend.b),"," hardLightChannel(base.a, blend.a)"," );","}","float softLightChannel (float base, float blend)","{"," return blend < 0.5 ? (2.0 * base * blend + base * base * (1.0 - 2.0 * blend)) : (sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend));","}","vec4 SOFT_LIGHT (vec4 base, vec4 blend)","{"," return vec4("," softLightChannel(base.r, blend.r),"," softLightChannel(base.g, blend.g),"," softLightChannel(base.b, blend.b),"," softLightChannel(base.a, blend.a)"," );","}","vec4 DIFFERENCE (vec4 base, vec4 blend)","{"," return abs(base - blend);","}","vec4 EXCLUSION (vec4 base, vec4 blend)","{"," return base + blend - 2.0 * base * blend;","}","vec3 rgbToHsl (vec3 color)","{"," vec3 hsl = vec3(0.0);"," float fmin = min(min(color.r, color.g), color.b);"," float fmax = max(max(color.r, color.g), color.b);"," float delta = fmax - fmin;"," hsl.z = (fmax + fmin) / 2.0;"," if (delta == 0.0)"," {"," hsl.x = 0.0;"," hsl.y = 0.0;"," }"," else"," {"," if (hsl.z < 0.5)"," {"," hsl.y = delta / (fmax + fmin);"," }"," else"," {"," hsl.y = delta / (2.0 - fmax - fmin);"," }"," float deltaR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;"," float deltaG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;"," float deltaB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;"," if (color.r == fmax)"," {"," hsl.x = deltaB - deltaG;"," }"," else if (color.g == fmax)"," {"," hsl.x = (1.0 / 3.0) + deltaR - deltaB;"," }"," else if (color.b == fmax)"," {"," hsl.x = (2.0 / 3.0) + deltaG - deltaR;"," }"," if (hsl.x < 0.0)"," {"," hsl.x += 1.0;"," }"," else if (hsl.x > 1.0)"," {"," hsl.x -= 1.0;"," }"," }"," return hsl;","}","vec3 hslToRgb (vec3 hsl)","{"," float p = hsl.z * (1.0 - hsl.y);"," float q = hsl.z * (1.0 - hsl.y * hsl.x);"," float t = hsl.z * (1.0 - hsl.y * (1.0 - hsl.x));"," if (hsl.x < 1.0 / 6.0)"," {"," return vec3(hsl.z, t, p);"," }"," else if (hsl.x < 0.5)"," {"," return vec3(q, hsl.z, p);"," }"," else if (hsl.x < 2.0 / 3.0)"," {"," return vec3(p, hsl.z, t);"," }"," return vec3(p, q, hsl.z);","}","vec4 HUE (vec4 base, vec4 blend)","{"," vec3 baseHSL = rgbToHsl(base.rgb);"," vec3 blendHSL = rgbToHsl(blend.rgb);"," return vec4(hslToRgb(vec3(blendHSL.x, baseHSL.y, baseHSL.z)), base.a);","}","vec4 SATURATION (vec4 base, vec4 blend)","{"," vec3 baseHSL = rgbToHsl(base.rgb);"," vec3 blendHSL = rgbToHsl(blend.rgb);"," return vec4(hslToRgb(vec3(baseHSL.x, blendHSL.y, baseHSL.z)), base.a);","}","vec4 COLOR (vec4 base, vec4 blend)","{"," vec3 baseHSL = rgbToHsl(base.rgb);"," vec3 blendHSL = rgbToHsl(blend.rgb);"," return vec4(hslToRgb(vec3(blendHSL.x, blendHSL.y, baseHSL.z)), base.a);","}","vec4 LUMINOSITY (vec4 base, vec4 blend)","{"," vec3 baseHSL = rgbToHsl(base.rgb);"," vec3 blendHSL = rgbToHsl(blend.rgb);"," return vec4(hslToRgb(vec3(baseHSL.x, baseHSL.y, blendHSL.z)), base.a);","}","vec4 ERASE (vec4 base, vec4 blend)","{"," return base * (1.0 - blend.a);","}","vec4 SOURCE_IN (vec4 base, vec4 blend)","{"," return blend * base.a;","}","vec4 SOURCE_OUT (vec4 base, vec4 blend)","{"," return blend * (1.0 - base.a);","}","vec4 SOURCE_ATOP (vec4 base, vec4 blend)","{"," return base * (1.0 - blend.a) + blend * base.a;","}","vec4 DESTINATION_OVER (vec4 base, vec4 blend)","{"," return base + blend * (1.0 - base.a);","}","vec4 DESTINATION_IN (vec4 base, vec4 blend)","{"," return base * blend.a;","}","vec4 DESTINATION_OUT (vec4 base, vec4 blend)","{"," return base * (1.0 - blend.a);","}","vec4 DESTINATION_ATOP (vec4 base, vec4 blend)","{"," return base * blend.a + blend * (1.0 - base.a);","}","vec4 LIGHTER (vec4 base, vec4 blend)","{"," return ADD(base, blend);","}","vec4 COPY (vec4 base, vec4 blend)","{"," return blend;","}","vec4 XOR (vec4 base, vec4 blend)","{"," return base * (1.0 - blend.a) + blend * (1.0 - base.a);","}","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec4 base = boundedSampler(uMainSampler, outTexCoord);"," vec4 blend = boundedSampler(uMainSampler2, outTexCoord) * color;"," vec4 blended = BLEND(base, blend);"," gl_FragColor = mix(base, blended, amount);","}"].join("\n")},5899(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec4 uSizeAndOffset;","varying vec2 outTexCoord;","void main()","{"," vec2 gridCell = floor((outTexCoord * resolution + uSizeAndOffset.zw) / uSizeAndOffset.xy) * uSizeAndOffset.xy - uSizeAndOffset.zw;"," vec2 texCoord = gridCell / resolution;"," gl_FragColor = texture2D(uMainSampler, texCoord);","}"].join("\n")},20784(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 uv = outTexCoord;"," vec4 col = vec4(0.0);"," vec2 off1 = vec2(1.411764705882353) * offset * strength;"," vec2 off2 = vec2(3.2941176470588234) * offset * strength;"," vec2 off3 = vec2(5.176470588235294) * offset * strength;"," col += boundedSampler(uMainSampler, uv) * 0.1964825501511404;"," col += boundedSampler(uMainSampler, uv + (off1 / resolution)) * 0.2969069646728344;"," col += boundedSampler(uMainSampler, uv - (off1 / resolution)) * 0.2969069646728344;"," col += boundedSampler(uMainSampler, uv + (off2 / resolution)) * 0.09447039785044732;"," col += boundedSampler(uMainSampler, uv - (off2 / resolution)) * 0.09447039785044732;"," col += boundedSampler(uMainSampler, uv + (off3 / resolution)) * 0.010381362401148057;"," col += boundedSampler(uMainSampler, uv - (off3 / resolution)) * 0.010381362401148057;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},65122(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 uv = outTexCoord;"," vec4 col = vec4(0.0);"," vec2 offset = vec2(1.333) * offset * strength;"," col += boundedSampler(uMainSampler, uv) * 0.29411764705882354;"," col += boundedSampler(uMainSampler, uv + (offset / resolution)) * 0.35294117647058826;"," col += boundedSampler(uMainSampler, uv - (offset / resolution)) * 0.35294117647058826;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},60942(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform vec2 offset;","uniform float strength;","uniform vec3 color;","varying vec2 outTexCoord;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 uv = outTexCoord;"," vec4 col = vec4(0.0);"," vec2 off1 = vec2(1.3846153846) * offset * strength;"," vec2 off2 = vec2(3.2307692308) * offset * strength;"," col += boundedSampler(uMainSampler, uv) * 0.2270270270;"," col += boundedSampler(uMainSampler, uv + (off1 / resolution)) * 0.3162162162;"," col += boundedSampler(uMainSampler, uv - (off1 / resolution)) * 0.3162162162;"," col += boundedSampler(uMainSampler, uv + (off2 / resolution)) * 0.0702702703;"," col += boundedSampler(uMainSampler, uv - (off2 / resolution)) * 0.0702702703;"," gl_FragColor = col * vec4(color, 1.0);","}"].join("\n")},43722(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","#define ITERATIONS 100.0","#define ONEOVER_ITR 1.0 / ITERATIONS","#define PI 3.141596","#define GOLDEN_ANGLE 2.39996323","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform float radius;","uniform float amount;","uniform float contrast;","uniform bool isTiltShift;","uniform float strength;","uniform vec2 blur;","varying vec2 outTexCoord;","vec2 Sample (in float theta, inout float r)","{"," r += 1.0 / r;"," return (r - 1.0) * vec2(cos(theta), sin(theta)) * 0.06;","}","#pragma phaserTemplate(fragmentHeader)","vec3 Bokeh (sampler2D tex, vec2 uv, float radius)","{"," vec3 acc = vec3(0.0);"," vec3 div = vec3(0.0);"," vec2 pixel = vec2(resolution.y / resolution.x, 1.0) * radius * .025;"," float r = 1.0;"," for (float j = 0.0; j < GOLDEN_ANGLE * ITERATIONS; j += GOLDEN_ANGLE)"," {"," vec3 col = boundedSampler(tex, uv + pixel * Sample(j, r)).xyz;"," col = contrast > 0.0 ? col * col * (1.0 + contrast) : col;"," vec3 bokeh = vec3(0.5) + pow(col, vec3(10.0)) * amount;"," acc += col * bokeh;"," div += bokeh;"," }"," return acc / div;","}","void main ()","{"," float shift = 1.0;"," if (isTiltShift)"," {"," vec2 uv = vec2(gl_FragCoord.xy / resolution + vec2(-0.5, -0.5)) * 2.0;"," float centerStrength = 1.0;"," shift = length(uv * blur * strength) * centerStrength;"," }"," gl_FragColor = vec4(Bokeh(uMainSampler, outTexCoord * vec2(1.0, 1.0), radius * shift), 0.0);","}"].join("\n")},19883(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform float uColorMatrix[20];","uniform float uAlpha;","varying vec2 outTexCoord;","void main ()","{"," vec4 c = texture2D(uMainSampler, outTexCoord);"," if (uAlpha == 0.0)"," {"," gl_FragColor = c;"," return;"," }"," if (c.a > 0.0)"," {"," c.rgb /= c.a;"," }"," vec4 result;"," result.r = (uColorMatrix[0] * c.r) + (uColorMatrix[1] * c.g) + (uColorMatrix[2] * c.b) + (uColorMatrix[3] * c.a) + uColorMatrix[4];"," result.g = (uColorMatrix[5] * c.r) + (uColorMatrix[6] * c.g) + (uColorMatrix[7] * c.b) + (uColorMatrix[8] * c.a) + uColorMatrix[9];"," result.b = (uColorMatrix[10] * c.r) + (uColorMatrix[11] * c.g) + (uColorMatrix[12] * c.b) + (uColorMatrix[13] * c.a) + uColorMatrix[14];"," result.a = (uColorMatrix[15] * c.r) + (uColorMatrix[16] * c.g) + (uColorMatrix[17] * c.b) + (uColorMatrix[18] * c.a) + uColorMatrix[19];"," vec3 rgb = mix(c.rgb, result.rgb, uAlpha);"," rgb *= result.a;"," gl_FragColor = vec4(rgb, result.a);","}"].join("\n")},32624(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uTransferSampler;","uniform float uColorMatrixSelf[20];","uniform float uColorMatrixTransfer[20];","uniform float uAlphaSelf;","uniform float uAlphaTransfer;","uniform vec4 uAdditions;","uniform vec4 uMultiplications;","varying vec2 outTexCoord;","#define S uColorMatrixSelf","#define T uColorMatrixTransfer","void main ()","{"," vec4 self = texture2D(uMainSampler, outTexCoord);"," if (uAlphaSelf == 0.0)"," {"," gl_FragColor = self;"," return;"," }"," if (self.a > 0.0)"," {"," self.rgb /= self.a;"," }"," vec4 resultSelf;"," resultSelf.r = (S[0] * self.r) + (S[1] * self.g) + (S[2] * self.b) + (S[3] * self.a) + S[4];"," resultSelf.g = (S[5] * self.r) + (S[6] * self.g) + (S[7] * self.b) + (S[8] * self.a) + S[9];"," resultSelf.b = (S[10] * self.r) + (S[11] * self.g) + (S[12] * self.b) + (S[13] * self.a) + S[14];"," resultSelf.a = (S[15] * self.r) + (S[16] * self.g) + (S[17] * self.b) + (S[18] * self.a) + S[19];"," if (uAlphaTransfer == 0.0)"," {"," self.rgb *= self.a;"," resultSelf.rgb *= resultSelf.a;"," gl_FragColor = mix(self, resultSelf, uAlphaSelf);"," return;"," }"," vec4 tex = texture2D(uTransferSampler, outTexCoord);"," if (tex.a > 0.0)"," {"," tex.rgb /= tex.a;"," }"," vec4 resultTransfer;"," resultTransfer.r = (T[0] * tex.r) + (T[1] * tex.g) + (T[2] * tex.b) + (T[3] * tex.a) + T[4];"," resultTransfer.g = (T[5] * tex.r) + (T[6] * tex.g) + (T[7] * tex.b) + (T[8] * tex.a) + T[9];"," resultTransfer.b = (T[10] * tex.r) + (T[11] * tex.g) + (T[12] * tex.b) + (T[13] * tex.a) + T[14];"," resultTransfer.a = (T[15] * tex.r) + (T[16] * tex.g) + (T[17] * tex.b) + (T[18] * tex.a) + T[19];"," vec4 combo = (resultSelf + resultTransfer) * uAdditions + (resultSelf * resultTransfer) * uMultiplications;"," self.rgb *= self.a;"," resultSelf.rgb *= resultSelf.a;"," combo.rgb *= combo.a;"," gl_FragColor = mix(self, mix(resultSelf, combo, uAlphaTransfer), uAlphaSelf);","}"].join("\n")},12886(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uDisplacementSampler;","uniform vec2 amount;","varying vec2 outTexCoord;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 disp = (-vec2(0.5, 0.5) + texture2D(uDisplacementSampler, outTexCoord).rg) * amount;"," gl_FragColor = boundedSampler(uMainSampler, outTexCoord + disp).rgba;","}"].join("\n")},33016(t){t.exports=["#pragma phaserTemplate(shaderName)","#define DISTANCE 10.0","#define QUALITY 10.0","#pragma phaserTemplate(fragmentDefine)","precision mediump float;","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","uniform float outerStrength;","uniform float innerStrength;","uniform float scale;","uniform vec2 resolution;","uniform vec4 glowColor;","uniform bool knockout;","const float PI = 3.14159265358979323846264;","const float MAX_ALPHA = DISTANCE * (DISTANCE + 1.0) * QUALITY / 2.0;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 px = vec2(1.0 / resolution.x, 1.0 / resolution.y) * scale;"," float totalAlpha = 0.0;"," float curAngle = 0.0;"," vec2 direction;"," vec2 displaced;"," vec4 color;"," for (float curDistance = 0.0; curDistance < DISTANCE; curDistance++)"," {"," curAngle += fract(sin(dot(vec2(curDistance, outTexCoord.x + outTexCoord.y), vec2(12.9898, 78.233))) * 43758.5453);"," for (float i = 0.0; i < QUALITY; i++)"," {"," curAngle += PI * 2.0 / (QUALITY);"," direction = vec2(cos(curAngle), sin(curAngle)) * px;"," displaced = outTexCoord + direction * (curDistance + 1.0);"," color = boundedSampler(uMainSampler, displaced);"," totalAlpha += (DISTANCE - curDistance) * color.a;"," }"," }"," color = boundedSampler(uMainSampler, outTexCoord);"," float alphaRatio = (totalAlpha / MAX_ALPHA);"," float innerGlowAlpha = (1.0 - alphaRatio) * innerStrength * color.a;"," float innerGlowStrength = min(1.0, innerGlowAlpha);"," vec4 innerColor = mix(color, glowColor, innerGlowStrength);"," float outerGlowAlpha = alphaRatio * outerStrength * (1.0 - color.a);"," float outerGlowStrength = min(1.0 - innerColor.a, outerGlowAlpha);"," if (knockout)"," {"," float resultAlpha = outerGlowStrength + innerGlowStrength;"," gl_FragColor = vec4(glowColor.rgb * resultAlpha, resultAlpha);"," }"," else"," {"," vec4 outerGlowColor = outerGlowStrength * glowColor.rgba;"," gl_FragColor = innerColor + outerGlowColor;"," }","}"].join("\n")},33179(t){t.exports=["#pragma phaserTemplate(shaderName)","precision highp float;","#pragma phaserTemplate(fragmentHeader)","uniform sampler2D uMainSampler;","uniform vec4 uColor;","uniform vec4 uColorFactor;","uniform bool uUnpremultiply;","uniform float uAlpha;","varying vec2 outTexCoord;","void main ()","{"," vec4 sample = texture2D(uMainSampler, outTexCoord);"," if (uUnpremultiply)"," {"," sample.rgb /= sample.a;"," }"," vec4 modulatedSample = sample * uColorFactor + uColor;"," float progress = modulatedSample.r + modulatedSample.g + modulatedSample.b + modulatedSample.a;"," vec4 rampColor = getRampAt(progress);"," rampColor.rgb *= rampColor.a;"," gl_FragColor = mix(sample, rampColor * sample.a, uAlpha);","}"].join("\n")},94526(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uEnvSampler;","uniform sampler2D uNormSampler;","uniform mat4 uViewMatrix;","uniform float uModelRotation;","uniform float uBulge;","uniform vec3 uColorFactor;","varying vec2 outTexCoord;","#define PI 3.14159265358979323846","void main()","{"," vec4 color = texture2D(uMainSampler, outTexCoord);"," vec3 normal = texture2D(uNormSampler, outTexCoord).rgb;"," vec3 normalN = normal * 2.0 - 1.0;"," float normalXYLength = length(normalN.xy);"," float angle = atan("," normalN.y,"," normalN.x"," ) - uModelRotation;"," normalN = vec3("," normalXYLength * cos(angle),"," normalXYLength * sin(angle),"," normalN.z"," );"," normalN = reflect(vec3(0.0, 0.0, -1.0), normalN);"," normalN = (uViewMatrix * vec4(normalN, 1.0)).xyz;"," float envX = atan(normalN.x, normalN.z) / PI;"," float envY = sin(normalN.y * PI / 2.0);"," vec2 uv = vec2(envX, envY) * 0.5 + 0.5;"," vec2 rotatedTexCoord = vec2("," cos(-uModelRotation) * outTexCoord.x - sin(-uModelRotation) * outTexCoord.y,"," sin(-uModelRotation) * outTexCoord.x + cos(- uModelRotation) * outTexCoord.y"," );"," uv += uBulge * (rotatedTexCoord - 0.5);"," if (uv.y < 0.0)"," {"," uv.y = abs(uv.y);"," uv.x += 0.5;"," }"," else if (uv.y > 1.0)"," {"," uv.y = 2.0 - uv.y;"," uv.x += 0.5;"," }"," vec3 environment = texture2D(uEnvSampler, uv).rgb;"," gl_FragColor = vec4(environment * color.rgb * uColorFactor, color.a);","}"].join("\n")},4488(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec4 uColor;","uniform vec4 uIsolateThresholdFeather;","varying vec2 outTexCoord;","void main()","{"," vec4 color = texture2D(uMainSampler, outTexCoord);"," vec3 unpremultipliedColor = color.rgb / color.a;"," float isolate = uIsolateThresholdFeather.x;"," float threshold = uIsolateThresholdFeather.y;"," float feather = uIsolateThresholdFeather.z;"," float match = distance(unpremultipliedColor, uColor.rgb);"," match = clamp(match - threshold, 0.0, 1.0);"," match = clamp(match / feather, 0.0, 1.0);"," if (isolate == 1.0)"," {"," match = 1.0 - match;"," }"," match = mix(1.0, match, uColor.a);"," gl_FragColor = color * match;","}"].join("\n")},39603(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uMaskSampler;","uniform bool invert;","varying vec2 outTexCoord;","void main ()","{"," vec4 color = texture2D(uMainSampler, outTexCoord);"," vec4 mask = texture2D(uMaskSampler, outTexCoord);"," float a = mask.a;"," color *= invert ? (1.0 - a) : a;"," gl_FragColor = color;","}"].join("\n")},60047(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","#pragma phaserTemplate(fragmentHeader)","uniform sampler2D uMainSampler;","uniform mat4 uViewMatrix;","#ifdef FACING_POWER","uniform float uFacingPower;","#endif","#ifdef OUTPUT_RATIO","uniform vec3 uRatioVector;","uniform float uRatioRadius;","#endif","varying vec2 outTexCoord;","void main()","{"," vec3 normal = texture2D(uMainSampler, outTexCoord).rgb * 2.0 - 1.0;"," normal = (uViewMatrix * vec4(normal, 1.0)).xyz;"," #ifdef FACING_POWER"," normal = normalize(normal * vec3(1.0, 1.0, uFacingPower));"," #endif"," #ifdef OUTPUT_RATIO"," float ratio = dot(normal, normalize(uRatioVector));"," ratio = (ratio - 1.0 + uRatioRadius) / uRatioRadius;"," if (ratio <= 0.0)"," {"," ratio = 0.0;"," }"," normal = vec3(ratio * 2.0 - 1.0);"," #endif"," gl_FragColor = vec4((normal + 1.0) * 0.5, 1.0);","}"].join("\n")},7529(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform float uRadius;","uniform float uPower;","varying vec2 outTexCoord;","#define PI 3.14159265358979323846","#pragma phaserTemplate(fragmentHeader)","#define STEP_X 1.0 / SAMPLES_X","#define STEP_Y 1.0 / SAMPLES_Y","vec3 uvPanoramaNormal(vec2 uv)","{"," float y = uv.y * 2.0 - 1.0;"," float angle = (uv.x * 2.0 - 1.0) * PI;"," float x = sin(angle);"," float z = cos(angle);"," vec2 xz = vec2(x, z);"," xz *= sqrt(1.0 - y * y);"," return normalize(vec3(xz.x, y, xz.y));","}","void main()","{"," vec3 acc = vec3(0.0);"," float div = 0.0;"," vec3 texelNormal = uvPanoramaNormal(outTexCoord);"," for (float y = STEP_Y / 2.0; y < 1.0; y += STEP_Y)"," {"," float yWeight = cos((y * 2.0 - 1.0) * PI / 2.0);"," for (float x = STEP_X / 2.0; x < 1.0; x += STEP_X)"," {"," vec2 uv = vec2(x, y);"," vec3 sampleNormal = uvPanoramaNormal(uv);"," float dotProduct = dot(sampleNormal, texelNormal);"," dotProduct = (dotProduct - 1.0 + uRadius) / uRadius;"," if (dotProduct <= 0.0)"," {"," continue;"," }"," vec3 color = texture2D(uMainSampler, uv).rgb;"," color *= pow(length(color), uPower);"," acc += color * dotProduct * yWeight;"," div += dotProduct * yWeight;"," }"," }"," gl_FragColor = vec4(acc / div, 1.0);","}"].join("\n")},99191(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec2 resolution;","uniform float amount;","varying vec2 outTexCoord;","void main ()","{"," float pixelSize = floor(2.0 + amount);"," vec2 center = pixelSize * floor(outTexCoord * resolution / pixelSize) + pixelSize * vec2(0.5, 0.5);"," vec2 corner1 = center + pixelSize * vec2(-0.5, -0.5);"," vec2 corner2 = center + pixelSize * vec2(+0.5, -0.5);"," vec2 corner3 = center + pixelSize * vec2(+0.5, +0.5);"," vec2 corner4 = center + pixelSize * vec2(-0.5, +0.5);"," vec4 pixel = 0.4 * texture2D(uMainSampler, center / resolution);"," pixel += 0.15 * texture2D(uMainSampler, corner1 / resolution);"," pixel += 0.15 * texture2D(uMainSampler, corner2 / resolution);"," pixel += 0.15 * texture2D(uMainSampler, corner3 / resolution);"," pixel += 0.15 * texture2D(uMainSampler, corner4 / resolution);"," gl_FragColor = pixel;","}"].join("\n")},88430(t){t.exports=["#pragma phaserTemplate(shaderName)","precision highp float;","uniform sampler2D uMainSampler;","uniform vec4 uSteps;","uniform vec4 uGamma;","uniform vec4 uOffset;","uniform int uMode;","uniform bool uDither;","varying vec2 outTexCoord;","vec4 rgbaToHsva(vec4 rgba)","{"," float r = rgba.r;"," float g = rgba.g;"," float b = rgba.b;"," float a = rgba.a;"," float min = min(min(r, g), b);"," float max = max(max(r, g), b);"," float d = max - min;"," float h = 0.0;"," float s = (max == 0.0) ? 0.0 : d / max;"," float v = max;"," if (max != min)"," {"," if (max == r)"," {"," h = (g - b) / d + ((g < b) ? 6.0 : 0.0);"," }"," else if (max == g)"," {"," h = (b - r) / d + 2.0;"," }"," else"," {"," h = (r - g) / d + 4.0;"," }"," h /= 6.0;"," }"," return vec4(h, s, v, a);","}","float hsvaToRgbaConvert(float n, vec4 hsva)","{"," float k = mod(n + hsva.x * 6.0, 6.0);"," float min = min(min(k, 4.0 - k), 1.0);"," return hsva.z - hsva.z * hsva.y * max(0.0, min);","}","vec4 hsvaToRgba(vec4 hsva)","{"," return vec4("," hsvaToRgbaConvert(5.0, hsva),"," hsvaToRgbaConvert(3.0, hsva),"," hsvaToRgbaConvert(1.0, hsva),"," hsva.a"," );","}","vec4 ditherIGN(vec4 value)","{"," value += fract(52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y)) - 0.5;"," return value;","}","void main ()","{"," vec4 sample = texture2D(uMainSampler, outTexCoord);"," if (uMode == 1)"," {"," sample = rgbaToHsva(sample);"," }"," sample = pow(sample, uGamma);"," sample -= uOffset;"," vec4 steps = max(uSteps - 1.0, 1.0);"," sample *= steps;"," if (uDither)"," {"," sample = ditherIGN(sample);"," }"," sample = ceil(sample - 0.5);"," sample /= steps;"," sample += uOffset;"," sample = pow(sample, 1.0 / uGamma);"," if (uMode == 1)"," {"," sample.x = mod(sample.x, 1.0);"," sample = hsvaToRgba(clamp(sample, 0.0, 1.0));"," }"," gl_FragColor = sample;","}"].join("\n")},69355(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","varying vec2 outTexCoord;","uniform vec2 lightPosition;","uniform vec4 color;","uniform float decay;","uniform float power;","uniform float intensity;","uniform int samples;","const int MAX = 12;","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec4 texture = boundedSampler(uMainSampler, outTexCoord);"," vec2 pc = (lightPosition - outTexCoord) * intensity;"," float shadow = 0.0;"," float limit = max(float(MAX), float(samples));"," for (int i = 0; i < MAX; ++i)"," {"," if (i >= samples)"," {"," break;"," }"," shadow += boundedSampler(uMainSampler, outTexCoord + float(i) * decay / limit * pc).a * power;"," }"," float mask = 1.0 - texture.a;"," gl_FragColor = mix(texture, color, clamp(shadow * mask, 0.0, 1.0));","}"].join("\n")},92636(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform vec4 edge1;","uniform vec4 edge2;","uniform vec4 invert;","varying vec2 outTexCoord;","void main ()","{"," vec4 color = texture2D(uMainSampler, outTexCoord);"," color = clamp((color - edge1) / (edge2 - edge1), 0.0, 1.0);"," color = mix(color, 1.0 - color, invert);"," gl_FragColor = color;","}"].join("\n")},18185(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform float uRadius;","uniform float uStrength;","uniform vec2 uPosition;","uniform vec4 uColor;","uniform int uBlendMode;","varying vec2 outTexCoord;","void main ()","{"," float vignette = 1.0;"," vec2 position = vec2(uPosition.x, 1.0 - uPosition.y);"," float d = length(outTexCoord - position);"," if (d <= uRadius)"," {"," float g = d / uRadius;"," vignette = sin(g * 3.14 * uStrength);"," }"," vec4 color = uColor;"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," if (uBlendMode == 1)"," {"," color.rgb = texture.rgb + color.rgb;"," }"," else if (uBlendMode == 2)"," {"," color.rgb = texture.rgb * color.rgb;"," }"," else if (uBlendMode == 3)"," {"," color.rgb = 1.0 - ((1.0 - texture.rgb) * (1.0 - color.rgb));"," }"," gl_FragColor = mix(texture, color, vignette);","}"].join("\n")},99174(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","uniform sampler2D uMainSampler;","uniform sampler2D uMainSampler2;","uniform vec4 uProgress_WipeWidth_Direction_Axis;","uniform float uReveal;","varying vec2 outTexCoord;","void main ()","{"," vec4 color0;"," vec4 color1;"," if (uReveal == 0.0)"," {"," color0 = texture2D(uMainSampler, outTexCoord);"," color1 = texture2D(uMainSampler2, outTexCoord);"," }"," else"," {"," color0 = texture2D(uMainSampler2, outTexCoord);"," color1 = texture2D(uMainSampler, outTexCoord);"," }"," float distance = uProgress_WipeWidth_Direction_Axis.x;"," float width = uProgress_WipeWidth_Direction_Axis.y;"," float direction = uProgress_WipeWidth_Direction_Axis.z;"," float axis = outTexCoord.x;"," if (uProgress_WipeWidth_Direction_Axis.w == 1.0)"," {"," axis = outTexCoord.y;"," }"," float adjust = mix(width, -width, distance);"," float value = smoothstep(distance - width, distance + width, abs(direction - axis) + adjust);"," gl_FragColor = mix(color1, color0, value);","}"].join("\n")},73416(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(fragmentDefine)","uniform vec2 uResolution;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec4 fragColor = outTint;"," #pragma phaserTemplate(fragmentProcess)"," gl_FragColor = fragColor;","}"].join("\n")},91627(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","attribute vec4 inTint;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTint = vec4(inTint.bgr * inTint.a, inTint.a);"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},84220(t){t.exports=["vec3 getNormalFromMap (vec2 texCoord)","{"," vec3 normalMap = texture2D(uNormSampler, texCoord).rgb;"," return normalize(outInverseRotationMatrix * vec3(normalMap * 2.0 - 1.0));","}"].join("\n")},2860(t){t.exports=["uniform vec2 uMainResolution[TEXTURE_COUNT];","vec2 getTexRes ()","{"," #if TEXTURE_COUNT == 1"," float texId = 0.0;"," #else"," float texId = outTexDatum;"," #endif"," #pragma phaserTemplate(texIdProcess)"," vec2 texRes = vec2(0.0);"," for (int i = 0; i < TEXTURE_COUNT; i++)"," {"," if (texId == float(i))"," {"," texRes = uMainResolution[i];"," break;"," }"," }"," return texRes;","}"].join("\n")},46432(t){t.exports=["uniform sampler2D uMainSampler[TEXTURE_COUNT];","vec4 getTexture (vec2 texCoord)","{"," #if TEXTURE_COUNT == 1"," return texture2D(uMainSampler[0], texCoord);"," #else"," if (outTexDatum == 0.0) return texture2D(uMainSampler[0], texCoord);"," #define ELSE_TEX_CASE(INDEX) else if (outTexDatum == float(INDEX)) return texture2D(uMainSampler[INDEX], texCoord);"," #pragma phaserTemplate(texIdProcess)"," else return vec4(0.0, 0.0, 0.0, 0.0);"," #endif","}"].join("\n")},41509(t){t.exports=["#pragma phaserTemplate(shaderName)","precision highp float;","#pragma phaserTemplate(fragmentHeader)","#define PI 3.14159265358979323846","uniform int uRepeatMode;","uniform float uOffset;","uniform int uShapeMode;","uniform vec2 uShape;","uniform vec2 uStart;","varying vec2 outTexCoord;","float linear()","{"," float len = length(uShape);"," return dot(uShape, outTexCoord - uStart) / len / len;","}","float bilinear()","{"," return abs(linear());","}","float radial()","{"," return distance(uStart, outTexCoord) / length(uShape);","}","float conicSymmetric()","{"," return dot(normalize(uShape), normalize(outTexCoord - uStart)) * 0.5 + 0.5;","}","float conicAsymmetric()","{"," vec2 fromStart = outTexCoord - uStart;"," float angleFromStart = atan(fromStart.y, fromStart.x);"," float shapeAngle = atan(uShape.y, uShape.x);"," float angle = (angleFromStart - shapeAngle) / PI / 2.0;"," if (angle < 0.0) angle += 1.0;"," return angle;","}","float repeat(float value)","{"," if (uRepeatMode == 1)"," {"," if (value < 0.0 || value > 1.0)"," {"," discard;"," }"," return value;"," }"," else if (uRepeatMode == 2)"," {"," return mod(value, 1.0);"," }"," else if (uRepeatMode == 3)"," {"," return 1.0 - abs(1.0 - mod(value, 2.0));"," }"," return clamp(value, 0.0, 1.0);","}","void main()","{"," float progress = 0.0;"," if (uShapeMode == 0)"," {"," progress = linear();"," }"," else if (uShapeMode == 1)"," {"," progress = bilinear();"," }"," else if (uShapeMode == 2)"," {"," progress = radial();"," }"," else if (uShapeMode == 3)"," {"," progress = conicSymmetric();"," }"," else if (uShapeMode == 4)"," {"," progress = conicAsymmetric();"," }"," progress -= uOffset;"," progress = repeat(progress);"," vec4 bandCol = getRampAt(progress);"," bandCol.rgb *= bandCol.a;"," gl_FragColor = bandCol;","}"].join("\n")},98840(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(fragmentDefine)","uniform vec2 uResolution;","varying vec2 outTexCoord;","varying float outTexDatum;","varying float outTintEffect;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," #pragma phaserTemplate(fragmentProcess)"," gl_FragColor = fragColor;","}"].join("\n")},44667(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","attribute float inTexDatum;","attribute float inTintEffect;","attribute vec4 inTint;","varying vec2 outTexCoord;","varying float outTexDatum;","varying float outTintEffect;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," outTexDatum = inTexDatum;"," outTint = inTint;"," outTintEffect = inTintEffect;"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},16421(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec2 uOffset;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","uniform float uPower;","uniform int uMode;","varying vec2 outTexCoord;","float trig(vec2 p)","{"," return fract(43757.5453*sin(dot(p, vec2(12.9898,78.233))));","}","void main ()","{"," float value = pow(trig(outTexCoord + uOffset), uPower);"," if (uMode == 0)"," {"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," }"," else if (uMode == 1)"," {"," float valueR = pow(trig(outTexCoord + uOffset + 32.1), uPower);"," float valueG = pow(trig(outTexCoord + uOffset + 11.1), uPower);"," float valueB = pow(trig(outTexCoord + uOffset + 23.4), uPower);"," vec4 color = vec4(valueR, valueG, valueB, 1.);"," color *= mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," }"," else if (uMode == 2)"," {"," float valueAngle = pow(trig(outTexCoord + uOffset), uPower) * 3.141592;"," float x = value * cos(valueAngle);"," float y = value * sin(valueAngle);"," vec4 color = vec4("," x,"," y,"," sqrt(1. - x * x - y * y),"," 1.0"," );"," gl_FragColor = color * 0.5 + 0.5;"," }","}"].join("\n")},83587(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(fragmentIterations)","#pragma phaserTemplate(fragmentNormalMap)","#ifndef ITERATION_COUNT","#define ITERATION_COUNT 1.0","#endif","#ifndef WARP_ITERATION_COUNT","#define WARP_ITERATION_COUNT 1.0","#endif","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec2 uCells;","uniform vec2 uPeriod;","uniform vec2 uOffset;","uniform float uFlow;","uniform float uDetailPower;","uniform float uFlowPower;","uniform float uContributionPower;","uniform float uWarpDetailPower;","uniform float uWarpFlowPower;","uniform float uWarpContributionPower;","uniform float uWarpAmount;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","uniform float uNormalScale;","uniform float uValueFactor;","uniform float uValueAdd;","uniform float uValuePower;","uniform vec2 uSeed;","varying vec2 outTexCoord;","float psrdnoise(vec2 x, vec2 period, float alpha)","{"," vec2 uv = vec2(x.x+x.y*0.5, x.y);"," vec2 i0 = floor(uv), f0 = fract(uv);"," float cmp = step(f0.y, f0.x);"," vec2 o1 = vec2(cmp, 1.0-cmp);"," vec2 i1 = i0 + o1, i2 = i0 + 1.0;"," vec2 v0 = vec2(i0.x - i0.y*0.5, i0.y);"," vec2 v1 = vec2(v0.x + o1.x - o1.y*0.5, v0.y + o1.y);"," vec2 v2 = vec2(v0.x + 0.5, v0.y + 1.0);"," vec2 x0 = x - v0, x1 = x - v1, x2 = x - v2;"," vec3 iu, iv, xw, yw;"," if(any(greaterThan(period, vec2(0.0)))) {"," xw = vec3(v0.x, v1.x, v2.x); yw = vec3(v0.y, v1.y, v2.y);"," if(period.x > 0.0)"," xw = mod(vec3(v0.x, v1.x, v2.x), period.x);"," if(period.y > 0.0)"," yw = mod(vec3(v0.y, v1.y, v2.y), period.y);"," iu = floor(xw + 0.5*yw + 0.5); iv = floor(yw + 0.5);"," } else {"," iu = vec3(i0.x, i1.x, i2.x); iv = vec3(i0.y, i1.y, i2.y);"," }"," iu += uSeed.xxx; iv += uSeed.yyy;"," vec3 hash = mod(iu, 289.0);"," hash = mod((hash*51.0 + 2.0)*hash + iv, 289.0);"," hash = mod((hash*34.0 + 10.0)*hash, 289.0);"," vec3 psi = hash*0.07482 + alpha;"," vec3 gx = cos(psi); vec3 gy = sin(psi);"," vec2 g0 = vec2(gx.x, gy.x);"," vec2 g1 = vec2(gx.y, gy.y);"," vec2 g2 = vec2(gx.z, gy.z);"," vec3 w = 0.8 - vec3(dot(x0, x0), dot(x1, x1), dot(x2, x2));"," w = max(w, 0.0); vec3 w2 = w*w; vec3 w4 = w2*w2;"," vec3 gdotx = vec3(dot(g0, x0), dot(g1, x1), dot(g2, x2));"," float n = dot(w4, gdotx);"," return 10.9*n;","}","float iterate (vec2 coord, float detailPower, float flowPower, float contributionPower)","{"," float value = 0.;"," float itValue = 0.;"," for (float iteration = 0.; iteration < ITERATION_COUNT; iteration++)"," {"," float detailScale = pow(detailPower, iteration);"," float flowScale = pow(flowPower, iteration);"," itValue = psrdnoise((coord + iteration) * detailScale, uPeriod * detailScale, uFlow * flowScale + iteration);"," value += itValue / pow(contributionPower, iteration);"," }"," return value;","}","float iterateWarp (vec2 coord, float detailPower, float flowPower, float contributionPower)","{"," float value = 0.;"," float itValue = 0.;"," for (float iteration = 0.; iteration < WARP_ITERATION_COUNT; iteration++)"," {"," float detailScale = pow(detailPower, iteration);"," float flowScale = pow(flowPower, iteration);"," itValue = psrdnoise((coord + iteration) * detailScale, uPeriod * detailScale, uFlow * flowScale + iteration);"," value += itValue / pow(contributionPower, iteration);"," }"," return value;","}","vec2 warp (vec2 coord)","{"," vec2 o2 = vec2(11.3, 23.7);"," float coord1 = iterateWarp(coord, uWarpDetailPower, uWarpFlowPower, uWarpContributionPower);"," float coord2 = iterateWarp(coord + o2, uWarpDetailPower, uWarpFlowPower, uWarpContributionPower);"," return vec2(coord1, coord2);","}","void main ()","{"," vec2 coord = outTexCoord * uCells + uOffset;"," if (uWarpAmount > 0.)"," {"," coord += warp(coord) * uWarpAmount;"," }"," float value = iterate(coord, uDetailPower, uFlowPower, uContributionPower) * uValueFactor + uValueAdd;"," value = pow(clamp(value, 0., 1.), uValuePower);"," #ifndef NORMAL_MAP"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," #else"," float dx = dFdx(value) * uNormalScale;"," float dy = dFdy(value) * uNormalScale;"," vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;"," gl_FragColor = vec4(normal, 1.0);"," #endif","}"].join("\n")},13460(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(fragmentIterations)","#pragma phaserTemplate(fragmentNormalMap)","#ifndef ITERATION_COUNT","#define ITERATION_COUNT 1.0","#endif","#ifndef WARP_ITERATION_COUNT","#define WARP_ITERATION_COUNT 1.0","#endif","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec3 uCells;","uniform vec3 uPeriod;","uniform vec3 uOffset;","uniform float uFlow;","uniform float uDetailPower;","uniform float uFlowPower;","uniform float uContributionPower;","uniform float uWarpDetailPower;","uniform float uWarpFlowPower;","uniform float uWarpContributionPower;","uniform float uWarpAmount;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","uniform float uNormalScale;","uniform float uValueFactor;","uniform float uValueAdd;","uniform float uValuePower;","uniform vec3 uSeed;","varying vec2 outTexCoord;","vec4 permute(vec4 i) {"," vec4 im = mod(i, 289.0);"," return mod(((im * 34.0) + 10.0) * im, 289.0);","}","float psrdnoise(vec3 x, vec3 period, float alpha) {"," const mat3 M = mat3(0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0);"," const mat3 Mi = mat3(-0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5);"," vec3 uvw = M * x;"," vec3 i0 = floor(uvw);"," vec3 f0 = fract(uvw);"," vec3 g_ = step(f0.xyx, f0.yzz);"," vec3 l_ = 1.0 - g_;"," vec3 g = vec3(l_.z, g_.xy);"," vec3 l = vec3(l_.xy, g_.z);"," vec3 o1 = min(g, l);"," vec3 o2 = max(g, l);"," vec3 i1 = i0 + o1, i2 = i0 + o2, i3 = i0 + 1.0;"," vec3 v0 = Mi * i0, v1 = Mi * i1, v2 = Mi * i2, v3 = Mi * i3;"," vec3 x0 = x - v0, x1 = x - v1, x2 = x - v2, x3 = x - v3;"," if(any(greaterThan(period, vec3(0.0)))) {"," vec4 vx = vec4(v0.x, v1.x, v2.x, v3.x);"," vec4 vy = vec4(v0.y, v1.y, v2.y, v3.y);"," vec4 vz = vec4(v0.z, v1.z, v2.z, v3.z);"," if(period.x > 0.0)"," vx = mod(vx, period.x);"," if(period.y > 0.0)"," vy = mod(vy, period.y);"," if(period.z > 0.0)"," vz = mod(vz, period.z);"," i0 = floor(M * vec3(vx.x, vy.x, vz.x) + 0.5);"," i1 = floor(M * vec3(vx.y, vy.y, vz.y) + 0.5);"," i2 = floor(M * vec3(vx.z, vy.z, vz.z) + 0.5);"," i3 = floor(M * vec3(vx.w, vy.w, vz.w) + 0.5);"," }"," i0 += uSeed; i1 += uSeed; i2 += uSeed; i3 += uSeed;"," vec4 hash = permute(permute(permute(vec4(i0.z, i1.z, i2.z, i3.z)) + vec4(i0.y, i1.y, i2.y, i3.y)) + vec4(i0.x, i1.x, i2.x, i3.x));"," vec4 theta = hash * 3.883222077;"," vec4 sz = 0.996539792 - 0.006920415 * hash;"," vec4 psi = hash * 0.108705628;"," vec4 Ct = cos(theta);"," vec4 St = sin(theta);"," vec4 sz_prime = sqrt(1.0 - sz * sz);"," vec4 gx, gy, gz;"," if(alpha != 0.0) {"," vec4 px = Ct * sz_prime;"," vec4 py = St * sz_prime;"," vec4 pz = sz;"," vec4 Sp = sin(psi);"," vec4 Cp = cos(psi);"," vec4 Ctp = St * Sp - Ct * Cp;"," vec4 qx = mix(Ctp * St, Sp, sz);"," vec4 qy = mix(-Ctp * Ct, Cp, sz);"," vec4 qz = -(py * Cp + px * Sp);"," vec4 Sa = vec4(sin(alpha));"," vec4 Ca = vec4(cos(alpha));"," gx = Ca * px + Sa * qx;"," gy = Ca * py + Sa * qy;"," gz = Ca * pz + Sa * qz;"," } else {"," gx = Ct * sz_prime;"," gy = St * sz_prime;"," gz = sz;"," }"," vec3 g0 = vec3(gx.x, gy.x, gz.x), g1 = vec3(gx.y, gy.y, gz.y);"," vec3 g2 = vec3(gx.z, gy.z, gz.z), g3 = vec3(gx.w, gy.w, gz.w);"," vec4 w = 0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3));"," w = max(w, 0.0);"," vec4 w2 = w * w;"," vec4 w3 = w2 * w;"," vec4 gdotx = vec4(dot(g0, x0), dot(g1, x1), dot(g2, x2), dot(g3, x3));"," float n = dot(w3, gdotx);"," return 39.5 * n;","}","float iterate (vec3 coord, float detailPower, float flowPower, float contributionPower)","{"," float value = 0.;"," float itValue = 0.;"," for (float iteration = 0.; iteration < ITERATION_COUNT; iteration++)"," {"," float detailScale = pow(detailPower, iteration);"," float flowScale = pow(flowPower, iteration);"," itValue = psrdnoise((coord + iteration) * detailScale, uPeriod * detailScale, uFlow * flowScale + iteration);"," value += itValue / pow(contributionPower, iteration);"," }"," return value;","}","float iterateWarp (vec3 coord, float detailPower, float flowPower, float contributionPower)","{"," float value = 0.;"," float itValue = 0.;"," for (float iteration = 0.; iteration < WARP_ITERATION_COUNT; iteration++)"," {"," float detailScale = pow(detailPower, iteration);"," float flowScale = pow(flowPower, iteration);"," itValue = psrdnoise((coord + iteration) * detailScale, uPeriod * detailScale, uFlow * flowScale + iteration);"," value += itValue / pow(contributionPower, iteration);"," }"," return value;","}","vec3 warp (vec3 coord)","{"," vec3 o2 = vec3(11.3, 23.7, 13.1);"," vec3 o3 = vec3(29.9, 2.3, 31.7);"," float coord1 = iterateWarp(coord, uWarpDetailPower, uWarpFlowPower, uWarpContributionPower);"," float coord2 = iterateWarp(coord + o2, uWarpDetailPower, uWarpFlowPower, uWarpContributionPower);"," float coord3 = iterateWarp(coord + o3, uWarpDetailPower, uWarpFlowPower, uWarpContributionPower);"," return vec3(coord1, coord2, coord3);","}","void main ()","{"," vec3 coord = (vec3(outTexCoord, 0.0) * uCells) + uOffset;"," if (uWarpAmount > 0.)"," {"," coord += warp(coord) * uWarpAmount;"," }"," float value = iterate(coord, uDetailPower, uFlowPower, uContributionPower) * uValueFactor + uValueAdd;"," value = pow(clamp(value, 0., 1.), uValuePower);"," #ifndef NORMAL_MAP"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," #else"," float dx = dFdx(value) * uNormalScale;"," float dy = dFdy(value) * uNormalScale;"," vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;"," gl_FragColor = vec4(normal, 1.0);"," #endif","}"].join("\n")},17205(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(fragmentMode)","#pragma phaserTemplate(fragmentIterations)","#pragma phaserTemplate(fragmentNormalMap)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec2 uSeedX;","uniform vec2 uSeedY;","uniform vec2 uCells;","uniform vec2 uCellOffset;","uniform vec2 uVariation;","uniform vec2 uWrap;","uniform float uSmoothing;","uniform float uNormalScale;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","varying vec2 outTexCoord;","float trig(vec2 p)","{"," return fract(43757.5453*sin(dot(p, vec2(12.9898,78.233))));","}","vec2 bigCoord (vec2 coord, float scale)","{"," return (coord + uCellOffset) * scale * uCells;","}","vec2 hash2D (vec2 coord)","{"," return vec2("," trig(coord + uSeedX),"," trig(coord + uSeedY)"," ) * uVariation;","}","float worley2D (vec2 uv, float scale)","{"," vec2 coord = bigCoord(uv, scale);"," vec2 point = floor(coord);"," vec2 frac = fract(coord);"," float dist = 12.0;"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec2 cellNeighbor = vec2(i, j);"," vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));"," vec2 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," }"," }"," return sqrt(dist);","}","float worley2DIndex (vec2 uv, float scale)","{"," vec2 coord = bigCoord(uv, scale);"," vec2 point = floor(coord);"," vec2 frac = fract(coord);"," float dist = 12.0;"," float random = 0.0;"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec2 cellNeighbor = vec2(i, j);"," vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));"," vec2 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," random = jitter.x;"," }"," }"," return random;","}","float worley2DSmooth (vec2 uv, float scale)","{"," vec2 coord = bigCoord(uv, scale);"," vec2 point = floor(coord);"," vec2 frac = fract(coord);"," float value = 0.0;"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec2 cellNeighbor = vec2(i, j);"," vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));"," vec2 diff = cellNeighbor - frac + jitter;"," float d = length(diff);"," value += exp2(-32.0 / uSmoothing * d); // Accumulate fast-decaying exponential of length."," }"," return -(1.0 / 32.0 * uSmoothing) * log2(value);","}","float iterateWorley2D (vec2 uv)","{"," float value = 0.0;"," float itValue = 0.0;"," for (float iteration = 0.0; iteration < ITERATION_COUNT; iteration++)"," {"," float scale = exp2(iteration);"," #ifdef MODE_DISTANCE"," itValue = worley2D(uv + iteration, scale);"," #endif"," #ifdef MODE_INDEX"," itValue = worley2DIndex(uv + iteration, scale);"," #endif"," #ifdef MODE_DISTANCE_SMOOTH"," itValue = worley2DSmooth(uv + iteration, scale);"," #endif"," value += (itValue - 0.5) / scale;"," }"," return value + 0.5;","}","void main ()","{"," float value = iterateWorley2D(outTexCoord);"," #ifndef NORMAL_MAP"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," #else"," float dx = dFdx(value) * uNormalScale;"," float dy = dFdy(value) * uNormalScale;"," vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;"," gl_FragColor = vec4(normal, 1.0);"," #endif","}"].join("\n")},79814(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(fragmentMode)","#pragma phaserTemplate(fragmentIterations)","#pragma phaserTemplate(fragmentNormalMap)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec3 uSeedX;","uniform vec3 uSeedY;","uniform vec3 uSeedZ;","uniform vec3 uCells;","uniform vec3 uCellOffset;","uniform vec3 uVariation;","uniform vec3 uWrap;","uniform float uSmoothing;","uniform float uNormalScale;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","varying vec2 outTexCoord;","float trig(vec3 p)","{"," return fract(43757.5453*sin(dot(p, vec3(12.9898,78.233, 9441.8953))));","}","vec3 bigCoord (vec3 coord, float scale)","{"," return (coord + uCellOffset) * scale * uCells;","}","vec3 hash3D (vec3 coord)","{"," return vec3("," trig(coord + uSeedX),"," trig(coord + uSeedY),"," trig(coord + uSeedZ)"," ) * uVariation;","}","float worley3D (vec3 uv, float scale)","{"," vec3 coord = bigCoord(uv, scale);"," vec3 point = floor(coord);"," vec3 frac = fract(coord);"," float dist = 12.0;"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec3 cellNeighbor = vec3(i, j, k);"," vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));"," vec3 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," }"," }"," return sqrt(dist);","}","float worley3DIndex (vec3 uv, float scale)","{"," vec3 coord = bigCoord(uv, scale);"," vec3 point = floor(coord);"," vec3 frac = fract(coord);"," float dist = 12.0;"," float random = 0.0;"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec3 cellNeighbor = vec3(i, j, k);"," vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));"," vec3 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," random = jitter.x;"," }"," }"," return random;","}","float worley3DSmooth (vec3 uv, float scale)","{"," vec3 coord = bigCoord(uv, scale);"," vec3 point = floor(coord);"," vec3 frac = fract(coord);"," float value = 0.0;"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec3 cellNeighbor = vec3(i, j, k);"," vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));"," vec3 diff = cellNeighbor - frac + jitter;"," float d = length(diff);"," value += exp2(-32.0 / uSmoothing * d); // Accumulate fast-decaying exponential of length."," }"," return -(1.0 / 32.0 * uSmoothing) * log2(value);","}","float iterateWorley3D (vec3 uv)","{"," float value = 0.0;"," float itValue = 0.0;"," for (float iteration = 0.0; iteration < ITERATION_COUNT; iteration++)"," {"," float scale = exp2(iteration);"," #ifdef MODE_DISTANCE"," itValue = worley3D(uv + iteration, scale);"," #endif"," #ifdef MODE_INDEX"," itValue = worley3DIndex(uv + iteration, scale);"," #endif"," #ifdef MODE_DISTANCE_SMOOTH"," itValue = worley3DSmooth(uv + iteration, scale);"," #endif"," value += (itValue - 0.5) / scale;"," }"," return value + 0.5;","}","void main ()","{"," vec3 uv = vec3(outTexCoord, 0.0);"," float value = iterateWorley3D(uv);"," #ifndef NORMAL_MAP"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," #else"," float dx = dFdx(value) * uNormalScale;"," float dy = dFdy(value) * uNormalScale;"," vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;"," gl_FragColor = vec4(normal, 1.0);"," #endif","}"].join("\n")},99595(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(fragmentMode)","#pragma phaserTemplate(fragmentIterations)","#pragma phaserTemplate(fragmentNormalMap)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","uniform vec4 uSeedX;","uniform vec4 uSeedY;","uniform vec4 uSeedZ;","uniform vec4 uSeedW;","uniform vec4 uCells;","uniform vec4 uCellOffset;","uniform vec4 uVariation;","uniform vec4 uWrap;","uniform float uSmoothing;","uniform float uNormalScale;","uniform vec4 uColorStart;","uniform vec4 uColorEnd;","varying vec2 outTexCoord;","float trig(vec4 p)","{"," return fract(43757.5453*sin(dot(p, vec4(12.9898,78.233,9441.8953,61.99))));","}","vec4 bigCoord (vec4 coord, float scale)","{"," return (coord + uCellOffset) * scale * uCells;","}","vec4 hash4D (vec4 coord)","{"," return vec4("," trig(coord + uSeedX),"," trig(coord + uSeedY),"," trig(coord + uSeedZ),"," trig(coord + uSeedW)"," ) * uVariation;","}","float worley4D (vec4 uv, float scale)","{"," vec4 coord = bigCoord(uv, scale);"," vec4 point = floor(coord);"," vec4 frac = fract(coord);"," float dist = 16.0;"," for (float l = -1.0; l <= 1.0; l++)"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec4 cellNeighbor = vec4(i, j, k, l);"," vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));"," vec4 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," }"," }"," return sqrt(dist);","}","float worley4DIndex (vec4 uv, float scale)","{"," vec4 coord = bigCoord(uv, scale);"," vec4 point = floor(coord);"," vec4 frac = fract(coord);"," float dist = 16.0;"," float random = 0.0;"," for (float l = -1.0; l <= 1.0; l++)"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec4 cellNeighbor = vec4(i, j, k, l);"," vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));"," vec4 diff = cellNeighbor - frac + jitter;"," float d = dot(diff, diff); // Squared length of diff."," if (d < dist)"," {"," dist = d;"," random = jitter.x;"," }"," }"," return random;","}","float worley4DSmooth (vec4 uv, float scale)","{"," vec4 coord = bigCoord(uv, scale);"," vec4 point = floor(coord);"," vec4 frac = fract(coord);"," float value = 0.0;"," for (float l = -1.0; l <= 1.0; l++)"," for (float k = -1.0; k <= 1.0; k++)"," for (float j = -1.0; j <= 1.0; j++)"," for (float i = -1.0; i <= 1.0; i++)"," {"," vec4 cellNeighbor = vec4(i, j, k, l);"," vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));"," vec4 diff = cellNeighbor - frac + jitter;"," float d = length(diff);"," value += exp2(-32.0 / uSmoothing * d); // Accumulate fast-decaying exponential of length."," }"," return -(1.0 / 32.0 * uSmoothing) * log2(value);","}","float iterateWorley4D (vec4 uv)","{"," float value = 0.0;"," float itValue = 0.0;"," for (float iteration = 0.0; iteration < ITERATION_COUNT; iteration++)"," {"," float scale = exp2(iteration);"," #ifdef MODE_DISTANCE"," itValue = worley4D(uv + iteration, scale);"," #endif"," #ifdef MODE_INDEX"," itValue = worley4DIndex(uv + iteration, scale);"," #endif"," #ifdef MODE_DISTANCE_SMOOTH"," itValue = worley4DSmooth(uv + iteration, scale);"," #endif"," value += (itValue - 0.5) / scale;"," }"," return value + 0.5;","}","void main ()","{"," vec4 uv = vec4(outTexCoord, 0.0, 0.0);"," float value = iterateWorley4D(uv);"," #ifndef NORMAL_MAP"," vec4 color = mix(uColorStart, uColorEnd, value);"," color.rgb *= color.a;"," gl_FragColor = color;"," #else"," float dx = dFdx(value) * uNormalScale;"," float dy = dFdy(value) * uNormalScale;"," vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;"," gl_FragColor = vec4(normal, 1.0);"," #endif","}"].join("\n")},62807(t){t.exports=["float inverseRotation = -rotation - uCamera.z;","float irSine = sin(inverseRotation);","float irCosine = cos(inverseRotation);","outInverseRotationMatrix = mat3("," irCosine, irSine, 0.0,"," -irSine, irCosine, 0.0,"," 0.0, 0.0, 1.0",");"].join("\n")},4127(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","precision mediump float;","#pragma phaserTemplate(fragmentDefine)","uniform vec2 uResolution;","uniform float uCameraZoom;","varying vec4 lightPosition;","varying vec4 lightColor;","varying float lightRadius;","varying float lightAttenuation;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec2 center = (lightPosition.xy + 1.0) * (uResolution.xy * 0.5);"," float distToSurf = length(center - gl_FragCoord.xy);"," float radius = 1.0 - distToSurf / (lightRadius * uCameraZoom);"," float intensity = smoothstep(0.0, 1.0, radius * lightAttenuation);"," vec4 color = vec4(intensity, intensity, intensity, 0.0) * lightColor;"," #pragma phaserTemplate(fragmentProcess)"," gl_FragColor = vec4(color.rgb * lightColor.a, color.a);","}"].join("\n")},89924(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","precision mediump float;","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","attribute vec2 inPosition;","attribute vec2 inLightPosition;","attribute vec4 inLightColor;","attribute float inLightRadius;","attribute float inLightAttenuation;","varying vec4 lightPosition;","varying vec4 lightColor;","varying float lightRadius;","varying float lightAttenuation;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","void main ()","{"," lightColor = inLightColor;"," lightRadius = inLightRadius;"," lightAttenuation = inLightAttenuation;"," lightPosition = uProjectionMatrix * vec4(inLightPosition, 1.0, 1.0);"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},68589(t){t.exports=["#extension GL_OES_standard_derivatives : enable","#define BAND_TREE_DEPTH 0.0","uniform sampler2D uRampTexture;","uniform vec2 uRampResolution;","uniform float uRampBandStart;","uniform bool uDither;","float decodeNumberSample(vec4 sample)","{"," return ("," sample.r * 255.0 +"," sample.g * 255.0 * 256.0 +"," sample.b * 255.0 * 256.0 * 256.0 +"," sample.a * 255.0 * 256.0 * 256.0 * 256.0"," ) / 256.0 / 256.0;","}","struct Band","{"," vec4 colorStart;"," vec4 colorEnd;"," float start;"," float end;"," int colorSpace;"," int interpolation;"," float middle;","};","Band getBand(float progress)","{"," vec2 rampStep = 1.0 / uRampResolution;"," vec2 c = rampStep / 2.0;"," float start = decodeNumberSample(texture2D(uRampTexture, c));"," float end = decodeNumberSample(texture2D(uRampTexture, vec2(1.0, 0.0) * rampStep + c));"," float TREE_OFFSET = 2.0; // Beginning of tree block."," float index = 0.0;"," float x, y;"," for (float i = 0.0; i < BAND_TREE_DEPTH; i++)"," {"," x = mod(index + TREE_OFFSET, uRampResolution.x);"," y = floor(x / uRampResolution.x);"," float pivot = decodeNumberSample(texture2D(uRampTexture, vec2(x, y) * rampStep + c));"," if (progress > pivot)"," {"," start = pivot;"," index = index * 2.0 + 2.0;"," }"," else"," {"," end = pivot;"," index = index * 2.0 + 1.0;"," }"," }"," float bandNumber = index - uRampBandStart + TREE_OFFSET;"," float bandIndex = bandNumber * 3.0 + uRampBandStart;"," x = mod(bandIndex, uRampResolution.x);"," y = floor(bandIndex / uRampResolution.x);"," vec4 colorStart = texture2D(uRampTexture, vec2(x, y) * rampStep + c);"," x = mod(bandIndex + 1.0, uRampResolution.x);"," y = floor(bandIndex / uRampResolution.x);"," vec4 colorEnd = texture2D(uRampTexture, vec2(x, y) * rampStep + c);"," x = mod(bandIndex + 2.0, uRampResolution.x);"," y = floor(bandIndex / uRampResolution.x);"," float bandData = decodeNumberSample(texture2D(uRampTexture, vec2(x, y) * rampStep + c));"," int colorSpace = int(floor(bandData / 255.0));"," int interpolation = int(floor(bandData)) - colorSpace * 255;"," return Band(colorStart, colorEnd, start, end, colorSpace, interpolation, fract(bandData) * 2.0);","}","float interpolate(float progress, int mode)","{"," if (mode == 1)"," {"," if ((progress *= 2.0) < 1.0)"," {"," return 0.5 * sqrt(1.0 - (--progress * progress));"," }"," progress = 1.0 - progress;"," return 1.0 - 0.5 * sqrt(1.0 - progress * progress);"," }"," if (mode == 2)"," {"," return sin((progress - 0.5) * 3.14159265358979323846) * 0.5 + 0.5;"," }"," if (mode == 3)"," {"," return sqrt(1.0 - (--progress * progress));"," }"," if (mode == 4)"," {"," return 1.0 - sqrt(1.0 - progress * progress);"," }"," return progress;","}","float ditherIGN(float value)","{"," float dx = dFdx(value);"," float dy = dFdy(value);"," float rateOfChange = sqrt(dx * dx + dy * dy);"," value += (fract(52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y)) - 0.5) * rateOfChange;"," return value;","}","vec4 rgbaToHsva(vec4 rgba)","{"," float r = rgba.r;"," float g = rgba.g;"," float b = rgba.b;"," float a = rgba.a;"," float min = min(min(r, g), b);"," float max = max(max(r, g), b);"," float d = max - min;"," float h = 0.0;"," float s = (max == 0.0) ? 0.0 : d / max;"," float v = max;"," if (max != min)"," {"," if (max == r)"," {"," h = (g - b) / d + ((g < b) ? 6.0 : 0.0);"," }"," else if (max == g)"," {"," h = (b - r) / d + 2.0;"," }"," else"," {"," h = (r - g) / d + 4.0;"," }"," h /= 6.0;"," }"," return vec4(h, s, v, a);","}","float hsvaToRgbaConvert(float n, vec4 hsva)","{"," float k = mod(n + hsva.x * 6.0, 6.0);"," float min = min(min(k, 4.0 - k), 1.0);"," return hsva.z - hsva.z * hsva.y * max(0.0, min);","}","vec4 hsvaToRgba(vec4 hsva)","{"," return vec4("," hsvaToRgbaConvert(5.0, hsva),"," hsvaToRgbaConvert(3.0, hsva),"," hsvaToRgbaConvert(1.0, hsva),"," hsva.a"," );","}","vec4 mixBandColor(float progress, Band band)","{"," if (band.colorSpace == 0)"," {"," return mix(band.colorStart, band.colorEnd, progress);"," }"," vec4 hsvaStart = rgbaToHsva(band.colorStart);"," vec4 hsvaEnd = rgbaToHsva(band.colorEnd);"," if (band.colorSpace == 1)"," {"," float dH = hsvaStart.x - hsvaEnd.x;"," if (dH > 0.5)"," {"," hsvaStart.x -= 1.0;"," }"," else if (dH < -0.5)"," {"," hsvaStart.x += 1.0;"," }"," }"," else if (band.colorSpace == 2)"," {"," if (hsvaStart.x > hsvaEnd.x)"," {"," hsvaStart.x -= 1.0;"," }"," }"," else if (band.colorSpace == 3)"," {"," if (hsvaStart.x < hsvaEnd.x)"," {"," hsvaStart.x += 1.0;"," }"," }"," vec4 hsvaMix = mix(hsvaStart, hsvaEnd, progress);"," hsvaMix.x = mod(hsvaMix.x, 1.0);"," return hsvaToRgba(hsvaMix);","}","vec4 getRampAt(float progress)","{"," Band band = getBand(progress);"," float bandProgress = (progress - band.start) / (band.end - band.start);"," float gamma = log(0.5) / log(band.middle);"," bandProgress = pow(bandProgress, gamma);"," bandProgress = interpolate(bandProgress, band.interpolation);"," if (uDither)"," {"," bandProgress = ditherIGN(bandProgress);"," }"," return mixBandColor(bandProgress, band);","}"].join("\n")},72823(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(fragmentDefine)","varying vec2 outTexCoord;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," vec4 fragColor = vec4(outTexCoord.xyx, 1.0);"," #pragma phaserTemplate(fragmentProcess)"," gl_FragColor = fragColor;","}"].join("\n")},65884(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","varying vec2 outTexCoord;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},2807(t){t.exports=["#pragma phaserTemplate(shaderName)","precision mediump float;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","varying vec2 outFragCoord;","varying vec2 outTexCoord;","void main ()","{"," outFragCoord = inPosition.xy * 0.5 + 0.5;"," outTexCoord = inTexCoord;"," gl_Position = vec4(inPosition, 0, 1);","}"].join("\n")},49119(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(fragmentDefine)","uniform vec2 uResolution;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(fragmentHeader)","void main ()","{"," #pragma phaserTemplate(fragmentProcess)"," gl_FragColor = fragColor;","}"].join("\n")},3524(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#define ROUND_BIAS 0.5001","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","uniform mat3 uViewMatrix;","uniform vec3 uCameraScrollAndAlpha;","uniform int uRoundPixels;","uniform vec2 uResolution;","uniform float uTime;","uniform vec2 uDiffuseResolution;","uniform vec2 uFrameDataResolution;","uniform sampler2D uFrameDataTexture;","uniform float uGravity;","attribute float inVertex;","attribute vec4 inPositionX;","attribute vec4 inPositionY;","attribute vec4 inRotation;","attribute vec4 inScaleX;","attribute vec4 inScaleY;","attribute vec4 inAlpha;","attribute vec4 inFrame;","attribute vec4 inTintBlend;","attribute vec4 inTintTL;","attribute vec4 inTintTR;","attribute vec4 inTintBL;","attribute vec4 inTintBR;","attribute vec4 inOriginAndTintModeAndCreationTime;","attribute vec2 inScrollFactor;","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","const float PI = 3.14159265359;","const float HALF_PI = PI / 2.0;","const float BOUNCE_OVERSHOOT = 1.70158;","const float BOUNCE_OVERSHOOT_PLUS = BOUNCE_OVERSHOOT + 1.0;","const float BOUNCE_OVERSHOOT_IN_OUT = BOUNCE_OVERSHOOT * 1.525;","const float BOUNCE_OVERSHOOT_IN_OUT_PLUS = BOUNCE_OVERSHOOT_IN_OUT + 1.0;","float animate (vec4 anim)","{"," float value = anim.x;"," float a = anim.y;"," float b = abs(anim.z);"," float c = abs(anim.w);"," bool yoyo = anim.z < 0.0;"," bool loop = anim.w > 0.0;"," int type = int(floor(c));"," if (type == 0|| b == 0.0)"," {"," return value;"," }"," float duration = b;"," float delay = mod(c, 1.0) * 2.0;"," float rawTime = ((uTime - inOriginAndTintModeAndCreationTime.w) / duration) - delay;"," float time = mod(rawTime, 1.0);"," if (yoyo && (mod(rawTime, 2.0) >= 1.0))"," {"," time = 1.0 - time;"," }"," float repeats = loop ? 0.0 : floor(a);"," float timeContinuous = loop ? time : rawTime;"," #ifdef FEATURE_LINEAR"," if (type == 1)"," {"," return value + a * timeContinuous;"," }"," #endif"," #ifdef FEATURE_GRAVITY"," if (type == 2)"," {"," float v = floor(a);"," float gravityFactor = (a - v) * 2.0 - 1.0;"," if (gravityFactor == 0.0)"," {"," gravityFactor = 1.0;"," }"," float seconds = timeContinuous * duration / 1000.0;"," float accel = uGravity * gravityFactor;"," return value + (v * seconds) + (0.5 * accel * seconds * seconds);"," }"," #endif"," #ifdef FEATURE_QUAD_EASEOUT"," if (type == 10)"," {"," return value + a * time * (2.0 - time)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUAD_EASEIN"," if (type == 11)"," {"," return value + a * time * time"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUAD_EASEINOUT"," if (type == 12)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * time * time * 0.5"," + repeats * a;"," }"," time -= 1.0;"," return value + a * -0.5 * (time * (time - 2.0) - 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CUBIC_EASEOUT"," if (type == 20)"," {"," time -= 1.0;"," return value + a * (time * time * time + 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CUBIC_EASEIN"," if (type == 21)"," {"," return value + a * time * time * time"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CUBIC_EASEINOUT"," if (type == 22)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * time * time * time * 0.5"," + repeats * a;"," }"," time -= 2.0;"," return value + a * 0.5 * (time * time * time + 2.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUART_EASEOUT"," if (type == 30)"," {"," time -= 1.0;"," return value + a * (1.0 - time * time * time * time)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUART_EASEIN"," if (type == 31)"," {"," return value + a * time * time * time * time"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUART_EASEINOUT"," if (type == 32)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * time * time * time * time * 0.5"," + repeats * a;"," }"," time -= 2.0;"," return value + a * -0.5 * (time * time * time * time - 2.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUINT_EASEOUT"," if (type == 40)"," {"," time -= 1.0;"," return value + a * (time * time * time * time * time + 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUINT_EASEIN"," if (type == 41)"," {"," return value + a * time * time * time * time * time"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_QUINT_EASEINOUT"," if (type == 42)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * time * time * time * time * time * 0.5"," + repeats * a;"," }"," time -= 2.0;"," return value + a * 0.5 * (time * time * time * time * time + 2.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SINE_EASEOUT"," if (type == 50)"," {"," return value + a * sin(time * HALF_PI)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SINE_EASEIN"," if (type == 51)"," {"," return value + a * (1.0 - cos(time * HALF_PI))"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SINE_EASEINOUT"," if (type == 52)"," {"," return value + a * 0.5 * (1.0 - cos(PI * time))"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_EXPO_EASEOUT"," if (type == 60)"," {"," return value + a * (1.0 - pow(2.0, -10.0 * time))"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_EXPO_EASEIN"," if (type == 61)"," {"," return value + a * pow(2.0, 10.0 * (time - 1.0) - 0.001)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_EXPO_EASEINOUT"," if (type == 62)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * 0.5 * pow(2.0, 10.0 * (time - 1.0))"," + repeats * a;"," }"," time -= 1.0;"," return value + a * 0.5 * (2.0 - pow(2.0, -10.0 * (time - 1.0)))"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CIRC_EASEOUT"," if (type == 70)"," {"," time -= 1.0;"," return value + a * sqrt(1.0 - time * time)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CIRC_EASEIN"," if (type == 71)"," {"," return value + a * (1.0 - sqrt(1.0 - time * time))"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_CIRC_EASEINOUT"," if (type == 72)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * -0.5 * (sqrt(1.0 - time * time) - 1.0)"," + repeats * a;"," }"," time -= 2.0;"," return value + a * 0.5 * (sqrt(1.0 - time * time) + 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_BACK_EASEOUT"," if (type == 90)"," {"," time -= 1.0;"," return value + a * (time * time * (BOUNCE_OVERSHOOT_PLUS * time + BOUNCE_OVERSHOOT) + 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_BACK_EASEIN"," if (type == 91)"," {"," return value + a * time * time * (BOUNCE_OVERSHOOT_PLUS * time - BOUNCE_OVERSHOOT)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_BACK_EASEINOUT"," if (type == 92)"," {"," time *= 2.0;"," if (time < 1.0)"," {"," return value + a * 0.5 * (time * time * (BOUNCE_OVERSHOOT_IN_OUT_PLUS * time - BOUNCE_OVERSHOOT_IN_OUT))"," + repeats * a;"," }"," time -= 2.0;"," return value + a * 0.5 * (time * time * (BOUNCE_OVERSHOOT_IN_OUT_PLUS * time + BOUNCE_OVERSHOOT_IN_OUT) + 2.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_BOUNCE_EASEOUT"," if (type == 100)"," {"," if (time < 1.0 / 2.75)"," {"," return value + a * (7.5625 * time * time)"," + repeats * a;"," }"," else if (time < 2.0 / 2.75)"," {"," time -= 1.5 / 2.75;"," return value + a * (7.5625 * time * time + 0.75)"," + repeats * a;"," }"," else if (time < 2.5 / 2.75)"," {"," time -= 2.25 / 2.75;"," return value + a * (7.5625 * time * time + 0.9375)"," + repeats * a;"," }"," else"," {"," time -= 2.625 / 2.75;"," return value + a * (7.5625 * time * time + 0.984375)"," + repeats * a;"," }"," }"," #endif"," #ifdef FEATURE_BOUNCE_EASEIN"," if (type == 101)"," {"," time = 1.0 - time;"," if (time < 1.0 / 2.75)"," {"," return value + a * (1.0 - 7.5625 * time * time)"," + repeats * a;"," }"," else if (time < 2.0 / 2.75)"," {"," time -= 1.5 / 2.75;"," return value + a * (1.0 - (7.5625 * time * time + 0.75))"," + repeats * a;"," }"," else if (time < 2.5 / 2.75)"," {"," time -= 2.25 / 2.75;"," return value + a * (1.0 - (7.5625 * time * time + 0.9375))"," + repeats * a;"," }"," else"," {"," time -= 2.625 / 2.75;"," return value + a * (1.0 - (7.5625 * time * time + 0.984375))"," + repeats * a;"," }"," }"," #endif"," #ifdef FEATURE_BOUNCE_EASEINOUT"," if (type == 102)"," {"," bool reverse = false;"," if (time < 0.5)"," {"," time = 1.0 - time * 2.0;"," reverse = true;"," }"," if (time < 1.0 / 2.75)"," {"," time = 7.5625 * time * time;"," }"," else if (time < 2.0 / 2.75)"," {"," time -= 1.5 / 2.75;"," time = 7.5625 * time * time + 0.75;"," }"," else if (time < 2.5 / 2.75)"," {"," time -= 2.25 / 2.75;"," time = 7.5625 * time * time + 0.9375;"," }"," else"," {"," time -= 2.625 / 2.75;"," time = 7.5625 * time * time + 0.984375;"," }"," if (reverse)"," {"," return value + a * (1.0 - time) * 0.5"," + repeats * a;"," }"," return value + a * time * 0.5 + 0.5"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_STEPPED"," if (type == 110)"," {"," return value + a * floor(time + 0.5)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SMOOTHSTEP_EASEOUT"," if (type == 120)"," {"," return value + a * (smoothstep(0.0, 1.0, time / 2.0 + 0.5) * 2.0 - 1.0)"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SMOOTHSTEP_EASEIN"," if (type == 121)"," {"," return value + a * smoothstep(0.0, 1.0, time / 2.0) * 2.0"," + repeats * a;"," }"," #endif"," #ifdef FEATURE_SMOOTHSTEP_EASEINOUT"," if (type == 122)"," {"," return value + a * smoothstep(0.0, 1.0, time)"," + repeats * a;"," }"," #endif"," return value;","}","struct Frame {"," vec2 position;"," vec2 size;"," vec2 offset;","};","Frame getFrame (float frame)","{"," float index1 = floor(frame) * 3.0;"," float index2 = index1 + 1.0;"," float index3 = index1 + 2.0;"," float width = uFrameDataResolution.x;"," float x = mod(index1, width);"," float y = floor(index1 / width);"," vec4 texelUV = texture2D("," uFrameDataTexture,"," vec2(x + 0.5, y + 0.5) / uFrameDataResolution"," );"," x = mod(index2, width);"," y = floor(index2 / width);"," vec4 texelWH = texture2D("," uFrameDataTexture,"," vec2(x + 0.5, y + 0.5) / uFrameDataResolution"," );"," x = mod(index3, width);"," y = floor(index3 / width);"," vec4 texelOrigin = texture2D("," uFrameDataTexture,"," vec2(x + 0.5, y + 0.5) / uFrameDataResolution"," );"," return Frame("," vec2("," texelUV.r + texelUV.g * 256.0,"," texelUV.b + texelUV.a * 256.0"," ) * 255.0,"," vec2("," texelWH.r + texelWH.g * 256.0,"," texelWH.b + texelWH.a * 256.0"," ) * 255.0,"," vec2("," texelOrigin.r + texelOrigin.g * 256.0,"," texelOrigin.b + texelOrigin.a * 256.0"," ) * 255.0 - 32768.0"," );","}","void main ()","{"," float positionX = animate(inPositionX);"," float positionY = animate(inPositionY);"," float rotation = animate(inRotation);"," float scaleX = animate(inScaleX);"," float scaleY = animate(inScaleY);"," float frame = animate(inFrame);"," float tintBlend = animate(inTintBlend);"," float alpha = animate(inAlpha);"," vec2 origin = inOriginAndTintModeAndCreationTime.xy;"," float tintMode = inOriginAndTintModeAndCreationTime.z;"," float scrollFactorX = inScrollFactor.x;"," float scrollFactorY = inScrollFactor.y;"," Frame frameData = getFrame(frame);"," vec2 uv = frameData.position / uDiffuseResolution;"," vec2 wh = frameData.size / uDiffuseResolution;"," float u = uv.s;"," float v = uv.t;"," float w = wh.s;"," float h = wh.t;"," float width = frameData.size.s;"," float height = frameData.size.t;"," vec4 tint = inTintTL;"," float x = -origin.x;"," float y = -origin.y;"," if (inVertex == 0.0)"," {"," y = 1.0 - origin.y;"," v += h;"," tint = inTintBL;"," }"," else if (inVertex == 2.0)"," {"," x = 1.0 - origin.x;"," y = 1.0 - origin.y;"," u += w;"," v += h;"," tint = inTintBR;"," }"," else if (inVertex == 3.0)"," {"," x = 1.0 - origin.x;"," u += w;"," tint = inTintTR;"," }"," vec3 position = vec3("," (x * width - frameData.offset.x) * scaleX,"," (y * height - frameData.offset.y) * scaleY,"," 1.0"," );"," mat3 viewMatrix = uViewMatrix * mat3("," 1.0, 0.0, 0.0,"," 0.0, 1.0, 0.0,"," uCameraScrollAndAlpha.x * (1.0 - scrollFactorX), uCameraScrollAndAlpha.y * (1.0 - scrollFactorY), 1.0"," );"," float sine = sin(rotation);"," float cosine = cos(rotation);"," mat3 transformMatrix = mat3("," cosine, sine, 0.0,"," -sine, cosine, 0.0,"," positionX, positionY, 1.0"," );"," position = viewMatrix * transformMatrix * position;"," alpha *= uCameraScrollAndAlpha.z;"," tint.a *= alpha;"," if (uRoundPixels == 1 && rotation == 0.0 && scaleX == 1.0 && scaleY == 1.0)"," {"," position.xy = floor(position.xy + ROUND_BIAS);"," }"," gl_Position = uProjectionMatrix * vec4(position.xy, 1.0, 1.0);"," outTexCoord = vec2(u, 1.0 - v);"," outTint = mix(vec4(1.0, 1.0, 1.0, tint.a), tint, tintBlend);"," outTintEffect = tintMode;"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},57532(t){t.exports=["#version 100","#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","/* Redefine MAX_ANIM_FRAMES to support animations with different frame numbers. */","#define MAX_ANIM_FRAMES 0","#pragma phaserTemplate(fragmentDefine)","uniform vec2 uResolution;","uniform sampler2D uMainSampler;","uniform sampler2D uLayerSampler;","uniform vec2 uMainResolution;","uniform vec2 uLayerResolution;","uniform float uTileColumns;","uniform vec4 uTileWidthHeightMarginSpacing;","uniform float uAlpha;","uniform float uTime;","#if MAX_ANIM_FRAMES > 0","uniform sampler2D uAnimSampler;","uniform vec2 uAnimResolution;","#endif","varying vec2 outTexCoord;","varying vec2 outTileStride;","#pragma phaserTemplate(outVariables)","vec2 getTexRes ()","{"," return uMainResolution;","}","float floatTexel (vec4 texel)","{"," return texel.r * 255.0 + (texel.g * 255.0 * 256.0) + (texel.b * 255.0 * 256.0 * 256.0) + (texel.a * 255.0 * 256.0 * 256.0 * 256.0);","}","struct Tile","{"," float index;"," vec2 uv; // In texels."," #if MAX_ANIM_FRAMES > 0"," bool animated;"," #endif"," bool empty;","};","Tile getLayerData (vec2 coord)","{"," vec2 texelCoord = coord * uLayerResolution;"," vec2 tile = floor(texelCoord);"," vec2 uv = fract(texelCoord);"," uv.y = 1.0 - uv.y;"," vec4 texel = texture2D(uLayerSampler, (tile + 0.5) / uLayerResolution) * 255.0;"," float flags = texel.a;"," /* Check for empty tile flag in bit 28. */"," if (flags == 16.0)"," {"," return Tile("," 0.0,"," vec2(0.0),"," #if MAX_ANIM_FRAMES > 0"," false,"," #endif"," true"," );"," }"," /* Bit 31 is flipX. */"," bool flipX = flags > 127.0;"," /* Bit 30 is flipY. */"," bool flipY = mod(flags, 128.0) > 63.0;"," #if MAX_ANIM_FRAMES > 0"," /* Bit 29 is animation. */"," bool animated = mod(flags, 64.0) > 31.0;"," #endif"," if (flipX)"," {"," uv.x = 1.0 - uv.x;"," }"," if (flipY)"," {"," uv.y = 1.0 - uv.y;"," }"," float index = texel.r + (texel.g * 256.0) + (texel.b * 256.0 * 256.0);"," return Tile("," index,"," uv * uTileWidthHeightMarginSpacing.xy,"," #if MAX_ANIM_FRAMES > 0"," animated,"," #endif"," false"," );","}","vec2 getFrameCorner (float index)","{"," float x = mod(index, uTileColumns);"," float y = floor(index / uTileColumns);"," vec2 xy = vec2(x, y);"," return xy * outTileStride + uTileWidthHeightMarginSpacing.zz;","}","#if MAX_ANIM_FRAMES > 0","float animationIndex (float index)","{"," float animTextureWidth = uAnimResolution.x;"," vec2 index2D = vec2(mod(index, animTextureWidth), floor(index / animTextureWidth));"," vec4 animDurationTexel = texture2D(uAnimSampler, (index2D + 0.5) / uAnimResolution);"," index2D = vec2(mod(index + 1.0, animTextureWidth), floor((index + 1.0) / animTextureWidth));"," vec4 animIndexTexel = texture2D(uAnimSampler, (index2D + 0.5) / uAnimResolution);"," float animDuration = floatTexel(animDurationTexel);"," float animIndex = floatTexel(animIndexTexel);"," float animTime = mod(uTime, animDuration);"," float animTimeAccum = 0.0;"," for (int i = 0; i < MAX_ANIM_FRAMES; i++)"," {"," index2D = vec2(mod(animIndex, animTextureWidth), floor(animIndex / animTextureWidth));"," animDurationTexel = texture2D(uAnimSampler, (index2D + 0.5) / uAnimResolution);"," float frameDuration = floatTexel(animDurationTexel);"," animTimeAccum += frameDuration;"," if (animTime <= animTimeAccum)"," {"," break;"," }"," animIndex += 2.0;"," }"," animIndex += 1.0;"," index2D = vec2(mod(animIndex, animTextureWidth), floor(animIndex / animTextureWidth));"," animIndexTexel = texture2D(uAnimSampler, (index2D + 0.5) / uAnimResolution);"," float animFrameIndex = floatTexel(animIndexTexel);"," return animFrameIndex;","}","#endif","vec2 getTileTexelCoord (Tile tile)","{"," if (tile.empty)"," {"," return vec2(0.0);"," }"," float index = tile.index;"," #if MAX_ANIM_FRAMES > 0"," if (tile.animated)"," {"," index = animationIndex(index);"," }"," #endif"," vec2 frameCorner = getFrameCorner(index);"," return frameCorner + tile.uv;","}","#pragma phaserTemplate(fragmentHeader)","struct Samples {"," vec4 color;"," #pragma phaserTemplate(defineSamples)","};","Samples getColorSamples (vec2 texCoord)","{"," Samples samples;"," samples.color = texture2D("," uMainSampler,"," vec2(texCoord.x, 1.0 - texCoord.y)"," );"," #pragma phaserTemplate(getSamples)"," return samples;","}","Samples mixSamples (Samples samples1, Samples samples2, float alpha)","{"," Samples samples;"," samples.color = mix(samples1.color, samples2.color, alpha);"," #pragma phaserTemplate(mixSamples)"," return samples;","}","Samples getFinalSamples (Tile tile, vec2 layerTexCoord)","{"," vec2 texelCoord = getTileTexelCoord(tile);"," vec2 texCoord = texelCoord / uMainResolution;"," #pragma phaserTemplate(texCoord)"," #ifndef FEATURE_BORDERFILTER"," return getColorSamples(texCoord);"," #else"," #pragma phaserTemplate(finalSamples)"," vec2 wh = uTileWidthHeightMarginSpacing.xy;"," vec2 frameCorner = getFrameCorner(tile.index);"," vec2 frameCornerOpposite = frameCorner + wh;"," vec2 texCoordClamped = clamp(texCoord, (frameCorner + 0.5) / uMainResolution, (frameCornerOpposite - 0.5) / uMainResolution);"," vec2 dTexelCoord = (texCoord - texCoordClamped) * uMainResolution;"," dTexelCoord.y = -dTexelCoord.y;"," vec2 offsets = sign(dTexelCoord);"," Samples samples0 = getColorSamples(texCoordClamped);"," if (offsets.x == 0.0)"," {"," if (offsets.y == 0.0)"," {"," return samples0;"," }"," Tile tileY = getLayerData(layerTexCoord + (offsets - dTexelCoord) / wh / uLayerResolution);"," vec2 texelCoordY = getTileTexelCoord(tileY);"," vec2 texCoordY = texelCoordY / uMainResolution;"," Samples samplesY = getColorSamples(texCoordY);"," return mixSamples(samples0, samplesY, abs(dTexelCoord.y));"," }"," else"," {"," if (offsets.y == 0.0)"," {"," Tile tileX = getLayerData(layerTexCoord + (offsets - dTexelCoord) / wh / uLayerResolution);"," vec2 texelCoordX = getTileTexelCoord(tileX);"," vec2 texCoordX = texelCoordX / uMainResolution;"," Samples samplesX = getColorSamples(texCoordX);"," return mixSamples(samples0, samplesX, abs(dTexelCoord.x));"," }"," Tile tileX = getLayerData(layerTexCoord + (offsets * vec2(1.0, 0.0) - dTexelCoord) / wh / uLayerResolution);"," vec2 texelCoordX = getTileTexelCoord(tileX);"," vec2 texCoordX = texelCoordX / uMainResolution;"," Samples samplesX = getColorSamples(texCoordX);"," Tile tileY = getLayerData(layerTexCoord + (offsets * vec2(0.0, 1.0) - dTexelCoord) / wh / uLayerResolution);"," vec2 texelCoordY = getTileTexelCoord(tileY);"," vec2 texCoordY = texelCoordY / uMainResolution;"," Samples samplesY = getColorSamples(texCoordY);"," Tile tileXY = getLayerData(layerTexCoord + (offsets - dTexelCoord) / wh / uLayerResolution);"," vec2 texelCoordXY = getTileTexelCoord(tileXY);"," vec2 texCoordXY = texelCoordXY / uMainResolution;"," Samples samplesXY = getColorSamples(texCoordXY);"," Samples samples1 = mixSamples(samples0, samplesX, abs(dTexelCoord.x));"," Samples samples2 = mixSamples(samplesY, samplesXY, abs(dTexelCoord.x));"," return mixSamples(samples1, samples2, abs(dTexelCoord.y));"," }"," #endif","}","void main ()","{"," vec2 layerTexCoord = outTexCoord;"," Tile tile = getLayerData(layerTexCoord);"," Samples samples = getFinalSamples(tile, layerTexCoord);"," vec4 fragColor = samples.color;"," #pragma phaserTemplate(declareSamples)"," #pragma phaserTemplate(fragmentProcess)"," fragColor *= uAlpha;"," gl_FragColor = fragColor;","}"].join("\n")},23879(t){t.exports=["#pragma phaserTemplate(shaderName)","#pragma phaserTemplate(extensions)","#pragma phaserTemplate(features)","#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","#else","precision mediump float;","#endif","#pragma phaserTemplate(vertexDefine)","uniform mat4 uProjectionMatrix;","uniform vec2 uResolution;","uniform vec4 uTileWidthHeightMarginSpacing;","attribute vec2 inPosition;","attribute vec2 inTexCoord;","varying vec2 outTexCoord;","varying vec2 outTileStride;","#pragma phaserTemplate(outVariables)","#pragma phaserTemplate(vertexHeader)","void main ()","{"," gl_Position = uProjectionMatrix * vec4(inPosition, 1.0, 1.0);"," outTexCoord = inTexCoord;"," outTileStride = uTileWidthHeightMarginSpacing.xy + uTileWidthHeightMarginSpacing.zz;"," #pragma phaserTemplate(vertexProcess)","}"].join("\n")},84639(t){t.exports=function(t,e){return{name:t+"Anims",additions:{fragmentDefine:"#undef MAX_ANIM_FRAMES\n#define MAX_ANIM_FRAMES "+t},tags:["MAXANIMS"],disable:!!e}}},81084(t,e,i){var s=i(84547);t.exports=function(t){return{name:"ApplyLighting",additions:{fragmentHeader:s,fragmentProcess:"fragColor = applyLighting(fragColor, normal);"},tags:["LIGHTING"],disable:!!t}}},44349(t,e,i){var s=i(11104);t.exports=function(t){return{name:"Tint",additions:{fragmentHeader:s,fragmentProcess:"fragColor = applyTint(fragColor);"},tags:["TINT"],disable:!!t}}},99501(t,e,i){var s=i(81556);t.exports=function(t){return{name:"BoundedSampler",additions:{fragmentHeader:s},disable:!!t}}},6184(t,e,i){var s=i(11719);t.exports=function(t){return{name:"DefineLights",additions:{fragmentDefine:"#define LIGHT_COUNT 1",fragmentHeader:s},tags:["LIGHTING"],disable:!!t}}},11653(t){t.exports=function(t,e){return{name:t+"TexCount",additions:{fragmentDefine:"#define TEXTURE_COUNT "+t},tags:["TexCount"],disable:!!e}}},13198(t){t.exports=function(t){return{name:"FlatNormal",additions:{fragmentProcess:"vec3 normal = vec3(0.0, 0.0, 1.0);"},tags:["LIGHTING"],disable:!!t}}},40829(t,e,i){var s=i(84220);t.exports=function(t){return{name:"NormalMap",additions:{fragmentHeader:s,fragmentProcess:"vec3 normal = getNormalFromMap(texCoord);"},tags:["LIGHTING"],disable:!!t}}},42792(t){t.exports=function(t){return{name:"TexCoordOut",additions:{fragmentProcess:"vec2 texCoord = outTexCoord;\n#pragma phaserTemplate(texCoord)"},tags:["TEXCOORD"],disable:!!t}}},96049(t,e,i){var s=i(2860);t.exports=function(t){return{name:"GetTexRes",additions:{fragmentHeader:s},tags:["TEXRES"],disable:!!t}}},33997(t,e,i){var s=i(46432);t.exports=function(t,e){void 0===t&&(t=1);for(var i="",r=1;r1&&(d=u.baseType===i.FLOAT?new Float32Array(c):new Int32Array(c)),this.glUniforms.set(l.name,{location:i.getUniformLocation(t,l.name),size:l.size,type:l.type,value:d})}},setUniform:function(t,e){this.uniformRequests.set(t,e)},bind:function(){this.renderer.glWrapper.updateBindingsProgram(this.glState),this.uniformRequests.each(this._processUniformRequest.bind(this)),this.uniformRequests.clear()},_processUniformRequest:function(t,e){var i=this.renderer,s=i.gl,n=this.glUniforms.get(t);if(n){var a=n.value;if(a.length){for(var o=!1,h=0;h1)c.setV.call(s,l,a);else switch(c.size){case 1:c.set.call(s,l,e);break;case 2:c.set.call(s,l,e[0],e[1]);break;case 3:c.set.call(s,l,e[0],e[1],e[2]);break;case 4:c.set.call(s,l,e[0],e[1],e[2],e[3])}}},destroy:function(){if(this.webGLProgram){var t=this.renderer.gl;if(!t.isContextLost()){this._vertexShader&&t.deleteShader(this._vertexShader),this._fragmentShader&&t.deleteShader(this._fragmentShader),t.deleteProgram(this.webGLProgram);for(var e=0;e=0;i--)this.units[i]=void 0,this.renderer.glWrapper.updateBindingsActiveTexture({bindings:{activeTexture:i}}),t.bindTexture(t.TEXTURE_2D,e),this.unitIndices[i]=i;t.texImage2D(t.TEXTURE_2D,0,t.RGBA,1,1,0,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array([0,0,255,255]))},bind:function(t,e,i,s){var r=this.units[e]!==t;if((i||!1!==s||r)&&this.renderer.glWrapper.updateBindingsActiveTexture({bindings:{activeTexture:e}},i),r||i){this.units[e]=t;var n=t?t.webGLTexture:null,a=this.renderer.gl;a.bindTexture(a.TEXTURE_2D,n)}},bindUnits:function(t,e){for(var i=Math.min(t.length,this.renderer.maxTextures)-1;i>=0;i--)void 0!==t[i]&&this.bind(t[i],i,e,!1)},unbindTexture:function(t){for(var e=this.units.length-1;e>=0;e--)this.units[e]===t&&this.bind(null,e,!0,!1)},unbindAllUnits:function(){for(var t=this.units.length-1;t>=0;t--)this.bind(null,t,!0,!1)}});t.exports=s},82751(t,e,i){var s=i(83419),r=i(50030),n=new s({initialize:function(t,e,i,s,r,n,a,o,h,l,u,d,c){void 0===c&&(c=!0),this.renderer=t,this.webGLTexture=null,this.isRenderTexture=!1,this.mipLevel=e,this.minFilter=i,this.magFilter=s,this.wrapT=r,this.wrapS=n,this.format=a,this.pixels=o,this.width=h,this.height=l,this.pma=null==u||u,this.forceSize=!!d,this.flipY=!!c,this.__SPECTOR_Metadata={},this.batchUnit=-1,this.createResource()},createResource:function(){var t=this.renderer.gl;if(!t.isContextLost())if(this.pixels instanceof n)this.webGLTexture=this.pixels.webGLTexture;else{var e=t.createTexture();e.__SPECTOR_Metadata=this.__SPECTOR_Metadata,this.webGLTexture=e,this._processTexture()}},resize:function(t,e){if(this.width!==t||this.height!==e){this.width=t,this.height=e;var i=this.renderer.gl;r(t,e)?(this.wrapS=i.REPEAT,this.wrapT=i.REPEAT):(this.wrapS=i.CLAMP_TO_EDGE,this.wrapT=i.CLAMP_TO_EDGE),this._processTexture()}},update:function(t,e,i,s,r,n,a,o,h){0!==e&&0!==i&&(this.pixels=t,this.width=e,this.height=i,this.flipY=s,this.wrapS=r,this.wrapT=n,this.minFilter=a,this.magFilter=o,this.format=h,this._processTexture())},_processTexture:function(){var t=this.renderer.gl;this.renderer.glTextureUnits.bind(this,0),this.renderer.glWrapper.updateTexturing({texturing:{flipY:this.flipY,premultiplyAlpha:this.pma}}),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,this.minFilter),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,this.magFilter),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,this.wrapS),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,this.wrapT);var e=this.pixels,i=this.mipLevel,s=this.width,n=this.height,a=this.format,o=!1;if(null==e)t.texImage2D(t.TEXTURE_2D,i,a,s,n,0,a,t.UNSIGNED_BYTE,null),o=r(s,n);else if(e.compressed){s=e.width,n=e.height,o=e.generateMipmap;for(var h=0;h0&&this.parentSize.height>0&&this.displaySize.setParent(this.parentSize),this.refresh()),t.events.on(h.PRE_STEP,this.step,this),t.events.once(h.READY,this.refresh,this),t.events.once(h.DESTROY,this.destroy,this),this.startListeners()},parseConfig:function(t){this.getParent(t),this.getParentBounds();var e=t.width,i=t.height,r=t.scaleMode,n=t.zoom,a=t.autoRound;if("string"==typeof e)if("%"!==e.substr(-1))e=parseInt(e,10);else{var o=this.parentSize.width;0===o&&(o=window.innerWidth);var h=parseInt(e,10)/100;e=Math.floor(o*h)}if("string"==typeof i)if("%"!==i.substr(-1))i=parseInt(i,10);else{var l=this.parentSize.height;0===l&&(l=window.innerHeight);var u=parseInt(i,10)/100;i=Math.floor(l*u)}this.scaleMode=r,this.autoRound=a,this.autoCenter=t.autoCenter,this.resizeInterval=t.resizeInterval,a&&(e=Math.floor(e),i=Math.floor(i)),this.gameSize.setSize(e,i),n===s.ZOOM.MAX_ZOOM&&(n=this.getMaxZoom()),this.zoom=n,1!==n&&(this._resetZoom=!0),this.baseSize.setSize(e,i),a&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),t.minWidth>0&&this.displaySize.setMin(t.minWidth*n,t.minHeight*n),t.maxWidth>0&&this.displaySize.setMax(t.maxWidth*n,t.maxHeight*n),this.displaySize.setSize(e,i),(t.snapWidth>0||t.snapHeight>0)&&this.displaySize.setSnap(t.snapWidth,t.snapHeight),this.orientation=d(e,i)},getParent:function(t){var e=t.parent;if(null!==e){if(this.parent=u(e),this.parentIsWindow=this.parent===document.body,t.expandParent&&t.scaleMode!==s.SCALE_MODE.NONE){var i=this.parent.getBoundingClientRect();(this.parentIsWindow||0===i.height)&&(document.documentElement.style.height="100%",document.body.style.height="100%",i=this.parent.getBoundingClientRect(),this.parentIsWindow||0!==i.height||(this.parent.style.overflow="hidden",this.parent.style.width="100%",this.parent.style.height="100%"))}t.fullscreenTarget&&!this.fullscreenTarget&&(this.fullscreenTarget=u(t.fullscreenTarget))}},getParentBounds:function(){if(!this.parent)return!1;var t=this.parentSize,e=this.parent.getBoundingClientRect();this.parentIsWindow&&this.game.device.os.iOS&&(e.height=l(!0));var i=e.width,s=e.height;if(t.width!==i||t.height!==s)return t.setSize(i,s),!0;if(this.canvas){var r=this.canvasBounds,n=this.canvas.getBoundingClientRect();if(n.x!==r.x||n.y!==r.y)return!0}return!1},lockOrientation:function(t){var e=screen.lockOrientation||screen.mozLockOrientation||screen.msLockOrientation;return!!e&&e.call(screen,t)},setParentSize:function(t,e){return this.parentSize.setSize(t,e),this.refresh()},setGameSize:function(t,e){var i=this.autoRound;i&&(t=Math.floor(t),e=Math.floor(e));var s=this.width,r=this.height;return this.gameSize.resize(t,e),this.baseSize.resize(t,e),i&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),this.displaySize.setAspectRatio(t/e),this.canvas.width=this.baseSize.width,this.canvas.height=this.baseSize.height,this.refresh(s,r)},resize:function(t,e){var i=this.zoom,s=this.autoRound;s&&(t=Math.floor(t),e=Math.floor(e));var r=this.width,n=this.height;this.gameSize.resize(t,e),this.baseSize.resize(t,e),s&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),this.displaySize.setSize(t*i,e*i),this.canvas.width=this.baseSize.width,this.canvas.height=this.baseSize.height;var a=this.canvas.style,o=t*i,h=e*i;return s&&(o=Math.floor(o),h=Math.floor(h)),o===t&&h===e||(a.width=o+"px",a.height=h+"px"),this.refresh(r,n)},setZoom:function(t){return this.zoom=t,this._resetZoom=!0,this.refresh()},setMaxZoom:function(){return this.zoom=this.getMaxZoom(),this._resetZoom=!0,this.refresh()},setSnap:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.displaySize.setSnap(t,e),this.refresh()},refresh:function(t,e){void 0===t&&(t=this.width),void 0===e&&(e=this.height),this.updateScale(),this.updateBounds(),this.updateOrientation(),this.displayScale.set(this.baseSize.width/this.canvasBounds.width,this.baseSize.height/this.canvasBounds.height);var i=this.game.domContainer;if(i){this.baseSize.setCSS(i);var s=this.canvas.style,r=i.style;r.transform="scale("+this.displaySize.width/this.baseSize.width+","+this.displaySize.height/this.baseSize.height+")",r.marginLeft=s.marginLeft,r.marginTop=s.marginTop}return this.emit(o.RESIZE,this.gameSize,this.baseSize,this.displaySize,t,e),this},updateOrientation:function(){if(this._checkOrientation){this._checkOrientation=!1;var t=d(this.width,this.height);t!==this.orientation&&(this.orientation=t,this.emit(o.ORIENTATION_CHANGE,t))}},updateScale:function(){var t,e,i=this.canvas.style,r=this.gameSize.width,a=this.gameSize.height,o=this.zoom,h=this.autoRound;if(this.scaleMode===s.SCALE_MODE.NONE)this.displaySize.setSize(r*o,a*o),t=this.displaySize.width,e=this.displaySize.height,h&&(t=Math.floor(t),e=Math.floor(e)),this._resetZoom&&(i.width=t+"px",i.height=e+"px",this._resetZoom=!1);else if(this.scaleMode===s.SCALE_MODE.RESIZE)this.displaySize.setSize(this.parentSize.width,this.parentSize.height),this.gameSize.setSize(this.displaySize.width,this.displaySize.height),this.baseSize.setSize(this.displaySize.width,this.displaySize.height),t=this.displaySize.width,e=this.displaySize.height,h&&(t=Math.floor(t),e=Math.floor(e)),this.canvas.width=t,this.canvas.height=e;else if(this.scaleMode===s.SCALE_MODE.EXPAND){var l,u,d=this.game.config.width,c=this.game.config.height,f=this.parentSize.width,p=this.parentSize.height,g=f/d,m=p/c;g=0?0:-a.x*o.x,l=a.y>=0?0:-a.y*o.y;return i=n.width>=a.width?r.width:r.width-(a.width-n.width)*o.x,s=n.height>=a.height?r.height:r.height-(a.height-n.height)*o.y,e.setTo(h,l,i,s),t&&(e.width/=t.zoomX,e.height/=t.zoomY,e.centerX=t.centerX+t.scrollX,e.centerY=t.centerY+t.scrollY),e},step:function(t,e){this.parent&&(this._lastCheck+=e,(this.dirty||this._lastCheck>this.resizeInterval)&&(this.getParentBounds()&&this.refresh(),this.dirty=!1,this._lastCheck=0))},stopListeners:function(){var t=this.domlisteners;screen.orientation&&screen.orientation.addEventListener?screen.orientation.removeEventListener("change",t.orientationChange,!1):window.removeEventListener("orientationchange",t.orientationChange,!1),window.removeEventListener("resize",t.windowResize,!1);["webkit","moz",""].forEach(function(e){document.removeEventListener(e+"fullscreenchange",t.fullScreenChange,!1),document.removeEventListener(e+"fullscreenerror",t.fullScreenError,!1)}),document.removeEventListener("MSFullscreenChange",t.fullScreenChange,!1),document.removeEventListener("MSFullscreenError",t.fullScreenError,!1)},destroy:function(){this.removeAllListeners(),this.stopListeners(),this.game=null,this.canvas=null,this.canvasBounds=null,this.parent=null,this.fullscreenTarget=null,this.parentSize.destroy(),this.gameSize.destroy(),this.baseSize.destroy(),this.displaySize.destroy()},isFullscreen:{get:function(){return this.fullscreen.active}},width:{get:function(){return this.gameSize.width}},height:{get:function(){return this.gameSize.height}},isPortrait:{get:function(){return this.orientation===s.ORIENTATION.PORTRAIT}},isLandscape:{get:function(){return this.orientation===s.ORIENTATION.LANDSCAPE}},isGamePortrait:{get:function(){return this.height>this.width}},isGameLandscape:{get:function(){return this.width>this.height}}});t.exports=y},64743(t){t.exports={NO_CENTER:0,CENTER_BOTH:1,CENTER_HORIZONTALLY:2,CENTER_VERTICALLY:3}},39218(t){t.exports={LANDSCAPE:"landscape-primary",LANDSCAPE_SECONDARY:"landscape-secondary",PORTRAIT:"portrait-primary",PORTRAIT_SECONDARY:"portrait-secondary"}},81050(t){t.exports={NONE:0,WIDTH_CONTROLS_HEIGHT:1,HEIGHT_CONTROLS_WIDTH:2,FIT:3,ENVELOP:4,RESIZE:5,EXPAND:6}},80805(t){t.exports={NO_ZOOM:1,ZOOM_2X:2,ZOOM_4X:4,MAX_ZOOM:-1}},13560(t,e,i){var s={CENTER:i(64743),ORIENTATION:i(39218),SCALE_MODE:i(81050),ZOOM:i(80805)};t.exports=s},56139(t){t.exports="enterfullscreen"},2336(t){t.exports="fullscreenfailed"},47412(t){t.exports="fullscreenunsupported"},51452(t){t.exports="leavefullscreen"},20666(t){t.exports="orientationchange"},47945(t){t.exports="resize"},97480(t,e,i){t.exports={ENTER_FULLSCREEN:i(56139),FULLSCREEN_FAILED:i(2336),FULLSCREEN_UNSUPPORTED:i(47412),LEAVE_FULLSCREEN:i(51452),ORIENTATION_CHANGE:i(20666),RESIZE:i(47945)}},93364(t,e,i){var s=i(79291),r=i(13560),n={Center:i(64743),Events:i(97480),Orientation:i(39218),ScaleManager:i(76531),ScaleModes:i(81050),Zoom:i(80805)};n=s(!1,n,r.CENTER),n=s(!1,n,r.ORIENTATION),n=s(!1,n,r.SCALE_MODE),n=s(!1,n,r.ZOOM),t.exports=n},27397(t,e,i){var s=i(95540),r=i(35355);t.exports=function(t){var e=t.game.config.defaultPhysicsSystem,i=s(t.settings,"physics",!1);if(e||i){var n=[];if(e&&n.push(r(e+"Physics")),i)for(var a in i)a=r(a.concat("Physics")),-1===n.indexOf(a)&&n.push(a);return n}}},52106(t,e,i){var s=i(95540);t.exports=function(t){var e=t.plugins.getDefaultScenePlugins(),i=s(t.settings,"plugins",!1);return Array.isArray(i)?i:e||[]}},87033(t){t.exports={game:"game",renderer:"renderer",anims:"anims",cache:"cache",plugins:"plugins",registry:"registry",scale:"scale",sound:"sound",textures:"textures",events:"events",cameras:"cameras",add:"add",make:"make",scenePlugin:"scene",displayList:"children",lights:"lights",data:"data",input:"input",load:"load",time:"time",tweens:"tweens",arcadePhysics:"physics",matterPhysics:"matter"}},97482(t,e,i){var s=i(83419),r=i(2368),n=new s({initialize:function(t){this.sys=new r(this,t),this.game,this.anims,this.cache,this.registry,this.sound,this.textures,this.events,this.cameras,this.add,this.make,this.scene,this.children,this.lights,this.data,this.input,this.load,this.time,this.tweens,this.physics,this.matter,this.scale,this.plugins,this.renderer},update:function(){}});t.exports=n},60903(t,e,i){var s=i(83419),r=i(89993),n=i(44594),a=i(8443),o=i(35154),h=i(54899),l=i(29747),u=i(97482),d=i(2368),c=new s({initialize:function(t,e){if(this.game=t,this.keys={},this.scenes=[],this._pending=[],this._start=[],this._queue=[],this._data={},this.isProcessing=!1,this.isBooted=!1,this.customViewports=0,this.systemScene,e){Array.isArray(e)||(e=[e]);for(var i=0;i-1&&(delete this.keys[s],this.scenes.splice(i,1),this._start.indexOf(s)>-1&&(i=this._start.indexOf(s),this._start.splice(i,1)),e.sys.destroy()),this},bootScene:function(t){var e,i=t.sys,s=i.settings;i.sceneUpdate=l,t.init&&(t.init.call(t,s.data),s.status=r.INIT,s.isTransition&&i.events.emit(n.TRANSITION_INIT,s.transitionFrom,s.transitionDuration)),i.load&&(e=i.load).reset(),e&&t.preload?(t.preload.call(t),s.status=r.LOADING,e.once(h.COMPLETE,this.loadComplete,this),e.start()):this.create(t)},loadComplete:function(t){this.create(t.scene)},payloadComplete:function(t){this.bootScene(t.scene)},update:function(t,e){this.processQueue(),this.isProcessing=!0;for(var i=this.scenes.length-1;i>=0;i--){var s=this.scenes[i].sys;s.settings.status>r.START&&s.settings.status<=r.RUNNING&&s.step(t,e),s.scenePlugin&&s.scenePlugin._target&&s.scenePlugin.step(t,e)}},render:function(t){for(var e=0;e=r.LOADING&&i.settings.status=r.START&&a<=r.CREATING)return this;if(a>=r.RUNNING&&a<=r.SLEEPING)n.shutdown(),n.sceneUpdate=l,n.start(e);else if(n.sceneUpdate=l,n.start(e),n.load&&(s=n.load),s&&n.settings.hasOwnProperty("pack")&&(s.reset(),s.addPack({payload:n.settings.pack})))return n.settings.status=r.LOADING,s.once(h.COMPLETE,this.payloadComplete,this),s.start(),this;return this.bootScene(i),this},stop:function(t,e){var i=this.getScene(t);if(i&&!i.sys.isTransitioning()&&i.sys.settings.status!==r.SHUTDOWN){var s=i.sys.load;s&&(s.off(h.COMPLETE,this.loadComplete,this),s.off(h.COMPLETE,this.payloadComplete,this)),i.sys.shutdown(e)}return this},switch:function(t,e,i){var s=this.getScene(t),r=this.getScene(e);return s&&r&&s!==r&&(this.sleep(t),this.isSleeping(e)?this.wake(e,i):this.start(e,i)),this},getAt:function(t){return this.scenes[t]},getIndex:function(t){var e=this.getScene(t);return this.scenes.indexOf(e)},bringToTop:function(t){if(this.isProcessing)return this.queueOp("bringToTop",t);var e=this.getIndex(t),i=this.scenes;if(-1!==e&&e0){var i=this.getScene(t);this.scenes.splice(e,1),this.scenes.unshift(i)}return this},moveDown:function(t){if(this.isProcessing)return this.queueOp("moveDown",t);var e=this.getIndex(t);if(e>0){var i=e-1,s=this.getScene(t),r=this.getAt(i);this.scenes[e]=r,this.scenes[i]=s}return this},moveUp:function(t){if(this.isProcessing)return this.queueOp("moveUp",t);var e=this.getIndex(t);if(ei),0,r)}return this},moveBelow:function(t,e){if(t===e)return this;if(this.isProcessing)return this.queueOp("moveBelow",t,e);var i=this.getIndex(t),s=this.getIndex(e);if(-1!==i&&-1!==s&&s>i){var r=this.getAt(s);this.scenes.splice(s,1),0===i?this.scenes.unshift(r):this.scenes.splice(i-(s=this._duration&&this.transitionComplete()},transitionComplete:function(){var t=this._target.sys,e=this._target.sys.settings;t.events.emit(n.TRANSITION_COMPLETE,this.scene),e.isTransition=!1,e.transitionFrom=null,this._duration=0,this._target=null,this._onUpdate=null,this._onUpdateScope=null,this._willRemove?this.manager.remove(this.key):this._willSleep?this.systems.sleep():this.manager.stop(this.key)},add:function(t,e,i,s){return this.manager.add(t,e,i,s)},launch:function(t,e){return t&&t!==this.key&&this.manager.queueOp("start",t,e),this},run:function(t,e){return t&&t!==this.key&&this.manager.queueOp("run",t,e),this},pause:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("pause",t,e),this},resume:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("resume",t,e),this},sleep:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("sleep",t,e),this},wake:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("wake",t,e),this},switch:function(t,e){return t!==this.key&&this.manager.queueOp("switch",this.key,t,e),this},stop:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("stop",t,e),this},setActive:function(t,e,i){void 0===e&&(e=this.key);var s=this.manager.getScene(e);return s&&s.sys.setActive(t,i),this},setVisible:function(t,e){void 0===e&&(e=this.key);var i=this.manager.getScene(e);return i&&i.sys.setVisible(t),this},isSleeping:function(t){return void 0===t&&(t=this.key),this.manager.isSleeping(t)},isActive:function(t){return void 0===t&&(t=this.key),this.manager.isActive(t)},isPaused:function(t){return void 0===t&&(t=this.key),this.manager.isPaused(t)},isVisible:function(t){return void 0===t&&(t=this.key),this.manager.isVisible(t)},swapPosition:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.swapPosition(t,e),this},moveAbove:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.moveAbove(t,e),this},moveBelow:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.moveBelow(t,e),this},remove:function(t){return void 0===t&&(t=this.key),this.manager.remove(t),this},moveUp:function(t){return void 0===t&&(t=this.key),this.manager.moveUp(t),this},moveDown:function(t){return void 0===t&&(t=this.key),this.manager.moveDown(t),this},bringToTop:function(t){return void 0===t&&(t=this.key),this.manager.bringToTop(t),this},sendToBack:function(t){return void 0===t&&(t=this.key),this.manager.sendToBack(t),this},get:function(t){return this.manager.getScene(t)},getStatus:function(t){var e=this.manager.getScene(t);if(e)return e.sys.getStatus()},getIndex:function(t){return void 0===t&&(t=this.key),this.manager.getIndex(t)},shutdown:function(){var t=this.systems.events;t.off(n.SHUTDOWN,this.shutdown,this),t.off(n.TRANSITION_OUT)},destroy:function(){this.shutdown(),this.scene.sys.events.off(n.START,this.start,this),this.scene=null,this.systems=null,this.settings=null,this.manager=null}});o.register("ScenePlugin",h,"scenePlugin"),t.exports=h},55681(t,e,i){var s=i(89993),r=i(35154),n=i(46975),a=i(87033),o={create:function(t){return"string"==typeof t?t={key:t}:void 0===t&&(t={}),{status:s.PENDING,key:r(t,"key",""),active:r(t,"active",!1),visible:r(t,"visible",!0),isBooted:!1,isTransition:!1,transitionFrom:null,transitionDuration:0,transitionAllowInput:!0,data:{},pack:r(t,"pack",!1),cameras:r(t,"cameras",null),map:r(t,"map",n(a,r(t,"mapAdd",{}))),physics:r(t,"physics",{}),loader:r(t,"loader",{}),plugins:r(t,"plugins",!1),input:r(t,"input",{})}}};t.exports=o},2368(t,e,i){var s=i(83419),r=i(89993),n=i(42363),a=i(44594),o=i(27397),h=i(52106),l=i(29747),u=i(55681),d=new s({initialize:function(t,e){this.scene=t,this.game,this.renderer,this.config=e,this.settings=u.create(e),this.canvas,this.context,this.anims,this.cache,this.plugins,this.registry,this.scale,this.sound,this.textures,this.add,this.cameras,this.displayList,this.events,this.make,this.scenePlugin,this.updateList,this.sceneUpdate=l},init:function(t){this.settings.status=r.INIT,this.sceneUpdate=l,this.game=t,this.renderer=t.renderer,this.canvas=t.canvas,this.context=t.context;var e=t.plugins;this.plugins=e,e.addToScene(this,n.Global,[n.CoreScene,h(this),o(this)]),this.events.emit(a.BOOT,this),this.settings.isBooted=!0},step:function(t,e){var i=this.events;i.emit(a.PRE_UPDATE,t,e),i.emit(a.UPDATE,t,e),this.sceneUpdate.call(this.scene,t,e),i.emit(a.POST_UPDATE,t,e)},render:function(t){var e=this.displayList;e.depthSort(),this.events.emit(a.PRE_RENDER,t),this.cameras.render(t,e),this.events.emit(a.RENDER,t)},queueDepthSort:function(){this.displayList.queueDepthSort()},depthSort:function(){this.displayList.depthSort()},pause:function(t){var e=this.settings,i=this.getStatus();return i!==r.CREATING&&i!==r.RUNNING?console.warn("Cannot pause non-running Scene",e.key):this.settings.active&&(e.status=r.PAUSED,e.active=!1,this.events.emit(a.PAUSE,this,t)),this},resume:function(t){var e=this.events,i=this.settings;return this.settings.active||(i.status=r.RUNNING,i.active=!0,e.emit(a.RESUME,this,t)),this},sleep:function(t){var e=this.settings,i=this.getStatus();return i!==r.CREATING&&i!==r.RUNNING?console.warn("Cannot sleep non-running Scene",e.key):(e.status=r.SLEEPING,e.active=!1,e.visible=!1,this.events.emit(a.SLEEP,this,t)),this},wake:function(t){var e=this.events,i=this.settings;return i.status=r.RUNNING,i.active=!0,i.visible=!0,e.emit(a.WAKE,this,t),i.isTransition&&e.emit(a.TRANSITION_WAKE,i.transitionFrom,i.transitionDuration),this},getData:function(){return this.settings.data},getStatus:function(){return this.settings.status},canInput:function(){var t=this.settings.status;return t>r.PENDING&&t<=r.RUNNING},isSleeping:function(){return this.settings.status===r.SLEEPING},isActive:function(){return this.settings.status===r.RUNNING},isPaused:function(){return this.settings.status===r.PAUSED},isTransitioning:function(){return this.settings.isTransition||null!==this.scenePlugin._target},isTransitionOut:function(){return null!==this.scenePlugin._target&&this.scenePlugin._duration>0},isTransitionIn:function(){return this.settings.isTransition},isVisible:function(){return this.settings.visible},setVisible:function(t){return this.settings.visible=t,this},setActive:function(t,e){return t?this.resume(e):this.pause(e)},start:function(t){var e=this.events,i=this.settings;t&&(i.data=t),i.status=r.START,i.active=!0,i.visible=!0,e.emit(a.START,this),e.emit(a.READY,this,t)},shutdown:function(t){var e=this.events,i=this.settings;e.off(a.TRANSITION_INIT),e.off(a.TRANSITION_START),e.off(a.TRANSITION_COMPLETE),e.off(a.TRANSITION_OUT),i.status=r.SHUTDOWN,i.active=!1,i.visible=!1,e.emit(a.SHUTDOWN,this,t)},destroy:function(){var t=this.events,e=this.settings;e.status=r.DESTROYED,e.active=!1,e.visible=!1,t.emit(a.DESTROY,this),t.removeAllListeners();for(var i=["scene","game","anims","cache","plugins","registry","sound","textures","add","cameras","displayList","events","make","scenePlugin","updateList"],s=0;s=0;i--){var s=this.sounds[i];s.key===t&&(s.destroy(),this.sounds.splice(i,1),e++)}return e},pauseAll:function(){this.forEachActiveSound(function(t){t.pause()}),this.emit(a.PAUSE_ALL,this)},resumeAll:function(){this.forEachActiveSound(function(t){t.resume()}),this.emit(a.RESUME_ALL,this)},setListenerPosition:u,stopAll:function(){this.forEachActiveSound(function(t){t.stop()}),this.emit(a.STOP_ALL,this)},stopByKey:function(t){var e=0;return this.getAll(t).forEach(function(t){t.stop()&&e++}),e},isPlaying:function(t){var e,i=this.sounds.length-1;if(void 0===t){for(;i>=0;i--)if((e=this.sounds[i]).isPlaying)return!0}else for(;i>=0;i--)if((e=this.sounds[i]).key===t&&e.isPlaying)return!0;return!1},unlock:u,onBlur:u,onFocus:u,onGameBlur:function(){this.gameLostFocus=!0,this.pauseOnBlur&&this.onBlur()},onGameFocus:function(){this.gameLostFocus=!1,this.pauseOnBlur&&this.onFocus()},update:function(t,e){this.unlocked&&(this.unlocked=!1,this.locked=!1,this.emit(a.UNLOCKED,this));for(var i=this.sounds.length-1;i>=0;i--)this.sounds[i].pendingRemove&&this.sounds.splice(i,1);this.sounds.forEach(function(i){i.update(t,e)})},destroy:function(){this.game.events.off(o.BLUR,this.onGameBlur,this),this.game.events.off(o.FOCUS,this.onGameFocus,this),this.game.events.off(o.PRE_STEP,this.update,this),this.removeAllListeners(),this.removeAll(),this.sounds.length=0,this.sounds=null,this.listenerPosition=null,this.game=null},forEachActiveSound:function(t,e){var i=this;this.sounds.forEach(function(s,r){s&&!s.pendingRemove&&t.call(e||i,s,r,i.sounds)})},setRate:function(t){return this.rate=t,this},rate:{get:function(){return this._rate},set:function(t){this._rate=t,this.forEachActiveSound(function(t){t.calculateRate()}),this.emit(a.GLOBAL_RATE,this,t)}},setDetune:function(t){return this.detune=t,this},detune:{get:function(){return this._detune},set:function(t){this._detune=t,this.forEachActiveSound(function(t){t.calculateRate()}),this.emit(a.GLOBAL_DETUNE,this,t)}}});t.exports=c},14747(t,e,i){var s=i(33684),r=i(25960),n=i(57490),a={create:function(t){var e=t.config.audio,i=t.device.audio;return e.noAudio||!i.webAudio&&!i.audioData?new r(t):i.webAudio&&!e.disableWebAudio?new n(t):new s(t)}};t.exports=a},19723(t){t.exports="complete"},98882(t){t.exports="decodedall"},57506(t){t.exports="decoded"},73146(t){t.exports="destroy"},11305(t){t.exports="detune"},40577(t){t.exports="detune"},30333(t){t.exports="mute"},20394(t){t.exports="rate"},21802(t){t.exports="volume"},1299(t){t.exports="looped"},99190(t){t.exports="loop"},97125(t){t.exports="mute"},89259(t){t.exports="pan"},79986(t){t.exports="pauseall"},17586(t){t.exports="pause"},19618(t){t.exports="play"},42306(t){t.exports="rate"},10387(t){t.exports="resumeall"},48959(t){t.exports="resume"},9960(t){t.exports="seek"},19180(t){t.exports="stopall"},98328(t){t.exports="stop"},50401(t){t.exports="unlocked"},52498(t){t.exports="volume"},14463(t,e,i){t.exports={COMPLETE:i(19723),DECODED:i(57506),DECODED_ALL:i(98882),DESTROY:i(73146),DETUNE:i(11305),GLOBAL_DETUNE:i(40577),GLOBAL_MUTE:i(30333),GLOBAL_RATE:i(20394),GLOBAL_VOLUME:i(21802),LOOP:i(99190),LOOPED:i(1299),MUTE:i(97125),PAN:i(89259),PAUSE_ALL:i(79986),PAUSE:i(17586),PLAY:i(19618),RATE:i(42306),RESUME_ALL:i(10387),RESUME:i(48959),SEEK:i(9960),STOP_ALL:i(19180),STOP:i(98328),UNLOCKED:i(50401),VOLUME:i(52498)}},64895(t,e,i){var s=i(30341),r=i(83419),n=i(14463),a=i(45319),o=new r({Extends:s,initialize:function(t,e,i){if(void 0===i&&(i={}),this.tags=t.game.cache.audio.get(e),!this.tags)throw new Error('No cached audio asset with key "'+e);this.audio=null,this.startTime=0,this.previousTime=0,this.duration=this.tags[0].duration,this.totalDuration=this.tags[0].duration,s.call(this,t,e,i)},play:function(t,e){return!this.manager.isLocked(this,"play",[t,e])&&(!!s.prototype.play.call(this,t,e)&&(!!this.pickAndPlayAudioTag()&&(this.emit(n.PLAY,this),!0)))},pause:function(){return!this.manager.isLocked(this,"pause")&&(!(this.startTime>0)&&(!!s.prototype.pause.call(this)&&(this.currentConfig.seek=this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0),this.stopAndReleaseAudioTag(),this.emit(n.PAUSE,this),!0)))},resume:function(){return!this.manager.isLocked(this,"resume")&&(!(this.startTime>0)&&(!!s.prototype.resume.call(this)&&(!!this.pickAndPlayAudioTag()&&(this.emit(n.RESUME,this),!0))))},stop:function(){return!this.manager.isLocked(this,"stop")&&(!!s.prototype.stop.call(this)&&(this.stopAndReleaseAudioTag(),this.emit(n.STOP,this),!0))},pickAndPlayAudioTag:function(){if(!this.pickAudioTag())return this.reset(),!1;var t=this.currentConfig.seek,e=this.currentConfig.delay,i=(this.currentMarker?this.currentMarker.start:0)+t;return this.previousTime=i,this.audio.currentTime=i,this.applyConfig(),0===e?(this.startTime=0,this.audio.paused&&this.playCatchPromise()):(this.startTime=window.performance.now()+1e3*e,this.audio.paused||this.audio.pause()),this.resetConfig(),!0},pickAudioTag:function(){if(this.audio)return!0;for(var t=0;t0)this.startTime=i-this.manager.loopEndOffset?(this.audio.currentTime=e+Math.max(0,s-i),s=this.audio.currentTime):s=i)return this.reset(),this.stopAndReleaseAudioTag(),void this.emit(n.COMPLETE,this);this.previousTime=s}},destroy:function(){s.prototype.destroy.call(this),this.tags=null,this.audio&&this.stopAndReleaseAudioTag()},updateMute:function(){this.audio&&(this.audio.muted=this.currentConfig.mute||this.manager.mute)},updateVolume:function(){this.audio&&(this.audio.volume=a(this.currentConfig.volume*this.manager.volume,0,1))},calculateRate:function(){s.prototype.calculateRate.call(this),this.audio&&(this.audio.playbackRate=this.totalRate)},mute:{get:function(){return this.currentConfig.mute},set:function(t){this.currentConfig.mute=t,this.manager.isLocked(this,"mute",t)||(this.updateMute(),this.emit(n.MUTE,this,t))}},setMute:function(t){return this.mute=t,this},volume:{get:function(){return this.currentConfig.volume},set:function(t){this.currentConfig.volume=t,this.manager.isLocked(this,"volume",t)||(this.updateVolume(),this.emit(n.VOLUME,this,t))}},setVolume:function(t){return this.volume=t,this},rate:{get:function(){return this.currentConfig.rate},set:function(t){this.currentConfig.rate=t,this.manager.isLocked(this,n.RATE,t)||(this.calculateRate(),this.emit(n.RATE,this,t))}},setRate:function(t){return this.rate=t,this},detune:{get:function(){return this.currentConfig.detune},set:function(t){this.currentConfig.detune=t,this.manager.isLocked(this,n.DETUNE,t)||(this.calculateRate(),this.emit(n.DETUNE,this,t))}},setDetune:function(t){return this.detune=t,this},seek:{get:function(){return this.isPlaying?this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0):this.isPaused?this.currentConfig.seek:0},set:function(t){this.manager.isLocked(this,"seek",t)||this.startTime>0||(this.isPlaying||this.isPaused)&&(t=Math.min(Math.max(0,t),this.duration),this.isPlaying?(this.previousTime=t,this.audio.currentTime=t):this.isPaused&&(this.currentConfig.seek=t),this.emit(n.SEEK,this,t))}},setSeek:function(t){return this.seek=t,this},loop:{get:function(){return this.currentConfig.loop},set:function(t){this.currentConfig.loop=t,this.manager.isLocked(this,"loop",t)||(this.audio&&(this.audio.loop=t),this.emit(n.LOOP,this,t))}},setLoop:function(t){return this.loop=t,this},pan:{get:function(){return this.currentConfig.pan},set:function(t){this.currentConfig.pan=t,this.emit(n.PAN,this,t)}},setPan:function(t){return this.pan=t,this}});t.exports=o},33684(t,e,i){var s=i(85034),r=i(83419),n=i(14463),a=i(64895),o=new r({Extends:s,initialize:function(t){this.override=!0,this.audioPlayDelay=.1,this.loopEndOffset=.05,this.onBlurPausedSounds=[],this.locked="ontouchstart"in window,this.lockedActionsQueue=this.locked?[]:null,this._mute=!1,this._volume=1,s.call(this,t)},add:function(t,e){var i=new a(this,t,e);return this.sounds.push(i),i},unlock:function(){this.locked=!1;var t=this;if(this.game.cache.audio.entries.each(function(e,i){for(var s=0;s-1},setAll:function(t,e,i,r){return s.SetAll(this.list,t,e,i,r),this},each:function(t,e){for(var i=[null],s=2;s0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position0?(this.position--,this.list[this.position]):null}}});t.exports=o},90330(t,e,i){var s=new(i(83419))({initialize:function(t){this.entries={},this.size=0,this.setAll(t)},setAll:function(t){if(Array.isArray(t))for(var e=0;e-1},isPending:function(t){return this._toProcess>0&&this._pending.indexOf(t)>-1},isDestroying:function(t){return this._destroy.indexOf(t)>-1},add:function(t){return this.checkQueue&&this.isActive(t)&&!this.isDestroying(t)||this.isPending(t)||(this._pending.push(t),this._toProcess++),t},remove:function(t){if(this.isPending(t)){var e=this._pending,i=e.indexOf(t);-1!==i&&e.splice(i,1)}else this.isActive(t)&&(this._destroy.push(t),this._toProcess++);return t},removeAll:function(){for(var t=this._active,e=this._destroy,i=t.length;i--;)e.push(t[i]),this._toProcess++;return this},update:function(){if(0===this._toProcess)return this._active;var t,e,i=this._destroy,s=this._active;for(t=0;t=t.minX&&e.maxY>=t.minY}function v(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function y(t,e,i,r,n){for(var a,o=[e,i];o.length;)(i=o.pop())-(e=o.pop())<=r||(a=e+Math.ceil((i-e)/r/2)*r,s(t,a,e,i,n),o.push(e,a,a,i))}r.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,i=[],s=this.toBBox;if(!m(t,e))return i;for(var r,n,a,o,h=[];e;){for(r=0,n=e.children.length;r=0&&n[e].children.length>this._maxEntries;)this._split(n,e),e--;this._adjustParentBBoxes(r,n,e)},_split:function(t,e){var i=t[e],s=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,s);var n=this._chooseSplitIndex(i,r,s),o=v(i.children.splice(n,i.children.length-n));o.height=i.height,o.leaf=i.leaf,a(i,this.toBBox),a(o,this.toBBox),e?t[e-1].children.push(o):this._splitRoot(i,o)},_splitRoot:function(t,e){this.data=v([t,e]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,i){var s,r,n,a,h,l,u,c;for(l=u=1/0,s=e;s<=i-e;s++)a=p(r=o(t,0,s,this.toBBox),n=o(t,s,i,this.toBBox)),h=d(r)+d(n),a=e;r--)n=t.children[r],h(u,t.leaf?a(n):n),d+=c(u);return d},_adjustParentBBoxes:function(t,e,i){for(var s=i;s>=0;s--)h(e[s],t)},_condense:function(t){for(var e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children).splice(e.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},compareMinX:function(t,e){return t.left-e.left},compareMinY:function(t,e){return t.top-e.top},toBBox:function(t){return{minX:t.left,minY:t.top,maxX:t.right,maxY:t.bottom}}},t.exports=r},86555(t,e,i){var s=i(45319),r=i(83419),n=i(56583),a=i(26099),o=new r({initialize:function(t,e,i,s){void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=0),void 0===s&&(s=null),this._width=t,this._height=e,this._parent=s,this.aspectMode=i,this.aspectRatio=0===e?1:t/e,this.minWidth=0,this.minHeight=0,this.maxWidth=Number.MAX_VALUE,this.maxHeight=Number.MAX_VALUE,this.snapTo=new a},setAspectMode:function(t){return void 0===t&&(t=0),this.aspectMode=t,this.setSize(this._width,this._height)},setSnap:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.snapTo.set(t,e),this.setSize(this._width,this._height)},setParent:function(t){return this._parent=t,this.setSize(this._width,this._height)},setMin:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.minWidth=s(t,0,this.maxWidth),this.minHeight=s(e,0,this.maxHeight),this.setSize(this._width,this._height)},setMax:function(t,e){return void 0===t&&(t=Number.MAX_VALUE),void 0===e&&(e=t),this.maxWidth=s(t,this.minWidth,Number.MAX_VALUE),this.maxHeight=s(e,this.minHeight,Number.MAX_VALUE),this.setSize(this._width,this._height)},setSize:function(t,e){switch(void 0===t&&(t=0),void 0===e&&(e=t),this.aspectMode){case o.NONE:this._width=this.getNewWidth(n(t,this.snapTo.x)),this._height=this.getNewHeight(n(e,this.snapTo.y)),this.aspectRatio=0===this._height?1:this._width/this._height;break;case o.WIDTH_CONTROLS_HEIGHT:this._width=this.getNewWidth(n(t,this.snapTo.x)),this._height=this.getNewHeight(this._width*(1/this.aspectRatio),!1);break;case o.HEIGHT_CONTROLS_WIDTH:this._height=this.getNewHeight(n(e,this.snapTo.y)),this._width=this.getNewWidth(this._height*this.aspectRatio,!1);break;case o.FIT:this.constrain(t,e,!0);break;case o.ENVELOP:this.constrain(t,e,!1)}return this},setAspectRatio:function(t){return this.aspectRatio=t,this.setSize(this._width,this._height)},resize:function(t,e){return this._width=this.getNewWidth(n(t,this.snapTo.x)),this._height=this.getNewHeight(n(e,this.snapTo.y)),this.aspectRatio=0===this._height?1:this._width/this._height,this},getNewWidth:function(t,e){return void 0===e&&(e=!0),t=s(t,this.minWidth,this.maxWidth),e&&this._parent&&t>this._parent.width&&(t=Math.max(this.minWidth,this._parent.width)),t},getNewHeight:function(t,e){return void 0===e&&(e=!0),t=s(t,this.minHeight,this.maxHeight),e&&this._parent&&t>this._parent.height&&(t=Math.max(this.minHeight,this._parent.height)),t},constrain:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=!0),t=this.getNewWidth(t),e=this.getNewHeight(e);var s=this.snapTo,r=0===e?1:t/e;return i&&this.aspectRatio>r||!i&&this.aspectRatio0&&(t=(e=n(e,s.y))*this.aspectRatio)):(i&&this.aspectRatior)&&(t=(e=n(e,s.y))*this.aspectRatio,s.x>0&&(e=(t=n(t,s.x))*(1/this.aspectRatio))),this._width=t,this._height=e,this},fitTo:function(t,e){return this.constrain(t,e,!0)},envelop:function(t,e){return this.constrain(t,e,!1)},setWidth:function(t){return this.setSize(t,this._height)},setHeight:function(t){return this.setSize(this._width,t)},toString:function(){return"[{ Size (width="+this._width+" height="+this._height+" aspectRatio="+this.aspectRatio+" aspectMode="+this.aspectMode+") }]"},setCSS:function(t){t&&t.style&&(t.style.width=this._width+"px",t.style.height=this._height+"px")},copy:function(t){return t.setAspectMode(this.aspectMode),t.aspectRatio=this.aspectRatio,t.setSize(this.width,this.height)},destroy:function(){this._parent=null,this.snapTo=null},width:{get:function(){return this._width},set:function(t){this.setSize(t,this._height)}},height:{get:function(){return this._height},set:function(t){this.setSize(this._width,t)}}});o.NONE=0,o.WIDTH_CONTROLS_HEIGHT=1,o.HEIGHT_CONTROLS_WIDTH=2,o.FIT=3,o.ENVELOP=4,t.exports=o},15238(t){t.exports="add"},56187(t){t.exports="remove"},82348(t,e,i){t.exports={PROCESS_QUEUE_ADD:i(15238),PROCESS_QUEUE_REMOVE:i(56187)}},41392(t,e,i){t.exports={Events:i(82348),List:i(73162),Map:i(90330),ProcessQueue:i(25774),RTree:i(59542),Size:i(86555)}},57382(t,e,i){var s=i(83419),r=i(45319),n=i(40987),a=i(8054),o=i(50030),h=i(79237),l=new s({Extends:h,initialize:function(t,e,i,s,r){h.call(this,t,e,i,s,r),this.add("__BASE",0,0,0,s,r),this._source=this.frames.__BASE.source,this.canvas=this._source.image,this.context=this.canvas.getContext("2d",{willReadFrequently:!0}),this.width=s,this.height=r,this.imageData=this.context.getImageData(0,0,s,r),this.data=null,this.imageData&&(this.data=this.imageData.data),this.pixels=null,this.buffer,this.data&&(this.imageData.data.buffer?(this.buffer=this.imageData.data.buffer,this.pixels=new Uint32Array(this.buffer)):window.ArrayBuffer?(this.buffer=new ArrayBuffer(this.imageData.data.length),this.pixels=new Uint32Array(this.buffer)):this.pixels=this.imageData.data)},update:function(){return this.imageData=this.context.getImageData(0,0,this.width,this.height),this.data=this.imageData.data,this.imageData.data.buffer?(this.buffer=this.imageData.data.buffer,this.pixels=new Uint32Array(this.buffer)):window.ArrayBuffer?(this.buffer=new ArrayBuffer(this.imageData.data.length),this.pixels=new Uint32Array(this.buffer)):this.pixels=this.imageData.data,this.manager.game.config.renderType===a.WEBGL&&this.refresh(),this},draw:function(t,e,i,s){return void 0===s&&(s=!0),this.context.drawImage(i,t,e),s&&this.update(),this},drawFrame:function(t,e,i,s,r){void 0===i&&(i=0),void 0===s&&(s=0),void 0===r&&(r=!0);var n=this.manager.getFrame(t,e);if(n){var a=n.canvasData,o=n.cutWidth,h=n.cutHeight,l=n.source.resolution;this.context.drawImage(n.source.image,a.x,a.y,o,h,i,s,o/l,h/l),r&&this.update()}return this},setPixel:function(t,e,i,s,r,n){if(void 0===n&&(n=255),t=Math.abs(Math.floor(t)),e=Math.abs(Math.floor(e)),this.getIndex(t,e)>-1){var a=this.context.getImageData(t,e,1,1);a.data[0]=i,a.data[1]=s,a.data[2]=r,a.data[3]=n,this.context.putImageData(a,t,e)}return this},putData:function(t,e,i,s,r,n,a){return void 0===s&&(s=0),void 0===r&&(r=0),void 0===n&&(n=t.width),void 0===a&&(a=t.height),this.context.putImageData(t,e,i,s,r,n,a),this},getData:function(t,e,i,s){return t=r(Math.floor(t),0,this.width-1),e=r(Math.floor(e),0,this.height-1),i=r(i,1,this.width-t),s=r(s,1,this.height-e),this.context.getImageData(t,e,i,s)},getPixel:function(t,e,i){i||(i=new n);var s=this.getIndex(t,e);if(s>-1){var r=this.data,a=r[s+0],o=r[s+1],h=r[s+2],l=r[s+3];i.setTo(a,o,h,l)}return i},getPixels:function(t,e,i,s){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===s&&(s=i),t=Math.abs(Math.round(t)),e=Math.abs(Math.round(e));for(var a=r(t,0,this.width),o=r(t+i,0,this.width),h=r(e,0,this.height),l=r(e+s,0,this.height),u=new n,d=[],c=h;ca.width&&(t=a.width-s.cutX),s.cutY+e>a.height&&(e=a.height-s.cutY),s.setSize(t,e,s.cutX,s.cutY)}return this},render:function(){if(0!==this.commandBuffer.length)return this.camera.preRender(),this.renderer.type===o.WEBGL&&this._renderWebGL(),this.renderer.type===o.CANVAS&&this._renderCanvas(),this},_renderWebGL:function(){this.renderer.renderNodes.getNode("DynamicTextureHandler").run(this)},_renderCanvas:function(){var t,e,i,r,n,a,o,h,l,u,d,c,p,g,m,v=this.camera,y=this.context,x=this.renderer,T=this.manager;x.setContext(y);for(var w=this.commandBuffer,b=w.length,S=!1,C=!1,E=0;E>24&255)/255;var _=A>>16&255,M=A>>8&255,R=255&A;y.save(),y.globalCompositeOperation="source-over",y.fillStyle="rgba("+_+","+M+","+R+","+t+")",y.fillRect(g,m,p,n),y.restore();break;case f.STAMP:a=w[++E],r=w[++E],g=w[++E],m=w[++E],t=w[++E],c=w[++E],l=w[++E],u=w[++E],d=w[++E],o=w[++E],h=w[++E],e=w[++E],C&&(e=s.ERASE);var P=T.resetStamp(t,c);P.setPosition(g,m).setRotation(l).setScale(u,d).setTexture(a,r).setOrigin(o,h).setBlendMode(e),P.renderCanvas(x,P,v,null);break;case f.REPEAT:a=w[++E],r=w[++E],g=w[++E],m=w[++E],t=w[++E],c=w[++E],l=w[++E],u=w[++E],d=w[++E],o=w[++E],h=w[++E],e=w[++E],p=w[++E],n=w[++E];var O=w[++E],L=w[++E],D=w[++E],F=w[++E],I=w[++E];C&&(e=s.ERASE);var N=T.resetTileSprite(t,c);N.setPosition(g,m).setRotation(l).setScale(u,d).setTexture(a,r).setSize(p,n).setOrigin(o,h).setBlendMode(e).setTilePosition(O,L).setTileRotation(D).setTileScale(F,I),N.renderCanvas(x,N,v,null);break;case f.DRAW:var B=w[++E];if(g=w[++E],m=w[++E],void 0!==g){var k=B.x;B.x=g}if(void 0!==m){var U=B.y;B.y=m}C&&(i=B.blendMode,B.blendMode=s.ERASE),B.renderCanvas(x,B,v,null),void 0!==g&&(B.x=k),void 0!==m&&(B.y=U),C&&(B.blendMode=i);break;case f.SET_ERASE:C=!!w[++E];break;case f.PRESERVE:S=w[++E];break;case f.CALLBACK:(0,w[++E])();break;case f.CAPTURE:B=w[++E];var z=w[++E],Y=this.startCapture(B,z);B.renderCanvas(x,B,z.camera||v,Y.transform),this.finishCapture(B,Y)}}S||(w.length=0),x.setContext()},fill:function(t,e,i,s,r,n){void 0===e&&(e=1),void 0===i&&(i=0),void 0===s&&(s=0),void 0===r&&(r=this.width),void 0===n&&(n=this.height);var a=t>>16&255,o=t>>8&255,h=255&t,l=c.getTintFromFloats(a/255,o/255,h/255,e);return this.commandBuffer.push(f.FILL,l,i,s,r,n),this},clear:function(t,e,i,s){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===s&&(s=this.height),this.commandBuffer.push(f.CLEAR,t,e,i,s),this},stamp:function(t,e,i,s,r){void 0===i&&(i=0),void 0===s&&(s=0);var n=u(r,"alpha",1),a=u(r,"tint",16777215),o=u(r,"angle",0),h=u(r,"rotation",0),l=u(r,"scale",1),d=u(r,"scaleX",l),c=u(r,"scaleY",l),p=u(r,"originX",.5),g=u(r,"originY",.5),m=u(r,"blendMode",0);return 0!==o&&(h=o*Math.PI/180),this.commandBuffer.push(f.STAMP,t,e,i,s,n,a,h,d,c,p,g,m),this},erase:function(t,e,i,s,r){var n=this.commandBuffer,a=n.length;return n[a-2]!==f.SET_ERASE||n[a-1]?n.push(f.SET_ERASE,!0):n.length-=2,this.draw(t,e,i,s,r),n.push(f.SET_ERASE,!1),this},draw:function(t,e,i,s,r){Array.isArray(t)||(t=[t]);for(var n=t.length,a=0;aT||x.y>w)){var b=Math.max(x.x,e),S=Math.max(x.y,i),C=Math.min(x.r,T)-b,E=Math.min(x.b,w)-S;m=C,v=E,p=a?h+(u-(b-x.x)-C):h+(b-x.x),g=o?l+(d-(S-x.y)-E):l+(S-x.y),e=b,i=S,s=C,n=E}else p=0,g=0,m=0,v=0}else a&&(p=h+(u-e-s)),o&&(g=l+(d-i-n));var A=this.source.width,_=this.source.height;return t.u0=Math.max(0,p/A),t.v0=1-Math.max(0,g/_),t.u1=Math.min(1,(p+m)/A),t.v1=1-Math.min(1,(g+v)/_),t.x=e,t.y=i,t.cx=p,t.cy=g,t.cw=m,t.ch=v,t.width=s,t.height=n,t.flipX=a,t.flipY=o,t},updateCropUVs:function(t,e,i){return this.setCropUVs(t,t.x,t.y,t.width,t.height,e,i)},setUVs:function(t,e,i,s,r,n){var a=this.data.drawImage;return a.width=t,a.height=e,this.u0=i,this.v0=s,this.u1=r,this.v1=n,this},updateUVs:function(){var t=this.cutX,e=this.cutY,i=this.cutWidth,s=this.cutHeight,r=this.data.drawImage;r.width=i,r.height=s;var n=this.source.width,a=this.source.height;return this.u0=t/n,this.v0=1-e/a,this.u1=(t+i)/n,this.v1=1-(e+s)/a,this},updateUVsInverted:function(){var t=this.source.width,e=this.source.height;return this.u0=(this.cutX+this.cutHeight)/t,this.v0=1-this.cutY/e,this.u1=this.cutX/t,this.v1=1-(this.cutY+this.cutWidth)/e,this},clone:function(){var t=new a(this.texture,this.name,this.sourceIndex);return t.cutX=this.cutX,t.cutY=this.cutY,t.cutWidth=this.cutWidth,t.cutHeight=this.cutHeight,t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t.halfWidth=this.halfWidth,t.halfHeight=this.halfHeight,t.centerX=this.centerX,t.centerY=this.centerY,t.rotated=this.rotated,t.data=n(!0,t.data,this.data),t.updateUVs(),t},destroy:function(){this.texture=null,this.source=null,this.customData=null,this.data=null},glTexture:{get:function(){return this.source.glTexture}},realWidth:{get:function(){return this.data.sourceSize.w}},realHeight:{get:function(){return this.data.sourceSize.h}},radius:{get:function(){return this.data.radius}},trimmed:{get:function(){return this.data.trim}},scale9:{get:function(){return this.data.scale9}},is3Slice:{get:function(){return this.data.is3Slice}},canvasData:{get:function(){return this.data.drawImage}}});t.exports=a},79237(t,e,i){var s=i(83419),r=i(4327),n=i(11876),a='Texture "%s" has no frame "%s"',o=new s({initialize:function(t,e,i,s,r){Array.isArray(i)||(i=[i]),this.manager=t,this.key=e,this.source=[],this.dataSource=[],this.frames={},this.customData={},this.firstFrame="__BASE",this.frameTotal=0,this.smoothPixelArt=null;for(var a=0;an&&(n=h.cutX+h.cutWidth),h.cutY+h.cutHeight>a&&(a=h.cutY+h.cutHeight)}return{x:s,y:r,width:n-s,height:a-r}},getFrameNames:function(t){void 0===t&&(t=!1);var e=Object.keys(this.frames);if(!t){var i=e.indexOf("__BASE");-1!==i&&e.splice(i,1)}return e},getSourceImage:function(t){null!=t&&1!==this.frameTotal||(t="__BASE");var e=this.frames[t];return e?e.source.image:(console.warn(a,this.key,t),this.frames.__BASE.source.image)},getDataSourceImage:function(t){null!=t&&1!==this.frameTotal||(t="__BASE");var e,i=this.frames[t];return i?e=i.sourceIndex:(console.warn(a,this.key,t),e=this.frames.__BASE.sourceIndex),this.dataSource[e].image},setSource:function(t,e,i,s,r){void 0===e&&(e=0),void 0===i&&(i=!1),Array.isArray(t)||(t=[t]);for(var a=0;a0&&o.height>0&&l.drawImage(a.source.image,o.x,o.y,o.width,o.height,0,0,o.width,o.height),n=h.toDataURL(i,r),s.remove(h)}return n},addImage:function(t,e,i){var s=null;return this.checkKey(t)&&(s=this.create(t,e),v.Image(s,0),i&&s.setDataSource(i),this.emit(u.ADD,t,s),this.emit(u.ADD_KEY+t,s)),s},addGLTexture:function(t,e){var i=null;if(this.checkKey(t)){var s=e.width,r=e.height;(i=this.create(t,e,s,r)).add("__BASE",0,0,0,s,r),this.emit(u.ADD,t,i),this.emit(u.ADD_KEY+t,i)}return i},addCompressedTexture:function(t,e,i){var s=null;if(this.checkKey(t)){if((s=this.create(t,e)).add("__BASE",0,0,0,e.width,e.height),i){var r=function(t,e,i){Array.isArray(i.textures)||Array.isArray(i.frames)?v.JSONArray(t,e,i):v.JSONHash(t,e,i)};if(Array.isArray(i))for(var n=0;n=h.x&&t=h.y&&e=o.x&&t=o.y&&e>1),g=Math.max(1,g>>1),f+=m}return{mipmaps:c,width:h,height:l,internalFormat:o,compressed:!0,generateMipmap:!1}}console.warn("KTXParser - Only compressed formats supported")}},41942(t){t.exports=function(t,e){if(e&&e.frames&&e.pages){var i=t.source[0];t.add("__BASE",0,0,0,i.width,i.height);var s=e.frames;for(var r in s)if(s.hasOwnProperty(r)){var n=s[r],a=0|n.page;if(a>=t.source.length)console.warn('PCT atlas frame "'+r+'" references missing page '+a);else{var o=t.add(n.key||r,a,n.x,n.y,n.w,n.h);o?(n.trimmed&&o.setTrim(n.sourceW,n.sourceH,n.trimX,n.trimY,n.w,n.h),n.rotated&&(o.rotated=!0,o.updateUVsInverted())):console.warn("Invalid PCT atlas, frame already exists: "+r)}}return t.customData.pct={pages:e.pages,folders:e.folders},t}console.warn("Invalid PCT atlas data given")}},39620(t){var e={1:".png",2:".webp",3:".jpg",4:".jpeg",5:".gif"},i=function(t,e){for(var i=String(t);i.length0&&function(t){if(0===t.length)return!1;for(var e=0;e57)return!1}return!0}(r.substring(0,a))&&(n=i[parseInt(r.substring(0,a),10)],r=r.substring(a+1));var o=/~([1-5])$/.exec(r);if(o){var h=e[parseInt(o[1],10)];r=r.substring(0,r.length-2)+h}else s&&(r+=s);return n?n+"/"+r:r},r=function(t,r){var n="",a=/~([1-5])$/.exec(t);a&&(n=e[parseInt(a[1],10)],t=t.substring(0,t.length-2));for(var o=[],h=t.split(","),l=0;l=0)for(var c=u.substring(0,d),f=u.substring(d+1),p=f.indexOf("-"),g=f.substring(0,p),m=f.substring(p+1),v=parseInt(g,10),y=parseInt(m,10),x=g.length>1&&"0"===g.charAt(0)?g.length:0,T=v;T<=y;T++){var w=x>0?i(T,x):String(T);o.push(s(c+w,r,n))}else o.push(s(u,r,n))}return o};t.exports=function(t){if("string"!=typeof t||0===t.length)return console.warn("Invalid PCT file: empty or not a string"),null;var e=t.split("\n"),i=e[0];if(13===i.charCodeAt(i.length-1)&&(i=i.substring(0,i.length-1)),!i||0!==i.indexOf("PCT:"))return console.warn("Not a PCT file: missing PCT: header"),null;var n=i.substring(4),a=n.split("."),o=parseInt(a[0],10);if(isNaN(o)||o>1)return console.warn("Unsupported PCT version: "+n),null;for(var h=[],l=[],u={},d=0,c=null,f=1;f1};if(x.trimmed){var T=v[1].split(",");x.sourceW=parseInt(T[0],10),x.sourceH=parseInt(T[1],10),x.trimX=parseInt(T[2],10),x.trimY=parseInt(T[3],10)}c=x}else if("A:"===g){var w=p.indexOf("=",2);if(-1===w)continue;var b=s(p.substring(2,w),l,""),S=r(p.substring(w+1),l),C=u[b];if(C)for(var E=0;E>1),g=Math.max(1,g>>1),f+=v}return{mipmaps:c,width:h,height:l,internalFormat:r,compressed:!0,generateMipmap:!1}}},75549(t,e,i){var s=i(95540);t.exports=function(t,e,i,r,n,a,o){var h=s(o,"frameWidth",null),l=s(o,"frameHeight",h);if(null===h)throw new Error("TextureManager.SpriteSheet: Invalid frameWidth given.");var u=t.source[e];t.add("__BASE",e,0,0,u.width,u.height);var d=s(o,"startFrame",0),c=s(o,"endFrame",-1),f=s(o,"margin",0),p=s(o,"spacing",0),g=Math.floor((n-f+p)/(h+p))*Math.floor((a-f+p)/(l+p));0===g&&console.warn("SpriteSheet frame dimensions will result in zero frames for texture:",t.key),(d>g||d<-g)&&(d=0),d<0&&(d=g+d),(-1===c||c>g||cn&&(y=b-n),S>a&&(x=S-a),w>=d&&w<=c&&(t.add(T,e,i+m,r+v,h-y,l-x),T++),(m+=h+p)+h>n&&(m=f,v+=l+p)}return t}},47534(t,e,i){var s=i(95540);t.exports=function(t,e,i){var r=s(i,"frameWidth",null),n=s(i,"frameHeight",r);if(!r)throw new Error("TextureManager.SpriteSheetFromAtlas: Invalid frameWidth given.");var a=t.source[0];t.add("__BASE",0,0,0,a.width,a.height);var o,h=s(i,"startFrame",0),l=s(i,"endFrame",-1),u=s(i,"margin",0),d=s(i,"spacing",0),c=e.cutX,f=e.cutY,p=e.cutWidth,g=e.cutHeight,m=e.realWidth,v=e.realHeight,y=Math.floor((m-u+d)/(r+d)),x=Math.floor((v-u+d)/(n+d)),T=y*x,w=e.x,b=r-w,S=r-(m-p-w),C=e.y,E=n-C,A=n-(v-g-C);(h>T||h<-T)&&(h=0),h<0&&(h=T+h),-1!==l&&(T=h+(l+1));for(var _=u,M=u,R=0,P=0;P=this.firstgid&&tthis.right||e>this.bottom)},copy:function(t){return this.index=t.index,this.alpha=t.alpha,this.properties=a(t.properties),this.visible=t.visible,this.setFlip(t.flipX,t.flipY),this.tint=t.tint,this.rotation=t.rotation,this.collideUp=t.collideUp,this.collideDown=t.collideDown,this.collideLeft=t.collideLeft,this.collideRight=t.collideRight,this.collisionCallback=t.collisionCallback,this.collisionCallbackContext=t.collisionCallbackContext,this},getCollisionGroup:function(){return this.tileset?this.tileset.getTileCollisionGroup(this.index):null},getTileData:function(){return this.tileset?this.tileset.getTileData(this.index):null},getLeft:function(t){var e=this.tilemapLayer;return e?e.tileToWorldXY(this.x,this.y,void 0,t).x:this.x*this.baseWidth},getRight:function(t){var e=this.tilemapLayer;return e?this.getLeft(t)+this.width*e.scaleX:this.getLeft(t)+this.width},getTop:function(t){var e=this.tilemapLayer;return e?e.tileToWorldXY(this.x,this.y,void 0,t).y:this.y*this.baseWidth-(this.height-this.baseHeight)},getBottom:function(t){var e=this.tilemapLayer;return e?this.getTop(t)+this.height*e.scaleY:this.getTop(t)+this.height},getBounds:function(t,e){return void 0===e&&(e=new o),e.x=this.getLeft(t),e.y=this.getTop(t),e.width=this.getRight(t)-e.x,e.height=this.getBottom(t)-e.y,e},getCenterX:function(t){return(this.getLeft(t)+this.getRight(t))/2},getCenterY:function(t){return(this.getTop(t)+this.getBottom(t))/2},intersects:function(t,e,i,s){return!(i<=this.pixelX||s<=this.pixelY||t>=this.right||e>=this.bottom)},isInteresting:function(t,e){return t&&e?this.canCollide||this.hasInterestingFace:t?this.collides:!!e&&this.hasInterestingFace},resetCollision:function(t){(void 0===t&&(t=!0),this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,t)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},resetFaces:function(){return this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,this},setCollision:function(t,e,i,s,r){(void 0===e&&(e=t),void 0===i&&(i=t),void 0===s&&(s=t),void 0===r&&(r=!0),this.collideLeft=t,this.collideRight=e,this.collideUp=i,this.collideDown=s,this.faceLeft=t,this.faceRight=e,this.faceTop=i,this.faceBottom=s,r)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},setCollisionCallback:function(t,e){return null===t?(this.collisionCallback=void 0,this.collisionCallbackContext=void 0):(this.collisionCallback=t,this.collisionCallbackContext=e),this},setSize:function(t,e,i,s){return void 0!==t&&(this.width=t),void 0!==e&&(this.height=e),void 0!==i&&(this.baseWidth=i),void 0!==s&&(this.baseHeight=s),this.updatePixelXY(),this},updatePixelXY:function(){var t=this.layer.orientation;if(t===n.ORTHOGONAL)this.pixelX=this.x*this.baseWidth,this.pixelY=this.y*this.baseHeight;else if(t===n.ISOMETRIC)this.pixelX=(this.x-this.y)*this.baseWidth*.5,this.pixelY=(this.x+this.y)*this.baseHeight*.5;else if(t===n.STAGGERED)this.pixelX=this.x*this.baseWidth+this.y%2*(this.baseWidth/2),this.pixelY=this.y*(this.baseHeight/2);else if(t===n.HEXAGONAL){var e,i,s=this.layer.staggerAxis,r=this.layer.staggerIndex,a=this.layer.hexSideLength;"y"===s?(i=(this.baseHeight-a)/2+a,this.pixelX="odd"===r?this.x*this.baseWidth+this.y%2*(this.baseWidth/2):this.x*this.baseWidth-this.y%2*(this.baseWidth/2),this.pixelY=this.y*i):"x"===s&&(e=(this.baseWidth-a)/2+a,this.pixelX=this.x*e,this.pixelY="odd"===r?this.y*this.baseHeight+this.x%2*(this.baseHeight/2):this.y*this.baseHeight-this.x%2*(this.baseHeight/2))}return this.right=this.pixelX+this.baseWidth,this.bottom=this.pixelY+this.baseHeight,this},destroy:function(){this.collisionCallback=void 0,this.collisionCallbackContext=void 0,this.properties=void 0},canCollide:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown||void 0!==this.collisionCallback}},collides:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown}},hasInterestingFace:{get:function(){return this.faceTop||this.faceBottom||this.faceLeft||this.faceRight}},tileset:{get:function(){var t=this.layer.tilemapLayer;if(t){var e=t.gidMap[this.index];if(e)return e}return null}},tilemapLayer:{get:function(){return this.layer.tilemapLayer}},tilemap:{get:function(){var t=this.tilemapLayer;return t?t.tilemap:null}}});t.exports=l},49075(t,e,i){var s=i(84101),r=i(83419),n=i(39506),a=i(80341),o=i(95540),h=i(14977),l=i(27462),u=i(91907),d=i(36305),c=i(19133),f=i(68287),p=i(23029),g=i(81086),m=i(44731),v=i(53180),y=i(20442),x=i(33629),T=new r({initialize:function(t,e){this.scene=t,this.tileWidth=e.tileWidth,this.tileHeight=e.tileHeight,this.width=e.width,this.height=e.height,this.orientation=e.orientation,this.renderOrder=e.renderOrder,this.format=e.format,this.version=e.version,this.properties=e.properties,this.widthInPixels=e.widthInPixels,this.heightInPixels=e.heightInPixels,this.imageCollections=e.imageCollections,this.images=e.images,this.layers=e.layers,this.tiles=e.tiles,this.tilesets=e.tilesets,this.objects=e.objects,this.currentLayerIndex=0,this.hexSideLength=e.hexSideLength;var i=this.orientation;this._convert={WorldToTileXY:g.GetWorldToTileXYFunction(i),WorldToTileX:g.GetWorldToTileXFunction(i),WorldToTileY:g.GetWorldToTileYFunction(i),TileToWorldXY:g.GetTileToWorldXYFunction(i),TileToWorldX:g.GetTileToWorldXFunction(i),TileToWorldY:g.GetTileToWorldYFunction(i),GetTileCorners:g.GetTileCornersFunction(i)}},setRenderOrder:function(t){var e=["right-down","left-down","right-up","left-up"];return"number"==typeof t&&(t=e[t]),e.indexOf(t)>-1&&(this.renderOrder=t),this},addTilesetImage:function(t,e,i,r,n,o,h,l){if(void 0===t)return null;null==e&&(e=t);var u=this.scene.sys.textures;if(!u.exists(e))return console.warn('Texture key "%s" not found',e),null;var d=u.get(e),c=this.getTilesetIndex(t);if(null===c&&this.format===a.TILED_JSON)return console.warn('Tilemap has no tileset "%s". Its tilesets are %o',t,this.tilesets),null;var f=this.tilesets[c];return f?((i||r)&&f.setTileSize(i,r),(n||o)&&f.setSpacing(n,o),f.setImage(d),f):(void 0===i&&(i=this.tileWidth),void 0===r&&(r=this.tileHeight),void 0===n&&(n=0),void 0===o&&(o=0),void 0===h&&(h=0),void 0===l&&(l={x:0,y:0}),(f=new x(t,h,i,r,n,o,void 0,void 0,l)).setImage(d),this.tilesets.push(f),this.tiles=s(this),f)},copy:function(t,e,i,s,r,n,a,o){return null!==(o=this.getLayer(o))?(g.Copy(t,e,i,s,r,n,a,o),this):null},createBlankLayer:function(t,e,i,s,r,n,a,o){if(void 0===i&&(i=0),void 0===s&&(s=0),void 0===r&&(r=this.width),void 0===n&&(n=this.height),void 0===a&&(a=this.tileWidth),void 0===o&&(o=this.tileHeight),null!==this.getLayerIndex(t))return console.warn("Invalid Tilemap Layer ID: "+t),null;for(var l,u=new h({name:t,tileWidth:a,tileHeight:o,width:r,height:n,orientation:this.orientation,hexSideLength:this.hexSideLength}),d=0;d1&&console.warn("TilemapGPULayer can only use one tileset. Using the first item given."),e=e[0]),a=new v(this.scene,this,n,e,i,s)):(a=new y(this.scene,this,n,e,i,s)).setRenderOrder(this.renderOrder),this.scene.sys.displayList.add(a),a)},createFromObjects:function(t,e,i){void 0===i&&(i=!0);var s=[],r=this.getObjectLayer(t);if(!r)return console.warn("createFromObjects: Invalid objectLayerName given: "+t),s;var a=new l(i?this.tilesets:void 0);Array.isArray(e)||(e=[e]);var h=r.objects;e.sortByY&&h.sort(function(t,e){return t.y>e.y?1:-1});for(var c=0;c-1&&this.putTileAt(e,n.x,n.y,i,n.tilemapLayer)}return s},removeTileAt:function(t,e,i,s,r){return void 0===i&&(i=!0),void 0===s&&(s=!0),null===(r=this.getLayer(r))?null:g.RemoveTileAt(t,e,i,s,r)},removeTileAtWorldXY:function(t,e,i,s,r,n){return void 0===i&&(i=!0),void 0===s&&(s=!0),null===(n=this.getLayer(n))?null:g.RemoveTileAtWorldXY(t,e,i,s,r,n)},renderDebug:function(t,e,i){return null===(i=this.getLayer(i))?null:(this.orientation===u.ORTHOGONAL&&g.RenderDebug(t,e,i),this)},renderDebugFull:function(t,e){for(var i=this.layers,s=0;s=0&&t<4&&(this._renderOrder=t),this},cull:function(t){return this.cullCallback(this.layer,t,this.culledTiles,this._renderOrder)},setSkipCull:function(t){return void 0===t&&(t=!0),this.skipCull=t,this},setCullPadding:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=1),this.cullPaddingX=t,this.cullPaddingY=e,this},setTint:function(t,e,i,s,r,n){void 0===t&&(t=16777215);return this.forEachTile(function(e){e.tint=t},this,e,i,s,r,n)},setTintMode:function(t,e,i,s,r,n){void 0===t&&(t=h.MULTIPLY);return this.forEachTile(function(e){e.tintMode=t},this,e,i,s,r,n)},destroy:function(t){this.culledTiles.length=0,this.cullCallback=null,o.prototype.destroy.call(this,t)}});t.exports=l},44731(t,e,i){var s=i(83419),r=i(78389),n=i(31401),a=i(95643),o=i(81086),h=i(26099),l=new s({Extends:a,Mixins:[n.Alpha,n.BlendMode,n.ComputedSize,n.Depth,n.ElapseTimer,n.Flip,n.GetBounds,n.Lighting,n.Mask,n.Origin,n.RenderNodes,n.Transform,n.Visible,n.ScrollFactor,r],initialize:function(t,e,i,s,r,n){a.call(this,e,t),this.isTilemap=!0,this.tilemap=i,this.layerIndex=s,this.layer=i.layers[s],this.layer.tilemapLayer=this,this.gidMap=[],this.tempVec=new h,this.collisionCategory=1,this.collisionMask=1,this.setAlpha(this.layer.alpha),this.setPosition(r,n),this.setOrigin(0,0),this.setSize(i.tileWidth*this.layer.width,i.tileHeight*this.layer.height)},addedToScene:function(){this.scene.sys.updateList.add(this)},removedFromScene:function(){this.scene.sys.updateList.remove(this)},preUpdate:function(t,e){this.updateTimer(t,e)},calculateFacesAt:function(t,e){return o.CalculateFacesAt(t,e,this.layer),this},calculateFacesWithin:function(t,e,i,s){return o.CalculateFacesWithin(t,e,i,s,this.layer),this},createFromTiles:function(t,e,i,s,r){return o.CreateFromTiles(t,e,i,s,r,this.layer)},copy:function(t,e,i,s,r,n,a){return o.Copy(t,e,i,s,r,n,a,this.layer),this},fill:function(t,e,i,s,r,n){return o.Fill(t,e,i,s,r,n,this.layer),this},filterTiles:function(t,e,i,s,r,n,a){return o.FilterTiles(t,e,i,s,r,n,a,this.layer)},findByIndex:function(t,e,i){return o.FindByIndex(t,e,i,this.layer)},findTile:function(t,e,i,s,r,n,a){return o.FindTile(t,e,i,s,r,n,a,this.layer)},forEachTile:function(t,e,i,s,r,n,a){return o.ForEachTile(t,e,i,s,r,n,a,this.layer),this},getTileAt:function(t,e,i){return o.GetTileAt(t,e,i,this.layer)},getTileAtWorldXY:function(t,e,i,s){return o.GetTileAtWorldXY(t,e,i,s,this.layer)},getIsoTileAtWorldXY:function(t,e,i,s,r){void 0===i&&(i=!0);var n=this.tempVec;return o.IsometricWorldToTileXY(t,e,!0,n,r,this.layer,i),this.getTileAt(n.x,n.y,s)},getTilesWithin:function(t,e,i,s,r){return o.GetTilesWithin(t,e,i,s,r,this.layer)},getTilesWithinShape:function(t,e,i){return o.GetTilesWithinShape(t,e,i,this.layer)},getTilesWithinWorldXY:function(t,e,i,s,r,n){return o.GetTilesWithinWorldXY(t,e,i,s,r,n,this.layer)},hasTileAt:function(t,e){return o.HasTileAt(t,e,this.layer)},hasTileAtWorldXY:function(t,e,i){return o.HasTileAtWorldXY(t,e,i,this.layer)},putTileAt:function(t,e,i,s){return o.PutTileAt(t,e,i,s,this.layer)},putTileAtWorldXY:function(t,e,i,s,r){return o.PutTileAtWorldXY(t,e,i,s,r,this.layer)},putTilesAt:function(t,e,i,s){return o.PutTilesAt(t,e,i,s,this.layer),this},randomize:function(t,e,i,s,r){return o.Randomize(t,e,i,s,r,this.layer),this},removeTileAt:function(t,e,i,s){return o.RemoveTileAt(t,e,i,s,this.layer)},removeTileAtWorldXY:function(t,e,i,s,r){return o.RemoveTileAtWorldXY(t,e,i,s,r,this.layer)},renderDebug:function(t,e){return o.RenderDebug(t,e,this.layer),this},replaceByIndex:function(t,e,i,s,r,n){return o.ReplaceByIndex(t,e,i,s,r,n,this.layer),this},setCollision:function(t,e,i,s){return o.SetCollision(t,e,i,this.layer,s),this},setCollisionBetween:function(t,e,i,s){return o.SetCollisionBetween(t,e,i,s,this.layer),this},setCollisionByProperty:function(t,e,i){return o.SetCollisionByProperty(t,e,i,this.layer),this},setCollisionByExclusion:function(t,e,i){return o.SetCollisionByExclusion(t,e,i,this.layer),this},setCollisionFromCollisionGroup:function(t,e){return o.SetCollisionFromCollisionGroup(t,e,this.layer),this},setTileIndexCallback:function(t,e,i){return o.SetTileIndexCallback(t,e,i,this.layer),this},setTileLocationCallback:function(t,e,i,s,r,n){return o.SetTileLocationCallback(t,e,i,s,r,n,this.layer),this},shuffle:function(t,e,i,s){return o.Shuffle(t,e,i,s,this.layer),this},swapByIndex:function(t,e,i,s,r,n){return o.SwapByIndex(t,e,i,s,r,n,this.layer),this},tileToWorldX:function(t,e){return this.tilemap.tileToWorldX(t,e,this)},tileToWorldY:function(t,e){return this.tilemap.tileToWorldY(t,e,this)},tileToWorldXY:function(t,e,i,s){return this.tilemap.tileToWorldXY(t,e,i,s,this)},getTileCorners:function(t,e,i){return this.tilemap.getTileCorners(t,e,i,this)},weightedRandomize:function(t,e,i,s,r){return o.WeightedRandomize(e,i,s,r,t,this.layer),this},worldToTileX:function(t,e,i){return this.tilemap.worldToTileX(t,e,i,this)},worldToTileY:function(t,e,i){return this.tilemap.worldToTileY(t,e,i,this)},worldToTileXY:function(t,e,i,s,r){return this.tilemap.worldToTileXY(t,e,i,s,r,this)},destroy:function(t){void 0===t&&(t=!0),this.tilemap&&(this.layer.tilemapLayer===this&&(this.layer.tilemapLayer=void 0),t&&this.tilemap.removeLayer(this),this.tilemap=void 0,this.layer=void 0,this.gidMap=[],this.tileset=[],a.prototype.destroy.call(this))}});t.exports=l},16153(t,e,i){var s=i(61340),r=new s,n=new s,a=new s;t.exports=function(t,e,i,s){var o=e.cull(i),h=o.length,l=i.alpha*e.alpha;if(!(0===h||l<=0)){n.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var u=t.currentContext,d=e.gidMap;u.save(),r.copyWithScrollFactorFrom(i.matrixCombined,i.scrollX,i.scrollY,e.scrollFactorX,e.scrollFactorY),s&&r.multiply(s),r.multiply(n,a),a.setToContext(u),(!t.antialias||e.scaleX>1||e.scaleY>1)&&(u.imageSmoothingEnabled=!1);for(var c=0;c=this.firstgid&&t>>1]).startTime)<=e&&h+r.duration>e)return r.tileid+this.firstgid;hi.width||e.height>i.height?this.updateTileData(e.width,e.height):this.updateTileData(i.width,i.height,i.x,i.y),this},setTileSize:function(t,e){return void 0!==t&&(this.tileWidth=t),void 0!==e&&(this.tileHeight=e),this.image&&this.updateTileData(this.image.source[0].width,this.image.source[0].height),this},setSpacing:function(t,e){return void 0!==t&&(this.tileMargin=t),void 0!==e&&(this.tileSpacing=e),this.image&&this.updateTileData(this.image.source[0].width,this.image.source[0].height),this},updateTileData:function(t,e,i,s){void 0===i&&(i=0),void 0===s&&(s=0);var r=(e-2*this.tileMargin+this.tileSpacing)/(this.tileHeight+this.tileSpacing),n=(t-2*this.tileMargin+this.tileSpacing)/(this.tileWidth+this.tileSpacing);r%1==0&&n%1==0||console.warn("Image tile area not tile size multiple in: "+this.name),r=Math.floor(r),n=Math.floor(n),this.rows=r,this.columns=n,this.total=r*n,this.texCoordinates.length=0;for(var a=this.tileMargin+i,o=this.tileMargin+s,h=0;h8388608)throw new Error("Tileset._animationDataTexture: too many animations - total number of animations plus animation frames is max 8388608, got "+f);var p=2*f,g=Math.min(p,4096),m=Math.ceil(p/4096),v=new Uint32Array(g*m),y=0,x=s.length;for(o=0;or.worldView.x+n.scaleX*i.tileWidth*(-a-.5)&&h.xr.worldView.y+n.scaleY*i.tileHeight*(-o-1)&&h.y=0;n--)for(r=s.width-1;r>=0;r--)if((a=s.data[n][r])&&a.index===t){if(o===e)return a;o+=1}}else for(n=0;na.width&&(i=Math.max(a.width-t,0)),e+r>a.height&&(r=Math.max(a.height-e,0));for(var u=[],d=e;d-1}return!1}},24152(t,e,i){var s=i(45091),r=new(i(26099));t.exports=function(t,e,i,n){n.tilemapLayer.worldToTileXY(t,e,!0,r,i);var a=r.x,o=r.y;return s(a,o,n)}},90454(t,e,i){var s=i(63448),r=i(56583);t.exports=function(t,e){var i,n,a,o,h=t.tilemapLayer.tilemap,l=t.tilemapLayer,u=Math.floor(h.tileWidth*l.scaleX),d=Math.floor(h.tileHeight*l.scaleY),c=t.hexSideLength;if("y"===t.staggerAxis){var f=(d-c)/2+c;i=r(e.worldView.x-l.x,u,0,!0)-l.cullPaddingX,n=s(e.worldView.right-l.x,u,0,!0)+l.cullPaddingX,a=r(e.worldView.y-l.y,f,0,!0)-l.cullPaddingY,o=s(e.worldView.bottom-l.y,f,0,!0)+l.cullPaddingY}else{var p=(u-c)/2+c;i=r(e.worldView.x-l.x,p,0,!0)-l.cullPaddingX,n=s(e.worldView.right-l.x,p,0,!0)+l.cullPaddingX,a=r(e.worldView.y-l.y,d,0,!0)-l.cullPaddingY,o=s(e.worldView.bottom-l.y,d,0,!0)+l.cullPaddingY}return{left:i,right:n,top:a,bottom:o}}},9474(t,e,i){var s=i(90454),r=i(32483);t.exports=function(t,e,i,n){void 0===i&&(i=[]),void 0===n&&(n=0),i.length=0;var a=t.tilemapLayer,o=s(t,e);return a.skipCull&&1===a.scrollFactorX&&1===a.scrollFactorY&&(o.left=0,o.right=t.width,o.top=0,o.bottom=t.height),r(t,o,n,i),i}},27229(t,e,i){var s=i(19951),r=i(26099),n=new r;t.exports=function(t,e,i,a){var o=a.baseTileWidth,h=a.baseTileHeight,l=a.tilemapLayer;l&&(o*=l.scaleX,h*=l.scaleY);var u,d,c=s(t,e,n,i,a),f=[],p=.5773502691896257;"y"===a.staggerAxis?(u=p*o,d=h/2):(u=o/2,d=p*h);for(var g=0;g<6;g++){var m=2*Math.PI*(.5-g)/6;f.push(new r(c.x+u*Math.cos(m),c.y+d*Math.sin(m)))}return f}},19951(t,e,i){var s=i(26099);t.exports=function(t,e,i,r,n){i||(i=new s);var a=n.baseTileWidth,o=n.baseTileHeight,h=n.tilemapLayer,l=0,u=0;h&&(r||(r=h.scene.cameras.main),l=h.x+r.scrollX*(1-h.scrollFactorX),u=h.y+r.scrollY*(1-h.scrollFactorY),a*=h.scaleX,o*=h.scaleY);var d,c,f=a/2,p=o/2,g=n.staggerAxis,m=n.staggerIndex;return"y"===g?(d=l+a*t+a,c=u+1.5*e*p+p,e%2==0&&("odd"===m?d-=f:d+=f)):"x"===g&&"odd"===m&&(d=l+1.5*t*f+f,c=u+o*t+o,t%2==0&&("odd"===m?c-=p:c+=p)),i.set(d,c)}},86625(t,e,i){var s=i(26099);t.exports=function(t,e,i,r,n,a){r||(r=new s);var o=a.baseTileWidth,h=a.baseTileHeight,l=a.tilemapLayer;l&&(n||(n=l.scene.cameras.main),t-=l.x+n.scrollX*(1-l.scrollFactorX),e-=l.y+n.scrollY*(1-l.scrollFactorY),o*=l.scaleX,h*=l.scaleY);var u,d,c,f,p,g=.5773502691896257,m=-.3333333333333333,v=.6666666666666666,y=o/2,x=h/2;"y"===a.staggerAxis?(c=g*(u=(t-y)/(g*o))+m*(d=(e-x)/x),f=0*u+v*d):(c=m*(u=(t-y)/y)+g*(d=(e-x)/(g*h)),f=v*u+0*d),p=-c-f;var T,w=Math.round(c),b=Math.round(f),S=Math.round(p),C=Math.abs(w-c),E=Math.abs(b-f),A=Math.abs(S-p);C>E&&C>A?w=-b-S:E>A&&(b=-w-S);var _=b;return T="odd"===a.staggerIndex?_%2==0?b/2+w:b/2+w-.5:_%2==0?b/2+w:b/2+w+.5,r.set(T,_)}},62991(t){t.exports=function(t,e,i){return t>=0&&t=0&&e=0;n--)(o=l[a][n])&&-1!==o.index&&o.visible&&0!==o.alpha&&(c||s(n,a,t,e))&&i.push(o);else if(2===r)for(a=p;a>=0;a--)for(n=0;n=0;a--)for(n=f;n>=0;n--)(o=l[a][n])&&-1!==o.index&&o.visible&&0!==o.alpha&&(c||s(n,a,t,e))&&i.push(o);return h.tilesDrawn=i.length,h.tilesTotal=u*d,i}},14127(t,e,i){var s=i(26099);t.exports=function(t,e,i,r,n){i||(i=new s);var a=n.baseTileWidth,o=n.baseTileHeight,h=n.tilemapLayer,l=0,u=0;h&&(r||(r=h.scene.cameras.main),l=h.x+r.scrollX*(1-h.scrollFactorX),a*=h.scaleX,u=h.y+r.scrollY*(1-h.scrollFactorY),o*=h.scaleY);var d=l+a/2*(t-e),c=u+(t+e)*(o/2);return i.set(d,c)}},96897(t,e,i){var s=i(26099);t.exports=function(t,e,i,r,n,a,o){r||(r=new s);var h=a.baseTileWidth,l=a.baseTileHeight,u=a.tilemapLayer;u&&(n||(n=u.scene.cameras.main),e-=u.y+n.scrollY*(1-u.scrollFactorY),l*=u.scaleY,t-=u.x+n.scrollX*(1-u.scrollFactorX),h*=u.scaleX);var d=h/2,c=l/2;o||(e-=l);var f=.5*((t-=d)/d+e/c),p=.5*(-t/d+e/c);return i&&(f=Math.floor(f),p=Math.floor(p)),r.set(f,p)}},71558(t,e,i){var s=i(23029),r=i(62991),n=i(72023),a=i(20576);t.exports=function(t,e,i,o,h){if(void 0===o&&(o=!0),!r(e,i,h))return null;var l,u=h.data[i][e],d=u&&u.collides;t instanceof s?(null===h.data[i][e]&&(h.data[i][e]=new s(h,t.index,e,i,h.tileWidth,h.tileHeight)),h.data[i][e].copy(t)):(l=t,null===h.data[i][e]?h.data[i][e]=new s(h,l,e,i,h.tileWidth,h.tileHeight):h.data[i][e].index=l);var c=h.data[i][e],f=-1!==h.collideIndexes.indexOf(c.index);if(-1===(l=t instanceof s?t.index:t))c.width=h.tileWidth,c.height=h.tileHeight;else{var p=h.tilemapLayer.tilemap,g=p.tiles[l][2],m=p.tilesets[g];c.width=m.tileWidth,c.height=m.tileHeight}return a(c,f),o&&d!==c.collides&&n(e,i,h),c}},26303(t,e,i){var s=i(71558),r=new(i(26099));t.exports=function(t,e,i,n,a,o){return o.tilemapLayer.worldToTileXY(e,i,!0,r,a,o),s(t,r.x,r.y,n,o)}},14051(t,e,i){var s=i(42573),r=i(71558);t.exports=function(t,e,i,n,a){if(void 0===n&&(n=!0),!Array.isArray(t))return null;Array.isArray(t[0])||(t=[t]);for(var o=t.length,h=t[0].length,l=0;l=d;r--)(a=o[n][r])&&-1!==a.index&&a.visible&&0!==a.alpha&&s.push(a);else if(2===i)for(n=p;n>=f;n--)for(r=d;o[n]&&r=f;n--)for(r=c;o[n]&&r>=d;r--)(a=o[n][r])&&-1!==a.index&&a.visible&&0!==a.alpha&&s.push(a);return u.tilesDrawn=s.length,u.tilesTotal=h*l,s}},57068(t,e,i){var s=i(20576),r=i(42573),n=i(9589);t.exports=function(t,e,i,a,o){void 0===e&&(e=!0),void 0===i&&(i=!0),void 0===o&&(o=!0),Array.isArray(t)||(t=[t]);for(var h=0;he)){for(var l=t;l<=e;l++)n(l,i,o);if(h)for(var u=0;u=t&&c.index<=e&&s(c,i)}a&&r(0,0,o.width,o.height,o)}}},75661(t,e,i){var s=i(20576),r=i(42573),n=i(9589);t.exports=function(t,e,i,a){void 0===e&&(e=!0),void 0===i&&(i=!0),Array.isArray(t)||(t=[t]);for(var o=0;o0&&s(o,t)}}e&&r(0,0,i.width,i.height,i)}},9589(t){t.exports=function(t,e,i){var s=i.collideIndexes.indexOf(t);e&&-1===s?i.collideIndexes.push(t):e||-1===s||i.collideIndexes.splice(s,1)}},20576(t){t.exports=function(t,e){e?t.setCollision(!0,!0,!0,!0,!1):t.resetCollision(!1)}},79583(t){t.exports=function(t,e,i,s){if("number"==typeof t)s.callbacks[t]=null!==e?{callback:e,callbackContext:i}:void 0;else for(var r=0,n=t.length;r-1?new r(o,f,d,u,a.tilesize,a.tilesize):e?null:new r(o,-1,d,u,a.tilesize,a.tilesize),h.push(c)}l.push(h),h=[]}o.data=l,i.push(o)}return i}},96483(t,e,i){var s=i(33629);t.exports=function(t){for(var e=[],i=[],r=0;ro&&(o=e.layer[l].width),e.layer[l].height>h&&(h=e.layer[l].height);var u=new r({width:o,height:h,name:t,tileWidth:e.layer[0].tilesize,tileHeight:e.layer[0].tilesize,format:s.WELTMEISTER});return u.layers=n(e,i),u.tilesets=a(e),u}},52833(t,e,i){t.exports={ParseTileLayers:i(6656),ParseTilesets:i(96483),ParseWeltmeister:i(87021)}},57442(t,e,i){t.exports={FromOrientationString:i(6641),Parse:i(46177),Parse2DArray:i(2342),ParseCSV:i(82593),Impact:i(52833),Tiled:i(96761)}},51233(t,e,i){var s=i(79291);t.exports=function(t){for(var e,i,r,n,a,o=0;o>>0;return s}},84101(t,e,i){var s=i(33629);t.exports=function(t){var e,i,r=[];for(e=0;e0;)if(n.i>=n.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}n=i.pop()}else{var a=n.layers[n.i];if(n.i++,"imagelayer"===a.type){var o=s(a,"offsetx",0)+s(a,"startx",0),h=s(a,"offsety",0)+s(a,"starty",0);e.push({name:n.name+a.name,image:a.image,x:n.x+o+a.x,y:n.y+h+a.y,alpha:n.opacity*a.opacity,visible:n.visible&&a.visible,properties:s(a,"properties",{})})}else if("group"===a.type){var l=r(t,a,n);i.push(n),n=l}}return e}},46594(t,e,i){var s=i(51233),r=i(84101),n=i(91907),a=i(62644),o=i(80341),h=i(6641),l=i(87010),u=i(12635),d=i(22611),c=i(28200),f=i(24619);t.exports=function(t,e,i){var p=a(e),g=new l({width:p.width,height:p.height,name:t,tileWidth:p.tilewidth,tileHeight:p.tileheight,orientation:h(p.orientation),format:o.TILED_JSON,version:p.version,properties:p.properties,renderOrder:p.renderorder,infinite:p.infinite});if(g.orientation===n.HEXAGONAL)if(g.hexSideLength=p.hexsidelength,g.staggerAxis=p.staggeraxis,g.staggerIndex=p.staggerindex,"y"===g.staggerAxis){var m=(g.tileHeight-g.hexSideLength)/2;g.widthInPixels=g.tileWidth*(g.width+.5),g.heightInPixels=g.height*(g.hexSideLength+m)+m}else{var v=(g.tileWidth-g.hexSideLength)/2;g.widthInPixels=g.width*(g.hexSideLength+v)+v,g.heightInPixels=g.tileHeight*(g.height+.5)}g.layers=c(p,i),g.images=u(p);var y=f(p);return g.tilesets=y.tilesets,g.imageCollections=y.imageCollections,g.objects=d(p),g.tiles=r(g),s(g),g}},52205(t,e,i){var s=i(18254),r=i(29920),n=function(t){return{x:t.x,y:t.y}},a=["id","name","type","rotation","properties","visible","x","y","width","height"];t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=0);var o=s(t,a);if(o.x+=e,o.y+=i,t.gid){var h=r(t.gid);o.gid=h.gid,o.flippedHorizontal=h.flippedHorizontal,o.flippedVertical=h.flippedVertical,o.flippedAntiDiagonal=h.flippedAntiDiagonal}else t.polyline?o.polyline=t.polyline.map(n):t.polygon?o.polygon=t.polygon.map(n):t.ellipse?o.ellipse=t.ellipse:t.text?o.text=t.text:t.point?o.point=!0:o.rectangle=!0;return o}},22611(t,e,i){var s=i(95540),r=i(52205),n=i(48700),a=i(79677);t.exports=function(t){for(var e=[],i=[],o=a(t);o.i0;)if(o.i>=o.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}o=i.pop()}else{var h=o.layers[o.i];if(o.i++,h.opacity*=o.opacity,h.visible=o.visible&&h.visible,"objectgroup"===h.type){h.name=o.name+h.name;for(var l=o.x+s(h,"startx",0)+s(h,"offsetx",0),u=o.y+s(h,"starty",0)+s(h,"offsety",0),d=[],c=0;c0;)if(f.i>=f.layers.length){if(c.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}f=c.pop()}else{var p=f.layers[f.i];if(f.i++,"tilelayer"===p.type)if(p.compression)console.warn("TilemapParser.parseTiledJSON - Layer compression is unsupported, skipping layer '"+p.name+"'");else{if(p.encoding&&"base64"===p.encoding){if(p.chunks)for(var g=0;g0?((y=new u(m,v.gid,F,I,t.tilewidth,t.tileheight)).rotation=v.rotation,y.flipX=v.flipped,b[I][F]=y):(x=e?null:new u(m,-1,F,I,t.tilewidth,t.tileheight),b[I][F]=x),++S===M.width&&(O++,S=0)}}else{(m=new h({name:f.name+p.name,id:p.id,x:f.x+o(p,"offsetx",0)+p.x,y:f.y+o(p,"offsety",0)+p.y,width:p.width,height:p.height,tileWidth:t.tilewidth,tileHeight:t.tileheight,alpha:f.opacity*p.opacity,visible:f.visible&&p.visible,properties:o(p,"properties",[]),orientation:a(t.orientation)})).orientation===r.HEXAGONAL&&(m.hexSideLength=t.hexsidelength,m.staggerAxis=t.staggeraxis,m.staggerIndex=t.staggerindex,"y"===m.staggerAxis?(T=(m.tileHeight-m.hexSideLength)/2,m.widthInPixels=m.tileWidth*(m.width+.5),m.heightInPixels=m.height*(m.hexSideLength+T)+T):(w=(m.tileWidth-m.hexSideLength)/2,m.widthInPixels=m.width*(m.hexSideLength+w)+w,m.heightInPixels=m.tileHeight*(m.height+.5)));for(var N=[],B=0,k=p.data.length;B0?((y=new u(m,v.gid,S,b.length,t.tilewidth,t.tileheight)).rotation=v.rotation,y.flipX=v.flipped,N.push(y)):(x=e?null:new u(m,-1,S,b.length,t.tilewidth,t.tileheight),N.push(x)),++S===p.width&&(b.push(N),S=0,N=[])}m.data=b,d.push(m)}else if("group"===p.type){var U=n(t,p,f);c.push(f),f=U}}return d}},24619(t,e,i){var s=i(33629),r=i(16536),n=i(52205),a=i(57880);t.exports=function(t){for(var e,i=[],o=[],h=null,l=0;l1){var c=void 0,f=void 0;if(Array.isArray(u.tiles)){c=c||{},f=f||{};for(var p=0;p0){var n,a,o,h={},l={};if(Array.isArray(s.edgecolors))for(n=0;n0)throw new Error("TimerEvent infinite loop created via zero delay")}else e=new a(t);return this._pendingInsertion.push(e),e},delayedCall:function(t,e,i,s){return this.addEvent({delay:t,callback:e,args:i,callbackScope:s})},clearPendingEvents:function(){return this._pendingInsertion=[],this},removeEvent:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e-1&&this._active.splice(r,1),s.destroy()}for(i=0;i=s.delay)){var r=s.elapsed-s.delay;if(s.elapsed=s.delay,!s.hasDispatched&&s.callback&&(s.hasDispatched=!0,s.callback.apply(s.callbackScope,s.args)),s.repeatCount>0){if(s.repeatCount--,r>=s.delay)for(;r>=s.delay&&s.repeatCount>0;)s.callback&&s.callback.apply(s.callbackScope,s.args),r-=s.delay,s.repeatCount--;s.elapsed=r,s.hasDispatched=!1}else s.hasDispatched&&this._pendingRemoval.push(s)}}}},shutdown:function(){var t;for(t=0;t0||this.totalComplete>0)&&(0!==this.loop&&(-1===this.loop||this.loop>this.iteration)?(this.iteration++,this.reset(!0)):this.complete=!0),this.complete&&this.emit(h.COMPLETE,this)}},play:function(t){return void 0===t&&(t=!0),this.paused=!1,this.complete=!1,this.totalComplete=0,t&&this.reset(),this},pause:function(){this.paused=!0;for(var t=this.events,e=0;e0&&(i=e[e.length-1].time);for(var s=0;s0)throw new Error("TimerEvent infinite loop created via zero delay");return this},getProgress:function(){return this.elapsed/this.delay},getOverallProgress:function(){if(this.repeat>0){var t=this.delay+this.delay*this.repeat;return(this.elapsed+this.delay*(this.repeat-this.repeatCount))/t}return this.getProgress()},getRepeatCount:function(){return this.repeatCount},getElapsed:function(){return this.elapsed},getElapsedSeconds:function(){return.001*this.elapsed},getRemaining:function(){return this.delay-this.elapsed},getRemainingSeconds:function(){return.001*this.getRemaining()},getOverallRemaining:function(){return this.delay*(1+this.repeatCount)-this.elapsed},getOverallRemainingSeconds:function(){return.001*this.getOverallRemaining()},remove:function(t){void 0===t&&(t=!1),this.elapsed=this.delay,this.hasDispatched=!t,this.repeatCount=0},destroy:function(){this.callback=void 0,this.callbackScope=void 0,this.args=[]}});t.exports=n},35945(t){t.exports="complete"},89809(t,e,i){t.exports={COMPLETE:i(35945)}},90291(t,e,i){t.exports={Clock:i(33385),Events:i(89809),Timeline:i(96120),TimerEvent:i(94880)}},40382(t,e,i){var s=i(72905),r=i(83419),n=i(43491),a=i(88032),o=i(37277),h=i(44594),l=i(93109),u=i(8462),d=i(8357),c=i(43960),f=i(26012),p=new r({initialize:function(t){this.scene=t,this.events=t.sys.events,this.timeScale=1,this.paused=!1,this.processing=!1,this.tweens=[],this.time=0,this.startTime=0,this.nextTime=0,this.prevTime=0,this.maxLag=500,this.lagSkip=33,this.gap=1e3/240,this.events.once(h.BOOT,this.boot,this),this.events.on(h.START,this.start,this)},boot:function(){this.events.once(h.DESTROY,this.destroy,this)},start:function(){this.timeScale=1,this.paused=!1,this.startTime=Date.now(),this.prevTime=this.startTime,this.nextTime=this.gap,this.events.on(h.UPDATE,this.update,this),this.events.once(h.SHUTDOWN,this.shutdown,this)},create:function(t){Array.isArray(t)||(t=[t]);for(var e=[],i=0;i-1},existing:function(t){return this.has(t)||this.tweens.push(t.reset()),this},addCounter:function(t){var e=a(this,t);return this.tweens.push(e.reset()),e},stagger:function(t,e){return l(t,e)},setLagSmooth:function(t,e){return void 0===t&&(t=1/1e-8),void 0===e&&(e=0),this.maxLag=t,this.lagSkip=Math.min(e,this.maxLag),this},setFps:function(t){return void 0===t&&(t=240),this.gap=1e3/t,this.nextTime=1e3*this.time+this.gap,this},getDelta:function(t){var e=Date.now()-this.prevTime;e>this.maxLag&&(this.startTime+=e-this.lagSkip),this.prevTime+=e;var i=this.prevTime-this.startTime,s=i-this.nextTime,r=i-1e3*this.time;return s>0||t?(i/=1e3,this.time=i,this.nextTime+=s+(s>=this.gap?4:this.gap-s)):r=0,r},tick:function(){return this.step(!0),this},update:function(){this.paused||this.step(!1)},step:function(t){void 0===t&&(t=!1);var e=this.getDelta(t);if(!(e<=0)){var i,s;this.processing=!0;var r=[],n=this.tweens;for(i=0;i0){for(i=0;i-1&&(s.isPendingRemove()||s.isDestroyed())&&(n.splice(o,1),s.destroy())}r.length=0}this.processing=!1}},remove:function(t){return this.processing?t.setPendingRemoveState():(s(this.tweens,t),t.setRemovedState()),this},reset:function(t){return this.existing(t),t.seek(),t.setActiveState(),this},makeActive:function(t){return this.existing(t),t.setActiveState(),this},each:function(t,e){var i,s=[null];for(i=1;iE&&(E=M),C[A][_]=M}}}var R=o?s(o):null;return i=h?function(t,e,i,s){var r,n=0,o=s%y,h=Math.floor(s/y);if(o>=0&&o=0&&ht&&(this.loopCounter=t),this},remove:function(){return this.parent&&this.parent.remove(this),this},stop:function(){return!this.parent||this.isRemoved()||this.isPendingRemove()||this.isDestroyed()||(this.dispatchEvent(n.TWEEN_STOP,"onStop"),this.setPendingRemoveState()),this},updateLoopCountdown:function(t){this.countdown-=t,this.countdown<=0&&(this.setActiveState(),this.dispatchEvent(n.TWEEN_LOOP,"onLoop"))},updateStartCountdown:function(t){return this.countdown-=t,this.countdown<=0&&(this.hasStarted=!0,this.setActiveState(),this.dispatchEvent(n.TWEEN_START,"onStart"),t=0),t},updateCompleteDelay:function(t){this.countdown-=t,this.countdown<=0&&this.onCompleteHandler()},setCallback:function(t,e,i){return void 0===i&&(i=[]),this.callbacks.hasOwnProperty(t)&&(this.callbacks[t]={func:e,params:i}),this},setPendingState:function(){this.state=a.PENDING},setActiveState:function(){this.state=a.ACTIVE,this.hasStarted=!1},setLoopDelayState:function(){this.state=a.LOOP_DELAY},setCompleteDelayState:function(){this.state=a.COMPLETE_DELAY},setStartDelayState:function(){this.state=a.START_DELAY,this.countdown=this.startDelay,this.hasStarted=!1},setPendingRemoveState:function(){this.state=a.PENDING_REMOVE},setRemovedState:function(){this.state=a.REMOVED},setFinishedState:function(){this.state=a.FINISHED},setDestroyedState:function(){this.state=a.DESTROYED},isPending:function(){return this.state===a.PENDING},isActive:function(){return this.state===a.ACTIVE},isLoopDelayed:function(){return this.state===a.LOOP_DELAY},isCompleteDelayed:function(){return this.state===a.COMPLETE_DELAY},isStartDelayed:function(){return this.state===a.START_DELAY},isPendingRemove:function(){return this.state===a.PENDING_REMOVE},isRemoved:function(){return this.state===a.REMOVED},isFinished:function(){return this.state===a.FINISHED},isDestroyed:function(){return this.state===a.DESTROYED},destroy:function(){this.data&&this.data.forEach(function(t){t.destroy()}),this.removeAllListeners(),this.callbacks=null,this.data=null,this.parent=null,this.setDestroyedState()}});o.TYPES=["onActive","onComplete","onLoop","onPause","onRepeat","onResume","onStart","onStop","onUpdate","onYoyo"],t.exports=o},95042(t,e,i){var s=i(83419),r=i(842),n=i(86353),a=new s({initialize:function(t,e,i,s,r,n,a,o,h,l){this.tween=t,this.targetIndex=e,this.duration=s<=0?.01:s,this.totalDuration=0,this.delay=0,this.getDelay=i,this.yoyo=r,this.hold=n,this.repeat=a,this.repeatDelay=o,this.repeatCounter=0,this.flipX=h,this.flipY=l,this.progress=0,this.elapsed=0,this.state=0,this.isCountdown=!1},getTarget:function(){return this.tween.targets[this.targetIndex]},setTargetValue:function(t){void 0===t&&(t=this.current),this.tween.targets[this.targetIndex][this.key]=t},setCreatedState:function(){this.state=n.CREATED,this.isCountdown=!1},setDelayState:function(){this.state=n.DELAY,this.isCountdown=!0},setPendingRenderState:function(){this.state=n.PENDING_RENDER,this.isCountdown=!1},setPlayingForwardState:function(){this.state=n.PLAYING_FORWARD,this.isCountdown=!1},setPlayingBackwardState:function(){this.state=n.PLAYING_BACKWARD,this.isCountdown=!1},setHoldState:function(){this.state=n.HOLD_DELAY,this.isCountdown=!0},setRepeatState:function(){this.state=n.REPEAT_DELAY,this.isCountdown=!0},setCompleteState:function(){this.state=n.COMPLETE,this.isCountdown=!1},isCreated:function(){return this.state===n.CREATED},isDelayed:function(){return this.state===n.DELAY},isPendingRender:function(){return this.state===n.PENDING_RENDER},isPlayingForward:function(){return this.state===n.PLAYING_FORWARD},isPlayingBackward:function(){return this.state===n.PLAYING_BACKWARD},isHolding:function(){return this.state===n.HOLD_DELAY},isRepeating:function(){return this.state===n.REPEAT_DELAY},isComplete:function(){return this.state===n.COMPLETE},setStateFromEnd:function(t){this.yoyo?this.onRepeat(t,!0,!0):this.repeatCounter>0?this.onRepeat(t,!0,!1):this.setCompleteState()},setStateFromStart:function(t){this.repeatCounter>0?this.onRepeat(t,!1):this.setCompleteState()},reset:function(){var t=this.tween,e=t.totalTargets,i=this.targetIndex,s=t.targets[i],r=this.key;this.progress=0,this.elapsed=0,this.delay=this.getDelay(s,r,0,i,e,t),this.repeatCounter=-1===this.repeat?n.MAX:this.repeat,this.setPendingRenderState();var a=this.duration+this.hold;this.yoyo&&(a+=this.duration);var o=a+this.repeatDelay;this.totalDuration=this.delay+a,-1===this.repeat?(this.totalDuration+=o*n.MAX,t.isInfinite=!0):this.repeat>0&&(this.totalDuration+=o*this.repeat),this.totalDuration>t.duration&&(t.duration=this.totalDuration),this.delay0&&(this.elapsed=this.delay,this.setDelayState())},onRepeat:function(t,e,i){var s=this.tween,n=s.totalTargets,a=this.targetIndex,o=s.targets[a],h=this.key,l="texture"!==h;if(this.elapsed=t,this.progress=t/this.duration,this.flipX&&o.toggleFlipX(),this.flipY&&o.toggleFlipY(),l&&(e||i)&&(this.start=this.getStartValue(o,h,this.start,a,n,s)),i)return this.setPlayingBackwardState(),void this.dispatchEvent(r.TWEEN_YOYO,"onYoyo");this.repeatCounter--,l&&(this.end=this.getEndValue(o,h,this.start,a,n,s)),this.repeatDelay>0?(this.elapsed=this.repeatDelay-t,l&&(this.current=this.start,o[h]=this.current),this.setRepeatState()):(this.setPlayingForwardState(),this.dispatchEvent(r.TWEEN_REPEAT,"onRepeat"))},destroy:function(){this.tween=null,this.getDelay=null,this.setCompleteState()}});t.exports=a},69902(t){t.exports={targets:null,delay:0,duration:1e3,ease:"Power0",easeParams:null,hold:0,repeat:0,repeatDelay:0,yoyo:!1,flipX:!1,flipY:!1,persist:!1,interpolation:null}},81076(t){t.exports=["callbackScope","completeDelay","delay","duration","ease","easeParams","flipX","flipY","hold","interpolation","loop","loopDelay","onActive","onActiveParams","onComplete","onCompleteParams","onLoop","onLoopParams","onPause","onPauseParams","onRepeat","onRepeatParams","onResume","onResumeParams","onStart","onStartParams","onStop","onStopParams","onUpdate","onUpdateParams","onYoyo","onYoyoParams","paused","persist","props","repeat","repeatDelay","targets","yoyo"]},8462(t,e,i){var s=i(70402),r=i(83419),n=i(842),a=i(44603),o=i(39429),h=i(36383),l=i(86353),u=i(48177),d=i(42220),c=new r({Extends:s,initialize:function(t,e){s.call(this,t),this.targets=e,this.totalTargets=e.length,this.isSeeking=!1,this.isInfinite=!1,this.elapsed=0,this.totalElapsed=0,this.duration=0,this.progress=0,this.totalDuration=0,this.totalProgress=0,this.isNumberTween=!1},add:function(t,e,i,s,r,n,a,o,h,l,d,c,f,p,g,m){var v=new u(this,t,e,i,s,r,n,a,o,h,l,d,c,f,p,g,m);return this.totalData=this.data.push(v),v},addFrame:function(t,e,i,s,r,n,a,o,h,l){var u=new d(this,t,e,i,s,r,n,a,o,h,l);return this.totalData=this.data.push(u),u},getValue:function(t){void 0===t&&(t=0);var e=null;return this.data&&(e=this.data[t].current),e},hasTarget:function(t){return this.targets&&-1!==this.targets.indexOf(t)},updateTo:function(t,e,i){if(void 0===i&&(i=!1),"texture"!==t)for(var s=0;s0)this.elapsed=0,this.progress=0,this.loopCounter--,this.initTweenData(!0),this.loopDelay>0?(this.countdown=this.loopDelay,this.setLoopDelayState()):(this.setActiveState(),this.dispatchEvent(n.TWEEN_LOOP,"onLoop"));else{if(!(this.completeDelay>0))return this.onCompleteHandler(),!0;this.countdown=this.completeDelay,this.setCompleteDelayState()}return!1},onCompleteHandler:function(){this.progress=1,this.totalProgress=1,s.prototype.onCompleteHandler.call(this)},play:function(){return this.isDestroyed()?(console.warn("Cannot play destroyed Tween",this),this):((this.isPendingRemove()||this.isFinished())&&this.seek(),this.paused=!1,this.setActiveState(),this)},seek:function(t,e,i){if(void 0===t&&(t=0),void 0===e&&(e=16.6),void 0===i&&(i=!1),this.isDestroyed())return console.warn("Cannot seek destroyed Tween",this),this;i||(this.isSeeking=!0),this.reset(!0),this.initTweenData(!0),this.setActiveState(),this.dispatchEvent(n.TWEEN_ACTIVE,"onActive");var s=this.paused;if(this.paused=!1,t>0){for(var r=Math.floor(t/e),a=t-r*e,o=0;o0&&this.update(a)}return this.paused=s,this.isSeeking=!1,this},initTweenData:function(t){void 0===t&&(t=!1),this.duration=0,this.startDelay=h.MAX_SAFE_INTEGER;for(var e=this.data,i=0;i0?s+r+(s+a)*n:s+r},reset:function(t){return void 0===t&&(t=!1),this.elapsed=0,this.totalElapsed=0,this.progress=0,this.totalProgress=0,this.loopCounter=this.loop,-1===this.loop&&(this.isInfinite=!0,this.loopCounter=l.MAX),t||(this.initTweenData(),this.setActiveState(),this.dispatchEvent(n.TWEEN_ACTIVE,"onActive")),this},update:function(t){if(this.isPendingRemove()||this.isDestroyed())return!this.persist||(this.setFinishedState(),!1);if(this.paused||this.isFinished())return!1;if(t*=this.timeScale*this.parent.timeScale,this.isLoopDelayed())return this.updateLoopCountdown(t),!1;if(this.isCompleteDelayed())return this.updateCompleteDelay(t),!1;this.hasStarted||(this.startDelay-=t,this.startDelay<=0&&(this.hasStarted=!0,this.dispatchEvent(n.TWEEN_START,"onStart"),t=0));var e=!1;if(this.isActive())for(var i=this.data,s=0;s0&&!this.isStartDelayed()?this.setStartDelayState():this.setActiveState(),this},add:function(t){var e=this.parent.create(t);Array.isArray(e)||(e=[e]);for(var i=this.data,s=0;s0)this.loopCounter--,this.resetTweens(),this.loopDelay>0?(this.countdown=this.loopDelay,this.setLoopDelayState()):(this.setActiveState(),this.dispatchEvent(a.TWEEN_LOOP,"onLoop"));else{if(!(this.completeDelay>0))return this.onCompleteHandler(),!0;this.countdown=this.completeDelay,this.setCompleteDelayState()}return!1},play:function(){return this.isDestroyed()?(console.warn("Cannot play destroyed TweenChain",this),this):((this.isPendingRemove()||this.isPending())&&this.resetTweens(),this.paused=!1,this.startDelay>0&&!this.isStartDelayed()?this.setStartDelayState():this.setActiveState(),this)},resetTweens:function(){for(var t=this.data,e=this.totalData,i=0;i=d?(c=u-d,u=d,f=!0):u<0&&(u=0);var p=r(u/d,0,1);this.elapsed=u,this.progress=p,this.previous=this.current,h||(p=1-p);var g=this.ease(p);this.interpolation?this.current=this.interpolation(this.interpolationData,g):this.current=this.start+(this.end-this.start)*g,n[o]=this.current,f&&(h?(e.isNumberTween&&(this.current=this.end,n[o]=this.current),this.hold>0?(this.elapsed=this.hold,this.setHoldState()):this.setStateFromEnd(c)):(e.isNumberTween&&(this.current=this.start,n[o]=this.current),this.setStateFromStart(c))),this.dispatchEvent(a.TWEEN_UPDATE,"onUpdate")}return!this.isComplete()},dispatchEvent:function(t,e){var i=this.tween;if(!i.isSeeking){var s=i.targets[this.targetIndex],r=this.key,n=this.current,a=this.previous;i.emit(t,i,r,s,n,a);var o=i.callbacks[e];o&&o.func.apply(i.callbackScope,[i,s,r,n,a].concat(o.params))}},destroy:function(){s.prototype.destroy.call(this),this.getActiveValue=null,this.getEndValue=null,this.getStartValue=null,this.ease=null}});t.exports=o},42220(t,e,i){var s=i(95042),r=i(45319),n=i(83419),a=i(842),o=new n({Extends:s,initialize:function(t,e,i,r,n,a,o,h,l,u,d){s.call(this,t,e,n,a,!1,o,h,l,u,d),this.key="texture",this.startTexture=null,this.endTexture=i,this.startFrame=null,this.endFrame=r,this.yoyo=0!==h},reset:function(t){s.prototype.reset.call(this);var e=this.tween.targets[this.targetIndex];this.startTexture||(this.startTexture=e.texture.key,this.startFrame=e.frame.name),t&&e.setTexture(this.startTexture,this.startFrame)},update:function(t){var e=this.tween,i=this.targetIndex,s=e.targets[i];if(!s)return this.setCompleteState(),!1;if(this.isCountdown&&(this.elapsed-=t,this.elapsed<=0&&(this.elapsed=0,t=0,this.isDelayed()?this.setPendingRenderState():this.isRepeating()?(this.setPlayingForwardState(),this.dispatchEvent(a.TWEEN_REPEAT,"onRepeat")):this.isHolding()&&this.setStateFromEnd(0))),this.isPendingRender())return this.startTexture&&s.setTexture(this.startTexture,this.startFrame),this.setPlayingForwardState(),!0;var n=this.isPlayingForward(),o=this.isPlayingBackward();if(n||o){var h=this.elapsed,l=this.duration,u=0,d=!1;(h+=t)>=l?(u=h-l,h=l,d=!0):h<0&&(h=0);var c=r(h/l,0,1);this.elapsed=h,this.progress=c,d&&(n?(s.setTexture(this.endTexture,this.endFrame),this.hold>0?(this.elapsed=this.hold,this.setHoldState()):this.setStateFromEnd(u)):(s.setTexture(this.startTexture,this.startFrame),this.setStateFromStart(u))),this.dispatchEvent(a.TWEEN_UPDATE,"onUpdate")}return!this.isComplete()},dispatchEvent:function(t,e){var i=this.tween;if(!i.isSeeking){var s=i.targets[this.targetIndex],r=this.key;i.emit(t,i,r,s);var n=i.callbacks[e];n&&n.func.apply(i.callbackScope,[i,s,r].concat(n.params))}},destroy:function(){s.prototype.destroy.call(this),this.startTexture=null,this.endTexture=null,this.startFrame=null,this.endFrame=null}});t.exports=o},86353(t){t.exports={CREATED:0,DELAY:2,PENDING_RENDER:4,PLAYING_FORWARD:5,PLAYING_BACKWARD:6,HOLD_DELAY:7,REPEAT_DELAY:8,COMPLETE:9,PENDING:20,ACTIVE:21,LOOP_DELAY:22,COMPLETE_DELAY:23,START_DELAY:24,PENDING_REMOVE:25,REMOVED:26,FINISHED:27,DESTROYED:28,MAX:999999999999}},83419(t){function e(t,e,i){var s=i?t[e]:Object.getOwnPropertyDescriptor(t,e);return!i&&s.value&&"object"==typeof s.value&&(s=s.value),!(!s||!function(t){return!!t.get&&"function"==typeof t.get||!!t.set&&"function"==typeof t.set}(s))&&(void 0===s.enumerable&&(s.enumerable=!0),void 0===s.configurable&&(s.configurable=!0),s)}function i(t,e){var i=Object.getOwnPropertyDescriptor(t,e);return!!i&&(i.value&&"object"==typeof i.value&&(i=i.value),!1===i.configurable)}function s(t,s,r,a){for(var o in s)if(s.hasOwnProperty(o)){var h=e(s,o,r);if(!1!==h){if(i((a||t).prototype,o)){if(n.ignoreFinals)continue;throw new Error("cannot override final property '"+o+"', set Class.ignoreFinals = true to skip")}Object.defineProperty(t.prototype,o,h)}else t.prototype[o]=s[o]}}function r(t,e){if(e){Array.isArray(e)||(e=[e]);for(var i=0;i0){var n=i-t.length;if(n<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.push(e),s&&s.call(r,e),e):null;for(var a=e.length-1;a>=0;)-1!==t.indexOf(e[a])&&e.splice(a,1),a--;if(0===(a=e.length))return null;i>0&&a>n&&(e.splice(n),a=n);for(var o=0;o0){var a=s-t.length;if(a<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.splice(i,0,e),r&&r.call(n,e),e):null;for(var o=e.length-1;o>=0;)-1!==t.indexOf(e[o])&&e.pop(),o--;if(0===(o=e.length))return null;s>0&&o>a&&(e.splice(a),o=a);for(var h=o-1;h>=0;h--){var l=e[h];t.splice(i,0,l),r&&r.call(n,l)}return e}},66905(t){t.exports=function(t,e){var i=t.indexOf(e);return-1!==i&&ie.length&&(n=e.length),i?(s=e[n-1][i],(r=e[n][i])-t<=t-s?e[n]:e[n-1]):(s=e[n-1],(r=e[n])-t<=t-s?r:s)}},43491(t){var e=function(t,i){void 0===i&&(i=[]);for(var s=0;s=0;a--)if(o=t[a],!e||e&&void 0===i&&o.hasOwnProperty(e)||e&&void 0!==i&&o[e]===i)return o;return null}},26546(t){t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=t.length);var s=e+Math.floor(Math.random()*i);return void 0===t[s]?null:t[s]}},85835(t){t.exports=function(t,e,i){if(e===i)return t;var s=t.indexOf(e),r=t.indexOf(i);if(s<0||r<0)throw new Error("Supplied items must be elements of the same array");return s>r||(t.splice(s,1),r=t.indexOf(i),t.splice(r+1,0,e)),t}},83371(t){t.exports=function(t,e,i){if(e===i)return t;var s=t.indexOf(e),r=t.indexOf(i);if(s<0||r<0)throw new Error("Supplied items must be elements of the same array");return s0){var s=t[i-1],r=t.indexOf(s);t[i]=s,t[r]=e}return t}},69693(t){t.exports=function(t,e,i){var s=t.indexOf(e);if(-1===s||i<0||i>=t.length)throw new Error("Supplied index out of bounds");return s!==i&&(t.splice(s,1),t.splice(i,0,e)),e}},40853(t){t.exports=function(t,e){var i=t.indexOf(e);if(-1!==i&&i=e;r--)a?n.push(i+r.toString()+s):n.push(r);else for(r=t;r<=e;r++)a?n.push(i+r.toString()+s):n.push(r);return n}},593(t,e,i){var s=i(2284);t.exports=function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=null),void 0===i&&(i=1),null===e&&(e=t,t=0);for(var r=[],n=Math.max(s((e-t)/(i||1)),0),a=0;ae?1:0}var s=function(t,r,n,a,o){for(void 0===n&&(n=0),void 0===a&&(a=t.length-1),void 0===o&&(o=i);a>n;){if(a-n>600){var h=a-n+1,l=r-n+1,u=Math.log(h),d=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*d*(h-d)/h)*(l-h/2<0?-1:1),f=Math.max(n,Math.floor(r-l*d/h+c)),p=Math.min(a,Math.floor(r+(h-l)*d/h+c));s(t,r,f,p,o)}var g=t[r],m=n,v=a;for(e(t,n,r),o(t[a],g)>0&&e(t,n,a);m0;)v--}0===o(t[n],g)?e(t,n,v):e(t,++v,a),v<=r&&(n=v+1),r<=v&&(a=v-1)}};t.exports=s},88492(t,e,i){var s=i(35154),r=i(33680),n=function(t,e,i){for(var s=[],r=0;r=0;){var h=e[a];-1!==(n=t.indexOf(h))&&(s(t,n),o.push(h),i&&i.call(r,h)),a--}return o}},60248(t,e,i){var s=i(19133);t.exports=function(t,e,i,r){if(void 0===r&&(r=t),e<0||e>t.length-1)throw new Error("Index out of bounds");var n=s(t,e);return i&&i.call(r,n),n}},81409(t,e,i){var s=i(82011);t.exports=function(t,e,i,r,n){if(void 0===e&&(e=0),void 0===i&&(i=t.length),void 0===n&&(n=t),s(t,e,i)){var a=i-e,o=t.splice(e,a);if(r)for(var h=0;h=r||e>=i||i>r){if(s)throw new Error("Range Error: Values outside acceptable range");return!1}return!0}},89545(t){t.exports=function(t,e){var i=t.indexOf(e);return-1!==i&&i>0&&(t.splice(i,1),t.unshift(e)),e}},17810(t,e,i){var s=i(82011);t.exports=function(t,e,i,r,n){if(void 0===r&&(r=0),void 0===n&&(n=t.length),s(t,r,n))for(var a=r;a0;e--){var i=Math.floor(Math.random()*(e+1)),s=t[e];t[e]=t[i],t[i]=s}return t}},90126(t){t.exports=function(t){var e=/\D/g;return t.sort(function(t,i){return parseInt(t.replace(e,""),10)-parseInt(i.replace(e,""),10)}),t}},19133(t){t.exports=function(t,e){if(!(e>=t.length)){for(var i=t.length-1,s=t[e],r=e;rl&&(n=l),a>l&&(a=l),o=r,h=n;;)if(o-1;n--)s[r][n]=t[n][r]}return s}},54915(t,e,i){t.exports={CheckMatrix:i(86922),MatrixToString:i(63362),ReverseColumns:i(92598),ReverseRows:i(21224),Rotate180:i(98717),RotateLeft:i(44657),RotateMatrix:i(37829),RotateRight:i(92632),Translate:i(69512),TransposeMatrix:i(2429)}},71334(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";t.exports=function(t,i){for(var s=new Uint8Array(t),r=s.length,n=i?"data:"+i+";base64,":"",a=0;a>2],n+=e[(3&s[a])<<4|s[a+1]>>4],n+=e[(15&s[a+1])<<2|s[a+2]>>6],n+=e[63&s[a+2]];return r%3==2?n=n.substring(0,n.length-1)+"=":r%3==1&&(n=n.substring(0,n.length-2)+"=="),n}},53134(t){for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=new Uint8Array(256),s=0;s<64;s++)i[e.charCodeAt(s)]=s;t.exports=function(t){var e,s,r,n,a=(t=t.substr(t.indexOf(",")+1)).length,o=.75*a,h=0;"="===t[a-1]&&(o--,"="===t[a-2]&&o--);for(var l=new ArrayBuffer(o),u=new Uint8Array(l),d=0;d>4,u[h++]=(15&s)<<4|r>>2,u[h++]=(3&r)<<6|63&n;return l}},65839(t,e,i){t.exports={ArrayBufferToBase64:i(71334),Base64ToArrayBuffer:i(53134)}},91799(t,e,i){t.exports={Array:i(37105),Base64:i(65839),Objects:i(1183),String:i(31749),NOOP:i(29747),NULL:i(20242)}},41786(t){t.exports=function(t){var e={};for(var i in t)Array.isArray(t[i])?e[i]=t[i].slice(0):e[i]=t[i];return e}},62644(t){var e=function(t){var i,s,r;if("object"!=typeof t||null===t)return t;for(r in i=Array.isArray(t)?[]:{},t)s=t[r],i[r]=e(s);return i};t.exports=e},79291(t,e,i){var s=i(41212),r=function(){var t,e,i,n,a,o,h=arguments[0]||{},l=1,u=arguments.length,d=!1;for("boolean"==typeof h&&(d=h,h=arguments[1]||{},l=2),u===l&&(h=this,--l);l=(t=t.toString()).length)switch(s){case 1:t=new Array(e+1-t.length).join(i)+t;break;case 3:var n=Math.ceil((r=e-t.length)/2);t=new Array(r-n+1).join(i)+t+new Array(n+1).join(i);break;default:t+=new Array(e+1-t.length).join(i)}return t}},33628(t){t.exports=function(t,e){return 0===e?t.slice(1):t.slice(0,e)+t.slice(e+1)}},27671(t){t.exports=function(t){return t.split("").reverse().join("")}},45650(t){t.exports=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}},35355(t){t.exports=function(t){return t&&t[0].toUpperCase()+t.slice(1)}},31749(t,e,i){t.exports={Format:i(27902),Pad:i(41836),RemoveAt:i(33628),Reverse:i(27671),UppercaseFirst:i(35355),UUID:i(45650)}}},e={};function i(s){var r=e[s];if(void 0!==r)return r.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,i),n.exports}return i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i(85454)})()); \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/AlienOnslaught.js b/extensions/arcade-canvas/game/scenes/AlienOnslaught.js new file mode 100644 index 00000000..c8f77f82 --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/AlienOnslaught.js @@ -0,0 +1,812 @@ +// AlienOnslaught — Space Invaders-style arcade shooter. +// Rows of aliens march across the screen, descending as they reach the +// edges. The player defends from the bottom with destructible shields. +// All graphics are procedural (Phaser Graphics) — no external sprite sheets. +import { BaseScene, W, H } from './BaseScene.js'; +/* ------------------------------------------------------------------ */ +/* Constants — recalculated in create() for responsive sizing */ +/* ------------------------------------------------------------------ */ +let SCALE = Math.min(W / 1920, H / 1080); +// Grid layout +const ALIEN_COLS = 11; +const ALIEN_ROWS = 5; +// Alien types per row (top → bottom): squid, crab, crab, octopus, octopus +const ALIEN_TYPES = [ + { name: 'squid', points: 30, color: 0xff4444 }, // row 0 (top) + { name: 'crab', points: 20, color: 0x44ff44 }, // rows 1-2 + { name: 'octopus', points: 10, color: 0x44aaff }, // rows 3-4 +]; +// Timing / speeds +const BASE_MARCH_INTERVAL = 700; // ms between march steps at full grid +const MIN_MARCH_INTERVAL = 60; // fastest march with few aliens left +const MARCH_DROP = 0; // calculated in create() +const PLAYER_SPEED = 350; // px/s +const PLAYER_BULLET_SPEED = 500; // px/s +const ALIEN_BULLET_SPEED = 250; // px/s +const ALIEN_FIRE_INTERVAL = 1200; // ms between alien shots (base) +const MYSTERY_INTERVAL_MIN = 15000; +const MYSTERY_INTERVAL_MAX = 30000; +const MYSTERY_SPEED = 150; // px/s +const INVINCIBLE_TIME = 2000; // ms +// Shield config +const SHIELD_COUNT = 4; +const SHIELD_BLOCK_COLS = 22; +const SHIELD_BLOCK_ROWS = 16; +/* ------------------------------------------------------------------ */ +/* Scene */ +/* ------------------------------------------------------------------ */ +export class AlienOnslaughtScene extends BaseScene { + /* player */ + playerGfx; + playerX = 0; + playerY = 0; + playerAlive = true; + /* aliens */ + aliens = []; + alienCellW = 0; + alienCellH = 0; + alienGridX = 0; // grid origin + alienGridY = 0; + marchDir = 1; // 1 = right, -1 = left + marchTimer = 0; + marchInterval = BASE_MARCH_INTERVAL; + marchStepX = 0; + marchDrop = 0; + /* bullets */ + playerBullets = []; + alienBullets = []; + alienFireTimer = 0; + /* mystery ship */ + mystery = null; + mysteryTimer = 0; + /* shields */ + shields = []; // [shieldIdx][blockIdx] + /* starfield */ + stars = []; + /* game state */ + wave = 0; + invincibleTimer = 0; + respawnTimer = 0; + gameOverFlag = false; + waveDelay = 0; + /* input */ + cursors; + spaceKey; + spaceWasDown = false; + /* sizing (calculated in create) */ + alienW = 0; + alienH = 0; + playerW = 0; + playerH = 0; + bulletW = 0; + bulletH = 0; + constructor() { super('alien-onslaught'); } + get displayName() { return 'Alien Onslaught'; } + getDescription() { + return 'Blast waves of descending aliens before they reach the bottom!'; + } + getControls() { + return [ + { key: '← →', action: 'Move Left / Right' }, + { key: 'SPACE', action: 'Fire' }, + ]; + } + /* ================================================================ + LIFECYCLE + ================================================================ */ + preload() { + // Reuse existing sound effects + this.load.audio('ao_laser', '../assets/galaxy-blaster/sounds/sfx_laser1.ogg'); + this.load.audio('ao_explosion', '../assets/galaxy-blaster/sounds/sfx_explosion.ogg'); + this.load.audio('ao_lose', '../assets/cosmic-rocks/sounds/sfx_lose.ogg'); + this.load.audio('ao_twoTone', '../assets/cosmic-rocks/sounds/sfx_twoTone.ogg'); + this.load.audio('ao_shieldHit', '../assets/galaxy-blaster/sounds/sfx_zap.ogg'); + this.load.audio('ao_mystery', '../assets/galaxy-blaster/sounds/sfx_twoTone.ogg'); + } + create() { + this.initBase(); + // Responsive sizing — scale the grid to fill ~70% of screen width + SCALE = Math.min(W / 1920, H / 1080); + const s = Math.max(SCALE, 0.5); + // Size the grid relative to screen, not a fixed pixel size + this.alienCellW = Math.round(W * 0.055); // ~85% of original — tighter grid + this.alienCellH = Math.round(this.alienCellW * 0.8); + this.alienW = Math.round(this.alienCellW * 0.6); + this.alienH = Math.round(this.alienCellH * 0.55); + this.playerW = Math.round(this.alienCellW * 0.85); + this.playerH = Math.round(this.playerW * 0.55); + this.bulletW = Math.round(4 * s); + this.bulletH = Math.round(12 * s); + this.marchStepX = Math.round(this.alienCellW * 0.25); // bigger steps → hit edges sooner + this.marchDrop = Math.round(this.alienCellH * 0.6); // bigger drops → descend faster + // Reset state + this.score = 0; + this.lives = 3; + this.wave = 0; + this.playerAlive = true; + this.gameOverFlag = false; + this.invincibleTimer = INVINCIBLE_TIME; + this.respawnTimer = 0; + this.waveDelay = 0; + this.marchDir = 1; + this.marchTimer = 0; + this.marchInterval = BASE_MARCH_INTERVAL; + this.playerBullets = []; + this.alienBullets = []; + this.aliens = []; + this.shields = []; + this.mystery = null; + this.mysteryTimer = MYSTERY_INTERVAL_MIN + Math.random() * (MYSTERY_INTERVAL_MAX - MYSTERY_INTERVAL_MIN); + this.stars = []; + this.ensureSparkTexture(); + // Starfield + this.stars = this.createStarfield([ + { count: 40, speed: 10, size: 1, alpha: 0.2 }, + { count: 25, speed: 20, size: 1.5, alpha: 0.3 }, + { count: 10, speed: 40, size: 2, alpha: 0.4 }, + ]); + // Player position — bottom of screen with padding + this.playerX = W / 2; + this.playerY = H * 0.92; + this.playerGfx = this.add.graphics().setDepth(10); + this.drawPlayer(); + // Input + this.cursors = this.input.keyboard.createCursorKeys(); + this.spaceKey = this.input.keyboard.addKey('SPACE'); + this.spaceWasDown = false; + // HUD + this.syncLivesToHUD(); + this.syncScoreToHUD(); + this.loadHighScore(); + this.startWithReadyScreen(() => this.startWave()); + } + update(_t, dtMs) { + if (this.gameOverFlag || !this.cursors) + return; + const dt = Math.min(dtMs, 33); + const dtSec = dt / 1000; + this.updateStarfield(this.stars, dt); + // Respawn delay + if (this.respawnTimer > 0) { + this.respawnTimer -= dt; + if (this.respawnTimer <= 0) + this.respawnPlayer(); + } + // Player input + if (this.playerAlive) { + this.updatePlayerInput(dtSec); + } + // Invincibility flicker + if (this.invincibleTimer > 0) { + this.invincibleTimer -= dt; + if (this.playerGfx) { + this.playerGfx.setAlpha(Math.sin(performance.now() / 80) > 0 ? 1 : 0.2); + } + } + else if (this.playerGfx) { + this.playerGfx.setAlpha(1); + } + // Alien march + this.marchTimer += dt; + if (this.marchTimer >= this.marchInterval) { + this.marchTimer = 0; + this.marchAliens(); + } + // Alien shooting + this.alienFireTimer += dt; + const fireInterval = Math.max(400, ALIEN_FIRE_INTERVAL - this.wave * 80); + if (this.alienFireTimer >= fireInterval) { + this.alienFireTimer = 0; + this.alienShoot(); + } + // Update bullets + this.updatePlayerBullets(dtSec); + this.updateAlienBullets(dtSec); + // Mystery ship + this.updateMystery(dt, dtSec); + // Collisions + this.checkCollisions(); + // Wave clear + if (this.waveDelay > 0) { + this.waveDelay -= dt; + if (this.waveDelay <= 0) + this.startWave(); + } + else if (this.aliens.filter(a => a.alive).length === 0 && this.waveDelay <= 0) { + this.waveDelay = 1500; + } + } + /* ================================================================ + PLAYER + ================================================================ */ + drawPlayer() { + const g = this.playerGfx; + g.clear(); + g.setPosition(this.playerX, this.playerY); + const hw = this.playerW / 2; + const hh = this.playerH / 2; + const turretW = hw * 0.2; + const turretH = hh * 0.6; + // Shadow + g.fillStyle(0x000000, 0.5); + g.fillRect(-hw - 1, -hh - 1, this.playerW + 2, this.playerH + 2); + g.fillRect(-turretW - 1, -hh - turretH - 1, turretW * 2 + 2, turretH + 2); + // Body (bright green) + g.fillStyle(0x00ff66, 1); + g.fillRect(-hw, -hh, this.playerW, this.playerH); + // Turret + g.fillStyle(0x00ff66, 1); + g.fillRect(-turretW, -hh - turretH, turretW * 2, turretH); + // Cockpit highlight + g.fillStyle(0xaaffcc, 0.6); + g.fillRect(-hw * 0.3, -hh * 0.5, hw * 0.6, hh * 0.6); + } + updatePlayerInput(dtSec) { + if (!this.cursors) + return; + if (this.cursors.left.isDown) { + this.playerX -= PLAYER_SPEED * dtSec; + } + if (this.cursors.right.isDown) { + this.playerX += PLAYER_SPEED * dtSec; + } + // Clamp to screen + const hw = this.playerW / 2; + this.playerX = Math.max(hw, Math.min(W - hw, this.playerX)); + this.drawPlayer(); + // Fire + const spaceDown = this.spaceKey.isDown; + if (spaceDown && !this.spaceWasDown && this.playerBullets.length < 2) { + this.firePlayerBullet(); + } + this.spaceWasDown = spaceDown; + } + respawnPlayer() { + this.playerX = W / 2; + this.playerAlive = true; + this.invincibleTimer = INVINCIBLE_TIME; + if (this.playerGfx) { + this.playerGfx.setVisible(true); + } + this.drawPlayer(); + } + /* ================================================================ + PLAYER BULLETS + ================================================================ */ + firePlayerBullet() { + this.sound.play('ao_laser', { volume: 0.3 }); + const gfx = this.add.graphics().setDepth(8); + const bx = this.playerX; + const by = this.playerY - this.playerH / 2; + // Glow + gfx.fillStyle(0x00ffff, 0.3); + gfx.fillRect(-this.bulletW, -this.bulletH, this.bulletW * 2, this.bulletH * 2); + // Solid + gfx.fillStyle(0x00ffff, 1); + gfx.fillRect(-this.bulletW / 2, -this.bulletH / 2, this.bulletW, this.bulletH); + gfx.setPosition(bx, by); + this.playerBullets.push({ gfx, x: bx, y: by }); + } + updatePlayerBullets(dtSec) { + for (let i = this.playerBullets.length - 1; i >= 0; i--) { + const b = this.playerBullets[i]; + b.y -= PLAYER_BULLET_SPEED * dtSec; + b.gfx.setPosition(b.x, b.y); + if (b.y < -this.bulletH) { + b.gfx.destroy(); + this.playerBullets.splice(i, 1); + } + } + } + /* ================================================================ + ALIENS + ================================================================ */ + startWave() { + this.wave++; + this.level = this.wave; + this.syncLevelToHUD(); + this.showWaveBanner(this.wave); + // Clear leftover bullets + for (const b of this.playerBullets) + b.gfx.destroy(); + this.playerBullets = []; + for (const b of this.alienBullets) + b.gfx.destroy(); + this.alienBullets = []; + // Reset march + this.marchDir = 1; + this.marchTimer = 0; + this.alienFireTimer = 0; + // Calculate grid start position (centered) + const gridW = ALIEN_COLS * this.alienCellW; + this.alienGridX = (W - gridW) / 2; + this.alienGridY = Math.max(H * 0.20, 120); + // Create aliens + for (const a of this.aliens) + a.gfx.destroy(); + this.aliens = []; + for (let row = 0; row < ALIEN_ROWS; row++) { + const typeIdx = row === 0 ? 0 : row <= 2 ? 1 : 2; + for (let col = 0; col < ALIEN_COLS; col++) { + const x = this.alienGridX + col * this.alienCellW + this.alienCellW / 2; + const y = this.alienGridY + row * this.alienCellH + this.alienCellH / 2; + const gfx = this.add.graphics().setDepth(5); + const alien = { gfx, row, col, type: typeIdx, alive: true, x, y, frame: 0 }; + this.drawAlien(alien); + this.aliens.push(alien); + } + } + this.updateMarchInterval(); + // Recreate shields on first wave only + if (this.wave === 1) { + this.createShields(); + } + } + drawAlien(alien) { + const g = alien.gfx; + g.clear(); + g.setPosition(alien.x, alien.y); + const type = ALIEN_TYPES[alien.type]; + const hw = this.alienW / 2; + const hh = this.alienH / 2; + const px = Math.max(2, Math.round(this.alienW / 10)); // pixel unit size + // Draw pixel-art alien based on type + g.fillStyle(type.color, 1); + if (type.name === 'squid') { + // Squid alien — narrow top, wider middle + g.fillRect(-px, -hh, px * 2, px); // top antenna + g.fillRect(-px * 2, -hh + px, px * 4, px); // head top + g.fillRect(-px * 3, -hh + px * 2, px * 6, px * 2); // head body + g.fillRect(-px * 4, -hh + px * 4, px * 8, px); // wider + g.fillRect(-px * 3, -hh + px * 5, px * 6, px); // middle + if (alien.frame === 0) { + // legs out + g.fillRect(-px * 4, -hh + px * 6, px * 2, px); + g.fillRect(px * 2, -hh + px * 6, px * 2, px); + } + else { + // legs in + g.fillRect(-px * 2, -hh + px * 6, px * 2, px); + g.fillRect(0, -hh + px * 6, px * 2, px); + } + } + else if (type.name === 'crab') { + // Crab alien — classic shape with claws + g.fillRect(-px, -hh, px * 2, px); // antenna + g.fillRect(-px * 3, -hh + px, px * 6, px); // top + g.fillRect(-px * 4, -hh + px * 2, px * 8, px * 2); // body + g.fillRect(-px * 5, -hh + px * 4, px * 10, px); // wide row + g.fillRect(-px * 4, -hh + px * 5, px * 8, px); // narrower + // Eyes (dark cutouts) + g.fillStyle(0x000000, 1); + g.fillRect(-px * 2, -hh + px * 2, px, px); + g.fillRect(px, -hh + px * 2, px, px); + g.fillStyle(type.color, 1); + if (alien.frame === 0) { + g.fillRect(-px * 5, -hh + px * 5, px, px * 2); + g.fillRect(px * 4, -hh + px * 5, px, px * 2); + } + else { + g.fillRect(-px * 3, -hh + px * 6, px * 2, px); + g.fillRect(px, -hh + px * 6, px * 2, px); + } + } + else { + // Octopus alien — round with tentacles + g.fillRect(-px * 2, -hh, px * 4, px); // top + g.fillRect(-px * 4, -hh + px, px * 8, px * 2); // upper body + g.fillRect(-px * 5, -hh + px * 3, px * 10, px * 2); // body + g.fillRect(-px * 4, -hh + px * 5, px * 8, px); // lower + // Eyes + g.fillStyle(0x000000, 1); + g.fillRect(-px * 3, -hh + px * 2, px * 2, px); + g.fillRect(px, -hh + px * 2, px * 2, px); + g.fillStyle(type.color, 1); + if (alien.frame === 0) { + // tentacles down/out + g.fillRect(-px * 5, -hh + px * 6, px * 2, px); + g.fillRect(-px * 2, -hh + px * 6, px, px); + g.fillRect(px, -hh + px * 6, px, px); + g.fillRect(px * 3, -hh + px * 6, px * 2, px); + } + else { + // tentacles up/in + g.fillRect(-px * 4, -hh + px * 6, px * 2, px); + g.fillRect(-px, -hh + px * 6, px * 2, px); + g.fillRect(px * 2, -hh + px * 6, px * 2, px); + } + } + } + marchAliens() { + const alive = this.aliens.filter(a => a.alive); + if (alive.length === 0) + return; + // Check if any alien hit the edge + let hitEdge = false; + const margin = this.alienCellW * 0.3; + for (const a of alive) { + if (this.marchDir === 1 && a.x + this.alienW / 2 + this.marchStepX > W - margin) { + hitEdge = true; + break; + } + if (this.marchDir === -1 && a.x - this.alienW / 2 - this.marchStepX < margin) { + hitEdge = true; + break; + } + } + if (hitEdge) { + // Drop down and reverse + this.marchDir *= -1; + for (const a of alive) { + a.y += this.marchDrop; + a.frame = 1 - a.frame; + this.drawAlien(a); + // Check if aliens reached player row — instant game over (classic rules) + if (a.y + this.alienH / 2 >= this.playerY - this.playerH / 2) { + this.triggerGameOver(); + return; + } + } + } + else { + // March sideways + for (const a of alive) { + a.x += this.marchStepX * this.marchDir; + a.frame = 1 - a.frame; + this.drawAlien(a); + } + } + // Play march sound (alternate tone) + this.sound.play('ao_twoTone', { volume: 0.15 }); + } + updateMarchInterval() { + const aliveCount = this.aliens.filter(a => a.alive).length; + const total = ALIEN_COLS * ALIEN_ROWS; + if (total === 0) + return; + // Exponential speed-up as aliens are destroyed + const ratio = aliveCount / total; + this.marchInterval = MIN_MARCH_INTERVAL + (BASE_MARCH_INTERVAL - MIN_MARCH_INTERVAL) * ratio; + // Wave speed bonus + this.marchInterval = Math.max(MIN_MARCH_INTERVAL, this.marchInterval - this.wave * 20); + } + /* ================================================================ + ALIEN SHOOTING + ================================================================ */ + alienShoot() { + const alive = this.aliens.filter(a => a.alive); + if (alive.length === 0) + return; + // Find bottommost alien in each column, then pick one at random + const bottomAliens = []; + for (let col = 0; col < ALIEN_COLS; col++) { + const colAliens = alive.filter(a => a.col === col); + if (colAliens.length > 0) { + colAliens.sort((a, b) => b.row - a.row); + bottomAliens.push(colAliens[0]); + } + } + if (bottomAliens.length === 0) + return; + const shooter = bottomAliens[Math.floor(Math.random() * bottomAliens.length)]; + const gfx = this.add.graphics().setDepth(7); + // Alien bullet — different color (yellow/red) + gfx.fillStyle(0xffaa00, 0.4); + gfx.fillRect(-this.bulletW, -this.bulletH / 2, this.bulletW * 2, this.bulletH); + gfx.fillStyle(0xff4444, 1); + gfx.fillRect(-this.bulletW / 2, -this.bulletH / 2, this.bulletW, this.bulletH); + gfx.setPosition(shooter.x, shooter.y + this.alienH / 2); + this.alienBullets.push({ gfx, x: shooter.x, y: shooter.y + this.alienH / 2 }); + } + updateAlienBullets(dtSec) { + for (let i = this.alienBullets.length - 1; i >= 0; i--) { + const b = this.alienBullets[i]; + b.y += ALIEN_BULLET_SPEED * dtSec; + b.gfx.setPosition(b.x, b.y); + if (b.y > H + this.bulletH) { + b.gfx.destroy(); + this.alienBullets.splice(i, 1); + } + } + } + /* ================================================================ + MYSTERY SHIP + ================================================================ */ + spawnMystery() { + const dir = Math.random() < 0.5 ? 1 : -1; + const x = dir === 1 ? -40 : W + 40; + // Position just above the alien grid, below the HUD + const y = this.alienGridY - this.alienCellH * 1.2; + const gfx = this.add.graphics().setDepth(12); + this.mystery = { gfx, x, y, direction: dir, active: true }; + this.drawMystery(); + this.sound.play('ao_mystery', { volume: 0.2 }); + } + drawMystery() { + if (!this.mystery) + return; + const g = this.mystery.gfx; + g.clear(); + g.setPosition(this.mystery.x, this.mystery.y); + const s = Math.max(SCALE, 0.5); + const w = 30 * s; + const h = 12 * s; + // Saucer shape + g.fillStyle(0x000000, 0.5); + g.fillEllipse(0, 0, w * 2 + 2, h + 2); + g.fillStyle(0xff00ff, 0.8); + g.fillEllipse(0, 0, w * 2, h); + // Dome + g.fillStyle(0xff66ff, 1); + g.fillEllipse(0, -h * 0.4, w, h * 0.7); + // Lights + g.fillStyle(0xffff00, 1); + g.fillCircle(-w * 0.5, 0, 2 * s); + g.fillCircle(0, 0, 2 * s); + g.fillCircle(w * 0.5, 0, 2 * s); + } + updateMystery(dt, dtSec) { + if (this.mystery && this.mystery.active) { + this.mystery.x += MYSTERY_SPEED * this.mystery.direction * dtSec; + this.drawMystery(); + // Off screen? + if ((this.mystery.direction === 1 && this.mystery.x > W + 60) || + (this.mystery.direction === -1 && this.mystery.x < -60)) { + this.mystery.gfx.destroy(); + this.mystery = null; + } + } + else { + this.mysteryTimer -= dt; + if (this.mysteryTimer <= 0) { + this.mysteryTimer = MYSTERY_INTERVAL_MIN + Math.random() * (MYSTERY_INTERVAL_MAX - MYSTERY_INTERVAL_MIN); + this.spawnMystery(); + } + } + } + /* ================================================================ + SHIELDS + ================================================================ */ + createShields() { + // Clear existing + for (const shield of this.shields) { + for (const block of shield) { + if (block.gfx) + block.gfx.destroy(); + } + } + this.shields = []; + const s = Math.max(SCALE, 0.5); + // Original shields were ~6% of screen height tall; derive block size from that + const targetShieldH = H * 0.055; + const blockH = Math.max(2, Math.round(targetShieldH / SHIELD_BLOCK_ROWS)); + const blockW = blockH; + const shieldW = SHIELD_BLOCK_COLS * blockW; + const shieldH = SHIELD_BLOCK_ROWS * blockH; + const totalShieldsW = SHIELD_COUNT * shieldW; + const gap = (W - totalShieldsW) / (SHIELD_COUNT + 1); + const shieldY = this.playerY - this.playerH - shieldH - 20; + // Classic shield shape mask (inverted U) + const shieldMask = this.generateShieldMask(); + for (let si = 0; si < SHIELD_COUNT; si++) { + const shieldX = gap + si * (shieldW + gap); + const blocks = []; + for (let r = 0; r < SHIELD_BLOCK_ROWS; r++) { + for (let c = 0; c < SHIELD_BLOCK_COLS; c++) { + if (!shieldMask[r][c]) + continue; + const bx = shieldX + c * blockW; + const by = shieldY + r * blockH; + const gfx = this.add.graphics().setDepth(6); + gfx.fillStyle(0x00ff66, 1); + gfx.fillRect(0, 0, blockW, blockH); + gfx.setPosition(bx, by); + blocks.push({ gfx, x: bx, y: by, w: blockW, h: blockH, alive: true }); + } + } + this.shields.push(blocks); + } + } + generateShieldMask() { + const mask = []; + for (let r = 0; r < SHIELD_BLOCK_ROWS; r++) { + mask[r] = []; + for (let c = 0; c < SHIELD_BLOCK_COLS; c++) { + // Round top + if (r < 4) { + const center = SHIELD_BLOCK_COLS / 2; + const dist = Math.abs(c - center + 0.5); + const maxDist = (SHIELD_BLOCK_COLS / 2) * (1 - r * 0.05); + mask[r][c] = dist < maxDist; + } + // Middle — solid + else if (r < SHIELD_BLOCK_ROWS - 5) { + mask[r][c] = true; + } + // Bottom — cut out arch + else { + const center = SHIELD_BLOCK_COLS / 2; + const dist = Math.abs(c - center + 0.5); + const archRow = r - (SHIELD_BLOCK_ROWS - 5); + const archWidth = 3 + archRow * 0.8; + mask[r][c] = dist > archWidth; + } + } + } + return mask; + } + /* ================================================================ + COLLISIONS + ================================================================ */ + checkCollisions() { + // Player bullets vs aliens + for (let bi = this.playerBullets.length - 1; bi >= 0; bi--) { + const b = this.playerBullets[bi]; + let hit = false; + for (const a of this.aliens) { + if (!a.alive) + continue; + if (this.rectOverlap(b.x - this.bulletW / 2, b.y - this.bulletH / 2, this.bulletW, this.bulletH, a.x - this.alienW / 2, a.y - this.alienH / 2, this.alienW, this.alienH)) { + a.alive = false; + a.gfx.setVisible(false); + this.addScore(ALIEN_TYPES[a.type].points, a.x, a.y); + this.spawnExplosion(a.x, a.y, ALIEN_TYPES[a.type].color); + this.sound.play('ao_explosion', { volume: 0.25 }); + this.updateMarchInterval(); + hit = true; + break; + } + } + // Player bullets vs mystery + if (!hit && this.mystery && this.mystery.active) { + const mw = 30 * Math.max(SCALE, 0.5); + const mh = 12 * Math.max(SCALE, 0.5); + if (this.rectOverlap(b.x - this.bulletW / 2, b.y - this.bulletH / 2, this.bulletW, this.bulletH, this.mystery.x - mw, this.mystery.y - mh / 2, mw * 2, mh)) { + const mysteryPoints = [50, 100, 150, 300][Math.floor(Math.random() * 4)]; + this.addScore(mysteryPoints, this.mystery.x, this.mystery.y); + this.spawnExplosion(this.mystery.x, this.mystery.y, 0xff00ff); + this.sound.play('ao_explosion', { volume: 0.3 }); + this.mystery.gfx.destroy(); + this.mystery = null; + hit = true; + } + } + // Player bullets vs shields + if (!hit) { + for (const shield of this.shields) { + for (const block of shield) { + if (!block.alive) + continue; + if (this.rectOverlap(b.x - this.bulletW / 2, b.y - this.bulletH / 2, this.bulletW, this.bulletH, block.x, block.y, block.w, block.h)) { + block.alive = false; + block.gfx.destroy(); + hit = true; + break; + } + } + if (hit) + break; + } + } + if (hit) { + b.gfx.destroy(); + this.playerBullets.splice(bi, 1); + } + } + // Alien bullets vs player + if (this.playerAlive && this.invincibleTimer <= 0) { + for (let bi = this.alienBullets.length - 1; bi >= 0; bi--) { + const b = this.alienBullets[bi]; + if (this.rectOverlap(b.x - this.bulletW / 2, b.y - this.bulletH / 2, this.bulletW, this.bulletH, this.playerX - this.playerW / 2, this.playerY - this.playerH / 2, this.playerW, this.playerH)) { + b.gfx.destroy(); + this.alienBullets.splice(bi, 1); + this.playerHit(); + break; + } + } + } + // Alien bullets vs shields + for (let bi = this.alienBullets.length - 1; bi >= 0; bi--) { + const b = this.alienBullets[bi]; + let hit = false; + for (const shield of this.shields) { + for (const block of shield) { + if (!block.alive) + continue; + if (this.rectOverlap(b.x - this.bulletW / 2, b.y - this.bulletH / 2, this.bulletW, this.bulletH, block.x, block.y, block.w, block.h)) { + block.alive = false; + block.gfx.destroy(); + hit = true; + break; + } + } + if (hit) + break; + } + if (hit) { + b.gfx.destroy(); + this.alienBullets.splice(bi, 1); + } + } + // Aliens vs shields (aliens marching into shields) + for (const a of this.aliens) { + if (!a.alive) + continue; + for (const shield of this.shields) { + for (const block of shield) { + if (!block.alive) + continue; + if (this.rectOverlap(a.x - this.alienW / 2, a.y - this.alienH / 2, this.alienW, this.alienH, block.x, block.y, block.w, block.h)) { + block.alive = false; + block.gfx.destroy(); + } + } + } + } + } + rectOverlap(x1, y1, w1, h1, x2, y2, w2, h2) { + return x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2; + } + playerHit() { + if (this.gameOverFlag) + return; + this.lives--; + this.syncLivesToHUD(); + this.sound.play('ao_lose', { volume: 0.4 }); + this.spawnExplosion(this.playerX, this.playerY, 0x00ff66); + if (this.lives <= 0) { + this.triggerGameOver(); + } + else { + this.playerAlive = false; + this.playerGfx.setVisible(false); + this.respawnTimer = 1200; + } + } + triggerGameOver() { + this.gameOverFlag = true; + this.playerAlive = false; + this.playerGfx.setVisible(false); + // Clear all bullets + for (const b of this.playerBullets) + b.gfx.destroy(); + this.playerBullets = []; + for (const b of this.alienBullets) + b.gfx.destroy(); + this.alienBullets = []; + this.showGameOver(this.score, () => { + this.gameOverFlag = false; + this.scene.restart(); + }); + } + /* ================================================================ + EFFECTS + ================================================================ */ + spawnExplosion(x, y, color) { + this.spawnParticleExplosion(x, y, color, 10); + } + /* ================================================================ + SHUTDOWN + ================================================================ */ + shutdown() { + super.shutdown(); + // Clean up transient DOM + const banner = document.getElementById('wave-banner'); + if (banner) + banner.remove(); + // Clean up graphics + for (const a of this.aliens) + a.gfx?.destroy(); + for (const b of this.playerBullets) + b.gfx?.destroy(); + for (const b of this.alienBullets) + b.gfx?.destroy(); + if (this.mystery) + this.mystery.gfx?.destroy(); + for (const shield of this.shields) { + for (const block of shield) + block.gfx?.destroy(); + } + } +} +//# sourceMappingURL=AlienOnslaught.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/BaseScene.js b/extensions/arcade-canvas/game/scenes/BaseScene.js new file mode 100644 index 00000000..b5b89731 --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/BaseScene.js @@ -0,0 +1,785 @@ +// BaseScene — shared contract for all Agent Arcade mini-games. +// Provides score bridge to the HTML HUD, pause/resume hooks, and +// a consistent lifecycle so the game bootstrap can swap scenes. +export let W = window.innerWidth; +export let H = window.innerHeight; +/** Call before creating the Phaser game to ensure dimensions are current. */ +export function refreshDimensions() { + W = window.innerWidth; + H = window.innerHeight; +} +export class BaseScene extends Phaser.Scene { + score = 0; + highScore = 0; + lives = 3; + level = 0; + scoreAnimTimer; + gameOverKeyListener; + /** Full-screen dark backdrop controlled by the transparency slider. */ + _backdrop = null; + /** Ready-screen state */ + _readyOverlay = null; + _readyKeyListener; + _readyOnStart; + _wasOnReadyScreen = false; + /** Timer for game-over delayed callback (cancel on shutdown to prevent leaks). */ + _gameOverDelayTimer = null; + /** Tracked particle emitters for cleanup on shutdown. */ + activeEmitters = []; + constructor(key) { + super(key); + } + /** Safe localStorage helpers */ + storageGet(key) { + try { + return localStorage.getItem(key); + } + catch { + return null; + } + } + storageSet(key, value) { + try { + localStorage.setItem(key, value); + } + catch { /* quota exceeded or disabled */ } + } + storageRemove(key) { + try { + localStorage.removeItem(key); + } + catch { /* ignore */ } + } + /** Safely destroy a Phaser game object and return null for assignment. */ + destroyObj(obj) { + if (obj) { + try { + obj.destroy(); + } + catch { } + } + return null; + } + /** Spawn a particle explosion, track the emitter, and auto-cleanup. */ + spawnParticleExplosion(x, y, color, count, lifespan = 400) { + try { + const emitter = this.add.particles(x, y, 'spark', { + speed: { min: 60, max: 180 }, + angle: { min: 0, max: 360 }, + scale: { start: 1.2, end: 0 }, + lifespan, + quantity: count, + tint: color, + emitting: false, + }); + emitter.setDepth(20); + emitter.explode(count); + this.activeEmitters.push(emitter); + this.time.delayedCall(lifespan + 100, () => { + const idx = this.activeEmitters.indexOf(emitter); + if (idx >= 0) + this.activeEmitters.splice(idx, 1); + emitter.destroy(); + }); + } + catch { + // Particle system unavailable, skip + } + } + /** Load high score for this scene from localStorage. */ + loadHighScore() { + // Clean up old agentBreak keys (from before rename) + this.storageRemove(`agentBreak_board_${this.scene.key}`); + this.storageRemove(`agentBreak_hi_${this.scene.key}`); + const stored = this.storageGet(`agentArcade_hi_${this.scene.key}`); + this.highScore = stored ? parseInt(stored, 10) || 0 : 0; + this.gameOverShown = false; + this.syncHighScoreToHUD(); + } + /** + * Common create() setup. Call at the start of every scene's create(). + * Registers pause bridge, shutdown listener, and resets shared state. + */ + initBase() { + this.setupPauseBridge(); + this.events.once('shutdown', () => this.shutdown()); + this.createBackdrop(); + } + /** Create a full-screen dark backdrop whose alpha is controlled by the settings slider. */ + createBackdrop() { + const g = this.add.graphics().setDepth(-100); + g.fillStyle(0x000000, 1); + g.fillRect(0, 0, W, H); + g.setScrollFactor(0); + // Read saved transparency (1–100 → alpha 0.01–1.0) + let alpha = 1; + try { + const saved = localStorage.getItem('agentArcade_bgTransparency'); + if (saved !== null) + alpha = Math.max(0.01, Math.min(1, parseInt(saved, 10) / 100)); + } + catch { /* ignore */ } + g.setAlpha(alpha); + this._backdrop = g; + } + /** Called by the HUD slider to update the backdrop opacity in real time. */ + setBackdropAlpha(percent) { + if (this._backdrop) { + this._backdrop.setAlpha(Math.max(0.01, Math.min(1, percent / 100))); + } + } + /** Save high score if current score exceeds it. */ + checkHighScore() { + if (this.score > this.highScore) { + this.highScore = this.score; + this.storageSet(`agentArcade_hi_${this.scene.key}`, String(this.highScore)); + this.syncHighScoreToHUD(); + } + } + /** Push current score into the HTML HUD element. */ + syncScoreToHUD() { + const el = document.getElementById('score-value'); + if (el) + el.textContent = String(this.score); + } + /** Push high score into the HTML HUD element. */ + syncHighScoreToHUD() { + const el = document.getElementById('hi-value'); + if (el) + el.textContent = String(this.highScore); + } + /** Push lives count into the HTML HUD element. */ + syncLivesToHUD() { + const el = document.getElementById('lives-value'); + if (el) + el.textContent = String(this.lives); + } + /** Push level/wave number into the HTML HUD element. */ + syncLevelToHUD(value) { + const el = document.getElementById('level-value'); + if (el) + el.textContent = String(value ?? this.level); + } + /** Animated score bump (count-up + pop class). */ + addScore(points, worldX, worldY) { + const prev = this.score; + this.score += points; + // Floating "+N" text at world position + if (worldX !== undefined && worldY !== undefined) { + const txt = this.add.text(worldX, worldY, `+${points}`, { + fontFamily: '"Press Start 2P", monospace', + fontSize: '14px', + color: '#ffff00', + stroke: '#000', + strokeThickness: 3, + }); + txt.setOrigin(0.5, 0.5).setDepth(900); + this.tweens.add({ + targets: txt, + y: worldY - 50, + alpha: 0, + duration: 800, + onComplete: () => txt.destroy(), + }); + } + // Count-up animation in HUD + const el = document.getElementById('score-value'); + if (!el) + return; + if (this.scoreAnimTimer) + clearInterval(this.scoreAnimTimer); + const start = prev; + const end = this.score; + const duration = 450; + const startTime = performance.now(); + this.scoreAnimTimer = window.setInterval(() => { + const t = Math.min(1, (performance.now() - startTime) / duration); + const ease = 1 - Math.pow(1 - t, 3); + el.textContent = String(Math.round(start + (end - start) * ease)); + if (t >= 1) { + clearInterval(this.scoreAnimTimer); + this.scoreAnimTimer = undefined; + el.classList.remove('pop'); + void el.offsetWidth; + el.classList.add('pop'); + } + }, 16); + this.checkHighScore(); + } + /** Get top 10 scores for this game from localStorage. */ + getLeaderboard() { + const stored = this.storageGet(`agentArcade_board_${this.scene.key}`); + if (!stored) + return []; + try { + const parsed = JSON.parse(stored); + if (!Array.isArray(parsed)) + return []; + return parsed.filter((n) => typeof n === 'number'); + } + catch { + return []; + } + } + /** Add a score to the leaderboard, keep top 10, return rank (1-based, 0 = not in top 10). */ + addToLeaderboard(score) { + if (score <= 0) + return 0; + const board = this.getLeaderboard(); + board.push(score); + board.sort((a, b) => b - a); + const trimmed = board.slice(0, 10); + this.storageSet(`agentArcade_board_${this.scene.key}`, JSON.stringify(trimmed)); + this.checkHighScore(); + const rank = trimmed.indexOf(score) + 1; + return rank <= 10 ? rank : 0; + } + gameOverShown = false; + /** Show game over overlay with leaderboard. Call restartFn when dismissed. */ + showGameOver(finalScore, restartFn) { + if (this.gameOverShown) + return; + this.gameOverShown = true; + const rank = this.addToLeaderboard(finalScore); + let board = this.getLeaderboard(); + // Reconcile: if stored high score isn't on the board, add it + if (this.highScore > 0 && (board.length === 0 || this.highScore > board[0])) { + board.push(this.highScore); + board.sort((a, b) => b - a); + board = board.slice(0, 10); + this.storageSet(`agentArcade_board_${this.scene.key}`, JSON.stringify(board)); + } + const overlay = document.createElement('div'); + overlay.id = 'gameover-overlay'; + overlay.style.cssText = ` + position: fixed; inset: 0; z-index: 9999; + display: flex; align-items: center; justify-content: center; + background: rgba(0,0,0,0.75); pointer-events: auto; + animation: fadeIn 0.4s ease-out; + `; + const modal = document.createElement('div'); + modal.style.cssText = ` + background: linear-gradient(145deg, #0d1b2a 0%, #1b2838 50%, #0d1b2a 100%); + border: 2px solid rgba(255,215,0,0.4); + border-radius: 20px; padding: 36px 48px; + text-align: center; min-width: 460px; max-width: 540px; + box-shadow: 0 0 60px rgba(255,215,0,0.15), 0 0 100px rgba(0,0,0,0.8), inset 0 1px 0 rgba(255,255,255,0.05); + font-family: 'Press Start 2P', 'SF Mono', monospace; + animation: scaleIn 0.3s ease-out; + `; + // Title + const title = document.createElement('h2'); + title.textContent = 'GAME OVER'; + title.style.cssText = ` + color: #ff4444; font-size: 28px; margin: 0 0 20px; + text-shadow: 0 0 20px rgba(255,68,68,0.6), 0 0 40px rgba(255,0,0,0.3); + letter-spacing: 4px; + `; + modal.appendChild(title); + // Divider + const div1 = document.createElement('div'); + div1.style.cssText = 'height: 1px; background: linear-gradient(90deg, transparent, rgba(255,215,0,0.3), transparent); margin: 0 0 20px;'; + modal.appendChild(div1); + // Score + const scoreLine = document.createElement('p'); + scoreLine.innerHTML = `YOUR SCORE
${finalScore.toLocaleString()}`; + scoreLine.style.cssText = 'color: #8899aa; font-size: 10px; margin: 0 0 12px; letter-spacing: 2px; line-height: 2.2;'; + modal.appendChild(scoreLine); + // Rank badge + if (rank === 1) { + const badge = document.createElement('div'); + badge.innerHTML = '🏆 NEW HIGH SCORE!'; + badge.style.cssText = ` + color: #ffd700; font-size: 13px; margin: 8px 0 16px; + padding: 8px 16px; border-radius: 8px; + background: rgba(255,215,0,0.1); border: 1px solid rgba(255,215,0,0.3); + display: inline-block; + text-shadow: 0 0 8px rgba(255,215,0,0.4); + `; + modal.appendChild(badge); + } + else if (rank > 0) { + const badge = document.createElement('div'); + badge.textContent = `#${rank} ON LEADERBOARD`; + badge.style.cssText = ` + color: #4fc3f7; font-size: 11px; margin: 8px 0 16px; + padding: 6px 14px; border-radius: 8px; + background: rgba(79,195,247,0.1); border: 1px solid rgba(79,195,247,0.2); + display: inline-block; + `; + modal.appendChild(badge); + } + else { + const spacer = document.createElement('div'); + spacer.style.cssText = 'height: 12px;'; + modal.appendChild(spacer); + } + // Divider + const div2 = document.createElement('div'); + div2.style.cssText = 'height: 1px; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); margin: 12px 0 16px;'; + modal.appendChild(div2); + // Leaderboard header + const boardTitle = document.createElement('p'); + boardTitle.textContent = '─── TOP 10 ───'; + boardTitle.style.cssText = 'color: #667; font-size: 9px; margin: 0 0 10px; letter-spacing: 3px;'; + modal.appendChild(boardTitle); + // Score list + const table = document.createElement('div'); + table.style.cssText = 'margin: 0 auto; display: inline-block; width: 100%;'; + board.forEach((s, i) => { + const isMe = (i === rank - 1); + const row = document.createElement('div'); + row.style.cssText = ` + display: flex; justify-content: space-between; align-items: center; + font-size: 16px; padding: 8px 16px; margin: 3px 0; + border-radius: 8px; + background: ${isMe ? 'rgba(255,235,59,0.12)' : (i % 2 === 0 ? 'rgba(255,255,255,0.03)' : 'transparent')}; + ${isMe ? 'border: 1px solid rgba(255,235,59,0.25);' : ''} + `; + const rankEl = document.createElement('span'); + const medal = i === 0 ? '🥇' : i === 1 ? '🥈' : i === 2 ? '🥉' : `${i + 1}.`; + rankEl.textContent = medal; + rankEl.style.cssText = ` + color: ${isMe ? '#ffeb3b' : '#778'}; + min-width: 42px; text-align: left; + font-size: ${i < 3 ? '20px' : '16px'}; + `; + const scoreEl = document.createElement('span'); + scoreEl.textContent = s.toLocaleString(); + scoreEl.style.cssText = ` + color: ${isMe ? '#ffeb3b' : '#bcc'}; + font-size: ${i < 3 ? '20px' : '16px'}; + font-weight: ${i < 3 ? '900' : '700'}; + ${isMe ? 'text-shadow: 0 0 10px rgba(255,235,59,0.5);' : ''} + `; + if (isMe) { + const youTag = document.createElement('span'); + youTag.textContent = '◄'; + youTag.style.cssText = 'color: #ffeb3b; font-size: 10px; margin-left: 6px;'; + scoreEl.appendChild(youTag); + } + row.appendChild(rankEl); + row.appendChild(scoreEl); + table.appendChild(row); + }); + // Fill empty slots + for (let i = board.length; i < 10; i++) { + const row = document.createElement('div'); + row.style.cssText = ` + display: flex; justify-content: space-between; + font-size: 16px; padding: 8px 16px; margin: 3px 0; + color: #334; + `; + row.innerHTML = `${i + 1}.---`; + table.appendChild(row); + } + modal.appendChild(table); + // Restart button — matches .help-close style from settings/help dialogs + const restartBtn = document.createElement('button'); + restartBtn.textContent = 'RESTART'; + restartBtn.style.cssText = ` + display: block; margin: 22px auto 0; width: 100%; padding: 9px; + background: linear-gradient(180deg, #ffd54a 0%, #c9a020 100%); + border: 1px solid rgba(255, 255, 255, 0.25); border-radius: 8px; + color: #1a1a1a; font-weight: 700; letter-spacing: 1px; font-size: 13px; + cursor: pointer; transition: filter 120ms; + `; + restartBtn.addEventListener('mouseenter', () => { restartBtn.style.filter = 'brightness(1.15)'; }); + restartBtn.addEventListener('mouseleave', () => { restartBtn.style.filter = ''; }); + modal.appendChild(restartBtn); + overlay.appendChild(modal); + document.body.appendChild(overlay); + // Disable click-through so the overlay is interactive + const ti = window.__TAURI_INTERNALS__; + if (ti) + ti.invoke('set_click_through', { enabled: false }); + const dismiss = () => { + this.gameOverShown = false; + document.removeEventListener('keydown', onKey); + overlay.remove(); + // Re-enable click-through + if (ti) + ti.invoke('set_click_through', { enabled: true }); + restartFn(); + }; + const onKey = (ev) => { + if (ev.code === 'Space' || ev.code === 'Enter') { + ev.preventDefault(); + dismiss(); + } + }; + this.gameOverKeyListener = onKey; + // Brief delay before accepting input (prevent accidental dismiss). + // Guard against the scene being stopped during the delay. + this._gameOverDelayTimer = this.time.delayedCall(500, () => { + if (!this.scene.isActive()) + return; + document.addEventListener('keydown', onKey); + restartBtn.addEventListener('click', dismiss); + }); + } + // ── Ready screen ─────────────────────────────────────────────────────────── + /** + * Freeze the scene and show the "Press any key to start" screen. + * Call as the LAST statement in every scene's create() so all game objects + * exist but nothing moves until the player is ready. + * @param onStart Optional callback invoked the moment the player presses a + * key and the scene resumes — use this to defer first-wave setup so it + * doesn't render on top of the ready screen. + */ + startWithReadyScreen(onStart) { + this._readyOnStart = onStart; + this.scene.pause(); + this.sound.stopAll(); // stop any sounds that fired during create() + this._showPressAnyKey(); + } + _showPressAnyKey() { + this._cleanupReadyScreen(); + if (!document.getElementById('ready-screen-style')) { + const style = document.createElement('style'); + style.id = 'ready-screen-style'; + style.textContent = ` + @keyframes readyBlink { 0%,100%{opacity:1} 50%{opacity:.3} } + @keyframes readyGlow { 0%,100%{text-shadow:0 0 10px rgba(0,200,255,0.6),0 0 30px rgba(0,200,255,0.3)} 50%{text-shadow:0 0 20px rgba(0,200,255,0.9),0 0 50px rgba(0,200,255,0.5),0 0 80px rgba(0,100,255,0.2)} } + @keyframes titleShimmer { 0%{background-position:200% center} 100%{background-position:-200% center} } + @keyframes titleFloat { 0%,100%{transform:translateY(0)} 50%{transform:translateY(-6px)} } + @keyframes neonPulse { 0%,100%{filter:drop-shadow(0 0 15px rgba(0,255,136,0.8)) drop-shadow(0 0 40px rgba(0,255,136,0.4)) drop-shadow(0 0 80px rgba(0,255,136,0.2))} 50%{filter:drop-shadow(0 0 25px rgba(0,255,136,1)) drop-shadow(0 0 60px rgba(0,255,136,0.6)) drop-shadow(0 0 120px rgba(0,255,136,0.3))} } + @keyframes dividerPulse { 0%,100%{opacity:0.6;width:280px} 50%{opacity:1;width:360px} } + @keyframes fadeSlideUp { from{opacity:0;transform:translateY(20px)} to{opacity:1;transform:translateY(0)} } + @keyframes starTwinkle { 0%,100%{opacity:0.2} 50%{opacity:1} } + `; + document.head.appendChild(style); + } + const overlay = document.createElement('div'); + overlay.id = 'ready-overlay'; + overlay.style.cssText = ` + position:fixed;inset:0;z-index:8000;pointer-events:none; + display:flex;flex-direction:column;align-items:center;justify-content:center; + background:radial-gradient(ellipse at 50% 40%,rgba(0,15,60,0.80) 0%,rgba(0,5,20,0.92) 60%,rgba(0,0,0,0.95) 100%); + `; + // Decorative star particles + for (let i = 0; i < 40; i++) { + const star = document.createElement('div'); + const size = Math.random() < 0.3 ? 3 : 2; + const x = Math.random() * 100; + const y = Math.random() * 100; + const delay = Math.random() * 3; + const dur = 1.5 + Math.random() * 2; + star.style.cssText = ` + position:absolute;left:${x}%;top:${y}%;width:${size}px;height:${size}px; + background:#fff;border-radius:50%; + animation:starTwinkle ${dur}s ease-in-out ${delay}s infinite; + opacity:0.3; + `; + overlay.appendChild(star); + } + // Main content wrapper — styled panel matching the game-over dialog + const content = document.createElement('div'); + content.style.cssText = ` + display:flex;flex-direction:column;align-items:center; + animation:fadeSlideUp 0.6s ease-out both; + position:relative;z-index:1; + background:linear-gradient(145deg,#0d1b2a 0%,#1b2838 50%,#0d1b2a 100%); + border:2px solid rgba(0,200,255,0.25); + border-radius:20px;padding:42px 56px; + box-shadow:0 0 60px rgba(0,200,255,0.1),0 0 100px rgba(0,0,0,0.8),inset 0 1px 0 rgba(255,255,255,0.05); + max-width:700px; + `; + const title = document.createElement('div'); + title.textContent = this.displayName.toUpperCase(); + title.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:48px;letter-spacing:6px; + -webkit-text-stroke:2px rgba(0,255,136,0.3); + background:linear-gradient(90deg,#00ff88,#ffffff,#00ff88,#ffffff,#00ff88); + background-size:200% auto; + -webkit-background-clip:text;-webkit-text-fill-color:transparent; + background-clip:text; + animation:titleShimmer 8s linear infinite,titleFloat 4s ease-in-out infinite,neonPulse 3s ease-in-out infinite; + margin-bottom:22px; + `; + const divider = document.createElement('div'); + divider.style.cssText = ` + width:320px;height:2px;margin-bottom:20px; + background:linear-gradient(90deg,transparent 0%,#00c8ff 20%,#ff6b35 50%,#00c8ff 80%,transparent 100%); + border-radius:1px;box-shadow:0 0 12px rgba(0,200,255,0.4); + animation:dividerPulse 3s ease-in-out infinite; + `; + const prompt = document.createElement('div'); + prompt.textContent = 'PRESS ANY KEY TO START'; + prompt.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:16px;letter-spacing:4px; + color:#fff; + animation:readyBlink 1.4s ease-in-out infinite,readyGlow 2s ease-in-out infinite; + text-shadow:0 0 15px rgba(0,200,255,0.8); + `; + content.appendChild(title); + const desc = this.getDescription(); + if (desc) { + const descEl = document.createElement('div'); + descEl.textContent = desc; + descEl.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:14px;letter-spacing:1px; + color:#d0e8ff;max-width:700px;text-align:center;line-height:2; + margin-bottom:18px; + text-shadow:0 0 10px rgba(150,210,255,0.4); + `; + content.appendChild(descEl); + } + content.appendChild(divider); + // Show control hints if the scene provides them + const controls = this.getControls(); + if (controls.length > 0) { + const controlsDiv = document.createElement('div'); + controlsDiv.style.cssText = ` + margin-top:24px;padding:18px 28px; + background:linear-gradient(135deg,rgba(0,20,60,0.6) 0%,rgba(0,10,40,0.7) 100%); + border:1px solid rgba(0,200,255,0.2); + border-radius:12px;display:inline-block; + box-shadow:0 4px 20px rgba(0,0,0,0.3),inset 0 1px 0 rgba(255,255,255,0.05); + backdrop-filter:blur(4px); + `; + const controlsTitle = document.createElement('div'); + controlsTitle.textContent = 'CONTROLS'; + controlsTitle.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:13px;letter-spacing:5px; + color:rgba(200,230,255,0.9);margin-bottom:16px;text-align:center; + text-shadow:0 0 8px rgba(150,200,255,0.4); + `; + controlsDiv.appendChild(controlsTitle); + for (const { key, action } of controls) { + const row = document.createElement('div'); + row.style.cssText = ` + display:flex;justify-content:space-between;align-items:center; + margin:8px 0;gap:28px; + `; + const keyEl = document.createElement('span'); + keyEl.textContent = key; + keyEl.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:15px; + color:#ffd54a;background:rgba(255,213,74,0.08); + padding:7px 16px;border-radius:6px;border:1px solid rgba(255,213,74,0.25); + min-width:90px;text-align:center; + box-shadow:0 2px 6px rgba(0,0,0,0.2),inset 0 1px 0 rgba(255,255,255,0.05); + text-shadow:0 0 6px rgba(255,213,74,0.3); + `; + const actionEl = document.createElement('span'); + actionEl.textContent = action; + actionEl.style.cssText = ` + font-family:'Press Start 2P',monospace;font-size:14px; + color:#d0dde8;text-align:left; + `; + row.appendChild(keyEl); + row.appendChild(actionEl); + controlsDiv.appendChild(row); + } + content.appendChild(controlsDiv); + } + prompt.style.cssText += 'margin-top:32px;'; + content.appendChild(prompt); + overlay.appendChild(content); + document.body.appendChild(overlay); + this._readyOverlay = overlay; + const onKey = (e) => { + if (['Meta', 'Alt', 'Control', 'Shift'].includes(e.key)) + return; + document.removeEventListener('keydown', onKey); + this._readyKeyListener = undefined; + this._cleanupReadyScreen(); + if (e.key === 'Escape') { + // Let the normal pause system take over; re-show ready screen on resume + this._wasOnReadyScreen = true; + return; + } + e.preventDefault(); + this.scene.resume(); + this._fireReadyOnStart(); + }; + this._readyKeyListener = onKey; + document.addEventListener('keydown', onKey); + } + _cleanupReadyScreen() { + if (this._readyOverlay) { + this._readyOverlay.remove(); + this._readyOverlay = null; + } + if (this._readyKeyListener) { + document.removeEventListener('keydown', this._readyKeyListener); + this._readyKeyListener = undefined; + } + } + _fireReadyOnStart() { + if (this._readyOnStart) { + const fn = this._readyOnStart; + this._readyOnStart = undefined; + fn(); + } + } + /** Called by the pause system. Override if the scene needs custom cleanup. */ + pauseGame() { + this.scene.pause(); + this.sound.pauseAll(); + } + /** Called by the resume system. Override if needed. */ + resumeGame() { + if (this._wasOnReadyScreen) { + // Re-show the ready screen instead of resuming gameplay + this._wasOnReadyScreen = false; + this._showPressAnyKey(); + return; + } + this.scene.resume(); + this.sound.resumeAll(); + this._fireReadyOnStart(); + } + /** + * Wire up the pause/resume bridge between the HUD and the Phaser scene. + * Call from create() — replaces the per-scene boilerplate that was duplicated + * in every scene previously. + */ + setupPauseBridge() { + // __agentArcadePauseScene: pauses/resumes the Phaser scene ONLY (no Rust call). + // Used by Rust-originated pause/resume to avoid feedback loops. + window.__agentArcadePauseScene = (shouldPause) => { + if (shouldPause) + this.pauseGame(); + else + this.resumeGame(); + }; + // __agentArcadePause: called from in-page UI (HUD buttons, game-switcher). + // Pauses scene AND notifies Rust to shrink/expand window. + window.__agentArcadePause = (shouldPause) => { + const ab = window.agentArcade; + if (shouldPause) + this.pauseGame(); + else + this.resumeGame(); + if (ab && ab.setClickThrough) + ab.setClickThrough(shouldPause); + if (ab && ab.setPaused) + ab.setPaused(shouldPause); + }; + const ab = window.agentArcade; + if (ab && ab.onResumeRequest) { + ab.onResumeRequest(() => { + const hud = document.getElementById('hud'); + if (hud) + hud.classList.remove('paused'); + this.resumeGame(); + }); + } + } + /** + * Show a "WAVE N" banner overlay — shared by space game scenes. + * Auto-animates in/out and removes itself after ~2.2 seconds. + */ + showWaveBanner(waveNum) { + const existing = document.getElementById('wave-banner'); + if (existing) + existing.remove(); + const banner = document.createElement('div'); + banner.id = 'wave-banner'; + banner.style.cssText = ` + position: fixed; top: 45%; left: 50%; transform: translate(-50%, -50%); + padding: 12px 36px; + background: linear-gradient(180deg, #1a1f3a 0%, #0a0e22 100%); + border: 2px solid #ffd54a; + border-radius: 12px; + box-shadow: + 0 0 0 1px rgba(255, 255, 255, 0.08) inset, + 0 6px 24px rgba(0, 0, 0, 0.7), + 0 0 22px rgba(255, 213, 74, 0.45); + font-family: -apple-system, system-ui, 'Helvetica Neue', sans-serif; + font-size: 22px; font-weight: 700; letter-spacing: 2px; + color: #ffd54a; + text-shadow: 0 0 8px rgba(255, 213, 74, 0.6); + z-index: 50; pointer-events: none; user-select: none; + animation: waveBannerIn 0.3s ease-out; + `; + banner.textContent = `WAVE ${waveNum}`; + document.body.appendChild(banner); + if (!document.getElementById('wave-banner-style')) { + const style = document.createElement('style'); + style.id = 'wave-banner-style'; + style.textContent = ` + @keyframes waveBannerIn { from { opacity: 0; transform: translate(-50%, -50%) scale(0.85); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } } + @keyframes waveBannerOut { from { opacity: 1; } to { opacity: 0; } } + `; + document.head.appendChild(style); + } + setTimeout(() => { + banner.style.animation = 'waveBannerOut 0.6s ease-in forwards'; + setTimeout(() => banner.remove(), 700); + }, 1500); + } + /** Create the shared 'spark' texture used for particle effects. */ + ensureSparkTexture() { + if (this.textures.exists('spark')) + return; + const g = this.add.graphics(); + g.fillStyle(0xffffff); + g.fillCircle(4, 4, 4); + g.generateTexture('spark', 8, 8); + g.destroy(); + } + /** + * Create a parallax starfield. Returns the Star array for use with updateStarfield(). + * Each scene provides its own layer config (count, speed, size, alpha per layer). + */ + createStarfield(layers) { + const stars = []; + for (const l of layers) { + for (let i = 0; i < l.count; i++) { + const gfx = this.add.graphics(); + const x = Math.random() * W; + const y = Math.random() * H; + gfx.fillStyle(0xffffff, l.alpha); + gfx.fillCircle(0, 0, l.size); + gfx.setPosition(x, y).setDepth(-9); + stars.push({ x, y, speed: l.speed, size: l.size, alpha: l.alpha, gfx }); + } + } + return stars; + } + /** Update parallax starfield positions (call from update). */ + updateStarfield(stars, dt) { + for (const s of stars) { + s.y += s.speed * (dt / 1000); + if (s.y > H) + s.y -= H; + s.gfx.setPosition(s.x, s.y); + } + } + /** Clean up timers and listeners on scene shutdown. */ + shutdown() { + if (this.scoreAnimTimer) { + clearInterval(this.scoreAnimTimer); + this.scoreAnimTimer = undefined; + } + if (this.gameOverKeyListener) { + document.removeEventListener('keydown', this.gameOverKeyListener); + this.gameOverKeyListener = undefined; + } + if (this._gameOverDelayTimer) { + this._gameOverDelayTimer.remove(); + this._gameOverDelayTimer = null; + } + this._cleanupReadyScreen(); + this._readyOnStart = undefined; + this._wasOnReadyScreen = false; + this.time.removeAllEvents(); + this.activeEmitters.forEach(e => this.destroyObj(e)); + this.activeEmitters = []; + const overlay = document.getElementById('gameover-overlay'); + if (overlay) + overlay.remove(); + } + /** Return a one-line description for the ready screen. Override in each scene. */ + getDescription() { + return ''; + } + /** Return control hints for the ready screen. Override in each scene. */ + getControls() { + return []; + } +} +//# sourceMappingURL=BaseScene.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/CosmicRocks.js b/extensions/arcade-canvas/game/scenes/CosmicRocks.js new file mode 100644 index 00000000..0518d7ca --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/CosmicRocks.js @@ -0,0 +1,697 @@ +// CosmicRocks — Asteroids-style space shooter. +// Ship rotates and thrusts through space, destroying asteroids that split +// into smaller fragments. Vector-style graphics drawn with Phaser Graphics. +import { BaseScene, W, H } from './BaseScene.js'; +/* ------------------------------------------------------------------ */ +/* Constants — SCALE/SHIP_SIZE recalculated in create() */ +/* ------------------------------------------------------------------ */ +let SCALE = Math.min(W / 1920, H / 1080); +let SHIP_SIZE = 20 * Math.max(SCALE, 0.6); +const ROTATE_SPEED = 4; // rad/s +const THRUST = 400; // px/s² +const FRICTION = 0.98; +const BULLET_SPEED = 600; +const BULLET_LIFE = 3000; // ms +const MAX_BULLETS = 4; +const INITIAL_ASTEROIDS = 5; +const INVINCIBLE_TIME = 2000; // ms +const RESPAWN_DELAY = 800; // ms before respawn +const ASTEROID_SIZES = [ + { radius: [40, 60], speed: [40, 80], score: 20 }, // large (size index 0) + { radius: [25, 40], speed: [60, 120], score: 50 }, // medium (size index 1) + { radius: [12, 20], speed: [80, 160], score: 100 }, // small (size index 2) +]; +const BULLET_COLORS = [0x00ff88, 0xff8800, 0x00ccff]; +/* ------------------------------------------------------------------ */ +/* Scene */ +/* ------------------------------------------------------------------ */ +export class CosmicRocksScene extends BaseScene { + /* ship state */ + shipGfx; + shipX = 0; + shipY = 0; + shipVx = 0; + shipVy = 0; + shipAngle = -Math.PI / 2; // pointing up + thrustGfx; + /* game objects */ + asteroids = []; + bullets = []; + stars = []; + /* UFO */ + ufo = null; + ufoBullets = []; + ufoTimer = 0; + /* game state */ + wave = 0; + invincibleTimer = 0; + respawnTimer = 0; + shipAlive = true; + gameOver = false; + waveDelay = 0; + /* input */ + cursors; + spaceKey; + spaceWasDown = false; + constructor() { super('cosmic-rocks'); } + get displayName() { return 'Cosmic Rocks'; } + getDescription() { + return 'Survive the asteroid field. Shoot rocks to break them apart!'; + } + getControls() { + return [ + { key: '← →', action: 'Rotate' }, + { key: '↑', action: 'Thrust' }, + { key: 'SPACE', action: 'Fire' }, + ]; + } + /* ================================================================ + LIFECYCLE + ================================================================ */ + preload() { + this.load.audio('sfx_laser', '../assets/cosmic-rocks/sounds/sfx_laser1.ogg'); + this.load.audio('sfx_zap', '../assets/cosmic-rocks/sounds/sfx_explosion.ogg'); + this.load.audio('sfx_lose', '../assets/cosmic-rocks/sounds/sfx_lose.ogg'); + this.load.audio('sfx_twoTone', '../assets/cosmic-rocks/sounds/sfx_twoTone.ogg'); + } + create() { + this.initBase(); + // Recalculate screen-dependent constants + SCALE = Math.min(W / 1920, H / 1080); + SHIP_SIZE = 20 * Math.max(SCALE, 0.6); + this.score = 0; + this.lives = 3; + this.wave = 0; + this.shipX = W / 2; + this.shipY = H / 2; + this.shipVx = 0; + this.shipVy = 0; + this.shipAngle = -Math.PI / 2; + this.invincibleTimer = 0; + this.respawnTimer = 0; + this.shipAlive = true; + this.gameOver = false; + this.waveDelay = 0; + this.asteroids = []; + this.bullets = []; + this.stars = []; + this.activeEmitters = []; + this.ufo = null; + this.ufoBullets = []; + this.ufoTimer = 15000 + Math.random() * 10000; + this.ensureSparkTexture(); + this.stars = this.createStarfield([ + { count: 40, speed: 15, size: 1, alpha: 0.25 }, + { count: 25, speed: 30, size: 1.5, alpha: 0.35 }, + { count: 15, speed: 55, size: 2, alpha: 0.45 }, + ]); + this.createShip(); + this.cursors = this.input.keyboard.createCursorKeys(); + this.spaceKey = this.input.keyboard.addKey('SPACE'); + this.spaceWasDown = false; + this.syncLivesToHUD(); + this.syncScoreToHUD(); + this.loadHighScore(); + this.startWithReadyScreen(() => this.startWave()); + } + update(_t, dtMs) { + if (this.gameOver || !this.cursors) + return; + const dt = Math.min(dtMs, 33); + const dtSec = dt / 1000; + this.updateStarfield(this.stars, dt); + if (this.respawnTimer > 0) { + this.respawnTimer -= dt; + if (this.respawnTimer <= 0) + this.respawnShip(); + } + if (this.shipAlive) { + this.updateShipInput(dtSec); + this.updateShipPhysics(dtSec); + this.drawShip(); + } + this.updateBullets(dtSec); + this.updateAsteroids(dtSec); + this.updateUfo(dt, dtSec); + this.checkCollisions(); + this.checkUfoCollisions(); + if (this.waveDelay > 0) { + this.waveDelay -= dt; + if (this.waveDelay <= 0 && this.asteroids.length === 0) + this.startWave(); + } + if (this.invincibleTimer > 0) { + this.invincibleTimer -= dt; + if (this.shipGfx) { + this.shipGfx.setAlpha(Math.sin(performance.now() / 80) > 0 ? 1 : 0.2); + } + } + else if (this.shipGfx) { + this.shipGfx.setAlpha(1); + } + } + /* ================================================================ + SHIP + ================================================================ */ + createShip() { + this.shipGfx = this.add.graphics().setDepth(10); + this.thrustGfx = this.add.graphics().setDepth(9); + this.drawShip(); + } + updateShipInput(dtSec) { + if (!this.cursors) + return; + if (this.cursors.left.isDown) + this.shipAngle -= ROTATE_SPEED * dtSec; + if (this.cursors.right.isDown) + this.shipAngle += ROTATE_SPEED * dtSec; + if (this.cursors.up.isDown) { + this.shipVx += Math.cos(this.shipAngle) * THRUST * dtSec; + this.shipVy += Math.sin(this.shipAngle) * THRUST * dtSec; + } + // Fire + const spaceDown = this.spaceKey.isDown; + if (spaceDown && !this.spaceWasDown && this.bullets.length < MAX_BULLETS) { + this.fireBullet(); + } + this.spaceWasDown = spaceDown; + } + updateShipPhysics(dtSec) { + // Friction (time-based) + const friction = Math.pow(FRICTION, dtSec / (1 / 60)); + this.shipVx *= friction; + this.shipVy *= friction; + this.shipX += this.shipVx * dtSec; + this.shipY += this.shipVy * dtSec; + // Screen wrap + if (this.shipX < -SHIP_SIZE) + this.shipX = W + SHIP_SIZE; + else if (this.shipX > W + SHIP_SIZE) + this.shipX = -SHIP_SIZE; + if (this.shipY < -SHIP_SIZE) + this.shipY = H + SHIP_SIZE; + else if (this.shipY > H + SHIP_SIZE) + this.shipY = -SHIP_SIZE; + } + drawShip() { + const g = this.shipGfx; + g.clear(); + g.setPosition(this.shipX, this.shipY); + const cos = Math.cos(this.shipAngle); + const sin = Math.sin(this.shipAngle); + const s = SHIP_SIZE; + // Triangle ship + const nose = { x: cos * s, y: sin * s }; + const leftWing = { x: Math.cos(this.shipAngle + 2.4) * s * 0.85, y: Math.sin(this.shipAngle + 2.4) * s * 0.85 }; + const rightWing = { x: Math.cos(this.shipAngle - 2.4) * s * 0.85, y: Math.sin(this.shipAngle - 2.4) * s * 0.85 }; + // Dark shadow backdrop for visibility on light backgrounds + g.lineStyle(6, 0x000000, 0.5); + g.beginPath(); + g.moveTo(nose.x, nose.y); + g.lineTo(leftWing.x, leftWing.y); + g.lineTo(rightWing.x, rightWing.y); + g.closePath(); + g.strokePath(); + // Outer glow (soft cyan) + g.lineStyle(4, 0x00ffff, 0.2); + g.beginPath(); + g.moveTo(nose.x, nose.y); + g.lineTo(leftWing.x, leftWing.y); + g.lineTo(rightWing.x, rightWing.y); + g.closePath(); + g.strokePath(); + // Solid ship outline (bright cyan) + g.lineStyle(2.5, 0x00ffff, 1); + g.beginPath(); + g.moveTo(nose.x, nose.y); + g.lineTo(leftWing.x, leftWing.y); + g.lineTo(rightWing.x, rightWing.y); + g.closePath(); + g.strokePath(); + // Thrust flame + const tg = this.thrustGfx; + tg.clear(); + if (this.cursors && this.cursors.up.isDown) { + tg.setPosition(this.shipX, this.shipY); + const tailLen = s * (0.6 + Math.random() * 0.4); + const tailX = -cos * tailLen; + const tailY = -sin * tailLen; + const spread = 0.4; + const tl = { x: Math.cos(this.shipAngle + Math.PI - spread) * s * 0.35, y: Math.sin(this.shipAngle + Math.PI - spread) * s * 0.35 }; + const tr = { x: Math.cos(this.shipAngle + Math.PI + spread) * s * 0.35, y: Math.sin(this.shipAngle + Math.PI + spread) * s * 0.35 }; + // Dark shadow for thrust + tg.lineStyle(5, 0x000000, 0.3); + tg.beginPath(); + tg.moveTo(tl.x, tl.y); + tg.lineTo(tailX, tailY); + tg.lineTo(tr.x, tr.y); + tg.strokePath(); + tg.lineStyle(3, 0xff8800, 0.25); + tg.beginPath(); + tg.moveTo(tl.x, tl.y); + tg.lineTo(tailX, tailY); + tg.lineTo(tr.x, tr.y); + tg.strokePath(); + tg.lineStyle(2.5, 0xff8800, 0.9); + tg.beginPath(); + tg.moveTo(tl.x, tl.y); + tg.lineTo(tailX, tailY); + tg.lineTo(tr.x, tr.y); + tg.strokePath(); + } + } + respawnShip() { + this.shipX = W / 2; + this.shipY = H / 2; + this.shipVx = 0; + this.shipVy = 0; + this.shipAngle = -Math.PI / 2; + this.shipAlive = true; + this.invincibleTimer = INVINCIBLE_TIME; + if (this.shipGfx) + this.shipGfx.setVisible(true); + if (this.thrustGfx) + this.thrustGfx.setVisible(true); + } + /* ================================================================ + BULLETS + ================================================================ */ + fireBullet() { + this.sound.play('sfx_laser', { volume: 0.3 }); + const color = BULLET_COLORS[Math.floor(Math.random() * BULLET_COLORS.length)]; + const gfx = this.add.graphics().setDepth(8); + // Dark backdrop + gfx.fillStyle(0x000000, 0.5); + gfx.fillCircle(0, 0, 10); + // Glow + gfx.fillStyle(color, 0.3); + gfx.fillCircle(0, 0, 8); + // Solid center + gfx.fillStyle(color, 1); + gfx.fillCircle(0, 0, 4); + const bx = this.shipX + Math.cos(this.shipAngle) * SHIP_SIZE; + const by = this.shipY + Math.sin(this.shipAngle) * SHIP_SIZE; + gfx.setPosition(bx, by); + this.bullets.push({ + gfx, + x: bx, y: by, + vx: Math.cos(this.shipAngle) * BULLET_SPEED, + vy: Math.sin(this.shipAngle) * BULLET_SPEED, + life: BULLET_LIFE, + color, + }); + } + updateBullets(dtSec) { + for (let i = this.bullets.length - 1; i >= 0; i--) { + const b = this.bullets[i]; + b.x += b.vx * dtSec; + b.y += b.vy * dtSec; + b.life -= dtSec * 1000; + b.gfx.setPosition(b.x, b.y); + // Destroy bullet when it leaves the screen or expires + if (b.life <= 0 || b.x < 0 || b.x > W || b.y < 0 || b.y > H) { + b.gfx.destroy(); + this.bullets.splice(i, 1); + } + } + } + /* ================================================================ + ASTEROIDS + ================================================================ */ + generateAsteroidVertices(radius) { + const verts = []; + const sides = 12; + for (let i = 0; i < sides; i++) { + const angle = (i / sides) * Math.PI * 2; + const r = radius * (0.7 + Math.random() * 0.3); + verts.push({ x: Math.cos(angle) * r, y: Math.sin(angle) * r }); + } + return verts; + } + spawnAsteroid(sizeIdx, x, y, aimAtShip = false) { + const info = ASTEROID_SIZES[sizeIdx]; + const radius = info.radius[0] + Math.random() * (info.radius[1] - info.radius[0]); + const scaledRadius = radius * Math.max(SCALE, 0.5); + // Position: at edges if not specified + let ax, ay; + if (x !== undefined && y !== undefined) { + ax = x; + ay = y; + } + else { + const edge = Math.floor(Math.random() * 4); + if (edge === 0) { + ax = Math.random() * W; + ay = -scaledRadius; + } + else if (edge === 1) { + ax = Math.random() * W; + ay = H + scaledRadius; + } + else if (edge === 2) { + ax = -scaledRadius; + ay = Math.random() * H; + } + else { + ax = W + scaledRadius; + ay = Math.random() * H; + } + // Make sure not too close to player + const dx = ax - this.shipX; + const dy = ay - this.shipY; + if (Math.sqrt(dx * dx + dy * dy) < 150) { + ax = (ax + W / 2) % W; + ay = (ay + H / 2) % H; + } + } + const speed = info.speed[0] + Math.random() * (info.speed[1] - info.speed[0]); + const speedBoost = Math.random() < 0.4 ? 1.5 : 1.0; // 40% chance of fast asteroid + // Aim toward the ship if requested, otherwise random direction + let angle; + let finalSpeed = speed * speedBoost; + if (aimAtShip) { + angle = Math.atan2(this.shipY - ay, this.shipX - ax); + // Add slight random spread (±15°) so it's not a perfect snipe + angle += (Math.random() - 0.5) * (Math.PI / 6); + // Ensure it arrives in ~3-4s regardless of base speed + const dist = Math.sqrt((this.shipX - ax) ** 2 + (this.shipY - ay) ** 2); + const minSpeed = dist / (3 + Math.random()); + finalSpeed = Math.max(finalSpeed, minSpeed); + } + else { + angle = Math.random() * Math.PI * 2; + } + const vertices = this.generateAsteroidVertices(scaledRadius); + const gfx = this.add.graphics().setDepth(5); + this.drawAsteroid(gfx, vertices); + this.asteroids.push({ + gfx, + x: ax, y: ay, + vx: Math.cos(angle) * finalSpeed, + vy: Math.sin(angle) * finalSpeed, + radius: scaledRadius, + sizeIdx, + rotation: 0, + rotSpeed: (Math.random() - 0.5) * 2, + vertices, + }); + } + drawAsteroid(gfx, vertices) { + gfx.clear(); + // Dark shadow backdrop for visibility on light backgrounds + gfx.lineStyle(5, 0x000000, 0.5); + gfx.beginPath(); + gfx.moveTo(vertices[0].x, vertices[0].y); + for (let i = 1; i < vertices.length; i++) { + gfx.lineTo(vertices[i].x, vertices[i].y); + } + gfx.closePath(); + gfx.strokePath(); + // Outer glow (soft green) + gfx.lineStyle(3, 0x44ff44, 0.25); + gfx.beginPath(); + gfx.moveTo(vertices[0].x, vertices[0].y); + for (let i = 1; i < vertices.length; i++) { + gfx.lineTo(vertices[i].x, vertices[i].y); + } + gfx.closePath(); + gfx.strokePath(); + // Solid outline (bright green-white) + gfx.lineStyle(2.5, 0x88ff88, 1); + gfx.beginPath(); + gfx.moveTo(vertices[0].x, vertices[0].y); + for (let i = 1; i < vertices.length; i++) { + gfx.lineTo(vertices[i].x, vertices[i].y); + } + gfx.closePath(); + gfx.strokePath(); + } + updateAsteroids(dtSec) { + for (const a of this.asteroids) { + a.x += a.vx * dtSec; + a.y += a.vy * dtSec; + a.rotation += a.rotSpeed * dtSec; + // Screen wrap + if (a.x < -a.radius) + a.x = W + a.radius; + else if (a.x > W + a.radius) + a.x = -a.radius; + if (a.y < -a.radius) + a.y = H + a.radius; + else if (a.y > H + a.radius) + a.y = -a.radius; + a.gfx.setPosition(a.x, a.y); + a.gfx.setRotation(a.rotation); + } + } + destroyAsteroid(idx) { + const a = this.asteroids[idx]; + const info = ASTEROID_SIZES[a.sizeIdx]; + this.addScore(info.score, a.x, a.y - 10); + this.spawnExplosion(a.x, a.y); + this.sound.play('sfx_zap', { volume: 0.3 }); + // Spawn children + if (a.sizeIdx < 2) { + const childSize = a.sizeIdx + 1; + for (let i = 0; i < 3; i++) { + this.spawnAsteroid(childSize, a.x, a.y); + } + } + a.gfx.destroy(); + this.asteroids.splice(idx, 1); + // Check if wave cleared + if (this.asteroids.length === 0 && this.waveDelay <= 0) { + this.waveDelay = 2000; + } + } + /* ================================================================ + COLLISIONS (manual rect/circle overlap — same pattern as Galaxy) + ================================================================ */ + checkCollisions() { + // Bullets vs asteroids + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + for (let ai = this.asteroids.length - 1; ai >= 0; ai--) { + const a = this.asteroids[ai]; + const dx = b.x - a.x; + const dy = b.y - a.y; + if (dx * dx + dy * dy < a.radius * a.radius) { + b.gfx.destroy(); + this.bullets.splice(bi, 1); + this.destroyAsteroid(ai); + break; + } + } + } + // Ship vs asteroids + if (this.shipAlive && this.invincibleTimer <= 0) { + for (let ai = this.asteroids.length - 1; ai >= 0; ai--) { + const a = this.asteroids[ai]; + const dx = this.shipX - a.x; + const dy = this.shipY - a.y; + const dist = Math.sqrt(dx * dx + dy * dy); + if (dist < a.radius + SHIP_SIZE * 0.6) { + this.hitShip(); + break; + } + } + } + } + /* ================================================================ + SHIP DEATH / LIVES + ================================================================ */ + hitShip() { + this.lives--; + this.syncLivesToHUD(); + this.spawnExplosion(this.shipX, this.shipY); + this.sound.play('sfx_zap', { volume: 0.5 }); + this.sound.play('sfx_lose', { volume: 0.4 }); + if (this.lives <= 0) { + this.shipAlive = false; + if (this.shipGfx) + this.shipGfx.setVisible(false); + if (this.thrustGfx) + this.thrustGfx.setVisible(false); + this.gameOver = true; + this.time.delayedCall(1000, () => { + this.showGameOver(this.score, () => this.scene.restart()); + }); + } + else { + this.shipAlive = false; + if (this.shipGfx) + this.shipGfx.setVisible(false); + if (this.thrustGfx) + this.thrustGfx.setVisible(false); + this.respawnTimer = RESPAWN_DELAY; + } + } + /* ================================================================ + PARTICLES + ================================================================ */ + spawnExplosion(x, y) { + this.spawnParticleExplosion(x, y, 0xffffff, 8); + } + /* ================================================================ + UFO ENEMY + ================================================================ */ + spawnUfo() { + const fromRight = Math.random() < 0.5; + const x = fromRight ? W + 30 : -30; + const y = H * (0.15 + Math.random() * 0.3); + const vx = (fromRight ? -1 : 1) * (120 + Math.random() * 80); + const gfx = this.add.graphics().setDepth(12); + this.drawUfo(gfx); + gfx.setPosition(x, y); + this.ufo = { gfx, x, y, vx, shootTimer: 1500 + Math.random() * 1000, active: true }; + } + drawUfo(gfx) { + gfx.clear(); + const s = SHIP_SIZE * 1.2; + // Dark shadow backdrop + gfx.lineStyle(5, 0x000000, 0.5); + gfx.strokeEllipse(0, 0, s * 2, s * 0.7); + gfx.strokeEllipse(0, -s * 0.2, s, s * 0.5); + // Outer glow (soft magenta) + gfx.lineStyle(3, 0xff44ff, 0.25); + gfx.strokeEllipse(0, 0, s * 2, s * 0.7); + gfx.strokeEllipse(0, -s * 0.2, s, s * 0.5); + // Solid + gfx.lineStyle(2.5, 0xff88ff, 1); + gfx.strokeEllipse(0, 0, s * 2, s * 0.7); + gfx.strokeEllipse(0, -s * 0.2, s, s * 0.5); + } + updateUfo(dt, dtSec) { + // Spawn timer + if (!this.ufo) { + this.ufoTimer -= dt; + if (this.ufoTimer <= 0) { + this.spawnUfo(); + this.ufoTimer = 15000 + Math.random() * 10000; + } + // Update UFO bullets even when no UFO + this.updateUfoBullets(dtSec); + return; + } + const u = this.ufo; + u.x += u.vx * dtSec; + u.gfx.setPosition(u.x, u.y); + // Off-screen — remove + if ((u.vx > 0 && u.x > W + 60) || (u.vx < 0 && u.x < -60)) { + u.gfx.destroy(); + this.ufo = null; + return; + } + // Shoot at player + u.shootTimer -= dt; + if (u.shootTimer <= 0 && this.shipAlive) { + u.shootTimer = 1200 + Math.random() * 800; + const angle = Math.atan2(this.shipY - u.y, this.shipX - u.x); + const speed = 250; + const bGfx = this.add.graphics().setDepth(8); + bGfx.fillStyle(0x000000, 0.5); + bGfx.fillCircle(0, 0, 9); + bGfx.fillStyle(0xff44ff, 0.3); + bGfx.fillCircle(0, 0, 7); + bGfx.fillStyle(0xff88ff, 1); + bGfx.fillCircle(0, 0, 3); + bGfx.setPosition(u.x, u.y); + this.ufoBullets.push({ + gfx: bGfx, x: u.x, y: u.y, + vx: Math.cos(angle) * speed, + vy: Math.sin(angle) * speed, + life: 3000, + }); + } + this.updateUfoBullets(dtSec); + } + updateUfoBullets(dtSec) { + for (let i = this.ufoBullets.length - 1; i >= 0; i--) { + const b = this.ufoBullets[i]; + b.x += b.vx * dtSec; + b.y += b.vy * dtSec; + b.life -= dtSec * 1000; + b.gfx.setPosition(b.x, b.y); + if (b.life <= 0 || b.x < -50 || b.x > W + 50 || b.y < -50 || b.y > H + 50) { + b.gfx.destroy(); + this.ufoBullets.splice(i, 1); + } + } + } + checkUfoCollisions() { + if (!this.ufo) + return; + const u = this.ufo; + // Player bullets vs UFO + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + const dx = b.x - u.x; + const dy = b.y - u.y; + if (dx * dx + dy * dy < (SHIP_SIZE * 1.5) ** 2) { + b.gfx.destroy(); + this.bullets.splice(bi, 1); + this.addScore(500, u.x, u.y - 10); + this.spawnExplosion(u.x, u.y); + this.sound.play('sfx_zap', { volume: 0.4 }); + u.gfx.destroy(); + this.ufo = null; + return; + } + } + // UFO bullets vs player + if (this.shipAlive && this.invincibleTimer <= 0) { + for (let i = this.ufoBullets.length - 1; i >= 0; i--) { + const b = this.ufoBullets[i]; + const dx = b.x - this.shipX; + const dy = b.y - this.shipY; + if (dx * dx + dy * dy < (SHIP_SIZE * 0.8) ** 2) { + b.gfx.destroy(); + this.ufoBullets.splice(i, 1); + this.hitShip(); + return; + } + } + } + // UFO body vs player + if (this.shipAlive && this.invincibleTimer <= 0) { + const dx = this.shipX - u.x; + const dy = this.shipY - u.y; + if (dx * dx + dy * dy < (SHIP_SIZE * 1.8) ** 2) { + this.spawnExplosion(u.x, u.y); + u.gfx.destroy(); + this.ufo = null; + this.hitShip(); + } + } + } + /* ================================================================ + WAVE SYSTEM + ================================================================ */ + startWave() { + this.wave++; + this.syncLevelToHUD(this.wave); + this.sound.play('sfx_twoTone', { volume: 0.3 }); + const count = INITIAL_ASTEROIDS + (this.wave - 1) * 2; + // Aim the first 2 asteroids at the ship so the player must act quickly + for (let i = 0; i < count; i++) { + this.spawnAsteroid(0, undefined, undefined, i < 2); + } + this.showWaveBanner(this.wave); + } + /* ================================================================ + CLEANUP + ================================================================ */ + shutdown() { + super.shutdown(); + if (this.ufo) { + this.ufo.gfx.destroy(); + this.ufo = null; + } + this.ufoBullets.forEach(b => b.gfx.destroy()); + this.ufoBullets = []; + const banner = document.getElementById('wave-banner'); + if (banner) + banner.remove(); + } +} +//# sourceMappingURL=CosmicRocks.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/GalaxyBlaster.js b/extensions/arcade-canvas/game/scenes/GalaxyBlaster.js new file mode 100644 index 00000000..4575b583 --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/GalaxyBlaster.js @@ -0,0 +1,1307 @@ +// GalaxyBlaster — Galaga-style space shooter. +// Direct port of WesleyEdwards/galaga mechanics: manual position math, +// De Casteljau bezier smoothing, hop+figure-eight attack patterns. +// Phaser sprites used ONLY for rendering (setPosition, setRotation, destroy). +import { BaseScene, W, H } from './BaseScene.js'; +function overlap(a, b) { + return a.x < b.x + b.w && a.x + a.w > b.x && + a.y < b.y + b.h && a.y + a.h > b.y; +} +function computeDistance(a, b) { + return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2); +} +/* ------------------------------------------------------------------ */ +/* De Casteljau bezier — exact port from PathFollower.ts */ +/* ------------------------------------------------------------------ */ +function getBezierPoint(t, points) { + if (points.length === 1) + return { x: points[0].x, y: points[0].y }; + const next = []; + for (let i = 0; i < points.length - 1; i++) { + next.push({ + x: (1 - t) * points[i].x + t * points[i + 1].x, + y: (1 - t) * points[i].y + t * points[i + 1].y, + }); + } + return getBezierPoint(t, next); +} +function generatePointsOnBezierCurve(points, numOfPoints) { + const bezierPoints = []; + for (let i = 0; i <= numOfPoints; i++) { + const t = i / numOfPoints; + bezierPoints.push(getBezierPoint(t, points)); + } + return bezierPoints; +} +const ENEMY_INFO = { + bug: { tex: 'space', frame: 'enemyRed1.png', hp: 1, formPts: 50, divePts: 100 }, + drone: { tex: 'space', frame: 'enemyBlack4.png', hp: 1, formPts: 60, divePts: 120 }, + moth: { tex: 'space', frame: 'enemyBlue3.png', hp: 2, formPts: 80, divePts: 160 }, + scout: { tex: 'space', frame: 'enemyRed5.png', hp: 2, formPts: 90, divePts: 180 }, + heavy: { tex: 'space', frame: 'enemyBlue5.png', hp: 3, formPts: 120, divePts: 300 }, + boss: { tex: 'space', frame: 'enemyGreen2.png', hp: 4, formPts: 150, divePts: 400 }, + commander: { tex: 'space', frame: 'enemyGreen2.png', hp: 2, formPts: 250, divePts: 500 }, +}; +function waveDef(n) { + const cycle = ((n - 1) % 5) + 1; + const tier = Math.floor((n - 1) / 5); + const extra = tier; + const cmds = n >= 2 ? Math.min(1 + Math.floor(n / 4), 2) : 0; + if (cycle === 1) + return { bugs: 8 + extra, drones: 0, moths: 0, scouts: 0, heavies: 0, bosses: 0, commanders: cmds }; + if (cycle === 2) + return { bugs: 4 + extra, drones: 4, moths: 0, scouts: 0, heavies: 0, bosses: 0, commanders: cmds }; + if (cycle === 3) + return { bugs: 4, drones: 2, moths: 4 + extra, scouts: 0, heavies: 0, bosses: 0, commanders: cmds }; + if (cycle === 4) + return { bugs: 3, drones: 2, moths: 2, scouts: 2 + extra, heavies: 2, bosses: 0, commanders: cmds }; + return { bugs: 3, drones: 2, moths: 2, scouts: 2, heavies: 1 + extra, bosses: 2, commanders: cmds }; +} +/* ------------------------------------------------------------------ */ +/* Constants — ref uses 500×500 design grid */ +/* Recalculated in create() to pick up correct W/H after Tauri resize */ +/* ------------------------------------------------------------------ */ +let CONV_X = W / 500; +let CONV_Y = H / 500; +let SCALE = Math.min(CONV_X, CONV_Y); +let OPPONENT_SIZE = Math.min(32 * SCALE, W / 35); +let ENTRY_SPEED = 0.4 * SCALE; // px/ms +let ATTACK_SPEED = 0.3 * SCALE; // px/ms +const ENTRANCE_INTERVAL = 100; // ms between spawns in a trail +let SHIP_SPEED = 0.25 * 1000 * SCALE; +let BULLET_SPEED = 0.45 * 1000 * SCALE; +const MAX_BULLETS = 3; +let ENEMY_BULLET_SPEED = 0.3 * 1000 * SCALE; +const BASE_MAX_DIVERS = 4; +const MAX_ENEMY_BULLETS = 3; // authentic Galaga: max 3 enemy bullets on screen +/* Formation: 5 rows × 10 cols, centered, in design coords scaled to screen */ +const FORM_COLS = 10; +const FORM_ROWS = 5; +let COL_SPACING = OPPONENT_SIZE + 10 * CONV_X; +function formationSlot(row, col) { + const totalW = (FORM_COLS - 1) * COL_SPACING; + const startX = (W - totalW) / 2; + return { + x: startX + col * COL_SPACING, + y: (row + 1) * OPPONENT_SIZE, + }; +} +/* Build full grid: row 0 = bosses, 1-2 = moths, 3-4 = bugs */ +function buildFormationGrid() { + const slots = []; + for (let r = 0; r < FORM_ROWS; r++) { + for (let c = 0; c < FORM_COLS; c++) { + slots.push(formationSlot(r, c)); + } + } + return slots; +} +/* ------------------------------------------------------------------ */ +/* Entry path generation (ref waveOneInfo.ts style) */ +/* ------------------------------------------------------------------ */ +/** Bee-style entry: top-center, swoop through bottom-left, spiral up */ +function beeEntryControlPoints(targetX, targetY, mirror) { + const s = mirror ? -1 : 1; + const cx = CONV_X; + const cy = CONV_Y; + return [ + { x: 300 * cx, y: -32 * cy }, + { x: (300 + s * 30) * cx, y: 50 * cy }, + { x: (300 + s * 80) * cx, y: 130 * cy }, + { x: (250 + s * 150) * cx, y: 220 * cy }, + { x: (250 + s * 180) * cx, y: 290 * cy }, + { x: (250 + s * 140) * cx, y: 340 * cy }, + { x: (250 + s * 80) * cx, y: 330 * cy }, + { x: (250 + s * 20) * cx, y: 300 * cy }, + { x: (250 - s * 30) * cx, y: 260 * cy }, + { x: (250 - s * 50) * cx, y: 210 * cy }, + { x: (250 - s * 30) * cx, y: 170 * cy }, + { x: targetX, y: targetY }, + ]; +} +/** Moth-style entry: top-center other side, swoop through bottom-right, spiral up */ +function mothEntryControlPoints(targetX, targetY, mirror) { + const s = mirror ? -1 : 1; + const cx = CONV_X; + const cy = CONV_Y; + return [ + { x: 200 * cx, y: -32 * cy }, + { x: (200 - s * 30) * cx, y: 50 * cy }, + { x: (200 - s * 80) * cx, y: 130 * cy }, + { x: (250 - s * 150) * cx, y: 220 * cy }, + { x: (250 - s * 180) * cx, y: 290 * cy }, + { x: (250 - s * 140) * cx, y: 340 * cy }, + { x: (250 - s * 80) * cx, y: 330 * cy }, + { x: (250 - s * 20) * cx, y: 300 * cy }, + { x: (250 + s * 30) * cx, y: 260 * cy }, + { x: (250 + s * 50) * cx, y: 210 * cy }, + { x: (250 + s * 30) * cx, y: 170 * cy }, + { x: targetX, y: targetY }, + ]; +} +/** Boss entry: center spiral down */ +function bossEntryControlPoints(targetX, targetY, mirror) { + const s = mirror ? -1 : 1; + const cx = CONV_X; + const cy = CONV_Y; + return [ + { x: 250 * cx, y: -32 * cy }, + { x: (250 + s * 60) * cx, y: 40 * cy }, + { x: (250 + s * 120) * cx, y: 120 * cy }, + { x: (250 + s * 100) * cx, y: 200 * cy }, + { x: (250 + s * 40) * cx, y: 280 * cy }, + { x: (250 - s * 30) * cx, y: 330 * cy }, + { x: (250 - s * 80) * cx, y: 310 * cy }, + { x: (250 - s * 60) * cx, y: 260 * cy }, + { x: (250 - s * 20) * cx, y: 200 * cy }, + { x: (250 + s * 10) * cx, y: 150 * cy }, + { x: targetX, y: targetY }, + ]; +} +/** Side-sweep entry for variety */ +function sideEntryControlPoints(targetX, targetY, fromRight) { + const cx = CONV_X; + const cy = CONV_Y; + const sx = fromRight ? 530 * cx : -30 * cx; + const mid = 250 * cx; + return [ + { x: sx, y: 200 * cy }, + { x: fromRight ? 420 * cx : 80 * cx, y: 150 * cy }, + { x: fromRight ? 350 * cx : 150 * cx, y: 100 * cy }, + { x: mid, y: 80 * cy }, + { x: fromRight ? 150 * cx : 350 * cx, y: 120 * cy }, + { x: fromRight ? 100 * cx : 400 * cx, y: 200 * cy }, + { x: fromRight ? 80 * cx : 420 * cx, y: 280 * cy }, + { x: fromRight ? 120 * cx : 380 * cx, y: 330 * cy }, + { x: fromRight ? 200 * cx : 300 * cx, y: 310 * cy }, + { x: mid, y: 260 * cy }, + { x: targetX, y: targetY }, + ]; +} +/** Bottom-loop entry for variety */ +function bottomLoopControlPoints(targetX, targetY, fromRight) { + const cx = CONV_X; + const cy = CONV_Y; + const sx = fromRight ? 530 * cx : -30 * cx; + return [ + { x: sx, y: 250 * cy }, + { x: fromRight ? 400 * cx : 100 * cx, y: 300 * cy }, + { x: fromRight ? 350 * cx : 150 * cx, y: 340 * cy }, + { x: 250 * cx, y: 340 * cy }, + { x: fromRight ? 150 * cx : 350 * cx, y: 320 * cy }, + { x: fromRight ? 100 * cx : 400 * cx, y: 280 * cy }, + { x: fromRight ? 80 * cx : 420 * cx, y: 230 * cy }, + { x: fromRight ? 120 * cx : 380 * cx, y: 170 * cy }, + { x: 250 * cx, y: 130 * cy }, + { x: targetX, y: targetY }, + ]; +} +/* ------------------------------------------------------------------ */ +/* Attack path — exact port from AttackPatterns.ts */ +/* ------------------------------------------------------------------ */ +function hop(currPos, path) { + const cx = CONV_X; + const cy = CONV_Y; + // 8 points: move up then arc right (in design coords scaled) + path.push({ x: currPos.x, y: currPos.y }); + path.push({ x: currPos.x + 5 * cx, y: currPos.y - 10 * cy }); + path.push({ x: currPos.x + 10 * cx, y: currPos.y - 25 * cy }); + path.push({ x: currPos.x + 15 * cx, y: currPos.y - 40 * cy }); + path.push({ x: currPos.x + 25 * cx, y: currPos.y - 50 * cy }); + path.push({ x: currPos.x + 35 * cx, y: currPos.y - 45 * cy }); + path.push({ x: currPos.x + 40 * cx, y: currPos.y - 30 * cy }); + path.push({ x: currPos.x + 35 * cx, y: currPos.y - 15 * cy }); +} +function leftAttackPattern(path) { + const cx = CONV_X; + const cy = CONV_Y; + const last = path[path.length - 1]; + const bx = last.x; + const by = last.y; + // Wide figure-eight pattern (~30 points) — convX/convY scaled + path.push({ x: bx + 20 * cx, y: by + 10 * cy }); + path.push({ x: bx + 40 * cx, y: by + 30 * cy }); + path.push({ x: bx + 60 * cx, y: by + 60 * cy }); + path.push({ x: bx + 80 * cx, y: by + 100 * cy }); + path.push({ x: bx + 90 * cx, y: by + 140 * cy }); + path.push({ x: bx + 85 * cx, y: by + 180 * cy }); + path.push({ x: bx + 70 * cx, y: by + 210 * cy }); + path.push({ x: bx + 45 * cx, y: by + 230 * cy }); + path.push({ x: bx + 15 * cx, y: by + 235 * cy }); + path.push({ x: bx - 15 * cx, y: by + 225 * cy }); + path.push({ x: bx - 40 * cx, y: by + 200 * cy }); + path.push({ x: bx - 55 * cx, y: by + 170 * cy }); + path.push({ x: bx - 60 * cx, y: by + 135 * cy }); + path.push({ x: bx - 55 * cx, y: by + 100 * cy }); + path.push({ x: bx - 40 * cx, y: by + 70 * cy }); + path.push({ x: bx - 20 * cx, y: by + 50 * cy }); + path.push({ x: bx, y: by + 40 * cy }); + path.push({ x: bx + 20 * cx, y: by + 50 * cy }); + path.push({ x: bx + 45 * cx, y: by + 70 * cy }); + path.push({ x: bx + 65 * cx, y: by + 100 * cy }); + path.push({ x: bx + 75 * cx, y: by + 135 * cy }); + path.push({ x: bx + 70 * cx, y: by + 170 * cy }); + path.push({ x: bx + 55 * cx, y: by + 200 * cy }); + path.push({ x: bx + 30 * cx, y: by + 220 * cy }); + path.push({ x: bx, y: by + 230 * cy }); + path.push({ x: bx - 30 * cx, y: by + 220 * cy }); + path.push({ x: bx - 55 * cx, y: by + 195 * cy }); + path.push({ x: bx - 70 * cx, y: by + 160 * cy }); + path.push({ x: bx - 75 * cx, y: by + 120 * cy }); + path.push({ x: bx - 65 * cx, y: by + 80 * cy }); + path.push({ x: bx - 40 * cx, y: by + 50 * cy }); + path.push({ x: bx - 10 * cx, y: by + 30 * cy }); +} +function rightAttackPattern(path) { + const cx = CONV_X; + const cy = CONV_Y; + const last = path[path.length - 1]; + const bx = last.x; + const by = last.y; + // Mirror of left pattern + path.push({ x: bx - 20 * cx, y: by + 10 * cy }); + path.push({ x: bx - 40 * cx, y: by + 30 * cy }); + path.push({ x: bx - 60 * cx, y: by + 60 * cy }); + path.push({ x: bx - 80 * cx, y: by + 100 * cy }); + path.push({ x: bx - 90 * cx, y: by + 140 * cy }); + path.push({ x: bx - 85 * cx, y: by + 180 * cy }); + path.push({ x: bx - 70 * cx, y: by + 210 * cy }); + path.push({ x: bx - 45 * cx, y: by + 230 * cy }); + path.push({ x: bx - 15 * cx, y: by + 235 * cy }); + path.push({ x: bx + 15 * cx, y: by + 225 * cy }); + path.push({ x: bx + 40 * cx, y: by + 200 * cy }); + path.push({ x: bx + 55 * cx, y: by + 170 * cy }); + path.push({ x: bx + 60 * cx, y: by + 135 * cy }); + path.push({ x: bx + 55 * cx, y: by + 100 * cy }); + path.push({ x: bx + 40 * cx, y: by + 70 * cy }); + path.push({ x: bx + 20 * cx, y: by + 50 * cy }); + path.push({ x: bx, y: by + 40 * cy }); + path.push({ x: bx - 20 * cx, y: by + 50 * cy }); + path.push({ x: bx - 45 * cx, y: by + 70 * cy }); + path.push({ x: bx - 65 * cx, y: by + 100 * cy }); + path.push({ x: bx - 75 * cx, y: by + 135 * cy }); + path.push({ x: bx - 70 * cx, y: by + 170 * cy }); + path.push({ x: bx - 55 * cx, y: by + 200 * cy }); + path.push({ x: bx - 30 * cx, y: by + 220 * cy }); + path.push({ x: bx, y: by + 230 * cy }); + path.push({ x: bx + 30 * cx, y: by + 220 * cy }); + path.push({ x: bx + 55 * cx, y: by + 195 * cy }); + path.push({ x: bx + 70 * cx, y: by + 160 * cy }); + path.push({ x: bx + 75 * cx, y: by + 120 * cy }); + path.push({ x: bx + 65 * cx, y: by + 80 * cy }); + path.push({ x: bx + 40 * cx, y: by + 50 * cy }); + path.push({ x: bx + 10 * cx, y: by + 30 * cy }); +} +function getAttackPath(currPos) { + const path = []; + hop(currPos, path); + if (currPos.x < W / 2) { + leftAttackPattern(path); + } + else { + rightAttackPattern(path); + } + path.push({ x: currPos.x, y: currPos.y }); // return to formation + // Scale the dive deeper so enemies reach the player's zone. + // Find how deep the pattern goes vs how deep it SHOULD go (near the ship). + const targetY = H - OPPONENT_SIZE * 4; // just above the player ship + let maxY = -Infinity; + for (const p of path) { + if (p.y > maxY) + maxY = p.y; + } + if (maxY > currPos.y && maxY < targetY) { + const yScale = (targetY - currPos.y) / (maxY - currPos.y); + for (const p of path) { + if (p !== path[path.length - 1]) { // don't scale the return-to-formation point + p.y = currPos.y + (p.y - currPos.y) * yScale; + } + } + } + return generatePointsOnBezierCurve(path, 75); +} +/* ================================================================== */ +/* SCENE */ +/* ================================================================== */ +export class GalaxyBlasterScene extends BaseScene { + /* player */ + ship; + shipX = W / 2; + shipVx = 0; + shipY = H - OPPONENT_SIZE * 3; + bullets = []; + invincible = 0; + /* shield */ + shieldActive = false; + shieldSprite; + shieldPickups = []; + /* dual-shot power-up */ + dualShot = false; + dualShotTimer = 0; + dualShotPickups = []; + dualShotGlow; + normalShipWidth = 0; + normalShipHeight = 0; + /* enemies */ + enemies = []; + enemyBullets = []; + formation = []; + enemyOffset = -50 * CONV_X; + driftDirection = 1; + driftTimer = 0; + allStationary = false; + breatheTimer = 0; + breathePhase = 'breathe-in'; + attackTimer = 0; + offsetLerping = false; + /* wave / spawn */ + wave = 0; + waveDelay = 0; + spawnQueue = []; + spawnTimer = 0; + waveTextSprite = null; + /* starfield */ + stars = []; + /* input */ + cursors; + spaceKey; + spaceWasDown = false; + /* meteors */ + meteors = []; + meteorTimer = 0; + /* game over */ + gameOver = false; + constructor() { super('galaxy-blaster'); } + get displayName() { return 'Galaxy Blaster'; } + getDescription() { + return 'Battle alien formations in deep space. Clear each wave to advance!'; + } + getControls() { + return [ + { key: '← →', action: 'Move Left / Right' }, + { key: 'SPACE', action: 'Fire' }, + ]; + } + /* ================================================================ + LIFECYCLE + ================================================================ */ + preload() { + this.load.atlasXML('space', '../assets/galaxy-blaster/space_sheet-2.png', '../assets/galaxy-blaster/space_sheet-2.xml'); + this.load.image('space_bg', '../assets/galaxy-blaster/space_bg.png'); + this.load.audio('sfx_laser', '../assets/galaxy-blaster/sounds/sfx_laser1.ogg'); + this.load.audio('sfx_zap', '../assets/galaxy-blaster/sounds/sfx_explosion.ogg'); + this.load.audio('sfx_lose', '../assets/galaxy-blaster/sounds/sfx_lose.ogg'); + this.load.audio('sfx_shieldUp', '../assets/galaxy-blaster/sounds/sfx_shieldUp.ogg'); + this.load.audio('sfx_shieldDown', '../assets/galaxy-blaster/sounds/sfx_shieldDown.ogg'); + this.load.audio('sfx_twoTone', '../assets/galaxy-blaster/sounds/sfx_twoTone.ogg'); + } + create() { + this.initBase(); + // Recalculate screen-dependent constants now that W/H are correct + CONV_X = W / 500; + CONV_Y = H / 500; + SCALE = Math.min(CONV_X, CONV_Y); + OPPONENT_SIZE = Math.min(32 * SCALE, W / 35); + ENTRY_SPEED = 0.4 * SCALE; + ATTACK_SPEED = 0.3 * SCALE; + SHIP_SPEED = 0.25 * 1000 * SCALE; + BULLET_SPEED = 0.45 * 1000 * SCALE; + ENEMY_BULLET_SPEED = 0.3 * 1000 * SCALE; + COL_SPACING = OPPONENT_SIZE + 10 * CONV_X; + this.score = 0; + this.lives = 3; + this.wave = 0; + this.waveDelay = 0; + this.enemies = []; + this.bullets = []; + this.enemyBullets = []; + this.spawnQueue = []; + this.activeEmitters = []; + this.enemyOffset = -50 * CONV_X; + this.driftDirection = 1; + this.driftTimer = 0; + this.allStationary = false; + this.breatheTimer = 0; + this.breathePhase = 'breathe-in'; + this.attackTimer = 0; + this.offsetLerping = false; + this.invincible = 0; + this.gameOver = false; + this.shipX = W / 2; + this.shipVx = 0; + this.shieldActive = false; + if (this.shieldSprite && this.shieldSprite.active) { + this.shieldSprite.destroy(); + this.shieldSprite = undefined; + } + this.shieldPickups.forEach(p => { if (p.sprite && p.sprite.active) + p.sprite.destroy(); }); + this.shieldPickups = []; + this.meteors.forEach(m => { if (m.sprite && m.sprite.active) + m.sprite.destroy(); }); + this.meteors = []; + this.meteorTimer = 0; + this.ensureSparkTexture(); + this.createGalaxyStarfield(); + this.formation = buildFormationGrid(); + this.ship = this.add.sprite(this.shipX, this.shipY, 'space', 'playerShip1_blue.png').setDepth(10); + this.ship.setDisplaySize(OPPONENT_SIZE * 1.2, OPPONENT_SIZE * 0.9); + this.normalShipWidth = OPPONENT_SIZE * 1.2; + this.normalShipHeight = OPPONENT_SIZE * 0.9; + this.dualShot = false; + this.dualShotTimer = 0; + this.dualShotPickups = []; + this.dualShotGlow = undefined; + this.cursors = this.input.keyboard.createCursorKeys(); + this.spaceKey = this.input.keyboard.addKey('SPACE'); + this.spaceWasDown = false; + this.syncLivesToHUD(); + this.syncLevelToHUD(this.wave); + this.syncScoreToHUD(); + this.loadHighScore(); + this.startWithReadyScreen(() => this.startWave()); + } + update(_t, dtMs) { + if (this.gameOver) + return; + const dt = Math.min(dtMs, 33); + this.updateGalaxyStarfield(dt); + this.updateShip(dt); + this.updateBullets(dt); + this.updateEnemies(dt); + this.updateEnemyBullets(dt); + this.checkCollisions(); + this.updateShieldPickups(dt); + this.updateDualShotPickups(dt); + this.updateDualShot(dt); + this.updateMeteors(dt); + this.updateWave(dt); + } + /* ================================================================ + STARFIELD + ================================================================ */ + createGalaxyStarfield() { + const bgTile = 256; + const cols = Math.ceil(W / bgTile) + 1; + const rows = Math.ceil(H / bgTile) + 1; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + this.add.image(c * bgTile + bgTile / 2, r * bgTile + bgTile / 2, 'space_bg') + .setAlpha(0.25) + .setDepth(-10); + } + } + this.stars = this.createStarfield([ + { count: 30, speed: 20, size: 1, alpha: 0.3 }, + { count: 20, speed: 40, size: 1.5, alpha: 0.4 }, + { count: 15, speed: 70, size: 2, alpha: 0.5 }, + ]); + } + updateGalaxyStarfield(dt) { + this.updateStarfield(this.stars, dt); + } + /* ================================================================ + WAVE SYSTEM + ================================================================ */ + startWave() { + this.wave++; + this.syncLevelToHUD(this.wave); + const def = waveDef(this.wave); + this.spawnQueue = []; + const usedSlots = new Set(this.enemies.map(e => { + // Find slot index from resting pos + for (let i = 0; i < this.formation.length; i++) { + if (this.formation[i].x === e.restingPosX && this.formation[i].y === e.restingPosY) + return i; + } + return -1; + })); + // Determine which entry path style based on wave for variety + const waveStyle = (this.wave - 1) % 5; + // Helper: find next free slot in given rows + const findSlot = (preferredRows) => { + for (const row of preferredRows) { + for (let c = 0; c < FORM_COLS; c++) { + const idx = row * FORM_COLS + c; + if (!usedSlots.has(idx)) { + usedSlots.add(idx); + return idx; + } + } + } + // Fallback: any free slot + for (let i = 0; i < this.formation.length; i++) { + if (!usedSlots.has(i)) { + usedSlots.add(i); + return i; + } + } + return -1; + }; + // Build trails: bosses → moths → bugs, each group with its own entry curve + const addTrail = (kind, count, rows, pathFn, mirror) => { + for (let i = 0; i < count; i++) { + const slotIdx = findSlot(rows); + if (slotIdx === -1) + continue; + const target = this.formation[slotIdx]; + const controlPts = pathFn(target.x, target.y, mirror); + const entryPath = generatePointsOnBezierCurve(controlPts, 25); + this.spawnQueue.push({ kind, entryPath, slotIdx }); + } + }; + // Pick entry curve variants based on wave style + if (def.bosses > 0) { + addTrail('boss', def.bosses, [0], bossEntryControlPoints, waveStyle % 2 === 1); + } + if (def.heavies > 0) { + addTrail('heavy', def.heavies, [0, 1], sideEntryControlPoints, waveStyle % 2 === 0); + } + if (def.moths > 0) { + const mothPath = waveStyle >= 3 ? sideEntryControlPoints : mothEntryControlPoints; + addTrail('moth', def.moths, [1, 2], mothPath, waveStyle % 2 === 0); + } + if (def.scouts > 0) { + addTrail('scout', def.scouts, [2, 3], bottomLoopControlPoints, waveStyle % 2 === 1); + } + if (def.drones > 0) { + addTrail('drone', def.drones, [3, 4], beeEntryControlPoints, waveStyle % 2 === 0); + } + if (def.bugs > 0) { + const bugPath = waveStyle >= 4 ? bottomLoopControlPoints : beeEntryControlPoints; + addTrail('bug', def.bugs, [3, 4], bugPath, waveStyle % 2 === 1); + } + if (def.commanders > 0) { + addTrail('commander', def.commanders, [1, 2], sideEntryControlPoints, waveStyle % 2 === 0); + } + this.spawnTimer = 0; + this.attackTimer = 0; + this.enemyOffset = -50 * CONV_X; + this.driftDirection = 1; + this.driftTimer = 0; + this.allStationary = false; + this.offsetLerping = false; + // Clean up old wave text sprite if any + if (this.waveTextSprite) { + this.tweens.killTweensOf(this.waveTextSprite); + this.waveTextSprite.destroy(); + this.waveTextSprite = null; + } + this.showWaveBanner(this.wave); + } + updateWave(dt) { + // Spawn queued enemies with entrance interval timing + if (this.spawnQueue.length > 0) { + this.spawnTimer -= dt; + if (this.spawnTimer <= 0) { + const next = this.spawnQueue.shift(); + this.spawnEnemy(next.kind, next.entryPath, next.slotIdx); + this.spawnTimer = ENTRANCE_INTERVAL; + } + } + // Next wave when all enemies gone and spawn queue empty + if (this.enemies.length === 0 && this.spawnQueue.length === 0) { + this.waveDelay -= dt; + if (this.waveDelay <= 0) { + this.waveDelay = 1500; + this.sound.play('sfx_twoTone', { volume: 0.3 }); + this.startWave(); + } + } + else { + this.waveDelay = 1500; + } + } + /* ================================================================ + ENEMY SPAWN — manual path following, NO PathFollower + ================================================================ */ + spawnEnemy(kind, entryPath, slotIdx) { + const info = ENEMY_INFO[kind]; + const startPos = entryPath[0]; + const target = this.formation[slotIdx]; + const sprite = this.add.sprite(startPos.x, startPos.y, info.tex, info.frame).setDepth(5); + sprite.setDisplaySize(OPPONENT_SIZE, OPPONENT_SIZE * 0.85); + if (kind === 'commander') + sprite.setTint(0xffd700); + const e = { + sprite, + kind, + hp: info.hp, + pos: { x: startPos.x, y: startPos.y }, + restingPosX: target.x, + restingPosY: target.y, + state: 'entrance', + secondaryState: 'breathe-in', + activePath: entryPath, + pathIndex: 0, + speed: ENTRY_SPEED, + breathTimer: 0, + breathingOffsetX: 0, + breathingOffsetY: 0, + attackPath: [], + shotsFired: 0, + shotTimer: 0, + }; + this.enemies.push(e); + } + /* ================================================================ + followPath — exact port from Opponent.ts + ================================================================ */ + followPath(e, dt, onCompletion) { + if (e.pathIndex >= e.activePath.length - 1) + return; + let distTraveled = e.speed * dt; + // Consume distance through multiple waypoints if needed (handles lag spikes) + let distRemaining = computeDistance(e.pos, e.activePath[e.pathIndex + 1]); + while (distTraveled > distRemaining && e.pathIndex < e.activePath.length - 1) { + distTraveled -= distRemaining; + e.pos.x = e.activePath[e.pathIndex + 1].x; + e.pos.y = e.activePath[e.pathIndex + 1].y; + e.pathIndex++; + if (e.pathIndex < e.activePath.length - 1) { + distRemaining = computeDistance(e.pos, e.activePath[e.pathIndex + 1]); + } + } + if (e.pathIndex < e.activePath.length - 1) { + let dirX = e.activePath[e.pathIndex + 1].x - e.pos.x; + let dirY = e.activePath[e.pathIndex + 1].y - e.pos.y; + const dirMag = Math.sqrt(dirX * dirX + dirY * dirY); + if (dirMag > 0.001) { + dirX /= dirMag; + dirY /= dirMag; + e.pos.x += distTraveled * dirX; + e.pos.y += distTraveled * dirY; + } + } + else { + onCompletion(); + } + } + /* ================================================================ + UPDATE ENEMIES — exact port of state machine + ================================================================ */ + updateEnemies(dt) { + const dtScale = dt / 16.67; // frame-rate independence (ref ~60fps) + // Determine whether all enemies have finished entering + const hasEntering = this.enemies.some(e => e.state === 'entrance'); + const wasAllStationary = this.allStationary; + this.allStationary = !hasEntering && this.spawnQueue.length === 0 && this.enemies.length > 0; + if (!this.allStationary) { + // Phase 1: Drifting (before breathing starts) + this.driftTimer += dt; + if (this.driftTimer >= 2000) { + this.driftTimer -= 2000; + this.driftDirection *= -1; + } + this.enemyOffset += this.driftDirection * 0.05 * CONV_X * dt; + } + else { + // Phase 2: Lerp enemyOffset to 0, then start breathing + if (!wasAllStationary) { + this.offsetLerping = true; + } + if (this.offsetLerping) { + const lerpRate = 0.05 * CONV_X * dt; + if (Math.abs(this.enemyOffset) <= lerpRate) { + this.enemyOffset = 0; + this.offsetLerping = false; + this.breathePhase = 'breathe-in'; + this.breatheTimer = 0; + for (const e of this.enemies) { + if (e.state === 'stationary') { + e.state = 'breathe-in'; + e.breathingOffsetX = 0; + e.breathingOffsetY = 0; + } + } + } + else { + this.enemyOffset -= Math.sign(this.enemyOffset) * lerpRate; + } + } + else { + this.breatheTimer += dt; + if (this.breatheTimer >= 2000) { + this.breatheTimer -= 2000; + this.breathePhase = this.breathePhase === 'breathe-in' ? 'breathe-out' : 'breathe-in'; + for (const e of this.enemies) { + if (e.state === 'breathe-in' || e.state === 'breathe-out') { + e.state = this.breathePhase; + } + if (e.state === 'attack') { + e.secondaryState = this.breathePhase; + } + } + } + } + } + // Attack coordination: scale max divers with wave (4 base, +1 per 2 waves, cap at 8) + const maxDivers = Math.min(BASE_MAX_DIVERS + Math.floor((this.wave - 1) / 2), 8); + this.attackTimer += dt; + if (this.attackTimer >= 600) { + this.attackTimer -= 600; + const attackers = this.enemies.filter(e => e.state === 'attack').length; + if (attackers < maxDivers) { + this.triggerDive(); + } + } + // Update each enemy + for (let i = this.enemies.length - 1; i >= 0; i--) { + const e = this.enemies[i]; + if (e.state === 'entrance') { + this.followPath(e, dt, () => { + e.pos.x = e.restingPosX + this.enemyOffset; + e.pos.y = e.restingPosY; + e.state = 'stationary'; + }); + } + else if (e.state === 'stationary') { + e.pos.x = e.restingPosX + this.enemyOffset; + e.pos.y = e.restingPosY; + } + else if (e.state === 'breathe-in' || e.state === 'breathe-out') { + const dir = e.state === 'breathe-in' ? 1 : -1; + e.breathingOffsetX += dir * ((e.restingPosX - W / 2) / (W / 2)) * 0.3 * dtScale; + e.breathingOffsetY += dir * (e.restingPosY / (H / 2)) * 0.4 * dtScale; + const maxOff = OPPONENT_SIZE * 1.5; + e.breathingOffsetX = Math.max(-maxOff, Math.min(maxOff, e.breathingOffsetX)); + e.breathingOffsetY = Math.max(-maxOff, Math.min(maxOff, e.breathingOffsetY)); + e.pos.x = e.restingPosX + e.breathingOffsetX; + e.pos.y = e.restingPosY + e.breathingOffsetY; + } + else if (e.state === 'attack') { + // Continue breathing independently via secondaryState + if (e.secondaryState === 'breathe-in' || e.secondaryState === 'breathe-out') { + const dir = e.secondaryState === 'breathe-in' ? 1 : -1; + e.breathingOffsetX += dir * ((e.restingPosX - W / 2) / (W / 2)) * 0.3 * dtScale; + e.breathingOffsetY += dir * (e.restingPosY / (H / 2)) * 0.4 * dtScale; + } + // activePath is set to attackPath when dive starts + this.followPath(e, dt, () => { + // Attack complete — return to formation / breathing state + e.pos.x = e.restingPosX + e.breathingOffsetX; + e.pos.y = e.restingPosY + e.breathingOffsetY; + e.state = (e.secondaryState === 'breathe-in' || e.secondaryState === 'breathe-out') + ? e.secondaryState + : (this.allStationary ? this.breathePhase : 'stationary'); + e.activePath = []; + e.pathIndex = 0; + e.shotsFired = 0; + e.shotTimer = 0; + }); + // Shooting during attack: fire on start, then every ~1200ms during dive + if (e.state === 'attack') { + e.shotTimer += dt; + if (e.shotsFired >= 1 && e.shotTimer >= 400 + (e.shotsFired - 1) * 1200) { + this.fireEnemyBullet(e.pos.x, e.pos.y); + e.shotsFired++; + } + } + } + // Rendering: position sprite from manual pos + e.sprite.setPosition(e.pos.x + OPPONENT_SIZE / 2, e.pos.y + OPPONENT_SIZE / 2); + // Rotation from path direction + if ((e.state === 'entrance' || e.state === 'attack') && e.pathIndex < e.activePath.length - 1) { + const next = e.activePath[e.pathIndex + 1]; + e.sprite.setRotation(Math.atan2(next.y - e.pos.y, next.x - e.pos.x) + Math.PI / 2); + } + else { + e.sprite.setRotation(0); + } + } + } + /* ================================================================ + ATTACK DIVE + ================================================================ */ + triggerDive() { + const candidates = this.enemies.filter(e => e.state === 'stationary' || e.state === 'breathe-in' || e.state === 'breathe-out'); + if (candidates.length === 0) + return; + const e = candidates[Math.floor(Math.random() * candidates.length)]; + if (e.state === 'entrance') + return; // guard against race condition + // Remember breathing state as secondary so it continues independently + if (e.state === 'breathe-in' || e.state === 'breathe-out') { + e.secondaryState = e.state; + } + else { + e.secondaryState = this.breathePhase; + } + e.state = 'attack'; + const atkPath = getAttackPath({ x: e.pos.x, y: e.pos.y }); + e.attackPath = atkPath; + e.activePath = atkPath; + e.pathIndex = 0; + e.speed = ATTACK_SPEED; + // Fire 1 bullet immediately on attack start + this.fireEnemyBullet(e.pos.x, e.pos.y); + e.shotsFired = 1; + e.shotTimer = 0; + } + fireEnemyBullet(x, y) { + // Cap on-screen enemy bullets (authentic Galaga: max 3) + if (this.enemyBullets.length >= MAX_ENEMY_BULLETS) + return; + // Don't fire if enemy is below or at the player's level + if (y >= this.shipY) + return; + // Galaga-authentic: bullets go nearly straight down with discrete + // 3-direction aiming (straight, slight-left, slight-right). + const dx = this.shipX - x; + const horizontalBias = 0.18; + let vx = 0; + if (dx < -OPPONENT_SIZE) + vx = -ENEMY_BULLET_SPEED * horizontalBias; + else if (dx > OPPONENT_SIZE) + vx = ENEMY_BULLET_SPEED * horizontalBias; + const vy = ENEMY_BULLET_SPEED; + const sprite = this.add.sprite(x, y + 8, 'space', 'laserRed01.png').setDepth(5); + sprite.setDisplaySize(OPPONENT_SIZE * 0.15, OPPONENT_SIZE * 0.5); + this.enemyBullets.push({ sprite, vx, vy }); + } + /* ================================================================ + SHIP + ================================================================ */ + updateShip(dt) { + if (this.invincible > 0) { + this.invincible -= dt; + this.ship.setAlpha(Math.sin(this.invincible * 0.02) > 0 ? 1 : 0.3); + if (this.invincible <= 0) + this.ship.setAlpha(1); + } + const left = this.cursors.left.isDown; + const right = this.cursors.right.isDown; + const accel = SHIP_SPEED * 4; // accelerate to full speed quickly + const friction = 0.88; // smooth deceleration when no key held + if (left) + this.shipVx -= accel * (dt / 1000); + if (right) + this.shipVx += accel * (dt / 1000); + if (!left && !right) + this.shipVx *= friction; + // Clamp velocity + this.shipVx = Math.max(-SHIP_SPEED, Math.min(SHIP_SPEED, this.shipVx)); + if (Math.abs(this.shipVx) < 1) + this.shipVx = 0; + this.shipX += this.shipVx * (dt / 1000); + this.shipX = Math.max(10, Math.min(W - 10, this.shipX)); + this.ship.setPosition(this.shipX, this.shipY); + if (this.shieldSprite && this.shieldActive) { + this.shieldSprite.setPosition(this.shipX, this.shipY); + this.shieldSprite.setAlpha(0.4 + Math.sin(this.time.now / 200) * 0.2); + } + // fire (edge-detect) + const spaceDown = this.spaceKey.isDown; + if (spaceDown && !this.spaceWasDown && this.bullets.length < MAX_BULLETS) { + if (this.dualShot) { + // Dual shot — fire two parallel bullets + const offset = this.normalShipWidth * 0.3; + const s1 = this.add.sprite(this.shipX - offset, this.shipY - 12, 'space', 'laserBlue01.png').setDepth(5); + s1.setDisplaySize(OPPONENT_SIZE * 0.15, OPPONENT_SIZE * 0.55); + const s2 = this.add.sprite(this.shipX + offset, this.shipY - 12, 'space', 'laserBlue01.png').setDepth(5); + s2.setDisplaySize(OPPONENT_SIZE * 0.15, OPPONENT_SIZE * 0.55); + this.bullets.push({ sprite: s1, vx: 0, vy: -BULLET_SPEED }); + this.bullets.push({ sprite: s2, vx: 0, vy: -BULLET_SPEED }); + } + else { + const s = this.add.sprite(this.shipX, this.shipY - 12, 'space', 'laserBlue01.png').setDepth(5); + s.setDisplaySize(OPPONENT_SIZE * 0.15, OPPONENT_SIZE * 0.55); + this.bullets.push({ sprite: s, vx: 0, vy: -BULLET_SPEED }); + } + this.sound.play('sfx_laser', { volume: 0.3 }); + } + this.spaceWasDown = spaceDown; + } + /* ================================================================ + BULLETS + ================================================================ */ + updateBullets(dt) { + for (let i = this.bullets.length - 1; i >= 0; i--) { + const b = this.bullets[i]; + b.sprite.x += b.vx * (dt / 1000); + b.sprite.y += b.vy * (dt / 1000); + if (b.sprite.y < -10) { + b.sprite.destroy(); + this.bullets.splice(i, 1); + } + } + } + updateEnemyBullets(dt) { + for (let i = this.enemyBullets.length - 1; i >= 0; i--) { + const b = this.enemyBullets[i]; + b.sprite.x += b.vx * (dt / 1000); + b.sprite.y += b.vy * (dt / 1000); + if (b.sprite.y > H + 10 || b.sprite.y < -10 || b.sprite.x < -10 || b.sprite.x > W + 10) { + b.sprite.destroy(); + this.enemyBullets.splice(i, 1); + } + } + } + /* ================================================================ + COLLISIONS + ================================================================ */ + checkCollisions() { + const halfSize = OPPONENT_SIZE / 2; + const halfH = OPPONENT_SIZE * 0.85 / 2; + // Player bullets vs enemies + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + const bRect = { x: b.sprite.x - 3, y: b.sprite.y - OPPONENT_SIZE * 0.25, w: 6, h: OPPONENT_SIZE * 0.5 }; + for (let ei = this.enemies.length - 1; ei >= 0; ei--) { + const e = this.enemies[ei]; + const eRect = { + x: e.sprite.x - halfSize, + y: e.sprite.y - halfH, + w: OPPONENT_SIZE, + h: OPPONENT_SIZE * 0.85, + }; + if (overlap(bRect, eRect)) { + b.sprite.destroy(); + this.bullets.splice(bi, 1); + e.hp--; + if (e.hp <= 0) { + const info = ENEMY_INFO[e.kind]; + const inFormation = e.state === 'stationary' || e.state === 'breathe-in' || e.state === 'breathe-out'; + const pts = inFormation ? info.formPts : info.divePts; + this.spawnExplosion(e.sprite.x, e.sprite.y, e.kind); + this.addScore(pts, e.sprite.x, e.sprite.y - 10); + this.sound.play('sfx_zap', { volume: 0.3 }); + const ex = e.sprite.x; + const ey = e.sprite.y; + e.sprite.destroy(); + this.enemies.splice(ei, 1); + // Shield pickup chance (not from commanders) + if (e.kind !== 'commander' && Math.random() < 0.08) { + const pu = this.add.sprite(ex, ey, 'space', 'powerupBlue_shield.png').setDepth(5); + pu.setDisplaySize(OPPONENT_SIZE * 0.6, OPPONENT_SIZE * 0.6); + this.shieldPickups.push({ sprite: pu, vy: 180 * SCALE }); + } + // Commanders always drop dual-shot pickup + if (e.kind === 'commander') { + this.spawnDualShotPickup(ex, ey); + } + } + else { + e.sprite.setTint(0xffffff); + this.time.delayedCall(80, () => { if (e.sprite && e.sprite.active) + e.sprite.clearTint(); }); + } + break; + } + } + } + // Player bullets vs meteors + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + const bRect = { x: b.sprite.x - 3, y: b.sprite.y - OPPONENT_SIZE * 0.25, w: 6, h: OPPONENT_SIZE * 0.5 }; + for (let mi = this.meteors.length - 1; mi >= 0; mi--) { + const m = this.meteors[mi]; + const mSize = m.sprite.displayWidth * 0.4; + const mRect = { x: m.sprite.x - mSize, y: m.sprite.y - mSize, w: mSize * 2, h: mSize * 2 }; + if (overlap(bRect, mRect)) { + b.sprite.destroy(); + this.bullets.splice(bi, 1); + m.hp--; + if (m.hp <= 0) { + const pts = m.sprite.displayWidth > OPPONENT_SIZE ? 150 : 75; + this.spawnExplosion(m.sprite.x, m.sprite.y, 'bug'); + this.addScore(pts, m.sprite.x, m.sprite.y - 10); + this.sound.play('sfx_zap', { volume: 0.2 }); + m.sprite.destroy(); + this.meteors.splice(mi, 1); + } + else { + m.sprite.setTint(0xffffff); + this.time.delayedCall(80, () => { if (m.sprite && m.sprite.active) + m.sprite.clearTint(); }); + } + break; + } + } + } + // Enemy bullets vs player + if (this.invincible <= 0) { + const pRect = { x: this.shipX - OPPONENT_SIZE * 0.5, y: this.shipY - OPPONENT_SIZE * 0.4, w: OPPONENT_SIZE, h: OPPONENT_SIZE * 0.8 }; + for (let i = this.enemyBullets.length - 1; i >= 0; i--) { + const b = this.enemyBullets[i]; + const bRect = { x: b.sprite.x - 3, y: b.sprite.y - 3, w: 6, h: 6 }; + if (overlap(pRect, bRect)) { + b.sprite.destroy(); + this.enemyBullets.splice(i, 1); + this.hitPlayer(); + break; + } + } + } + // Enemies vs player (dive collision) + if (this.invincible <= 0) { + const pRect = { x: this.shipX - OPPONENT_SIZE * 0.5, y: this.shipY - OPPONENT_SIZE * 0.4, w: OPPONENT_SIZE, h: OPPONENT_SIZE * 0.8 }; + for (let ei = this.enemies.length - 1; ei >= 0; ei--) { + const e = this.enemies[ei]; + if (e.state === 'entrance') + continue; + const eRect = { + x: e.sprite.x - halfSize, + y: e.sprite.y - halfH, + w: OPPONENT_SIZE, + h: OPPONENT_SIZE * 0.85, + }; + if (overlap(pRect, eRect)) { + this.spawnExplosion(e.sprite.x, e.sprite.y, e.kind); + e.sprite.destroy(); + this.enemies.splice(ei, 1); + this.hitPlayer(); + break; + } + } + } + } + /* ================================================================ + PLAYER HIT / GAME OVER + ================================================================ */ + hitPlayer() { + if (this.shieldActive) { + this.shieldActive = false; + this.sound.play('sfx_shieldDown', { volume: 0.4 }); + if (this.shieldSprite) { + this.shieldSprite.destroy(); + this.shieldSprite = undefined; + } + this.invincible = 500; + return; + } + // Cancel dual-shot on hit + if (this.dualShot) + this.deactivateDualShot(); + this.lives--; + this.syncLivesToHUD(); + this.spawnExplosion(this.shipX, this.shipY, 'player'); + this.sound.play('sfx_lose', { volume: 0.4 }); + if (this.lives <= 0) { + this.ship.setVisible(false); + this.gameOver = true; + this.showGameOver(this.score, () => { + this.scene.restart(); + }); + } + else { + this.invincible = 2000; + } + } + /* ================================================================ + SHIELD PICKUPS + ================================================================ */ + updateShieldPickups(dt) { + for (let i = this.shieldPickups.length - 1; i >= 0; i--) { + const pu = this.shieldPickups[i]; + pu.sprite.y += pu.vy * (dt / 1000); + if (pu.sprite.y > H) { + pu.sprite.destroy(); + this.shieldPickups.splice(i, 1); + continue; + } + const dx = Math.abs(pu.sprite.x - this.shipX); + const dy = Math.abs(pu.sprite.y - this.shipY); + if (dx < OPPONENT_SIZE * 0.8 && dy < OPPONENT_SIZE * 0.8) { + pu.sprite.destroy(); + this.shieldPickups.splice(i, 1); + this.activateShield(); + } + } + } + activateShield() { + if (this.shieldActive) + return; + this.shieldActive = true; + this.sound.play('sfx_shieldUp', { volume: 0.4 }); + this.shieldSprite = this.add.sprite(this.shipX, this.shipY, 'space', 'shield1.png').setDepth(11); + this.shieldSprite.setDisplaySize(OPPONENT_SIZE * 1.6, OPPONENT_SIZE * 1.4); + this.shieldSprite.setAlpha(0.6); + } + /* ================================================================ + DUAL-SHOT POWER-UP + ================================================================ */ + spawnDualShotPickup(x, y) { + const pu = this.add.sprite(x, y, 'space', 'powerupYellow_bolt.png').setDepth(5); + pu.setDisplaySize(OPPONENT_SIZE * 0.6, OPPONENT_SIZE * 0.6); + pu.setTint(0xffd700); + // Pulsing glow + this.tweens.add({ + targets: pu, alpha: { from: 1, to: 0.5 }, + duration: 400, yoyo: true, repeat: -1, + }); + this.dualShotPickups.push({ sprite: pu, vy: 160 * SCALE }); + } + updateDualShotPickups(dt) { + for (let i = this.dualShotPickups.length - 1; i >= 0; i--) { + const pu = this.dualShotPickups[i]; + pu.sprite.y += pu.vy * (dt / 1000); + if (pu.sprite.y > H) { + pu.sprite.destroy(); + this.dualShotPickups.splice(i, 1); + continue; + } + const dx = Math.abs(pu.sprite.x - this.shipX); + const dy = Math.abs(pu.sprite.y - this.shipY); + if (dx < OPPONENT_SIZE * 0.8 && dy < OPPONENT_SIZE * 0.8) { + pu.sprite.destroy(); + this.dualShotPickups.splice(i, 1); + this.activateDualShot(); + } + } + } + activateDualShot() { + this.dualShot = true; + this.dualShotTimer = 15000; // 15 seconds + this.sound.play('sfx_shieldUp', { volume: 0.4 }); + // Widen ship + this.ship.setDisplaySize(this.normalShipWidth * 1.5, this.normalShipHeight); + // Add glow effect + if (this.dualShotGlow) + this.dualShotGlow.destroy(); + this.dualShotGlow = this.add.sprite(this.shipX, this.shipY, 'space', 'playerShip1_blue.png').setDepth(9); + this.dualShotGlow.setDisplaySize(this.normalShipWidth * 1.8, this.normalShipHeight * 1.3); + this.dualShotGlow.setTint(0xffd700); + this.dualShotGlow.setAlpha(0.25); + } + updateDualShot(dt) { + if (!this.dualShot) + return; + this.dualShotTimer -= dt; + // Update glow position + if (this.dualShotGlow) { + this.dualShotGlow.setPosition(this.shipX, this.shipY); + this.dualShotGlow.setAlpha(0.15 + Math.sin(this.time.now / 200) * 0.1); + } + // Flash warning when about to expire + if (this.dualShotTimer < 3000 && this.dualShotTimer > 0) { + this.ship.setAlpha(Math.sin(this.dualShotTimer * 0.01) > 0 ? 1 : 0.6); + } + if (this.dualShotTimer <= 0) { + this.deactivateDualShot(); + } + } + deactivateDualShot() { + this.dualShot = false; + this.dualShotTimer = 0; + this.ship.setDisplaySize(this.normalShipWidth, this.normalShipHeight); + this.ship.setAlpha(1); + if (this.dualShotGlow) { + this.dualShotGlow.destroy(); + this.dualShotGlow = undefined; + } + } + /* ================================================================ + METEORS + ================================================================ */ + static METEOR_FRAMES = [ + 'meteorBrown_big1.png', 'meteorBrown_big2.png', 'meteorBrown_big3.png', 'meteorBrown_big4.png', + 'meteorGrey_big1.png', 'meteorGrey_big2.png', 'meteorGrey_big3.png', 'meteorGrey_big4.png', + 'meteorBrown_med1.png', 'meteorBrown_med3.png', + 'meteorGrey_med1.png', 'meteorGrey_med2.png', + ]; + updateMeteors(dt) { + // Spawn timer — one every 3-6 seconds + this.meteorTimer -= dt; + if (this.meteorTimer <= 0) { + this.meteorTimer = 3000 + Math.random() * 3000; + this.spawnMeteor(); + } + // Move meteors + const dtS = dt / 1000; + for (let i = this.meteors.length - 1; i >= 0; i--) { + const m = this.meteors[i]; + m.sprite.y += m.vy * dtS; + m.sprite.x += m.vx * dtS; + m.sprite.rotation += m.rotSpeed * dtS; + if (m.sprite.y > H + 80 || m.sprite.x < -80 || m.sprite.x > W + 80) { + m.sprite.destroy(); + this.meteors.splice(i, 1); + } + } + // Collision with player + if (this.invincible <= 0) { + const pRect = { x: this.shipX - OPPONENT_SIZE * 0.5, y: this.shipY - OPPONENT_SIZE * 0.4, w: OPPONENT_SIZE, h: OPPONENT_SIZE * 0.8 }; + for (let i = this.meteors.length - 1; i >= 0; i--) { + const m = this.meteors[i]; + const mSize = m.sprite.displayWidth * 0.4; + const mRect = { x: m.sprite.x - mSize, y: m.sprite.y - mSize, w: mSize * 2, h: mSize * 2 }; + if (overlap(pRect, mRect)) { + this.spawnExplosion(m.sprite.x, m.sprite.y, 'bug'); + m.sprite.destroy(); + this.meteors.splice(i, 1); + this.hitPlayer(); + break; + } + } + } + } + spawnMeteor() { + const frame = GalaxyBlasterScene.METEOR_FRAMES[Math.floor(Math.random() * GalaxyBlasterScene.METEOR_FRAMES.length)]; + const isBig = frame.includes('big'); + const size = isBig ? OPPONENT_SIZE * (1.2 + Math.random() * 0.8) : OPPONENT_SIZE * (0.6 + Math.random() * 0.4); + const x = Math.random() * W; + const sprite = this.add.sprite(x, -size, 'space', frame).setDepth(3); + sprite.setDisplaySize(size, size); + sprite.setAlpha(0.85); + const vy = 60 + Math.random() * 80; + const vx = (Math.random() - 0.5) * 40; + const rotSpeed = (Math.random() - 0.5) * 2; + const hp = isBig ? 2 : 1; + this.meteors.push({ sprite, vy, vx, rotSpeed, hp }); + } + /* ================================================================ + EXPLOSIONS — Phaser Particle Emitter + ================================================================ */ + spawnExplosion(x, y, kind) { + const tintMap = { + bug: 0xffff00, + drone: 0x888888, + moth: 0x4444ff, + scout: 0xff0000, + heavy: 0x0066ff, + boss: 0x00ff00, + player: 0xffffff, + }; + const tint = tintMap[kind] || tintMap.player; + const count = kind === 'player' ? 40 : 25; + this.spawnParticleExplosion(x, y, tint, count); + } + shutdown() { + super.shutdown(); + // Destroy player ship + this.destroyObj(this.ship); + // Destroy bullet sprites + for (const b of this.bullets) + this.destroyObj(b.sprite); + this.bullets = []; + // Destroy enemy sprites + for (const e of this.enemies) + this.destroyObj(e.sprite); + this.enemies = []; + // Destroy enemy bullet sprites + for (const b of this.enemyBullets) + this.destroyObj(b.sprite); + this.enemyBullets = []; + // Destroy shield and pickups + this.destroyObj(this.shieldSprite); + this.shieldSprite = undefined; + for (const p of this.shieldPickups) + this.destroyObj(p); + this.shieldPickups = []; + // Destroy dual-shot pickups and glow + for (const p of this.dualShotPickups) + this.destroyObj(p.sprite); + this.dualShotPickups = []; + this.destroyObj(this.dualShotGlow); + this.dualShotGlow = undefined; + // Destroy meteors + for (const m of this.meteors) + this.destroyObj(m.sprite); + this.meteors = []; + // Destroy wave text + this.destroyObj(this.waveTextSprite); + this.waveTextSprite = null; + } +} +//# sourceMappingURL=GalaxyBlaster.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/NinjaRunner.js b/extensions/arcade-canvas/game/scenes/NinjaRunner.js new file mode 100644 index 00000000..64424a0b --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/NinjaRunner.js @@ -0,0 +1,2811 @@ +// NinjaRunner — side-scrolling platformer with free JuhoSprite assets. +// Extracted from the original monolithic game.ts and refactored to +// extend BaseScene for the multi-game architecture. +import { BaseScene, W, H } from './BaseScene.js'; +const BLOCK = 48; // logical world tile size +const PLAYER_W = 48; // player draw size +const PLAYER_H = 48; // player draw size +const SPAWN_X = 600; +// Computed dynamically so it uses the correct H after refreshDimensions() +function getGroundY() { return H - BLOCK; } +let GROUND_Y = H - BLOCK; // will be updated in create() +export class NinjaRunnerScene extends BaseScene { + // Input + cursors; + keys; + // Player state + player; + isBig = false; + facingRight = true; + invincible = 1500; // ms + shrinkTimer = 0; + stompGrace = 0; + dead = false; + deadTimer = 0; + lastSafeX = SPAWN_X; + fireCooldown = 0; + // Jump tracking — manual edge detection is more reliable on macOS than + // Phaser's JustDown when multiple keys are held simultaneously. + jumpKeyWasDown = false; + coyoteTime = 0; // ms left where we can still jump after leaving ground + jumpBuffer = 0; // ms left where a queued jump press will fire on landing + canDoubleJump = false; + hasDoubleJumped = false; + // Animation: cycle the run frame based on distance traveled, not wall time, + // so step rhythm matches actual movement speed. + runDistance = 0; + // Generation + genX = 0; + // Groups + groundGroup; + brickGroup; + qblockGroup; + pipeGroup; + coinGroup; + mushroomGroup; + heartGroup; + fireballGroup; + enemyGroup; + gaps = []; + bridgeGroup; + bounceGroup; + flagGroup; + currentLevel = 1; + currentBiome = 0; + distanceSinceFlag = 0; + piranhaGroup; + fireGroup; + crocGroup; + fishGroup; + warping = false; + parachuteMode = false; + parachuteSprite; + parachuteFlyingEnemies = []; + parachuteTimer = 0; + windSound; + glowSprite; + constructor() { super('ninja-runner'); } + get displayName() { return 'Ninja Runner'; } + getDescription() { + return 'Run, jump, and dash through endless obstacles. How far can you go?'; + } + getControls() { + return [ + { key: '← →', action: 'Move Left / Right' }, + { key: 'SPACE', action: 'Jump' }, + { key: 'SHIFT', action: 'Run' }, + { key: 'F', action: 'Fireball' }, + { key: 'Z', action: 'Stomp Attack' }, + ]; + } + sfx(key, volume = 0.3) { + try { + this.sound.play(key, { volume }); + } + catch { /* ignore audio errors */ } + } + preload() { + // Player spritesheet: 7 frames of 16×16 + this.load.spritesheet('player', '../assets/ninja-runner/player_strip.png', { frameWidth: 16, frameHeight: 16 }); + // Enemy spritesheet: 5 frames of 16×16 + this.load.spritesheet('enemy', '../assets/ninja-runner/enemy_strip.png', { frameWidth: 16, frameHeight: 16 }); + // Coin animation: 4 frames of 16×16 + this.load.spritesheet('coin_anim', '../assets/ninja-runner/coin_sheet.png', { frameWidth: 16, frameHeight: 16 }); + // Heart pickup + this.load.spritesheet('heart_anim', '../assets/ninja-runner/heart_sheet.png', { frameWidth: 16, frameHeight: 16 }); + // Tile textures + this.load.image('grass_block', '../assets/ninja-runner/grass_block.png'); + this.load.image('dirt_block', '../assets/ninja-runner/dirt_block.png'); + this.load.image('brown_block', '../assets/ninja-runner/brown_block.png'); + this.load.image('qblock_img', '../assets/ninja-runner/qblock_new.png'); + this.load.image('platform_tile', '../assets/ninja-runner/platform.png'); + this.load.image('spikes_tile', '../assets/ninja-runner/spikes.png'); + this.load.image('flag_tile', '../assets/ninja-runner/flag.png'); + this.load.image('bridge_tile', '../assets/ninja-runner/bridge.png'); + this.load.image('impact', '../assets/ninja-runner/impact_sheet.png'); + this.load.image('clouds', '../assets/ninja-runner/clouds.png'); + this.load.image('hill_0', '../assets/ninja-runner/hill_0.png'); + this.load.image('hill_1', '../assets/ninja-runner/hill_1.png'); + this.load.image('big_bush', '../assets/ninja-runner/big_bush.png'); + this.load.image('small_bush', '../assets/ninja-runner/small_bush.png'); + this.load.image('background', '../assets/ninja-runner/background.png'); + this.load.spritesheet('enemy_tall', '../assets/ninja-runner/enemy_tall_strip.png', { frameWidth: 16, frameHeight: 32 }); + this.load.spritesheet('enemy_short', '../assets/ninja-runner/enemy_short_strip.png', { frameWidth: 16, frameHeight: 16 }); + // Sound effects + this.load.audio('nr_jump', '../assets/ninja-runner/sounds/SoundJump1.m4a'); + this.load.audio('nr_coin', '../assets/ninja-runner/sounds/SoundCoin.m4a'); + this.load.audio('nr_stomp', '../assets/ninja-runner/sounds/SoundEnemyDeath.m4a'); + this.load.audio('nr_powerup', '../assets/ninja-runner/sounds/SoundBonus.m4a'); + this.load.audio('nr_hit', '../assets/ninja-runner/sounds/SoundPlayerHit.m4a'); + this.load.audio('nr_die', '../assets/ninja-runner/sounds/SoundDeath.m4a'); + this.load.audio('nr_flag', '../assets/ninja-runner/sounds/SoundReachGoal.m4a'); + this.load.audio('nr_bounce', '../assets/ninja-runner/sounds/SoundBounce.m4a'); + this.load.audio('nr_startlevel', '../assets/ninja-runner/sounds/SoundStartLevel.m4a'); + this.load.audio('nr_gameover', '../assets/ninja-runner/sounds/SoundGameOver.m4a'); + this.load.audio('nr_land', '../assets/ninja-runner/sounds/SoundLand1.m4a'); + this.load.audio('nr_flap', '../assets/ninja-runner/sounds/SoundFlapLight.m4a'); + this.load.audio('nr_warp', '../assets/ninja-runner/sounds/SoundOpenDoor.m4a'); + this.load.audio('nr_fireball', '../assets/ninja-runner/sounds/SoundShootRegular.m4a'); + this.load.audio('nr_explosion', '../assets/ninja-runner/sounds/SoundExplosionSmall.m4a'); + this.load.audio('nr_extralife', '../assets/ninja-runner/sounds/SoundSpecialSkill.m4a'); + this.load.audio('nr_wind', '../assets/ninja-runner/sounds/SoundWind.m4a'); + } + create() { + this.initBase(); + // Recompute GROUND_Y from the actual game height (H may have been + // refreshed after module load by refreshDimensions in game.ts) + GROUND_Y = H - BLOCK; + this.makeBlockTextures(); + this.physics.world.setBounds(0, 0, 1_000_000, H); + this.groundGroup = this.physics.add.staticGroup(); + this.brickGroup = this.physics.add.staticGroup(); + this.qblockGroup = this.physics.add.staticGroup(); + this.pipeGroup = this.physics.add.staticGroup(); + this.coinGroup = this.physics.add.group({ allowGravity: false }); + this.mushroomGroup = this.physics.add.group(); + this.heartGroup = this.physics.add.group({ allowGravity: false }); + this.fireballGroup = this.physics.add.group(); + this.enemyGroup = this.physics.add.group(); + this.piranhaGroup = this.physics.add.group({ allowGravity: false }); + this.bridgeGroup = this.physics.add.staticGroup(); + this.bounceGroup = this.physics.add.staticGroup(); + this.flagGroup = this.physics.add.staticGroup(); + this.fireGroup = this.physics.add.group({ allowGravity: false }); + this.crocGroup = this.physics.add.group({ allowGravity: false }); + this.fishGroup = this.physics.add.group({ allowGravity: false }); + // Initial ground + this.extendGround(0, W * 2); + // Player — spritesheet frame 0 = idle + this.player = this.physics.add.sprite(SPAWN_X, GROUND_Y - 200, 'player', 0); + this.player.setOrigin(0.5, 1); + this.player.setDisplaySize(PLAYER_W, PLAYER_H); + // Physics body fills the full cell so player's head hits blocks above. + this.player.body.setSize(12, 16); + this.player.body.setOffset(2, 0); + this.player.setMaxVelocity(700, 900); + this.player.body.setGravityY(1800); + this.player.setDepth(10); + // Player animations + this.anims.create({ + key: 'player_walk', + frames: this.anims.generateFrameNumbers('player', { frames: [1, 2, 3] }), + frameRate: 10, + repeat: -1, + }); + this.anims.create({ + key: 'player_idle', + frames: [{ key: 'player', frame: 0 }], + frameRate: 1, + }); + // Coin spin animation + this.anims.create({ + key: 'coin_spin', + frames: this.anims.generateFrameNumbers('coin_anim', { start: 0, end: 3 }), + frameRate: 8, + repeat: -1, + }); + // Heart pulse animation + this.anims.create({ + key: 'heart_pulse', + frames: this.anims.generateFrameNumbers('heart_anim', { start: 0, end: 3 }), + frameRate: 4, + repeat: -1, + }); + // Enemy walk + this.anims.create({ + key: 'enemy_walk', + frames: this.anims.generateFrameNumbers('enemy', { frames: [0, 1, 2, 3] }), + frameRate: 6, + repeat: -1, + }); + this.anims.create({ + key: 'enemy_tall_walk', + frames: this.anims.generateFrameNumbers('enemy_tall', { frames: [0, 1, 2, 3] }), + frameRate: 6, + repeat: -1, + }); + this.anims.create({ + key: 'enemy_short_walk', + frames: this.anims.generateFrameNumbers('enemy_short', { frames: [0, 1, 2, 3] }), + frameRate: 8, + repeat: -1, + }); + // Camera + this.cameras.main.setBounds(0, 0, 1_000_000, H); + this.cameras.main.startFollow(this.player, true, 0.15, 0.05, -W * 0.2, 0); + this.cameras.main.setBackgroundColor('rgba(0,0,0,0)'); + // Colliders + this.physics.add.collider(this.player, this.groundGroup); + this.physics.add.collider(this.player, this.brickGroup, this.onPlayerHitBrick, undefined, this); + this.physics.add.collider(this.player, this.qblockGroup, this.onPlayerHitQBlock, undefined, this); + this.physics.add.collider(this.player, this.pipeGroup); + this.physics.add.collider(this.enemyGroup, this.groundGroup); + this.physics.add.collider(this.enemyGroup, this.brickGroup); + this.physics.add.collider(this.enemyGroup, this.qblockGroup); + this.physics.add.collider(this.enemyGroup, this.pipeGroup); + this.physics.add.overlap(this.enemyGroup, this.enemyGroup, this.onEnemyVsEnemy, undefined, this); + this.physics.add.collider(this.mushroomGroup, this.groundGroup); + this.physics.add.collider(this.mushroomGroup, this.brickGroup); + this.physics.add.collider(this.mushroomGroup, this.qblockGroup); + this.physics.add.collider(this.mushroomGroup, this.pipeGroup); + this.physics.add.collider(this.fireballGroup, this.groundGroup, this.onFireballHitSolid, undefined, this); + this.physics.add.collider(this.fireballGroup, this.brickGroup, this.onFireballHitSolid, undefined, this); + this.physics.add.collider(this.fireballGroup, this.qblockGroup, this.onFireballHitSolid, undefined, this); + this.physics.add.collider(this.fireballGroup, this.pipeGroup, this.onFireballHitSolid, undefined, this); + this.physics.add.overlap(this.player, this.coinGroup, this.onPlayerCoin, undefined, this); + this.physics.add.overlap(this.player, this.mushroomGroup, this.onPlayerMushroom, undefined, this); + this.physics.add.overlap(this.player, this.heartGroup, this.onPlayerHeart, undefined, this); + this.physics.add.overlap(this.player, this.enemyGroup, this.onPlayerEnemy, undefined, this); + this.physics.add.overlap(this.fireballGroup, this.enemyGroup, this.onFireballEnemy, undefined, this); + this.physics.add.overlap(this.player, this.piranhaGroup, this.onPlayerPiranha, undefined, this); + this.physics.add.overlap(this.player, this.fireGroup, this.onPlayerFire, undefined, this); + this.physics.add.overlap(this.player, this.crocGroup, this.onPlayerCroc, undefined, this); + this.physics.add.overlap(this.player, this.fishGroup, this.onPlayerFish, undefined, this); + this.physics.add.collider(this.player, this.bridgeGroup, this.onPlayerBridge, undefined, this); + this.physics.add.collider(this.enemyGroup, this.bridgeGroup); + this.physics.add.overlap(this.player, this.flagGroup, this.onPlayerFlag, undefined, this); + this.physics.add.collider(this.player, this.bounceGroup, this.onPlayerBounce, undefined, this); + this.physics.add.collider(this.enemyGroup, this.bounceGroup); + // Input + this.input.keyboard.addCapture('UP,DOWN,LEFT,RIGHT,SPACE,SHIFT,F,Z'); + this.cursors = this.input.keyboard.createCursorKeys(); + this.keys = { + space: this.input.keyboard.addKey('SPACE'), + shift: this.input.keyboard.addKey('SHIFT'), + f: this.input.keyboard.addKey('F'), + z: this.input.keyboard.addKey('Z'), + }; + this.addDecorations(); + this.generateLevel(SPAWN_X + 400, W + 600); + this.syncLivesToHUD(); + this.loadHighScore(); + this.distanceSinceFlag = 0; + this.currentLevel = 1; + this.syncLevelToHUD(this.currentLevel); + this.sfx('nr_startlevel', 0.25); + this.startWithReadyScreen(); + } + // ---------- Brick / block textures generated at runtime via Graphics ---------- + makeBlockTextures() { + const g = this.add.graphics(); + // Used Q-block (brown/empty) — 16×16 to match source tile size + g.clear(); + g.fillStyle(0xa56a26); + g.fillRect(0, 0, 16, 16); + g.fillStyle(0x6e4715); + g.fillRect(0, 0, 16, 1); + g.fillRect(0, 15, 16, 1); + g.fillRect(0, 0, 1, 16); + g.fillRect(15, 0, 1, 16); + g.generateTexture('qblock_used', 16, 16); + // Pipe body (2 blocks wide) + g.clear(); + g.fillStyle(0x20a010); + g.fillRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0x00680c); + g.lineStyle(2, 0x00680c); + g.strokeRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0x80e080); + g.fillRect(BLOCK / 3 + 4, 0, 4, BLOCK); + g.generateTexture('pipe_body', BLOCK * 2, BLOCK); + // Mushroom + g.clear(); + g.fillStyle(0xd02020); + g.fillRect(2, 2, 28, 16); + g.fillStyle(0xffffff); + g.fillRect(8, 6, 6, 6); + g.fillRect(18, 6, 6, 6); + g.fillStyle(0xf0d8a0); + g.fillRect(6, 18, 20, 12); + g.fillStyle(0x000000); + g.fillRect(11, 22, 3, 4); + g.fillRect(18, 22, 3, 4); + g.generateTexture('mushroom', 32, 32); + // Fireball + g.clear(); + g.fillStyle(0xff8000); + g.fillCircle(8, 8, 7); + g.fillStyle(0xffe080); + g.fillCircle(6, 6, 3); + g.generateTexture('fireball', 16, 16); + // Fire eruption — organic flame shape with layered colors + g.clear(); + // Outer flame (dark red) + g.fillStyle(0xcc2200); + g.fillEllipse(8, 24, 14, 16); + g.fillEllipse(8, 14, 10, 14); + g.fillEllipse(8, 6, 6, 10); + // Middle flame (orange) + g.fillStyle(0xff6600); + g.fillEllipse(8, 26, 10, 12); + g.fillEllipse(8, 16, 8, 12); + g.fillEllipse(8, 8, 4, 8); + // Inner flame (yellow core) + g.fillStyle(0xffcc00); + g.fillEllipse(8, 28, 6, 8); + g.fillEllipse(8, 20, 4, 8); + // Hot white tip + g.fillStyle(0xffffaa); + g.fillEllipse(8, 28, 3, 5); + g.generateTexture('fire_column', 16, 32); + // Piranha plant frame 0 (mouth closed) + g.clear(); + g.fillStyle(0x22aa22); + g.fillRect(11, 16, 10, 16); + g.fillStyle(0xdd2020); + g.fillEllipse(16, 10, 24, 16); + g.fillStyle(0xffffff); + g.fillCircle(10, 8, 2); + g.fillCircle(16, 6, 2); + g.fillCircle(22, 8, 2); + g.generateTexture('piranha_0', 32, 32); + // Piranha plant frame 1 (mouth open) + g.clear(); + g.fillStyle(0x22aa22); + g.fillRect(11, 18, 10, 14); + g.fillStyle(0xdd2020); + g.fillEllipse(16, 10, 26, 18); + g.fillStyle(0xffffff); + g.fillCircle(10, 7, 2); + g.fillCircle(16, 5, 2); + g.fillCircle(22, 7, 2); + g.fillStyle(0x000000); + g.fillRect(8, 12, 16, 3); + g.generateTexture('piranha_1', 32, 32); + // Power-up glow effect + g.clear(); + g.fillStyle(0xffdd00, 0.3); + g.fillCircle(20, 20, 20); + g.fillStyle(0xffff88, 0.2); + g.fillCircle(20, 20, 14); + g.generateTexture('glow', 40, 40); + // Individual cloud puffs (3 sizes for variety) + g.clear(); + g.fillStyle(0xffffff); + g.fillCircle(10, 10, 8); + g.fillCircle(20, 8, 10); + g.fillCircle(32, 10, 9); + g.fillCircle(16, 14, 7); + g.fillCircle(26, 14, 8); + g.generateTexture('cloud_sm', 42, 22); + g.clear(); + g.fillStyle(0xffffff); + g.fillCircle(14, 14, 12); + g.fillCircle(30, 10, 14); + g.fillCircle(48, 14, 11); + g.fillCircle(22, 18, 10); + g.fillCircle(38, 18, 12); + g.generateTexture('cloud_md', 60, 28); + g.clear(); + g.fillStyle(0xffffff); + g.fillCircle(16, 16, 14); + g.fillCircle(36, 12, 16); + g.fillCircle(58, 14, 13); + g.fillCircle(24, 22, 12); + g.fillCircle(46, 20, 14); + g.fillCircle(70, 16, 10); + g.generateTexture('cloud_lg', 82, 32); + // Green bat enemy — flies in a wave pattern + g.clear(); + g.fillStyle(0x22aa44); + g.fillEllipse(8, 9, 8, 8); + g.fillStyle(0x44dd66); + g.fillTriangle(1, 6, 6, 8, 3, 12); // left wing + g.fillTriangle(15, 6, 10, 8, 13, 12); // right wing + g.fillStyle(0xff0000); + g.fillCircle(6, 8, 1); + g.fillCircle(10, 8, 1); + g.generateTexture('bat_0', 16, 16); + g.clear(); + g.fillStyle(0x22aa44); + g.fillEllipse(8, 9, 8, 8); + g.fillStyle(0x44dd66); + g.fillTriangle(1, 10, 6, 8, 3, 4); // wings up + g.fillTriangle(15, 10, 10, 8, 13, 4); + g.fillStyle(0xff0000); + g.fillCircle(6, 8, 1); + g.fillCircle(10, 8, 1); + g.generateTexture('bat_1', 16, 16); + // Warp pipe (lighter green with down arrow) + g.clear(); + g.fillStyle(0x30c030); + g.fillRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0x10a010); + g.lineStyle(2, 0x10a010); + g.strokeRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0xa0ffa0); + g.fillRect(BLOCK / 3 + 4, 0, 4, BLOCK); + g.fillStyle(0xffffff); + g.fillTriangle(BLOCK, 4, BLOCK - 6, BLOCK / 2 - 4, BLOCK + 6, BLOCK / 2 - 4); + g.generateTexture('pipe_warp', BLOCK * 2, BLOCK); + // Golden pipe (parachute trigger) + g.clear(); + g.fillStyle(0xdaa520); + g.fillRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0xb8860b); + g.lineStyle(2, 0xb8860b); + g.strokeRect(0, 0, BLOCK * 2, BLOCK); + g.fillStyle(0xffd700); + g.fillRect(BLOCK / 3 + 4, 0, 4, BLOCK); + g.fillStyle(0xffffff); + g.fillTriangle(BLOCK, BLOCK / 2 - 2, BLOCK - 5, BLOCK / 2 + 6, BLOCK + 5, BLOCK / 2 + 6); + g.generateTexture('pipe_gold', BLOCK * 2, BLOCK); + // Parachute canopy — half-dome with red/white panels, scalloped rim, strings + g.clear(); + const cw = 64, ch = 80; + const domeBottom = 36; // y where the canopy ends + // Draw dome as upper half only — fill a tall ellipse then cover the bottom half + g.fillStyle(0xff2020); + g.fillEllipse(cw / 2, domeBottom, cw - 4, 56); // tall ellipse centered at rim + // Cover lower half so only the dome (upper half) remains + g.fillStyle(0x000000, 0.0); + // We can't erase, so draw the dome differently: + // Use a filled arc approach — draw overlapping circles for dome shape + g.clear(); + // Red canopy dome — build with filled upper-half ellipse + // Panel 1 (red) — left + g.fillStyle(0xff2020); + g.fillRoundedRect(2, 4, 14, domeBottom - 4, { tl: 10, tr: 4, bl: 0, br: 0 }); + // Panel 2 (white) + g.fillStyle(0xffffff); + g.fillRoundedRect(16, 2, 10, domeBottom - 2, { tl: 6, tr: 6, bl: 0, br: 0 }); + // Panel 3 (red) — center + g.fillStyle(0xff2020); + g.fillRoundedRect(26, 1, 12, domeBottom - 1, { tl: 8, tr: 8, bl: 0, br: 0 }); + // Panel 4 (white) + g.fillStyle(0xffffff); + g.fillRoundedRect(38, 2, 10, domeBottom - 2, { tl: 6, tr: 6, bl: 0, br: 0 }); + // Panel 5 (red) — right + g.fillStyle(0xff2020); + g.fillRoundedRect(48, 4, 14, domeBottom - 4, { tl: 4, tr: 10, bl: 0, br: 0 }); + // Top cap to round off the top + g.fillStyle(0xff2020); + g.fillEllipse(cw / 2, 6, 36, 12); + // Scalloped bottom edge — small arcs to suggest billowy fabric + g.fillStyle(0xff2020); + for (let sx = 5; sx < cw - 4; sx += 12) { + g.fillEllipse(sx + 6, domeBottom, 13, 6); + } + // Dark rim outline along bottom edge + g.lineStyle(2, 0x880000); + g.lineBetween(2, domeBottom, cw - 2, domeBottom); + // Panel divider lines + g.lineStyle(1, 0xaa0000); + g.lineBetween(16, 6, 16, domeBottom); + g.lineBetween(26, 4, 26, domeBottom); + g.lineBetween(38, 4, 38, domeBottom); + g.lineBetween(48, 6, 48, domeBottom); + // Outer rim outline + g.lineStyle(2, 0x880000); + g.strokeRoundedRect(2, 2, cw - 4, domeBottom, { tl: 14, tr: 14, bl: 0, br: 0 }); + // Strings — fan out from canopy rim to a gather point near player + g.lineStyle(1, 0x654321); + const gatherY = ch - 2; + const gatherX = cw / 2; + g.lineBetween(4, domeBottom + 2, gatherX - 4, gatherY); + g.lineBetween(16, domeBottom + 2, gatherX - 2, gatherY); + g.lineBetween(cw / 2, domeBottom + 2, gatherX, gatherY); + g.lineBetween(48, domeBottom + 2, gatherX + 2, gatherY); + g.lineBetween(cw - 4, domeBottom + 2, gatherX + 4, gatherY); + g.generateTexture('parachute', cw, ch); + // Coin frame 0 (circle) + g.clear(); + g.fillStyle(0xffd24a); + g.fillCircle(12, 12, 9); + g.fillStyle(0xb88a1f); + g.fillRect(11, 3, 2, 18); + g.generateTexture('coin0', 24, 24); + // Coin frame 1 (thin) + g.clear(); + g.fillStyle(0xffd24a); + g.fillRect(9, 3, 6, 18); + g.fillStyle(0xb88a1f); + g.fillRect(11, 3, 2, 18); + g.generateTexture('coin1', 24, 24); + // Water tile — blue gradient with a subtle wave highlight + g.clear(); + g.fillStyle(0x1a5276); + g.fillRect(0, 0, BLOCK, BLOCK); + g.fillStyle(0x2471a3); + g.fillRect(0, 0, BLOCK, BLOCK * 0.3); + g.fillStyle(0x85c1e9, 0.5); + g.fillRect(4, 2, BLOCK * 0.3, 3); + g.fillStyle(0x85c1e9, 0.4); + g.fillRect(BLOCK * 0.55, 6, BLOCK * 0.25, 2); + g.generateTexture('water', BLOCK, BLOCK); + // Crocodile — Side view with tail, head poking above water + // Both textures share the same back/body y-positions so swapping doesn't + // make the croc rise out of the water. + const crW = 64, crH = 22; + const backY = 6; // top of back ridge — same in both states + // Mouth closed (safe to stomp) + g.clear(); + // Tail — tapers to the left + g.fillStyle(0x3d5c1e); + g.fillTriangle(0, backY + 4, 14, backY + 2, 14, backY + 8); + g.fillStyle(0x2d4a14); + g.fillTriangle(0, backY + 4, 8, backY + 3, 8, backY + 6); // darker tip + // Tail ridges + g.lineStyle(1, 0x2d4a14); + g.lineBetween(4, backY + 3, 4, backY + 6); + g.lineBetween(8, backY + 2, 8, backY + 7); + // Body/back — long green shape + g.fillStyle(0x3d5c1e); + g.fillRoundedRect(12, backY, crW - 12, 12, { tl: 3, tr: 2, bl: 3, br: 2 }); + // Snout — extends forward (right side) + g.fillStyle(0x4a6e23); + g.fillRoundedRect(crW - 18, backY + 2, 18, 8, { tl: 0, tr: 3, bl: 0, br: 3 }); + // Darker dorsal ridge with bumps + g.fillStyle(0x2d4a14); + g.fillRect(14, backY, crW - 32, 3); + for (let bx = 16; bx < crW - 20; bx += 6) { + g.fillRect(bx, backY + 1, 3, 2); + } + // Nostril + g.fillStyle(0x1a2e0a); + g.fillCircle(crW - 4, backY + 5, 1); + // Eye — yellow with black pupil + g.fillStyle(0xffdd00); + g.fillCircle(crW - 20, backY + 4, 3); + g.fillStyle(0x111111); + g.fillCircle(crW - 19, backY + 4, 1.5); + // Jaw line + g.lineStyle(1, 0x2d4a14); + g.lineBetween(crW - 18, backY + 8, crW - 2, backY + 8); + // Teeth hints along closed jaw + g.fillStyle(0xeeeeee); + for (let tx = crW - 16; tx < crW - 2; tx += 4) { + g.fillTriangle(tx, backY + 8, tx + 2, backY + 8, tx + 1, backY + 10); + } + g.generateTexture('croc_closed', crW, crH); + // Mouth open (danger!) — back stays at same y, only jaws move + g.clear(); + // Tail — same as closed + g.fillStyle(0x3d5c1e); + g.fillTriangle(0, backY + 4, 14, backY + 2, 14, backY + 8); + g.fillStyle(0x2d4a14); + g.fillTriangle(0, backY + 4, 8, backY + 3, 8, backY + 6); + g.lineStyle(1, 0x2d4a14); + g.lineBetween(4, backY + 3, 4, backY + 6); + g.lineBetween(8, backY + 2, 8, backY + 7); + // Body/back — same position as closed + g.fillStyle(0x3d5c1e); + g.fillRoundedRect(12, backY, crW - 30, 10, { tl: 3, tr: 2, bl: 3, br: 2 }); + // Dorsal ridge — same + g.fillStyle(0x2d4a14); + g.fillRect(14, backY, crW - 32, 3); + for (let bx = 16; bx < crW - 20; bx += 6) { + g.fillRect(bx, backY + 1, 3, 2); + } + // Upper jaw — tilted up from back line + g.fillStyle(0x4a6e23); + g.fillRoundedRect(crW - 18, backY - 2, 18, 6, { tl: 0, tr: 3, bl: 0, br: 0 }); + // Lower jaw — drops down into water + g.fillStyle(0x4a6e23); + g.fillRoundedRect(crW - 18, backY + 10, 18, 6, { tl: 0, tr: 0, bl: 0, br: 3 }); + // Red mouth interior + g.fillStyle(0xcc2222); + g.fillRect(crW - 16, backY + 4, 14, 6); + // Upper teeth + g.fillStyle(0xffffff); + for (let tx = crW - 16; tx < crW - 2; tx += 4) { + g.fillTriangle(tx, backY + 4, tx + 2, backY + 4, tx + 1, backY + 6); + } + // Lower teeth + for (let tx = crW - 16; tx < crW - 2; tx += 4) { + g.fillTriangle(tx, backY + 10, tx + 2, backY + 10, tx + 1, backY + 8); + } + // Nostril + g.fillStyle(0x1a2e0a); + g.fillCircle(crW - 4, backY - 1, 1); + // Eye — yellow with black pupil (same as closed) + g.fillStyle(0xffdd00); + g.fillCircle(crW - 20, backY + 1, 3); + g.fillStyle(0x111111); + g.fillCircle(crW - 19, backY + 1, 1.5); + g.generateTexture('croc_open', crW, crH); + // Fish — small side-view fish for bridge gaps + const fW = 20, fH = 14; + g.clear(); + // Body — orange/gold oval + g.fillStyle(0xff8800); + g.fillRoundedRect(2, 3, fW - 6, fH - 6, 4); + // Belly highlight + g.fillStyle(0xffbb44); + g.fillRoundedRect(4, 6, fW - 10, 4, 2); + // Tail fin + g.fillStyle(0xff6600); + g.fillTriangle(0, 3, 0, fH - 3, 5, fH / 2); + // Dorsal fin + g.fillStyle(0xff6600); + g.fillTriangle(8, 3, 14, 3, 11, 0); + // Eye + g.fillStyle(0xffffff); + g.fillCircle(fW - 7, 6, 2); + g.fillStyle(0x111111); + g.fillCircle(fW - 6, 6, 1); + // Mouth + g.lineStyle(1, 0xcc4400); + g.lineBetween(fW - 3, 7, fW - 1, 7); + g.generateTexture('fish', fW, fH); + // Bounce pad (spring block) + g.clear(); + g.fillStyle(0xff6600); + g.fillRect(0, 0, BLOCK, BLOCK); + g.fillStyle(0xff9933); + g.fillRect(4, 4, BLOCK - 8, BLOCK / 3); + g.fillStyle(0xcc4400); + g.fillRect(0, 0, BLOCK, 2); + g.fillRect(0, BLOCK - 2, BLOCK, 2); + g.fillRect(0, 0, 2, BLOCK); + g.fillRect(BLOCK - 2, 0, 2, BLOCK); + g.fillStyle(0xffcc00); + g.fillRect(BLOCK / 4, BLOCK / 3, BLOCK / 2, 4); + g.fillRect(BLOCK / 4, BLOCK / 3 + 8, BLOCK / 2, 4); + g.generateTexture('bounce_pad', BLOCK, BLOCK); + g.destroy(); + } + addDecorations() { + // Semi-transparent tiled background — mountains peeking through + // The image is 320×180, tile it across a wide area with slow parallax + for (let i = 0; i < 30; i++) { + this.add.image(i * W * 0.5, H / 2, 'background') + .setDisplaySize(W * 0.5, H) + .setAlpha(0.18) + .setScrollFactor(0.05) + .setDepth(-5); + } + // Hills behind the ground — very subtle + for (let i = 0; i < 20; i++) { + const hx = i * 500 + Math.random() * 300; + const isSmall = Math.random() < 0.5; + const tex = isSmall ? 'hill_0' : 'hill_1'; + const hh = isSmall ? 64 : 96; + this.add.image(hx, GROUND_Y - hh / 2 + 10, tex) + .setDisplaySize(isSmall ? 64 : 64, hh) + .setAlpha(0.12) + .setScrollFactor(0.3) + .setDepth(-2); + } + // Bushes at ground level — decorative + for (let i = 0; i < 25; i++) { + const bx = i * 400 + Math.random() * 200; + const isBig = Math.random() < 0.4; + const tex = isBig ? 'big_bush' : 'small_bush'; + this.add.image(bx, GROUND_Y - 8, tex) + .setDisplaySize(isBig ? 96 : 64, 32) + .setAlpha(0.2) + .setScrollFactor(0.5) + .setDepth(-1); + } + } + extendGround(fromX, toX) { + for (let x = Math.floor(fromX / BLOCK) * BLOCK; x < toX; x += BLOCK) { + if (this.isInGap(x + BLOCK / 2)) + continue; + // skip if already there + const exists = this.groundGroup.getChildren().some((g) => Math.abs(g.x - (x + BLOCK / 2)) < 1); + if (exists) + continue; + const g = this.groundGroup.create(x + BLOCK / 2, GROUND_Y + BLOCK / 2, 'grass_block'); + g.setDisplaySize(BLOCK, BLOCK); + g.refreshBody(); + const BIOME_TINTS = [0xffffff, 0xdec487, 0xb39ddb, 0xb3e5fc]; + g.setTint(BIOME_TINTS[this.currentBiome % 4]); + } + } + isInGap(wx) { + for (const gap of this.gaps) { + if (wx >= gap.start && wx < gap.end) + return true; + } + return false; + } + /** Returns true if wx is near any solid obstacle (pipe, brick, qblock, bounce pad). */ + isNearObstacle(wx) { + const check = (group) => { + const children = group.getChildren(); + for (const p of children) { + if (!p.active) + continue; + if (Math.abs(wx - p.x) < BLOCK * 1.2) + return true; + } + return false; + }; + return check(this.pipeGroup) || check(this.brickGroup) || check(this.qblockGroup) || check(this.bounceGroup) || check(this.fireGroup); + } + /** Fill a gap with decorative water tiles. */ + fillWater(gapX, gapW) { + const startY = GROUND_Y + BLOCK * 0.1; + const rows = Math.ceil((H - startY) / BLOCK) + 1; + // Place water tiles at the exact same grid positions where ground blocks were removed + for (let gx = Math.floor(gapX / BLOCK) * BLOCK; gx < gapX + gapW; gx += BLOCK) { + const cx = gx + BLOCK / 2; + // Only place if this position is inside the gap + if (!this.isInGap(cx)) + continue; + for (let row = 0; row < rows; row++) { + const w = this.add.image(cx, startY + row * BLOCK + BLOCK / 2, 'water'); + w.setDisplaySize(BLOCK, BLOCK); + w.setDepth(-1); + } + } + } + generateLevel(lo, hi) { + let x = Math.max(lo, this.genX); + let lastPattern = -1; + while (x < hi) { + // Varied spacing: mix short (2-3), medium (4-6), and occasional long (7-10) gaps + const spacingRoll = Math.random(); + const spacing = spacingRoll < 0.3 ? (2 + Math.floor(Math.random() * 2)) + : spacingRoll < 0.75 ? (4 + Math.floor(Math.random() * 3)) + : (7 + Math.floor(Math.random() * 4)); + x += spacing * BLOCK; + // Pick a pattern using shuffle-style selection (avoid repeating last pattern) + let pattern; + do { + pattern = Math.floor(Math.random() * 20); + } while (pattern === lastPattern); + lastPattern = pattern; + if (pattern === 0) { + // Coin arch — 5-6 coins in a parabolic arc + const arcLen = 5 + Math.floor(Math.random() * 2); + for (let i = 0; i < arcLen; i++) { + const t = i / (arcLen - 1); + const arcY = GROUND_Y - BLOCK * 1.5 - Math.sin(t * Math.PI) * BLOCK * 2; + const c = this.coinGroup.create(x + i * BLOCK + BLOCK / 2, arcY, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + x += arcLen * BLOCK; + } + else if (pattern === 1) { + // Block row with ?-block + const n = 3 + Math.floor(Math.random() * 2); + const y = GROUND_Y - BLOCK * 2; + const qi = Math.floor(Math.random() * n); + for (let i = 0; i < n; i++) { + const bx = x + i * BLOCK; + if (i === qi) { + const q = this.qblockGroup.create(bx + BLOCK / 2, y + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', 'coin'); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + } + else { + const b = this.brickGroup.create(bx + BLOCK / 2, y + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + } + // Coins above block row + for (let i = 0; i < n; i++) { + if (Math.random() < 0.4) { + const c = this.coinGroup.create(x + i * BLOCK + BLOCK / 2, y - BLOCK / 2, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + } + x += n * BLOCK; + // Enemy patrolling on top of the block row (~60% chance, ground types only) + if (Math.random() < 0.6) { + const enemyX = x - Math.floor(n / 2) * BLOCK; + const e = this.spawnEnemyAt('goomba', enemyX, y - BLOCK, true); + if (e) { + e.setVelocityX(0); + e.setData('patrolAwait', true); + e.setData('patrolLeft', enemyX - BLOCK * (n / 2 - 0.5)); + e.setData('patrolRight', enemyX + BLOCK * (n / 2 - 0.5)); + } + } + } + else if (pattern === 2) { + // Bounce pad — spring block that launches the player + const pad = this.bounceGroup.create(x + BLOCK / 2, GROUND_Y - BLOCK / 2, 'bounce_pad'); + pad.setDisplaySize(BLOCK, BLOCK); + pad.refreshBody(); + // Coins high above the pad as reward + for (let i = 0; i < 3; i++) { + const c = this.coinGroup.create(x + BLOCK / 2, GROUND_Y - BLOCK * (4 + i), 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + x += BLOCK * 2; + } + else if (pattern === 3) { + // Pipe — 1-2 blocks tall (jumpable) + const pipeBlocks = 1 + Math.floor(Math.random() * 2); + const ph = pipeBlocks * BLOCK; + const pw = 2 * BLOCK; + const py = GROUND_Y - ph; + const isGold = Math.random() < 0.25; + const isWarp = !isGold && Math.random() < 0.4; + let topSeg = null; + for (let yy = py; yy < GROUND_Y; yy += BLOCK) { + const isTop = yy === py; + const tex = isTop && isGold ? 'pipe_gold' : isTop && isWarp ? 'pipe_warp' : 'pipe_body'; + const seg = this.pipeGroup.create(x + pw / 2, yy + BLOCK / 2, tex); + seg.setDisplaySize(BLOCK * 2, BLOCK); + seg.refreshBody(); + if (isTop) + topSeg = seg; + } + if (topSeg) { + if (isWarp) + topSeg.setData('warp', true); + if (isGold) + topSeg.setData('gold', true); + } + // Piranha plant on regular pipes (~60% chance) + if (!isWarp && !isGold && Math.random() < 0.6) { + const p = this.piranhaGroup.create(x + pw / 2, py - 8, 'piranha_0'); + p.setOrigin(0.5, 1); + p.setDisplaySize(BLOCK * 0.8, BLOCK); + p.body.setAllowGravity(false); + p.setData('pipeX', x + pw / 2); + p.setData('pipeTopY', py); + p.setData('timer', Math.random() * 4000); + p.setData('exposed', false); + p.setVisible(false); + } + x += pw; + } + else if (pattern === 4) { + // Enemy — single (combined enemy types, random pick) + const types = ['goomba', 'goomba', 'koopa', 'rkoopa']; + this.spawnEnemy(types[Math.floor(Math.random() * types.length)], x); + x += BLOCK * 2; + } + else if (pattern === 5) { + // Enemy pair — two different enemies spawned close together + const types = ['goomba', 'koopa', 'rkoopa']; + const t1 = types[Math.floor(Math.random() * types.length)]; + let t2 = types[Math.floor(Math.random() * types.length)]; + while (t2 === t1) + t2 = types[Math.floor(Math.random() * types.length)]; + this.spawnEnemy(t1, x); + this.spawnEnemy(t2, x + BLOCK * 2); + x += BLOCK * 4; + } + else if (pattern === 6) { + // Combined ?-block — mushroom or coin reward + const reward = Math.random() < 0.35 ? 'mushroom' : 'coin'; + const q = this.qblockGroup.create(x + BLOCK / 2, GROUND_Y - BLOCK * 2 + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', reward); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + x += BLOCK; + } + else if (pattern === 7) { + // Ascending staircase with enemy on top (max 3 steps for reachability) + const h = 2 + Math.floor(Math.random() * 2); + for (let step = 0; step < h; step++) { + const b = this.brickGroup.create(x + step * BLOCK + BLOCK / 2, GROUND_Y - (step + 1) * BLOCK + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + // 50% chance enemy on the top step + if (Math.random() < 0.5) { + const topX = x + (h - 1) * BLOCK + BLOCK / 2; + const topY = GROUND_Y - h * BLOCK - BLOCK; + this.spawnEnemyAt('goomba', topX, topY); + } + x += h * BLOCK; + } + else if (pattern === 8) { + // Water gap + const gapW = (3 + Math.floor(Math.random() * 2)) * BLOCK; + this.gaps.push({ start: x, end: x + gapW }); + this.groundGroup.getChildren().forEach((g) => { + if (g.x >= x && g.x < x + gapW) + g.destroy(); + }); + this.fillWater(x, gapW); + // 50% chance: fire eruption hazard in the gap + if (Math.random() < 0.5) { + const fireX = x + gapW / 2; + const f = this.fireGroup.create(fireX, GROUND_Y + BLOCK * 2, 'fire_column'); + f.setDisplaySize(BLOCK * 0.8, BLOCK * 2); + f.setOrigin(0.5, 1); + f.body.setAllowGravity(false); + f.setData('baseY', GROUND_Y + BLOCK * 2); + f.setData('gapX', fireX); + f.setData('active', false); + f.setVisible(false); + f.body.enable = false; + } + x += gapW; + } + else if (pattern === 9) { + // Collapsing bridge over gap + const bridgeLen = 4 + Math.floor(Math.random() * 4); + const gapW = bridgeLen * BLOCK; + this.gaps.push({ start: x, end: x + gapW }); + this.groundGroup.getChildren().forEach((g) => { + if (g.x >= x && g.x < x + gapW) + g.destroy(); + }); + this.fillWater(x, gapW); + // Decide which tiles are unstable: first & last always stable, + // never two consecutive unstable, max ~40% unstable + const unstableMap = new Array(bridgeLen).fill(false); + const maxUnstable = Math.floor(bridgeLen * 0.4); + let unstableCount = 0; + for (let i = 1; i < bridgeLen - 1; i++) { + if (unstableCount >= maxUnstable) + break; + if (unstableMap[i - 1]) + continue; // previous was unstable, skip + if (Math.random() < 0.35) { + unstableMap[i] = true; + unstableCount++; + } + } + for (let i = 0; i < bridgeLen; i++) { + const bx = x + i * BLOCK + BLOCK / 2; + const bt = this.bridgeGroup.create(bx, GROUND_Y + BLOCK / 2, 'bridge_tile'); + bt.setDisplaySize(BLOCK, BLOCK); + bt.refreshBody(); + bt.setData('unstable', unstableMap[i]); + bt.setData('collapsing', false); + // Spawn a fish under each unstable tile + if (unstableMap[i]) { + const fish = this.fishGroup.create(bx, GROUND_Y + BLOCK * 2, 'fish'); + fish.setOrigin(0.5, 0.5); + fish.body.setAllowGravity(false); + fish.setVisible(false); + fish.body.enable = false; + fish.setData('homeX', bx); + fish.setData('jumped', false); + } + } + x += gapW; + } + else if (pattern === 10) { + // Multi-tier platform — 2 levels with room to run + const lowerY = GROUND_Y - BLOCK * 2; + for (let i = 0; i < 4; i++) { + if (i === 1) { + const q = this.qblockGroup.create(x + i * BLOCK + BLOCK / 2, lowerY + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', 'coin'); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + } + else { + const b = this.brickGroup.create(x + i * BLOCK + BLOCK / 2, lowerY + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + } + const upperY = GROUND_Y - BLOCK * 5.5; + for (let i = 1; i <= 2; i++) { + const b = this.brickGroup.create(x + i * BLOCK + BLOCK / 2, upperY + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + const c = this.coinGroup.create(x + 1.5 * BLOCK + BLOCK / 2, upperY - BLOCK / 2, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + x += 4 * BLOCK; + } + else if (pattern === 11) { + // Mixed brick/qblock cluster with enemy + const clusterLen = 5; + const clusterY = GROUND_Y - BLOCK * 2; + const qPositions = new Set(); + const qCount = 1 + Math.floor(Math.random() * 2); + while (qPositions.size < qCount) { + qPositions.add(Math.floor(Math.random() * clusterLen)); + } + for (let i = 0; i < clusterLen; i++) { + if (qPositions.has(i)) { + const q = this.qblockGroup.create(x + i * BLOCK + BLOCK / 2, clusterY + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', 'coin'); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + } + else { + const b = this.brickGroup.create(x + i * BLOCK + BLOCK / 2, clusterY + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + } + x += clusterLen * BLOCK; + // Enemy on top of the cluster + if (Math.random() < 0.5) { + this.spawnEnemyAt('goomba', x - 2 * BLOCK, clusterY - BLOCK); + } + } + else if (pattern === 12) { + // Elevated bridge with enemy + const bridgeLen = 4 + Math.floor(Math.random() * 3); + const bridgeY = GROUND_Y - BLOCK * 2; + for (let i = 0; i < bridgeLen; i++) { + const b = this.brickGroup.create(x + i * BLOCK + BLOCK / 2, bridgeY + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + // Coins along the bridge + for (let i = 0; i < bridgeLen; i += 2) { + const c = this.coinGroup.create(x + i * BLOCK + BLOCK / 2, bridgeY - BLOCK / 2, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + this.spawnEnemyAt('goomba', x + BLOCK, bridgeY - BLOCK); + x += bridgeLen * BLOCK; + } + else if (pattern === 13) { + // Descending staircase + const h = 2 + Math.floor(Math.random() * 2); + for (let step = 0; step < h; step++) { + const b = this.brickGroup.create(x + step * BLOCK + BLOCK / 2, GROUND_Y - (h - step) * BLOCK + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + // Enemy on top + if (Math.random() < 0.4) { + this.spawnEnemyAt('goomba', x + BLOCK / 2, GROUND_Y - h * BLOCK - BLOCK); + } + x += h * BLOCK; + } + else if (pattern === 14) { + // Floating coins — zigzag pattern + const zigLen = 4 + Math.floor(Math.random() * 2); + for (let i = 0; i < zigLen; i++) { + const zigY = GROUND_Y - BLOCK * 2 - (i % 2 === 0 ? 0 : BLOCK); + const c = this.coinGroup.create(x + i * BLOCK + BLOCK / 2, zigY, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + x += zigLen * BLOCK; + } + else if (pattern === 15) { + // Spike gauntlet — spike, platform, spike, platform pattern + const pairs = 2 + Math.floor(Math.random() * 2); // 2-3 spike-platform pairs + const spacing = BLOCK * 1.6; + for (let i = 0; i < pairs * 2 + 1; i++) { + const sx = x + i * spacing; + if (i % 2 === 0) { + // Spike + const spike = this.add.image(sx + BLOCK / 2, GROUND_Y - BLOCK * 0.3, 'spikes_tile'); + spike.setDisplaySize(BLOCK, BLOCK * 0.6); + spike.setDepth(2); + const hitZone = this.fireGroup.create(sx + BLOCK / 2, GROUND_Y - BLOCK * 0.2, 'spikes_tile'); + hitZone.setDisplaySize(BLOCK * 0.9, BLOCK * 0.4); + hitZone.setAlpha(0); + hitZone.body.setAllowGravity(false); + hitZone.body.enable = true; + // Warm glow behind spikes (Ellipse Shape — WebGL batched) + const spikeGlow = this.add.ellipse(sx + BLOCK / 2, GROUND_Y - BLOCK * 0.4, BLOCK * 1.8, BLOCK * 1.6, 0xff4400, 1.0); + spikeGlow.setDepth(1); + spikeGlow.setAlpha(0.2); + spikeGlow.setBlendMode(Phaser.BlendModes.ADD); + hitZone.setData('manualGlow', spikeGlow); + hitZone.setData('hasGlow', true); + // Sparks that shoot UP high above the spikes + const sparks = this.add.particles(sx + BLOCK / 2, GROUND_Y - BLOCK * 0.6, 'coin0', { + speed: { min: 40, max: 100 }, + angle: { min: 250, max: 290 }, + scale: { start: 0.2, end: 0 }, + alpha: { start: 0.9, end: 0 }, + lifespan: { min: 500, max: 1200 }, + frequency: 120, + quantity: 2, + tint: [0xff2200, 0xff4400, 0xff6600, 0xffaa00, 0xffff00], + blendMode: 'ADD', + gravityY: 30, + }); + sparks.setDepth(3); + hitZone.setData('sparks', sparks); + } + else { + // Small raised platform to land on between spikes + const plat = this.groundGroup.create(sx + BLOCK / 2, GROUND_Y - BLOCK * 0.5 + BLOCK / 2, 'grass_block'); + plat.setDisplaySize(BLOCK, BLOCK); + plat.refreshBody(); + } + } + x += (pairs * 2 + 1) * spacing; + } + else if (pattern === 16) { + // Staircase up — 3 tiers ascending, enough clearance to run on each + for (let tier = 0; tier < 3; tier++) { + const tierY = GROUND_Y - BLOCK * (2 + tier * 3); + const tierX = x + tier * BLOCK * 2.5; + const width = 4 - tier; // wider at bottom + for (let i = 0; i < width; i++) { + // Top tier, first block → ?-block with reward + if (tier === 2 && i === 0) { + const q = this.qblockGroup.create(tierX + i * BLOCK + BLOCK / 2, tierY + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', Math.random() < 0.4 ? 'mushroom' : 'coin'); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + } + else { + const b = this.brickGroup.create(tierX + i * BLOCK + BLOCK / 2, tierY + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + } + // Coin on each tier + const c = this.coinGroup.create(tierX + BLOCK / 2, tierY - BLOCK / 2, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + x += 8 * BLOCK; + } + else if (pattern === 17) { + // Tower — 3-high column with platforms branching off, room to run + const towerX = x + BLOCK * 3; + for (let level = 0; level < 3; level++) { + const ly = GROUND_Y - BLOCK * (2 + level * 3); + // Central column block + const b = this.brickGroup.create(towerX + BLOCK / 2, ly + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + // Side platform (alternating left/right) + const side = level % 2 === 0 ? -1 : 1; + for (let s = 1; s <= 2; s++) { + const sb = this.brickGroup.create(towerX + side * s * BLOCK + BLOCK / 2, ly + BLOCK / 2, 'brown_block'); + sb.setDisplaySize(BLOCK, BLOCK); + sb.refreshBody(); + } + // Coin on the platform + const c = this.coinGroup.create(towerX + side * BLOCK + BLOCK / 2, ly - BLOCK / 2, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + x += 8 * BLOCK; + } + else if (pattern === 18) { + // Pyramid — wide base narrowing up, 3 levels with running room + const baseW = 5; + for (let level = 0; level < 3; level++) { + const ly = GROUND_Y - BLOCK * (2 + level * 3); + const lw = baseW - level * 2; + const lx = x + level * BLOCK; + for (let i = 0; i < lw; i++) { + const isQ = level === 2 && i === Math.floor(lw / 2); + if (isQ) { + const q = this.qblockGroup.create(lx + i * BLOCK + BLOCK / 2, ly + BLOCK / 2, 'qblock_img'); + q.setData('hit', false); + q.setData('reward', Math.random() < 0.3 ? 'mushroom' : 'coin'); + q.setDisplaySize(BLOCK, BLOCK); + q.refreshBody(); + } + else { + const b = this.brickGroup.create(lx + i * BLOCK + BLOCK / 2, ly + BLOCK / 2, 'brown_block'); + b.setDisplaySize(BLOCK, BLOCK); + b.refreshBody(); + } + } + } + // Enemy patrolling the base + if (Math.random() < 0.5) { + this.spawnEnemyAt('goomba', x + BLOCK, GROUND_Y - BLOCK); + } + x += (baseW + 1) * BLOCK; + } + else if (pattern === 19) { + // Small croc pond — narrow water gap with 1-2 crocodiles + const gapW = (2 + Math.floor(Math.random() * 2)) * BLOCK; // 2-3 blocks wide + this.gaps.push({ start: x, end: x + gapW }); + this.groundGroup.getChildren().forEach((g) => { + if (g.x >= x && g.x < x + gapW) + g.destroy(); + }); + this.fillWater(x, gapW); + const numCrocs = gapW >= BLOCK * 3 ? 2 : 1; + const spacing = gapW / (numCrocs + 1); + for (let ci = 0; ci < numCrocs; ci++) { + const cx = x + spacing * (ci + 1); + const cy = GROUND_Y + 8; // Sit on water surface + const croc = this.crocGroup.create(cx, cy, 'croc_closed'); + croc.setOrigin(0.5, 1); + croc.body.setAllowGravity(false); + croc.body.setSize(58, 16); + croc.setData('mouthOpen', false); + croc.setData('timer', this.time.now + 2000 + Math.random() * 2000); + croc.setData('gapStart', x); + croc.setData('gapEnd', x + gapW); + croc.setData('swimDir', Math.random() < 0.5 ? 1 : -1); + croc.setVelocityX(croc.getData('swimDir') * 30); + } + x += gapW; + } + } + this.genX = Math.max(this.genX, x); + this.extendGround(0, this.genX + W); + // Scatter decorative bushes in the new section + for (let bx = lo; bx < hi; bx += BLOCK * 6 + Math.floor(Math.random() * BLOCK * 4)) { + if (this.isInGap(bx)) + continue; + const isBig = Math.random() < 0.3; + const tex = isBig ? 'big_bush' : 'small_bush'; + const bush = this.add.image(bx, GROUND_Y, tex); + bush.setDisplaySize(isBig ? BLOCK * 1.5 : BLOCK, BLOCK * 0.5); + bush.setOrigin(0.5, 1); + bush.setDepth(1); + bush.setAlpha(0.8); + } + // Scatter ground-level coin trails between obstacles (skip coins near pipes) + for (let cx = lo; cx < hi; cx += BLOCK * 8 + Math.floor(Math.random() * BLOCK * 6)) { + if (this.isInGap(cx)) + continue; + if (Math.random() < 0.4) + continue; // skip some + const trailLen = 2 + Math.floor(Math.random() * 3); + for (let i = 0; i < trailLen; i++) { + const coinX = cx + i * BLOCK; + if (this.isInGap(coinX)) + break; + if (this.isNearObstacle(coinX)) + break; + const c = this.coinGroup.create(coinX + BLOCK / 2, GROUND_Y - BLOCK * 0.7, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + } + } + // Rare heart pickup — extra life, hard to reach (2% chance per section) + if (Math.random() < 0.02) { + // Place high above a random non-gap spot — needs bounce pad or double-jump + const hx = lo + Math.floor(Math.random() * (hi - lo - BLOCK * 4)) + BLOCK * 2; + if (!this.isInGap(hx)) { + const hy = GROUND_Y - BLOCK * (3 + Math.random() * 1.5); // high but reachable with a good jump + const h = this.heartGroup.create(hx, hy, 'heart_anim', 0); + h.setDisplaySize(BLOCK * 0.7, BLOCK * 0.7); + h.body.setAllowGravity(false); + h.anims.play('heart_pulse', true); + // Subtle float animation + this.tweens.add({ + targets: h, + y: hy - BLOCK * 0.3, + duration: 1200, + yoyo: true, + repeat: -1, + ease: 'Sine.easeInOut', + }); + } + } + // Flag checkpoint every ~2500px + this.distanceSinceFlag += (hi - lo); + if (this.distanceSinceFlag > 2500) { + this.distanceSinceFlag = 0; + const flagX = this.genX - BLOCK * 2; + if (!this.isInGap(flagX)) { + for (let i = 0; i < 3; i++) { + const pole = this.add.image(flagX, GROUND_Y - i * BLOCK - BLOCK / 2, 'brown_block'); + pole.setDisplaySize(BLOCK * 0.3, BLOCK); + pole.setDepth(1); + } + const flag = this.flagGroup.create(flagX, GROUND_Y - BLOCK * 3 + BLOCK / 2, 'flag_tile'); + flag.setDisplaySize(BLOCK, BLOCK * 1.5); + flag.setOrigin(0.5, 1); + flag.refreshBody(); + } + } + } + spawnEnemy(kind, x) { + this.spawnEnemyAt(kind, x + BLOCK / 2, GROUND_Y); + } + spawnEnemyAt(kind, x, y, groundOnly = false) { + let roll = Math.random(); + // When spawning on blocks, re-roll if we get a bat (bats fly away) + if (groundOnly && roll >= 0.80) + roll = Math.random() * 0.80; + let tex; + let animKey; + let enemyType; + let speed; + let displayH = BLOCK; + if (roll < 0.30) { + tex = 'enemy'; + animKey = 'enemy_walk'; + enemyType = 'monster'; + speed = -100; + } + else if (roll < 0.55) { + tex = 'enemy_short'; + animKey = 'enemy_short_walk'; + enemyType = 'bulldog'; + speed = -140; + } + else if (roll < 0.80) { + tex = 'enemy_tall'; + animKey = 'enemy_tall_walk'; + enemyType = 'snake'; + speed = -80; + displayH = BLOCK * 1.5; + } + else { + tex = 'bat_0'; + animKey = ''; + enemyType = 'bat'; + speed = -120; + } + const isBat = enemyType === 'bat'; + const e = this.enemyGroup.create(x, y, tex, 0); + e.setOrigin(0.5, 1); + e.setDisplaySize(BLOCK, displayH); + e.body.setGravityY(isBat ? 0 : 1800); + e.body.setAllowGravity(!isBat); + e.setVelocityX(speed); + e.setBounceX(1); + e.setCollideWorldBounds(false); + e.setData('kind', kind); + e.setData('enemyType', enemyType); + e.setData('state', 'walk'); + e.setData('timer', 0); + e.setData('baseY', y); + if (animKey) { + e.anims.play(animKey, true); + } + // Tighten hitbox for tall enemies (snake) — default body is too wide + if (enemyType === 'snake') { + e.body.setSize(10, 28); + e.body.setOffset(3, 4); + } + return e; + } + update(_t, dtMs) { + if (this.dead) { + this.deadTimer -= dtMs; + this.player.setVelocityX(0); + if (this.deadTimer <= 0 && !this.gameOverShown) + this.respawn(); + return; + } + if (this.warping) + return; + if (this.parachuteMode) { + this.updateParachute(dtMs); + return; + } + if (this.invincible > 0) + this.invincible -= dtMs; + if (this.shrinkTimer > 0) + this.shrinkTimer -= dtMs; + if (this.stompGrace > 0) + this.stompGrace -= dtMs; + if (this.fireCooldown > 0) + this.fireCooldown -= dtMs; + this.updatePlayerMovement(dtMs); + if (this.player.y > H + 50) { + this.die(); + return; + } + const edge = this.cameras.main.scrollX + W + 600; + if (edge > this.genX) + this.generateLevel(this.genX, edge); + this.updatePlayerAnimation(); + const camLeft = this.cameras.main.scrollX; + this.updateCoins(camLeft); + this.updateBridges(camLeft); + this.updateFireEruptions(camLeft); + this.updatePiranhas(dtMs, camLeft); + this.enemyGroup.getChildren().forEach(e => this.updateEnemy(e, camLeft)); + this.updateCrocs(camLeft); + this.cleanupOffscreen(camLeft); + } + updateParachute(dtMs) { + // Stop camera from following — terrain stays fixed + this.cameras.main.stopFollow(); + if (this.parachuteSprite) { + this.parachuteSprite.x = this.player.x; + const playerH = PLAYER_H; + this.parachuteSprite.y = this.player.y - playerH + 8; + } + // Full directional control with arrow keys + const camX = this.cameras.main.scrollX; + if (this.cursors.left.isDown) { + this.player.setVelocityX(-200); + } + else if (this.cursors.right.isDown) { + this.player.setVelocityX(200); + } + else { + this.player.setVelocityX(Math.sin(this.time.now / 1200) * 40); + } + if (this.cursors.up.isDown) { + this.player.setVelocityY(-180); + } + else if (this.cursors.down.isDown) { + this.player.setVelocityY(300); + } + // Keep Player within visible screen + if (this.player.x < camX + 30) + this.player.x = camX + 30; + if (this.player.x > camX + W - 30) + this.player.x = camX + W - 30; + if (this.player.y < 40) + this.player.y = 40; + this.parachuteTimer += dtMs; + if (this.parachuteTimer > 1500 && this.parachuteFlyingEnemies.length < 15) { + this.parachuteTimer = 0; + const fromLeft = Math.random() < 0.5; + const camX = this.cameras.main.scrollX; + const ex = fromLeft ? camX - 20 : camX + W + 20; + const ey = this.player.y + (Math.random() - 0.3) * 200; + const fe = this.enemyGroup.create(ex, ey, 'enemy', 0); + fe.setOrigin(0.5, 0.5); + fe.setDisplaySize(BLOCK, BLOCK); + fe.body.setAllowGravity(false); + fe.setVelocityX(fromLeft ? 150 : -150); + fe.setData('kind', 'goomba'); + fe.setData('state', 'flying'); + fe.setData('timer', 0); + this.parachuteFlyingEnemies.push(fe); + } + const pCamLeft = this.cameras.main.scrollX; + this.parachuteFlyingEnemies = this.parachuteFlyingEnemies.filter(e => { + if (!e.active) + return false; + if (e.x < pCamLeft - 100 || e.x > pCamLeft + W + 100) { + e.destroy(); + return false; + } + return true; + }); + const pOnGround = this.player.body.blocked.down; + const falling = this.player.body.velocity.y >= 0; + if (pOnGround && falling && !this.cursors.up.isDown) { + this.endParachute(); + } + // Die if player drifts into water/gap below ground level + if (this.player.y > GROUND_Y + BLOCK) { + this.endParachute(); + this.die(); + return; + } + this.player.anims.stop(); + this.player.setFrame(4); // jump frame while parachuting + if (this.cursors.left.isDown) + this.player.flipX = true; + else if (this.cursors.right.isDown) + this.player.flipX = false; + this.player.setDisplaySize(PLAYER_W, PLAYER_H); + // Check enemy collisions during parachute + this.enemyGroup.getChildren().forEach((e) => { + if (!e.active || e.getData('state') === 'dead') + return; + const dx = Math.abs(this.player.x - e.x); + const dy = this.player.y - e.y; + if (dx < BLOCK * 0.8 && Math.abs(dy) < BLOCK * 0.8) { + if (dy < 0) { + // Player is above enemy — stomp kill + e.setVelocityY(-300); + e.flipY = true; + e.setData('state', 'dead'); + this.time.delayedCall(600, () => { if (e.active) + e.destroy(); }); + this.addScore(300, e.x, e.y - 10); + } + else if (this.invincible <= 0) { + // Enemy hit player from side/below — lose a life + this.endParachute(); + this.die(); + } + } + }); + this.syncScoreToHUD(); + return; + } + updatePlayerMovement(dtMs) { + const running = this.keys.shift.isDown; + // Powered up = faster speed + higher acceleration + const speedMult = this.isBig ? 1.5 : 1; + const maxSpeed = (running ? 320 : 200) * speedMult; + const accel = (running ? 1100 : 800) * speedMult; + if (this.cursors.left.isDown) { + this.player.setAccelerationX(-accel); + this.facingRight = false; + if (this.player.body.velocity.x > 0) + this.player.setVelocityX(this.player.body.velocity.x * 0.7); + } + else if (this.cursors.right.isDown) { + this.player.setAccelerationX(accel); + this.facingRight = true; + if (this.player.body.velocity.x < 0) + this.player.setVelocityX(this.player.body.velocity.x * 0.7); + } + else { + this.player.setAccelerationX(0); + const v = this.player.body.velocity.x; + if (Math.abs(v) < 12) + this.player.setVelocityX(0); + else + this.player.setVelocityX(v * 0.9); + } + if (this.player.body.velocity.x > maxSpeed) + this.player.setVelocityX(maxSpeed); + if (this.player.body.velocity.x < -maxSpeed) + this.player.setVelocityX(-maxSpeed); + const onGround = this.player.body.blocked.down || this.player.body.touching.down; + const touchingWall = this.player.body.blocked.left || this.player.body.blocked.right; + if (onGround) { + this.coyoteTime = 120; // generous coyote time, especially helps near walls + this.hasDoubleJumped = false; + this.canDoubleJump = false; + } + else { + this.coyoteTime = Math.max(0, this.coyoteTime - dtMs); + if (!this.canDoubleJump && this.coyoteTime <= 0) + this.canDoubleJump = true; + } + this.jumpBuffer = Math.max(0, this.jumpBuffer - dtMs); + const jumpKeyDown = this.keys.space.isDown || this.cursors.up.isDown; + const jumpJustPressed = jumpKeyDown && !this.jumpKeyWasDown; + this.jumpKeyWasDown = jumpKeyDown; + if (jumpJustPressed) + this.jumpBuffer = 150; + // Allow jump when on ground OR when pressed against a wall and recently on ground + const canJump = this.coyoteTime > 0 || (touchingWall && this.coyoteTime > -50); + if (this.jumpBuffer > 0 && canJump) { + // Normal jump — higher when powered up + this.player.setVelocityY(this.isBig ? -950 : -820); + this.jumpBuffer = 0; + this.coyoteTime = 0; + this.sfx('nr_jump', 0.2); + } + else if (jumpJustPressed && !onGround && this.canDoubleJump && !this.hasDoubleJumped) { + // Double jump — also boosted when powered + this.player.setVelocityY(this.isBig ? -800 : -700); + this.hasDoubleJumped = true; + this.sfx('nr_jump', 0.15); + } + // Variable jump height: low gravity while ascending and key held. + if (jumpKeyDown && this.player.body.velocity.y < 0) { + this.player.body.setGravityY(900); + } + else { + this.player.body.setGravityY(1800); + } + if (this.isBig && this.fireCooldown <= 0 && + (Phaser.Input.Keyboard.JustDown(this.keys.f) || Phaser.Input.Keyboard.JustDown(this.keys.z))) { + this.throwFireball(); + this.fireCooldown = 200; + } + const camLeft = this.cameras.main.scrollX; + if (this.player.x < camLeft) { + this.player.x = camLeft; + this.player.setVelocityX(0); + } + if (onGround && !this.isInGap(this.player.x)) { + this.lastSafeX = this.player.x; + } + // Warp / golden pipe check — Player must be standing ON TOP of the pipe + if (onGround && this.cursors.down.isDown && !this.warping) { + const pipes = this.pipeGroup.getChildren(); + for (const p of pipes) { + if (!p.getData('warp') && !p.getData('gold')) + continue; + const pdx = Math.abs(this.player.x - p.x); + // Player's feet (y with origin 0.5,1) should be at the pipe top edge + const pipeTop = p.y - BLOCK / 2; + const feetDelta = Math.abs(this.player.y - pipeTop); + // Also accept Player standing at ground level next to a short pipe + if (pdx < BLOCK * 1.5 && feetDelta < BLOCK) { + if (p.getData('gold') && !this.parachuteMode) { + this.startParachute(p); + } + else if (p.getData('warp')) { + this.startWarp(p); + } + break; + } + } + } + } + updatePlayerAnimation() { + const onGround = this.player.body.blocked.down || this.player.body.touching.down; + const vx = this.player.body.velocity.x; + const speed = Math.abs(vx); + // Player-intent direction this frame (from input). Used to detect skid. + const left = this.cursors.left.isDown; + const right = this.cursors.right.isDown; + const intent = right ? 1 : left ? -1 : 0; + const moveDir = vx > 5 ? 1 : vx < -5 ? -1 : 0; + // Animation: use Phaser's anims system with the spritesheet. + const sheetKey = 'player'; + const walkAnim = 'player_walk'; + // Scale — always same size, glow indicates power-up + this.player.setDisplaySize(PLAYER_W, PLAYER_H); + // Pulse the built-in glow FX when powered up + if (this.player.getData('hasGlow')) { + const glowFx = this.player.getData('glowFx'); + if (glowFx) { + glowFx.outerStrength = this.isBig ? 2 + Math.sin(this.time.now / 200) * 1.5 : 0; + } + } + // Ensure correct texture + if (this.player.texture.key !== sheetKey) { + this.player.setTexture(sheetKey, 0); + } + if (!onGround) { + this.player.anims.stop(); + this.player.setFrame(4); // jump + } + else if (intent !== 0 && moveDir !== 0 && intent !== moveDir && speed > 60) { + this.player.anims.stop(); + this.player.setFrame(0); // no skid frame in new set, use idle + } + else if (speed > 20) { + this.player.anims.play(walkAnim, true); + const animFps = Math.max(6, Math.min(20, speed / 20)); + this.player.anims.msPerFrame = 1000 / animFps; + } + else { + this.player.anims.stop(); + this.player.setFrame(0); // idle + } + // Face the input direction while skidding (so skid sprite looks "back" + // toward old motion); otherwise face current motion / last facing. + if (intent !== 0) + this.facingRight = intent > 0; + else if (moveDir !== 0) + this.facingRight = moveDir > 0; + this.player.flipX = !this.facingRight; + const blink = (this.invincible > 0 || this.shrinkTimer > 0) && Math.floor(this.time.now / 80) % 2 === 0; + this.player.setVisible(!blink); + // Track player glow (mushroom powerup) — centered on player body, not feet + const playerGlow = this.player.getData('glowFx'); + if (playerGlow) { + if (this.isBig && this.player.visible) { + playerGlow.setPosition(this.player.x, this.player.y - PLAYER_H / 2); + playerGlow.setAlpha(0.15 + Math.sin(this.time.now / 100) * 0.1); + playerGlow.setVisible(true); + } + else if (!this.isBig) { + playerGlow.destroy(); + this.player.setData('glowFx', null); + this.player.setData('hasGlow', false); + } + else { + playerGlow.setVisible(false); + } + } + } + updateCoins(camLeft) { + this.coinGroup.getChildren().forEach(c => { + const i = Math.floor(this.time.now / 120) % 2; + c.setTexture(i === 0 ? 'coin0' : 'coin1'); + if (c.x < camLeft - 100) + c.destroy(); + }); + } + updateBridges(camLeft) { + // Bridge collapse — unstable tiles start falling when player approaches + this.bridgeGroup.getChildren().forEach((bt) => { + if (!bt.active || !bt.getData('unstable') || bt.getData('collapsing')) + return; + const dx = bt.x - this.player.x; + // Trigger when player is within 6 blocks ahead or 2 blocks behind + if (dx < BLOCK * 6 && dx > -BLOCK * 2) { + bt.setData('collapsing', true); + const tileX = bt.x; + // ~1 second shake warning before falling + this.tweens.add({ + targets: bt, + x: bt.x + 3, + duration: 60, + yoyo: true, + repeat: 8, + onComplete: () => { + bt.body.enable = false; + this.tweens.add({ + targets: bt, + y: bt.y + 300, + alpha: 0, + duration: 500, + onComplete: () => bt.destroy(), + }); + // Launch fish from the gap where tile fell + this.fishGroup.getChildren().forEach((fish) => { + if (!fish.active || fish.getData('jumped')) + return; + if (Math.abs(fish.getData('homeX') - tileX) < BLOCK) { + fish.setData('jumped', true); + fish.setVisible(true); + fish.body.enable = true; + fish.setPosition(tileX, GROUND_Y + BLOCK); + // Arc jump: up just above bridge level, then back down + this.tweens.add({ + targets: fish, + y: GROUND_Y - BLOCK * 0.8, + duration: 400, + ease: 'Sine.easeOut', + onComplete: () => { + this.tweens.add({ + targets: fish, + y: GROUND_Y + BLOCK * 2, + duration: 400, + ease: 'Sine.easeIn', + onComplete: () => { + fish.body.enable = false; + fish.setVisible(false); + // Reset for possible re-jump after a delay + this.time.delayedCall(1500 + Math.random() * 2000, () => { + if (fish.active) { + fish.setData('jumped', false); + } + }); + }, + }); + }, + }); + } + }); + }, + }); + } + }); + } + updateFireEruptions(camLeft) { + // Fire eruptions — shoot up from gaps when player approaches + // Warning glow/smoke appears first; fire ONLY erupts after warning has been + // visible for a minimum duration so the player always gets fair notice. + const WARN_MIN_MS = 800; // warning must show for at least this long before fire + this.fireGroup.getChildren().forEach((f) => { + if (!f.active) + return; + const dx = Math.abs(this.player.x - f.getData('gapX')); + const baseY = f.getData('baseY'); + const isActive = f.getData('active'); + const isWarning = f.getData('warning'); + // Warning phase — show smoke/glow when player is within 10 blocks + if (dx < BLOCK * 10 && !isActive && !isWarning) { + f.setData('warning', true); + f.setData('warnStart', this.time.now); + // Rising smoke/ember particles + const warnEmbers = this.add.particles(f.getData('gapX'), GROUND_Y, 'coin0', { + speed: { min: 20, max: 60 }, + angle: { min: 255, max: 285 }, + scale: { start: 0.2, end: 0 }, + alpha: { start: 0.5, end: 0 }, + lifespan: { min: 400, max: 800 }, + frequency: 40, + quantity: 2, + tint: [0xff4400, 0xff6600, 0x888888, 0x666666], + blendMode: 'ADD', + }); + warnEmbers.setDepth(f.depth + 1); + f.setData('warnEmbers', warnEmbers); + // Pulsing orange glow at gap base + const warnGlow = this.add.ellipse(f.getData('gapX'), GROUND_Y + BLOCK * 0.5, BLOCK * 2, BLOCK * 1.5, 0xff4400, 1.0); + warnGlow.setAlpha(0); + warnGlow.setBlendMode(Phaser.BlendModes.ADD); + warnGlow.setDepth(f.depth - 1); + f.setData('warnGlow', warnGlow); + this.tweens.add({ + targets: warnGlow, + alpha: { from: 0, to: 0.35 }, + duration: 350, + ease: 'Sine.easeInOut', + yoyo: true, + repeat: -1, + }); + } + // Fire only erupts after warning has been visible long enough + const warnStart = f.getData('warnStart') || 0; + const warnElapsed = this.time.now - warnStart; + if (dx < BLOCK * 4 && !isActive && isWarning && warnElapsed >= WARN_MIN_MS) { + // Erupt! + f.setData('active', true); + // Clean up warning effects + const we = f.getData('warnEmbers'); + if (we) { + we.stop(); + this.time.delayedCall(800, () => { if (we) + we.destroy(); }); + } + const wg = f.getData('warnGlow'); + if (wg) { + this.tweens.killTweensOf(wg); + wg.destroy(); + } + f.setData('warnEmbers', null); + f.setData('warnGlow', null); + f.setData('warning', false); + f.setVisible(true); + f.body.enable = true; + f.y = baseY; + this.tweens.add({ + targets: f, + y: GROUND_Y - BLOCK * 2, + duration: 300, + ease: 'Quad.easeOut', + onComplete: () => { + // Hold briefly then retract + this.time.delayedCall(800, () => { + if (!f.active) + return; + this.tweens.add({ + targets: f, + y: baseY, + duration: 400, + onComplete: () => { + f.setVisible(false); + f.body.enable = false; + // Reset after cooldown + this.time.delayedCall(2000, () => { + if (f.active) + f.setData('active', false); + }); + }, + }); + }); + }, + }); + } + // Flicker effect while visible + full fire FX + const fireVisible = f.visible && f.alpha > 0; + if (fireVisible) { + f.setAlpha(0.8 + Math.sin(this.time.now / 50) * 0.2); + if (!f.getData('hasGlow')) { + // Tall glow column from fire down to bottom of scene — additive blend + const glowH = H - f.y + BLOCK * 2; + const columnGlow = this.add.ellipse(f.x, f.y + glowH / 2, BLOCK * 1.4, glowH, 0xff4400, 1.0); + columnGlow.setDepth(f.depth - 1); + columnGlow.setAlpha(0.15); + columnGlow.setBlendMode(Phaser.BlendModes.ADD); + f.setData('hasGlow', true); + f.setData('manualGlow', columnGlow); + // Rising ember particles + const embers = this.add.particles(f.x, f.y, 'coin0', { + speed: { min: 15, max: 50 }, + angle: { min: 250, max: 290 }, + scale: { start: 0.15, end: 0 }, + alpha: { start: 0.7, end: 0 }, + lifespan: { min: 300, max: 600 }, + frequency: 60, + quantity: 1, + tint: [0xff2200, 0xff6600, 0xffaa00, 0xffff00], + blendMode: 'ADD', + }); + embers.setDepth(f.depth + 1); + f.setData('embers', embers); + } + } + // Animate fire glow + embers — resize/reposition column as fire moves + const mg = f.getData('manualGlow'); + const em = f.getData('embers'); + if (mg) { + if (fireVisible) { + const glowH = H - f.y + BLOCK * 2; + mg.setPosition(f.x, f.y + glowH / 2); + mg.setSize(BLOCK * 1.4, glowH); + mg.setAlpha(0.12 + Math.sin(this.time.now / 60) * 0.08); + } + else { + mg.setAlpha(0); + } + } + if (em) { + em.setPosition(f.x, f.y); + if (fireVisible) { + em.start(); + } + else { + em.stop(); + } + } + if (f.x < camLeft - 200) { + const gl = f.getData('manualGlow'); + if (gl) + gl.destroy(); + const sp = f.getData('sparks'); + if (sp) + sp.destroy(); + const emb = f.getData('embers'); + if (emb) + emb.destroy(); + const we = f.getData('warnEmbers'); + if (we) + we.destroy(); + const wg = f.getData('warnGlow'); + if (wg) { + this.tweens.killTweensOf(wg); + wg.destroy(); + } + f.destroy(); + } + }); + } + updatePiranhas(dtMs, camLeft) { + // Piranha plant animation + this.piranhaGroup.getChildren().forEach((p) => { + if (!p.active) + return; + let timer = p.getData('timer') + dtMs; + const pipeTopY = p.getData('pipeTopY'); + const cycle = 4000; + const phase = (timer % cycle) / cycle; + // Only suppress if the player is directly on top of the pipe + const pipeX = p.getData('pipeX'); + const dx = Math.abs(this.player.x - pipeX); + const onPipe = dx < BLOCK * 0.8 && this.player.y < pipeTopY && this.player.body.velocity.y >= 0; + if (onPipe) { + p.setVisible(false); + p.body.enable = false; + p.setData('timer', timer); + return; + } + if (phase < 0.25) { + const t = phase / 0.25; + p.y = pipeTopY + BLOCK * (1 - t); + p.setVisible(true); + p.body.enable = true; + } + else if (phase < 0.5) { + p.y = pipeTopY; + p.setVisible(true); + p.body.enable = true; + p.setTexture(Math.floor(timer / 200) % 2 === 0 ? 'piranha_0' : 'piranha_1'); + } + else if (phase < 0.75) { + const t = (phase - 0.5) / 0.25; + p.y = pipeTopY + BLOCK * t; + p.setVisible(true); + p.body.enable = true; + } + else { + p.setVisible(false); + p.body.enable = false; + } + p.setData('timer', timer); + if (p.x < camLeft - 200) + p.destroy(); + }); + } + updateCrocs(camLeft) { + // Croc update — swim back and forth, cycle mouth open/closed + const now = this.time.now; + this.crocGroup.getChildren().forEach((croc) => { + if (croc.x < camLeft - 200) { + croc.destroy(); + return; + } + // Mouth state cycling + const timer = croc.getData('timer'); + if (now >= timer) { + const wasOpen = croc.getData('mouthOpen'); + croc.setData('mouthOpen', !wasOpen); + croc.setTexture(wasOpen ? 'croc_closed' : 'croc_open'); + // Closed longer than open (2-3s closed, 1-1.5s open) + croc.setData('timer', now + (wasOpen ? 2000 + Math.random() * 1000 : 1000 + Math.random() * 500)); + } + // Swim within gap bounds + const gapStart = croc.getData('gapStart'); + const gapEnd = croc.getData('gapEnd'); + const margin = 24; + if (croc.x <= gapStart + margin) { + croc.setData('swimDir', 1); + croc.setVelocityX(30); + } + else if (croc.x >= gapEnd - margin) { + croc.setData('swimDir', -1); + croc.setVelocityX(-30); + } + }); + } + cleanupOffscreen(camLeft) { + this.mushroomGroup.getChildren().forEach(m => { + if (m.x < camLeft - 100 || m.y > H + 100) + m.destroy(); + }); + this.fireballGroup.getChildren().forEach(fb => { + if (fb.x < camLeft - 100 || fb.x > camLeft + W + 200 || fb.y > H + 50) + fb.destroy(); + }); + // Fish cleanup — destroy when scrolled offscreen + this.fishGroup.getChildren().forEach((fish) => { + if (fish.x < camLeft - 200) + fish.destroy(); + }); + } + updateEnemy(e, camLeft) { + if (!e.active) + return; + const state = e.getData('state'); + const kind = e.getData('kind'); + const enemyType = e.getData('enemyType') || 'monster'; + if (e.x < camLeft - BLOCK * 3) { + e.destroy(); + return; + } + if (e.y > H + 50) { + e.destroy(); + return; + } + if (!e.body) + return; + // Block-row patrol: idle until player approaches, then bounce within bounds + if (e.getData('patrolAwait')) { + if (Math.abs(this.player.x - e.x) < W) { + e.setData('patrolAwait', false); + e.setVelocityX(-80); + } + else { + e.setVelocityX(0); + return; + } + } + const pLeft = e.getData('patrolLeft'); + if (pLeft !== undefined && pLeft !== null) { + const pRight = e.getData('patrolRight'); + if (e.x <= pLeft) { + e.setVelocityX(80); + } + else if (e.x >= pRight) { + e.setVelocityX(-80); + } + } + if (state === 'walk' || state === 'flying') { + // Animate based on enemy type + if (enemyType === 'bat') { + const frame = Math.floor(this.time.now / 150) % 2; + e.setTexture(frame === 0 ? 'bat_0' : 'bat_1'); + e.setDisplaySize(BLOCK, BLOCK); + const baseY = e.getData('baseY') || GROUND_Y - BLOCK * 2; + e.y = baseY + Math.sin(this.time.now / 400 + e.x * 0.01) * 40; + } + // monster, bulldog, snake all use anims — no manual texture swap needed + if (kind === 'rkoopa' && (e.body.blocked.down || e.body.touching.down)) { + const ahead = e.x + (e.body.velocity.x > 0 ? BLOCK : -BLOCK); + if (this.isInGap(ahead)) { + e.setVelocityX(-e.body.velocity.x); + } + } + e.flipX = e.body.velocity.x > 0; + } + else if (state === 'shell_still') { + let timer = e.getData('timer') - 1; + e.setData('timer', timer); + if (timer <= 0) { + e.setData('state', 'walk'); + e.setVelocityX(-90); + } + } + } + onPlayerHitBrick(_player, brick) { + if (!this.player.body.touching.up) + return; + if (Math.abs(brick.x - this.player.x) > BLOCK * 0.55) + return; + this.collectCoinsAbove(brick.x, brick.y); + this.knockEnemiesAbove(brick.x, brick.y); + if (this.isBig) { + brick.destroy(); + this.addScore(50, brick.x, brick.y - 20); + } + else { + // Small player: bump animation only (no destruction) + if (!brick.getData('bumping')) { + brick.setData('bumping', true); + const origY = brick.y; + this.tweens.add({ + targets: brick, y: origY - 6, yoyo: true, duration: 80, + onComplete: () => { brick.y = origY; brick.setData('bumping', false); } + }); + } + } + } + onPlayerHitQBlock(_player, q) { + if (q.getData('hit')) + return; + if (!this.player.body.touching.up) + return; + if (Math.abs(q.x - this.player.x) > BLOCK * 0.55) + return; + this.collectCoinsAbove(q.x, q.y); + this.knockEnemiesAbove(q.x, q.y); + q.setData('hit', true); + q.setTexture('qblock_used'); + q.setDisplaySize(BLOCK, BLOCK); + this.tweens.add({ targets: q, y: q.y - 6, yoyo: true, duration: 100 }); + const reward = q.getData('reward'); + if (reward === 'mushroom' && !this.isBig) { + const m = this.mushroomGroup.create(q.x, q.y - BLOCK, 'mushroom'); + m.body.setSize(28, 28); + m.setVelocityX(120); + m.setBounceX(1); + m.body.setMaxVelocity(200, 600); + } + else { + this.popCoin(q.x, q.y); + // Height bonus — higher ?-blocks reward more points for the effort + const heightAboveGround = GROUND_Y - q.y; + const heightBonus = heightAboveGround > BLOCK * 4 ? 300 : heightAboveGround > BLOCK * 2 ? 100 : 0; + this.addScore(200 + heightBonus, q.x, q.y - 20); + } + } + popCoin(x, y) { + const c = this.add.image(x, y, 'coin0').setDepth(50); + c.setDisplaySize(BLOCK * 0.7, BLOCK * 0.9); + this.tweens.add({ + targets: c, + y: y - BLOCK * 2.2, + duration: 350, + ease: 'Sine.easeOut', + onComplete: () => { + this.tweens.add({ + targets: c, y: y - BLOCK * 1.6, alpha: 0, + duration: 200, onComplete: () => c.destroy(), + }); + }, + }); + } + onPlayerCoin(_player, c) { + c.destroy(); + this.addScore(100, c.x, c.y); + this.sfx('nr_coin', 0.2); + } + /** Collect any coins sitting directly above a block (within 1 block). */ + collectCoinsAbove(blockX, blockY) { + this.coinGroup.getChildren().forEach((c) => { + if (!c.active) + return; + const dx = Math.abs(c.x - blockX); + const dy = blockY - c.y; // coin should be above (positive = above) + if (dx < BLOCK * 0.7 && dy > 0 && dy < BLOCK * 1.5) { + // Pop the coin upward then destroy + this.tweens.add({ + targets: c, + y: c.y - BLOCK, + alpha: 0, + duration: 300, + onComplete: () => c.destroy(), + }); + this.addScore(100, c.x, c.y); + this.sfx('nr_coin', 0.2); + } + }); + } + /** Knock out any enemy standing on top of a block that was hit from below. */ + knockEnemiesAbove(blockX, blockY) { + this.enemyGroup.getChildren().forEach((e) => { + if (!e.active) + return; + const dx = Math.abs(e.x - blockX); + const dy = blockY - e.y; // enemy should be above (positive = above) + if (dx < BLOCK * 1.0 && dy > 0 && dy < BLOCK * 2) { + this.addScore(200, e.x, e.y - 10); + this.sfx('nr_stomp', 0.25); + // Launch enemy upward then destroy + e.setVelocityY(-400); + e.setVelocityX((Math.random() - 0.5) * 200); + e.flipY = true; + e.body.setAllowGravity(true); + e.setData('state', 'dead'); + this.time.delayedCall(800, () => { if (e.active) + e.destroy(); }); + } + }); + } + onPlayerMushroom(_player, m) { + m.destroy(); + if (!this.isBig) { + this.isBig = true; + this.addScore(1000, this.player.x, this.player.y - 20); + this.sfx('nr_powerup'); + // Growth flash — briefly golden then normal + this.player.setTint(0xffdd00); + this.time.delayedCall(300, () => { + if (this.isBig) + this.player.clearTint(); + }); + // Add visible glow effect around the player (Ellipse — preFX doesn't render in WebKit) + if (!this.player.getData('hasGlow')) { + const glow = this.add.ellipse(this.player.x, this.player.y - PLAYER_H / 2, PLAYER_W * 1.4, PLAYER_H * 1.4, 0xffdd00, 1.0); + glow.setDepth(this.player.depth - 1); + glow.setAlpha(0.2); + glow.setBlendMode(Phaser.BlendModes.ADD); + this.player.setData('hasGlow', true); + this.player.setData('glowFx', glow); + } + } + } + onPlayerHeart(_player, h) { + h.destroy(); + this.lives++; + this.syncLivesToHUD(); + this.addScore(2000, h.x, h.y - 10); + this.sfx('nr_extralife'); + // Green flash to indicate extra life + this.cameras.main.flash(300, 100, 255, 100, false); + } + onPlayerEnemy(_player, e) { + if (this.invincible > 0 || this.stompGrace > 0 || this.shrinkTimer > 0) + return; + const state = e.getData('state'); + const kind = e.getData('kind'); + const playerBottom = this.player.y; + const enemyTop = e.y - e.displayHeight; + const stomping = this.player.body.velocity.y > 50 && + playerBottom < enemyTop + e.displayHeight * 0.5; + if (stomping) { + this.player.setVelocityY(-450); + this.stompGrace = 417; + this.sfx('nr_stomp', 0.25); + if (kind === 'goomba') { + this.killGoomba(e); + } + else if (state === 'walk') { + this.becomeShell(e); + this.addScore(200, e.x, e.y - 20); + } + else if (state === 'shell_still') { + const dir = this.player.x < e.x ? 1 : -1; + e.setData('state', 'shell'); + e.setVelocityX(dir * 400); + this.addScore(100, e.x, e.y - 20); + } + else if (state === 'shell') { + e.setData('state', 'shell_still'); + e.setData('timer', 300); + e.setVelocityX(0); + this.addScore(100, e.x, e.y - 20); + } + } + else if (state === 'shell_still') { + const dir = this.player.x < e.x ? 1 : -1; + e.setData('state', 'shell'); + e.setVelocityX(dir * 400); + this.stompGrace = 250; + this.addScore(100, e.x, e.y - 20); + } + else { + this.takeHit(); + } + } + // Replace the enemy with a shell sprite using the dead frame. + becomeShell(e) { + const kind = e.getData('kind'); + const x = e.x; + e.destroy(); + const shell = this.enemyGroup.create(x, GROUND_Y, 'enemy', 4); + shell.setOrigin(0.5, 1); + shell.setDisplaySize(BLOCK, BLOCK * 0.7); + shell.body.setGravityY(1800); + shell.body.setAllowGravity(true); + shell.setVelocityX(0); + shell.setBounceX(1); + shell.setCollideWorldBounds(false); + shell.setData('kind', kind); + shell.setData('state', 'shell_still'); + shell.setData('timer', 300); + } + // Goomba "death": disable the body so nothing collides with it again, fade + // and shrink it visually, then destroy. No state-machine, no body resizing + // hacks — this avoids the floating/misaligned-body bugs. + killGoomba(e) { + e.setData('state', 'dying'); + e.disableBody(false, false); + e.anims.stop(); + if (e.getData('enemyType') === 'snake') { + e.setFrame(4); + e.setDisplaySize(BLOCK, BLOCK * 0.5); // squished + } + else { + e.setFrame(4); // dead frame in all strips + } + this.addScore(200, e.x, e.y - 20); + this.tweens.add({ + targets: e, + scaleY: 0.3, + alpha: 0, + duration: 250, + onComplete: () => e.destroy(), + }); + } + onEnemyVsEnemy(a, b) { + const aState = a.getData('state'); + const bState = b.getData('state'); + if (aState === 'shell' && bState !== 'dying' && bState !== 'shell') { + this.killByShell(b); + } + else if (bState === 'shell' && aState !== 'dying' && aState !== 'shell') { + this.killByShell(a); + } + } + killByShell(e) { + if (e.getData('kind') === 'goomba') { + this.killGoomba(e); + } + else { + // Koopa hit by shell: knock it offscreen with an upward arc. + e.setData('state', 'dying'); + e.disableBody(false, false); + this.addScore(100, e.x, e.y - 20); + this.tweens.add({ + targets: e, y: e.y - 80, alpha: 0, angle: 360, + duration: 500, onComplete: () => e.destroy(), + }); + } + } + onFireballHitSolid(fb, _solid) { + if (fb.body.blocked.down) { + fb.setVelocityY(-350); + } + else { + fb.destroy(); + } + } + onFireballEnemy(fb, e) { + const st = e.getData('state'); + if (st === 'dying') + return; + fb.destroy(); + this.killByShell(e); + } + throwFireball() { + const dir = this.facingRight ? 1 : -1; + const fb = this.fireballGroup.create(this.player.x + dir * 20, this.player.y + 20, 'fireball'); + fb.body.setSize(14, 14); + fb.setVelocityX(dir * 450); + fb.setVelocityY(-100); + fb.setBounceY(0.6); + this.sfx('nr_fireball', 0.2); + } + takeHit() { + if (this.isBig) { + this.isBig = false; + this.player.clearTint(); + this.shrinkTimer = 1000; + this.sfx('nr_hit'); + // glow handled by preFX + } + else { + this.die(); + } + } + die() { + if (this.dead) + return; + this.lives--; + this.syncLivesToHUD(); + this.dead = true; + this.deadTimer = 1200; + this.sfx('nr_die', 0.4); + this.player.setVelocity(0, -500); + this.player.body.checkCollision.none = true; + this.isBig = false; + this.player.clearTint(); + // glow handled by preFX + if (this.parachuteMode) + this.endParachute(); + } + doRespawn() { + this.dead = false; + const deathX = Math.max(this.lastSafeX, this.cameras.main.scrollX + 200); + // Find a safe spot — search BACKWARD first to respawn before the hazard + const isSafe = (wx) => { + if (this.isInGap(wx)) + return false; + if (this.isNearObstacle(wx)) + return false; + const fires = this.fireGroup.getChildren(); + for (const f of fires) { + if (f.active && Math.abs(wx - f.x) < BLOCK * 1.5) + return false; + } + const enemies = this.enemyGroup.getChildren(); + for (const e of enemies) { + if (e.active && Math.abs(wx - e.x) < BLOCK * 3) + return false; + } + return true; + }; + // Search backward first (up to 15 blocks behind death point) + let x = deathX; + const minX = Math.max(this.cameras.main.scrollX + 100, deathX - BLOCK * 15); + let backX = deathX - BLOCK; + while (backX >= minX) { + if (isSafe(backX)) { + x = backX; + break; + } + backX -= BLOCK; + } + // If no safe spot behind, search forward as fallback + if (x === deathX && !isSafe(x)) { + let tries = 0; + while (!isSafe(x) && tries < 50) { + x += BLOCK; + tries++; + } + } + this.player.setPosition(x, GROUND_Y - 100); + this.player.setVelocity(0, 0); + this.player.body.checkCollision.none = false; + this.player.clearTint(); + this.invincible = 1500; + this.shrinkTimer = 0; + this.stompGrace = 0; + // glow handled by preFX + } + respawn() { + if (this.lives <= 0) { + this.sfx('nr_gameover'); + // Keep dead=true so update() doesn't run while overlay is showing + this.player.setVisible(false); + this.player.setVelocity(0, 0); + this.player.body.checkCollision.none = true; + this.showGameOver(this.score, () => { + this.sfx('nr_startlevel'); + this.lives = 3; + this.score = 0; + this.syncScoreToHUD(); + this.syncLivesToHUD(); + this.player.setVisible(true); + this.doRespawn(); + }); + return; + } + this.doRespawn(); + } + onPlayerBridge(_player, _tile) { + // Collision still needed for standing — collapse is handled by proximity in update + } + onPlayerBounce(_player, pad) { + if (!this.player.body.touching.down) + return; + this.player.setVelocityY(-1200); + // Compress animation on the pad + this.tweens.add({ + targets: pad, + scaleY: 0.5, + duration: 100, + yoyo: true, + ease: 'Power2', + }); + this.addScore(50, pad.x, pad.y - 20); + this.sfx('nr_bounce', 0.3); + } + onPlayerFlag(_player, flag) { + flag.destroy(); + this.currentLevel++; + this.currentBiome = (this.currentBiome + 1) % 4; + this.syncLevelToHUD(this.currentLevel); + this.addScore(5000, flag.x, flag.y - 30); + this.sfx('nr_flag'); + const cam = this.cameras.main; + cam.flash(500, 255, 255, 255, false); + const txt = this.add.text(this.player.x, this.player.y - 80, `LEVEL ${this.currentLevel}!`, { + fontFamily: '"Press Start 2P", monospace', + fontSize: '24px', + color: '#ffdd00', + stroke: '#000', + strokeThickness: 4, + }).setOrigin(0.5).setDepth(1000); + this.tweens.add({ + targets: txt, + y: txt.y - 60, + alpha: 0, + duration: 2000, + onComplete: () => txt.destroy(), + }); + } + onPlayerPiranha(_player, _p) { + if (this.invincible > 0 || this.shrinkTimer > 0) + return; + if (this.isBig) { + this.isBig = false; + this.shrinkTimer = 1000; + this.invincible = 1500; + // glow handled by preFX + } + else { + this.die(); + } + } + onPlayerFire(_player, _f) { + if (this.invincible > 0 || this.shrinkTimer > 0) + return; + if (this.isBig) { + this.isBig = false; + this.shrinkTimer = 1000; + this.invincible = 1500; + // glow handled by preFX + } + else { + this.die(); + } + } + onPlayerCroc(_player, croc) { + if (this.invincible > 0 || this.shrinkTimer > 0) + return; + const pBody = this.player.body; + const stomping = pBody.velocity.y > 0 && pBody.bottom <= croc.body.top + 10; + if (stomping && !croc.getData('mouthOpen')) { + this.addScore(200); + croc.destroy(); + pBody.setVelocityY(-500); + this.sfx('nr_stomp'); + } + else { + if (this.isBig) { + this.isBig = false; + this.shrinkTimer = 1000; + this.invincible = 1500; + } + else { + this.die(); + } + } + } + onPlayerFish(_player, fish) { + if (this.invincible > 0 || this.shrinkTimer > 0) + return; + if (!fish.visible) + return; + if (this.isBig) { + this.isBig = false; + this.shrinkTimer = 1000; + this.invincible = 1500; + } + else { + this.die(); + } + } + startWarp(sourcePipe) { + this.warping = true; + this.sfx('nr_warp'); + this.player.setVelocity(0, 0); + this.player.body.setAllowGravity(false); + // Sparkle particle burst at pipe entrance + const particles = this.add.particles(this.player.x, this.player.y, 'coin0', { + speed: { min: 40, max: 120 }, + angle: { min: 200, max: 340 }, + scale: { start: 0.3, end: 0 }, + lifespan: 600, + quantity: 12, + emitting: false, + tint: [0x00ff00, 0x44ff44, 0xffff00, 0xffffff], + }); + particles.setDepth(15); + particles.explode(12); + this.time.delayedCall(800, () => particles.destroy()); + // Fade + shrink player as they enter the pipe + this.tweens.add({ + targets: this.player, + y: sourcePipe.y + BLOCK, + scaleX: 0.3, + scaleY: 0.3, + alpha: 0, + duration: 500, + onComplete: () => { + // Reset player scale/alpha for exit + this.player.setScale(1); + this.player.setAlpha(1); + // Ensure terrain is generated far enough ahead for a destination + const aheadX = sourcePipe.x + BLOCK * 30; + if (this.genX < aheadX) { + this.generateLevel(this.genX, aheadX); + this.extendGround(this.genX, aheadX + W); + } + // Safety check — is a landing spot free of hazards? + const isLandingSafe = (wx) => { + if (this.isInGap(wx)) + return false; + if (this.isNearObstacle(wx)) + return false; + const fires = this.fireGroup.getChildren(); + for (const f of fires) { + if (f.active && Math.abs(wx - f.x) < BLOCK * 2) + return false; + } + const enemies = this.enemyGroup.getChildren(); + for (const e of enemies) { + if (e.active && Math.abs(wx - e.x) < BLOCK * 3) + return false; + } + return true; + }; + // Find a warp-eligible pipe well ahead of the source in a safe spot + const minX = sourcePipe.x + BLOCK * 15; + const pipes = this.pipeGroup.getChildren() + .filter((p) => p.x > minX && !p.getData('warp') && !p.getData('gold')) + .sort((a, b) => a.x - b.x); + // Group pipes by x-position to find distinct pipe columns + let destPipe = null; + const visited = new Set(); + for (const p of pipes) { + const col = Math.round(p.x / BLOCK); + if (visited.has(col)) + continue; + visited.add(col); + if (isLandingSafe(p.x)) { + destPipe = p; + break; + } + } + if (destPipe) { + // Find the topmost segment at this pipe's x position + const topSeg = pipes.filter((p) => Math.abs(p.x - destPipe.x) < BLOCK) + .sort((a, b) => a.y - b.y)[0]; + const destTop = topSeg.y - BLOCK / 2; + this.player.setPosition(topSeg.x, destTop + BLOCK); + this.player.setVisible(false); + this.tweens.add({ + targets: this.player, + y: destTop - 10, + duration: 400, + onStart: () => { + this.player.setVisible(true); + // Sparkle burst at exit pipe + const exitParticles = this.add.particles(this.player.x, this.player.y, 'coin0', { + speed: { min: 40, max: 120 }, + angle: { min: 200, max: 340 }, + scale: { start: 0.3, end: 0 }, + lifespan: 600, + quantity: 10, + emitting: false, + tint: [0x00ff00, 0x44ff44, 0xffff00, 0xffffff], + }); + exitParticles.setDepth(15); + exitParticles.explode(10); + this.time.delayedCall(800, () => exitParticles.destroy()); + }, + onComplete: () => { + this.player.body.setAllowGravity(true); + this.warping = false; + this.addScore(200, this.player.x, this.player.y - 20); + }, + }); + } + else { + // No safe pipe found — warp to safe ground ahead + let landX = sourcePipe.x + BLOCK * 18; + let tries = 0; + while (!isLandingSafe(landX) && tries < 30) { + landX += BLOCK; + tries++; + } + this.player.setPosition(landX, GROUND_Y - BLOCK); + this.player.setVisible(true); + this.player.body.setAllowGravity(true); + this.warping = false; + this.addScore(200, this.player.x, this.player.y - 20); + } + }, + }); + } + startParachute(pipe) { + this.warping = true; + this.parachuteMode = true; + this.sfx('nr_warp'); + this.player.setVelocity(0, 0); + this.player.body.setAllowGravity(false); + // Sparkle particle burst at golden pipe entrance + const particles = this.add.particles(this.player.x, this.player.y, 'coin0', { + speed: { min: 50, max: 140 }, + angle: { min: 200, max: 340 }, + scale: { start: 0.4, end: 0 }, + lifespan: 700, + quantity: 16, + emitting: false, + tint: [0xffdd00, 0xffaa00, 0xffffff, 0xff8800], + }); + particles.setDepth(15); + particles.explode(16); + this.time.delayedCall(900, () => particles.destroy()); + // Fade + shrink into pipe + this.tweens.add({ + targets: this.player, + y: pipe.y + BLOCK, + scaleX: 0.3, + scaleY: 0.3, + alpha: 0, + duration: 500, + onComplete: () => { + // Reset scale and alpha from pipe entry animation + this.player.setScale(1); + this.player.setAlpha(1); + const targetX = this.cameras.main.scrollX + W / 2; + this.player.setPosition(targetX, 60); + this.player.setVisible(true); + this.player.body.setAllowGravity(true); + this.player.body.setGravityY(42); + this.player.setMaxVelocity(200, 144); + this.warping = false; + this.parachuteSprite = this.add.sprite(this.player.x, this.player.y - 80, 'parachute'); + this.parachuteSprite.setDisplaySize(96, 120); + this.parachuteSprite.setOrigin(0.5, 1); // bottom-center anchored to player's head + this.parachuteSprite.setDepth(9); + for (let i = 0; i < 8; i++) { + const cx = targetX + (Math.random() - 0.5) * W * 0.6; + const cy = 100 + Math.random() * (GROUND_Y - 200); + const c = this.coinGroup.create(cx, cy, 'coin0'); + c.setDisplaySize(BLOCK * 0.5, BLOCK * 0.65); + c.body.setAllowGravity(false); + c.body.setSize(12, 18); + c.setData('parachuteCoin', true); + } + this.parachuteTimer = 0; + this.parachuteFlyingEnemies = []; + // Start looping wind sound + try { + this.windSound = this.sound.add('nr_wind', { volume: 0.15, loop: true }); + this.windSound.play(); + } + catch { } + }, + }); + } + endParachute() { + this.parachuteMode = false; + // Stop wind sound + if (this.windSound) { + try { + this.windSound.stop(); + } + catch { } + this.windSound = undefined; + } + if (this.parachuteSprite) { + this.parachuteSprite.destroy(); + this.parachuteSprite = undefined; + } + this.player.body.setGravityY(1800); + this.player.setMaxVelocity(700, 900); + this.player.setAccelerationX(0); + // Re-enable camera follow after parachute + this.cameras.main.startFollow(this.player, true, 0.15, 0.05, -W * 0.2, 0); + this.parachuteFlyingEnemies.forEach(e => { if (e.active) + e.destroy(); }); + this.parachuteFlyingEnemies = []; + this.addScore(500, this.player.x, this.player.y - 30); + } + shutdown() { + super.shutdown(); + // Destroy all physics groups and their children + const groups = [ + this.groundGroup, this.brickGroup, this.qblockGroup, this.pipeGroup, + this.coinGroup, this.mushroomGroup, this.heartGroup, this.fireballGroup, + this.enemyGroup, this.bridgeGroup, this.bounceGroup, this.flagGroup, + this.piranhaGroup, this.fireGroup, this.crocGroup, this.fishGroup, + ]; + for (const g of groups) { + if (g && g.clear) + try { + g.clear(true, true); + } + catch { } + } + // Destroy player and extra sprites + this.destroyObj(this.player); + this.destroyObj(this.parachuteSprite); + this.parachuteSprite = undefined; + this.destroyObj(this.glowSprite); + this.glowSprite = undefined; + // Stop wind sound + if (this.windSound) { + try { + this.windSound.stop(); + } + catch { } + this.windSound = undefined; + } + // Clean up flying enemies from parachute mode + this.parachuteFlyingEnemies.forEach(e => { if (e.active) + e.destroy(); }); + this.parachuteFlyingEnemies = []; + } +} +//# sourceMappingURL=NinjaRunner.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/game/scenes/PlanetGuardian.js b/extensions/arcade-canvas/game/scenes/PlanetGuardian.js new file mode 100644 index 00000000..abb952b9 --- /dev/null +++ b/extensions/arcade-canvas/game/scenes/PlanetGuardian.js @@ -0,0 +1,1818 @@ +// Defender — Classic 1981 Williams side-scrolling shooter. +// Protect humanoids from alien landers across a scrolling terrain world. +import { BaseScene, W, H } from './BaseScene.js'; +/* ------------------------------------------------------------------ */ +/* Constants */ +/* ------------------------------------------------------------------ */ +let SCALE = Math.min(W / 1920, H / 1080); +let PX = Math.max(3, Math.round(4 * SCALE)); +const WORLD_W_SCREENS = 6; +let WORLD_W = W * WORLD_W_SCREENS; +const PLAYER_THRUST = 1400; +const PLAYER_MAX_VX = 900; +const PLAYER_VY_SPEED = 500; +const PLAYER_FRICTION = 0.985; // high inertia — ship coasts like original +const BULLET_SPEED = 1200; +const MAX_BULLETS = 8; +const INVINCIBLE_TIME = 2000; +const RESPAWN_DELAY = 800; +const EXTRA_LIFE_SCORE = 10000; +const TERRAIN_SAMPLE = 20; // pixels between terrain height samples +const TERRAIN_MIN_Y = 0.65; // fraction of H for highest peak +const TERRAIN_MAX_Y = 0.88; // fraction of H for lowest valley +const RADAR_H = 50; // taller for visibility +const RADAR_Y = 105; // well below HUD bar (~91px tall) +const ENEMY_BULLET_SPEED = 400; +const RESPAWN_SAFE_RADIUS = 300; +const RESPAWN_SAFE_RADIUS_BAITER = 600; +const RESPAWN_PUSH_OFFSET = 150; +/* ------------------------------------------------------------------ */ +/* Pixel Art Data — dimensions matched to original ROM sprite list */ +/* Reference: https://www.seanriddle.com/defendersprites.txt */ +/* ------------------------------------------------------------------ */ +// Ship: ROM = 16×6 px (8 bytes × 6 rows) +// From MAME screenshots: sleek profile facing right +// - Tapers at top and bottom (rows 0,5 are narrow) +// - Widest at center rows (1-4) +// - Magenta engine block at rear left +// - White body, cyan nose tip at right +// - Green exhaust pixels at bottom-left +const SHIP_PIXELS = [ + // Row 0 — top taper (narrow, no engine visible) + [6, 0, 0xffffff], [7, 0, 0xffffff], [8, 0, 0xffffff], [9, 0, 0xffffff], + [10, 0, 0xffffff], [11, 0, 0xffffff], [12, 0, 0xffffff], [13, 0, 0xffffff], + // Row 1 — wider, engine appears + [2, 1, 0xff00ff], [3, 1, 0xff44ff], + [4, 1, 0xffffff], [5, 1, 0xffffff], [6, 1, 0xffffff], [7, 1, 0xffffff], + [8, 1, 0xffffff], [9, 1, 0xffffff], [10, 1, 0xffffff], [11, 1, 0xffffff], + [12, 1, 0xffffff], [13, 1, 0xffffff], [14, 1, 0xffffff], + // Row 2 — full width (widest), engine + body + nose tip + [0, 2, 0xff00ff], [1, 2, 0xff00ff], [2, 2, 0xff00ff], [3, 2, 0xff44ff], + [4, 2, 0xffffff], [5, 2, 0xffffff], [6, 2, 0xffffff], [7, 2, 0xffffff], + [8, 2, 0xffffff], [9, 2, 0xffffff], [10, 2, 0xffffff], [11, 2, 0xffffff], + [12, 2, 0xffffff], [13, 2, 0xffffff], [14, 2, 0xffffff], [15, 2, 0x00ccff], + // Row 3 — full width (widest), engine + body + nose tip + [0, 3, 0xff00ff], [1, 3, 0xff00ff], [2, 3, 0xff00ff], [3, 3, 0xff44ff], + [4, 3, 0xffffff], [5, 3, 0xffffff], [6, 3, 0xffffff], [7, 3, 0xffffff], + [8, 3, 0xffffff], [9, 3, 0xffffff], [10, 3, 0xffffff], [11, 3, 0xffffff], + [12, 3, 0xffffff], [13, 3, 0xffffff], [14, 3, 0xffffff], [15, 3, 0x00ccff], + // Row 4 — wider, engine appears + [2, 4, 0xff00ff], [3, 4, 0xff44ff], + [4, 4, 0xffffff], [5, 4, 0xffffff], [6, 4, 0xffffff], [7, 4, 0xffffff], + [8, 4, 0xffffff], [9, 4, 0xffffff], [10, 4, 0xffffff], [11, 4, 0xffffff], + [12, 4, 0xffffff], [13, 4, 0xffffff], [14, 4, 0xffffff], + // Row 5 — bottom taper + green exhaust trail + [4, 5, 0xffffff], [5, 5, 0xffffff], [6, 5, 0xffffff], [7, 5, 0xffffff], + [8, 5, 0xffffff], [9, 5, 0xffffff], [10, 5, 0xffffff], [11, 5, 0xffffff], + [0, 5, 0x00ff00], [1, 5, 0x00ff00], +]; +// Lander: ROM = 10×8 px (5 bytes × 8 rows) +// H-shaped: diamond body with grabber legs below +const LANDER_PIXELS = [ + // Row 0 — top center + [4, 0, 0x00ff00], [5, 0, 0x00ff00], + // Row 1 — upper diamond + [3, 1, 0x00ff00], [4, 1, 0xffff00], [5, 1, 0xffff00], [6, 1, 0x00ff00], + // Row 2 — widest body + [2, 2, 0x00ff00], [3, 2, 0x00ff00], [4, 2, 0x00ff00], [5, 2, 0x00ff00], [6, 2, 0x00ff00], [7, 2, 0x00ff00], + // Row 3 — full width with side detail + [1, 3, 0x00ff00], [2, 3, 0x00ff00], [3, 3, 0xffff00], [4, 3, 0x00ff00], [5, 3, 0x00ff00], [6, 3, 0xffff00], [7, 3, 0x00ff00], [8, 3, 0x00ff00], + // Row 4 — lower body + [2, 4, 0x00ff00], [3, 4, 0x00ff00], [4, 4, 0x00ff00], [5, 4, 0x00ff00], [6, 4, 0x00ff00], [7, 4, 0x00ff00], + // Row 5 — narrowing + [3, 5, 0x00ff00], [4, 5, 0x00ff00], [5, 5, 0x00ff00], [6, 5, 0x00ff00], + // Row 6 — legs + [1, 6, 0xffff00], [2, 6, 0xffff00], [7, 6, 0xffff00], [8, 6, 0xffff00], + // Row 7 — leg tips + [0, 7, 0xffff00], [1, 7, 0xffff00], [8, 7, 0xffff00], [9, 7, 0xffff00], +]; +// Mutant: ROM = 10×8 px (5 bytes × 8 rows) +// Composite of lander + humanoid overlay, blobby organic look +const MUTANT_PIXELS = [ + // Row 0 + [3, 0, 0xff00ff], [4, 0, 0xff00ff], [5, 0, 0xff00ff], [6, 0, 0xff00ff], + // Row 1 + [2, 1, 0xff00ff], [3, 1, 0xcc00cc], [4, 1, 0xcc00cc], [5, 1, 0xcc00cc], [6, 1, 0xcc00cc], [7, 1, 0xff00ff], + // Row 2 — yellow-green eyes + [1, 2, 0xff00ff], [2, 2, 0xff00ff], [3, 2, 0xaaff00], [4, 2, 0xff00ff], [5, 2, 0xff00ff], [6, 2, 0xaaff00], [7, 2, 0xff00ff], [8, 2, 0xff00ff], + // Row 3 — widest + [0, 3, 0xff00ff], [1, 3, 0xff00ff], [2, 3, 0xff00ff], [3, 3, 0xff00ff], [4, 3, 0xff00ff], [5, 3, 0xff00ff], [6, 3, 0xff00ff], [7, 3, 0xff00ff], [8, 3, 0xff00ff], [9, 3, 0xff00ff], + // Row 4 — widest + [0, 4, 0xff00ff], [1, 4, 0xff00ff], [2, 4, 0xff00ff], [3, 4, 0xff00ff], [4, 4, 0xff00ff], [5, 4, 0xff00ff], [6, 4, 0xff00ff], [7, 4, 0xff00ff], [8, 4, 0xff00ff], [9, 4, 0xff00ff], + // Row 5 + [1, 5, 0xcc00cc], [2, 5, 0xff00ff], [3, 5, 0xff00ff], [4, 5, 0xff00ff], [5, 5, 0xff00ff], [6, 5, 0xff00ff], [7, 5, 0xff00ff], [8, 5, 0xcc00cc], + // Row 6 + [2, 6, 0xcc00cc], [3, 6, 0xff00ff], [4, 6, 0xff00ff], [5, 6, 0xff00ff], [6, 6, 0xff00ff], [7, 6, 0xcc00cc], + // Row 7 + [3, 7, 0xcc00cc], [4, 7, 0xcc00cc], [5, 7, 0xcc00cc], [6, 7, 0xcc00cc], +]; +// Humanoid: ROM = 4×8 px (2 bytes × 8 rows) +// Multi-colored: green upper body, magenta/pink lower half +const HUMANOID_PIXELS = [ + // Row 0 — head (green) + [1, 0, 0x00ff00], [2, 0, 0x00ff00], + // Row 1 — neck (green) + [1, 1, 0x00ff00], [2, 1, 0x00ff00], + // Row 2 — arms + torso (green) + [0, 2, 0x00ff00], [1, 2, 0x00ff00], [2, 2, 0x00ff00], [3, 2, 0x00ff00], + // Row 3 — torso (green) + [1, 3, 0x00ff00], [2, 3, 0x00ff00], + // Row 4 — waist (magenta transition) + [1, 4, 0xff00ff], [2, 4, 0xff00ff], + // Row 5 — hips (magenta) + [1, 5, 0xff00ff], [2, 5, 0xff00ff], + // Row 6 — legs (magenta) + [0, 6, 0xff00ff], [3, 6, 0xff00ff], + // Row 7 — feet (magenta) + [0, 7, 0xff00ff], [3, 7, 0xff00ff], +]; +// Bomber: ROM = 8×8 px (4 bytes × 8 rows) +// Compact square block with segmented look, NOT a wide rectangle +const BOMBER_PIXELS = [ + // Row 0 — top edge + [1, 0, 0xffff00], [2, 0, 0xffff00], [3, 0, 0xffff00], [4, 0, 0xffff00], [5, 0, 0xffff00], [6, 0, 0xffff00], + // Row 1 — top stripe with detail + [0, 1, 0xffff00], [1, 1, 0xff4400], [2, 1, 0xffff00], [3, 1, 0xff4400], [4, 1, 0xffff00], [5, 1, 0xff4400], [6, 1, 0xffff00], [7, 1, 0xffff00], + // Row 2 — solid + [0, 2, 0xffff00], [1, 2, 0xffff00], [2, 2, 0xffff00], [3, 2, 0xffff00], [4, 2, 0xffff00], [5, 2, 0xffff00], [6, 2, 0xffff00], [7, 2, 0xffff00], + // Row 3 — center detail + [0, 3, 0xffff00], [1, 3, 0xffff00], [2, 3, 0xff4400], [3, 3, 0xffff00], [4, 3, 0xffff00], [5, 3, 0xff4400], [6, 3, 0xffff00], [7, 3, 0xffff00], + // Row 4 — center detail + [0, 4, 0xffff00], [1, 4, 0xffff00], [2, 4, 0xff4400], [3, 4, 0xffff00], [4, 4, 0xffff00], [5, 4, 0xff4400], [6, 4, 0xffff00], [7, 4, 0xffff00], + // Row 5 — solid + [0, 5, 0xffff00], [1, 5, 0xffff00], [2, 5, 0xffff00], [3, 5, 0xffff00], [4, 5, 0xffff00], [5, 5, 0xffff00], [6, 5, 0xffff00], [7, 5, 0xffff00], + // Row 6 — bottom stripe + [0, 6, 0xffff00], [1, 6, 0xff4400], [2, 6, 0xffff00], [3, 6, 0xff4400], [4, 6, 0xffff00], [5, 6, 0xff4400], [6, 6, 0xffff00], [7, 6, 0xffff00], + // Row 7 — bottom edge + [1, 7, 0xffff00], [2, 7, 0xffff00], [3, 7, 0xffff00], [4, 7, 0xffff00], [5, 7, 0xffff00], [6, 7, 0xffff00], +]; +// Baiter: ROM = 12×4 px (6 bytes × 4 rows) +// Thin horseshoe/C shape — narrow and aggressive +const BAITER_PIXELS = [ + // Row 0 — top bar + [0, 0, 0x00ff44], [1, 0, 0x00ff44], [2, 0, 0x00ff44], [3, 0, 0x00ff44], [4, 0, 0x00ff44], [5, 0, 0x00ff44], [6, 0, 0x00ff44], [7, 0, 0x00ff44], [8, 0, 0x00ff44], [9, 0, 0x00ff44], [10, 0, 0x00ff44], [11, 0, 0x00ff44], + // Row 1 — gap in middle + [0, 1, 0x00ff44], [1, 1, 0x00ff44], [10, 1, 0x00ff44], [11, 1, 0x00ff44], + // Row 2 — gap in middle + [0, 2, 0x00ff44], [1, 2, 0x00ff44], [10, 2, 0x00ff44], [11, 2, 0x00ff44], + // Row 3 — bottom bar + [0, 3, 0x00ff44], [1, 3, 0x00ff44], [2, 3, 0x00ff44], [3, 3, 0x00ff44], [4, 3, 0x00ff44], [5, 3, 0x00ff44], [6, 3, 0x00ff44], [7, 3, 0x00ff44], [8, 3, 0x00ff44], [9, 3, 0x00ff44], [10, 3, 0x00ff44], [11, 3, 0x00ff44], +]; +// Pod: ROM = 8×8 px (4 bytes × 8 rows) +// Compact oval/circle shape, not a large egg +const POD_PIXELS = [ + // Row 0 + [2, 0, 0xcc00cc], [3, 0, 0xcc00cc], [4, 0, 0xcc00cc], [5, 0, 0xcc00cc], + // Row 1 + [1, 1, 0xcc00cc], [2, 1, 0xff00ff], [3, 1, 0xff00ff], [4, 1, 0xff00ff], [5, 1, 0xff00ff], [6, 1, 0xcc00cc], + // Row 2 + [0, 2, 0xcc00cc], [1, 2, 0xff00ff], [2, 2, 0xff00ff], [3, 2, 0xff44ff], [4, 2, 0xff44ff], [5, 2, 0xff00ff], [6, 2, 0xff00ff], [7, 2, 0xcc00cc], + // Row 3 + [0, 3, 0xcc00cc], [1, 3, 0xff00ff], [2, 3, 0xff44ff], [3, 3, 0xff00ff], [4, 3, 0xff00ff], [5, 3, 0xff44ff], [6, 3, 0xff00ff], [7, 3, 0xcc00cc], + // Row 4 + [0, 4, 0xcc00cc], [1, 4, 0xff00ff], [2, 4, 0xff44ff], [3, 4, 0xff00ff], [4, 4, 0xff00ff], [5, 4, 0xff44ff], [6, 4, 0xff00ff], [7, 4, 0xcc00cc], + // Row 5 + [0, 5, 0xcc00cc], [1, 5, 0xff00ff], [2, 5, 0xff00ff], [3, 5, 0xff44ff], [4, 5, 0xff44ff], [5, 5, 0xff00ff], [6, 5, 0xff00ff], [7, 5, 0xcc00cc], + // Row 6 + [1, 6, 0xcc00cc], [2, 6, 0xff00ff], [3, 6, 0xff00ff], [4, 6, 0xff00ff], [5, 6, 0xff00ff], [6, 6, 0xcc00cc], + // Row 7 + [2, 7, 0xcc00cc], [3, 7, 0xcc00cc], [4, 7, 0xcc00cc], [5, 7, 0xcc00cc], +]; +// Swarmer: ROM = 6×4 px (3 bytes × 4 rows) +// Wider than tall cross/star shape +const SWARMER_PIXELS = [ + // Row 0 + [2, 0, 0xffff00], [3, 0, 0xffff00], + // Row 1 — full width + [0, 1, 0xffff00], [1, 1, 0xffff00], [2, 1, 0xffff00], [3, 1, 0xffff00], [4, 1, 0xffff00], [5, 1, 0xffff00], + // Row 2 — full width + [0, 2, 0xffff00], [1, 2, 0xffff00], [2, 2, 0xffff00], [3, 2, 0xffff00], [4, 2, 0xffff00], [5, 2, 0xffff00], + // Row 3 + [2, 3, 0xffff00], [3, 3, 0xffff00], +]; +/* ------------------------------------------------------------------ */ +/* Scene */ +/* ------------------------------------------------------------------ */ +export class PlanetGuardianScene extends BaseScene { + /* Player state */ + playerX = 0; + playerY = 0; + playerVx = 0; + playerVy = 0; + facingRight = true; + shipAlive = true; + invincibleTimer = 0; + respawnTimer = 0; + smartBombs = 3; + carriedHumanoid = -1; // index of humanoid being carried, -1 = none + nextExtraLife = EXTRA_LIFE_SCORE; + /* Game objects */ + enemies = []; + humanoids = []; + bullets = []; + mines = []; + stars = []; + /* Terrain */ + terrainHeights = []; + planetDestroyed = false; + /* Camera / scroll */ + cameraX = 0; + spriteScale = 1; // calculated in create() + /* Game state */ + wave = 0; + gameOver = false; + waveTimer = 0; // time elapsed in current wave (for baiter spawning) + waveDelay = 0; + baiterSpawned = false; + /* Graphics objects */ + gameGfx; // main game graphics + radarGfx; // radar minimap + terrainGfx; // terrain graphics + hudExtraGfx; // smart bomb display + shipSprite; // player ship sprite + /* Input */ + cursors; + fireKey; + bombKey; + fireWasDown = false; + bombWasDown = false; + fireCooldown = 0; // rapid-fire rate limiter + thrustSoundPlaying = false; + constructor() { super('defender'); } + get displayName() { return 'Planet Guardian'; } + getDescription() { + return 'Defend humanoids from alien landers. Rescue the falling and destroy all enemies!'; + } + getControls() { + return [ + { key: '← →', action: 'Thrust / Reverse' }, + { key: '↑ ↓', action: 'Move Up / Down' }, + { key: 'SPACE', action: 'Fire Laser (hold)' }, + { key: 'Z', action: 'Smart Bomb' }, + ]; + } + /* ================================================================ + LIFECYCLE + ================================================================ */ + preload() { + // Load sprite PNGs (generated pixel art, CC0-compatible original designs) + this.load.image('def-ship-r', '../assets/defender/ship.png'); + this.load.image('def-ship-l', '../assets/defender/ship_left.png'); + this.load.image('def-lander', '../assets/defender/lander.png'); + this.load.image('def-mutant', '../assets/defender/mutant.png'); + this.load.image('def-humanoid', '../assets/defender/humanoid.png'); + this.load.image('def-bomber', '../assets/defender/bomber.png'); + this.load.image('def-pod', '../assets/defender/pod.png'); + this.load.image('def-swarmer', '../assets/defender/swarmer.png'); + this.load.image('def-baiter', '../assets/defender/baiter.png'); + // Sounds from OpenDefender + this.load.audio('snd_laser', '../assets/defender/sounds/sound_laser.wav'); + this.load.audio('snd_enemydead', '../assets/defender/sounds/sound_enemydead.wav'); + this.load.audio('snd_explode', '../assets/defender/sounds/sound_explode.wav'); + this.load.audio('snd_playerdead', '../assets/defender/sounds/sound_playerdead.wav'); + this.load.audio('snd_bonus', '../assets/defender/sounds/sound_bonus.wav'); + this.load.audio('snd_humanoiddead', '../assets/defender/sounds/sound_humanoiddead.wav'); + this.load.audio('snd_start', '../assets/defender/sounds/sound_start.wav'); + this.load.audio('snd_thrust', '../assets/defender/sounds/sound_thurst.wav'); + this.load.audio('snd_warning', '../assets/defender/sounds/sound_warning.wav'); + this.load.audio('snd_baiterwarning', '../assets/defender/sounds/sound_baiterwarning.wav'); + this.load.audio('snd_player1up', '../assets/defender/sounds/sound_player1up.wav'); + this.load.audio('snd_enemyshoot', '../assets/defender/sounds/sound_enemyshoot.wav'); + this.load.audio('snd_enemyshoot2', '../assets/defender/sounds/sound_enemyshoot2.wav'); + } + create() { + this.initBase(); + // Switch Planet Guardian textures to linear filtering for smoother scaling + const defKeys = ['def-ship-r', 'def-ship-l', 'def-lander', 'def-mutant', + 'def-humanoid', 'def-bomber', 'def-pod', 'def-swarmer', 'def-baiter']; + for (const k of defKeys) { + const tex = this.textures.get(k); + if (tex && tex.source[0]?.glTexture) { + tex.setFilter(Phaser.Textures.FilterMode.LINEAR); + } + } + // Recalculate screen-dependent constants + SCALE = Math.min(W / 1920, H / 1080); + PX = Math.max(3, Math.round(4 * SCALE)); + WORLD_W = W * WORLD_W_SCREENS; + // Reset state + this.score = 0; + this.lives = 3; + this.wave = 0; + this.gameOver = false; + this.planetDestroyed = false; + this.smartBombs = 3; + this.carriedHumanoid = -1; + this.nextExtraLife = EXTRA_LIFE_SCORE; + this.playerX = WORLD_W / 2; + this.playerY = H * 0.4; + this.playerVx = 0; + this.playerVy = 0; + this.facingRight = true; + this.shipAlive = true; + this.invincibleTimer = 0; + this.respawnTimer = 0; + this.enemies = []; + this.humanoids = []; + this.bullets = []; + this.mines = []; + this.stars = []; + this.activeEmitters = []; + this.waveTimer = 0; + this.waveDelay = 0; + this.baiterSpawned = false; + this.ensureSparkTexture(); + // Starfield + this.stars = this.createStarfield([ + { count: 50, speed: 0, size: 1, alpha: 0.25 }, + { count: 30, speed: 0, size: 1.5, alpha: 0.35 }, + { count: 15, speed: 0, size: 2, alpha: 0.45 }, + ]); + // Generate terrain + this.generateTerrain(); + // Sprite scale — ensure sprites are visible across all monitor sizes + // At 1080p (SCALE=1.0): scale ~0.8 → ship 94px, enemies 55-64px + // At 720p (SCALE=0.67): scale ~0.6 → ship 71px, enemies 40-50px + // Floor of 0.55 ensures minimum ~46px ship, ~28px swarmer on small monitors + this.spriteScale = Math.max(0.35, 0.55 * SCALE); + // Graphics layers + this.terrainGfx = this.add.graphics().setDepth(5); + this.gameGfx = this.add.graphics().setDepth(10); + this.radarGfx = this.add.graphics().setDepth(800); + this.hudExtraGfx = this.add.graphics().setDepth(801); + // Player ship sprite (scale to match screen) + this.shipSprite = this.add.image(0, 0, 'def-ship-r').setDepth(10).setOrigin(0.5, 0.5).setScale(this.spriteScale); + // Input — set up references but don't capture yet (ready screen needs keydown) + this.cursors = this.input.keyboard.createCursorKeys(); + this.fireKey = this.input.keyboard.addKey('SPACE'); + this.bombKey = this.input.keyboard.addKey('Z'); + this.fireWasDown = false; + this.bombWasDown = false; + this.fireCooldown = 0; + this.thrustSoundPlaying = false; + this.syncLivesToHUD(); + this.syncScoreToHUD(); + this.loadHighScore(); + this.startWithReadyScreen(() => { + // Capture keys only after ready screen dismisses + this.input.keyboard.addCapture('UP,DOWN,LEFT,RIGHT,SPACE,Z'); + this.startWave(); + }); + } + update(_t, dtMs) { + if (this.gameOver || !this.cursors) + return; + const dt = Math.min(dtMs, 33); + const dtSec = dt / 1000; + // Respawn timer + if (this.respawnTimer > 0) { + this.respawnTimer -= dt; + if (this.respawnTimer <= 0) + this.respawnPlayer(); + } + // Fire cooldown + if (this.fireCooldown > 0) + this.fireCooldown -= dt; + // Player input & physics + if (this.shipAlive) { + this.updatePlayerInput(dtSec); + this.updatePlayerPhysics(dtSec); + } + // Update camera to follow player + this.updateCamera(dtSec); + // Update entities + this.updateEnemies(dtSec); + this.updateHumanoids(dtSec); + this.updateBulletsPhysics(dtSec); + this.updateMines(dt); + this.checkCollisions(); + // Wave management + this.waveTimer += dt; + if (!this.baiterSpawned && this.wave >= 2 && this.waveTimer > 30000) { + this.spawnBaiter(); + this.baiterSpawned = true; + } + if (this.waveDelay > 0) { + this.waveDelay -= dt; + if (this.waveDelay <= 0) + this.startWave(); + } + else if (this.enemies.filter(e => e.alive).length === 0 && this.mines.length === 0 && this.waveDelay <= 0 && this.wave > 0) { + // Wave complete + this.onWaveComplete(); + } + // Invincibility blink + if (this.invincibleTimer > 0) { + this.invincibleTimer -= dt; + } + // Clean up expired emitters (handled by delayed destroy in spawnExplosion) + // Render everything + this.renderGame(); + } + /* ================================================================ + TERRAIN + ================================================================ */ + generateTerrain() { + const numSamples = Math.ceil(WORLD_W / TERRAIN_SAMPLE) + 1; + this.terrainHeights = []; + // Generate raw heights + for (let i = 0; i < numSamples; i++) { + const t = i / numSamples; + const base = H * (TERRAIN_MIN_Y + (TERRAIN_MAX_Y - TERRAIN_MIN_Y) * 0.5); + const variation = H * (TERRAIN_MAX_Y - TERRAIN_MIN_Y) * 0.5; + const h = base + + Math.sin(t * Math.PI * 12) * variation * 0.4 + + Math.sin(t * Math.PI * 25 + 1.3) * variation * 0.3 + + Math.sin(t * Math.PI * 50 + 2.7) * variation * 0.2 + + (Math.random() - 0.5) * variation * 0.3; + this.terrainHeights.push(h); + } + // Smooth + for (let pass = 0; pass < 3; pass++) { + const smoothed = [...this.terrainHeights]; + for (let i = 1; i < smoothed.length - 1; i++) { + smoothed[i] = (this.terrainHeights[i - 1] + this.terrainHeights[i] + this.terrainHeights[i + 1]) / 3; + } + // Wrap edges + smoothed[0] = (this.terrainHeights[this.terrainHeights.length - 1] + this.terrainHeights[0] + this.terrainHeights[1]) / 3; + smoothed[smoothed.length - 1] = (this.terrainHeights[this.terrainHeights.length - 2] + this.terrainHeights[this.terrainHeights.length - 1] + this.terrainHeights[0]) / 3; + this.terrainHeights = smoothed; + } + } + getTerrainY(worldX) { + // Wrap x into world range + let wx = this.wrapWorldX(worldX); + const idx = wx / TERRAIN_SAMPLE; + const i0 = Math.floor(idx) % this.terrainHeights.length; + const i1 = (i0 + 1) % this.terrainHeights.length; + const frac = idx - Math.floor(idx); + return this.terrainHeights[i0] * (1 - frac) + this.terrainHeights[i1] * frac; + } + wrapWorldX(x) { + return ((x % WORLD_W) + WORLD_W) % WORLD_W; + } + /* ================================================================ + PLAYER + ================================================================ */ + updatePlayerInput(dtSec) { + // Original Defender controls: + // - UP/DOWN = vertical movement (joystick) + // - LEFT = reverse (flip ship facing) + // - RIGHT = thrust (forward in facing direction) + // Adapted for keyboard: LEFT/RIGHT still control direction, + // but pressing opposite to facing FIRST reverses, THEN thrusts + // with a brief acceleration delay to simulate reverse→thrust feel. + const leftDown = this.cursors.left.isDown; + const rightDown = this.cursors.right.isDown; + if (rightDown && !leftDown) { + if (!this.facingRight) { + // Reversing: flip first, apply reduced thrust + this.facingRight = true; + this.playerVx += PLAYER_THRUST * dtSec * 0.3; + } + else { + // Thrusting forward + this.playerVx += PLAYER_THRUST * dtSec; + } + } + else if (leftDown && !rightDown) { + if (this.facingRight) { + // Reversing: flip first, apply reduced thrust + this.facingRight = false; + this.playerVx -= PLAYER_THRUST * dtSec * 0.3; + } + else { + // Thrusting forward + this.playerVx -= PLAYER_THRUST * dtSec; + } + } + // Vertical movement (direct, like original joystick) + if (this.cursors.up.isDown) { + this.playerVy = -PLAYER_VY_SPEED; + } + else if (this.cursors.down.isDown) { + this.playerVy = PLAYER_VY_SPEED; + } + else { + this.playerVy *= 0.9; + } + // Fire — RAPID-FIRE when held down (original Defender behavior) + if (this.fireKey.isDown) { + this.fireBullet(); + } + // Smart bomb — single press + const bombDown = this.bombKey.isDown; + if (bombDown && !this.bombWasDown) { + this.useSmartBomb(); + } + this.bombWasDown = bombDown; + // Thrust sound + const isThrusting = this.cursors.left.isDown || this.cursors.right.isDown; + if (isThrusting && !this.thrustSoundPlaying) { + try { + this.sound.play('snd_thrust', { volume: 0.15, loop: true }); + } + catch { } + this.thrustSoundPlaying = true; + } + else if (!isThrusting && this.thrustSoundPlaying) { + try { + this.sound.stopByKey('snd_thrust'); + } + catch { } + this.thrustSoundPlaying = false; + } + } + updatePlayerPhysics(dtSec) { + // Friction on horizontal + this.playerVx *= Math.pow(PLAYER_FRICTION, dtSec * 60); + // Clamp + if (this.playerVx > PLAYER_MAX_VX) + this.playerVx = PLAYER_MAX_VX; + if (this.playerVx < -PLAYER_MAX_VX) + this.playerVx = -PLAYER_MAX_VX; + this.playerX += this.playerVx * dtSec; + this.playerY += this.playerVy * dtSec; + // World wrap X + this.playerX = this.wrapWorldX(this.playerX); + // Clamp Y — only prevent going off-screen, NOT above terrain + // In original Defender, ship can fly below the mountain line + const topLimit = RADAR_Y + RADAR_H + 10; + if (this.playerY < topLimit) + this.playerY = topLimit; + if (this.playerY > H - 10) + this.playerY = H - 10; + // Carry humanoid + if (this.carriedHumanoid >= 0) { + const h = this.humanoids[this.carriedHumanoid]; + if (h && h.state === 'rescued') { + h.x = this.playerX; + h.y = this.playerY + 10 * PX / 3; + // Check if touching terrain to return humanoid + if (!this.planetDestroyed) { + const tY = this.getTerrainY(h.x); + if (h.y >= tY - 5) { + h.y = tY - 3; + h.state = 'walking'; + h.vx = (Math.random() > 0.5 ? 1 : -1) * 15; + this.carriedHumanoid = -1; + this.addScore(500, this.worldToScreenX(h.x), h.y); + } + } + } + } + } + respawnPlayer() { + this.shipAlive = true; + this.invincibleTimer = INVINCIBLE_TIME; + this.smartBombs = 3; + this.carriedHumanoid = -1; + this.playerVx = 0; + this.playerVy = 0; + this.playerY = H * 0.4; + // Safety: push nearby enemies away from spawn point + // Baiters get pushed much further since they home aggressively + for (const e of this.enemies) { + if (!e.alive) + continue; + const safeRadius = e.type === 'baiter' ? RESPAWN_SAFE_RADIUS_BAITER : RESPAWN_SAFE_RADIUS; + const d = this.worldDist(e.x, e.y, this.playerX, this.playerY); + if (d < safeRadius) { + const angle = Math.atan2(e.y - this.playerY, e.x - this.playerX) || Math.random() * Math.PI * 2; + e.x = this.playerX + Math.cos(angle) * (safeRadius + RESPAWN_PUSH_OFFSET); + e.y = this.playerY + Math.sin(angle) * (safeRadius * 0.4); + e.x = this.wrapWorldX(e.x); + // Kill velocity so they don't rush back immediately + e.vx *= 0.1; + e.vy *= 0.1; + // Reset baiter to dormant phase so player has time to orient + if (e.type === 'baiter') { + e.zigPhase = 0; + } + } + } + } + killPlayer() { + if (!this.shipAlive || this.invincibleTimer > 0) + return; + this.shipAlive = false; + if (this.shipSprite) + this.shipSprite.setVisible(false); + try { + this.sound.play('snd_playerdead', { volume: 0.5 }); + } + catch { } + // Stop thrust sound + try { + this.sound.stopByKey('snd_thrust'); + } + catch { } + this.thrustSoundPlaying = false; + // Drop carried humanoid + if (this.carriedHumanoid >= 0) { + const h = this.humanoids[this.carriedHumanoid]; + if (h) { + h.state = 'falling'; + h.vy = 0; + } + this.carriedHumanoid = -1; + } + // Explosion + this.spawnExplosion(this.playerX, this.playerY, 0xff00ff, 16); + this.lives--; + this.syncLivesToHUD(); + if (this.lives <= 0) { + this.gameOver = true; + this.checkHighScore(); + // Release keyboard captures so game-over overlay can receive key events + try { + this.input.keyboard.removeCapture('SPACE,Z,UP,DOWN,LEFT,RIGHT'); + } + catch { } + this.time.delayedCall(1000, () => { + this.showGameOver(this.score, () => this.scene.restart()); + }); + } + else { + this.respawnTimer = RESPAWN_DELAY; + } + } + /* ================================================================ + CAMERA + ================================================================ */ + updateCamera(dtSec) { + // Camera tries to keep player slightly off-center in the direction of movement + let targetCamX = this.playerX - W * 0.35; + if (!this.facingRight) { + targetCamX = this.playerX - W * 0.65; + } + // Lerp + const lerpSpeed = 5; + let diff = targetCamX - this.cameraX; + // Handle wrapping + if (diff > WORLD_W / 2) + diff -= WORLD_W; + if (diff < -WORLD_W / 2) + diff += WORLD_W; + this.cameraX += diff * lerpSpeed * dtSec; + this.cameraX = this.wrapWorldX(this.cameraX); + } + worldToScreenX(worldX) { + let sx = worldX - this.cameraX; + if (sx > WORLD_W / 2) + sx -= WORLD_W; + if (sx < -WORLD_W / 2) + sx += WORLD_W; + return sx; + } + isOnScreen(worldX, margin = 100) { + const sx = this.worldToScreenX(worldX); + return sx > -margin && sx < W + margin; + } + /* ================================================================ + BULLETS + ================================================================ */ + fireBullet() { + if (this.fireCooldown > 0) + return; + const playerBullets = this.bullets.filter(b => !b.isEnemy); + if (playerBullets.length >= MAX_BULLETS) + return; + this.fireCooldown = 80; // ms between shots (rapid fire ~12/sec) + const dir = this.facingRight ? 1 : -1; + // Spawn bullet at the nose of the ship (half the rendered ship width ahead) + const shipHalfW = 118 * this.spriteScale / 2; + const bx = this.playerX + dir * (shipHalfW + 5); + try { + this.sound.play('snd_laser', { volume: 0.3 }); + } + catch { } + this.bullets.push({ + x: bx, y: this.playerY, + vx: BULLET_SPEED * dir + this.playerVx * 0.5, + vy: 0, + life: 1500, + isEnemy: false, + }); + } + fireEnemyBullet(ex, ey) { + if (!this.shipAlive) + return; + let adjDx = this.playerX - ex; + if (adjDx > WORLD_W / 2) + adjDx -= WORLD_W; + if (adjDx < -WORLD_W / 2) + adjDx += WORLD_W; + const dy = this.playerY - ey; + const dist = Math.sqrt(adjDx * adjDx + dy * dy) || 1; + // Predictive lead: compensate for player velocity + const leadTime = dist / ENEMY_BULLET_SPEED; + const predictX = adjDx + this.playerVx * leadTime * 0.5; + const predictY = dy + this.playerVy * leadTime * 0.5; + // Add slight random spread (±10°) + const spread = (Math.random() - 0.5) * 0.35; + const angle = Math.atan2(predictY, predictX) + spread; + try { + this.sound.play('snd_enemyshoot', { volume: 0.2 }); + } + catch { } + this.bullets.push({ + x: ex, y: ey, + vx: Math.cos(angle) * ENEMY_BULLET_SPEED, + vy: Math.sin(angle) * ENEMY_BULLET_SPEED, + life: 3000, + isEnemy: true, + }); + } + updateBulletsPhysics(dtSec) { + for (let i = this.bullets.length - 1; i >= 0; i--) { + const b = this.bullets[i]; + b.x += b.vx * dtSec; + b.y += b.vy * dtSec; + b.life -= dtSec * 1000; + // World wrap + b.x = this.wrapWorldX(b.x); + if (b.life <= 0 || b.y < 0 || b.y > H) { + this.bullets.splice(i, 1); + } + } + } + /* ================================================================ + SMART BOMB + ================================================================ */ + useSmartBomb() { + if (this.smartBombs <= 0) + return; + this.smartBombs--; + try { + this.sound.play('snd_explode', { volume: 0.5 }); + } + catch { } + // Destroy all on-screen enemies + for (const e of this.enemies) { + if (!e.alive) + continue; + if (this.isOnScreen(e.x)) { + this.destroyEnemy(e); + } + } + // Destroy on-screen mines + for (let i = this.mines.length - 1; i >= 0; i--) { + if (this.isOnScreen(this.mines[i].x)) { + this.mines.splice(i, 1); + } + } + // Screen flash + const flash = this.add.graphics().setDepth(900); + flash.fillStyle(0xffffff, 0.7); + flash.fillRect(0, 0, W, H); + this.tweens.add({ + targets: flash, + alpha: 0, + duration: 400, + onComplete: () => flash.destroy(), + }); + } + /* ================================================================ + ENEMIES + ================================================================ */ + createEnemy(type, x, y) { + const textureKey = 'def-' + type; + const sprite = this.add.image(0, 0, textureKey).setDepth(10).setOrigin(0.5, 0.5).setScale(this.spriteScale); + return { + type, x, y, + vx: 0, vy: 0, + alive: true, + shootTimer: 2000 + Math.random() * 3000, + targetHumanoid: -1, + hasHumanoid: false, + zigTimer: 0, + mineTimer: 3000 + Math.random() * 1000, + zigPhase: Math.random() * Math.PI * 2, + sprite, + }; + } + spawnLanders(count) { + for (let i = 0; i < count; i++) { + const x = Math.random() * WORLD_W; + const y = 50 + Math.random() * 80; + const e = this.createEnemy('lander', x, y); + e.vy = 30 + Math.random() * 20; + e.vx = (Math.random() - 0.5) * 60; + this.enemies.push(e); + } + } + spawnBombers(count) { + for (let i = 0; i < count; i++) { + const x = Math.random() * WORLD_W; + const y = 100 + Math.random() * (H * 0.3); + const e = this.createEnemy('bomber', x, y); + e.vx = (Math.random() > 0.5 ? 1 : -1) * (40 + Math.random() * 30); + e.vy = (Math.random() - 0.5) * 10; + this.enemies.push(e); + } + } + spawnPods(count) { + for (let i = 0; i < count; i++) { + const x = Math.random() * WORLD_W; + const y = 80 + Math.random() * (H * 0.3); + const e = this.createEnemy('pod', x, y); + e.vx = (Math.random() - 0.5) * 40; + e.vy = (Math.random() - 0.5) * 20; + this.enemies.push(e); + } + } + spawnSwarmers(x, y, count) { + for (let i = 0; i < count; i++) { + const e = this.createEnemy('swarmer', x + (Math.random() - 0.5) * 30, y + (Math.random() - 0.5) * 30); + e.vx = (Math.random() - 0.5) * 200; + e.vy = (Math.random() - 0.5) * 200; + this.enemies.push(e); + } + } + spawnBaiter() { + // Spawn off-screen + const x = (this.playerX + W * (Math.random() > 0.5 ? 1 : -1)) % WORLD_W; + const y = 80 + Math.random() * (H * 0.3); + const e = this.createEnemy('baiter', x, y); + e.zigPhase = 0; // Start in dormant phase + e.shootTimer = 1500; // Don't shoot during dormant phase + try { + this.sound.play('snd_baiterwarning', { volume: 0.4 }); + } + catch { } + this.enemies.push(e); + } + updateEnemies(dtSec) { + const speedMult = 1 + (Math.min(this.wave, 15) - 1) * 0.12; // OpenDefender-style: 1.0 at wave 1, ~2.7 at wave 15 + for (const e of this.enemies) { + if (!e.alive) + continue; + switch (e.type) { + case 'lander': + this.updateLander(e, dtSec, speedMult); + break; + case 'mutant': + this.updateMutant(e, dtSec, speedMult); + break; + case 'bomber': + this.updateBomber(e, dtSec, speedMult); + break; + case 'pod': + this.updatePod(e, dtSec, speedMult); + break; + case 'swarmer': + this.updateSwarmer(e, dtSec, speedMult); + break; + case 'baiter': + this.updateBaiter(e, dtSec, speedMult); + break; + } + // World wrap + e.x = this.wrapWorldX(e.x); + // Clamp Y — keep enemies in playable area (not below terrain line) + if (e.y < RADAR_Y + RADAR_H + 10) + e.y = RADAR_Y + RADAR_H + 10; + const maxEnemyY = this.planetDestroyed ? H - 40 : H * 0.75; + if (e.y > maxEnemyY) + e.y = maxEnemyY; + // Shooting (lander, mutant, baiter, bomber) + if (e.type !== 'pod' && e.type !== 'swarmer') { + e.shootTimer -= dtSec * 1000; + if (e.shootTimer <= 0 && this.isOnScreen(e.x, 200)) { + this.fireEnemyBullet(e.x, e.y); + const dif = Math.min(this.wave, 15); + let baseInterval; + if (e.type === 'lander') { + baseInterval = e.hasHumanoid ? Math.max(500, 1500 - dif * 80) : Math.max(800, 2500 - dif * 100); + } + else if (e.type === 'mutant') { + baseInterval = Math.max(400, 1200 - dif * 60); + } + else if (e.type === 'baiter') { + baseInterval = Math.max(300, 1500 - dif * 80); + } + else { + baseInterval = Math.max(600, 2000 - dif * 80); + } + e.shootTimer = baseInterval + Math.random() * 500; + } + } + } + } + updateLander(e, dtSec, speedMult) { + if (!e.hasHumanoid) { + // Find a target humanoid if none + if (e.targetHumanoid < 0 || this.humanoids[e.targetHumanoid]?.state !== 'walking') { + e.targetHumanoid = -1; + const walkingIdxs = this.humanoids.map((h, i) => h.state === 'walking' ? i : -1).filter(i => i >= 0); + if (walkingIdxs.length > 0) { + e.targetHumanoid = walkingIdxs[Math.floor(Math.random() * walkingIdxs.length)]; + } + } + // Descend toward target humanoid + if (e.targetHumanoid >= 0) { + const h = this.humanoids[e.targetHumanoid]; + if (!h || h.state === 'dead') { + e.targetHumanoid = -1; + } + else { + let dx = this.wrapDx(h.x - e.x); + e.vx += (dx > 0 ? 1 : -1) * 200 * dtSec * speedMult; + // Only descend if ABOVE the humanoid, otherwise hover at humanoid height + const dy = h.y - e.y; + if (dy > 30) { + e.vy = 120 * speedMult; // descend toward humanoid + } + else if (dy < -20) { + e.vy = -60 * speedMult; // rise back up if too low + } + else { + e.vy *= 0.9; // hover near humanoid height + } + // Zig-zag + e.zigTimer += dtSec; + e.vx += Math.sin(e.zigTimer * 3) * 120 * dtSec; + // Check grab — generous radius + if (Math.abs(dx) < 25 && Math.abs(dy) < 25 && h.state === 'walking') { + e.hasHumanoid = true; + h.state = 'grabbed'; + h.vx = 0; + h.vy = 0; + try { + this.sound.play('snd_warning', { volume: 0.3 }); + } + catch { } + } + } + } + else { + // No humanoid to target — patrol at mid-height + e.zigTimer += dtSec; + e.vx += Math.sin(e.zigTimer * 2) * 100 * dtSec; + // Maintain patrol altitude around 30% of screen height + const patrolY = H * 0.3; + if (e.y < patrolY - 50) + e.vy = 40 * speedMult; + else if (e.y > patrolY + 50) + e.vy = -40 * speedMult; + else + e.vy += (Math.random() - 0.5) * 80 * dtSec; + } + } + else { + // Ascend with humanoid — fast! + e.vy = -180 * speedMult; + e.vx *= 0.98; + // Move humanoid with lander + const hIdx = e.targetHumanoid; + if (hIdx >= 0 && this.humanoids[hIdx]) { + this.humanoids[hIdx].x = e.x; + this.humanoids[hIdx].y = e.y + 12 * PX / 3; + } + // If reached top → mutate + if (e.y <= 40) { + // Humanoid dies + if (hIdx >= 0 && this.humanoids[hIdx]) { + this.humanoids[hIdx].state = 'dead'; + this.humanoids[hIdx].sprite = this.destroyObj(this.humanoids[hIdx].sprite); + try { + this.sound.play('snd_humanoiddead', { volume: 0.3 }); + } + catch { } + } + // Lander becomes mutant — swap sprite texture + e.type = 'mutant'; + if (e.sprite) + e.sprite.setTexture('def-mutant'); + try { + this.sound.play('snd_explode', { volume: 0.4 }); + } + catch { } + e.hasHumanoid = false; + e.targetHumanoid = -1; + this.checkPlanetDestroyed(); + } + } + // Apply velocity with clamping + e.vx = Math.max(-280 * speedMult, Math.min(280 * speedMult, e.vx)); + e.x += e.vx * dtSec; + e.y += e.vy * dtSec; + } + updateMutant(e, dtSec, speedMult) { + // Home toward player + const dx = this.wrapDx(this.playerX - e.x); + const dy = this.playerY - e.y; + const dist = Math.sqrt(dx * dx + dy * dy) || 1; + const speed = 300 * speedMult; + e.vx += (dx / dist) * speed * dtSec * 3; + e.vy += (dy / dist) * speed * dtSec * 3; + // Random jitter + e.vx += (Math.random() - 0.5) * 400 * dtSec; + e.vy += (Math.random() - 0.5) * 400 * dtSec; + // Clamp speed + const maxV = speed * 1.5; + const curSpeed = Math.sqrt(e.vx * e.vx + e.vy * e.vy); + if (curSpeed > maxV) { + e.vx = (e.vx / curSpeed) * maxV; + e.vy = (e.vy / curSpeed) * maxV; + } + e.x += e.vx * dtSec; + e.y += e.vy * dtSec; + } + updateBomber(e, dtSec, speedMult) { + // Slow horizontal drift + e.x += e.vx * dtSec * speedMult; + e.y += Math.sin(e.zigPhase) * 15 * dtSec; + e.zigPhase += dtSec; + // Drop mines + e.mineTimer -= dtSec * 1000; + if (e.mineTimer <= 0) { + this.mines.push({ + x: e.x, + y: e.y + 10, + life: 15000, + blinkTimer: 0, + }); + e.mineTimer = 3000 + Math.random() * 1000; + } + } + updatePod(e, dtSec, speedMult) { + // Slow drift + e.x += e.vx * dtSec * speedMult; + e.y += e.vy * dtSec * speedMult; + // Gentle bounce at vertical boundaries + if (e.y < 60 || e.y > H * 0.6) + e.vy = -e.vy; + } + updateSwarmer(e, dtSec, speedMult) { + // Fast zig-zag toward player + const dx = this.wrapDx(this.playerX - e.x); + const dy = this.playerY - e.y; + const dist = Math.sqrt(dx * dx + dy * dy) || 1; + const speed = 400 * speedMult; + e.vx += (dx / dist) * speed * dtSec * 2; + e.vy += (dy / dist) * speed * dtSec * 2; + // Erratic zig-zag + e.zigPhase += dtSec * 10; + e.vx += Math.sin(e.zigPhase) * 300 * dtSec; + e.vy += Math.cos(e.zigPhase * 1.3) * 200 * dtSec; + // Clamp + const maxV = speed * 1.8; + const curSpeed = Math.sqrt(e.vx * e.vx + e.vy * e.vy); + if (curSpeed > maxV) { + e.vx = (e.vx / curSpeed) * maxV; + e.vy = (e.vy / curSpeed) * maxV; + } + e.x += e.vx * dtSec; + e.y += e.vy * dtSec; + // Smart direction change when far from player (OpenDefender: 200px) + let sdx = this.playerX - e.x; + if (sdx > WORLD_W / 2) + sdx -= WORLD_W; + if (sdx < -WORLD_W / 2) + sdx += WORLD_W; + if (Math.abs(sdx) > 300) { + e.vx += (sdx > 0 ? 1 : -1) * 500 * dtSec; + } + } + updateBaiter(e, dtSec, speedMult) { + e.zigPhase += dtSec; + // Phase 1: Brief dormant hover (first 1.5 seconds) + if (e.zigPhase < 1.5) { + e.vx *= 0.95; + e.vy *= 0.95; + e.x += e.vx * dtSec; + e.y += e.vy * dtSec; + return; + } + const dx = this.wrapDx(this.playerX - e.x); + const dy = this.playerY - e.y; + const dist = Math.sqrt(dx * dx + dy * dy) || 1; + const speed = 280 * speedMult; + // Orbit behavior: if close to player, strafe around instead of sitting on top + const minDist = 150; + if (dist < minDist) { + // Too close — veer away perpendicular + strafe + const perpX = -dy / dist; + const perpY = dx / dist; + e.vx += perpX * speed * dtSec * 3; + e.vy += perpY * speed * dtSec * 3; + // Push away slightly + e.vx -= (dx / dist) * speed * dtSec * 1.5; + e.vy -= (dy / dist) * speed * dtSec * 1.5; + } + else { + // Approach but not too aggressively + e.vx += (dx / dist) * speed * dtSec * 1.5; + e.vy += (dy / dist) * speed * dtSec * 1.5; + } + // Strafing oscillation + e.vx += Math.sin(e.zigPhase * 4) * 180 * dtSec; + e.vy += Math.cos(e.zigPhase * 3) * 120 * dtSec; + // Clamp to max speed + const maxV = speed * 0.7; + const curSpeed = Math.sqrt(e.vx * e.vx + e.vy * e.vy); + if (curSpeed > maxV) { + e.vx = (e.vx / curSpeed) * maxV; + e.vy = (e.vy / curSpeed) * maxV; + } + e.x += e.vx * dtSec; + e.y += e.vy * dtSec; + } + destroyEnemy(e) { + if (!e.alive) + return; + e.alive = false; + e.sprite = this.destroyObj(e.sprite); + try { + this.sound.play('snd_enemydead', { volume: 0.4 }); + } + catch { } + const colorMap = { + lander: 0x00ff00, mutant: 0xff00ff, bomber: 0xffff00, + pod: 0xcc00cc, swarmer: 0xffff00, baiter: 0x00ff44, + }; + const scoreMap = { + lander: 150, mutant: 150, bomber: 250, + pod: 1000, swarmer: 150, baiter: 200, + }; + const sx = this.worldToScreenX(e.x); + this.addScore(scoreMap[e.type], sx, e.y); + this.spawnExplosion(e.x, e.y, colorMap[e.type], 10); + this.checkExtraLife(); + // Release humanoid if lander was carrying one + if (e.type === 'lander' && e.hasHumanoid && e.targetHumanoid >= 0) { + const h = this.humanoids[e.targetHumanoid]; + if (h && h.state === 'grabbed') { + h.state = 'falling'; + h.vy = 0; + } + } + // Pod splits into swarmers + if (e.type === 'pod') { + const count = 3 + Math.floor(Math.random() * 3); + this.spawnSwarmers(e.x, e.y, count); + } + } + /* ================================================================ + HUMANOIDS + ================================================================ */ + spawnHumanoids(count) { + // Destroy existing humanoid sprites before respawning + for (const h of this.humanoids) { + h.sprite = this.destroyObj(h.sprite); + } + this.humanoids = []; + for (let i = 0; i < count; i++) { + const x = Math.random() * WORLD_W; + const tY = this.getTerrainY(x); + const sprite = this.add.image(0, 0, 'def-humanoid').setDepth(10).setOrigin(0.5, 0.5).setScale(this.spriteScale); + this.humanoids.push({ + x, + y: tY - 3, + vx: (Math.random() > 0.5 ? 1 : -1) * (10 + Math.random() * 10), + vy: 0, + state: 'walking', + walkDir: Math.random() > 0.5 ? 1 : -1, + sprite, + }); + } + } + updateHumanoids(dtSec) { + for (let i = 0; i < this.humanoids.length; i++) { + const h = this.humanoids[i]; + switch (h.state) { + case 'walking': + if (this.planetDestroyed) { + // Planet destroyed — humanoids fall + h.state = 'falling'; + h.vy = 0; + break; + } + h.x += h.vx * dtSec; + h.x = this.wrapWorldX(h.x); + const tY = this.getTerrainY(h.x); + h.y = tY - 3; + // Randomly change direction + if (Math.random() < 0.005) + h.vx = -h.vx; + break; + case 'grabbed': + // Moved by lander in updateLander + break; + case 'falling': + // Gentle gravity matching OpenDefender (fallspeed=0.01, terminal=8px/frame) + // Scaled for our coordinate system: slow accel, capped terminal velocity + h.vy += 60 * dtSec; // gentle gravity (~10× slower than before) + if (h.vy > 120) + h.vy = 120; // terminal velocity cap — keeps it catchable + h.y += h.vy * dtSec; + if (!this.planetDestroyed) { + const groundY = this.getTerrainY(h.x); + if (h.y >= groundY - 3) { + if (h.vy > 100) { + // Splat — only if falling fast (dropped from very high without catching) + h.state = 'dead'; + h.sprite = this.destroyObj(h.sprite); + this.spawnExplosion(h.x, h.y, 0xffffff, 6); + try { + this.sound.play('snd_humanoiddead', { volume: 0.3 }); + } + catch { } + this.checkPlanetDestroyed(); + } + else { + // Soft landing + h.y = groundY - 3; + h.vy = 0; + h.state = 'walking'; + h.vx = (Math.random() > 0.5 ? 1 : -1) * 15; + } + } + } + else { + // No terrain — fall to death + if (h.y > H + 50) { + h.state = 'dead'; + h.sprite = this.destroyObj(h.sprite); + try { + this.sound.play('snd_humanoiddead', { volume: 0.3 }); + } + catch { } + } + } + break; + case 'rescued': + // Moved by player in updatePlayerPhysics + break; + case 'dead': + break; + } + } + } + checkPlanetDestroyed() { + if (this.planetDestroyed) + return; + const alive = this.humanoids.filter(h => h.state !== 'dead').length; + if (alive === 0) { + this.planetDestroyed = true; + // All remaining landers become mutants + for (const e of this.enemies) { + if (e.alive && e.type === 'lander') { + e.type = 'mutant'; + if (e.sprite) + e.sprite.setTexture('def-mutant'); + e.hasHumanoid = false; + e.targetHumanoid = -1; + } + } + } + } + /* ================================================================ + MINES + ================================================================ */ + updateMines(dt) { + for (let i = this.mines.length - 1; i >= 0; i--) { + const m = this.mines[i]; + m.life -= dt; + m.blinkTimer += dt; + if (m.life <= 0) { + this.mines.splice(i, 1); + } + } + } + /* ================================================================ + COLLISIONS + ================================================================ */ + worldDist(x1, y1, x2, y2) { + const dx = this.wrapDx(x1 - x2); + const dy = y1 - y2; + return Math.sqrt(dx * dx + dy * dy); + } + /** Wrap a delta-X value for the toroidal world. */ + wrapDx(dx) { + if (dx > WORLD_W / 2) + dx -= WORLD_W; + if (dx < -WORLD_W / 2) + dx += WORLD_W; + return dx; + } + checkCollisions() { + // Use half the ship's rendered height so the hitbox matches the visible sprite + const playerRadius = 53 * this.spriteScale / 2; + // Player bullets vs enemies + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + if (b.isEnemy) + continue; + for (const e of this.enemies) { + if (!e.alive) + continue; + const hitR = e.type === 'swarmer' ? 12 * PX / 3 : 18 * PX / 3; + if (this.worldDist(b.x, b.y, e.x, e.y) < hitR) { + this.destroyEnemy(e); + this.bullets.splice(bi, 1); + break; + } + } + } + // Player bullets vs mines + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + if (b.isEnemy) + continue; + for (let mi = this.mines.length - 1; mi >= 0; mi--) { + const m = this.mines[mi]; + if (this.worldDist(b.x, b.y, m.x, m.y) < 10 * PX / 3) { + this.mines.splice(mi, 1); + this.bullets.splice(bi, 1); + this.addScore(25, this.worldToScreenX(m.x), m.y); + break; + } + } + } + // Player bullets vs humanoids (friendly fire) + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + if (b.isEnemy) + continue; + for (const h of this.humanoids) { + if (h.state !== 'walking') + continue; + const hitR = 14 * PX / 3; + if (this.worldDist(b.x, b.y, h.x, h.y) < hitR) { + if (this.carriedHumanoid >= 0 && this.humanoids[this.carriedHumanoid] === h) { + this.carriedHumanoid = -1; + } + h.state = 'dead'; + try { + this.sound.play('snd_humanoiddead', { volume: 0.3 }); + } + catch { } + this.spawnExplosion(h.x, h.y, 0x00ffff, 8); + this.bullets.splice(bi, 1); + this.checkPlanetDestroyed(); + break; + } + } + } + if (!this.shipAlive) + return; + // Enemy bullets vs player + for (let bi = this.bullets.length - 1; bi >= 0; bi--) { + const b = this.bullets[bi]; + if (!b.isEnemy) + continue; + if (this.worldDist(b.x, b.y, this.playerX, this.playerY) < playerRadius) { + this.bullets.splice(bi, 1); + this.killPlayer(); + return; + } + } + // Enemies body vs player + if (this.invincibleTimer <= 0) { + for (const e of this.enemies) { + if (!e.alive) + continue; + const hitR = e.type === 'swarmer' ? 10 * PX / 3 : 18 * PX / 3; + if (this.worldDist(e.x, e.y, this.playerX, this.playerY) < hitR) { + this.killPlayer(); + return; + } + } + } + // Mines vs player + if (this.invincibleTimer <= 0) { + for (let mi = this.mines.length - 1; mi >= 0; mi--) { + const m = this.mines[mi]; + if (this.worldDist(m.x, m.y, this.playerX, this.playerY) < 10 * PX / 3) { + this.mines.splice(mi, 1); + this.killPlayer(); + return; + } + } + } + // Falling humanoids — catch by player + for (let i = 0; i < this.humanoids.length; i++) { + const h = this.humanoids[i]; + if (h.state !== 'falling') + continue; + if (this.carriedHumanoid >= 0) + continue; // already carrying one + if (this.worldDist(h.x, h.y, this.playerX, this.playerY) < 40 * PX / 3) { + h.state = 'rescued'; + h.vy = 0; + this.carriedHumanoid = i; + this.addScore(250, this.worldToScreenX(h.x), h.y); + try { + this.sound.play('snd_bonus', { volume: 0.4 }); + } + catch { } + } + } + } + /* ================================================================ + WAVES + ================================================================ */ + startWave() { + this.wave++; + this.waveTimer = 0; + this.baiterSpawned = false; + this.syncLevelToHUD(this.wave); + this.showWaveBanner(this.wave); + try { + this.sound.play('snd_start', { volume: 0.3 }); + } + catch { } + // Clear old dead enemies — destroy their sprites + for (const e of this.enemies) { + if (!e.alive) { + e.sprite = this.destroyObj(e.sprite); + } + } + this.enemies = this.enemies.filter(e => e.alive); + this.bullets = []; + this.mines = []; + // Humanoids persist across waves — only spawn on wave 1 or if planet was destroyed + if (this.wave === 1) { + this.spawnHumanoids(10); + } + // Don't respawn humanoids on subsequent waves — they carry over! + // Spawn enemies + const landerCount = 5 + (this.wave - 1) * 2; + this.spawnLanders(landerCount); + if (this.wave >= 3) { + this.spawnBombers(Math.min(this.wave - 2, 4)); + } + if (this.wave >= 4) { + this.spawnPods(Math.min(this.wave - 3, 3)); + } + } + onWaveComplete() { + // Bonus for surviving humanoids + if (!this.planetDestroyed) { + const alive = this.humanoids.filter(h => h.state !== 'dead').length; + if (alive > 0) { + const bonus = 500 * alive; + this.addScore(bonus, W / 2, H / 2); + } + } + this.waveDelay = 2000; + } + /* ================================================================ + EXTRA LIFE + ================================================================ */ + checkExtraLife() { + if (this.score >= this.nextExtraLife) { + this.lives++; + this.syncLivesToHUD(); + this.nextExtraLife += EXTRA_LIFE_SCORE; + try { + this.sound.play('snd_player1up', { volume: 0.5 }); + } + catch { } + // Flash notification + const txt = this.add.text(W / 2, H * 0.3, 'EXTRA LIFE!', { + fontFamily: '"Press Start 2P", monospace', + fontSize: '18px', + color: '#00ff00', + stroke: '#000', + strokeThickness: 3, + }).setOrigin(0.5, 0.5).setDepth(950); + this.tweens.add({ + targets: txt, + y: H * 0.25, + alpha: 0, + duration: 1500, + onComplete: () => txt.destroy(), + }); + } + } + /* ================================================================ + EXPLOSIONS + ================================================================ */ + spawnExplosion(worldX, worldY, color, count) { + const sx = this.worldToScreenX(worldX); + if (sx < -200 || sx > W + 200) + return; // off-screen, skip + this.spawnParticleExplosion(sx, worldY, color, count); + } + /* ================================================================ + RENDERING + ================================================================ */ + renderGame() { + const g = this.gameGfx; + g.clear(); + // Draw terrain + this.renderTerrain(); + // Draw humanoids + this.renderHumanoids(g); + // Draw enemies + this.renderEnemies(g); + // Draw mines + this.renderMines(g); + // Draw bullets + this.renderBullets(g); + // Draw player + if (this.shipAlive) { + const blink = this.invincibleTimer > 0 && Math.sin(performance.now() / 80) < 0; + this.shipSprite.setAlpha(blink ? 0.2 : 1); + this.renderPlayer(g); + } + else { + this.shipSprite.setVisible(false); + } + // Draw radar + this.renderRadar(); + // Draw smart bomb HUD + this.renderSmartBombHUD(); + } + renderTerrain() { + const tg = this.terrainGfx; + tg.clear(); + if (this.planetDestroyed) + return; + // Draw terrain that's visible on screen + const startWorldX = this.cameraX - 20; + const endWorldX = this.cameraX + W + 20; + // Mountain line — orange/brown to match original arcade + tg.lineStyle(2, 0xcc8800, 1); + tg.beginPath(); + let firstPoint = true; + for (let wx = startWorldX; wx <= endWorldX; wx += TERRAIN_SAMPLE / 2) { + const wrappedX = this.wrapWorldX(wx); + const sy = this.getTerrainY(wrappedX); + const sx = wx - this.cameraX; + if (firstPoint) { + tg.moveTo(sx, sy); + firstPoint = false; + } + else { + tg.lineTo(sx, sy); + } + } + tg.strokePath(); + // Subtle fill below terrain — dark brown + tg.fillStyle(0x331800, 0.3); + tg.beginPath(); + firstPoint = true; + for (let wx = startWorldX; wx <= endWorldX; wx += TERRAIN_SAMPLE / 2) { + const wrappedX = this.wrapWorldX(wx); + const sy = this.getTerrainY(wrappedX); + const sx = wx - this.cameraX; + if (firstPoint) { + tg.moveTo(sx, sy); + firstPoint = false; + } + else { + tg.lineTo(sx, sy); + } + } + // Close polygon at bottom + tg.lineTo(endWorldX - this.cameraX, H); + tg.lineTo(startWorldX - this.cameraX, H); + tg.closePath(); + tg.fillPath(); + } + renderPlayer(g) { + const sx = this.worldToScreenX(this.playerX); + this.shipSprite.setPosition(sx, this.playerY); + this.shipSprite.setTexture(this.facingRight ? 'def-ship-r' : 'def-ship-l'); + this.shipSprite.setVisible(true); + // Engine exhaust — fires from the REAR of the ship (opposite of facing direction) + if (this.cursors.left.isDown || this.cursors.right.isDown) { + const shipHalfW = 118 * this.spriteScale / 2; + const shipHalfH = 53 * this.spriteScale / 2; + // Exhaust shoots out behind the ship + const exhaustDir = this.facingRight ? -1 : 1; + const exhaustX = sx + exhaustDir * shipHalfW; + // Main exhaust flame — large, flickering + const flameLen = 15 + Math.random() * 25; // variable length + const flameW = flameLen * SCALE; + const flameH = (6 + Math.random() * 4) * SCALE; + const fx = exhaustDir > 0 ? exhaustX : exhaustX - flameW; + // Outer glow (orange) + g.fillStyle(0xff6600, 0.3 + Math.random() * 0.2); + g.fillRect(fx - 2 * SCALE, this.playerY - flameH * 0.7, flameW + 4 * SCALE, flameH * 1.4); + // Core flame (magenta/pink — matches ship engine) + g.fillStyle(0xff00ff, 0.5 + Math.random() * 0.4); + g.fillRect(fx, this.playerY - flameH * 0.4, flameW * 0.8, flameH * 0.8); + // Hot center (white/yellow) + g.fillStyle(0xffff88, 0.4 + Math.random() * 0.4); + const coreW = flameW * 0.4; + const coreX = exhaustDir > 0 ? exhaustX : exhaustX - coreW; + g.fillRect(coreX, this.playerY - flameH * 0.2, coreW, flameH * 0.4); + // Random sparks/particles + for (let i = 0; i < 3; i++) { + const sparkX = exhaustX + exhaustDir * (Math.random() * flameW * 1.2); + const sparkY = this.playerY + (Math.random() - 0.5) * flameH * 1.5; + const sparkSize = (1 + Math.random() * 2) * SCALE; + g.fillStyle(Math.random() > 0.5 ? 0xff4400 : 0xff00ff, 0.3 + Math.random() * 0.5); + g.fillRect(sparkX, sparkY, sparkSize, sparkSize); + } + } + } + renderEnemies(g) { + for (const e of this.enemies) { + if (!e.alive) { + if (e.sprite) + e.sprite.setVisible(false); + continue; + } + const sx = this.worldToScreenX(e.x); + if (sx < -60 || sx > W + 60) { + if (e.sprite) + e.sprite.setVisible(false); + continue; + } + if (e.sprite) { + e.sprite.setPosition(sx, e.y); + e.sprite.setVisible(true); + // Mutant pulse effect + if (e.type === 'mutant') { + e.sprite.setAlpha(0.7 + Math.sin(performance.now() / 200) * 0.3); + } + } + } + } + renderHumanoids(g) { + for (const h of this.humanoids) { + if (h.state === 'dead') { + if (h.sprite) + h.sprite.setVisible(false); + continue; + } + const sx = this.worldToScreenX(h.x); + if (sx < -30 || sx > W + 30) { + if (h.sprite) + h.sprite.setVisible(false); + continue; + } + if (h.sprite) { + h.sprite.setPosition(sx, h.y); + h.sprite.setVisible(true); + // Color tint based on state + if (h.state === 'rescued') + h.sprite.setTint(0x00ff00); + else if (h.state === 'falling') + h.sprite.setTint(0xff8800); + else if (h.state === 'grabbed') + h.sprite.setTint(0xff4444); + else + h.sprite.clearTint(); + } + } + } + renderBullets(g) { + const bs = Math.max(3, Math.round(4 * SCALE)); // bullet size scales with screen + for (const b of this.bullets) { + const sx = this.worldToScreenX(b.x); + if (sx < -200 || sx > W + 200) + continue; + if (b.isEnemy) { + g.fillStyle(0xff0000); + g.fillRect(sx - bs, b.y - bs, bs * 2, bs * 2); + } + else { + // Long dashed laser beam — scales with screen + const dir = b.vx > 0 ? 1 : -1; + const beamLen = Math.round(120 * SCALE); + const segLen = Math.round(14 * SCALE); + const gapLen = Math.round(6 * SCALE); + const thick = Math.max(3, Math.round(4 * SCALE)); + for (let i = 0; i < beamLen; i += segLen + gapLen) { + const segX = sx + (dir > 0 ? -i - segLen : i); + g.fillStyle(0xff4400, 1); + g.fillRect(segX, b.y - Math.floor(thick / 2), segLen, thick); + } + // Bright tip + const tipS = Math.max(4, Math.round(5 * SCALE)); + g.fillStyle(0xffff00, 1); + g.fillRect(sx - tipS, b.y - Math.floor(tipS / 2), tipS * 2, tipS); + } + } + } + renderMines(g) { + for (const m of this.mines) { + const sx = this.worldToScreenX(m.x); + if (sx < -20 || sx > W + 20) + continue; + // Blink effect + const visible = Math.sin(m.blinkTimer * 0.008) > -0.3; + if (visible) { + g.fillStyle(0xff0000); + const ms = PX * 1.5; + g.fillRect(sx - ms, m.y - ms, ms * 2, ms * 2); + } + } + } + renderRadar() { + const rg = this.radarGfx; + rg.clear(); + // Background + rg.fillStyle(0x000000, 0.5); + rg.fillRect(0, RADAR_Y, W, RADAR_H); + // Blue border lines (left and right edges, like original) + rg.lineStyle(2, 0x0044ff, 0.9); + rg.beginPath(); + rg.moveTo(W * 0.3, RADAR_Y); + rg.lineTo(W * 0.3, RADAR_Y + RADAR_H); + rg.strokePath(); + rg.beginPath(); + rg.moveTo(W * 0.7, RADAR_Y); + rg.lineTo(W * 0.7, RADAR_Y + RADAR_H); + rg.strokePath(); + // Top and bottom border + rg.lineStyle(1, 0x0044ff, 0.6); + rg.strokeRect(0, RADAR_Y, W, RADAR_H); + const scaleX = W / WORLD_W; + const scaleY = RADAR_H / H; + // Terrain on radar — orange to match main terrain + if (!this.planetDestroyed) { + rg.lineStyle(1, 0xcc8800, 0.6); + rg.beginPath(); + let first = true; + for (let i = 0; i < this.terrainHeights.length; i += 4) { + const wx = i * TERRAIN_SAMPLE; + const rx = wx * scaleX; + const ry = RADAR_Y + this.terrainHeights[i] * scaleY; + if (first) { + rg.moveTo(rx, ry); + first = false; + } + else + rg.lineTo(rx, ry); + } + rg.strokePath(); + } + // Blips + const blipSize = 3; + // Humanoids (cyan) + rg.fillStyle(0x00ffff); + for (const h of this.humanoids) { + if (h.state === 'dead') + continue; + rg.fillRect(h.x * scaleX, RADAR_Y + h.y * scaleY, blipSize, blipSize); + } + // Enemies + for (const e of this.enemies) { + if (!e.alive) + continue; + const color = e.type === 'mutant' ? 0xff00ff : + e.type === 'bomber' ? 0xffff00 : + e.type === 'baiter' ? 0x00ff44 : + e.type === 'swarmer' ? 0xffff00 : + e.type === 'pod' ? 0xcc00cc : + 0x00ff00; + rg.fillStyle(color); + rg.fillRect(e.x * scaleX, RADAR_Y + e.y * scaleY, blipSize, blipSize); + } + // Player (white crosshair, like original — larger for visibility) + const px = this.playerX * scaleX; + const py = RADAR_Y + this.playerY * scaleY; + rg.fillStyle(0xffffff); + rg.fillRect(px - 1, py - 4, 3, 9); // vertical bar + rg.fillRect(px - 4, py - 1, 9, 3); // horizontal bar + } + renderSmartBombHUD() { + const hg = this.hudExtraGfx; + hg.clear(); + // Draw smart bomb count below radar + const bombY = RADAR_Y + RADAR_H + 4; + for (let i = 0; i < this.smartBombs; i++) { + hg.fillStyle(0xff4400); + hg.fillRect(8 + i * 14, bombY, 10, 8); + hg.lineStyle(1, 0xff8800); + hg.strokeRect(8 + i * 14, bombY, 10, 8); + } + } + /* ================================================================ + CLEANUP + ================================================================ */ + shutdown() { + super.shutdown(); + // Stop looping sounds + try { + this.sound.stopByKey('snd_thrust'); + } + catch { } + this.thrustSoundPlaying = false; + // Destroy enemy sprites + for (const e of this.enemies) { + e.sprite = this.destroyObj(e.sprite); + } + // Destroy humanoid sprites + for (const h of this.humanoids) { + h.sprite = this.destroyObj(h.sprite); + } + // Destroy player sprite + this.shipSprite = this.destroyObj(this.shipSprite); + // Destroy graphics objects + this.destroyObj(this.gameGfx); + this.destroyObj(this.radarGfx); + this.destroyObj(this.terrainGfx); + this.destroyObj(this.hudExtraGfx); + } +} +//# sourceMappingURL=PlanetGuardian.js.map \ No newline at end of file diff --git a/extensions/arcade-canvas/package-lock.json b/extensions/arcade-canvas/package-lock.json new file mode 100644 index 00000000..e7e7b176 --- /dev/null +++ b/extensions/arcade-canvas/package-lock.json @@ -0,0 +1,275 @@ +{ + "name": "arcade-canvas", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "arcade-canvas", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@github/copilot-sdk": "latest" + } + }, + "node_modules/@github/copilot": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-1.0.63.tgz", + "integrity": "sha512-e8DRYiWJQc4kepVXsXjC8vpDU2FXS/TfR+Z6p/KAojfcwIUZzKMAfCV5D1lD25hV4CryVH1Z9t7mHqChickj0Q==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "detect-libc": "^2.1.2", + "os-theme": "^0.0.8" + }, + "bin": { + "copilot": "npm-loader.js" + }, + "optionalDependencies": { + "@github/copilot-darwin-arm64": "1.0.63", + "@github/copilot-darwin-x64": "1.0.63", + "@github/copilot-linux-arm64": "1.0.63", + "@github/copilot-linux-x64": "1.0.63", + "@github/copilot-linuxmusl-arm64": "1.0.63", + "@github/copilot-linuxmusl-x64": "1.0.63", + "@github/copilot-win32-arm64": "1.0.63", + "@github/copilot-win32-x64": "1.0.63" + } + }, + "node_modules/@github/copilot-darwin-arm64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.63.tgz", + "integrity": "sha512-z6CMBxNDlKvT6bvOpqhu4M2bhb0daEbVwSe9SN9WfDUJbt7bpoL7OKKas428iyPSWHoL2WXwxSsy/FjIwSLV6w==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-arm64": "copilot" + } + }, + "node_modules/@github/copilot-darwin-x64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.63.tgz", + "integrity": "sha512-YKd7cXZgAGxhudzrtWdWh2NS35p2G5bV22Gz3jhEyBTqmq45o4sD4OwO87+UpkvM+3nZpwsHaLd3a+ILYX6OXg==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-x64": "copilot" + } + }, + "node_modules/@github/copilot-linux-arm64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.63.tgz", + "integrity": "sha512-A3DOeEfmsJH9j1N+QLc7WXmESBskbezmhDyhyAJcHkw0ngRbKctuWQf/evUHFMh/kgwy1Lr/+9jXJm3NZqr0MA==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-arm64": "copilot" + } + }, + "node_modules/@github/copilot-linux-x64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.63.tgz", + "integrity": "sha512-OMKfZJRoDaJOV7vuWX/nFPNdLa9/H+nhajdE83v4YT9mKLXr86aWrkXE3pPoDYsKWvgQFHg4APA6oZPao0Fyow==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-x64": "copilot" + } + }, + "node_modules/@github/copilot-linuxmusl-arm64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-arm64/-/copilot-linuxmusl-arm64-1.0.63.tgz", + "integrity": "sha512-jcIo6B3uHgcOluNfUHp+6atShKKrXYBPLaRyF6aDT699lwI83gW9KTDuEvDs5FDg8qWsWFfOl+al2dkWDYD3CQ==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linuxmusl-arm64": "copilot" + } + }, + "node_modules/@github/copilot-linuxmusl-x64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-linuxmusl-x64/-/copilot-linuxmusl-x64-1.0.63.tgz", + "integrity": "sha512-BEdBbEF3fG7VqXzuaAY4JtmbdGSkpJFeb2ZQYaMpq7OP3aS7ssGe1cCX8ehZNegcMM/eb4GC6PXNXsvl3X/PAQ==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linuxmusl-x64": "copilot" + } + }, + "node_modules/@github/copilot-sdk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-1.0.1.tgz", + "integrity": "sha512-w6AaS0WqqTE/3iyUrZznvgCLQhsUF7ZmEVCneacuHCfOzlH0r6ww9WUmyA0zgqmXO75V0IYrkIcnFke/qJkkDg==", + "license": "MIT", + "dependencies": { + "@github/copilot": "^1.0.61", + "vscode-jsonrpc": "^8.2.1", + "zod": "^4.3.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@github/copilot-win32-arm64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.63.tgz", + "integrity": "sha512-7FqUwOmtoeBoOn4zkKQqRL+WGFwektVRSr5Po2FvPAbKxGXGyFXApZTmRLqVcHhMKDRzMb8KLST1LU1TMTY/wg==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-arm64": "copilot.exe" + } + }, + "node_modules/@github/copilot-win32-x64": { + "version": "1.0.63", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.63.tgz", + "integrity": "sha512-RC/6y9KHdw/YRCrCEksF2RzbeblfBUNE7bkYZxygaQGYThuv1GeZL2YD2jVqxC2LxKzsUmWGvwEMxerfR6pmeQ==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-x64": "copilot.exe" + } + }, + "node_modules/@os-theme/darwin-arm64": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@os-theme/darwin-arm64/-/darwin-arm64-0.0.8.tgz", + "integrity": "sha512-gMsOs+8Ju396a5yyMWigkbA0dMTxD78U3HzG3mlpiAyn6hfd5dbyI4VGP+sfTB82KGgWLzIhWWTFX5UYY6iX0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@os-theme/linux-x64": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@os-theme/linux-x64/-/linux-x64-0.0.8.tgz", + "integrity": "sha512-zvjmBUiSQPjM1RbhpsfCDYMJxW4eLlGmkFPnpteC/03X2lz6CjiX2hfbN2EWLxXjNnIje3Jqaen8IsqEnWrRBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@os-theme/win32-x64": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@os-theme/win32-x64/-/win32-x64-0.0.8.tgz", + "integrity": "sha512-N3yxKNbVl2IBa/ncDuq55QhwqwUjnYLJxDKMEmYeJbLIV950qZNojPw3scXA6PbfxPZfIiRa8iz1pzNg9XxP8w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/os-theme": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/os-theme/-/os-theme-0.0.8.tgz", + "integrity": "sha512-u1q3bLSv5uMHNIiPItkfDrHXu6ZFs2juwqxWREFM/uVBa+7Kkhy2v49LmJev2JcinGwqiEccElB/XsH9gwasuA==", + "license": "MIT", + "optionalDependencies": { + "@os-theme/darwin-arm64": "0.0.8", + "@os-theme/linux-x64": "0.0.8", + "@os-theme/win32-x64": "0.0.8" + }, + "peerDependencies": { + "typescript": "^5" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/extensions/arcade-canvas/package.json b/extensions/arcade-canvas/package.json new file mode 100644 index 00000000..1c7734e0 --- /dev/null +++ b/extensions/arcade-canvas/package.json @@ -0,0 +1,20 @@ +{ + "name": "arcade-canvas", + "version": "1.0.0", + "main": "extension.mjs", + "author": "Dan Wahlin", + "license": "MIT", + "type": "module", + "dependencies": { + "@github/copilot-sdk": "latest" + }, + "description": "Play five retro Phaser mini-games in a Copilot canvas while agents work.", + "keywords": [ + "arcade-games", + "copilot-canvas", + "interactive-canvas", + "phaser", + "retro-games", + "session-breaks" + ] +} diff --git a/website/src/content/docs/learning-hub/working-with-canvas-extensions.md b/website/src/content/docs/learning-hub/working-with-canvas-extensions.md index f1cf05fb..2c577027 100644 --- a/website/src/content/docs/learning-hub/working-with-canvas-extensions.md +++ b/website/src/content/docs/learning-hub/working-with-canvas-extensions.md @@ -118,6 +118,7 @@ Use these extension folders as concrete references: - [`Backlog Swipe Triage`](../../extensions/#backlog-swipe-triage): swipe-based issue triage surface for fast backlog decisions. - [`Release Notes Showcase`](../../extensions/#release-notes-showcase): release notes authoring and review canvas pattern. - [`Chromium Control Canvas`](../../extensions/#chromium-control-canvas): advanced canvas that coordinates panel controls with a real headful Chromium window. +- [`Agent Arcade`](../../extensions/#agent-arcade-canvas): retro arcade canvas with agent-callable controls for choosing or restarting mini-games while agents work. These examples show different complexity levels, from focused workflow boards to richer UI + automation integrations.